From 1c920a835025e7f27797fba1ba1dd9f52fc3ed33 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Wed, 17 Jul 2024 00:54:25 -0700 Subject: [PATCH 01/61] We can load the parkor game script --- lib/engine/game-scripts/parkor-gscript.ts | 86 +++++++++++++++++++++ lib/engine/game-scripts/sandbox-gscript.ts | 5 +- lib/engine/modules.ts | 14 ++++ lib/terrain-gen/Cargo.toml | 1 + lib/terrain-gen/src/lib.rs | 90 ++++++++++++++++++++++ lib/world/src/vec.rs | 49 +++++++++++- lib/world/src/world/world_block.rs | 1 + 7 files changed, 242 insertions(+), 4 deletions(-) create mode 100644 lib/engine/game-scripts/parkor-gscript.ts diff --git a/lib/engine/game-scripts/parkor-gscript.ts b/lib/engine/game-scripts/parkor-gscript.ts new file mode 100644 index 0000000..4bae218 --- /dev/null +++ b/lib/engine/game-scripts/parkor-gscript.ts @@ -0,0 +1,86 @@ +import { GameScript } from "../game-script.js"; +import { TerrainGenModule } from "../modules.js"; +import { Vector2D } from "../utils/vector.js"; + +type Config = { + seed: string; +}; + +export class ParkorGScript extends GameScript { + name = "parkor"; + + public config = { + seed: "", + }; + + async setup(): Promise { + console.log("Setting up sandbox game script"); + // Load the entire world? + + this.config = { + seed: this.game.config.seed, + }; + } + + setConfig(config: Config): void { + this.config = config; + + // TODO: Update the terrain generator's config + } + + loadChunk(chunkPos: Vector2D): void { + const hasChunk = this.game.world.hasChunk(chunkPos); + + if (hasChunk) { + return; + } + } + + // getChunkPosAroundPoint(pos: Vector3D): Vector2D[] { + // const centerChunkPos = World.worldPosToChunkPos(pos); + // + // const chunkIds = []; + // const loadDistance = this.config.loadDistance; + // + // for (let i = -loadDistance; i < loadDistance; i++) { + // for (let j = -loadDistance; j < loadDistance; j++) { + // const chunkPos = new Vector2D([ + // centerChunkPos.get(0) + i, + // centerChunkPos.get(1) + j, + // ]); + // chunkIds.push(chunkPos); + // } + // } + // + // return chunkIds; + // } + // + // update(_delta: number): void { + // if (this.config.infinite) { + // for (const entity of this.game.entities.iterable()) { + // const chunkIds = this.getChunkPosAroundPoint(entity.pos); + // // console.log("Chunk ids", chunkIds); + // chunk: for (const chunkId of chunkIds) { + // const isChunkLoaded = this.game.world.hasChunk(chunkId); + // if (isChunkLoaded) { + // continue chunk; + // } + // + // console.log("Generating chunk around player"); + // + // const chunk = this.terrainGenerator?.getChunk(chunkId); + // + // if (!chunk) { + // console.log("Failed generating chunk", chunkId); + // break; + // } + // + // this.game.upsertChunk(chunk); + // + // // Only load a single chunk per frame + // return; + // } + // } + // } + // } +} diff --git a/lib/engine/game-scripts/sandbox-gscript.ts b/lib/engine/game-scripts/sandbox-gscript.ts index f20ec45..8b6756a 100644 --- a/lib/engine/game-scripts/sandbox-gscript.ts +++ b/lib/engine/game-scripts/sandbox-gscript.ts @@ -37,9 +37,8 @@ export class SandboxGScript extends GameScript { loadDistance: this.game.config.loadDistance, }; - this.terrainGenerator = TerrainGenModule.getTerrainGenerator( - Number(this.config.seed), - this.config.flatWorld + this.terrainGenerator = TerrainGenModule.getParkorTerrainGenerator( + Number(this.config.seed) ); // Load the chunks around the player diff --git a/lib/engine/modules.ts b/lib/engine/modules.ts index 0fe8d50..c16ce6a 100644 --- a/lib/engine/modules.ts +++ b/lib/engine/modules.ts @@ -57,6 +57,20 @@ class TerrainGenModuleClass { this._module = await loadWasmModule(TerrainGenWasm, "TerrainGen"); } + getParkorTerrainGenerator(seed: number) { + const terrainGenerator = this.module.ParkorChunkGetter.new(); + + return { + getChunk: (chunkPos: Vector2D) => { + console.log("Generating Chunk", chunkPos); + const chunk = terrainGenerator + .get_chunk_wasm(chunkPos.get(0), chunkPos.get(1)) + .serialize(); + return chunk as unknown as ISerializedChunk; + }, + }; + } + getTerrainGenerator(seed: number, flatWorld: boolean) { const terrainGenerator = new this.module.TerrainGenerator(seed, flatWorld); diff --git a/lib/terrain-gen/Cargo.toml b/lib/terrain-gen/Cargo.toml index 7577a11..38faa5c 100644 --- a/lib/terrain-gen/Cargo.toml +++ b/lib/terrain-gen/Cargo.toml @@ -24,6 +24,7 @@ web-sys = "0.3.64" rand = { version = "0.8.5" } rand_distr = "0.4.3" getrandom = { version = "0.2", features = ["js"] } +serde = "1.0.204" [dev-dependencies] diff --git a/lib/terrain-gen/src/lib.rs b/lib/terrain-gen/src/lib.rs index eba2fea..55381ac 100644 --- a/lib/terrain-gen/src/lib.rs +++ b/lib/terrain-gen/src/lib.rs @@ -3,6 +3,7 @@ use noise::{NoiseFn, Perlin}; use rand::rngs::StdRng; use rand::SeedableRng; use rand_distr::{Distribution, Uniform}; +use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; use world::{ block::{self, BlockType, ChunkBlock}, @@ -396,6 +397,95 @@ impl FlatWorldChunkGetter { } } +#[derive(Serialize, Deserialize)] +#[wasm_bindgen] +struct ParkorChunkGetter { + #[wasm_bindgen(skip)] + pub current_blocks: Vec, + + // how far away the blocks are generated from requested chunks + pub load_distance: u8, +} + +#[wasm_bindgen] +impl ParkorChunkGetter { + pub fn new() -> ParkorChunkGetter { + ParkorChunkGetter { + current_blocks: Vec::new(), + load_distance: 4, + } + } + + pub fn get_chunk_wasm(&mut self, chunk_x: i16, chunk_y: i16) -> Chunk { + let chunk_pos = ChunkPos { + x: chunk_x, + y: chunk_y, + }; + self.get_chunk(&chunk_pos) + } +} + +impl ParkorChunkGetter { + pub fn get_next_block(&self) -> WorldBlock { + let current_block = self.current_blocks.last(); + + if let Some(block) = current_block { + let block_pos = block.world_pos; + + // compute the next pos + let next_pos = block_pos + .move_direction(&Direction::North) + .move_direction(&Direction::North); + + WorldBlock { + world_pos: next_pos, + block_type: BlockType::Stone, + extra_data: block::BlockData::None, + } + } else { + // return the first block + WorldBlock { + world_pos: WorldPos::new(0, 0, 0), + block_type: BlockType::Stone, + extra_data: block::BlockData::None, + } + } + } + + fn load_chunk(&mut self, chunk_pos: &ChunkPos) { + // check if there are any blocks in this chunk + let next_block = self.get_next_block(); + + let mut count = 0; + + // keep loading the next block until it isn't load distance away from me + while next_block.world_pos.to_chunk_pos().distance_to(*chunk_pos) as u8 + <= self.load_distance + && count < 10 + { + self.current_blocks.push(next_block); + let next_block = self.get_next_block(); + self.current_blocks.push(next_block); + count += 1; + } + } + + pub fn get_chunk(&mut self, chunk_pos: &ChunkPos) -> Chunk { + let mut chunk = Chunk::new(*chunk_pos); + + self.load_chunk(chunk_pos); + + for block in self.current_blocks.iter() { + let block_chunk_pos = block.world_pos.to_chunk_pos(); + if block_chunk_pos == *chunk_pos { + chunk.add_block(block.to_chunk_block()); + } + } + + chunk + } +} + #[wasm_bindgen] pub struct TerrainGenerator { pub seed: u32, diff --git a/lib/world/src/vec.rs b/lib/world/src/vec.rs index 98ea8b4..283acba 100644 --- a/lib/world/src/vec.rs +++ b/lib/world/src/vec.rs @@ -12,7 +12,36 @@ pub struct Vec2 { pub y: T, } -impl Vec2 { +impl Sub> for Vec2 +where + T: Sub + Copy, +{ + type Output = Vec2; + + fn sub(self, rhs: Vec2) -> Self::Output { + Vec2 { + x: self.x - rhs.x, + y: self.y - rhs.y, + } + } +} + +impl Mul> for Vec2 +where + T: Mul + Copy, + U: Copy, +{ + type Output = Vec2; + + fn mul(self, rhs: Vec2) -> Self::Output { + Vec2 { + x: self.x * rhs.x, + y: self.y * rhs.y, + } + } +} + +impl + Clone + Copy> Vec2 { pub fn new(x: T, y: T) -> Vec2 { Vec2 { x, y } } @@ -44,6 +73,10 @@ impl Vec2 { } } + pub fn sum(&self) -> T { + self.x + self.y + } + /** Returns a list of adjacent vectors that lie in a flat plane * I.e no vectors that have a different y direction. */ @@ -71,6 +104,20 @@ impl Vec2 { } } + pub fn distance_to(&self, vec: Vec2) -> f32 + where + U: Sub + Copy + Mul + Add, + T: Sub + Copy + Mul + Add, + f32: From, + { + let diff = *self - vec; + let diff_squared = diff * diff; + let sum = diff_squared.sum(); + // take the sqrt of sum + let sum_f32: f32 = sum.into(); + sum_f32.sqrt() + } + pub fn move_in_flat_direction(&self, direction: &FlatDirection) -> Vec2 where T: Copy + Add + AddAssign + One + SubAssign, diff --git a/lib/world/src/world/world_block.rs b/lib/world/src/world/world_block.rs index 65fbd80..373de5f 100644 --- a/lib/world/src/world/world_block.rs +++ b/lib/world/src/world/world_block.rs @@ -5,6 +5,7 @@ use crate::{ }; use serde::{Deserialize, Serialize}; use std::collections::HashMap; +use wasm_bindgen::prelude::*; #[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)] pub struct WorldBlock { From dcd3a17c3247d221fa2cd672fe811cde6319467b Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Fri, 2 Aug 2024 22:00:58 -0700 Subject: [PATCH 02/61] Compiles and jump script works --- Events.md | 34 ++ apps/web-client/src/app.ts | 1 + .../keyboardPlayerController.ts | 7 +- .../src/game-scripts/basic-gscript.ts | 19 +- .../src/game-scripts/parkor/parkor-hud.tsx | 13 + .../src/game-scripts/parkor/parkor-render.ts | 27 + lib/engine/entities/player/player.ts | 10 - lib/engine/entities/player/playerActions.ts | 37 +- lib/engine/game-script.ts | 4 +- lib/engine/game-scripts/parkor-gscript.ts | 116 ++-- lib/engine/game-scripts/sandbox-gscript.ts | 18 +- lib/engine/modules.ts | 33 ++ lib/engine/utils/vector.ts | 9 - lib/terrain-gen/src/lib.rs | 1 + lib/world/Cargo.toml | 2 +- lib/world/src/entities/entity.rs | 16 + lib/world/src/entities/game.rs | 261 +++++++++ lib/world/src/entities/mod.rs | 4 + lib/world/src/entities/player.rs | 319 +++++++++++ lib/world/src/entities/player_jump_script.rs | 87 +++ lib/world/src/entities/projectile.rs | 25 + lib/world/src/entities/sandbox.rs | 68 +++ lib/world/src/entities/terrain_gen.rs | 507 ++++++++++++++++++ lib/world/src/geometry/rotation.rs | 31 +- lib/world/src/lib.rs | 1 + 25 files changed, 1544 insertions(+), 106 deletions(-) create mode 100644 Events.md create mode 100644 apps/web-client/src/game-scripts/parkor/parkor-hud.tsx create mode 100644 apps/web-client/src/game-scripts/parkor/parkor-render.ts create mode 100644 lib/world/src/entities/entity.rs create mode 100644 lib/world/src/entities/game.rs create mode 100644 lib/world/src/entities/mod.rs create mode 100644 lib/world/src/entities/player.rs create mode 100644 lib/world/src/entities/player_jump_script.rs create mode 100644 lib/world/src/entities/projectile.rs create mode 100644 lib/world/src/entities/sandbox.rs create mode 100644 lib/world/src/entities/terrain_gen.rs diff --git a/Events.md b/Events.md new file mode 100644 index 0000000..43a36b0 --- /dev/null +++ b/Events.md @@ -0,0 +1,34 @@ + +The game has many scripts. The scripts control entities in the game. + +Scripts have a list of actions that can be taken on them. These actions can be serilaized and sent over a server. +Example +(entityId, action, data) = ("player1", "move", "left") + +You can query a player for all of its actions + +Script data is not serilaized + +Example Scripts +JumpScript, +MoveScript, +GravityScript, + + + +Flow of events for user pressing space: +- JS creates a jump event +- Jump event sent over the wire (either to server or worker) +- Game recieves jump events and finds script for it +- Script looks up the event and executes it + + + +Player Places block: +- Js creates a place block event +- Sent over wire +- Game recieves place block event and finds script for it +- Script looks up the event and executes it +- Chunks have been updateds so JS game scripts are called + + diff --git a/apps/web-client/src/app.ts b/apps/web-client/src/app.ts index ca3699f..cbbd546 100644 --- a/apps/web-client/src/app.ts +++ b/apps/web-client/src/app.ts @@ -16,6 +16,7 @@ import { ClientDbGamesService } from "./services/sp-games-service"; import { NetworkGamesService } from "./services/mp-games-service"; import { BasicGScript } from "./game-scripts/basic-gscript"; +// Add the world to this too export interface IExtendedWindow extends Window { game?: Game; } diff --git a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts index 7ba93a7..63a1e34 100644 --- a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts +++ b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts @@ -4,14 +4,13 @@ import { Game, IDim, Player, - PlayerAction, - PlayerActionService, PlayerActionType, PlayerController, } from "@craft/engine"; import { CanvasGameScript } from "../../game-scripts/canvas-gscript"; import { WebGlGScript } from "../../game-scripts/webgl-gscript"; import { HudGScript } from "../../game-scripts/hudRender"; +import { PlayerAction } from "@craft/engine/modules"; export class KeyboardPlayerEntityController extends PlayerController { cleanup(): void { @@ -29,11 +28,11 @@ export class KeyboardPlayerEntityController extends PlayerController { private hasJumped = false; constructor( - playerActionService: PlayerActionService, + onAction: (playerAction: PlayerAction) => void, game: Game, player: Player ) { - super(playerActionService, game, player); + super(onAction, game, player); const hudEle = game.getGameScript(HudGScript).eHud; const webGlCanvas = game.getGameScript(WebGlGScript).eCanvas; diff --git a/apps/web-client/src/game-scripts/basic-gscript.ts b/apps/web-client/src/game-scripts/basic-gscript.ts index ecde517..6ca977d 100644 --- a/apps/web-client/src/game-scripts/basic-gscript.ts +++ b/apps/web-client/src/game-scripts/basic-gscript.ts @@ -1,8 +1,7 @@ import { EntityController, - Game, - Player, PlayerActionService, + WorldModule, } from "@craft/engine"; import { IS_MOBILE, getMyUid } from "../app"; import { MobileController } from "../controllers/playerControllers/mobileController"; @@ -11,6 +10,8 @@ import { CanvasGameScript } from "../game-scripts/canvas-gscript"; import { GameScript } from "@craft/engine/game-script"; import { WebGlGScript } from "./webgl-gscript"; import { HudGScript } from "./hudRender"; +import { Game, Player } from "@craft/rust-world"; +import { GameWrapper, PlayerAction } from "@craft/engine/modules"; export class BasicGScript extends GameScript { name = "basic"; @@ -38,18 +39,26 @@ export class BasicGScript extends GameScript { playerActionService: PlayerActionService; - constructor(public game: Game) { - super(game); + constructor(public g: GameWrapper) { + const game = WorldModule.createGame(); + + super(g); console.log("Starting basic usecase"); console.log("My UID", getMyUid()); - this.mainPlayer = game.addPlayer(getMyUid()); + const player = WorldModule.createPlayer(Number(getMyUid())); + this.mainPlayer = player; + game.addPlayer(player); console.log("Main player", this.mainPlayer); this.playerActionService = new PlayerActionService(game); } + onPlayerAction(action: PlayerAction) { + this.game.handleAction(action); + } + setup() { console.log("Setting up basic game script"); const webGlGScript = this.game.addGameScript(WebGlGScript); diff --git a/apps/web-client/src/game-scripts/parkor/parkor-hud.tsx b/apps/web-client/src/game-scripts/parkor/parkor-hud.tsx new file mode 100644 index 0000000..89494c6 --- /dev/null +++ b/apps/web-client/src/game-scripts/parkor/parkor-hud.tsx @@ -0,0 +1,13 @@ +import React from "react"; + +type Props = { + score: number; +}; + +export const ParkorHUD = (props: Props) => { + return ( +
+

Score: {props.score}

+
+ ); +}; diff --git a/apps/web-client/src/game-scripts/parkor/parkor-render.ts b/apps/web-client/src/game-scripts/parkor/parkor-render.ts new file mode 100644 index 0000000..8a8b2e7 --- /dev/null +++ b/apps/web-client/src/game-scripts/parkor/parkor-render.ts @@ -0,0 +1,27 @@ +import { Game, GameScript } from "@craft/engine"; +import React from "react"; +import ReactDOM, { render } from "react-dom"; +import { getEleOrError } from "../../utils"; +import { ParkorGScript } from "@craft/engine/game-scripts/parkor-gscript"; +import { ParkorHUD } from "./parkor-hud"; + +class ParkorRenderGScript extends GameScript { + public eMenuContainer = getEleOrError("menuContainer"); + + constructor(game: Game, private parkorGameScript: ParkorGScript) { + super(game); + } + + update(delta: number): void { + this.render(); + } + + render(): void { + ReactDOM.render( + React.createElement(ParkorHUD, { + score: this.parkorGameScript, + }), + this.eMenuContainer + ); + } +} diff --git a/lib/engine/entities/player/player.ts b/lib/engine/entities/player/player.ts index b4d9135..f818410 100644 --- a/lib/engine/entities/player/player.ts +++ b/lib/engine/entities/player/player.ts @@ -18,10 +18,6 @@ export interface BeltDto { class Belt { public selectedIndex = 0; - public length = 10; - - public itemActions: ((game: Game) => void)[] = []; - public items: Item[] = [ BlockType.Stone, BlockType.Gold, @@ -297,12 +293,6 @@ export class Player extends MovableEntity implements IEntity { if (this.fire.count > 0 && !this.fire.holding) this.fire.count--; - // Prevent from falling out of the world - if (this.pos.get(1) < -10) { - this.pos.set(1, 30); - this.vel.set(1, -0.1); - } - // Am I on the ground? (Only need to check if I have moved) const belowPos = this.pos.add(new Vector3D([0, -0.1, 0])); const intersectingPoss = world.getIntersectingBlocksWithEntity( diff --git a/lib/engine/entities/player/playerActions.ts b/lib/engine/entities/player/playerActions.ts index b5970d7..588b7ef 100644 --- a/lib/engine/entities/player/playerActions.ts +++ b/lib/engine/entities/player/playerActions.ts @@ -1,11 +1,12 @@ // Player actions are an API that lets you controll a player // The player should know nothing about these. -import { BlockType } from "@craft/rust-world"; -import { Direction, Game, IDim, Vector3D } from "../../index.js"; +import { BlockType, Direction } from "@craft/rust-world"; +import { Game, IDim, Vector3D } from "../../index.js"; import { MessageDto, MessageHolder } from "../../messageHelpers.js"; import CubeHelpers from "../cube.js"; import { Player } from "./player.js"; +import { PlayerAction } from "../../modules.js"; export enum PlayerActionType { Jump = "jump", @@ -70,14 +71,14 @@ export interface PlayerActionData export type PlayerActionDto = MessageDto; -export class PlayerAction extends MessageHolder< - PlayerActionType, - PlayerActionData -> { - static make(type: T, data: PlayerActionData[T]) { - return new PlayerAction(type, data); - } -} +// export class PlayerAction extends MessageHolder< +// PlayerActionType, +// PlayerActionData +// > { +// static make(type: T, data: PlayerActionData[T]) { +// return new PlayerAction(type, data); +// } +// } export class PlayerActionService { constructor(private game: Game) {} @@ -126,27 +127,17 @@ export class PlayerActionService { export abstract class PlayerController { constructor( - protected playerActionService: PlayerActionService, + protected onAction: (action: PlayerAction) => void, protected game: Game, protected player: Player ) {} jump() { - const jumpAction = PlayerAction.make(PlayerActionType.Jump, { - playerUid: this.player.uid, - }); - - this.playerActionService.performAction(jumpAction); + this.onAction("Jump"); } move(directions: Direction[]) { - const action = PlayerAction.make(PlayerActionType.Move, { - directions: Array.from(directions), - playerUid: this.player.uid, - playerRot: this.player.rot.data as IDim, - }); - - this.playerActionService.performAction(action); + this.onAction({ Move: directions }); } primaryAction() { diff --git a/lib/engine/game-script.ts b/lib/engine/game-script.ts index 1b49a3b..1a003af 100644 --- a/lib/engine/game-script.ts +++ b/lib/engine/game-script.ts @@ -1,6 +1,6 @@ -import { Game } from "./game.js"; import { GameAction } from "./gameActions.js"; -import { Entity, GameStateDiff } from "./index.js"; +import { Entity, Game, GameStateDiff } from "./index.js"; +import { GameWrapper } from "./modules.js"; export type GameScriptConfig = Record | undefined; diff --git a/lib/engine/game-scripts/parkor-gscript.ts b/lib/engine/game-scripts/parkor-gscript.ts index 4bae218..15b588d 100644 --- a/lib/engine/game-scripts/parkor-gscript.ts +++ b/lib/engine/game-scripts/parkor-gscript.ts @@ -1,9 +1,12 @@ +import { MovableEntity } from "../entities/moveableEntity.js"; import { GameScript } from "../game-script.js"; import { TerrainGenModule } from "../modules.js"; -import { Vector2D } from "../utils/vector.js"; +import { Vector2D, Vector3D } from "../utils/vector.js"; +import { World } from "../world/world.js"; type Config = { seed: string; + loadDistance: number; }; export class ParkorGScript extends GameScript { @@ -11,15 +14,25 @@ export class ParkorGScript extends GameScript { public config = { seed: "", + loadDistance: 3, }; + private terrainGenerator: ReturnType< + typeof TerrainGenModule.getParkorTerrainGenerator + > | null = null; + async setup(): Promise { console.log("Setting up sandbox game script"); // Load the entire world? this.config = { seed: this.game.config.seed, + loadDistance: this.game.config.loadDistance, }; + + this.terrainGenerator = TerrainGenModule.getParkorTerrainGenerator( + Number(this.config.seed) + ); } setConfig(config: Config): void { @@ -30,57 +43,62 @@ export class ParkorGScript extends GameScript { loadChunk(chunkPos: Vector2D): void { const hasChunk = this.game.world.hasChunk(chunkPos); - if (hasChunk) { return; } } - // getChunkPosAroundPoint(pos: Vector3D): Vector2D[] { - // const centerChunkPos = World.worldPosToChunkPos(pos); - // - // const chunkIds = []; - // const loadDistance = this.config.loadDistance; - // - // for (let i = -loadDistance; i < loadDistance; i++) { - // for (let j = -loadDistance; j < loadDistance; j++) { - // const chunkPos = new Vector2D([ - // centerChunkPos.get(0) + i, - // centerChunkPos.get(1) + j, - // ]); - // chunkIds.push(chunkPos); - // } - // } - // - // return chunkIds; - // } - // - // update(_delta: number): void { - // if (this.config.infinite) { - // for (const entity of this.game.entities.iterable()) { - // const chunkIds = this.getChunkPosAroundPoint(entity.pos); - // // console.log("Chunk ids", chunkIds); - // chunk: for (const chunkId of chunkIds) { - // const isChunkLoaded = this.game.world.hasChunk(chunkId); - // if (isChunkLoaded) { - // continue chunk; - // } - // - // console.log("Generating chunk around player"); - // - // const chunk = this.terrainGenerator?.getChunk(chunkId); - // - // if (!chunk) { - // console.log("Failed generating chunk", chunkId); - // break; - // } - // - // this.game.upsertChunk(chunk); - // - // // Only load a single chunk per frame - // return; - // } - // } - // } - // } + getChunkPosAroundPoint(pos: Vector3D): Vector2D[] { + const centerChunkPos = World.worldPosToChunkPos(pos); + + const chunkIds = []; + const loadDistance = this.config.loadDistance; + + for (let i = -loadDistance; i < loadDistance; i++) { + for (let j = -loadDistance; j < loadDistance; j++) { + const chunkPos = new Vector2D([ + centerChunkPos.get(0) + i, + centerChunkPos.get(1) + j, + ]); + chunkIds.push(chunkPos); + } + } + + return chunkIds; + } + + update(_delta: number): void { + for (const entity of this.game.entities.iterable()) { + // Prevent from falling out of the world + if (entity.pos.get(1) < -10) { + entity.pos.set(1, 30); + if (entity instanceof MovableEntity) { + entity.vel.set(1, -0.1); + } + } + + const chunkIds = this.getChunkPosAroundPoint(entity.pos); + // console.log("Chunk ids", chunkIds); + chunk: for (const chunkId of chunkIds) { + const isChunkLoaded = this.game.world.hasChunk(chunkId); + if (isChunkLoaded) { + continue chunk; + } + + console.log("Generating chunk around player"); + + const chunk = this.terrainGenerator?.getChunk(chunkId); + + if (!chunk) { + console.log("Failed generating chunk", chunkId); + break; + } + + this.game.upsertChunk(chunk); + + // Only load a single chunk per frame + return; + } + } + } } diff --git a/lib/engine/game-scripts/sandbox-gscript.ts b/lib/engine/game-scripts/sandbox-gscript.ts index 8b6756a..2f2703c 100644 --- a/lib/engine/game-scripts/sandbox-gscript.ts +++ b/lib/engine/game-scripts/sandbox-gscript.ts @@ -1,3 +1,4 @@ +import { MovableEntity } from "../entities/moveableEntity.js"; import { GameScript } from "../game-script.js"; import { TerrainGenModule } from "../modules.js"; import { Vector2D, Vector3D } from "../utils/vector.js"; @@ -10,6 +11,11 @@ interface Config { loadDistance: number; } +// await WorldModule.load(); +// const game = WorldModule.createGame(); +// const player = WorldModule.createPlayer(Number(1)); +// game.addPlayer(player); + // init the terrian gen module and load all chunks around palyer export class SandboxGScript extends GameScript { name = "sandbox"; @@ -70,8 +76,16 @@ export class SandboxGScript extends GameScript { } update(_delta: number): void { - if (this.config.infinite) { - for (const entity of this.game.entities.iterable()) { + for (const entity of this.game.entities.iterable()) { + // Prevent from falling out of the world + if (entity.pos.get(1) < -10) { + entity.pos.set(1, 30); + if (entity instanceof MovableEntity) { + entity.vel.set(1, -0.1); + } + } + + if (this.config.infinite) { const chunkIds = this.getChunkPosAroundPoint(entity.pos); // console.log("Chunk ids", chunkIds); chunk: for (const chunkId of chunkIds) { diff --git a/lib/engine/modules.ts b/lib/engine/modules.ts index c16ce6a..036024b 100644 --- a/lib/engine/modules.ts +++ b/lib/engine/modules.ts @@ -2,9 +2,11 @@ import * as WorldWasm from "@craft/rust-world"; import * as TerrainGenWasm from "@craft/terrain-gen"; import { Vector2D } from "./utils/vector.js"; import { + GameAction, IChunkReader, ISerializedChunk, ISerializedWorld, + SandboxGScript, World, } from "./index.js"; export * as WorldModuleTypes from "@craft/rust-world"; @@ -16,6 +18,27 @@ async function loadWasmModule(module: any, name = "") { return loadedModule; } +(window as any).test = async () => { + await WorldModule.load(); + const game = WorldModule.createGame(); + const player = WorldModule.createPlayer(Number(1)); + game.addPlayer(player); +}; + +export class GameWrapper { + constructor(private game: WorldWasm.Game) {} + + handleAction(action: GameAction) { + this.game.handle_action_wasm(action); + } + + addPlayer(player: WorldWasm.Player) { + this.game.add_entity_wasm(player); + } +} + +export type PlayerAction = "Jump" | { Move: WorldWasm.Direction[] }; + // Wrapper class for world logic class WorldModuleClass { private _module: typeof WorldWasm | null = null; @@ -38,6 +61,16 @@ class WorldModuleClass { const world = new World(wasmWorld, data); return world; } + + public createGame(): GameWrapper { + const game = WorldModule.module.Game.new(); + return new GameWrapper(game); + } + + public createPlayer(uid: number) { + const player = WorldModule.module.Player.make(uid); + return player; + } } export const WorldModule = new WorldModuleClass(); diff --git a/lib/engine/utils/vector.ts b/lib/engine/utils/vector.ts index a0254f2..34480c0 100644 --- a/lib/engine/utils/vector.ts +++ b/lib/engine/utils/vector.ts @@ -3,15 +3,6 @@ type IDim = [number, number, number]; // type VectorIndex = bigint; export type VectorIndex = string; -export enum Direction { - Forwards = 0, - Backwards = 1, - Left = 2, - Right = 3, - Up = 4, - Down = 5, -} - export const getDirectionFromString = (dir: string): Direction => { switch (dir) { case "Up": diff --git a/lib/terrain-gen/src/lib.rs b/lib/terrain-gen/src/lib.rs index 55381ac..4e292ff 100644 --- a/lib/terrain-gen/src/lib.rs +++ b/lib/terrain-gen/src/lib.rs @@ -102,6 +102,7 @@ impl TreeLocator { blocks.push(WorldBlock { world_pos: pos, block_type: BlockType::Leaf, + extra_data: block::BlockData::None, }); } diff --git a/lib/world/Cargo.toml b/lib/world/Cargo.toml index 2d9e22d..6843b3c 100644 --- a/lib/world/Cargo.toml +++ b/lib/world/Cargo.toml @@ -21,7 +21,7 @@ js-sys = "0.3.59" serde = { version = "1.0", features = ["derive"] } serde_repr = "0.1" serde-big-array = "0.4.1" -serde-wasm-bindgen = "0.4" +serde-wasm-bindgen = "0.6.5" float-cmp = "0.9.0" phf = { version = "0.11", default-features = false, features = ["macros"] } web-sys = { version = "0.3.60", features = ["console"] } diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs new file mode 100644 index 0000000..56908c7 --- /dev/null +++ b/lib/world/src/entities/entity.rs @@ -0,0 +1,16 @@ +use std::any::Any; + +use crate::world::World; + +pub type EntityId = u32; + +pub trait Entity: Any { + fn update(&mut self, world: &World) -> (); + fn id(&self) -> u32; +} + +pub trait EntityAction: Any { + fn name(&self) -> &'static str; + fn entityid(&self) -> EntityId; + fn data(&self) -> Box; +} diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs new file mode 100644 index 0000000..3a0910e --- /dev/null +++ b/lib/world/src/entities/game.rs @@ -0,0 +1,261 @@ +use super::{ + entity::{Entity, EntityAction, EntityId}, + player::{Player, WorldBlock}, +}; +use crate::{chunk::Chunk, world::World}; +use std::{any::Any, collections::HashMap}; +use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; + +pub trait GameScript { + fn update(&self, delta: u8) -> (); + fn on_diff(&self, diff: &GameDiff) -> (); +} + +#[wasm_bindgen] +struct JsGameScript { + update_jsfn: js_sys::Function, +} + +impl GameScript for JsGameScript { + fn update(&self, delta: u8) -> () { + let val = JsValue::from(delta); + // let res = self.update_jsfn.call1(&val); + // print the error + // if let Err(e) = res { + // let err = Error::from(e); + // }; + } + + fn on_diff(&self, diff: &GameDiff) -> () { + todo!() + } +} + +#[wasm_bindgen] +impl JsGameScript { + pub fn make(val: JsValue) -> JsGameScript { + let update_fn = js_sys::Reflect::get(&val, &JsValue::from("update")).unwrap(); + + JsGameScript { + update_jsfn: update_fn.into(), + } + } +} + +pub trait PlayerScript { + fn name(&self) -> &'static str; + fn update(&mut self, world: &World, player: &mut Player); + fn handle_action(&mut self, action: Box); +} + +type ScriptId = u32; + +#[wasm_bindgen] +pub struct Game { + world: World, + entities: Vec>, + game_scripts: Vec>, + player_scripts: HashMap>, + player_scripts_entity_map: HashMap, + diff: GameDiff, +} + +// #[wasm_bindgen] +impl Game { + pub fn new() -> Game { + Game { + world: World::default(), + entities: Vec::new(), + game_scripts: Vec::new(), + player_scripts: HashMap::new(), + player_scripts_entity_map: HashMap::new(), + diff: GameDiff::empty(), + } + } + + pub fn add_script(&mut self, entity_id: EntityId, script: Box) { + let id = 1; + self.player_scripts.insert(id, script); + self.player_scripts_entity_map.insert(id, entity_id); + } + + pub fn handle_action(&mut self, action: Box) { + for (id, script) in self.player_scripts.iter_mut() { + let script_entity_id = *self + .player_scripts_entity_map + .get(id) + .expect("Script not found"); + + if action.entityid() == script_entity_id { + script.handle_action(action); + break; + } + } + } + + pub fn update(&mut self) { + let world = &self.world; + + // update all entities + self.entities + .iter_mut() + .for_each(|entity| entity.update(world)); + + for (script_id, script) in &mut self.player_scripts { + let script_entity = *self + .player_scripts_entity_map + .get(script_id) + .expect("Script not found"); + + let mut player = self + .entities + .iter_mut() + .find(|entity| entity.id() == script_entity) + .expect("Player not found"); + + script.update(world, &mut player); + } + + // update all controllers + // self.controllers + // .iter_mut() + // .for_each(|controller| controller.update(world)); + + // send diff to all scripts + self.game_scripts.iter().for_each(|script| { + script.update(1); + }); + + self.game_scripts.iter().for_each(|script| { + script.on_diff(&self.diff); + }); + + // Apply diff to game + // Add all new entities + let new_ents = std::mem::take(&mut self.diff.new_entities); + self.entities.extend(new_ents); + + // Remove entities + for entid in self.diff.removed_entities.clone() { + self.entities.retain(|entity| entity.id() != entid); + } + + // add chunks to world + let new_chunks = std::mem::take(&mut self.diff.new_chunks); + for chunk in new_chunks { + self.world.insert_chunk(*chunk); + } + } +} + +impl Game { + pub fn add_game_script(&mut self, game_script: Box) { + self.game_scripts.push(game_script); + } + + fn add_entity(&mut self, entity: Box) { + self.entities.push(entity); + } + + pub fn get_entities(&self) -> &Vec> { + &self.entities + } + + pub fn get_entity_by_id(&self, id: EntityId) -> Option<&Box> { + self.entities.iter().find(|entity| entity.id() == id) + } + + pub fn schedule_chunk_insert(&mut self, chunk: Box) { + self.diff.new_chunks.push(chunk) + } + + pub fn schedule_entity_insert(&mut self, entity: Box) { + self.diff.new_entities.push(entity); + } +} + +pub struct GameDiff { + pub new_entities: Vec>, + pub new_blocks: Vec, + pub new_chunks: Vec>, + pub removed_entities: Vec, + pub removed_blocks: Vec, +} + +impl GameDiff { + fn empty() -> GameDiff { + GameDiff { + new_entities: Vec::new(), + new_blocks: Vec::new(), + new_chunks: Vec::new(), + removed_entities: Vec::new(), + removed_blocks: Vec::new(), + } + } + + pub fn add_entity(&mut self, entity: Box) { + self.new_entities.push(entity) + } + + pub fn add_block(&mut self, block: WorldBlock) { + self.new_blocks.push(block); + } + + pub fn add_chunk(&mut self, chunk: Box) { + self.new_chunks.push(chunk); + } + + pub fn remove_entity(&mut self, entity_id: EntityId) { + self.removed_entities.push(entity_id); + } +} + +mod tests { + use crate::entities::{ + player::Player, + player_jump_script::{PlayerJumpAction, PlayerJumpScript}, + }; + + use super::*; + + #[test] + pub fn jump_script() { + let mut game = Game::new(); + let player = Box::new(Player::make(1)); + let jump_script = Box::new(PlayerJumpScript::new()); + game.schedule_entity_insert(player); + game.update(); + game.add_script(1, jump_script); + game.update(); + let jump_action = Box::new(PlayerJumpAction { entityid: 1 }); + game.handle_action(jump_action); + game.update(); + let player = game.get_entity_by_id(1).unwrap(); + assert!(player.vel.y > 0.0); + } + + #[test] + pub fn basic() { + let mut game = Game::new(); + let player = Box::new(Player::make(1)); + game.schedule_entity_insert(player); + game.update(); + + // expect game to have a player in it + game.get_entities().iter().for_each(|ent| { + assert_eq!(ent.id(), 1); + }); + } + + pub fn game_script() { + let mut game = Game::new(); + let player = Box::new(Player::make(1)); + game.schedule_entity_insert(player); + game.update(); + + // expect game to have a player in it + game.get_entities().iter().for_each(|ent| { + assert_eq!(ent.id(), 1); + }); + } +} diff --git a/lib/world/src/entities/mod.rs b/lib/world/src/entities/mod.rs new file mode 100644 index 0000000..e61d4d8 --- /dev/null +++ b/lib/world/src/entities/mod.rs @@ -0,0 +1,4 @@ +pub mod entity; +pub mod game; +pub mod player; +pub mod player_jump_script; diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs new file mode 100644 index 0000000..9214185 --- /dev/null +++ b/lib/world/src/entities/player.rs @@ -0,0 +1,319 @@ +use super::{ + entity::{Entity, EntityAction, EntityId}, + game::PlayerScript, +}; +use crate::{ + block::{BlockData, BlockType}, + direction::Direction, + geometry::rotation::SphericalRotation, + world::World, +}; +use serde::{Deserialize, Serialize}; +use wasm_bindgen::prelude::wasm_bindgen; + +#[derive(Clone, Serialize, Deserialize)] +#[wasm_bindgen] +struct FineWorldPos { + x: f32, + y: f32, + z: f32, +} + +#[wasm_bindgen] +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)] +struct WorldPos { + x: i32, + y: i32, + z: i32, +} + +// Convert World pos to Fine World pos +impl From for FineWorldPos { + fn from(world_pos: WorldPos) -> Self { + FineWorldPos { + x: world_pos.x as f32, + y: world_pos.y as f32, + z: world_pos.z as f32, + } + } +} + +impl From for WorldPos { + fn from(fine_pos: FineWorldPos) -> Self { + WorldPos { + x: fine_pos.x.floor() as i32, + y: fine_pos.y.floor() as i32, + z: fine_pos.z.floor() as i32, + } + } +} + +#[wasm_bindgen] +#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Copy)] +pub struct Velocity { + pub x: f32, + pub y: f32, + pub z: f32, +} + +impl Velocity { + pub fn zero() -> Velocity { + Velocity { + x: 0.0, + y: 0.0, + z: 0.0, + } + } +} + +impl std::ops::Add for Velocity { + type Output = Velocity; + + fn add(self, other: Velocity) -> Velocity { + Velocity { + x: self.x + other.x, + y: self.y + other.y, + z: self.z + other.z, + } + } +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)] +#[wasm_bindgen] +pub struct WorldBlock { + pub block_type: BlockType, + #[wasm_bindgen(skip)] + pub extra_data: BlockData, + pub world_pos: WorldPos, +} + +// convert spherical rot into Velocity +impl From for Velocity { + fn from(rot: SphericalRotation) -> Self { + let x = rot.theta.sin() * rot.phi.cos(); + let y = rot.phi.sin(); + let z = rot.theta.cos() * rot.phi.cos(); + Velocity { x, y, z } + } +} + +struct Size3 { + x: f32, + y: f32, + z: f32, +} + +// #[wasm_bindgen] +pub struct Player { + // config + speed: f32, + max_speed: f32, + gravity: f32, + + uid: EntityId, + + pub pos: FineWorldPos, + dim: Size3, + rot: SphericalRotation, + pub vel: Velocity, + + pub is_flying: bool, + on_ground: bool, + moving_directions: Vec, +} + +// #[wasm_bindgen] +impl Player { + pub fn make(uid: EntityId) -> Player { + Player { + speed: 0.0, + max_speed: 0.0, + gravity: 0.0, + uid, + pos: FineWorldPos { + x: 0.0, + y: 0.0, + z: 0.0, + }, + dim: Size3 { + x: 0.8, + y: 1.8, + z: 0.8, + }, + rot: SphericalRotation::new(0.0, 0.0), + vel: Velocity::zero(), + is_flying: false, + on_ground: false, + moving_directions: Vec::new(), + } + } +} + +// #[derive(Serialize, Deserialize)] +// enum EntityAction { +// Jump, +// PrimaryAction, +// SecondaryAction, +// Move(Vec), +// ToggleFly, +// Rotate(SphericalRotation), +// TP(FineWorldPos), +// } +// +// +// #[repr(u8)] +// #[derive(Serialize, Deserialize)] +// pub enum GameAction { +// Entity(EntityId, EntityAction), +// } + +// trait Item { +// fn use_item(&self, ent: &impl Entity) -> GameDiff; +// } +// +// struct FireballItem { +// current_cooldown: u8, +// cooldown: u8, +// } +// +// impl Item for FireballItem { +// fn use_item(&self, ent: &impl Entity) -> GameDiff { +// let mut diff = GameDiff::empty(); +// +// if self.current_cooldown > 0 { +// return diff; +// } + +// Do math +// const vel = this.rot.toCartesianCoords().scalarMultiply(-0.4); +// vel.set(1, -vel.get(1)); +// +// const pos = this.pos +// .add(vel.scalarMultiply(2)) +// .add(new Vector3D(this.dim).scalarMultiply(0.5)); +// +// +// let fireball_entity = FireballEntity { +// pos: FineWorldPos {}, +// vel: Velocity, +// life: 100, +// }; +// +// let firebox = Box::new(fireball_entity); +// diff.new_entities.push(firebox); + +// diff +// } +// } +// +// struct BlockItem { +// block_type: BlockType, +// } +// +// impl Item for BlockItem { +// fn use_item(&self, ent: &impl Entity) -> GameDiff { +// let mut diff = GameDiff::empty(); +// Do math +// const vel = this.rot.toCartesianCoords().scalarMultiply(-0.4); +// vel.set(1, -vel.get(1)); +// +// const pos = this.pos +// .add(vel.scalarMultiply(2)) +// .add(new Vector3D(this.dim).scalarMultiply(0.5)); +// +// +// let block_entity = WorldBlock { +// pos: FineWorldPos {}, +// block_type: self.block_type, +// }; +// diff.new_blocks.push(block_entity); +// diff +// const ray = this.getRay(); +// const lookingData = game.world.lookingAt(ray); +// if (!lookingData) return; +// console.log("Looking at data", lookingData); +// const { cube } = lookingData; +// if (!cube) return; +// +// const newCubePos = lookingData.cube.pos.add( +// Vector3D.fromDirection(lookingData.face) +// ); +// +// const newCube = CubeHelpers.createCube(blockType, newCubePos); +// +// console.log("Placed Cube", newCube); +// +// game.placeBlock(newCube); +// } +// } + +// enum Item { +// Block(BlockType), +// Fireball, +// } + +// #[wasm_bindgen] +// struct Belt { +// selected_index: u8, +// items: Vec, +// } + +struct PlayerGravityScript { + player: Player, +} + +impl PlayerGravityScript { + pub fn gravity_force(&self) -> Option { + if self.player.is_flying { + return None; + } + + if self.player.on_ground { + return None; + } + + Some(Velocity { + x: 0.0, + y: self.player.gravity, + z: 0.0, + }) + } + + fn update(&mut self, world: &World) { + let gravity_force = self.gravity_force(); + if let Some(gravity_force) = gravity_force { + self.player.vel = gravity_force + self.player.vel; + } + + // loop through scripts and update + } +} + +impl Player { + fn move_in_direction(&mut self, directions: Vec) { + self.moving_directions = directions; + } +} + +impl Player { + pub fn god_force(&self) -> Velocity { + // add the current players roation to the direction + let mut new_rot = self.rot; + + let dirs = self.moving_directions.clone(); + + new_rot = dirs + .into_iter() + .fold(new_rot, |acc, direction| acc + direction.into()); + + new_rot.into() + } +} + +impl Entity for Player { + fn update(&mut self, world: &World) {} + + fn id(&self) -> u32 { + self.uid + } +} diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/entities/player_jump_script.rs new file mode 100644 index 0000000..4da7c1d --- /dev/null +++ b/lib/world/src/entities/player_jump_script.rs @@ -0,0 +1,87 @@ +use super::{ + entity::{EntityAction, EntityId}, + game::PlayerScript, + player::{Player, Velocity}, +}; +use crate::world::World; +use std::any::Any; + +pub struct PlayerJumpAction { + pub entityid: EntityId, +} + +impl EntityAction for PlayerJumpAction { + fn name(&self) -> &'static str { + "Jump-Action" + } + + fn entityid(&self) -> EntityId { + self.entityid + } + fn data(&self) -> Box { + Box::new(()) + } +} + +pub struct PlayerJumpScript { + jump_speed: f32, + is_jumping: bool, + have_db_jumped: bool, + jump_count: u8, +} + +impl PlayerJumpScript { + pub fn new() -> PlayerJumpScript { + PlayerJumpScript { + jump_speed: 2.0, + is_jumping: false, + have_db_jumped: false, + jump_count: 0, + } + } + + fn jump_force(&mut self, player: &mut Player) -> Velocity { + if player.is_flying { + return Velocity::zero(); + } + if !self.is_jumping { + return Velocity::zero(); + } + self.is_jumping = false; + + let diff_y_vel = self.jump_speed - player.vel.y; + + Velocity { + x: 0.0, + y: diff_y_vel, + z: 0.0, + } + } + + pub fn jump(&mut self) { + println!("Jump Called"); + self.is_jumping = true; + } +} + +impl PlayerScript for PlayerJumpScript { + fn name(&self) -> &'static str { + "Jump" + } + + fn update(&mut self, world: &World, player: &mut Player) { + let jump_force = self.jump_force(player); + player.vel = jump_force + player.vel; + println!("Jumping"); + println!("Jump force: {:?}", jump_force); + println!("Player velocity: {:?}", player.vel); + } + + fn handle_action(&mut self, action: Box) { + println!("Handling action"); + + if action.name() == "Jump-Action" { + self.jump(); + } + } +} diff --git a/lib/world/src/entities/projectile.rs b/lib/world/src/entities/projectile.rs new file mode 100644 index 0000000..d1c02ba --- /dev/null +++ b/lib/world/src/entities/projectile.rs @@ -0,0 +1,25 @@ +struct FireballEntity { + pos: FineWorldPos, + vel: Velocity, + life: u8, +} + +#[wasm_bindgen] +#[derive(Clone, Deserialize, Serialize)] +struct Projectile { + pos: FineWorldPos, +} + +impl Entity for Projectile { + fn update(&mut self, world: &World) -> () { + todo!() + } + + fn perform_action(&mut self, action: EntityAction) -> () { + todo!() + } + + fn id(&self) -> u32 { + todo!() + } +} diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs new file mode 100644 index 0000000..15bc1e0 --- /dev/null +++ b/lib/world/src/entities/sandbox.rs @@ -0,0 +1,68 @@ +use super::{ + player::{Game, GameScript, Player}, + terrain_gen::TerrainGenerator, +}; +use crate::{positions::ChunkPos, world::World}; + +struct SandBoxGScript { + seed: u32, + flat_world: bool, + load_distance: u8, + terrain_gen: TerrainGenerator, +} + +impl SandBoxGScript { + pub fn new(seed: u32, flat_world: bool, infinite: bool, load_distance: u8) -> SandBoxGScript { + SandBoxGScript { + seed, + flat_world, + load_distance, + } + } + + fn get_chunks_around_player(&self, player: &Player) -> Vec { + let poses = vec![]; + + let player_chunk_pos: ChunkPos = player.pos.to_chunk_pos(); + + for i in -(self.load_distance as i16)..self.load_distance as i16 { + for j in -(self.load_distance as i16)..self.load_distance as i16 { + let chunk_pos = player_chunk_pos + ChunkPos { x: i, y: j }; + poses.push(chunk_pos); + } + } + + poses + } + + fn load_chunks_around_player(&self, players: Vec<&Player>, game: &mut Game) -> () { + let nearby_unloaded_chunks: Vec = players + .iter() + .flat_map(|p| self.get_chunks_around_player(p)) + .filter(|pos| !world.is_chunk_loaded(pos)) + .collect(); + + // only load the first chunk + let chunk_pos = nearby_unloaded_chunks.first(); + + if let Some(chunk_pos) = chunk_pos { + let chunk = self.terrain_gen.get_chunk(chunk_pos.x, chunk_pos.y); + game.schedule_chunk_insert(Box::new(chunk)); + } + } +} + +impl GameScript for SandBoxGScript { + fn update(&self, game: &Game, delta: u8) -> () { + let ents = game.get_entities(); + + // for ent in ents { + // let mut any_ent = *ent.to_owned().borrow_mut(); + // + // // downcast to player + // if let Some(player) = any_ent + // // do something with player + // } + // } + } +} diff --git a/lib/world/src/entities/terrain_gen.rs b/lib/world/src/entities/terrain_gen.rs new file mode 100644 index 0000000..bb42375 --- /dev/null +++ b/lib/world/src/entities/terrain_gen.rs @@ -0,0 +1,507 @@ +use crate::{ + chunk::Chunk, + positions::{ChunkPos, WorldPos}, +}; + +// remove all the positions that are too close to each other in the chunk +fn remove_close_positions<'a, I, J>(pos_iter: I, checking_pos_iter: J) -> Vec +where + I: IntoIterator, + J: IntoIterator + Clone, +{ + let mut out_positions = Vec::new(); + + for pos in pos_iter { + let mut too_close = false; + for other_pos in checking_pos_iter.clone() { + if pos.distance_to_2::(&other_pos) < 3.0 { + too_close = true; + break; + } + } + if !too_close { + out_positions.push(pos.to_owned()); + } + } + + out_positions +} + +struct TreeLocator { + world_x: i32, + world_z: i32, +} + +impl TreeLocator { + fn is_in_chunk(&self, chunk_pos: &ChunkPos) -> bool { + let my_chunk_pos = WorldPos { + x: self.world_x, + y: 0, + z: self.world_z, + } + .to_chunk_pos(); + + if my_chunk_pos == *chunk_pos { + return true; + } + + // check leaf blocks + for x in Directions::flat() { + let other_pos = WorldPos { + x: self.world_x, + y: 0, + z: self.world_z, + } + .move_direction(&x) + .to_chunk_pos(); + if other_pos == *chunk_pos { + return true; + } + } + + return false; + } + + fn get_world_blocks(&self, y_pos: i32) -> Vec { + let height = 5; + + // make trunk + let mut blocks = (0..height) + .map(|y| WorldBlock { + world_pos: WorldPos { + x: self.world_x, + y: y + y_pos, + z: self.world_z, + }, + block_type: BlockType::Wood, + extra_data: block::BlockData::None, + }) + .collect::>(); + + // add leaves at top + let mut leaf_dirs = Directions::all(); + leaf_dirs.remove_direction(Direction::Down); + for x in leaf_dirs { + let pos = WorldPos { + x: self.world_x, + y: height + y_pos, + z: self.world_z, + } + .move_direction(&x); + + blocks.push(WorldBlock { + world_pos: pos, + block_type: BlockType::Leaf, + + extra_data: block::BlockData::None, + }); + } + + blocks + } +} + +pub struct TreeRandomSpreadGenerator { + seed: u64, +} + +impl TreeRandomSpreadGenerator { + fn get_potential_tree_locations( + &self, + chunk_pos: ChunkPos, + ) -> Box> { + let chunk_seed = self.seed + (chunk_pos.x as u64 * 1000) + (chunk_pos.y as u64 * 1000000); + let mut rng: StdRng = SeedableRng::seed_from_u64(chunk_seed); + let dist = Uniform::new(0, CHUNK_WIDTH); + + let mut tree_locations: Vec = Vec::new(); + + for _ in 0..20 { + let x = dist.sample(&mut rng); + let z = dist.sample(&mut rng); + + let pos = WorldPos { + x: (chunk_pos.x * CHUNK_WIDTH) as i32 + x as i32, + y: 0, + z: (chunk_pos.y * CHUNK_WIDTH) as i32 + z as i32, + }; + + // loop over and make sure that the tree is not too close to any other trees + let mut too_close = false; + for other_pos in tree_locations.iter() { + if pos.distance_to_2::(&other_pos) < 3.0 { + too_close = true; + break; + } + } + + if too_close { + continue; + } + + tree_locations.push(pos); + } + + Box::new(tree_locations.into_iter()) + } + + fn get_tree_locations(self: &Self, chunk_pos: ChunkPos) -> Vec { + let corner_potential_tree_locations = self + .get_potential_tree_locations(ChunkPos { + x: chunk_pos.x + 1, + y: chunk_pos.y + 1, + }) + .collect::>(); + + let above_potential_tree_locations = self.get_potential_tree_locations(ChunkPos { + x: chunk_pos.x, + y: chunk_pos.y + 1, + }); + let right_potential_tree_locations = self.get_potential_tree_locations(ChunkPos { + x: chunk_pos.x + 1, + y: chunk_pos.y, + }); + + let nearby_potential_tree_locations = above_potential_tree_locations + .chain(right_potential_tree_locations) + .collect::>(); + + let nearby_valid_tree_locations = remove_close_positions( + nearby_potential_tree_locations.iter(), + corner_potential_tree_locations.iter(), + ); + + let potential_tree_locations = self + .get_potential_tree_locations(chunk_pos) + .collect::>(); + + let t = remove_close_positions( + potential_tree_locations.iter(), + nearby_valid_tree_locations.iter(), + ); + + t + } + + fn get_trees(self: &Self, chunk_pos: ChunkPos) -> Vec { + let tree_locations = self.get_tree_locations(chunk_pos); + + let mut trees = Vec::new(); + + for tree_location in tree_locations { + trees.push(TreeLocator { + world_x: tree_location.x, + world_z: tree_location.z, + }); + } + + // loop over nearby chunks to make sure there isn't an overlaping tree + for x in EVERY_FLAT_DIRECTION { + let other_chunk_pos = chunk_pos.move_in_flat_direction(&x); + let other_tree_locations = self.get_tree_locations(other_chunk_pos); + + let other_trees = other_tree_locations + .into_iter() + .map(|tree_location| TreeLocator { + world_x: tree_location.x, + world_z: tree_location.z, + }) + .filter(|tree_location| tree_location.is_in_chunk(&other_chunk_pos)) + .collect::>(); + + trees.extend(other_trees); + } + + trees + } +} + +struct FlowerGetter { + seed: u64, +} + +#[derive(Eq, PartialEq)] +struct FlowerLocator { + world_x: i32, + world_z: i32, +} + +impl FlowerLocator { + fn make_chunk_block(self: &Self, y_pos: i32) -> ChunkBlock { + ChunkBlock { + pos: WorldPos::new( + self.world_x % CHUNK_WIDTH as i32, + y_pos, + self.world_z % CHUNK_WIDTH as i32, + ) + .to_inner_chunk_pos(), + block_type: BlockType::RedFlower, + extra_data: block::BlockData::None, + } + } +} + +impl FlowerGetter { + fn get_flowers(self: &Self, chunk_pos: &ChunkPos) -> Vec { + // generate 15-25 random flowers per chunk + let chunk_seed = self.seed + (chunk_pos.x as u64 * 1000) + (chunk_pos.y as u64 * 1000000); + let mut rng: StdRng = SeedableRng::seed_from_u64(chunk_seed); + let dist = Uniform::new(0, CHUNK_WIDTH); + let flower_count_getter = Uniform::new(15, 25); + + let flower_count = flower_count_getter.sample(&mut rng); + + let mut flowers = Vec::new(); + + for _ in 0..flower_count { + let x = dist.sample(&mut rng); + let z = dist.sample(&mut rng); + + let loc = FlowerLocator { + world_x: (chunk_pos.x * CHUNK_WIDTH) as i32 + x as i32, + world_z: (chunk_pos.y * CHUNK_WIDTH) as i32 + z as i32, + }; + + let already_has_flower = flowers.iter().any(|other_loc| *other_loc == loc); + + if already_has_flower { + continue; + } + + flowers.push(loc); + } + + flowers + } +} + +struct BasicChunkGetter { + seed: u32, + jag_factor: f64, + height_multiplier: f64, +} + +impl BasicChunkGetter { + pub fn make(seed: u32) -> BasicChunkGetter { + BasicChunkGetter { + seed, + jag_factor: 1.0 / 100.0, + height_multiplier: 10.0, + } + } + + pub fn get_chunk(&self, chunk_pos: &ChunkPos) -> Chunk { + let noise = Perlin::new(self.seed); + + let get_height = |x: f64, z: f64| -> f64 { + let per_val = noise.get([x * self.jag_factor, z * self.jag_factor]); + let height = ((per_val.abs() * self.height_multiplier) + 5.0) as i32; + height as f64 + }; + + let mut chunk = Chunk::new(*chunk_pos); + + let trees_in_chunk = TreeRandomSpreadGenerator { seed: 100 }; + + let trees = trees_in_chunk.get_trees(*chunk_pos); + + for tree in trees { + let height = get_height(tree.world_x as f64, tree.world_z as f64) as i32; + let blocks = tree.get_world_blocks(height); + for block in blocks { + let block_chunnk_pos = block.world_pos.to_chunk_pos(); + if block_chunnk_pos != *chunk_pos { + continue; + } + chunk.add_block(block.to_chunk_block()); + } + } + + // place flowers + let flowers_in_chunk = FlowerGetter { seed: 100 }; + + let flowers = flowers_in_chunk.get_flowers(&chunk_pos); + + for flower in flowers { + let height = get_height(flower.world_x as f64, flower.world_z as f64) as i32; + + let flower = flower.make_chunk_block(height + 1); + + // only place block if there isn't already a block there + if chunk.has_block(&flower.pos) { + continue; + } + + chunk.add_block(flower); + } + + for x in 0u8..CHUNK_WIDTH as u8 { + for z in 0u8..CHUNK_WIDTH as u8 { + let world_x = (chunk_pos.x * CHUNK_WIDTH as i16) as f64 + (x as f64); + let world_z = (chunk_pos.y * CHUNK_WIDTH as i16) as f64 + (z as f64); + + let per_val = noise.get([world_x * self.jag_factor, world_z * self.jag_factor]); + let height = ((per_val.abs() * self.height_multiplier) + 5.0) as u8; + + // use web_sys::console; + // console::log_1(&format!("height: {}", height).into()); + + for y in 0u8..height { + let block = ChunkBlock { + pos: InnerChunkPos::new(x, y, z), + block_type: BlockType::Stone, + extra_data: block::BlockData::None, + }; + + chunk.add_block(block); + } + // add top grass block + let block = ChunkBlock { + pos: InnerChunkPos::new(x, height, z), + block_type: BlockType::Grass, + extra_data: block::BlockData::None, + }; + chunk.add_block(block); + } + } + + chunk + } +} + +struct FlatWorldChunkGetter {} + +impl FlatWorldChunkGetter { + pub fn get_chunk(&self, chunk_pos: &ChunkPos) -> Chunk { + let mut chunk = Chunk::new(*chunk_pos); + for x in 0u8..CHUNK_WIDTH as u8 { + for z in 0u8..CHUNK_WIDTH as u8 { + let block = ChunkBlock { + pos: InnerChunkPos::new(x, 0, z), + block_type: BlockType::Grass, + extra_data: block::BlockData::None, + }; + chunk.add_block(block); + } + } + chunk + } +} + +#[derive(Serialize, Deserialize)] +#[wasm_bindgen] +struct ParkorChunkGetter { + #[wasm_bindgen(skip)] + pub current_blocks: Vec, + + // how far away the blocks are generated from requested chunks + pub load_distance: u8, +} + +#[wasm_bindgen] +impl ParkorChunkGetter { + pub fn new() -> ParkorChunkGetter { + ParkorChunkGetter { + current_blocks: Vec::new(), + load_distance: 4, + } + } + + pub fn get_chunk_wasm(&mut self, chunk_x: i16, chunk_y: i16) -> Chunk { + let chunk_pos = ChunkPos { + x: chunk_x, + y: chunk_y, + }; + self.get_chunk(&chunk_pos) + } +} + +impl ParkorChunkGetter { + pub fn get_next_block(&self) -> WorldBlock { + let current_block = self.current_blocks.last(); + + if let Some(block) = current_block { + let block_pos = block.world_pos; + + // compute the next pos + let next_pos = block_pos + .move_direction(&Direction::North) + .move_direction(&Direction::North); + + WorldBlock { + world_pos: next_pos, + block_type: BlockType::Stone, + extra_data: block::BlockData::None, + } + } else { + // return the first block + WorldBlock { + world_pos: WorldPos::new(0, 0, 0), + block_type: BlockType::Stone, + extra_data: block::BlockData::None, + } + } + } + + fn load_chunk(&mut self, chunk_pos: &ChunkPos) { + // check if there are any blocks in this chunk + let next_block = self.get_next_block(); + + let mut count = 0; + + // keep loading the next block until it isn't load distance away from me + while next_block.world_pos.to_chunk_pos().distance_to(*chunk_pos) as u8 + <= self.load_distance + && count < 10 + { + self.current_blocks.push(next_block); + let next_block = self.get_next_block(); + self.current_blocks.push(next_block); + count += 1; + } + } + + pub fn get_chunk(&mut self, chunk_pos: &ChunkPos) -> Chunk { + let mut chunk = Chunk::new(*chunk_pos); + + self.load_chunk(chunk_pos); + + for block in self.current_blocks.iter() { + let block_chunk_pos = block.world_pos.to_chunk_pos(); + if block_chunk_pos == *chunk_pos { + chunk.add_block(block.to_chunk_block()); + } + } + + chunk + } +} + +#[wasm_bindgen] +pub struct TerrainGenerator { + pub seed: u32, + pub flat_world: bool, +} + +#[wasm_bindgen] +impl TerrainGenerator { + #[wasm_bindgen(constructor)] + pub fn new(seed: u32, flat_world: bool) -> TerrainGenerator { + TerrainGenerator { seed, flat_world } + } + + pub fn get_chunk(&self, chunk_x: i16, chunk_y: i16) -> Chunk { + let chunk_pos = ChunkPos { + x: chunk_x, + y: chunk_y, + }; + + if self.flat_world { + let chunk_getter = FlatWorldChunkGetter {}; + return chunk_getter.get_chunk(&chunk_pos); + } + + let chunk_getter = BasicChunkGetter::make(self.seed); + chunk_getter.get_chunk(&chunk_pos) + } +} diff --git a/lib/world/src/geometry/rotation.rs b/lib/world/src/geometry/rotation.rs index c98c703..627fffe 100644 --- a/lib/world/src/geometry/rotation.rs +++ b/lib/world/src/geometry/rotation.rs @@ -1,6 +1,6 @@ use crate::vec::Vec3; use serde::{Deserialize, Serialize}; -use std::f32::consts::PI; +use std::{f32::consts::PI, ops::Add}; #[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)] pub struct SphericalRotation { @@ -17,6 +17,35 @@ impl SphericalRotation { } } +impl Add for SphericalRotation { + type Output = Self; + + fn add(self, other: Self) -> Self { + // Add the angles + let mut new_theta = self.theta + other.theta; + let mut new_phi = self.phi + other.phi; + + // Ensure theta is in [0, 2PI] + if new_theta < 0.0 { + new_theta += 2.0 * std::f32::consts::PI; + } else if new_theta > 2.0 * std::f32::consts::PI { + new_theta -= 2.0 * std::f32::consts::PI; + } + + // Ensure phi is in [-PI/2, PI/2] + if new_phi < -std::f32::consts::FRAC_PI_2 { + new_phi = -std::f32::consts::FRAC_PI_2; + } else if new_phi > std::f32::consts::FRAC_PI_2 { + new_phi = std::f32::consts::FRAC_PI_2; + } + + Self { + theta: new_theta, + phi: new_phi, + } + } +} + impl Into> for SphericalRotation { /** * Converts a spherical rotation into a unit vector. diff --git a/lib/world/src/lib.rs b/lib/world/src/lib.rs index 6323020..e71c740 100644 --- a/lib/world/src/lib.rs +++ b/lib/world/src/lib.rs @@ -1,6 +1,7 @@ pub mod block; pub mod chunk; pub mod direction; +pub mod entities; pub mod geometry; pub mod plane; pub mod positions; From a963caa52774aa6d9cf5c7bc79b08cea0e41fcf8 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 4 Aug 2024 13:09:02 -0700 Subject: [PATCH 03/61] Added chunk insert, thx to Addie for chunk id math --- lib/world/Cargo.toml | 4 + lib/world/src/entities/game.rs | 109 ++++++++++++++------------ lib/world/src/entities/mod.rs | 2 + lib/world/src/entities/player.rs | 109 ++++++++++++++++---------- lib/world/src/entities/sandbox.rs | 46 +++++++---- lib/world/src/entities/terrain_gen.rs | 44 ++++++----- lib/world/src/positions.rs | 24 ++++++ lib/world/src/world/world_chunk.rs | 4 + 8 files changed, 214 insertions(+), 128 deletions(-) diff --git a/lib/world/Cargo.toml b/lib/world/Cargo.toml index 6843b3c..05e7670 100644 --- a/lib/world/Cargo.toml +++ b/lib/world/Cargo.toml @@ -25,6 +25,10 @@ serde-wasm-bindgen = "0.6.5" float-cmp = "0.9.0" phf = { version = "0.11", default-features = false, features = ["macros"] } web-sys = { version = "0.3.60", features = ["console"] } +noise = "0.8.2" +rand = { version = "0.8.5" } +rand_distr = "0.4.3" +getrandom = { version = "0.2", features = ["js"] } # The `console_error_panic_hook` crate provides better debugging of panics by # logging them with `console.error`. This is great for development, but requires diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 3a0910e..7e0f6c5 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -3,44 +3,44 @@ use super::{ player::{Player, WorldBlock}, }; use crate::{chunk::Chunk, world::World}; -use std::{any::Any, collections::HashMap}; +use std::{any::Any, borrow::BorrowMut, collections::HashMap}; use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; pub trait GameScript { - fn update(&self, delta: u8) -> (); + fn update(&self, world: &World, ents: &Vec>, delta: u8) -> GameDiff; fn on_diff(&self, diff: &GameDiff) -> (); } -#[wasm_bindgen] -struct JsGameScript { - update_jsfn: js_sys::Function, -} - -impl GameScript for JsGameScript { - fn update(&self, delta: u8) -> () { - let val = JsValue::from(delta); - // let res = self.update_jsfn.call1(&val); - // print the error - // if let Err(e) = res { - // let err = Error::from(e); - // }; - } - - fn on_diff(&self, diff: &GameDiff) -> () { - todo!() - } -} - -#[wasm_bindgen] -impl JsGameScript { - pub fn make(val: JsValue) -> JsGameScript { - let update_fn = js_sys::Reflect::get(&val, &JsValue::from("update")).unwrap(); - - JsGameScript { - update_jsfn: update_fn.into(), - } - } -} +// #[wasm_bindgen] +// struct JsGameScript { +// update_jsfn: js_sys::Function, +// } +// +// impl GameScript for JsGameScript { +// fn update(&self, delta: u8) -> () { +// let val = JsValue::from(delta); +// // let res = self.update_jsfn.call1(&val); +// // print the error +// // if let Err(e) = res { +// // let err = Error::from(e); +// // }; +// } +// +// fn on_diff(&self, diff: &GameDiff) -> () { +// todo!() +// } +// } +// +// #[wasm_bindgen] +// impl JsGameScript { +// pub fn make(val: JsValue) -> JsGameScript { +// let update_fn = js_sys::Reflect::get(&val, &JsValue::from("update")).unwrap(); +// +// JsGameScript { +// update_jsfn: update_fn.into(), +// } +// } +// } pub trait PlayerScript { fn name(&self) -> &'static str; @@ -116,15 +116,12 @@ impl Game { script.update(world, &mut player); } - // update all controllers - // self.controllers - // .iter_mut() - // .for_each(|controller| controller.update(world)); - // send diff to all scripts - self.game_scripts.iter().for_each(|script| { - script.update(1); - }); + + for gscript in &mut self.game_scripts { + let diff = gscript.update(&self.world, &self.entities, 1); + self.diff.combine(diff) + } self.game_scripts.iter().for_each(|script| { script.on_diff(&self.diff); @@ -153,10 +150,6 @@ impl Game { self.game_scripts.push(game_script); } - fn add_entity(&mut self, entity: Box) { - self.entities.push(entity); - } - pub fn get_entities(&self) -> &Vec> { &self.entities } @@ -183,7 +176,7 @@ pub struct GameDiff { } impl GameDiff { - fn empty() -> GameDiff { + pub fn empty() -> GameDiff { GameDiff { new_entities: Vec::new(), new_blocks: Vec::new(), @@ -193,6 +186,14 @@ impl GameDiff { } } + pub fn combine(&mut self, other: GameDiff) { + self.new_entities.extend(other.new_entities); + self.new_blocks.extend(other.new_blocks); + self.new_chunks.extend(other.new_chunks); + self.removed_entities.extend(other.removed_entities); + self.removed_blocks.extend(other.removed_blocks); + } + pub fn add_entity(&mut self, entity: Box) { self.new_entities.push(entity) } @@ -214,6 +215,7 @@ mod tests { use crate::entities::{ player::Player, player_jump_script::{PlayerJumpAction, PlayerJumpScript}, + sandbox::SandBoxGScript, }; use super::*; @@ -235,7 +237,7 @@ mod tests { } #[test] - pub fn basic() { + pub fn add_player() { let mut game = Game::new(); let player = Box::new(Player::make(1)); game.schedule_entity_insert(player); @@ -247,15 +249,20 @@ mod tests { }); } - pub fn game_script() { + #[test] + pub fn generate_chunk() { let mut game = Game::new(); let player = Box::new(Player::make(1)); game.schedule_entity_insert(player); game.update(); - // expect game to have a player in it - game.get_entities().iter().for_each(|ent| { - assert_eq!(ent.id(), 1); - }); + let sandbox_game_script = Box::new(SandBoxGScript::default()); + game.add_game_script(sandbox_game_script); + game.update(); + + // Check that chunks loaded + let chunk_count = game.world.chunk_count(); + + assert_eq!(chunk_count, 1); } } diff --git a/lib/world/src/entities/mod.rs b/lib/world/src/entities/mod.rs index e61d4d8..7d5fe9d 100644 --- a/lib/world/src/entities/mod.rs +++ b/lib/world/src/entities/mod.rs @@ -2,3 +2,5 @@ pub mod entity; pub mod game; pub mod player; pub mod player_jump_script; +pub mod sandbox; +pub mod terrain_gen; diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index 9214185..b60ed47 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -1,52 +1,79 @@ -use super::{ - entity::{Entity, EntityAction, EntityId}, - game::PlayerScript, -}; +use super::entity::{Entity, EntityAction, EntityId}; use crate::{ block::{BlockData, BlockType}, direction::Direction, geometry::rotation::SphericalRotation, + positions::{ChunkPos, FineWorldPos, WorldPos}, world::World, }; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::wasm_bindgen; -#[derive(Clone, Serialize, Deserialize)] -#[wasm_bindgen] -struct FineWorldPos { - x: f32, - y: f32, - z: f32, -} - -#[wasm_bindgen] -#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)] -struct WorldPos { - x: i32, - y: i32, - z: i32, -} - +// #[derive(Clone, Serialize, Deserialize)] +// #[wasm_bindgen] +// struct FineWorldPos { +// x: f32, +// y: f32, +// z: f32, +// } +// impl FineWorldPos { +// pub fn to_world_pos(&self) -> WorldPos { +// WorldPos { +// x: self.x.floor() as i32, +// y: self.y.floor() as i32, +// z: self.z.floor() as i32, +// } +// } +// } +// +// #[wasm_bindgen] +// #[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)] +// struct WorldPos { +// x: i32, +// y: i32, +// z: i32, +// } // Convert World pos to Fine World pos -impl From for FineWorldPos { - fn from(world_pos: WorldPos) -> Self { - FineWorldPos { - x: world_pos.x as f32, - y: world_pos.y as f32, - z: world_pos.z as f32, - } - } -} - -impl From for WorldPos { - fn from(fine_pos: FineWorldPos) -> Self { - WorldPos { - x: fine_pos.x.floor() as i32, - y: fine_pos.y.floor() as i32, - z: fine_pos.z.floor() as i32, - } - } -} +// impl From for FineWorldPos { +// fn from(world_pos: WorldPos) -> Self { +// FineWorldPos { +// x: world_pos.x as f32, +// y: world_pos.y as f32, +// z: world_pos.z as f32, +// } +// } +// } +// +// impl From for WorldPos { +// fn from(fine_pos: FineWorldPos) -> Self { +// WorldPos { +// x: fine_pos.x.floor() as i32, +// y: fine_pos.y.floor() as i32, +// z: fine_pos.z.floor() as i32, +// } +// } +// } +// +// impl From for ChunkPos { +// fn from(world_pos: WorldPos) -> Self { +// let x = if world_pos.x < 0 { +// ((world_pos.x + 1) / CHUNK_WIDTH as i32) - 1 +// } else { +// world_pos.x / CHUNK_WIDTH as i32 +// }; +// +// let y = if world_pos.z < 0 { +// ((world_pos.z + 1) / CHUNK_WIDTH as i32) - 1 +// } else { +// world_pos.z / CHUNK_WIDTH as i32 +// }; +// +// ChunkPos { +// x: x as i16, +// y: y as i16, +// } +// } +// } #[wasm_bindgen] #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Copy)] @@ -79,10 +106,10 @@ impl std::ops::Add for Velocity { } #[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)] -#[wasm_bindgen] +// #[wasm_bindgen] pub struct WorldBlock { pub block_type: BlockType, - #[wasm_bindgen(skip)] + // #[wasm_bindgen(skip)] pub extra_data: BlockData, pub world_pos: WorldPos, } diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index 15bc1e0..46048da 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -1,29 +1,42 @@ use super::{ - player::{Game, GameScript, Player}, + game::{Game, GameDiff, GameScript}, + player::Player, terrain_gen::TerrainGenerator, }; use crate::{positions::ChunkPos, world::World}; -struct SandBoxGScript { +pub struct SandBoxGScript { seed: u32, flat_world: bool, load_distance: u8, terrain_gen: TerrainGenerator, } +impl Default for SandBoxGScript { + fn default() -> Self { + SandBoxGScript { + seed: 0, + flat_world: false, + load_distance: 1, + terrain_gen: TerrainGenerator::new(0, false), + } + } +} + impl SandBoxGScript { pub fn new(seed: u32, flat_world: bool, infinite: bool, load_distance: u8) -> SandBoxGScript { SandBoxGScript { seed, flat_world, load_distance, + terrain_gen: TerrainGenerator::new(seed, flat_world), } } fn get_chunks_around_player(&self, player: &Player) -> Vec { - let poses = vec![]; + let mut poses = vec![]; - let player_chunk_pos: ChunkPos = player.pos.to_chunk_pos(); + let player_chunk_pos: ChunkPos = player.pos.to_world_pos().to_chunk_pos(); for i in -(self.load_distance as i16)..self.load_distance as i16 { for j in -(self.load_distance as i16)..self.load_distance as i16 { @@ -35,34 +48,33 @@ impl SandBoxGScript { poses } - fn load_chunks_around_player(&self, players: Vec<&Player>, game: &mut Game) -> () { + fn load_chunks_around_player(&self, players: &Vec>, world: &World) -> GameDiff { let nearby_unloaded_chunks: Vec = players .iter() .flat_map(|p| self.get_chunks_around_player(p)) - .filter(|pos| !world.is_chunk_loaded(pos)) + .filter(|pos| !world.has_chunk(pos)) .collect(); // only load the first chunk let chunk_pos = nearby_unloaded_chunks.first(); + let mut gdiff = GameDiff::empty(); + if let Some(chunk_pos) = chunk_pos { let chunk = self.terrain_gen.get_chunk(chunk_pos.x, chunk_pos.y); - game.schedule_chunk_insert(Box::new(chunk)); + gdiff.add_chunk(Box::new(chunk)); } + + gdiff } } impl GameScript for SandBoxGScript { - fn update(&self, game: &Game, delta: u8) -> () { - let ents = game.get_entities(); + fn update(&self, world: &World, ents: &Vec>, _delta: u8) -> GameDiff { + self.load_chunks_around_player(ents, world) + } - // for ent in ents { - // let mut any_ent = *ent.to_owned().borrow_mut(); - // - // // downcast to player - // if let Some(player) = any_ent - // // do something with player - // } - // } + fn on_diff(&self, _diff: &GameDiff) -> () { + // on diff } } diff --git a/lib/world/src/entities/terrain_gen.rs b/lib/world/src/entities/terrain_gen.rs index bb42375..ae2efe3 100644 --- a/lib/world/src/entities/terrain_gen.rs +++ b/lib/world/src/entities/terrain_gen.rs @@ -1,7 +1,14 @@ use crate::{ - chunk::Chunk, - positions::{ChunkPos, WorldPos}, + block::{BlockData, BlockType, ChunkBlock}, + chunk::{Chunk, CHUNK_WIDTH}, + direction::{Direction, Directions, EVERY_FLAT_DIRECTION}, + positions::{ChunkPos, InnerChunkPos, WorldPos}, + world::world_block::WorldBlock, }; +use noise::{NoiseFn, Perlin}; +use rand::{rngs::StdRng, SeedableRng}; +use rand_distr::{Distribution, Uniform}; +use serde::{Deserialize, Serialize}; // remove all the positions that are too close to each other in the chunk fn remove_close_positions<'a, I, J>(pos_iter: I, checking_pos_iter: J) -> Vec @@ -74,7 +81,7 @@ impl TreeLocator { z: self.world_z, }, block_type: BlockType::Wood, - extra_data: block::BlockData::None, + extra_data: BlockData::None, }) .collect::>(); @@ -92,8 +99,7 @@ impl TreeLocator { blocks.push(WorldBlock { world_pos: pos, block_type: BlockType::Leaf, - - extra_data: block::BlockData::None, + extra_data: BlockData::None, }); } @@ -110,7 +116,7 @@ impl TreeRandomSpreadGenerator { &self, chunk_pos: ChunkPos, ) -> Box> { - let chunk_seed = self.seed + (chunk_pos.x as u64 * 1000) + (chunk_pos.y as u64 * 1000000); + let chunk_seed = self.seed + chunk_pos.to_id(); let mut rng: StdRng = SeedableRng::seed_from_u64(chunk_seed); let dist = Uniform::new(0, CHUNK_WIDTH); @@ -236,7 +242,7 @@ impl FlowerLocator { ) .to_inner_chunk_pos(), block_type: BlockType::RedFlower, - extra_data: block::BlockData::None, + extra_data: BlockData::None, } } } @@ -244,7 +250,7 @@ impl FlowerLocator { impl FlowerGetter { fn get_flowers(self: &Self, chunk_pos: &ChunkPos) -> Vec { // generate 15-25 random flowers per chunk - let chunk_seed = self.seed + (chunk_pos.x as u64 * 1000) + (chunk_pos.y as u64 * 1000000); + let chunk_seed = self.seed + chunk_pos.to_id(); let mut rng: StdRng = SeedableRng::seed_from_u64(chunk_seed); let dist = Uniform::new(0, CHUNK_WIDTH); let flower_count_getter = Uniform::new(15, 25); @@ -350,7 +356,7 @@ impl BasicChunkGetter { let block = ChunkBlock { pos: InnerChunkPos::new(x, y, z), block_type: BlockType::Stone, - extra_data: block::BlockData::None, + extra_data: BlockData::None, }; chunk.add_block(block); @@ -359,7 +365,7 @@ impl BasicChunkGetter { let block = ChunkBlock { pos: InnerChunkPos::new(x, height, z), block_type: BlockType::Grass, - extra_data: block::BlockData::None, + extra_data: BlockData::None, }; chunk.add_block(block); } @@ -379,7 +385,7 @@ impl FlatWorldChunkGetter { let block = ChunkBlock { pos: InnerChunkPos::new(x, 0, z), block_type: BlockType::Grass, - extra_data: block::BlockData::None, + extra_data: BlockData::None, }; chunk.add_block(block); } @@ -389,16 +395,16 @@ impl FlatWorldChunkGetter { } #[derive(Serialize, Deserialize)] -#[wasm_bindgen] +// #[wasm_bindgen] struct ParkorChunkGetter { - #[wasm_bindgen(skip)] + // #[wasm_bindgen(skip)] pub current_blocks: Vec, // how far away the blocks are generated from requested chunks pub load_distance: u8, } -#[wasm_bindgen] +// #[wasm_bindgen] impl ParkorChunkGetter { pub fn new() -> ParkorChunkGetter { ParkorChunkGetter { @@ -431,14 +437,14 @@ impl ParkorChunkGetter { WorldBlock { world_pos: next_pos, block_type: BlockType::Stone, - extra_data: block::BlockData::None, + extra_data: BlockData::None, } } else { // return the first block WorldBlock { world_pos: WorldPos::new(0, 0, 0), block_type: BlockType::Stone, - extra_data: block::BlockData::None, + extra_data: BlockData::None, } } } @@ -477,15 +483,15 @@ impl ParkorChunkGetter { } } -#[wasm_bindgen] +// #[wasm_bindgen] pub struct TerrainGenerator { pub seed: u32, pub flat_world: bool, } -#[wasm_bindgen] +// #[wasm_bindgen] impl TerrainGenerator { - #[wasm_bindgen(constructor)] + // #[wasm_bindgen(constructor)] pub fn new(seed: u32, flat_world: bool) -> TerrainGenerator { TerrainGenerator { seed, flat_world } } diff --git a/lib/world/src/positions.rs b/lib/world/src/positions.rs index de08e78..56d4a7f 100644 --- a/lib/world/src/positions.rs +++ b/lib/world/src/positions.rs @@ -73,6 +73,30 @@ impl ChunkPos { let y = self.y as i32; x + (y << 16) } + + pub fn to_id(&self) -> u64 { + let mut x: u64 = 2 * (self.x.abs() as u64); + let mut y: u64 = 2 * (self.y.abs() as u64); + if self.x < 0 { + x += 1 + } + if self.y < 0 { + y += 1 + } + let id = ((x + y) * (x + y + 1) / 2) + y; + + id + } +} + +impl std::ops::Add for ChunkPos { + type Output = ChunkPos; + fn add(self, other: ChunkPos) -> ChunkPos { + ChunkPos { + x: self.x + other.x, + y: self.y + other.y, + } + } } impl FineWorldPos { diff --git a/lib/world/src/world/world_chunk.rs b/lib/world/src/world/world_chunk.rs index 6ed2b8f..45daf34 100644 --- a/lib/world/src/world/world_chunk.rs +++ b/lib/world/src/world/world_chunk.rs @@ -13,6 +13,10 @@ impl World { .ok_or(ChunkNotLoadedError) } + pub fn chunk_count(&self) -> usize { + self.chunks.len() + } + pub fn has_chunk(&self, chunk_pos: &ChunkPos) -> bool { self.chunks.contains_key(&chunk_pos.to_world_index()) } From 7a0bef37522bc60044db91a342191395aa795acf Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sat, 10 Aug 2024 14:55:43 -0700 Subject: [PATCH 04/61] Game scripts and chunk stuff --- .../src/game-scripts/canvas-gscript.ts | 27 +- apps/web-client/src/renders/chunkRender.ts | 11 +- apps/web-client/src/runner.ts | 12 + lib/engine/entities/cube.ts | 5 - lib/engine/entities/player/playerActions.ts | 4 +- lib/engine/game-script.ts | 4 +- lib/engine/modules.ts | 116 +++++-- lib/engine/world/chunk.ts | 9 - lib/engine/world/chunkMesh.ts | 9 - lib/engine/world/world.ts | 6 - lib/world/src/chunk.rs | 6 + lib/world/src/chunk/chunk_mesh.rs | 2 + lib/world/src/entities/entity.rs | 31 +- lib/world/src/entities/game.rs | 183 +++++++---- lib/world/src/entities/items.rs | 108 ++++++ lib/world/src/entities/player.rs | 307 ++---------------- .../src/entities/player_gravity_script.rs | 30 ++ lib/world/src/entities/player_jump_script.rs | 46 ++- lib/world/src/entities/player_move_script.rs | 20 ++ lib/world/src/entities/sandbox.rs | 12 +- lib/world/src/geometry/rotation.rs | 4 +- lib/world/src/positions.rs | 48 ++- lib/world/src/vec.rs | 5 +- lib/world/src/world/world_duct.rs | 14 +- 24 files changed, 555 insertions(+), 464 deletions(-) create mode 100644 apps/web-client/src/runner.ts delete mode 100644 lib/engine/world/chunkMesh.ts create mode 100644 lib/world/src/entities/items.rs create mode 100644 lib/world/src/entities/player_gravity_script.rs create mode 100644 lib/world/src/entities/player_move_script.rs diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index c6e3338..53e92e1 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -18,6 +18,7 @@ import { ChunkRenderer } from "../renders/chunkRender"; import { BlockType } from "@craft/rust-world"; import { PlayerRenderer } from "../renders/playerRender"; import { SphereRenderer } from "../renders/sphereRender"; +import { GameDiff, GameWrapper } from "@craft/engine/modules"; type Config = { renderDistance: number; @@ -37,7 +38,7 @@ export class CanvasGameScript extends GameScript { private renderers: Renderer[] = []; private entityRenderers: Map = new Map(); - private chunkRenderers: Map = new Map(); + private chunkRenderers: Map = new Map(); shouldRenderMainPlayer = false; isSpectating = false; @@ -49,7 +50,7 @@ export class CanvasGameScript extends GameScript { mainPlayer: Player; constructor( - game: Game, + game: GameWrapper, private webGlGScript: WebGlGScript, private basic: BasicGScript ) { @@ -81,6 +82,17 @@ export class CanvasGameScript extends GameScript { : new EntityCamera(this.mainPlayer); } + onDiff(diff: GameDiff) { + for (const entityId of diff.updated_entities) { + const entity = this.game.entities.get(entityId); + this.onNewEntity(entity); + } + + for (const chunkId of diff.updated_chunks) { + this.onChunkUpdate(chunkId); + } + } + getFilter(camera: Camera): Vector3D | null { const shiftedDown = camera.pos.sub(new Vector3D([0, 0.5, 0])); const block = this.game.world.getBlockFromWorldPoint(shiftedDown); @@ -273,15 +285,10 @@ export class CanvasGameScript extends GameScript { this.entityRenderers.delete(entity.uid); } - onChunkUpdate(chunkId: string): void { + onChunkUpdate(chunkId: number): void { console.log("CanvasGameScript: Chunk update", chunkId); - const chunkPos = World.chunkIdToChunkPos(chunkId); - const chunkMesh = this.game.world.getChunkMesh(chunkPos); - const chunkRenderer = new ChunkRenderer( - this.webGlGScript, - chunkMesh, - chunkPos - ); + const chunkMesh = this.game.getChunkMeshFromChunkId(chunkId); + const chunkRenderer = new ChunkRenderer(this.webGlGScript, chunkMesh); chunkRenderer.getBufferData(); this.chunkRenderers.set(chunkId, chunkRenderer); } diff --git a/apps/web-client/src/renders/chunkRender.ts b/apps/web-client/src/renders/chunkRender.ts index f5993e9..3661c7e 100644 --- a/apps/web-client/src/renders/chunkRender.ts +++ b/apps/web-client/src/renders/chunkRender.ts @@ -4,7 +4,6 @@ import { arraySub, getBlockData, IDim, - ChunkMesh, Vector3D, Vector2D, } from "@craft/engine"; @@ -12,16 +11,16 @@ import TextureMapper from "../textureMapper"; import { BlockShape, BlockType } from "@craft/rust-world"; import ShapeBuilder from "../services/shape-builder"; import { WebGlGScript } from "../game-scripts/webgl-gscript"; +import { ChunkMesh } from "@craft/engine/modules"; export class ChunkRenderer extends Renderer { private otherRenders: Renderer[] = []; + public position: Vector2D; - constructor( - public webGlGScript: WebGlGScript, - public chunkMesh: ChunkMesh, - public position: Vector2D - ) { + constructor(public webGlGScript: WebGlGScript, public chunkMesh: ChunkMesh) { super(webGlGScript); + + this.position = new Vector2D([chunkMesh.chunkPos.x, chunkMesh.chunkPos.y]); this.setActiveTexture(webGlGScript.textureAtlas); this.getBufferData(); } diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts new file mode 100644 index 0000000..a1e07df --- /dev/null +++ b/apps/web-client/src/runner.ts @@ -0,0 +1,12 @@ +import { GameWrapper } from "@craft/engine/modules"; +import { CanvasGameScript } from "./game-scripts/canvas-gscript"; + +function run() { + // Start the game + + const game = GameWrapper.createGame(); + + const canvasGameScript = new CanvasGameScript(game); + + game.makeGameScript(canvasGameScript); +} diff --git a/lib/engine/entities/cube.ts b/lib/engine/entities/cube.ts index aabcbec..926ac70 100644 --- a/lib/engine/entities/cube.ts +++ b/lib/engine/entities/cube.ts @@ -9,11 +9,6 @@ export type CubeDto = { pos: IDim; }; -export type Cube = { - type: BlockType; - pos: Vector3D; -}; - export type ISerializedCube = { block_type: BlockType; extra_data: "None"; diff --git a/lib/engine/entities/player/playerActions.ts b/lib/engine/entities/player/playerActions.ts index 588b7ef..f9effc7 100644 --- a/lib/engine/entities/player/playerActions.ts +++ b/lib/engine/entities/player/playerActions.ts @@ -6,7 +6,7 @@ import { Game, IDim, Vector3D } from "../../index.js"; import { MessageDto, MessageHolder } from "../../messageHelpers.js"; import CubeHelpers from "../cube.js"; import { Player } from "./player.js"; -import { PlayerAction } from "../../modules.js"; +import { GameWrapper, PlayerAction } from "../../modules.js"; export enum PlayerActionType { Jump = "jump", @@ -81,7 +81,7 @@ export type PlayerActionDto = MessageDto; // } export class PlayerActionService { - constructor(private game: Game) {} + constructor(private game: GameWrapper) {} private playerActions = new Map< string, diff --git a/lib/engine/game-script.ts b/lib/engine/game-script.ts index 1a003af..4129548 100644 --- a/lib/engine/game-script.ts +++ b/lib/engine/game-script.ts @@ -12,7 +12,7 @@ export abstract class GameScript< config?: Config; - constructor(protected game: Game, ..._args: unknown[]) {} + constructor(protected game: GameWrapper, ..._args: unknown[]) {} setConfig?(config: Config): void; @@ -29,5 +29,5 @@ export abstract class GameScript< onRemovedEntity?(entity: Entity): void; - onChunkUpdate?(chunkId: string): void; + onChunkUpdate?(chunkId: number): void; } diff --git a/lib/engine/modules.ts b/lib/engine/modules.ts index 036024b..2f49166 100644 --- a/lib/engine/modules.ts +++ b/lib/engine/modules.ts @@ -1,14 +1,7 @@ import * as WorldWasm from "@craft/rust-world"; import * as TerrainGenWasm from "@craft/terrain-gen"; -import { Vector2D } from "./utils/vector.js"; -import { - GameAction, - IChunkReader, - ISerializedChunk, - ISerializedWorld, - SandboxGScript, - World, -} from "./index.js"; +import { Vector2D, Vector3D } from "./utils/vector.js"; +import { World } from "./index.js"; export * as WorldModuleTypes from "@craft/rust-world"; async function loadWasmModule(module: any, name = "") { @@ -17,27 +10,107 @@ async function loadWasmModule(module: any, name = "") { console.log(`Loaded Wasm Module: ${name} 🎉`); return loadedModule; } +export interface ISerializedChunk { + position: { + x: number; + y: number; + }; + blocks: WorldWasm.BlockType[]; + block_data: ("None" | { Image: string })[]; +} + +type ISerializedChunkHolder = ISerializedChunk[]; + +export interface ISerializedWorld { + chunks: ISerializedChunkHolder; +} + +export type SerializedGame = { + world: ISerializedWorld; + players: Player[]; +}; + +export type PlayerAction = WorldWasm.PlayerJumpAction; + +export type GameDiff = { + updated_entities: number[]; + updated_chunks: number[]; +}; + +export type GameScript = { + onDiff: (diff: GameDiff) => void; +}; + +export type Cube = { + type: WorldWasm.BlockType; + pos: Vector3D; +}; + +export type ChunkMesh = { + mesh: Array<{ block: Cube; faces: WorldWasm.Direction[] }>; + chunkPos: { x: number; y: number }; +}; -(window as any).test = async () => { - await WorldModule.load(); - const game = WorldModule.createGame(); - const player = WorldModule.createPlayer(Number(1)); - game.addPlayer(player); +export type Player = { + speed: number; + max_speed: number; + gravity: number; + uid: number; + pos: { + x: number; + y: number; + z: number; + }; + dim: { + x: number; + y: number; + z: number; + }; + rot: { + theta: number; + phi: number; + }; + vel: { + x: number; + y: number; + z: number; + }; + is_flying: boolean; + on_ground: boolean; + moving_directions: WorldWasm.Direction[]; }; export class GameWrapper { constructor(private game: WorldWasm.Game) {} - handleAction(action: GameAction) { + static createGame(): GameWrapper { + const game = WorldWasm.Game.new_wasm(); + return new GameWrapper(game); + } + + makeJumpAction(entityId: number) { + return WorldWasm.PlayerJumpAction.make_wasm(entityId); + } + + handleAction(action: WorldWasm.EntityAction) { this.game.handle_action_wasm(action); } - addPlayer(player: WorldWasm.Player) { - this.game.add_entity_wasm(player); + makeGameScript(script: GameScript) { + return WorldWasm.WasmGameScript.make(script); + } + + addGameScript(script: WorldWasm.WasmGameScript) { + this.game.add_game_script_wasm(script); + } + + getChunkMeshFromChunkId(chunkId: number): ChunkMesh { + const big = BigInt(chunkId); + return this.game.get_chunk_mesh_from_chunk_id(big); } -} -export type PlayerAction = "Jump" | { Move: WorldWasm.Direction[] }; + handlePlayerAction(action: PlayerAction) {} +} // Wrapper class for world logic class WorldModuleClass { @@ -62,11 +135,6 @@ class WorldModuleClass { return world; } - public createGame(): GameWrapper { - const game = WorldModule.module.Game.new(); - return new GameWrapper(game); - } - public createPlayer(uid: number) { const player = WorldModule.module.Player.make(uid); return player; diff --git a/lib/engine/world/chunk.ts b/lib/engine/world/chunk.ts index a5c5c66..911c7db 100644 --- a/lib/engine/world/chunk.ts +++ b/lib/engine/world/chunk.ts @@ -7,15 +7,6 @@ export interface ILookingAtData { dist: number; } -export interface ISerializedChunk { - position: { - x: number; - y: number; - }; - blocks: BlockType[]; - block_data: ("None" | { Image: string })[]; -} - export const getChunkId = (serChunk: ISerializedChunk) => { const vec = new Vector2D([serChunk.position.x, serChunk.position.y]); return vec.toIndex(); diff --git a/lib/engine/world/chunkMesh.ts b/lib/engine/world/chunkMesh.ts deleted file mode 100644 index 110a7c5..0000000 --- a/lib/engine/world/chunkMesh.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Cube } from "../index.js"; -import { Direction } from "../utils/vector.js"; - -export class ChunkMesh { - constructor( - public mesh: Array<{ block: Cube; faces: Direction[] }>, - public chunkPos: { x: number; y: number } - ) {} -} diff --git a/lib/engine/world/world.ts b/lib/engine/world/world.ts index 210d8da..dbe8935 100644 --- a/lib/engine/world/world.ts +++ b/lib/engine/world/world.ts @@ -16,12 +16,6 @@ import { WorldModule, WorldModuleTypes } from "../modules.js"; import { ChunkMesh } from "./chunkMesh.js"; import { CameraRay } from "../index.js"; -type ISerializedChunkHolder = ISerializedChunk[]; - -export interface ISerializedWorld { - chunks: ISerializedChunkHolder; -} - export class World { static make(data?: ISerializedWorld): World { return WorldModule.createWorld(data); diff --git a/lib/world/src/chunk.rs b/lib/world/src/chunk.rs index c5e3412..4145b1a 100644 --- a/lib/world/src/chunk.rs +++ b/lib/world/src/chunk.rs @@ -20,6 +20,8 @@ interface ITextStyle { } "#; +pub type ChunkId = u64; + pub const CHUNK_WIDTH: i16 = 16; pub const CHUNK_HEIGHT: i16 = 64; @@ -72,6 +74,10 @@ impl Chunk { } } + pub fn get_id(&self) -> ChunkId { + self.position.to_id() + } + pub fn get_all_blocks(&self) -> Vec { self.blocks .iter() diff --git a/lib/world/src/chunk/chunk_mesh.rs b/lib/world/src/chunk/chunk_mesh.rs index 8d180a1..4ede490 100644 --- a/lib/world/src/chunk/chunk_mesh.rs +++ b/lib/world/src/chunk/chunk_mesh.rs @@ -3,6 +3,8 @@ use crate::{ plane::WorldPlane, positions::{ChunkPos, InnerChunkPos, WorldPos}, }; +use js_sys::wasm_bindgen; + use wasm_bindgen::prelude::*; use serde::{Deserialize, Serialize}; use std::collections::HashMap; diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index 56908c7..4bb3947 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -1,4 +1,6 @@ use std::any::Any; +use serde::{Deserialize, Serialize}; +use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; use crate::world::World; @@ -9,8 +11,29 @@ pub trait Entity: Any { fn id(&self) -> u32; } -pub trait EntityAction: Any { - fn name(&self) -> &'static str; - fn entityid(&self) -> EntityId; - fn data(&self) -> Box; + +#[wasm_bindgen] +pub struct EntityAction { + pub entity_id: EntityId, + #[wasm_bindgen(skip)] + pub name: &'static str, + #[wasm_bindgen(skip)] + pub data: Box, } + + +pub mod wasm { + use wasm_bindgen::prelude::*; + + + // #[wasm_bindgen] + // impl EntityAction { + + + + + // } + + + +} \ No newline at end of file diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 7e0f6c5..d72efac 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -1,51 +1,24 @@ use super::{ entity::{Entity, EntityAction, EntityId}, - player::{Player, WorldBlock}, + player::Player, }; -use crate::{chunk::Chunk, world::World}; +use crate::{ + chunk::{Chunk, ChunkId}, + world::{world_block::WorldBlock, World}, +}; +use serde::{Deserialize, Serialize}; use std::{any::Any, borrow::BorrowMut, collections::HashMap}; use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; pub trait GameScript { - fn update(&self, world: &World, ents: &Vec>, delta: u8) -> GameDiff; - fn on_diff(&self, diff: &GameDiff) -> (); + fn update(&self, world: &World, ents: &Vec>, delta: u8) -> GameSchedule; + fn on_diff(&self, diff: GameDiff) -> (); } -// #[wasm_bindgen] -// struct JsGameScript { -// update_jsfn: js_sys::Function, -// } -// -// impl GameScript for JsGameScript { -// fn update(&self, delta: u8) -> () { -// let val = JsValue::from(delta); -// // let res = self.update_jsfn.call1(&val); -// // print the error -// // if let Err(e) = res { -// // let err = Error::from(e); -// // }; -// } -// -// fn on_diff(&self, diff: &GameDiff) -> () { -// todo!() -// } -// } -// -// #[wasm_bindgen] -// impl JsGameScript { -// pub fn make(val: JsValue) -> JsGameScript { -// let update_fn = js_sys::Reflect::get(&val, &JsValue::from("update")).unwrap(); -// -// JsGameScript { -// update_jsfn: update_fn.into(), -// } -// } -// } - pub trait PlayerScript { fn name(&self) -> &'static str; fn update(&mut self, world: &World, player: &mut Player); - fn handle_action(&mut self, action: Box); + fn handle_action(&mut self, action: EntityAction); } type ScriptId = u32; @@ -57,10 +30,9 @@ pub struct Game { game_scripts: Vec>, player_scripts: HashMap>, player_scripts_entity_map: HashMap, - diff: GameDiff, + schedule: GameSchedule, } -// #[wasm_bindgen] impl Game { pub fn new() -> Game { Game { @@ -69,7 +41,7 @@ impl Game { game_scripts: Vec::new(), player_scripts: HashMap::new(), player_scripts_entity_map: HashMap::new(), - diff: GameDiff::empty(), + schedule: GameSchedule::empty(), } } @@ -79,14 +51,14 @@ impl Game { self.player_scripts_entity_map.insert(id, entity_id); } - pub fn handle_action(&mut self, action: Box) { + pub fn handle_action(&mut self, action: EntityAction) { for (id, script) in self.player_scripts.iter_mut() { let script_entity_id = *self .player_scripts_entity_map .get(id) .expect("Script not found"); - if action.entityid() == script_entity_id { + if action.entity_id == script_entity_id { script.handle_action(action); break; } @@ -120,27 +92,27 @@ impl Game { for gscript in &mut self.game_scripts { let diff = gscript.update(&self.world, &self.entities, 1); - self.diff.combine(diff) + self.schedule.combine(diff) } self.game_scripts.iter().for_each(|script| { - script.on_diff(&self.diff); + script.on_diff(self.schedule.to_game_diff()); }); // Apply diff to game // Add all new entities - let new_ents = std::mem::take(&mut self.diff.new_entities); + let new_ents = std::mem::take(&mut self.schedule.new_entities); self.entities.extend(new_ents); // Remove entities - for entid in self.diff.removed_entities.clone() { + for entid in self.schedule.removed_entities.clone() { self.entities.retain(|entity| entity.id() != entid); } // add chunks to world - let new_chunks = std::mem::take(&mut self.diff.new_chunks); + let new_chunks = std::mem::take(&mut self.schedule.new_chunks); for chunk in new_chunks { - self.world.insert_chunk(*chunk); + self.world.insert_chunk(chunk); } } } @@ -158,26 +130,32 @@ impl Game { self.entities.iter().find(|entity| entity.id() == id) } - pub fn schedule_chunk_insert(&mut self, chunk: Box) { - self.diff.new_chunks.push(chunk) + pub fn schedule_chunk_insert(&mut self, chunk: Chunk) { + self.schedule.new_chunks.push(chunk) } pub fn schedule_entity_insert(&mut self, entity: Box) { - self.diff.new_entities.push(entity); + self.schedule.new_entities.push(entity); } } +#[derive(Serialize, Deserialize)] pub struct GameDiff { + pub updated_entities: Vec, + pub updated_chunks: Vec, +} + +pub struct GameSchedule { pub new_entities: Vec>, pub new_blocks: Vec, - pub new_chunks: Vec>, + pub new_chunks: Vec, pub removed_entities: Vec, pub removed_blocks: Vec, } -impl GameDiff { - pub fn empty() -> GameDiff { - GameDiff { +impl GameSchedule { + pub fn empty() -> GameSchedule { + GameSchedule { new_entities: Vec::new(), new_blocks: Vec::new(), new_chunks: Vec::new(), @@ -186,7 +164,18 @@ impl GameDiff { } } - pub fn combine(&mut self, other: GameDiff) { + pub fn to_game_diff(&self) -> GameDiff { + let mut updated_entities: Vec = + self.new_entities.iter().map(|entity| entity.id()).collect(); + updated_entities.extend(self.removed_entities.iter().map(|entity_id| entity_id)); + let updated_chunks = self.new_chunks.iter().map(|chunk| chunk.get_id()).collect(); + GameDiff { + updated_entities, + updated_chunks, + } + } + + pub fn combine(&mut self, other: GameSchedule) { self.new_entities.extend(other.new_entities); self.new_blocks.extend(other.new_blocks); self.new_chunks.extend(other.new_chunks); @@ -202,7 +191,7 @@ impl GameDiff { self.new_blocks.push(block); } - pub fn add_chunk(&mut self, chunk: Box) { + pub fn add_chunk(&mut self, chunk: Chunk) { self.new_chunks.push(chunk); } @@ -229,7 +218,7 @@ mod tests { game.update(); game.add_script(1, jump_script); game.update(); - let jump_action = Box::new(PlayerJumpAction { entityid: 1 }); + let jump_action = PlayerJumpAction::new(1); game.handle_action(jump_action); game.update(); let player = game.get_entity_by_id(1).unwrap(); @@ -262,7 +251,85 @@ mod tests { // Check that chunks loaded let chunk_count = game.world.chunk_count(); - assert_eq!(chunk_count, 1); + + game.update(); + + let chunk_count = game.world.chunk_count(); + assert_eq!(chunk_count, 2); + } +} + +pub mod wasm { + use std::{cell::RefCell, rc::Rc}; + + use super::{Game, GameDiff, GameSchedule, GameScript}; + use crate::{ + chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, entities::{entity::{EntityAction, EntityId}, player::Player}, world::World + }; + use serde_wasm_bindgen::Error; + use wasm_bindgen::prelude::*; + + #[wasm_bindgen] + impl Game { + pub fn new_wasm() -> Game { + Game::new() + } + + pub fn make_player_wasm() -> Player { + Player::make(1) + } + + pub fn handle_action_wasm(&mut self, action: EntityAction) { + self.handle_action(action); + } + + pub fn schedule_chunk_insert_wasm(&mut self, chunk: Chunk) { + self.schedule_chunk_insert(chunk); + } + + pub fn add_game_script_wasm(&mut self, script: WasmGameScript) { + self.add_game_script(Box::new(script)); + } + + pub fn get_chunk_mesh_from_chunk_id(&self, chunk_id: ChunkId) -> Result { + self.world.get_chunk_mesh_wasm(chunk_id) + } + + pub fn get_player_wasm(&self, player_id: EntityId) -> Result { + let maybe_player = self.get_entity_by_id(player_id); + if let Some(player) = maybe_player { + let player_js = serde_wasm_bindgen::to_value(&player).unwrap(); + Ok(player_js) + } else { + Err(Error::new("Player not found")) + } + } + } + + #[wasm_bindgen] + pub struct WasmGameScript { + on_diff_jsfn: js_sys::Function, + } + + #[wasm_bindgen] + impl WasmGameScript { + pub fn make(val: JsValue) -> WasmGameScript { + let on_diff_jsfn = js_sys::Reflect::get(&val, &JsValue::from("on_diff")).unwrap(); + WasmGameScript { + on_diff_jsfn: on_diff_jsfn.into(), + } + } + } + + impl GameScript for WasmGameScript { + fn update(&self, world: &World, ents: &Vec>, delta: u8) -> GameSchedule { + GameSchedule::empty() + } + + fn on_diff(&self, diff: GameDiff) -> () { + let val = serde_wasm_bindgen::to_value(&diff).unwrap(); + self.on_diff_jsfn.call1(&val, &val); + } } } diff --git a/lib/world/src/entities/items.rs b/lib/world/src/entities/items.rs new file mode 100644 index 0000000..0e37741 --- /dev/null +++ b/lib/world/src/entities/items.rs @@ -0,0 +1,108 @@ +// #[derive(Serialize, Deserialize)] +// enum EntityAction { +// Jump, +// PrimaryAction, +// SecondaryAction, +// Move(Vec), +// ToggleFly, +// Rotate(SphericalRotation), +// TP(FineWorldPos), +// } +// +// +// #[repr(u8)] +// #[derive(Serialize, Deserialize)] +// pub enum GameAction { +// Entity(EntityId, EntityAction), +// } + +// trait Item { +// fn use_item(&self, ent: &impl Entity) -> GameDiff; +// } +// +// struct FireballItem { +// current_cooldown: u8, +// cooldown: u8, +// } +// +// impl Item for FireballItem { +// fn use_item(&self, ent: &impl Entity) -> GameDiff { +// let mut diff = GameDiff::empty(); +// +// if self.current_cooldown > 0 { +// return diff; +// } + +// Do math +// const vel = this.rot.toCartesianCoords().scalarMultiply(-0.4); +// vel.set(1, -vel.get(1)); +// +// const pos = this.pos +// .add(vel.scalarMultiply(2)) +// .add(new Vector3D(this.dim).scalarMultiply(0.5)); +// +// +// let fireball_entity = FireballEntity { +// pos: FineWorldPos {}, +// vel: Velocity, +// life: 100, +// }; +// +// let firebox = Box::new(fireball_entity); +// diff.new_entities.push(firebox); + +// diff +// } +// } +// +// struct BlockItem { +// block_type: BlockType, +// } +// +// impl Item for BlockItem { +// fn use_item(&self, ent: &impl Entity) -> GameDiff { +// let mut diff = GameDiff::empty(); +// Do math +// const vel = this.rot.toCartesianCoords().scalarMultiply(-0.4); +// vel.set(1, -vel.get(1)); +// +// const pos = this.pos +// .add(vel.scalarMultiply(2)) +// .add(new Vector3D(this.dim).scalarMultiply(0.5)); +// +// +// let block_entity = WorldBlock { +// pos: FineWorldPos {}, +// block_type: self.block_type, +// }; +// diff.new_blocks.push(block_entity); +// diff +// const ray = this.getRay(); +// const lookingData = game.world.lookingAt(ray); +// if (!lookingData) return; +// console.log("Looking at data", lookingData); +// const { cube } = lookingData; +// if (!cube) return; +// +// const newCubePos = lookingData.cube.pos.add( +// Vector3D.fromDirection(lookingData.face) +// ); +// +// const newCube = CubeHelpers.createCube(blockType, newCubePos); +// +// console.log("Placed Cube", newCube); +// +// game.placeBlock(newCube); +// } +// } + +// enum Item { +// Block(BlockType), +// Fireball, +// } + +// #[wasm_bindgen] +// struct Belt { +// selected_index: u8, +// items: Vec, +// } diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index b60ed47..078ea08 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -1,87 +1,13 @@ -use super::entity::{Entity, EntityAction, EntityId}; +use super::entity::{Entity, EntityId}; use crate::{ - block::{BlockData, BlockType}, - direction::Direction, - geometry::rotation::SphericalRotation, - positions::{ChunkPos, FineWorldPos, WorldPos}, - world::World, + direction::Direction, geometry::rotation::SphericalRotation, positions::FineWorldPos, + vec::Vec3, world::World, }; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::wasm_bindgen; -// #[derive(Clone, Serialize, Deserialize)] -// #[wasm_bindgen] -// struct FineWorldPos { -// x: f32, -// y: f32, -// z: f32, -// } -// impl FineWorldPos { -// pub fn to_world_pos(&self) -> WorldPos { -// WorldPos { -// x: self.x.floor() as i32, -// y: self.y.floor() as i32, -// z: self.z.floor() as i32, -// } -// } -// } -// -// #[wasm_bindgen] -// #[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)] -// struct WorldPos { -// x: i32, -// y: i32, -// z: i32, -// } -// Convert World pos to Fine World pos -// impl From for FineWorldPos { -// fn from(world_pos: WorldPos) -> Self { -// FineWorldPos { -// x: world_pos.x as f32, -// y: world_pos.y as f32, -// z: world_pos.z as f32, -// } -// } -// } -// -// impl From for WorldPos { -// fn from(fine_pos: FineWorldPos) -> Self { -// WorldPos { -// x: fine_pos.x.floor() as i32, -// y: fine_pos.y.floor() as i32, -// z: fine_pos.z.floor() as i32, -// } -// } -// } -// -// impl From for ChunkPos { -// fn from(world_pos: WorldPos) -> Self { -// let x = if world_pos.x < 0 { -// ((world_pos.x + 1) / CHUNK_WIDTH as i32) - 1 -// } else { -// world_pos.x / CHUNK_WIDTH as i32 -// }; -// -// let y = if world_pos.z < 0 { -// ((world_pos.z + 1) / CHUNK_WIDTH as i32) - 1 -// } else { -// world_pos.z / CHUNK_WIDTH as i32 -// }; -// -// ChunkPos { -// x: x as i16, -// y: y as i16, -// } -// } -// } - -#[wasm_bindgen] -#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Copy)] -pub struct Velocity { - pub x: f32, - pub y: f32, - pub z: f32, -} +pub type Velocity = Vec3; +pub type Size3 = Vec3; impl Velocity { pub fn zero() -> Velocity { @@ -93,44 +19,8 @@ impl Velocity { } } -impl std::ops::Add for Velocity { - type Output = Velocity; - - fn add(self, other: Velocity) -> Velocity { - Velocity { - x: self.x + other.x, - y: self.y + other.y, - z: self.z + other.z, - } - } -} - -#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)] -// #[wasm_bindgen] -pub struct WorldBlock { - pub block_type: BlockType, - // #[wasm_bindgen(skip)] - pub extra_data: BlockData, - pub world_pos: WorldPos, -} - -// convert spherical rot into Velocity -impl From for Velocity { - fn from(rot: SphericalRotation) -> Self { - let x = rot.theta.sin() * rot.phi.cos(); - let y = rot.phi.sin(); - let z = rot.theta.cos() * rot.phi.cos(); - Velocity { x, y, z } - } -} - -struct Size3 { - x: f32, - y: f32, - z: f32, -} - -// #[wasm_bindgen] +#[derive(Serialize, Deserialize)] +#[wasm_bindgen] pub struct Player { // config speed: f32, @@ -139,9 +29,13 @@ pub struct Player { uid: EntityId, + #[wasm_bindgen(skip)] pub pos: FineWorldPos, dim: Size3, + + rot: SphericalRotation, + #[wasm_bindgen(skip)] pub vel: Velocity, pub is_flying: bool, @@ -149,7 +43,15 @@ pub struct Player { moving_directions: Vec, } -// #[wasm_bindgen] +impl Entity for Player { + fn update(&mut self, world: &World) {} + + fn id(&self) -> u32 { + self.uid + } +} + +#[wasm_bindgen] impl Player { pub fn make(uid: EntityId) -> Player { Player { @@ -175,172 +77,3 @@ impl Player { } } } - -// #[derive(Serialize, Deserialize)] -// enum EntityAction { -// Jump, -// PrimaryAction, -// SecondaryAction, -// Move(Vec), -// ToggleFly, -// Rotate(SphericalRotation), -// TP(FineWorldPos), -// } -// -// -// #[repr(u8)] -// #[derive(Serialize, Deserialize)] -// pub enum GameAction { -// Entity(EntityId, EntityAction), -// } - -// trait Item { -// fn use_item(&self, ent: &impl Entity) -> GameDiff; -// } -// -// struct FireballItem { -// current_cooldown: u8, -// cooldown: u8, -// } -// -// impl Item for FireballItem { -// fn use_item(&self, ent: &impl Entity) -> GameDiff { -// let mut diff = GameDiff::empty(); -// -// if self.current_cooldown > 0 { -// return diff; -// } - -// Do math -// const vel = this.rot.toCartesianCoords().scalarMultiply(-0.4); -// vel.set(1, -vel.get(1)); -// -// const pos = this.pos -// .add(vel.scalarMultiply(2)) -// .add(new Vector3D(this.dim).scalarMultiply(0.5)); -// -// -// let fireball_entity = FireballEntity { -// pos: FineWorldPos {}, -// vel: Velocity, -// life: 100, -// }; -// -// let firebox = Box::new(fireball_entity); -// diff.new_entities.push(firebox); - -// diff -// } -// } -// -// struct BlockItem { -// block_type: BlockType, -// } -// -// impl Item for BlockItem { -// fn use_item(&self, ent: &impl Entity) -> GameDiff { -// let mut diff = GameDiff::empty(); -// Do math -// const vel = this.rot.toCartesianCoords().scalarMultiply(-0.4); -// vel.set(1, -vel.get(1)); -// -// const pos = this.pos -// .add(vel.scalarMultiply(2)) -// .add(new Vector3D(this.dim).scalarMultiply(0.5)); -// -// -// let block_entity = WorldBlock { -// pos: FineWorldPos {}, -// block_type: self.block_type, -// }; -// diff.new_blocks.push(block_entity); -// diff -// const ray = this.getRay(); -// const lookingData = game.world.lookingAt(ray); -// if (!lookingData) return; -// console.log("Looking at data", lookingData); -// const { cube } = lookingData; -// if (!cube) return; -// -// const newCubePos = lookingData.cube.pos.add( -// Vector3D.fromDirection(lookingData.face) -// ); -// -// const newCube = CubeHelpers.createCube(blockType, newCubePos); -// -// console.log("Placed Cube", newCube); -// -// game.placeBlock(newCube); -// } -// } - -// enum Item { -// Block(BlockType), -// Fireball, -// } - -// #[wasm_bindgen] -// struct Belt { -// selected_index: u8, -// items: Vec, -// } - -struct PlayerGravityScript { - player: Player, -} - -impl PlayerGravityScript { - pub fn gravity_force(&self) -> Option { - if self.player.is_flying { - return None; - } - - if self.player.on_ground { - return None; - } - - Some(Velocity { - x: 0.0, - y: self.player.gravity, - z: 0.0, - }) - } - - fn update(&mut self, world: &World) { - let gravity_force = self.gravity_force(); - if let Some(gravity_force) = gravity_force { - self.player.vel = gravity_force + self.player.vel; - } - - // loop through scripts and update - } -} - -impl Player { - fn move_in_direction(&mut self, directions: Vec) { - self.moving_directions = directions; - } -} - -impl Player { - pub fn god_force(&self) -> Velocity { - // add the current players roation to the direction - let mut new_rot = self.rot; - - let dirs = self.moving_directions.clone(); - - new_rot = dirs - .into_iter() - .fold(new_rot, |acc, direction| acc + direction.into()); - - new_rot.into() - } -} - -impl Entity for Player { - fn update(&mut self, world: &World) {} - - fn id(&self) -> u32 { - self.uid - } -} diff --git a/lib/world/src/entities/player_gravity_script.rs b/lib/world/src/entities/player_gravity_script.rs new file mode 100644 index 0000000..fe45070 --- /dev/null +++ b/lib/world/src/entities/player_gravity_script.rs @@ -0,0 +1,30 @@ +struct PlayerGravityScript { + player: Player, +} + +impl PlayerGravityScript { + pub fn gravity_force(&self) -> Option { + if self.player.is_flying { + return None; + } + + if self.player.on_ground { + return None; + } + + Some(Velocity { + x: 0.0, + y: self.player.gravity, + z: 0.0, + }) + } + + fn update(&mut self, world: &World) { + let gravity_force = self.gravity_force(); + if let Some(gravity_force) = gravity_force { + self.player.vel = gravity_force + self.player.vel; + } + + // loop through scripts and update + } +} diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/entities/player_jump_script.rs index 4da7c1d..8a717cc 100644 --- a/lib/world/src/entities/player_jump_script.rs +++ b/lib/world/src/entities/player_jump_script.rs @@ -1,28 +1,28 @@ use super::{ - entity::{EntityAction, EntityId}, + entity::{self, EntityAction, EntityId}, game::PlayerScript, player::{Player, Velocity}, }; use crate::world::World; -use std::any::Any; +use wasm_bindgen::prelude::wasm_bindgen; +#[wasm_bindgen] pub struct PlayerJumpAction { pub entityid: EntityId, } -impl EntityAction for PlayerJumpAction { - fn name(&self) -> &'static str { - "Jump-Action" - } - - fn entityid(&self) -> EntityId { - self.entityid - } - fn data(&self) -> Box { - Box::new(()) +impl PlayerJumpAction { + pub fn new(entity_id: EntityId) -> EntityAction { + EntityAction { + entity_id: entity_id, + name: "Jump-Action", + data: Box::new(()), + } } } + +#[wasm_bindgen] pub struct PlayerJumpScript { jump_speed: f32, is_jumping: bool, @@ -77,11 +77,29 @@ impl PlayerScript for PlayerJumpScript { println!("Player velocity: {:?}", player.vel); } - fn handle_action(&mut self, action: Box) { + fn handle_action(&mut self, action: EntityAction) { println!("Handling action"); - if action.name() == "Jump-Action" { + if action.name == "Jump-Action" { self.jump(); } } } + + +pub mod wasm { + use wasm_bindgen::prelude::*; + use crate::entities::entity::{EntityAction, EntityId}; + use super::{PlayerJumpAction, PlayerJumpScript}; + + #[wasm_bindgen] + impl PlayerJumpAction { + // make jump action + pub fn make_wasm(entity_id: EntityId) -> EntityAction { + PlayerJumpAction::new(entity_id) + } + + + } + +} \ No newline at end of file diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs new file mode 100644 index 0000000..dfcc5e3 --- /dev/null +++ b/lib/world/src/entities/player_move_script.rs @@ -0,0 +1,20 @@ +impl Player { + fn move_in_direction(&mut self, directions: Vec) { + self.moving_directions = directions; + } +} + +impl Player { + pub fn god_force(&self) -> Velocity { + // add the current players roation to the direction + let mut new_rot = self.rot; + + let dirs = self.moving_directions.clone(); + + new_rot = dirs + .into_iter() + .fold(new_rot, |acc, direction| acc + direction.into()); + + new_rot.into() + } +} diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index 46048da..4e6fd43 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -1,5 +1,5 @@ use super::{ - game::{Game, GameDiff, GameScript}, + game::{Game, GameDiff, GameSchedule, GameScript}, player::Player, terrain_gen::TerrainGenerator, }; @@ -48,7 +48,7 @@ impl SandBoxGScript { poses } - fn load_chunks_around_player(&self, players: &Vec>, world: &World) -> GameDiff { + fn load_chunks_around_player(&self, players: &Vec>, world: &World) -> GameSchedule { let nearby_unloaded_chunks: Vec = players .iter() .flat_map(|p| self.get_chunks_around_player(p)) @@ -58,11 +58,11 @@ impl SandBoxGScript { // only load the first chunk let chunk_pos = nearby_unloaded_chunks.first(); - let mut gdiff = GameDiff::empty(); + let mut gdiff = GameSchedule::empty(); if let Some(chunk_pos) = chunk_pos { let chunk = self.terrain_gen.get_chunk(chunk_pos.x, chunk_pos.y); - gdiff.add_chunk(Box::new(chunk)); + gdiff.add_chunk(chunk); } gdiff @@ -70,11 +70,11 @@ impl SandBoxGScript { } impl GameScript for SandBoxGScript { - fn update(&self, world: &World, ents: &Vec>, _delta: u8) -> GameDiff { + fn update(&self, world: &World, ents: &Vec>, _delta: u8) -> GameSchedule { self.load_chunks_around_player(ents, world) } - fn on_diff(&self, _diff: &GameDiff) -> () { + fn on_diff(&self, _diff: GameDiff) -> () { // on diff } } diff --git a/lib/world/src/geometry/rotation.rs b/lib/world/src/geometry/rotation.rs index 627fffe..d7b9914 100644 --- a/lib/world/src/geometry/rotation.rs +++ b/lib/world/src/geometry/rotation.rs @@ -1,4 +1,4 @@ -use crate::vec::Vec3; +use crate::{entities::player::Velocity, vec::Vec3}; use serde::{Deserialize, Serialize}; use std::{f32::consts::PI, ops::Add}; @@ -50,7 +50,7 @@ impl Into> for SphericalRotation { /** * Converts a spherical rotation into a unit vector. */ - fn into(self) -> Vec3 { + fn into(self) -> Velocity { let phi_offset = (PI / 2.0) - self.phi; let theta_offset = self.theta + (PI / 2.0); diff --git a/lib/world/src/positions.rs b/lib/world/src/positions.rs index 56d4a7f..560274c 100644 --- a/lib/world/src/positions.rs +++ b/lib/world/src/positions.rs @@ -1,5 +1,5 @@ use crate::{ - chunk::CHUNK_WIDTH, + chunk::{ChunkId, CHUNK_WIDTH}, vec::{Vec2, Vec3}, }; @@ -75,18 +75,44 @@ impl ChunkPos { } pub fn to_id(&self) -> u64 { - let mut x: u64 = 2 * (self.x.abs() as u64); - let mut y: u64 = 2 * (self.y.abs() as u64); - if self.x < 0 { - x += 1 - } - if self.y < 0 { - y += 1 - } - let id = ((x + y) * (x + y + 1) / 2) + y; + let a = if self.x >= 0 { + (2 * self.x as i64) as u64 + } else { + (-2 * self.x as i64 - 1) as u64 + }; + + let b = if self.y >= 0 { + (2 * self.y as i64) as u64 + } else { + (-2 * self.y as i64 - 1) as u64 + }; + + ((a + b) * (a + b + 1)) / 2 + a + } - id + pub fn from_id(z: u64) -> ChunkPos { + let w = (((8 * z + 1) as f64).sqrt() - 1.0) / 2.0; + let w = w.floor() as u64; + let t = (w * w + w) / 2; + let a = (z - t) as i32; + let b = (w as i32) - a; + + let x = if a % 2 == 0 { + (a / 2) as i16 + } else { + (-(a + 1) / 2) as i16 + }; + + let y = if b % 2 == 0 { + (b / 2) as i16 + } else { + (-(b + 1) / 2) as i16 + }; + + ChunkPos { x, y } } + + } impl std::ops::Add for ChunkPos { diff --git a/lib/world/src/vec.rs b/lib/world/src/vec.rs index 283acba..a2ab7ea 100644 --- a/lib/world/src/vec.rs +++ b/lib/world/src/vec.rs @@ -41,7 +41,7 @@ where } } -impl + Clone + Copy> Vec2 { +impl + Clone + Copy + PartialOrd + Into> Vec2 { pub fn new(x: T, y: T) -> Vec2 { Vec2 { x, y } } @@ -114,7 +114,7 @@ impl + Clone + Copy> Vec2 { let diff_squared = diff * diff; let sum = diff_squared.sum(); // take the sqrt of sum - let sum_f32: f32 = sum.into(); + let sum_f32: f32 = sum.into() as f32; sum_f32.sqrt() } @@ -134,6 +134,7 @@ impl + Clone + Copy> Vec2 { } #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[repr(C)] pub struct Vec3 { pub x: T, pub y: T, diff --git a/lib/world/src/world/world_duct.rs b/lib/world/src/world/world_duct.rs index 3cbd1fd..34db268 100644 --- a/lib/world/src/world/world_duct.rs +++ b/lib/world/src/world/world_duct.rs @@ -1,6 +1,6 @@ use super::World; use crate::{ - chunk::Chunk, + chunk::{Chunk, ChunkId}, direction::Directions, geometry::ray::Ray, world::{world_block::WorldBlock, ChunkPos, WorldPos}, @@ -68,11 +68,12 @@ impl World { }) } - pub fn get_chunk_mesh_wasm(&self, val: JsValue) -> Result { - from_value(val).and_then(|pos: ChunkPos| { - let mesh = self.get_chunk_mesh(&pos).map_err(Self::convert_error)?; + pub fn get_chunk_mesh_wasm(&self, chunk_id: ChunkId) -> Result { + let chunk_pos = ChunkPos::from_id(chunk_id); + + let mesh = self.get_chunk_mesh(&chunk_pos).map_err(Self::convert_error)?; - let wasm_chunk_mesh = mesh + let wasm_chunk_mesh = mesh .into_iter() .map(|(world_pos, directions)| { let block = self.get_block(&world_pos); @@ -80,8 +81,7 @@ impl World { }) .collect::>(); - to_value(&wasm_chunk_mesh) - }) + to_value(&wasm_chunk_mesh) } pub fn is_block_loaded_wasm(&self, val: JsValue) -> Result { From 6f9505b757356cbeedd6b4a06d13a87f80e92620 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 11 Aug 2024 14:10:34 -0700 Subject: [PATCH 05/61] Add getting player script and actions from js --- apps/web-client/src/app.ts | 7 +- .../playerControllers/mobileController.ts | 22 ++- .../src/game-scripts/basic-gscript.ts | 2 +- .../src/game-scripts/canvas-gscript.ts | 9 +- .../src/game-scripts/webgl-gscript.ts | 12 +- apps/web-client/src/runner.ts | 33 +++- lib/engine/entities/player/playerActions.ts | 42 ++--- lib/engine/modules.ts | 166 ++++++++++-------- lib/world/src/entities/game.rs | 60 ++++++- lib/world/src/entities/mod.rs | 1 + lib/world/src/entities/player.rs | 19 +- lib/world/src/entities/player_jump_script.rs | 8 +- lib/world/src/entities/player_rot_script.rs | 58 ++++++ lib/world/src/entities/script_map.rs | 2 + lib/world/src/geometry/rotation.rs | 2 + 15 files changed, 295 insertions(+), 148 deletions(-) create mode 100644 lib/world/src/entities/player_rot_script.rs create mode 100644 lib/world/src/entities/script_map.rs diff --git a/apps/web-client/src/app.ts b/apps/web-client/src/app.ts index cbbd546..40bb081 100644 --- a/apps/web-client/src/app.ts +++ b/apps/web-client/src/app.ts @@ -48,13 +48,14 @@ function getElementByIdOrThrow(id: string): HTMLElement { // generate your unique id // kind of bad to do this client side, but I can make it better later -const UID_KEY = "tylercraft-uid"; +const UID_KEY = "tylercraft-user-id"; if (!localStorage.getItem(UID_KEY)) { - localStorage.setItem(UID_KEY, Math.random() + ""); + const randomNum = Math.floor(Math.random() * 10000000); + localStorage.setItem(UID_KEY, randomNum.toString()); } export function getMyUid() { - const uid = localStorage.getItem(UID_KEY); + const uid = Number(localStorage.getItem(UID_KEY)); if (!uid) throw new Error("UID not defined"); return uid; } diff --git a/apps/web-client/src/controllers/playerControllers/mobileController.ts b/apps/web-client/src/controllers/playerControllers/mobileController.ts index d95e28b..4203e34 100644 --- a/apps/web-client/src/controllers/playerControllers/mobileController.ts +++ b/apps/web-client/src/controllers/playerControllers/mobileController.ts @@ -1,29 +1,27 @@ import { MetaAction, Vector2D, - Player, - Game, PlayerController, PlayerActionService, } from "@craft/engine"; -import { CanvasGameScript } from "../../game-scripts/canvas-gscript"; +import { GameWrapper } from "@craft/engine/modules"; +import { getEleOrError } from "../../utils"; export class MobileController extends PlayerController { - private eForwardButton = document.getElementById("forwardButton")!; - private eJumpButton = document.getElementById("jumpButton")!; + private eForwardButton = getEleOrError("forwardButton"); + private eJumpButton = getEleOrError("jumpButton"); private eToolbeltItems = Array.from( document.querySelectorAll(".toolbelt-item") ); - private eUseItemButton = document.getElementById("useItemButton")!; - private eUseItemButton2 = document.getElementById("useItemButton2")!; + private eUseItemButton = getEleOrError("useItemButton"); + private eUseItemButton2 = getEleOrError("useItemButton2"); constructor( playerActionService: PlayerActionService, - game: Game, - player: Player + game: GameWrapper, + playerId: number ) { - super(playerActionService, game, player); - const canvasGScript = this.game.getGameScript(CanvasGameScript); + super(playerActionService, game, playerId); let lastWindowTouch: Touch; const lastTouchStartPos = new Vector2D([0, 0]); @@ -58,7 +56,7 @@ export class MobileController extends PlayerController { lastTouchStartPos.data = [touch.clientX, touch.clientY]; - canvasGScript.camera.rotateBy(-dx, -dy); + this.rotate(-dx, -dy); }, { passive: false } ); diff --git a/apps/web-client/src/game-scripts/basic-gscript.ts b/apps/web-client/src/game-scripts/basic-gscript.ts index 6ca977d..f2b62b4 100644 --- a/apps/web-client/src/game-scripts/basic-gscript.ts +++ b/apps/web-client/src/game-scripts/basic-gscript.ts @@ -46,7 +46,7 @@ export class BasicGScript extends GameScript { console.log("Starting basic usecase"); console.log("My UID", getMyUid()); - const player = WorldModule.createPlayer(Number(getMyUid())); + const player = g.createPlayer(Number(getMyUid())); this.mainPlayer = player; game.addPlayer(player); diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index 53e92e1..8150687 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -11,7 +11,6 @@ import { import { XrCamera } from "../cameras/xrCamera"; import { EntityCamera } from "../cameras/entityCamera"; import { GameScript } from "@craft/engine/game-script"; -import { BasicGScript } from "./basic-gscript"; import { WebGlGScript } from "./webgl-gscript"; import { Renderer } from "../renders/renderer"; import { ChunkRenderer } from "../renders/chunkRender"; @@ -47,12 +46,10 @@ export class CanvasGameScript extends GameScript { totTime = 0; pastDeltas: number[] = []; - mainPlayer: Player; - constructor( game: GameWrapper, private webGlGScript: WebGlGScript, - private basic: BasicGScript + private mainPlayerId: number ) { super(game); @@ -62,10 +59,6 @@ export class CanvasGameScript extends GameScript { this.handleKeyDown(e.key); }); - this.mainPlayer = this.basic.mainPlayer; - - console.log("Main player", this.mainPlayer); - // Create renderers for initial entities for (const entity of game.entities.iterable()) { this.onNewEntity(entity); diff --git a/apps/web-client/src/game-scripts/webgl-gscript.ts b/apps/web-client/src/game-scripts/webgl-gscript.ts index bd3308c..c2286e0 100644 --- a/apps/web-client/src/game-scripts/webgl-gscript.ts +++ b/apps/web-client/src/game-scripts/webgl-gscript.ts @@ -1,4 +1,4 @@ -import { Game, Vector3D } from "@craft/engine"; +import { Vector3D } from "@craft/engine"; import type { Navigator, XRSession, @@ -10,6 +10,7 @@ import { mat4 } from "gl-matrix"; import VertexShader from "../../shaders/vertex.glsl?raw"; import FragmentShader from "../../shaders/fragment.glsl?raw"; import { GameScript } from "@craft/engine/game-script"; +import { GameWrapper } from "@craft/engine/modules"; const WebGlLayer = (window as any).XRWebGLLayer as typeof XRWebGLLayer; @@ -41,17 +42,12 @@ export class WebGlGScript extends GameScript { public config = { transparency: true, - glFov: 0, + glFov: (45 * Math.PI) / 180, }; - constructor(game: Game) { + constructor(game: GameWrapper) { super(game); - this.config = { - transparency: game.config.transparency, - glFov: game.config.glFov, - }; - // init gl eCanvas const gl = this.eCanvas.getContext("webgl2", { // premultipliedAlpha: false, diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index a1e07df..ce72428 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -1,12 +1,41 @@ import { GameWrapper } from "@craft/engine/modules"; import { CanvasGameScript } from "./game-scripts/canvas-gscript"; +import { getMyUid, IS_MOBILE } from "./app"; +import { WebGlGScript } from "./game-scripts/webgl-gscript"; +import { MobileController } from "./controllers/playerControllers/mobileController"; +import { KeyboardPlayerEntityController } from "./controllers/playerControllers/keyboardPlayerController"; +import { PlayerActionService } from "@craft/engine"; function run() { // Start the game - const game = GameWrapper.createGame(); + const game = GameWrapper.makeGame(); - const canvasGameScript = new CanvasGameScript(game); + const main_player_uid = getMyUid(); + + game.makeAndAddPlayer(main_player_uid); + + const playerActionService = new PlayerActionService(game); + + const playerController = () => { + if (IS_MOBILE) { + return new MobileController(playerActionService, game, main_player_uid); + } else { + return new KeyboardPlayerEntityController( + playerActionService, + game, + main_player_uid + ); + } + }; + + const webglGameScript = new WebGlGScript(game); + + const canvasGameScript = new CanvasGameScript( + game, + webglGameScript, + main_player_uid + ); game.makeGameScript(canvasGameScript); } diff --git a/lib/engine/entities/player/playerActions.ts b/lib/engine/entities/player/playerActions.ts index f9effc7..c8980fd 100644 --- a/lib/engine/entities/player/playerActions.ts +++ b/lib/engine/entities/player/playerActions.ts @@ -6,7 +6,7 @@ import { Game, IDim, Vector3D } from "../../index.js"; import { MessageDto, MessageHolder } from "../../messageHelpers.js"; import CubeHelpers from "../cube.js"; import { Player } from "./player.js"; -import { GameWrapper, PlayerAction } from "../../modules.js"; +import { EntityAction, GameWrapper, PlayerAction } from "../../modules.js"; export enum PlayerActionType { Jump = "jump", @@ -84,13 +84,13 @@ export class PlayerActionService { constructor(private game: GameWrapper) {} private playerActions = new Map< - string, - Array<(action: PlayerAction) => void> + number, + Array<(action: EntityAction) => void> >(); addActionListener( - playerId: string, - listener: (action: PlayerAction) => void + playerId: number, + listener: (action: EntityAction) => void ) { this.playerActions.set(playerId, [ ...(this.playerActions.get(playerId) || []), @@ -98,23 +98,10 @@ export class PlayerActionService { ]); } - performAction(action: PlayerAction) { - const playerId = action.data.playerUid; - const player = this.game.entities.tryGet(playerId); + performAction(action: EntityAction) { + this.game.handleAction(action); - if (!player) { - console.log("Player not found", playerId); - return; - } - - if (!(player instanceof Player)) { - console.log("Entity is not a player", player); - return; - } - - handlePlayerAction(this.game, player, action); - - const listeners = this.playerActions.get(playerId); + const listeners = this.playerActions.get(action.entity_id); if (!listeners) { return; } @@ -127,13 +114,18 @@ export class PlayerActionService { export abstract class PlayerController { constructor( - protected onAction: (action: PlayerAction) => void, - protected game: Game, - protected player: Player + protected playerActionService: PlayerActionService, + protected game: GameWrapper, + protected playerId: number ) {} jump() { - this.onAction("Jump"); + const action = this.game.makeJumpAction(this.playerId); + this.playerActionService.performAction(action); + } + + rotate(x: number, y: number) { + // TO-DO } move(directions: Direction[]) { diff --git a/lib/engine/modules.ts b/lib/engine/modules.ts index 2f49166..9ca263e 100644 --- a/lib/engine/modules.ts +++ b/lib/engine/modules.ts @@ -1,7 +1,5 @@ import * as WorldWasm from "@craft/rust-world"; -import * as TerrainGenWasm from "@craft/terrain-gen"; -import { Vector2D, Vector3D } from "./utils/vector.js"; -import { World } from "./index.js"; +import { Vector3D } from "./utils/vector.js"; export * as WorldModuleTypes from "@craft/rust-world"; async function loadWasmModule(module: any, name = "") { @@ -32,6 +30,8 @@ export type SerializedGame = { export type PlayerAction = WorldWasm.PlayerJumpAction; +export type EntityAction = WorldWasm.EntityAction; + export type GameDiff = { updated_entities: number[]; updated_chunks: number[]; @@ -83,11 +83,15 @@ export type Player = { export class GameWrapper { constructor(private game: WorldWasm.Game) {} - static createGame(): GameWrapper { + static makeGame(): GameWrapper { const game = WorldWasm.Game.new_wasm(); return new GameWrapper(game); } + makeAndAddPlayer(uid: number) { + this.game.make_and_add_player_wasm(uid); + } + makeJumpAction(entityId: number) { return WorldWasm.PlayerJumpAction.make_wasm(entityId); } @@ -109,82 +113,88 @@ export class GameWrapper { return this.game.get_chunk_mesh_from_chunk_id(big); } - handlePlayerAction(action: PlayerAction) {} -} - -// Wrapper class for world logic -class WorldModuleClass { - private _module: typeof WorldWasm | null = null; - - private get module() { - if (!this._module) { - throw new Error("Module not loaded"); - } - return this._module; - } - - async load(): Promise { - if (this._module) return; - this._module = await loadWasmModule(WorldWasm, "World"); - } - - public createWorld(data?: ISerializedWorld) { - console.log("Creating wasm world"); - const wasmWorld = WorldModule.module.World.new_wasm(); - const world = new World(wasmWorld, data); - return world; - } - - public createPlayer(uid: number) { - const player = WorldModule.module.Player.make(uid); - return player; - } -} - -export const WorldModule = new WorldModuleClass(); - -class TerrainGenModuleClass { - private _module: typeof TerrainGenWasm | null = null; - - private get module() { - if (!this._module) { - throw new Error("Terrain gen module not loaded"); - } - return this._module; + addPlayer(player: WorldWasm.Player) { + this.game.add_player_wasm(player); } - public async load(): Promise { - if (this._module) return; - this._module = await loadWasmModule(TerrainGenWasm, "TerrainGen"); - } - - getParkorTerrainGenerator(seed: number) { - const terrainGenerator = this.module.ParkorChunkGetter.new(); - - return { - getChunk: (chunkPos: Vector2D) => { - console.log("Generating Chunk", chunkPos); - const chunk = terrainGenerator - .get_chunk_wasm(chunkPos.get(0), chunkPos.get(1)) - .serialize(); - return chunk as unknown as ISerializedChunk; - }, - }; - } - - getTerrainGenerator(seed: number, flatWorld: boolean) { - const terrainGenerator = new this.module.TerrainGenerator(seed, flatWorld); - - return { - getChunk: (chunkPos: Vector2D) => { - console.log("Generating Chunk", chunkPos); - const chunk = terrainGenerator - .get_chunk(chunkPos.get(0), chunkPos.get(1)) - .serialize(); - return chunk as unknown as ISerializedChunk; - }, - }; + getPlayer(uid: number): WorldWasm.Player { + return this.game.get_player_wasm(uid); } } -export const TerrainGenModule = new TerrainGenModuleClass(); +// Wrapper class for world logic +// class WorldModuleClass { +// private _module: typeof WorldWasm | null = null; + +// private get module() { +// if (!this._module) { +// throw new Error("Module not loaded"); +// } +// return this._module; +// } + +// async load(): Promise { +// if (this._module) return; +// this._module = await loadWasmModule(WorldWasm, "World"); +// } + +// public createWorld(data?: ISerializedWorld) { +// console.log("Creating wasm world"); +// const wasmWorld = WorldModule.module.World.new_wasm(); +// const world = new World(wasmWorld, data); +// return world; +// } + +// public createPlayer(uid: number) { +// const player = WorldModule.module.Player.make(uid); +// return player; +// } +// } + +// export const WorldModule = new WorldModuleClass(); + +// class TerrainGenModuleClass { +// private _module: typeof TerrainGenWasm | null = null; + +// private get module() { +// if (!this._module) { +// throw new Error("Terrain gen module not loaded"); +// } +// return this._module; +// } + +// public async load(): Promise { +// if (this._module) return; +// this._module = await loadWasmModule(TerrainGenWasm, "TerrainGen"); +// } + +// getParkorTerrainGenerator(seed: number) { +// const terrainGenerator = this.module.ParkorChunkGetter.new(); + +// return { +// getChunk: (chunkPos: Vector2D) => { +// console.log("Generating Chunk", chunkPos); +// const chunk = terrainGenerator +// .get_chunk_wasm(chunkPos.get(0), chunkPos.get(1)) +// .serialize(); +// return chunk as unknown as ISerializedChunk; +// }, +// }; +// } + +// getTerrainGenerator(seed: number, flatWorld: boolean) { +// const terrainGenerator = new this.module.TerrainGenerator(seed, flatWorld); + +// return { +// getChunk: (chunkPos: Vector2D) => { +// console.log("Generating Chunk", chunkPos); +// const chunk = terrainGenerator +// .get_chunk(chunkPos.get(0), chunkPos.get(1)) +// .serialize(); +// return chunk as unknown as ISerializedChunk; +// }, +// }; +// } +// } + +// export const TerrainGenModule = new TerrainGenModuleClass(); diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index d72efac..5a5b20b 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -15,10 +15,11 @@ pub trait GameScript { fn on_diff(&self, diff: GameDiff) -> (); } -pub trait PlayerScript { +pub trait PlayerScript: Any { fn name(&self) -> &'static str; fn update(&mut self, world: &World, player: &mut Player); fn handle_action(&mut self, action: EntityAction); + fn as_any(&self) -> &dyn Any; } type ScriptId = u32; @@ -51,6 +52,36 @@ impl Game { self.player_scripts_entity_map.insert(id, entity_id); } + pub fn get_entity_script(&self, entity_id: EntityId) -> Option<&T> + where + T: PlayerScript + Any, + { + let player_scripts: Vec<&Box> = self + .player_scripts + .iter() + .filter(|(script_id, _)| { + let ent_id = *self + .player_scripts_entity_map + .get(script_id) + .expect("Script not found"); + ent_id == entity_id + }) + .map(|(_, script)| script) + .collect(); + + println!("player_scripts_len: {:?}", player_scripts.len()); + + for script in player_scripts.iter() { + println!("script_name: {:?}", script.name()); + } + + let script = player_scripts + .iter() + .find_map(|script| script.as_any().downcast_ref::()); + + script + } + pub fn handle_action(&mut self, action: EntityAction) { for (id, script) in self.player_scripts.iter_mut() { let script_entity_id = *self @@ -115,9 +146,7 @@ impl Game { self.world.insert_chunk(chunk); } } -} -impl Game { pub fn add_game_script(&mut self, game_script: Box) { self.game_scripts.push(game_script); } @@ -223,6 +252,9 @@ mod tests { game.update(); let player = game.get_entity_by_id(1).unwrap(); assert!(player.vel.y > 0.0); + + let jump_script = game.get_entity_script::(1); + assert!(jump_script.is_some()); } #[test] @@ -265,7 +297,13 @@ pub mod wasm { use super::{Game, GameDiff, GameSchedule, GameScript}; use crate::{ - chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, entities::{entity::{EntityAction, EntityId}, player::Player}, world::World + chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, + entities::{ + entity::{EntityAction, EntityId}, + player::Player, + player_rot_script::PlayerRotScript, + }, + world::World, }; use serde_wasm_bindgen::Error; use wasm_bindgen::prelude::*; @@ -280,6 +318,16 @@ pub mod wasm { Player::make(1) } + pub fn make_and_add_player_wasm(&mut self, uid: EntityId) -> () { + let player = Player::make(uid); + self.add_player_wasm(player); + } + + pub fn get_player_rot_script(&self, player_id: EntityId) -> Option { + self.get_entity_script::(player_id) + .and_then(|script| Some(*script)) + } + pub fn handle_action_wasm(&mut self, action: EntityAction) { self.handle_action(action); } @@ -296,6 +344,10 @@ pub mod wasm { self.world.get_chunk_mesh_wasm(chunk_id) } + pub fn add_player_wasm(&mut self, player: Player) { + self.schedule_entity_insert(Box::new(player)); + } + pub fn get_player_wasm(&self, player_id: EntityId) -> Result { let maybe_player = self.get_entity_by_id(player_id); if let Some(player) = maybe_player { diff --git a/lib/world/src/entities/mod.rs b/lib/world/src/entities/mod.rs index 7d5fe9d..5ba4d96 100644 --- a/lib/world/src/entities/mod.rs +++ b/lib/world/src/entities/mod.rs @@ -2,5 +2,6 @@ pub mod entity; pub mod game; pub mod player; pub mod player_jump_script; +pub mod player_rot_script; pub mod sandbox; pub mod terrain_gen; diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index 078ea08..cddcd4a 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -4,7 +4,7 @@ use crate::{ vec::Vec3, world::World, }; use serde::{Deserialize, Serialize}; -use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; pub type Velocity = Vec3; pub type Size3 = Vec3; @@ -33,7 +33,6 @@ pub struct Player { pub pos: FineWorldPos, dim: Size3, - rot: SphericalRotation, #[wasm_bindgen(skip)] pub vel: Velocity, @@ -51,7 +50,6 @@ impl Entity for Player { } } -#[wasm_bindgen] impl Player { pub fn make(uid: EntityId) -> Player { Player { @@ -77,3 +75,18 @@ impl Player { } } } + +pub mod wasm { + use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; + + use crate::entities::entity::EntityId; + + use super::Player; + + #[wasm_bindgen] + impl Player { + pub fn make_wasm(uid: EntityId) -> JsValue { + serde_wasm_bindgen::to_value(&Player::make(uid)).unwrap() + } + } +} diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/entities/player_jump_script.rs index 8a717cc..06b4519 100644 --- a/lib/world/src/entities/player_jump_script.rs +++ b/lib/world/src/entities/player_jump_script.rs @@ -21,7 +21,6 @@ impl PlayerJumpAction { } } - #[wasm_bindgen] pub struct PlayerJumpScript { jump_speed: f32, @@ -69,6 +68,10 @@ impl PlayerScript for PlayerJumpScript { "Jump" } + fn as_any(&self) -> &dyn std::any::Any { + self + } + fn update(&mut self, world: &World, player: &mut Player) { let jump_force = self.jump_force(player); player.vel = jump_force + player.vel; @@ -98,8 +101,5 @@ pub mod wasm { pub fn make_wasm(entity_id: EntityId) -> EntityAction { PlayerJumpAction::new(entity_id) } - - } - } \ No newline at end of file diff --git a/lib/world/src/entities/player_rot_script.rs b/lib/world/src/entities/player_rot_script.rs new file mode 100644 index 0000000..6f06198 --- /dev/null +++ b/lib/world/src/entities/player_rot_script.rs @@ -0,0 +1,58 @@ +use std::any::Any; +use crate::{geometry::rotation::SphericalRotation, world::World}; +use super::{entity::{EntityAction, EntityId}, game::{Game, PlayerScript}, player::Player}; +use wasm_bindgen::prelude::wasm_bindgen; + +pub struct PlayerRotAction { + pub player_id: String, + pub rot_diff: SphericalRotation, +} + +impl PlayerRotAction { + pub fn new(player_id: EntityId, rot_diff: SphericalRotation) -> EntityAction { + EntityAction { + entity_id: player_id, + name: "PlayerRot", + data: Box::new(rot_diff), + } + } +} + +#[wasm_bindgen] +#[derive(Clone, Copy)] +pub struct PlayerRotScript { + pub rot: SphericalRotation, +} + +impl PlayerRotScript { + pub fn apply_rot(&mut self, rot: SphericalRotation) { + self.rot = self.rot + rot; + } +} + +impl PlayerScript for PlayerRotScript { + fn name(&self) -> &'static str { + "PlayerRot" + } + + fn handle_action(&mut self, action: EntityAction) { + if action.name == "PlayerRot" { + let data = action.data; + if let Some(rot_diff) = data.downcast_ref::() { + self.apply_rot(*rot_diff); + } else { + panic!("PlayerRotScript received invalid action data"); + } + } + } + + fn as_any(&self) -> &dyn Any { + self + } + + + fn update(&mut self, world: &World, player: &mut Player) { + // NO-OP + + } +} \ No newline at end of file diff --git a/lib/world/src/entities/script_map.rs b/lib/world/src/entities/script_map.rs new file mode 100644 index 0000000..139597f --- /dev/null +++ b/lib/world/src/entities/script_map.rs @@ -0,0 +1,2 @@ + + diff --git a/lib/world/src/geometry/rotation.rs b/lib/world/src/geometry/rotation.rs index d7b9914..9ee463a 100644 --- a/lib/world/src/geometry/rotation.rs +++ b/lib/world/src/geometry/rotation.rs @@ -1,8 +1,10 @@ use crate::{entities::player::Velocity, vec::Vec3}; use serde::{Deserialize, Serialize}; use std::{f32::consts::PI, ops::Add}; +use wasm_bindgen::prelude::wasm_bindgen; #[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)] +#[wasm_bindgen] pub struct SphericalRotation { /** The flat angle. [0, 2PI] */ pub theta: f32, From 4ca43fff44c1e286124ceee46c47e93cbb1d2c3b Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sat, 17 Aug 2024 13:48:48 -0700 Subject: [PATCH 06/61] App is loading now --- apps/web-client/index.html | 10 +- apps/web-client/src/app.ts | 56 +--- apps/web-client/src/cameras/entityCamera.ts | 73 ----- .../keyboardPlayerController.ts | 120 +++---- .../playerControllers/mobileController.ts | 16 +- apps/web-client/src/elements.ts | 16 + .../src/game-scripts/canvas-gscript.ts | 167 ++++++---- apps/web-client/src/game-scripts/hudRender.ts | 16 +- .../src/game-scripts/webgl-gscript.ts | 4 +- apps/web-client/src/renders/chunkRender.ts | 22 +- apps/web-client/src/renders/playerRender.ts | 16 +- apps/web-client/src/renders/renderer.ts | 36 +- apps/web-client/src/runner.ts | 60 +++- apps/web-client/src/test.html | 16 + apps/web-client/src/utils.ts | 28 +- apps/web-client/vite.config.js | 6 + lib/engine/camera.ts | 34 -- lib/engine/entities/cube.ts | 4 +- lib/engine/entities/entity.ts | 4 +- lib/engine/entities/moveableEntity.ts | 27 +- lib/engine/entities/player/player.ts | 76 +++-- lib/engine/entities/player/playerActions.ts | 238 -------------- lib/engine/entities/projectile.ts | 2 +- lib/engine/game-scripts/parkor-gscript.ts | 4 +- lib/engine/game-scripts/sandbox-gscript.ts | 2 +- lib/engine/game.ts | 16 +- lib/engine/gameStateDiff.ts | 2 +- lib/engine/index.ts | 28 -- lib/engine/modules.ts | 200 ----------- lib/engine/{ => src}/blockdata.ts | 0 lib/engine/src/camera.ts | 69 ++++ lib/engine/{ => src}/config.ts | 0 lib/engine/{ => src}/game-script.ts | 14 +- lib/engine/src/index.ts | 9 + lib/engine/src/playerActions.ts | 244 ++++++++++++++ lib/engine/src/socket-types.ts | 98 ++++++ lib/engine/{ => src}/utils.ts | 2 +- lib/engine/{utils => src}/vector.ts | 48 --- lib/engine/src/wrappers.ts | 310 ++++++++++++++++++ lib/engine/tsconfig.json | 3 +- lib/engine/tsconfig.tsbuildinfo | 1 + lib/engine/types.ts | 6 +- lib/engine/utils/random.ts | 2 +- lib/engine/world/biome.ts | 2 +- lib/engine/world/chunk.ts | 18 - lib/engine/world/terrainGenerator.ts | 4 +- lib/engine/world/world.ts | 39 +-- lib/terrain-gen/src/lib.rs | 10 +- lib/world/src/chunk.rs | 1 - lib/world/src/entities/entity.rs | 17 +- lib/world/src/entities/game.rs | 75 ++++- lib/world/src/entities/player_rot_script.rs | 13 +- lib/world/src/entities/terrain_gen.rs | 21 +- lib/world/src/positions.rs | 8 + lib/world/src/world/world_duct.rs | 11 + 55 files changed, 1257 insertions(+), 1067 deletions(-) delete mode 100644 apps/web-client/src/cameras/entityCamera.ts create mode 100644 apps/web-client/src/elements.ts create mode 100644 apps/web-client/src/test.html delete mode 100644 lib/engine/camera.ts delete mode 100644 lib/engine/entities/player/playerActions.ts delete mode 100644 lib/engine/index.ts rename lib/engine/{ => src}/blockdata.ts (100%) create mode 100644 lib/engine/src/camera.ts rename lib/engine/{ => src}/config.ts (100%) rename lib/engine/{ => src}/game-script.ts (55%) create mode 100644 lib/engine/src/index.ts create mode 100644 lib/engine/src/playerActions.ts create mode 100644 lib/engine/src/socket-types.ts rename lib/engine/{ => src}/utils.ts (98%) rename lib/engine/{utils => src}/vector.ts (88%) create mode 100644 lib/engine/src/wrappers.ts create mode 100644 lib/engine/tsconfig.tsbuildinfo delete mode 100644 lib/engine/world/chunk.ts diff --git a/apps/web-client/index.html b/apps/web-client/index.html index 0996c51..37c14ae 100644 --- a/apps/web-client/index.html +++ b/apps/web-client/index.html @@ -1,7 +1,7 @@ TylerCraft - @@ -13,7 +13,7 @@
@@ -78,8 +78,6 @@

A 3D sandbox by Tyler Tracy

- -
@@ -96,5 +94,5 @@

A 3D sandbox by Tyler Tracy

- + diff --git a/apps/web-client/src/app.ts b/apps/web-client/src/app.ts index 40bb081..914bda1 100644 --- a/apps/web-client/src/app.ts +++ b/apps/web-client/src/app.ts @@ -3,18 +3,14 @@ */ import * as Engine from "@craft/engine"; console.log("Engine", Engine); -import { - camelCaseToNormalCase, - CONFIG, - Game, - IGameMetadata, -} from "@craft/engine"; +import { camelCaseToNormalCase, CONFIG } from "@craft/engine"; import { SocketHandler } from "./socket"; import { renderWorldPicker } from "./world-picker"; import { createRoot } from "react-dom/client"; import { ClientDbGamesService } from "./services/sp-games-service"; import { NetworkGamesService } from "./services/mp-games-service"; import { BasicGScript } from "./game-scripts/basic-gscript"; +import { hideElement, showElement } from "./utils"; // Add the world to this too export interface IExtendedWindow extends Window { @@ -24,57 +20,9 @@ export interface IExtendedWindow extends Window { // Loading the engine await Engine.WorldModule.load(); -export const IS_MOBILE = /Mobi/.test(window.navigator.userAgent); -console.log("Is Mobile: ", IS_MOBILE); - // helper functions -function showElement(e: HTMLElement) { - e.classList.remove("hidden"); - e.classList.add("shown"); -} - -function hideElement(e: HTMLElement) { - e.classList.add("hidden"); - e.classList.remove("shown"); -} - -function getElementByIdOrThrow(id: string): HTMLElement { - const e = document.getElementById(id); - if (!e) { - throw new Error(`Element with id ${id} not found`); - } - return e; -} - -// generate your unique id -// kind of bad to do this client side, but I can make it better later -const UID_KEY = "tylercraft-user-id"; -if (!localStorage.getItem(UID_KEY)) { - const randomNum = Math.floor(Math.random() * 10000000); - localStorage.setItem(UID_KEY, randomNum.toString()); -} - -export function getMyUid() { - const uid = Number(localStorage.getItem(UID_KEY)); - if (!uid) throw new Error("UID not defined"); - return uid; -} // Get all of the elements -const ePlayLocalButton = getElementByIdOrThrow("playLocalButton"); -const ePlayOnlineButton = getElementByIdOrThrow("playOnlineButton"); -export const eStartMenu = getElementByIdOrThrow("startMenu"); -const eGameTypeScreen = getElementByIdOrThrow("pickGameTypeScreen"); -export const ePickWorldScreen = getElementByIdOrThrow("pickWorldScreen"); -const eBackButton = getElementByIdOrThrow("backButton"); -const eWorldOptionsScreen = getElementByIdOrThrow("worldOptionsScreen"); -const eConfigForm = getElementByIdOrThrow("configForm") as HTMLFormElement; -const eConfigFormExtra = getElementByIdOrThrow("configFormExtra"); -const eConfigFormStartButton = getElementByIdOrThrow( - "configFormStartButton" -) as HTMLButtonElement; -const eLoadingScreen = getElementByIdOrThrow("loadingScreen"); -const eLoadingScreenMsg = getElementByIdOrThrow("loadingScreenMsg"); const LoadingScreen = { show: (msg: string) => { diff --git a/apps/web-client/src/cameras/entityCamera.ts b/apps/web-client/src/cameras/entityCamera.ts deleted file mode 100644 index f64a2d7..0000000 --- a/apps/web-client/src/cameras/entityCamera.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Vector3D, MovableEntity, CONFIG, Camera } from "@craft/engine"; - -export enum PlayerPerspective { - FirstPerson, - ThirdPersonBack, - ThirdPersonFront, -} - -export class EntityCamera extends Camera { - private perspective = PlayerPerspective.FirstPerson; - offset: Vector3D = Vector3D.zero; - rot: Vector3D; - - constructor(public entity: MovableEntity) { - super(); - this.rot = entity.rot.copy(); - } - - // cycles through player perspectives. Returns weather the player should be rendered or not - public togglePerspective(): boolean { - this.perspective = - this.perspective === PlayerPerspective.FirstPerson - ? PlayerPerspective.ThirdPersonBack - : this.perspective === PlayerPerspective.ThirdPersonBack - ? PlayerPerspective.ThirdPersonFront - : PlayerPerspective.FirstPerson; - - return this.perspective !== PlayerPerspective.FirstPerson; - } - - rotateBy(x: number, y: number) { - this.entity.rotate(new Vector3D([1, x, y])); - // set my rot as my entities rot - if (this.perspective === PlayerPerspective.ThirdPersonFront) { - this.rot = this.entity.rot.add(new Vector3D([0, Math.PI, 0])); - } else { - this.rot = this.entity.rot.copy(); - } - } - - get pos(): Vector3D { - let offset = Vector3D.zero; - - if (this.perspective === PlayerPerspective.ThirdPersonBack) { - offset = this.entity.rot - .add(new Vector3D([CONFIG.player.thirdPersonCamDist, 0, 0])) - .toCartesianCoords() - .multiply(new Vector3D([1, -1, 1])); - } else if (this.perspective === PlayerPerspective.ThirdPersonFront) { - this.rot = this.entity.rot.add(new Vector3D([0, Math.PI, 0])); - offset = this.entity.rot - .add(new Vector3D([CONFIG.player.thirdPersonCamDist, Math.PI, 0])) - .toCartesianCoords() - .multiply(new Vector3D([1, -1, 1])); - } else { - offset = this.offset; - } - - offset = offset.add( - new Vector3D([ - this.entity.dim[0] / 2, - this.entity.dim[1] * (9 / 10), - this.entity.dim[2] / 2, - ]) - ); - - return offset.add(this.entity.pos); - } - - set pos(_pos: Vector3D) { - /* NO-OP */ - } -} diff --git a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts index 63a1e34..ee58973 100644 --- a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts +++ b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts @@ -1,16 +1,15 @@ import { CONFIG, - Direction, - Game, - IDim, - Player, - PlayerActionType, + PlayerActionService, PlayerController, + GameWrapper, } from "@craft/engine"; -import { CanvasGameScript } from "../../game-scripts/canvas-gscript"; import { WebGlGScript } from "../../game-scripts/webgl-gscript"; -import { HudGScript } from "../../game-scripts/hudRender"; -import { PlayerAction } from "@craft/engine/modules"; +import { Direction } from "@craft/rust-world"; +import { + CanvasGameScript, + PlayerPerspective, +} from "../../game-scripts/canvas-gscript"; export class KeyboardPlayerEntityController extends PlayerController { cleanup(): void { @@ -19,7 +18,6 @@ export class KeyboardPlayerEntityController extends PlayerController { private keys = new Set(); private keysPressed = new Set(); - private hasMouseMoved = false; private currentMoveDirections = new Set(); private prevMoveDirections = new Set(); @@ -28,36 +26,34 @@ export class KeyboardPlayerEntityController extends PlayerController { private hasJumped = false; constructor( - onAction: (playerAction: PlayerAction) => void, - game: Game, - player: Player + playerActionService: PlayerActionService, + game: GameWrapper, + playerId: number, + private canvasGScript: CanvasGameScript, + webGlGScript: WebGlGScript ) { - super(onAction, game, player); + super(playerActionService, game, playerId); - const hudEle = game.getGameScript(HudGScript).eHud; - const webGlCanvas = game.getGameScript(WebGlGScript).eCanvas; + const webGlCanvas = webGlGScript.eCanvas; // Pointer lock to the canvas - hudEle.addEventListener("mousedown", (e: MouseEvent) => { - if (e.target !== hudEle) { + webGlCanvas.addEventListener("mousedown", (e: MouseEvent) => { + if (e.target !== webGlCanvas) { return; } - if (document.pointerLockElement !== webGlCanvas) { webGlCanvas.requestPointerLock(); } }); - window.addEventListener("mousedown", (e: MouseEvent) => { + webGlCanvas.addEventListener("mousedown", (e: MouseEvent) => { if (document.pointerLockElement !== webGlCanvas) { return; } if (e.button === 2) { - // right click this.primaryAction(); } else if (e.button === 0) { - // left click this.secondaryAction(); } e.preventDefault(); @@ -65,13 +61,17 @@ export class KeyboardPlayerEntityController extends PlayerController { window.addEventListener("mousemove", (e: MouseEvent) => { if (document.pointerLockElement === webGlCanvas) { - const moveX = e.movementX * CONFIG.player.mouseRotSpeed; + let moveX = e.movementX * CONFIG.player.mouseRotSpeed; const moveY = e.movementY * CONFIG.player.mouseRotSpeed; - const canvas = this.game.getGameScript(CanvasGameScript); - canvas.camera.rotateBy(moveX, moveY); - - this.hasMouseMoved = true; + if ( + this.canvasGScript.perspective === PlayerPerspective.ThirdPersonFront + ) { + moveX += Math.PI; + this.rotate(moveX, moveY); + } else { + this.rotate(moveX, moveY); + } } }); @@ -94,20 +94,12 @@ export class KeyboardPlayerEntityController extends PlayerController { if (totalWheelDelta > 100) { totalWheelDelta = 0; - this.handleAction( - PlayerAction.make(PlayerActionType.BeltRight, { - playerUid: this.player.uid, - }) - ); + this.beltRight(); } if (totalWheelDelta < -100) { totalWheelDelta = 0; - this.handleAction( - PlayerAction.make(PlayerActionType.BeltLeft, { - playerUid: this.player.uid, - }) - ); + this.beltLeft(); } }); @@ -124,16 +116,16 @@ export class KeyboardPlayerEntityController extends PlayerController { this.keys.add(key.toLowerCase()); switch (key) { case "w": - this.currentMoveDirections.add(Direction.Forwards); + this.currentMoveDirections.add(Direction.North); break; case "s": - this.currentMoveDirections.add(Direction.Backwards); + this.currentMoveDirections.add(Direction.South); break; case "a": - this.currentMoveDirections.add(Direction.Left); + this.currentMoveDirections.add(Direction.West); break; case "d": - this.currentMoveDirections.add(Direction.Right); + this.currentMoveDirections.add(Direction.East); break; case "e": this.currentMoveDirections.add(Direction.Up); @@ -145,11 +137,7 @@ export class KeyboardPlayerEntityController extends PlayerController { this.toggleCreative(); break; case "j": - this.handleAction( - PlayerAction.make(PlayerActionType.PlaceDebugBlock, { - playerUid: this.player.uid, - }) - ); + this.debugBlock(); break; case " ": if (this.hasJumped) { @@ -195,13 +183,13 @@ export class KeyboardPlayerEntityController extends PlayerController { this.keys.delete(key.toLowerCase()); this.keysPressed.add(key.toLowerCase()); if (key === "w") { - this.currentMoveDirections.delete(Direction.Forwards); + this.currentMoveDirections.delete(Direction.North); } else if (key === "s") { - this.currentMoveDirections.delete(Direction.Backwards); + this.currentMoveDirections.delete(Direction.South); } else if (key === "a") { - this.currentMoveDirections.delete(Direction.Left); + this.currentMoveDirections.delete(Direction.West); } else if (key === "d") { - this.currentMoveDirections.delete(Direction.Right); + this.currentMoveDirections.delete(Direction.East); } else if (key === "e") { this.currentMoveDirections.delete(Direction.Up); } else if (key === "q") { @@ -212,16 +200,6 @@ export class KeyboardPlayerEntityController extends PlayerController { } update() { - if (this.hasMouseMoved) { - this.handleAction( - PlayerAction.make(PlayerActionType.Rotate, { - playerRot: this.player.rot.data as IDim, - playerUid: this.player.uid, - }) - ); - this.hasMouseMoved = false; - } - // check if previous directions is different than current directions let areDifferent = false; for (const direction of this.currentMoveDirections) { @@ -243,29 +221,5 @@ export class KeyboardPlayerEntityController extends PlayerController { // Copy prev to current this.prevMoveDirections = new Set(this.currentMoveDirections); } - - // if there were any actions performed - if (this.player.moveDirections.length > 0) { - this.numOfUpdates++; - - if (this.numOfUpdates > 10) { - this.numOfUpdates = 0; - this.sendPos(); - } - } - } - - handleAction(action: PlayerAction) { - // console.log("Keyboard controller hanling action", action, this.id); - this.playerActionService.performAction(action); - } - - sendPos() { - this.handleAction( - PlayerAction.make(PlayerActionType.SetPos, { - playerUid: this.player.uid, - pos: this.player.pos.data as IDim, - }) - ); } } diff --git a/apps/web-client/src/controllers/playerControllers/mobileController.ts b/apps/web-client/src/controllers/playerControllers/mobileController.ts index 4203e34..4670f6e 100644 --- a/apps/web-client/src/controllers/playerControllers/mobileController.ts +++ b/apps/web-client/src/controllers/playerControllers/mobileController.ts @@ -81,7 +81,7 @@ export class MobileController extends PlayerController { jumpTouches.push(touches.item(i)!); } - this.player.metaActions.add(MetaAction.jump); + // this.player.metaActions.add(MetaAction.jump); }); this.eJumpButton.addEventListener("touchmove", (e: TouchEvent) => { @@ -103,7 +103,7 @@ export class MobileController extends PlayerController { } if (shouldJump) { - this.player.metaActions.add(MetaAction.jump); + // this.player.metaActions.add(MetaAction.jump); } e.preventDefault(); @@ -123,7 +123,7 @@ export class MobileController extends PlayerController { } // e.touches. - this.player.metaActions.delete(MetaAction.jump); + // this.player.metaActions.delete(MetaAction.jump); }); // handle forward button @@ -132,7 +132,7 @@ export class MobileController extends PlayerController { e.preventDefault(); e.stopPropagation(); lastForwardTouch = e.changedTouches.item(0)!; - this.player.metaActions.add(MetaAction.forward); + // this.player.metaActions.add(MetaAction.forward); }); this.eForwardButton.addEventListener("touchmove", (e: TouchEvent) => { @@ -145,9 +145,9 @@ export class MobileController extends PlayerController { const diffY = lastForwardTouch.clientY - touch.clientY; if (diffY > 50) { - this.player.metaActions.add(MetaAction.jump); + // this.player.metaActions.add(MetaAction.jump); } else { - this.player.metaActions.delete(MetaAction.jump); + // this.player.metaActions.delete(MetaAction.jump); } } }); @@ -155,8 +155,8 @@ export class MobileController extends PlayerController { this.eForwardButton.addEventListener("touchend", (e: TouchEvent) => { e.preventDefault(); e.stopPropagation(); - this.player.metaActions.delete(MetaAction.forward); - this.player.metaActions.delete(MetaAction.jump); + // this.player.metaActions.delete(MetaAction.forward); + // this.player.metaActions.delete(MetaAction.jump); }); // item selection diff --git a/apps/web-client/src/elements.ts b/apps/web-client/src/elements.ts new file mode 100644 index 0000000..20edb0a --- /dev/null +++ b/apps/web-client/src/elements.ts @@ -0,0 +1,16 @@ +import { getEleOrError } from "./utils"; + +export const ePlayLocalButton = getEleOrError("playLocalButton"); +export const ePlayOnlineButton = getEleOrError("playOnlineButton"); +export const eStartMenu = getEleOrError("startMenu"); +export const eGameTypeScreen = getEleOrError("pickGameTypeScreen"); +export const ePickWorldScreen = getEleOrError("pickWorldScreen"); +export const eBackButton = getEleOrError("backButton"); +export const eWorldOptionsScreen = getEleOrError("worldOptionsScreen"); +export const eConfigForm = getEleOrError("configForm"); +export const eConfigFormExtra = getEleOrError("configFormExtra"); +export const eConfigFormStartButton = getEleOrError( + "configFormStartButton" +); +export const eLoadingScreen = getEleOrError("loadingScreen"); +export const eLoadingScreenMsg = getEleOrError("loadingScreenMsg"); diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index 8150687..f902344 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -1,23 +1,21 @@ import { Camera, - Entity, - Game, - Player, - Projectile, + GameDiffWrapper, + GameScript, + GameWrapper, + makeCameraForPlayer, + makeThirdPersonBackCamera, + makeThirdPersonFrontCamera, + makeXRCamera, + PlayerWrapper, Vector2D, Vector3D, - World, } from "@craft/engine"; -import { XrCamera } from "../cameras/xrCamera"; -import { EntityCamera } from "../cameras/entityCamera"; -import { GameScript } from "@craft/engine/game-script"; import { WebGlGScript } from "./webgl-gscript"; import { Renderer } from "../renders/renderer"; import { ChunkRenderer } from "../renders/chunkRender"; import { BlockType } from "@craft/rust-world"; import { PlayerRenderer } from "../renders/playerRender"; -import { SphereRenderer } from "../renders/sphereRender"; -import { GameDiff, GameWrapper } from "@craft/engine/modules"; type Config = { renderDistance: number; @@ -25,6 +23,12 @@ type Config = { chunkSize: number; }; +export enum PlayerPerspective { + FirstPerson, + ThirdPersonBack, + ThirdPersonFront, +} + // This class should only read game and not write. export class CanvasGameScript extends GameScript { name = "world-renderer"; @@ -36,12 +40,14 @@ export class CanvasGameScript extends GameScript { }; private renderers: Renderer[] = []; - private entityRenderers: Map = new Map(); + private entityRenderers: Map = new Map(); private chunkRenderers: Map = new Map(); + + public perspective: PlayerPerspective = PlayerPerspective.FirstPerson; + shouldRenderMainPlayer = false; isSpectating = false; - camera: Camera; numOfBlocks = 10; totTime = 0; pastDeltas: number[] = []; @@ -60,35 +66,57 @@ export class CanvasGameScript extends GameScript { }); // Create renderers for initial entities - for (const entity of game.entities.iterable()) { + for (const entity of this.game.getEntities()) { this.onNewEntity(entity); } // Create renderers for initial chunks - for (const chunkId of game.world.getLoadedChunkIds()) { + for (const chunkId of this.game.getLoadedChunkIds()) { this.onChunkUpdate(chunkId); } this.isSpectating = false; - this.camera = this.webGlGScript.isXr - ? new XrCamera(this.mainPlayer) - : new EntityCamera(this.mainPlayer); } - onDiff(diff: GameDiff) { - for (const entityId of diff.updated_entities) { - const entity = this.game.entities.get(entityId); + getCamera(): Camera { + const player = this.game.getPlayer(this.mainPlayerId); + if (this.webGlGScript.isXr) { + return makeXRCamera(player); + } else { + if (this.perspective === PlayerPerspective.FirstPerson) { + return makeCameraForPlayer(player); + } else if (this.perspective === PlayerPerspective.ThirdPersonBack) { + return makeThirdPersonBackCamera(player); + } else { + return makeThirdPersonFrontCamera(player); + } + } + } + + private lastDiff: GameDiffWrapper | null = null; + + onDiff(diff: GameDiffWrapper) { + this.lastDiff = diff; + } + + update() { + if (!this.lastDiff) { + return; + } + + for (const entityId of this.lastDiff.updated_entities) { + const entity = this.game.getPlayer(entityId); this.onNewEntity(entity); } - for (const chunkId of diff.updated_chunks) { + for (const chunkId of this.lastDiff.updated_chunks) { this.onChunkUpdate(chunkId); } } - getFilter(camera: Camera): Vector3D | null { + getFilter(camera: Camera): Vector3D { const shiftedDown = camera.pos.sub(new Vector3D([0, 0.5, 0])); - const block = this.game.world.getBlockFromWorldPoint(shiftedDown); + const block = this.game.getBlock(shiftedDown); if (block?.type === BlockType.Water) { return new Vector3D([0, 0.3, 1]); @@ -103,14 +131,19 @@ export class CanvasGameScript extends GameScript { private handleKeyDown(key: string) { if (key === "v") { - this.toggleThirdPerson(); + this.togglePerspective(); } } - toggleThirdPerson() { - if (this.camera instanceof EntityCamera) { - this.shouldRenderMainPlayer = this.camera.togglePerspective(); - } + public togglePerspective(): boolean { + this.perspective = + this.perspective === PlayerPerspective.FirstPerson + ? PlayerPerspective.ThirdPersonBack + : this.perspective === PlayerPerspective.ThirdPersonBack + ? PlayerPerspective.ThirdPersonFront + : PlayerPerspective.FirstPerson; + + return this.perspective !== PlayerPerspective.FirstPerson; } get frameRate() { @@ -124,7 +157,10 @@ export class CanvasGameScript extends GameScript { renderLoop(time: number) { const delta = time - this.totTime; - const camera = this.camera; + const camera = this.getCamera(); + + const shouldRenderMainPlayer = + this.perspective !== PlayerPerspective.FirstPerson; const filter = this.getFilter(camera); if (filter) { @@ -132,6 +168,8 @@ export class CanvasGameScript extends GameScript { } const renderedChunks = new Set(); + // this will hold the coords of ever chunk that was rendered. + const renderedSet = new Set(); for (const renderer of this.renderers) { renderer.render(camera); @@ -141,8 +179,8 @@ export class CanvasGameScript extends GameScript { // Skip rendering the player if we aren't supposed to if ( entityRenderer instanceof PlayerRenderer && - entityRenderer.player === this.basic.mainPlayer && - !this.shouldRenderMainPlayer + entityRenderer.player.uid === this.mainPlayerId && + !shouldRenderMainPlayer ) { continue; } @@ -154,12 +192,19 @@ export class CanvasGameScript extends GameScript { const realRenderDistance = this.config.chunkSize * this.config.renderDistance; - const cameraChunkPos = World.worldPosToChunkPos(camera.pos); + const cameraChunkPos = this.game.getChunkPosFromWorldPos(camera.pos); const cameraRotNorm = camera.rot.toCartesianCoords().normalize(); - // this will hold the coords of ever chunk that was rendered. - const renderedSet = new Set(); + const renderChunk = (chunkPos: Vector2D) => { + const chunkId = this.game.getChunkIdFromChunkPos(chunkPos); + const chunkRenderer = this.chunkRenderers.get(chunkId); + if (!chunkRenderer) { + return; + } + renderedChunks.add(chunkRenderer); + chunkRenderer.render(camera); + }; const skippedChunkPos = new Set(); @@ -175,7 +220,7 @@ export class CanvasGameScript extends GameScript { ) { const indexVec = new Vector2D([i, j]); const chunkPos = cameraChunkPos.add(indexVec); - const chunkWorldPos = World.chunkPosToWorldPos(chunkPos, true); + const chunkWorldPos = this.game.getWorldPosFromChunkPos(chunkPos); const chunkXYPos = new Vector2D([ chunkWorldPos.get(0), chunkWorldPos.get(2), @@ -199,7 +244,7 @@ export class CanvasGameScript extends GameScript { renderedSet.add(chunkPos.toIndex()); - this.renderChunk(chunkPos, camera, renderedChunks); + renderChunk(chunkPos); } } @@ -220,7 +265,7 @@ export class CanvasGameScript extends GameScript { } if (!stillShouldntRender) { - this.renderChunk(chunkPos, camera, renderedChunks); + renderChunk(chunkPos); } } @@ -231,8 +276,7 @@ export class CanvasGameScript extends GameScript { for (let l = -1; l <= 1; l += 1) { const indexVec = new Vector2D([k, l]); const chunkPos = cameraChunkPos.add(indexVec); - if (!renderedSet.has(chunkPos.toIndex())) - this.renderChunk(chunkPos, camera, renderedChunks); + if (!renderedSet.has(chunkPos.toIndex())) renderChunk(chunkPos); } } @@ -246,43 +290,32 @@ export class CanvasGameScript extends GameScript { this.totTime = time; } - renderChunk( - chunkPos: Vector2D, - camera: Camera, - renderedSet: Set - ) { - const chunkRenderer = this.chunkRenderers.get(chunkPos.toIndex()); - - if (!chunkRenderer) { - return; - } - - renderedSet.add(chunkRenderer); - - chunkRenderer.render(camera); - } - - onNewEntity(entity: Entity): void { + onNewEntity(entity: PlayerWrapper): void { console.log("CanvasGameScript: Adding entity", entity); - if (entity instanceof Player) { - const renderer = new PlayerRenderer(this.webGlGScript, entity); - this.entityRenderers.set(entity.uid, renderer); - } else if (entity instanceof Projectile) { - const renderer = new SphereRenderer(this.webGlGScript, entity); - this.entityRenderers.set(entity.uid, renderer); - } + // if (entity instanceof PlayerWrapper) { + const renderer = new PlayerRenderer(this.webGlGScript, entity); + this.entityRenderers.set(entity.uid, renderer); + // } else if (entity instanceof Projectile) { + // const renderer = new SphereRenderer(this.webGlGScript, entity); + // this.entityRenderers.set(entity.uid, renderer); + // } } - onRemovedEntity(entity: Entity): void { + onRemovedEntity(entity: PlayerWrapper): void { console.log("CanvasGameScript: Removing entity", entity); this.entityRenderers.delete(entity.uid); } onChunkUpdate(chunkId: number): void { - console.log("CanvasGameScript: Chunk update", chunkId); - const chunkMesh = this.game.getChunkMeshFromChunkId(chunkId); - const chunkRenderer = new ChunkRenderer(this.webGlGScript, chunkMesh); + const chunkPos = this.game.getChunkPosFromChunkId(chunkId); + const chunkMesh = this.game.getChunkMeshFromChunkPos(chunkId); + const chunkRenderer = new ChunkRenderer( + this.webGlGScript, + chunkPos, + chunkMesh + ); chunkRenderer.getBufferData(); this.chunkRenderers.set(chunkId, chunkRenderer); + console.log(this.chunkRenderers); } } diff --git a/apps/web-client/src/game-scripts/hudRender.ts b/apps/web-client/src/game-scripts/hudRender.ts index b659202..2c6378d 100644 --- a/apps/web-client/src/game-scripts/hudRender.ts +++ b/apps/web-client/src/game-scripts/hudRender.ts @@ -8,6 +8,7 @@ import { BasicGScript } from "./basic-gscript"; import { GameMenu } from "../renders/gameMenuRender"; import React from "react"; import ReactDOM from "react-dom"; +import { GameWrapper } from "@craft/engine/modules"; export class HudGScript extends GameScript { name = "hud"; @@ -31,9 +32,9 @@ export class HudGScript extends GameScript { private lastSelected = -1; constructor( - game: Game, - private basicGScript: BasicGScript, - private canvasGScript: CanvasGameScript + game: GameWrapper, + private canvasGScript: CanvasGameScript, + private mainPlayerUid: number ) { super(game); @@ -94,9 +95,12 @@ export class HudGScript extends GameScript { private lastStats = ""; drawStats() { - const cameraPos = this.basicGScript.mainPlayer.pos.data - .map((d) => d.toFixed(2)) - .join(","); + const mainPlayer = this.game.getPlayer(this.mainPlayerUid); + if (!mainPlayer) { + return; + } + + const cameraPos = mainPlayer.pos.data.map((d) => d.toFixed(2)).join(","); const numChunks = this.game.world.getLoadedChunkIds().length; const statsString = ` diff --git a/apps/web-client/src/game-scripts/webgl-gscript.ts b/apps/web-client/src/game-scripts/webgl-gscript.ts index c2286e0..137e3af 100644 --- a/apps/web-client/src/game-scripts/webgl-gscript.ts +++ b/apps/web-client/src/game-scripts/webgl-gscript.ts @@ -1,4 +1,4 @@ -import { Vector3D } from "@craft/engine"; +import { GameScript, GameWrapper, Vector3D } from "@craft/engine"; import type { Navigator, XRSession, @@ -9,8 +9,6 @@ import type { import { mat4 } from "gl-matrix"; import VertexShader from "../../shaders/vertex.glsl?raw"; import FragmentShader from "../../shaders/fragment.glsl?raw"; -import { GameScript } from "@craft/engine/game-script"; -import { GameWrapper } from "@craft/engine/modules"; const WebGlLayer = (window as any).XRWebGLLayer as typeof XRWebGLLayer; diff --git a/apps/web-client/src/renders/chunkRender.ts b/apps/web-client/src/renders/chunkRender.ts index 3661c7e..d04dbc3 100644 --- a/apps/web-client/src/renders/chunkRender.ts +++ b/apps/web-client/src/renders/chunkRender.ts @@ -1,39 +1,41 @@ import { Renderer, RenderData } from "./renderer"; import { Camera, - arraySub, getBlockData, - IDim, Vector3D, Vector2D, + ChunkMeshWrapper, } from "@craft/engine"; import TextureMapper from "../textureMapper"; import { BlockShape, BlockType } from "@craft/rust-world"; import ShapeBuilder from "../services/shape-builder"; import { WebGlGScript } from "../game-scripts/webgl-gscript"; -import { ChunkMesh } from "@craft/engine/modules"; export class ChunkRenderer extends Renderer { private otherRenders: Renderer[] = []; - public position: Vector2D; - constructor(public webGlGScript: WebGlGScript, public chunkMesh: ChunkMesh) { + constructor( + public webGlGScript: WebGlGScript, + public chunkPos: Vector2D, + public chunkMesh: ChunkMeshWrapper + ) { super(webGlGScript); - this.position = new Vector2D([chunkMesh.chunkPos.x, chunkMesh.chunkPos.y]); this.setActiveTexture(webGlGScript.textureAtlas); this.getBufferData(); } get worldPos(): Vector3D { - return this.position.insert(0, 1); + return this.chunkPos.insert(0, 1); } render(camera: Camera, trans?: boolean): void { // if (!this.isLoaded) return; + + console.log("Rendering chunk", this.chunkPos, camera); this.setActiveTexture(this.webGlGScript.textureAtlas); - this.renderObject(this.worldPos.data as IDim, camera, trans); + this.renderObject(this.worldPos, camera, trans); this.otherRenders.forEach((r) => { r.render(camera); @@ -53,11 +55,11 @@ export class ChunkRenderer extends Renderer { const transRenData = new RenderData(true); this.chunkMesh.mesh.forEach((face) => { - const { block: cube, faces } = face; + const [cube, faces] = face; if (cube.type === BlockType.Void) return; - const relativePos = arraySub(cube.pos.data, this.worldPos.data); + const relativePos = cube.pos.sub(this.worldPos).data; const blockData = getBlockData(cube.type); const blockRenData = blockData.transparent ? transRenData : renData; diff --git a/apps/web-client/src/renders/playerRender.ts b/apps/web-client/src/renders/playerRender.ts index 896b2b5..2f14da6 100644 --- a/apps/web-client/src/renders/playerRender.ts +++ b/apps/web-client/src/renders/playerRender.ts @@ -1,4 +1,4 @@ -import { Player, Camera, Vector3D, IDim } from "@craft/engine"; +import { Camera, Vector3D, PlayerWrapper } from "@craft/engine"; import { RenderData, Renderer } from "./renderer"; import ShapeBuilder from "../services/shape-builder"; import TextureMapper from "../textureMapper"; @@ -7,18 +7,14 @@ import { WebGlGScript } from "../game-scripts/webgl-gscript"; export class PlayerRenderer extends Renderer { private renderData = new RenderData(); - constructor( - webGlGScript: WebGlGScript, - - public player: Player - ) { + constructor(webGlGScript: WebGlGScript, public player: PlayerWrapper) { super(webGlGScript); this.setActiveTexture(this.webGlGScript.textureAtlas); } render(camera: Camera) { this.calculateBuffers(); - this.renderObject(this.player.pos.data as IDim, camera); + this.renderObject(this.player.pos, camera); } static handSize = new Vector3D([0.2, 0.2, 0.2]); @@ -34,8 +30,7 @@ export class PlayerRenderer extends Renderer { const theta = this.player.rot.get(1); const phi = -this.player.rot.get(2) + Math.PI / 2; const rightLegRot = Math.sin(this.player.distanceMoved); - const playerDimVec = new Vector3D(this.player.dim); - const halfPlayerSize = playerDimVec.scalarMultiply(0.5); + const halfPlayerSize = this.player.dim.scalarMultiply(0.5); const headPos = halfPlayerSize.add(new Vector3D([0, 0.9, 0])); ShapeBuilder.buildBox((edge) => { return edge @@ -63,12 +58,11 @@ export class PlayerRenderer extends Renderer { const theta = this.player.rot.get(1); // const phi = -this.player.rot.get(2) + Math.PI / 2; - const playerDimVec = new Vector3D(this.player.dim); const armSize = new Vector3D([0.3, 0.8, 0.3]); const bodySize = new Vector3D([0.4, 0.8, 0.8]); const legSize = new Vector3D([0.4, 0.7, 0.4]); - const halfPlayerSize = playerDimVec.scalarMultiply(0.5); + const halfPlayerSize = this.player.dim.scalarMultiply(0.5); const bodyOrigin = bodySize.scalarMultiply(0.5); const armOrigin = armSize.multiply(new Vector3D([0.5, 1, 0.5])); const legOrigin = legSize.multiply(new Vector3D([0.5, 1, 0.5])); diff --git a/apps/web-client/src/renders/renderer.ts b/apps/web-client/src/renders/renderer.ts index c2aa925..be4933f 100644 --- a/apps/web-client/src/renders/renderer.ts +++ b/apps/web-client/src/renders/renderer.ts @@ -1,4 +1,4 @@ -import { Camera, arraySub, IDim } from "@craft/engine"; +import { Camera, Vector3D } from "@craft/engine"; import { mat4, vec3 } from "gl-matrix"; import { WebGlGScript } from "../game-scripts/webgl-gscript"; @@ -169,7 +169,7 @@ export abstract class Renderer { abstract render(camera: Camera): void; - renderXrObject(pos: number[], camera: Camera, trans?: boolean) { + renderXrObject(pos: Vector3D, camera: Camera, trans?: boolean) { const { currentXRFrame, xrRefSpace, gl, program, webXrSession } = this.webGlGScript; if (!currentXRFrame || !xrRefSpace || !webXrSession) { @@ -202,11 +202,13 @@ export abstract class Renderer { view.transform.inverse.matrix as mat4 ); + const move_pos = pos.sub(camera.pos).data; + // Now move the drawing position to where we want to start drawing the square. mat4.translate( modelViewMatrix, // destination matrix modelViewMatrix, // matrix to translate - new Float32Array(arraySub(pos, camera.pos.data)) as vec3 + new Float32Array(move_pos) as vec3 ); gl.uniformMatrix4fv( @@ -235,7 +237,7 @@ export abstract class Renderer { } } - renderObject(pos: IDim, camera: Camera, trans?: boolean) { + renderObject(pos: Vector3D, camera: Camera, trans?: boolean) { if (this.webGlGScript.currentXRFrame) { return this.renderXrObject(pos, camera, trans); } @@ -244,25 +246,25 @@ export abstract class Renderer { // Set the drawing position to the "identity" point, which is // the center of the scene. + + // TODO tweak these to work + // need to invert + // theta = -this.rot.get(1) + (Math.PI * 3) / 2, + // // Convert to [-pi/2, pi/2] + // phi = -(Math.PI / 2 - this.rot.get(2)), + const theta = Math.PI / 2 - camera.rot.get(2); + const phi = Math.PI / 2 - camera.rot.get(1); const modelViewMatrix = mat4.create(); - mat4.rotate( - modelViewMatrix, - modelViewMatrix, - camera.rot.get(2) - Math.PI / 2, - [1, 0, 0] - ); - mat4.rotate( - modelViewMatrix, - modelViewMatrix, - camera.rot.get(1) - Math.PI / 2, - [0, 1, 0] - ); + mat4.rotate(modelViewMatrix, modelViewMatrix, theta, [1, 0, 0]); + mat4.rotate(modelViewMatrix, modelViewMatrix, phi, [0, 1, 0]); + + const move_pos = pos.sub(camera.pos).data; // Now move the drawing position to where we want to start drawing the square. mat4.translate( modelViewMatrix, // destination matrix modelViewMatrix, // matrix to translate - new Float32Array(arraySub(pos, camera.pos.data)) as vec3 + new Float32Array(move_pos) as vec3 ); this.bindCube(trans || false); diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index ce72428..0c4f488 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -1,41 +1,75 @@ -import { GameWrapper } from "@craft/engine/modules"; +import { GameWrapper, PlayerActionService } from "@craft/engine"; import { CanvasGameScript } from "./game-scripts/canvas-gscript"; -import { getMyUid, IS_MOBILE } from "./app"; import { WebGlGScript } from "./game-scripts/webgl-gscript"; import { MobileController } from "./controllers/playerControllers/mobileController"; import { KeyboardPlayerEntityController } from "./controllers/playerControllers/keyboardPlayerController"; -import { PlayerActionService } from "@craft/engine"; +import { getMyUid, hideElement, IS_MOBILE, showElement } from "./utils"; +import { eStartMenu } from "./elements"; -function run() { +export function run() { // Start the game + hideElement(eStartMenu); + const game = GameWrapper.makeGame(); const main_player_uid = getMyUid(); game.makeAndAddPlayer(main_player_uid); + game.update(); + + const ents = game.getEntities(); + console.log("Ents", ents); const playerActionService = new PlayerActionService(game); - const playerController = () => { + const webglGameScript = new WebGlGScript(game); + + const canvasGameScript = new CanvasGameScript( + game, + webglGameScript, + main_player_uid + ); + + game.makeAndAddGameScript(canvasGameScript); + + // const hudGameScript = new HudGScript(game, canvasGameScript, main_player_uid); + + const playerController = (() => { if (IS_MOBILE) { return new MobileController(playerActionService, game, main_player_uid); } else { return new KeyboardPlayerEntityController( playerActionService, game, - main_player_uid + main_player_uid, + canvasGameScript, + webglGameScript ); } + })(); + + // make the camera + + const update = () => { + game.update(); + playerController.update(); + canvasGameScript.update(); + canvasGameScript.renderLoop(0); + // const mesh = game.getChunkMeshFromChunkPos(4); + // console.log("Mesh", mesh); }; - const webglGameScript = new WebGlGScript(game); + setInterval(update, 1000 / 60); - const canvasGameScript = new CanvasGameScript( - game, - webglGameScript, - main_player_uid - ); + console.log("Starting"); - game.makeGameScript(canvasGameScript); + console.log(canvasGameScript); + + canvasGameScript.renderLoop(0); + // canvasGameScript.renderLoop(100); + // canvasGameScript.renderLoop(200); + // canvasGameScript.setup(); } + +run(); diff --git a/apps/web-client/src/test.html b/apps/web-client/src/test.html new file mode 100644 index 0000000..7b5b864 --- /dev/null +++ b/apps/web-client/src/test.html @@ -0,0 +1,16 @@ + + TylerCraft + + + + + + + + + + + \ No newline at end of file diff --git a/apps/web-client/src/utils.ts b/apps/web-client/src/utils.ts index 9debbfc..e342548 100644 --- a/apps/web-client/src/utils.ts +++ b/apps/web-client/src/utils.ts @@ -4,6 +4,32 @@ export function getEleOrError(id: string): T { return ele as T; } +// export function hideElement(e: HTMLElement) { +// e.style.display = "none"; +// } + +export function showElement(e: HTMLElement) { + e.classList.remove("hidden"); + e.classList.add("shown"); +} + export function hideElement(e: HTMLElement) { - e.style.display = "none"; + e.classList.add("hidden"); + e.classList.remove("shown"); +} + +// generate your unique id +const UID_KEY = "tylercraft-user-id"; +if (!localStorage.getItem(UID_KEY)) { + const randomNum = Math.floor(Math.random() * 10000000); + localStorage.setItem(UID_KEY, randomNum.toString()); +} + +export function getMyUid() { + const uid = Number(localStorage.getItem(UID_KEY)); + if (!uid) throw new Error("UID not defined"); + return uid; } + +export const IS_MOBILE = /Mobi/.test(window.navigator.userAgent); +console.log("Is Mobile: ", IS_MOBILE); diff --git a/apps/web-client/vite.config.js b/apps/web-client/vite.config.js index ac0c786..fb404fe 100644 --- a/apps/web-client/vite.config.js +++ b/apps/web-client/vite.config.js @@ -12,6 +12,12 @@ export default defineConfig({ commonjsOptions: { include: [/@craft\/engine/, /node_modules/], }, + // rollupOptions: { + // input: { + // index: "./index1.html", + // test: "./src/index2.html", + // }, + // }, }, plugins: [react(), wasm(), topLevelAwait()], worker: { diff --git a/lib/engine/camera.ts b/lib/engine/camera.ts deleted file mode 100644 index 2901bb2..0000000 --- a/lib/engine/camera.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Entity, FaceLocater } from "./entities/entity.js"; -import { Vector3D } from "./utils/vector.js"; -import { IDim } from "./types.js"; - -export interface ICameraData { - pos: IDim; - rotCart: IDim; -} - -export abstract class Camera { - // (x, y, z) - abstract pos: Vector3D; - // (dist, theta: [0, 2pi], phi: [0, pi]) - abstract rot: Vector3D; - - getCameraData(): ICameraData { - return { - pos: this.pos.data as IDim, - rotCart: this.rot.toCartesianCoords().data as IDim, - }; - } - - update(_delta: number) { - /* NO-OP */ - } - render(_camera: Camera) { - /* NO-OP */ - } - hit(_ent: Entity, _where: FaceLocater) { - /* NO-OP */ - } - - abstract rotateBy(x: number, y: number): void; -} diff --git a/lib/engine/entities/cube.ts b/lib/engine/entities/cube.ts index 926ac70..c702c2a 100644 --- a/lib/engine/entities/cube.ts +++ b/lib/engine/entities/cube.ts @@ -1,5 +1,5 @@ -import { getBlockData } from "../blockdata.js"; -import { Direction, Vector3D } from "../utils/vector.js"; +import { getBlockData } from "../src/blockdata.js"; +import { Direction, Vector3D } from "../src/vector.js"; import { IDim } from "../types.js"; import { Entity, FaceLocater } from "./entity.js"; import { BlockShape, BlockType } from "@craft/rust-world"; diff --git a/lib/engine/entities/entity.ts b/lib/engine/entities/entity.ts index b04f406..367d652 100644 --- a/lib/engine/entities/entity.ts +++ b/lib/engine/entities/entity.ts @@ -1,6 +1,6 @@ -import { Game, World } from "../index.js"; +import { Game, World } from "../src/index.js"; import { IDim } from "../types.js"; -import { Vector3D } from "../utils/vector.js"; +import { Vector3D } from "../src/vector.js"; import { Cube } from "./cube.js"; import { IEntityType } from "./entityType.js"; diff --git a/lib/engine/entities/moveableEntity.ts b/lib/engine/entities/moveableEntity.ts index c472fda..4ce8c3b 100644 --- a/lib/engine/entities/moveableEntity.ts +++ b/lib/engine/entities/moveableEntity.ts @@ -1,15 +1,11 @@ import { IDim } from "../types.js"; -import { bindValue } from "../utils.js"; -import { Vector3D } from "../utils/vector.js"; +import { bindValue } from "../src/utils.js"; +import { Vector3D } from "../src/vector.js"; import { Entity, EntityDto, MetaAction } from "./entity.js"; export interface MovableEntityDto extends EntityDto { vel: IDim; } -export interface CameraRay { - pos: { x: number; y: number; z: number }; - rot: { theta: number; phi: number }; -} export abstract class MovableEntity< T extends MovableEntityDto = MovableEntityDto @@ -48,23 +44,4 @@ export abstract class MovableEntity< this.rot.set(1, bindValue(this.rot.get(1), 0, 2 * Math.PI, true)); this.rot.set(2, bindValue(this.rot.get(2), 0, Math.PI)); } - - getRay(): CameraRay { - const eyePos = this.pos.add( - new Vector3D([this.dim[0] / 2, this.dim[1] * (9 / 10), this.dim[2] / 2]) - ); - - return { - pos: { - x: eyePos.get(0), - y: eyePos.get(1), - z: eyePos.get(2), - }, - rot: { - theta: -this.rot.get(1) + (Math.PI * 3) / 2, - // Convert to [-pi/2, pi/2] - phi: -(Math.PI / 2 - this.rot.get(2)), - }, - }; - } } diff --git a/lib/engine/entities/player/player.ts b/lib/engine/entities/player/player.ts index f818410..03c380a 100644 --- a/lib/engine/entities/player/player.ts +++ b/lib/engine/entities/player/player.ts @@ -1,16 +1,17 @@ import { IEntity } from "../entity.js"; import { IDim } from "../../types.js"; import { MovableEntity, MovableEntityDto } from "../moveableEntity.js"; -import { CONFIG } from "../../config.js"; -import { Direction, Vector3D } from "../../utils/vector.js"; +import { CONFIG } from "../../src/config.js"; +import { Direction, Vector3D } from "../../src/vector.js"; import CubeHelpers from "../cube.js"; import { Game } from "../../game.js"; import { IEntityType } from "../entityType.js"; import { BlockType } from "@craft/rust-world"; import { Item, ThrowableItem } from "../../item.js"; import { Projectile } from "../projectile.js"; -import { PlayerAction } from "./playerActions.js"; +import { PlayerAction } from "../../src/playerActions.js"; import { World } from "../../world/index.js"; +import { GameWrapper } from "../../modules.js"; export interface BeltDto { selectedBlock: Item; @@ -222,7 +223,9 @@ export class Player extends MovableEntity implements IEntity { } for (const dir of this.moveDirections) { const vel = moveDirection(dir); - desiredVel = desiredVel.add(vel); + if (vel) { + desiredVel = desiredVel.add(vel); + } } const currentVel = this.vel; @@ -310,26 +313,27 @@ export class Player extends MovableEntity implements IEntity { } } - doPrimaryAction(game: Game) { - const item = this.belt.selectedItem; + // doPrimaryAction(game: Game) { + // const item = this.belt.selectedItem; - console.log("Doing primary action", item); + // console.log("Doing primary action", item); - if (item === ThrowableItem.Fireball) { - this.fireball(game); - } else { - this.placeBlock(game, item); - } - } + // if (item === ThrowableItem.Fireball) { + // this.fireball(game); + // } else { + // this.placeBlock(game, item); + // } + // } - doSecondaryAction(game: Game) { - const ray = this.getRay(); - const lookingData = game.world.lookingAt(ray); - if (!lookingData) return; - const { cube } = lookingData; - if (!cube) return; - game.removeBlock(cube); - } + // doSecondaryAction(game: GameWrapper) { + // const ray = this.getRay(); + + // const lookingData = game.getPointedAtBlock(this.camera); + // if (!lookingData) return; + // const { cube } = lookingData; + // if (!cube) return; + // game.removeBlock(cube); + // } private actionListeners: ((action: PlayerAction) => void)[] = []; addActionListener(listener: (action: PlayerAction) => void) { @@ -346,24 +350,24 @@ export class Player extends MovableEntity implements IEntity { } // Player actions - placeBlock(game: Game, blockType: BlockType) { - const ray = this.getRay(); - const lookingData = game.world.lookingAt(ray); - if (!lookingData) return; - console.log("Looking at data", lookingData); - const { cube } = lookingData; - if (!cube) return; - - const newCubePos = lookingData.cube.pos.add( - Vector3D.fromDirection(lookingData.face) - ); + // placeBlock(game: Game, blockType: BlockType) { + // const ray = this.getRay(); + // const lookingData = game.world.lookingAt(ray); + // if (!lookingData) return; + // console.log("Looking at data", lookingData); + // const { cube } = lookingData; + // if (!cube) return; - const newCube = CubeHelpers.createCube(blockType, newCubePos); + // const newCubePos = lookingData.cube.pos.add( + // Vector3D.fromDirection(lookingData.face) + // ); - console.log("Placed Cube", newCube); + // const newCube = CubeHelpers.createCube(blockType, newCubePos); - game.placeBlock(newCube); - } + // console.log("Placed Cube", newCube); + + // game.placeBlock(newCube); + // } fireball(game: Game) { if (this.fire.count > 0) return; diff --git a/lib/engine/entities/player/playerActions.ts b/lib/engine/entities/player/playerActions.ts deleted file mode 100644 index c8980fd..0000000 --- a/lib/engine/entities/player/playerActions.ts +++ /dev/null @@ -1,238 +0,0 @@ -// Player actions are an API that lets you controll a player -// The player should know nothing about these. - -import { BlockType, Direction } from "@craft/rust-world"; -import { Game, IDim, Vector3D } from "../../index.js"; -import { MessageDto, MessageHolder } from "../../messageHelpers.js"; -import CubeHelpers from "../cube.js"; -import { Player } from "./player.js"; -import { EntityAction, GameWrapper, PlayerAction } from "../../modules.js"; - -export enum PlayerActionType { - Jump = "jump", - PlaceBlock = "placeBlock", - RemoveBlock = "removeBlock", - ToggleCreative = "toggleCreative", - Move = "move", - Rotate = "rotate", - SetPos = "setPlayerPos", - BeltLeft = "playerBeltLeft", - BeltRight = "playerBeltRight", - SetBeltIndex = "playerSetBeltIndex", - PlaceDebugBlock = "placeDebugBlock", -} - -interface BasePlayerAction { - playerUid: string; -} - -export interface PlayerActionData - extends Record { - [PlayerActionType.Rotate]: { - playerUid: string; - playerRot: IDim; - }; - [PlayerActionType.Move]: { - playerUid: string; - playerRot: IDim; - directions: Direction[]; - }; - [PlayerActionType.SetBeltIndex]: { - playerUid: string; - index: number; - }; - [PlayerActionType.BeltLeft]: { - playerUid: string; - }; - [PlayerActionType.BeltRight]: { - playerUid: string; - }; - [PlayerActionType.Jump]: { - playerUid: string; - }; - [PlayerActionType.SetPos]: { - playerUid: string; - pos: IDim; - }; - [PlayerActionType.PlaceBlock]: { - playerUid: string; - playerPos: IDim; - playerRot: IDim; - }; - [PlayerActionType.RemoveBlock]: { - playerUid: string; - playerPos: IDim; - playerRot: IDim; - }; - [PlayerActionType.PlaceDebugBlock]: { - playerUid: string; - }; -} - -export type PlayerActionDto = MessageDto; - -// export class PlayerAction extends MessageHolder< -// PlayerActionType, -// PlayerActionData -// > { -// static make(type: T, data: PlayerActionData[T]) { -// return new PlayerAction(type, data); -// } -// } - -export class PlayerActionService { - constructor(private game: GameWrapper) {} - - private playerActions = new Map< - number, - Array<(action: EntityAction) => void> - >(); - - addActionListener( - playerId: number, - listener: (action: EntityAction) => void - ) { - this.playerActions.set(playerId, [ - ...(this.playerActions.get(playerId) || []), - listener, - ]); - } - - performAction(action: EntityAction) { - this.game.handleAction(action); - - const listeners = this.playerActions.get(action.entity_id); - if (!listeners) { - return; - } - - for (const listener of listeners) { - listener(action); - } - } -} - -export abstract class PlayerController { - constructor( - protected playerActionService: PlayerActionService, - protected game: GameWrapper, - protected playerId: number - ) {} - - jump() { - const action = this.game.makeJumpAction(this.playerId); - this.playerActionService.performAction(action); - } - - rotate(x: number, y: number) { - // TO-DO - } - - move(directions: Direction[]) { - this.onAction({ Move: directions }); - } - - primaryAction() { - const action = PlayerAction.make(PlayerActionType.PlaceBlock, { - playerUid: this.player.uid, - playerPos: this.player.pos.data as IDim, - playerRot: this.player.rot.data as IDim, - }); - - this.playerActionService.performAction(action); - } - - secondaryAction() { - const action = PlayerAction.make(PlayerActionType.RemoveBlock, { - playerUid: this.player.uid, - playerPos: this.player.pos.data as IDim, - playerRot: this.player.rot.data as IDim, - }); - this.playerActionService.performAction(action); - } - - selectBelt(pos: number) { - const action = PlayerAction.make(PlayerActionType.SetBeltIndex, { - playerUid: this.player.uid, - index: pos, - }); - this.playerActionService.performAction(action); - } - - toggleCreative() { - const action = PlayerAction.make(PlayerActionType.ToggleCreative, { - playerUid: this.player.uid, - }); - this.playerActionService.performAction(action); - } -} - -const handlePlayerAction = ( - game: Game, - player: Player, - action: PlayerAction -) => { - // console.log("Handling player action", player, action); - if (action.isType(PlayerActionType.Rotate)) { - const { playerRot } = action.data; - player.rot = new Vector3D(playerRot); - return; - } - - if (action.isType(PlayerActionType.Jump)) { - player.tryJump(); - return; - } - - if (action.isType(PlayerActionType.PlaceBlock)) { - const { playerPos, playerRot } = action.data; - player.pos = new Vector3D(playerPos); - player.rot = new Vector3D(playerRot); - player.doPrimaryAction(game); - return; - } - - if (action.isType(PlayerActionType.RemoveBlock)) { - const { playerPos, playerRot } = action.data; - player.pos = new Vector3D(playerPos); - player.rot = new Vector3D(playerRot); - player.doSecondaryAction(game); - return; - } - - if (action.isType(PlayerActionType.SetPos)) { - const { pos } = action.data; - player.pos = new Vector3D(pos); - return; - } - - if (action.isType(PlayerActionType.Move)) { - const { directions, playerRot } = action.data; - // TODO this might be unnecessary - player.rot = new Vector3D(playerRot); - player.moveDirections = directions; - } - - if (action.isType(PlayerActionType.BeltLeft)) { - player.belt.moveLeft(); - } - - if (action.isType(PlayerActionType.BeltRight)) { - player.belt.moveRight(); - } - - if (action.isType(PlayerActionType.SetBeltIndex)) { - const { index } = action.data; - player.belt.setIndex(index); - } - - if (action.isType(PlayerActionType.PlaceDebugBlock)) { - const pos = player.pos.floor(); - const cube = CubeHelpers.createCube(BlockType.Gold, pos); - game.placeBlock(cube); - } - - if (action.isType(PlayerActionType.ToggleCreative)) { - player.setCreative(!player.creative); - } -}; diff --git a/lib/engine/entities/projectile.ts b/lib/engine/entities/projectile.ts index be25779..cb44124 100644 --- a/lib/engine/entities/projectile.ts +++ b/lib/engine/entities/projectile.ts @@ -1,4 +1,4 @@ -import { Game, Vector3D } from "../index.js"; +import { Game, Vector3D } from "../src/index.js"; import { World } from "../world/index.js"; import { IEntity } from "./entity.js"; import { IEntityType } from "./entityType.js"; diff --git a/lib/engine/game-scripts/parkor-gscript.ts b/lib/engine/game-scripts/parkor-gscript.ts index 15b588d..464140d 100644 --- a/lib/engine/game-scripts/parkor-gscript.ts +++ b/lib/engine/game-scripts/parkor-gscript.ts @@ -1,7 +1,7 @@ import { MovableEntity } from "../entities/moveableEntity.js"; -import { GameScript } from "../game-script.js"; +import { GameScript } from "../src/game-script.js"; import { TerrainGenModule } from "../modules.js"; -import { Vector2D, Vector3D } from "../utils/vector.js"; +import { Vector2D, Vector3D } from "../src/vector.js"; import { World } from "../world/world.js"; type Config = { diff --git a/lib/engine/game-scripts/sandbox-gscript.ts b/lib/engine/game-scripts/sandbox-gscript.ts index 2f2703c..ead4a29 100644 --- a/lib/engine/game-scripts/sandbox-gscript.ts +++ b/lib/engine/game-scripts/sandbox-gscript.ts @@ -1,5 +1,5 @@ import { MovableEntity } from "../entities/moveableEntity.js"; -import { GameScript } from "../game-script.js"; +import { GameScript } from "../src/game-script.js"; import { TerrainGenModule } from "../modules.js"; import { Vector2D, Vector3D } from "../utils/vector.js"; import { World } from "../world/world.js"; diff --git a/lib/engine/game.ts b/lib/engine/game.ts index 8434ac6..bbc5115 100644 --- a/lib/engine/game.ts +++ b/lib/engine/game.ts @@ -1,13 +1,19 @@ import { Player } from "./entities/player/player.js"; import { ISerializedWorld, World } from "./world/world.js"; -import { CONFIG, IConfig, setConfig } from "./config.js"; +import { CONFIG, IConfig, setConfig } from "./src/config.js"; import { EntityHolder, ISerializedEntities } from "./entities/entityHolder.js"; import { Random } from "./utils/random.js"; import { GameActionHandler, GameAction } from "./gameActions.js"; import { GameStateDiff, GameDiffDto } from "./gameStateDiff.js"; import CubeHelpers, { Cube } from "./entities/cube.js"; -import { Entity, EntityDto, getChunkId, ISerializedChunk } from "./index.js"; -import { GameScript } from "./game-script.js"; +import { + Entity, + EntityDto, + getChunkId, + ISerializedChunk, +} from "./src/index.js"; +import { GameScript } from "./src/game-script.js"; +import { GameWrapper } from "./modules.js"; export interface ISerializedGame { name: string; @@ -79,7 +85,7 @@ export class Game { } public addGameScript( - script: new (game: Game, ...args: Args) => T, + script: new (game: GameWrapper, ...args: Args) => T, ...args: Args ): T { const s = new script(this, ...args); @@ -88,7 +94,7 @@ export class Game { } public getGameScript( - script: new (game: Game, ...args: Args) => T + script: new (game: GameWrapper, ...args: Args) => T ): T { for (const s of this.gameScripts) { if (s instanceof script) { diff --git a/lib/engine/gameStateDiff.ts b/lib/engine/gameStateDiff.ts index fa4c722..cc2373e 100644 --- a/lib/engine/gameStateDiff.ts +++ b/lib/engine/gameStateDiff.ts @@ -1,6 +1,6 @@ import { EntityDto } from "./entities/entity.js"; import { Game } from "./game.js"; -import { Vector2D } from "./utils/vector.js"; +import { Vector2D } from "./src/vector.js"; import { getChunkId, ISerializedChunk } from "./world/chunk.js"; export interface GameDiffDto { diff --git a/lib/engine/index.ts b/lib/engine/index.ts deleted file mode 100644 index c0e7627..0000000 --- a/lib/engine/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -export * from "./controllers/controller.js"; -export * from "./controllers/emptyController.js"; -export * from "./game-script.js"; -export * from "./gameActions.js"; -export * from "./gameStateDiff.js"; -export * from "./blockdata.js"; -export * from "./camera.js"; -export * from "./config.js"; -export * from "./game.js"; -export * from "./gameActions.js"; -export * from "./game-scripts/sandbox-gscript.js"; -export * from "./types.js"; -export * from "./world/index.js"; -export * from "./utils/vector.js"; -export * from "./utils/face.js"; -export * from "./utils/random.js"; -export * from "./utils.js"; -export * from "./entities/cube.js"; -export * from "./entities/entity.js"; -export * from "./entities/entityHolder.js"; -export * from "./entities/entityType.js"; -export * from "./entities/entityController.js"; -export * from "./entities/moveableEntity.js"; -export * from "./entities/player/player.js"; -export * from "./entities/player/playerActions.js"; -export * from "./entities/projectile.js"; -export * from "./entities/spectator.js"; -export { WorldModule, TerrainGenModule } from "./modules.js"; diff --git a/lib/engine/modules.ts b/lib/engine/modules.ts index 9ca263e..e69de29 100644 --- a/lib/engine/modules.ts +++ b/lib/engine/modules.ts @@ -1,200 +0,0 @@ -import * as WorldWasm from "@craft/rust-world"; -import { Vector3D } from "./utils/vector.js"; -export * as WorldModuleTypes from "@craft/rust-world"; - -async function loadWasmModule(module: any, name = "") { - console.log("Loading Wasm Module: ", name); - const loadedModule = module.default ? await module.default : await module; - console.log(`Loaded Wasm Module: ${name} 🎉`); - return loadedModule; -} -export interface ISerializedChunk { - position: { - x: number; - y: number; - }; - blocks: WorldWasm.BlockType[]; - block_data: ("None" | { Image: string })[]; -} - -type ISerializedChunkHolder = ISerializedChunk[]; - -export interface ISerializedWorld { - chunks: ISerializedChunkHolder; -} - -export type SerializedGame = { - world: ISerializedWorld; - players: Player[]; -}; - -export type PlayerAction = WorldWasm.PlayerJumpAction; - -export type EntityAction = WorldWasm.EntityAction; - -export type GameDiff = { - updated_entities: number[]; - updated_chunks: number[]; -}; - -export type GameScript = { - onDiff: (diff: GameDiff) => void; -}; - -export type Cube = { - type: WorldWasm.BlockType; - pos: Vector3D; -}; - -export type ChunkMesh = { - mesh: Array<{ block: Cube; faces: WorldWasm.Direction[] }>; - chunkPos: { x: number; y: number }; -}; - -export type Player = { - speed: number; - max_speed: number; - gravity: number; - uid: number; - pos: { - x: number; - y: number; - z: number; - }; - dim: { - x: number; - y: number; - z: number; - }; - rot: { - theta: number; - phi: number; - }; - vel: { - x: number; - y: number; - z: number; - }; - is_flying: boolean; - on_ground: boolean; - moving_directions: WorldWasm.Direction[]; -}; - -export class GameWrapper { - constructor(private game: WorldWasm.Game) {} - - static makeGame(): GameWrapper { - const game = WorldWasm.Game.new_wasm(); - return new GameWrapper(game); - } - - makeAndAddPlayer(uid: number) { - this.game.make_and_add_player_wasm(uid); - } - - makeJumpAction(entityId: number) { - return WorldWasm.PlayerJumpAction.make_wasm(entityId); - } - - handleAction(action: WorldWasm.EntityAction) { - this.game.handle_action_wasm(action); - } - - makeGameScript(script: GameScript) { - return WorldWasm.WasmGameScript.make(script); - } - - addGameScript(script: WorldWasm.WasmGameScript) { - this.game.add_game_script_wasm(script); - } - - getChunkMeshFromChunkId(chunkId: number): ChunkMesh { - const big = BigInt(chunkId); - return this.game.get_chunk_mesh_from_chunk_id(big); - } - - addPlayer(player: WorldWasm.Player) { - this.game.add_player_wasm(player); - } - - getPlayer(uid: number): WorldWasm.Player { - return this.game.get_player_wasm(uid); - } -} - -// Wrapper class for world logic -// class WorldModuleClass { -// private _module: typeof WorldWasm | null = null; - -// private get module() { -// if (!this._module) { -// throw new Error("Module not loaded"); -// } -// return this._module; -// } - -// async load(): Promise { -// if (this._module) return; -// this._module = await loadWasmModule(WorldWasm, "World"); -// } - -// public createWorld(data?: ISerializedWorld) { -// console.log("Creating wasm world"); -// const wasmWorld = WorldModule.module.World.new_wasm(); -// const world = new World(wasmWorld, data); -// return world; -// } - -// public createPlayer(uid: number) { -// const player = WorldModule.module.Player.make(uid); -// return player; -// } -// } - -// export const WorldModule = new WorldModuleClass(); - -// class TerrainGenModuleClass { -// private _module: typeof TerrainGenWasm | null = null; - -// private get module() { -// if (!this._module) { -// throw new Error("Terrain gen module not loaded"); -// } -// return this._module; -// } - -// public async load(): Promise { -// if (this._module) return; -// this._module = await loadWasmModule(TerrainGenWasm, "TerrainGen"); -// } - -// getParkorTerrainGenerator(seed: number) { -// const terrainGenerator = this.module.ParkorChunkGetter.new(); - -// return { -// getChunk: (chunkPos: Vector2D) => { -// console.log("Generating Chunk", chunkPos); -// const chunk = terrainGenerator -// .get_chunk_wasm(chunkPos.get(0), chunkPos.get(1)) -// .serialize(); -// return chunk as unknown as ISerializedChunk; -// }, -// }; -// } - -// getTerrainGenerator(seed: number, flatWorld: boolean) { -// const terrainGenerator = new this.module.TerrainGenerator(seed, flatWorld); - -// return { -// getChunk: (chunkPos: Vector2D) => { -// console.log("Generating Chunk", chunkPos); -// const chunk = terrainGenerator -// .get_chunk(chunkPos.get(0), chunkPos.get(1)) -// .serialize(); -// return chunk as unknown as ISerializedChunk; -// }, -// }; -// } -// } - -// export const TerrainGenModule = new TerrainGenModuleClass(); diff --git a/lib/engine/blockdata.ts b/lib/engine/src/blockdata.ts similarity index 100% rename from lib/engine/blockdata.ts rename to lib/engine/src/blockdata.ts diff --git a/lib/engine/src/camera.ts b/lib/engine/src/camera.ts new file mode 100644 index 0000000..3b0b1a2 --- /dev/null +++ b/lib/engine/src/camera.ts @@ -0,0 +1,69 @@ +import { CONFIG } from "./config.js"; +import { PlayerWrapper } from "./wrappers.js"; +import { Vector3D } from "./vector.js"; + +export type Camera = { + // (x, y, z) + pos: Vector3D; + // (dist, theta: [0, 2pi], phi: [0, pi]) + rot: Vector3D; +}; + +const getPlayerOffset = (player: PlayerWrapper) => { + return new Vector3D([ + player.dim.get(0) / 2, + player.dim.get(1) * (9 / 10), + player.dim.get(2) / 2, + ]); +}; + +export const makeCameraForPlayer = (player: PlayerWrapper) => { + return { + pos: player.pos.add(getPlayerOffset(player)), + rot: player.rot, + }; +}; + +export const makeThirdPersonBackCamera = ( + player: PlayerWrapper, + dist = CONFIG.player.thirdPersonCamDist +) => { + const rot = player.rot; + const pos = player.rot + .add(new Vector3D([dist, 0, 0])) + .toCartesianCoords() + .multiply(new Vector3D([1, -1, 1])) + .add(getPlayerOffset(player)) + .add(player.pos); + return { + pos, + rot, + }; +}; + +export const makeThirdPersonFrontCamera = ( + player: PlayerWrapper, + dist = CONFIG.player.thirdPersonCamDist +) => { + const rot = player.rot.add(new Vector3D([0, Math.PI, 0])); + const pos = player.rot + .add(new Vector3D([dist, Math.PI, 0])) + .toCartesianCoords() + .multiply(new Vector3D([1, -1, 1])) + .add(getPlayerOffset(player)) + .add(player.pos); + + return { + pos, + rot, + }; +}; + +export const makeXRCamera = (player: PlayerWrapper): Camera => { + const pos = getPlayerOffset(player).add(player.pos); + const rot = player.rot; + return { + pos, + rot, + }; +}; diff --git a/lib/engine/config.ts b/lib/engine/src/config.ts similarity index 100% rename from lib/engine/config.ts rename to lib/engine/src/config.ts diff --git a/lib/engine/game-script.ts b/lib/engine/src/game-script.ts similarity index 55% rename from lib/engine/game-script.ts rename to lib/engine/src/game-script.ts index 4129548..ec7bd5b 100644 --- a/lib/engine/game-script.ts +++ b/lib/engine/src/game-script.ts @@ -1,6 +1,4 @@ -import { GameAction } from "./gameActions.js"; -import { Entity, Game, GameStateDiff } from "./index.js"; -import { GameWrapper } from "./modules.js"; +import { GameWrapper } from "./wrappers.js"; export type GameScriptConfig = Record | undefined; @@ -21,13 +19,13 @@ export abstract class GameScript< // Called for every game loop update?(delta: number): void; - onGameAction?(action: GameAction): void; + // onGameAction?(action: GameAction): void; - onGameStateDiff?(stateDiff: GameStateDiff): void; + // onGameStateDiff?(stateDiff: GameStateDiff): void; - onNewEntity?(entity: Entity): void; + // onNewEntity?(entity: Entity): void; - onRemovedEntity?(entity: Entity): void; + // onRemovedEntity?(entity: Entity): void; - onChunkUpdate?(chunkId: number): void; + // onChunkUpdate?(chunkId: number): void; } diff --git a/lib/engine/src/index.ts b/lib/engine/src/index.ts new file mode 100644 index 0000000..d08de8f --- /dev/null +++ b/lib/engine/src/index.ts @@ -0,0 +1,9 @@ +export * from "./camera.js"; +export * from "./config.js"; +export * from "./vector.js"; +export * from "./wrappers.js"; +export * from "./playerActions.js"; +export * from "./utils.js"; +export * from "./blockdata.js"; +export * from "./socket-types.js"; +export * from "./game-script.js"; diff --git a/lib/engine/src/playerActions.ts b/lib/engine/src/playerActions.ts new file mode 100644 index 0000000..04b96f4 --- /dev/null +++ b/lib/engine/src/playerActions.ts @@ -0,0 +1,244 @@ +import { Direction } from "@craft/rust-world"; +import { EntityAction, GameWrapper } from "./wrappers.js"; + +// export enum PlayerActionType { +// Jump = "jump", +// PlaceBlock = "placeBlock", +// RemoveBlock = "removeBlock", +// ToggleCreative = "toggleCreative", +// Move = "move", +// Rotate = "rotate", +// SetPos = "setPlayerPos", +// BeltLeft = "playerBeltLeft", +// BeltRight = "playerBeltRight", +// SetBeltIndex = "playerSetBeltIndex", +// PlaceDebugBlock = "placeDebugBlock", +// } + +// interface BasePlayerAction { +// playerUid: string; +// } + +// export interface PlayerActionData +// extends Record { +// [PlayerActionType.Rotate]: { +// playerUid: string; +// playerRot: IDim; +// }; +// [PlayerActionType.Move]: { +// playerUid: string; +// playerRot: IDim; +// directions: Direction[]; +// }; +// [PlayerActionType.SetBeltIndex]: { +// playerUid: string; +// index: number; +// }; +// [PlayerActionType.BeltLeft]: { +// playerUid: string; +// }; +// [PlayerActionType.BeltRight]: { +// playerUid: string; +// }; +// [PlayerActionType.Jump]: { +// playerUid: string; +// }; +// [PlayerActionType.SetPos]: { +// playerUid: string; +// pos: IDim; +// }; +// [PlayerActionType.PlaceBlock]: { +// playerUid: string; +// playerPos: IDim; +// playerRot: IDim; +// }; +// [PlayerActionType.RemoveBlock]: { +// playerUid: string; +// playerPos: IDim; +// playerRot: IDim; +// }; +// [PlayerActionType.PlaceDebugBlock]: { +// playerUid: string; +// }; +// } + +// export type PlayerActionDto = MessageDto; + +// export class PlayerAction extends MessageHolder< +// PlayerActionType, +// PlayerActionData +// > { +// static make(type: T, data: PlayerActionData[T]) { +// return new PlayerAction(type, data); +// } +// } + +export class PlayerActionService { + constructor(private game: GameWrapper) {} + + private playerActions = new Map< + number, + Array<(action: EntityAction) => void> + >(); + + addActionListener( + playerId: number, + listener: (action: EntityAction) => void + ) { + this.playerActions.set(playerId, [ + ...(this.playerActions.get(playerId) || []), + listener, + ]); + } + + performAction(action: EntityAction) { + this.game.handleAction(action); + + const listeners = this.playerActions.get(action.entity_id); + if (!listeners) { + return; + } + + for (const listener of listeners) { + listener(action); + } + } +} + +export abstract class PlayerController { + constructor( + protected playerActionService: PlayerActionService, + protected game: GameWrapper, + protected playerId: number + ) {} + + jump() { + const action = this.game.makeJumpAction(this.playerId); + this.playerActionService.performAction(action); + } + + rotate(x: number, y: number) { + // TO-DO + const action = this.game.makeRotateAction(this.playerId, x, y); + this.playerActionService.performAction(action); + } + + move(directions: Direction[]) { + // TO-DO + } + + beltRight() { + // TO-DO + } + + beltLeft() { + // TO-DO + } + + debugBlock() { + // TO-DO + } + + primaryAction() { + // const action = PlayerAction.make(PlayerActionType.PlaceBlock, { + // playerUid: this.player.uid, + // playerPos: this.player.pos.data as IDim, + // playerRot: this.player.rot.data as IDim, + // }); + // this.playerActionService.performAction(action); + } + + secondaryAction() { + // const action = PlayerAction.make(PlayerActionType.RemoveBlock, { + // playerUid: this.player.uid, + // playerPos: this.player.pos.data as IDim, + // playerRot: this.player.rot.data as IDim, + // }); + // this.playerActionService.performAction(action); + } + + selectBelt(pos: number) { + // const action = PlayerAction.make(PlayerActionType.SetBeltIndex, { + // playerUid: this.player.uid, + // index: pos, + // }); + // this.playerActionService.performAction(action); + } + + toggleCreative() { + // const action = PlayerAction.make(PlayerActionType.ToggleCreative, { + // playerUid: this.player.uid, + // }); + // this.playerActionService.performAction(action); + } +} + +// const handlePlayerAction = ( +// game: Game, +// player: Player, +// action: PlayerAction +// ) => { +// // console.log("Handling player action", player, action); +// if (action.isType(PlayerActionType.Rotate)) { +// const { playerRot } = action.data; +// player.rot = new Vector3D(playerRot); +// return; +// } + +// if (action.isType(PlayerActionType.Jump)) { +// player.tryJump(); +// return; +// } + +// if (action.isType(PlayerActionType.PlaceBlock)) { +// const { playerPos, playerRot } = action.data; +// player.pos = new Vector3D(playerPos); +// player.rot = new Vector3D(playerRot); +// player.doPrimaryAction(game); +// return; +// } + +// if (action.isType(PlayerActionType.RemoveBlock)) { +// const { playerPos, playerRot } = action.data; +// player.pos = new Vector3D(playerPos); +// player.rot = new Vector3D(playerRot); +// player.doSecondaryAction(game); +// return; +// } + +// if (action.isType(PlayerActionType.SetPos)) { +// const { pos } = action.data; +// player.pos = new Vector3D(pos); +// return; +// } + +// if (action.isType(PlayerActionType.Move)) { +// const { directions, playerRot } = action.data; +// // TODO this might be unnecessary +// player.rot = new Vector3D(playerRot); +// player.moveDirections = directions; +// } + +// if (action.isType(PlayerActionType.BeltLeft)) { +// player.belt.moveLeft(); +// } + +// if (action.isType(PlayerActionType.BeltRight)) { +// player.belt.moveRight(); +// } + +// if (action.isType(PlayerActionType.SetBeltIndex)) { +// const { index } = action.data; +// player.belt.setIndex(index); +// } + +// if (action.isType(PlayerActionType.PlaceDebugBlock)) { +// const pos = player.pos.floor(); +// const cube = CubeHelpers.createCube(BlockType.Gold, pos); +// game.placeBlock(cube); +// } + +// if (action.isType(PlayerActionType.ToggleCreative)) { +// player.setCreative(!player.creative); +// } +// }; diff --git a/lib/engine/src/socket-types.ts b/lib/engine/src/socket-types.ts new file mode 100644 index 0000000..775fcca --- /dev/null +++ b/lib/engine/src/socket-types.ts @@ -0,0 +1,98 @@ +import { IConfig } from "./config.js"; + +export interface MessageDto< + MESSAGE extends string, + DATA extends Record +> { + readonly type: MESSAGE; + readonly data: DATA[MESSAGE]; +} + +export class MessageHolder> { + constructor(public type: T, public data: DATA[T]) {} + + getDto() { + return { + type: this.type, + data: this.data, + }; + } + + isType(type: U): this is MessageHolder { + return type === this.type; + } +} + +export enum ISocketMessageType { + // from client + getChunk = "getChunk", // server sends setChunk + newWorld = "newWorld", // server sends welcome + saveWorld = "saveWorld", + // this could be for joining an existing world or starting up an old one + joinWorld = "joinWorld", // server sends welcome or worldNotFound + // from server + welcome = "welcome", + worldNotFound = "worldNotFound", + gameDiff = "gameDiff", + setChunk = "setChunk", + newPlayer = "newPlayer", + playerLeave = "playerLeave", + // both + actions = "actions", + playerActions = "playerActions", +} + +export interface SocketMessageData extends Record { + [ISocketMessageType.joinWorld]: { + myUid: string; + worldId: string; + }; + [ISocketMessageType.newWorld]: { + myUid: string; + config: IConfig; + name: string; + }; + [ISocketMessageType.saveWorld]: { + worldId: string; + }; + [ISocketMessageType.getChunk]: { + pos: string; + }; + // [ISocketMessageType.welcome]: ISocketWelcomePayload; + // [ISocketMessageType.worldNotFound]: {}; + // [ISocketMessageType.setChunk]: { + // pos: string; + // data: ISerializedChunk; + // }; + // [ISocketMessageType.newPlayer]: { + // uid: string; + // }; + // [ISocketMessageType.playerLeave]: { + // uid: string; + // }; + // [ISocketMessageType.gameDiff]: GameDiffDto; + // [ISocketMessageType.actions]: GameActionDto; + // [ISocketMessageType.playerActions]: PlayerActionDto; +} + +// export interface ISocketWelcomePayload { +// uid: string; +// game: ISerializedGame; +// } + +export type SocketMessageDto = MessageDto< + ISocketMessageType, + SocketMessageData +>; + +export class SocketMessage extends MessageHolder< + ISocketMessageType, + SocketMessageData +> { + static make( + type: T, + data: SocketMessageData[T] + ) { + return new SocketMessage(type, data); + } +} diff --git a/lib/engine/utils.ts b/lib/engine/src/utils.ts similarity index 98% rename from lib/engine/utils.ts rename to lib/engine/src/utils.ts index c41d556..ab9c73a 100644 --- a/lib/engine/utils.ts +++ b/lib/engine/src/utils.ts @@ -1,4 +1,4 @@ -import { IDim } from "./types.js"; +export type IDim = [number, number, number]; export function roundToNPlaces(num: number, n: number) { return Math.round((num + Number.EPSILON) * 10 ** n) / 10 ** n; diff --git a/lib/engine/utils/vector.ts b/lib/engine/src/vector.ts similarity index 88% rename from lib/engine/utils/vector.ts rename to lib/engine/src/vector.ts index 34480c0..833974c 100644 --- a/lib/engine/utils/vector.ts +++ b/lib/engine/src/vector.ts @@ -1,36 +1,6 @@ type IDim = [number, number, number]; - -// type VectorIndex = bigint; export type VectorIndex = string; -export const getDirectionFromString = (dir: string): Direction => { - switch (dir) { - case "Up": - return Direction.Up; - case "Down": - return Direction.Down; - case "West": - return Direction.Left; - case "East": - return Direction.Right; - case "North": - return Direction.Forwards; - case "South": - return Direction.Backwards; - default: - throw new Error(`Invalid direction: ${dir}`); - } -}; - -export const ALL_DIRECTIONS = [ - Direction.Forwards, - Direction.Backwards, - Direction.Left, - Direction.Right, - Direction.Up, - Direction.Down, -]; - export class Vector { static xVectors = [ [1, 0, 1], @@ -345,24 +315,6 @@ export class Vector3D extends Vector<[number, number, number]> { return new Vector3D(ords); } - static fromDirection(direction: Direction): Vector3D { - console.log("From direction", direction); - switch (direction) { - case Direction.Forwards: - return new Vector3D([0, 0, 1]); - case Direction.Backwards: - return new Vector3D([0, 0, -1]); - case Direction.Right: - return new Vector3D([1, 0, 0]); - case Direction.Left: - return new Vector3D([-1, 0, 0]); - case Direction.Up: - return new Vector3D([0, 1, 0]); - case Direction.Down: - return new Vector3D([0, -1, 0]); - } - } - toIndex(): VectorIndex { // const part1 = BigInt(this.data[0]) << (32n + 8n); // 32 bits // const part2 = BigInt(this.data[1]) << (32n); // 8 bits diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts new file mode 100644 index 0000000..ad64c5b --- /dev/null +++ b/lib/engine/src/wrappers.ts @@ -0,0 +1,310 @@ +import * as WorldWasm from "@craft/rust-world"; +import { Vector2D, Vector3D } from "./vector.js"; +import { Camera } from "./camera.js"; +import { GameScript } from "./game-script.js"; +export * as WorldModuleTypes from "@craft/rust-world"; + +export interface ISerializedChunk { + position: { + x: number; + y: number; + }; + blocks: WorldWasm.BlockType[]; + block_data: ("None" | { Image: string })[]; +} + +type RustPos = { + x: number; + y: number; + z: number; +}; + +type ISerializedChunkHolder = ISerializedChunk[]; + +export interface ISerializedWorld { + chunks: ISerializedChunkHolder; +} + +export type SerializedGame = { + world: ISerializedWorld; + players: PlayerWrapper[]; +}; + +export type PlayerAction = WorldWasm.PlayerJumpAction; + +export type EntityAction = WorldWasm.EntityAction; + +export type GameDiff = { + updated_entities: number[]; + updated_chunks: number[]; +}; + +export interface ILookingAtData { + cube: Cube; + face: WorldWasm.Direction; + dist: number; +} + +export type ISerializedVisibleFaces = Array<{ + world_pos: RustPos; + faces: [boolean, boolean, boolean, boolean, boolean, boolean]; +}>; + +export type GameDiffWrapper = { + updated_entities: number[]; + updated_chunks: number[]; +}; + +// export type GameScript = { +// onDiff: (diff: GameDiff) => void; +// }; + +export type Cube = { + type: WorldWasm.BlockType; + pos: Vector3D; +}; + +// export type ChunkMesh = { +// mesh: Array<{ block: Cube; faces: WorldWasm.Direction[] }>; +// chunkPos: { x: number; y: number }; +// }; + +type RustChunkMesh = Array<[RustBlock, { data: boolean[] }]>; + +export class ChunkMeshWrapper { + mesh: Array<[BlockWrapper, WorldWasm.Direction[]]>; + + constructor(mesh: RustChunkMesh) { + this.mesh = mesh.map(([block, faces]) => [ + new BlockWrapper(block), + faces.data.map((_, i) => i as WorldWasm.Direction), + ]); + } +} + +export class PlayerWrapper { + speed = 0; + max_speed = 0; + gravity = 0; + uid = 0; + pos: Vector3D = new Vector3D([0, 0, 0]); + dim: Vector3D = new Vector3D([0, 0, 0]); + rot: Vector3D = new Vector3D([0, 0, 0]); + is_flying = false; + on_ground = false; + distanceMoved = 0; + moving_directions: WorldWasm.Direction[] = []; + + constructor(player: WorldWasm.Player) { + // console.log("Constructing Player NOT DONE", player); + } +} + +type RustBlock = { + block_type: WorldWasm.BlockType; + extra_data: string; + world_pos: RustPos; +}; + +export class BlockWrapper { + pos: Vector3D; + type: WorldWasm.BlockType; + + constructor(block: RustBlock) { + this.pos = new Vector3D([ + block.world_pos.x, + block.world_pos.y, + block.world_pos.z, + ]); + this.type = block.block_type; + } +} + +export class GameWrapper { + constructor(private game: WorldWasm.Game) {} + + static makeGame(): GameWrapper { + const game = WorldWasm.Game.new_wasm(); + return new GameWrapper(game); + } + + update() { + this.game.update_wasm(); + } + + makeAndAddPlayer(uid: number) { + this.game.make_and_add_player_wasm(uid); + } + + makeJumpAction(entityId: number) { + return WorldWasm.PlayerJumpAction.make_wasm(entityId); + } + + makeRotateAction(entityId: number, x: number, y: number) { + return WorldWasm.PlayerRotAction.make_wasm(entityId, x, y); + } + + handleAction(action: WorldWasm.EntityAction) { + this.game.handle_action_wasm(action); + } + + getChunkPosFromChunkId(chunkId: number): Vector2D { + const data: { x: number; y: number } = this.game.get_chunk_pos_from_id_wasm( + BigInt(chunkId) + ); + return new Vector2D([data.x, data.y]); + } + + getChunkIdFromChunkPos(chunkPos: Vector2D): number { + const data = { + x: chunkPos.get(0), + y: chunkPos.get(1), + }; + return Number(this.game.get_chunk_id_from_chunk_pos_wasm(data)); + } + + makeAndAddGameScript(script: GameScript) { + const wasmScript = WorldWasm.WasmGameScript.make(script); + this.game.add_game_script_wasm(wasmScript); + } + + getChunkMeshFromChunkPos(chunkId: number): ChunkMeshWrapper { + const id = BigInt(chunkId); + console.log("Getting chunk mesh", chunkId); + const val = this.game.get_chunk_mesh_by_chunkid_wasm(id); + console.log("Got chunk mesh", val); + return new ChunkMeshWrapper(val); + } + + addPlayer(player: WorldWasm.Player) { + this.game.add_player_wasm(player); + } + + getPlayer(uid: number): PlayerWrapper { + const player: WorldWasm.Player = this.game.get_player_wasm(uid); + return new PlayerWrapper(player); + } + + getBlock(pos: Vector3D): BlockWrapper { + const block = this.game.get_block_wasm(pos.get(0), pos.get(1), pos.get(1)); + return new BlockWrapper(block); + } + + getEntities(): PlayerWrapper[] { + const entities: WorldWasm.Player[] = this.game.get_entities_wasm(); + return entities.map((entity) => new PlayerWrapper(entity)); + } + + getLoadedChunkIds(): number[] { + const chunkIds = this.game.get_loaded_chunk_ids_wasm(); + return Array.from(chunkIds).map(Number); + } + + getPointedAtBlock(camera: Camera): ILookingAtData { + // todo + throw new Error("Not implemented"); + } + + getWorldPosFromChunkPos(chunkPos: Vector2D): Vector3D { + const world_pos = this.game.get_world_pos_from_chunk_pos_wasm( + chunkPos.get(0), + chunkPos.get(1) + ); + + return new Vector3D([world_pos.x, world_pos.y, world_pos.z]); + } + + getChunkPosFromWorldPos(worldPos: Vector3D): Vector2D { + const chunk_pos = this.game.get_chunk_pos_from_world_pos_wasm( + worldPos.get(0), + worldPos.get(1), + worldPos.get(2) + ); + + return new Vector2D([chunk_pos.x, chunk_pos.y]); + } +} + +// async function loadWasmModule(module: any, name = "") { +// console.log("Loading Wasm Module: ", name); +// const loadedModule = module.default ? await module.default : await module; +// console.log(`Loaded Wasm Module: ${name} 🎉`); +// return loadedModule; +// } + +// Wrapper class for world logic +// class WorldModuleClass { +// private _module: typeof WorldWasm | null = null; + +// private get module() { +// if (!this._module) { +// throw new Error("Module not loaded"); +// } +// return this._module; +// } + +// async load(): Promise { +// if (this._module) return; +// this._module = await loadWasmModule(WorldWasm, "World"); +// } + +// public createWorld(data?: ISerializedWorld) { +// console.log("Creating wasm world"); +// const wasmWorld = WorldModule.module.World.new_wasm(); +// const world = new World(wasmWorld, data); +// return world; +// } + +// public createPlayer(uid: number) { +// const player = WorldModule.module.Player.make(uid); +// return player; +// } +// } + +// export const WorldModule = new WorldModuleClass(); + +// class TerrainGenModuleClass { +// private _module: typeof TerrainGenWasm | null = null; + +// private get module() { +// if (!this._module) { +// throw new Error("Terrain gen module not loaded"); +// } +// return this._module; +// } + +// public async load(): Promise { +// if (this._module) return; +// this._module = await loadWasmModule(TerrainGenWasm, "TerrainGen"); +// } + +// getParkorTerrainGenerator(seed: number) { +// const terrainGenerator = this.module.ParkorChunkGetter.new(); + +// return { +// getChunk: (chunkPos: Vector2D) => { +// console.log("Generating Chunk", chunkPos); +// const chunk = terrainGenerator +// .get_chunk_wasm(chunkPos.get(0), chunkPos.get(1)) +// .serialize(); +// return chunk as unknown as ISerializedChunk; +// }, +// }; +// } + +// getTerrainGenerator(seed: number, flatWorld: boolean) { +// const terrainGenerator = new this.module.TerrainGenerator(seed, flatWorld); + +// return { +// getChunk: (chunkPos: Vector2D) => { +// console.log("Generating Chunk", chunkPos); +// const chunk = terrainGenerator +// .get_chunk(chunkPos.get(0), chunkPos.get(1)) +// .serialize(); +// return chunk as unknown as ISerializedChunk; +// }, +// }; +// } +// } + +// export const TerrainGenModule = new TerrainGenModuleClass(); diff --git a/lib/engine/tsconfig.json b/lib/engine/tsconfig.json index 55a70d3..25e5168 100644 --- a/lib/engine/tsconfig.json +++ b/lib/engine/tsconfig.json @@ -2,10 +2,11 @@ "extends": "../../tsconfig.json", "compilerOptions": { "outDir": "./dist", + "rootDir": "./src", "composite": true, "skipLibCheck": true, "module": "NodeNext" }, "exclude": ["dist/**"], - "include": ["./**/*.ts"] + "include": ["src/**/*.ts"] } diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo new file mode 100644 index 0000000..556663d --- /dev/null +++ b/lib/engine/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c5f0d301835cbd0cd4a65e2312add9880ac06b9139df61fb67fd8f221d16cf1","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"78710cec70833643e347d5e6d6bf8041301d0d4b75f3c1600a3dcb8bf03fc362","signature":"f8bdf03cb8caf7408c197c78529a238f7e15e48e2b14495af9e1bfa07962f820","impliedFormat":99},{"version":"a031eb7acadc8468d1870bb0a79c173fa94b7eee80634d40cb5921b83c85ab30","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"7484717fcd4e2c209b77eac1389101e18238e203102d5736107656bc7524508e","signature":"416c090664e32b92f521f38b7888aa24f792987da90331eea9980d1bec400979","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file diff --git a/lib/engine/types.ts b/lib/engine/types.ts index e028cbb..bdd91be 100644 --- a/lib/engine/types.ts +++ b/lib/engine/types.ts @@ -1,6 +1,6 @@ -import { IConfig } from "./config.js"; +import { IConfig } from "./src/config.js"; import { EntityDto } from "./entities/entity.js"; -import { PlayerActionDto } from "./entities/player/playerActions.js"; +import { PlayerActionDto } from "./src/playerActions.js"; import { Game, IContructGameOptions, @@ -12,8 +12,6 @@ import { GameDiffDto } from "./gameStateDiff.js"; import { MessageDto, MessageHolder } from "./messageHelpers.js"; import { ISerializedChunk } from "./world/chunk.js"; -export type IDim = [number, number, number]; - // Defs // There are actions and state changes // Actions are sent to the server to be converted to state changes that are then sent to the clients diff --git a/lib/engine/utils/random.ts b/lib/engine/utils/random.ts index ffae915..af35809 100644 --- a/lib/engine/utils/random.ts +++ b/lib/engine/utils/random.ts @@ -1,6 +1,6 @@ import seedrandom from "seedrandom"; import random from "random"; -import { CONFIG } from "../config.js"; +import { CONFIG } from "../src/config.js"; import simplexNoise from "simplex-noise"; class RandomClass { diff --git a/lib/engine/world/biome.ts b/lib/engine/world/biome.ts index 0195a55..2e4dbec 100644 --- a/lib/engine/world/biome.ts +++ b/lib/engine/world/biome.ts @@ -1,5 +1,5 @@ import { Random } from "../utils/random.js"; -import { Vector2D, VectorIndex } from "../utils/vector.js"; +import { Vector2D, VectorIndex } from "../src/vector.js"; export enum Biome { Plains, diff --git a/lib/engine/world/chunk.ts b/lib/engine/world/chunk.ts deleted file mode 100644 index 911c7db..0000000 --- a/lib/engine/world/chunk.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Cube } from "../entities/cube.js"; -import { Direction, Vector2D } from "../utils/vector.js"; -import { BlockType } from "@craft/rust-world"; -export interface ILookingAtData { - cube: Cube; - face: Direction; - dist: number; -} - -export const getChunkId = (serChunk: ISerializedChunk) => { - const vec = new Vector2D([serChunk.position.x, serChunk.position.y]); - return vec.toIndex(); -}; - -export type ISerializedVisibleFaces = Array<{ - world_pos: { x: 0; y: 0; z: 0 }; - faces: [boolean, boolean, boolean, boolean, boolean, boolean]; -}>; diff --git a/lib/engine/world/terrainGenerator.ts b/lib/engine/world/terrainGenerator.ts index ec39867..5e96145 100644 --- a/lib/engine/world/terrainGenerator.ts +++ b/lib/engine/world/terrainGenerator.ts @@ -1,5 +1,5 @@ -import { Vector2D, Vector3D } from "../utils/vector.js"; -import { CONFIG } from "../config.js"; +import { Vector2D, Vector3D } from "../src/vector.js"; +import { CONFIG } from "../src/config.js"; import { Random } from "../utils/random.js"; import CubeHelpers, { Cube } from "../entities/cube.js"; import { World } from "./world.js"; diff --git a/lib/engine/world/world.ts b/lib/engine/world/world.ts index dbe8935..649f194 100644 --- a/lib/engine/world/world.ts +++ b/lib/engine/world/world.ts @@ -5,16 +5,11 @@ import CubeHelpers, { } from "../entities/cube.js"; import { ILookingAtData, ISerializedChunk } from "./chunk.js"; import { Entity } from "../entities/entity.js"; -import { CONFIG } from "../config.js"; -import { - Vector3D, - Vector2D, - Direction, - getDirectionFromString, -} from "../utils/vector.js"; +import { CONFIG } from "../src/config.js"; +import { Vector3D, Vector2D, Direction } from "../src/vector.js"; import { WorldModule, WorldModuleTypes } from "../modules.js"; import { ChunkMesh } from "./chunkMesh.js"; -import { CameraRay } from "../index.js"; +import { CameraRay } from "../src/index.js"; export class World { static make(data?: ISerializedWorld): World { @@ -210,21 +205,21 @@ export class World { return diff.chunk_ids; } - lookingAt(camera: CameraRay): ILookingAtData | null { - const lookingData: { - block: ISerializedCube; - face: string; - distance: number; - } | null = this.wasmWorld.get_pointed_at_block_wasm(camera); + // lookingAt(camera: CameraRay): ILookingAtData | null { + // const lookingData: { + // block: ISerializedCube; + // face: string; + // distance: number; + // } | null = this.wasmWorld.get_pointed_at_block_wasm(camera); - console.log("Cam looking at ", lookingData, camera); + // console.log("Cam looking at ", lookingData, camera); - if (!lookingData) return null; + // if (!lookingData) return null; - return { - cube: CubeHelpers.fromWasmCube(lookingData.block), - face: getDirectionFromString(lookingData.face), - dist: lookingData.distance, - }; - } + // return { + // cube: CubeHelpers.fromWasmCube(lookingData.block), + // face: getDirectionFromString(lookingData.face), + // dist: lookingData.distance, + // }; + // } } diff --git a/lib/terrain-gen/src/lib.rs b/lib/terrain-gen/src/lib.rs index 4e292ff..5635b1e 100644 --- a/lib/terrain-gen/src/lib.rs +++ b/lib/terrain-gen/src/lib.rs @@ -113,16 +113,24 @@ impl TreeLocator { pub struct TreeRandomSpreadGenerator { seed: u64, + dist: Uniform, } impl TreeRandomSpreadGenerator { + fn make_from_seed(seed: u64) -> TreeRandomSpreadGenerator { + TreeRandomSpreadGenerator { + seed, + dist: Uniform::new(0, CHUNK_WIDTH), + } + } + + fn get_potential_tree_locations( &self, chunk_pos: ChunkPos, ) -> Box> { let chunk_seed = self.seed + (chunk_pos.x as u64 * 1000) + (chunk_pos.y as u64 * 1000000); let mut rng: StdRng = SeedableRng::seed_from_u64(chunk_seed); - let dist = Uniform::new(0, CHUNK_WIDTH); let mut tree_locations: Vec = Vec::new(); diff --git a/lib/world/src/chunk.rs b/lib/world/src/chunk.rs index 4145b1a..ccc77e8 100644 --- a/lib/world/src/chunk.rs +++ b/lib/world/src/chunk.rs @@ -1,7 +1,6 @@ use crate::block::{BlockData, BlockType, ChunkBlock}; use crate::positions::{ChunkPos, InnerChunkPos}; use crate::world::world_block::WorldBlock; -use phf::set; use serde::{Deserialize, Serialize}; use serde_big_array::BigArray; use wasm_bindgen::prelude::*; diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index 4bb3947..cc9b9ab 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -1,7 +1,5 @@ use std::any::Any; -use serde::{Deserialize, Serialize}; -use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; - +use wasm_bindgen::prelude::*; use crate::world::World; pub type EntityId = u32; @@ -23,17 +21,4 @@ pub struct EntityAction { pub mod wasm { - use wasm_bindgen::prelude::*; - - - // #[wasm_bindgen] - // impl EntityAction { - - - - - // } - - - } \ No newline at end of file diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 5a5b20b..8de5a44 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -297,27 +297,36 @@ pub mod wasm { use super::{Game, GameDiff, GameSchedule, GameScript}; use crate::{ - chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, - entities::{ + chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, entities::{ entity::{EntityAction, EntityId}, player::Player, - player_rot_script::PlayerRotScript, - }, - world::World, + player_rot_script::PlayerRotScript, sandbox::SandBoxGScript, + }, positions::{ChunkPos, WorldPos}, world::World }; - use serde_wasm_bindgen::Error; + use serde_wasm_bindgen::{from_value, Error}; use wasm_bindgen::prelude::*; + + + #[wasm_bindgen] impl Game { pub fn new_wasm() -> Game { - Game::new() + let mut g = Game::new(); + let sandbox_game_script = Box::new(SandBoxGScript::default()); + g.add_game_script(sandbox_game_script); + g.update(); + g } pub fn make_player_wasm() -> Player { Player::make(1) } + pub fn update_wasm(&mut self) { + self.update(); + } + pub fn make_and_add_player_wasm(&mut self, uid: EntityId) -> () { let player = Player::make(uid); self.add_player_wasm(player); @@ -340,10 +349,36 @@ pub mod wasm { self.add_game_script(Box::new(script)); } - pub fn get_chunk_mesh_from_chunk_id(&self, chunk_id: ChunkId) -> Result { + pub fn get_chunk_mesh_by_chunkid_wasm(&self, chunk_id: ChunkId) -> Result { + web_sys::console::log_1(&JsValue::from_str(&format!("Rust Getting chunk mesh: {}", chunk_id))); self.world.get_chunk_mesh_wasm(chunk_id) } + pub fn get_chunk_pos_from_id_wasm(&self, chunk_id: ChunkId) -> Result { + let chunk_pos = ChunkPos::from_id(chunk_id); + let chunk_pos_js = serde_wasm_bindgen::to_value(&chunk_pos).unwrap(); + Ok(chunk_pos_js) + } + + pub fn get_chunk_id_from_chunk_pos_wasm(&self, value: JsValue) -> ChunkId { + let chunk_pos: ChunkPos = from_value(value).unwrap(); + chunk_pos.to_id() + } + + pub fn get_world_pos_from_chunk_pos_wasm(&self, x: i16, y: i16) -> Result { + let chunk_pos = ChunkPos { x, y }; + let world_pos: WorldPos = chunk_pos.to_world_pos(); + let world_pos_js = serde_wasm_bindgen::to_value(&world_pos).unwrap(); + Ok(world_pos_js) + } + + pub fn get_chunk_pos_from_world_pos_wasm(&self, x: i32, y: i32, z: i32) -> Result { + let world_pos = WorldPos { x, y, z }; + let chunk_pos: ChunkPos = world_pos.to_chunk_pos(); + let chunk_pos_js = serde_wasm_bindgen::to_value(&chunk_pos).unwrap(); + Ok(chunk_pos_js) + } + pub fn add_player_wasm(&mut self, player: Player) { self.schedule_entity_insert(Box::new(player)); } @@ -357,19 +392,38 @@ pub mod wasm { Err(Error::new("Player not found")) } } + + pub fn get_entities_wasm(&self) -> Result { + let entities = self.get_entities(); + let entities_js = serde_wasm_bindgen::to_value(&entities).unwrap(); + Ok(entities_js) + } + + pub fn get_loaded_chunk_ids_wasm(&self) -> Vec { + return self.world.get_loaded_chunk_ids(); + } + + pub fn get_block_wasm(&self, x: i32, y: i32, z: i32) -> Result { + let world_pos = WorldPos { x, y, z }; + let block = self.world.get_block(&world_pos); + let block_js = serde_wasm_bindgen::to_value(&block).unwrap(); + Ok(block_js) + } } #[wasm_bindgen] pub struct WasmGameScript { + context: JsValue, on_diff_jsfn: js_sys::Function, } #[wasm_bindgen] impl WasmGameScript { pub fn make(val: JsValue) -> WasmGameScript { - let on_diff_jsfn = js_sys::Reflect::get(&val, &JsValue::from("on_diff")).unwrap(); + let on_diff_jsfn = js_sys::Reflect::get(&val, &JsValue::from("onDiff")).unwrap(); WasmGameScript { on_diff_jsfn: on_diff_jsfn.into(), + context: val, } } } @@ -380,8 +434,9 @@ pub mod wasm { } fn on_diff(&self, diff: GameDiff) -> () { + // console log diff let val = serde_wasm_bindgen::to_value(&diff).unwrap(); - self.on_diff_jsfn.call1(&val, &val); + self.on_diff_jsfn.call1(&self.context, &val).unwrap(); } } } diff --git a/lib/world/src/entities/player_rot_script.rs b/lib/world/src/entities/player_rot_script.rs index 6f06198..0775230 100644 --- a/lib/world/src/entities/player_rot_script.rs +++ b/lib/world/src/entities/player_rot_script.rs @@ -3,8 +3,9 @@ use crate::{geometry::rotation::SphericalRotation, world::World}; use super::{entity::{EntityAction, EntityId}, game::{Game, PlayerScript}, player::Player}; use wasm_bindgen::prelude::wasm_bindgen; +#[wasm_bindgen] pub struct PlayerRotAction { - pub player_id: String, + pub player_id: EntityId, pub rot_diff: SphericalRotation, } @@ -55,4 +56,14 @@ impl PlayerScript for PlayerRotScript { // NO-OP } +} + +pub mod wasm { + use super::*; + #[wasm_bindgen] + impl PlayerRotAction { + pub fn make_wasm(player_id: EntityId, x: f32, y: f32) -> EntityAction { + PlayerRotAction::new(player_id, SphericalRotation::new(x, y)) + } + } } \ No newline at end of file diff --git a/lib/world/src/entities/terrain_gen.rs b/lib/world/src/entities/terrain_gen.rs index ae2efe3..8f399d8 100644 --- a/lib/world/src/entities/terrain_gen.rs +++ b/lib/world/src/entities/terrain_gen.rs @@ -109,22 +109,33 @@ impl TreeLocator { pub struct TreeRandomSpreadGenerator { seed: u64, + dist: Uniform, } impl TreeRandomSpreadGenerator { + + pub fn make_from_seed(seed: u64) -> TreeRandomSpreadGenerator { + TreeRandomSpreadGenerator { + seed, + dist: Uniform::new(0, CHUNK_WIDTH as u16), + } + } + fn get_potential_tree_locations( &self, chunk_pos: ChunkPos, ) -> Box> { let chunk_seed = self.seed + chunk_pos.to_id(); let mut rng: StdRng = SeedableRng::seed_from_u64(chunk_seed); - let dist = Uniform::new(0, CHUNK_WIDTH); let mut tree_locations: Vec = Vec::new(); - for _ in 0..20 { - let x = dist.sample(&mut rng); - let z = dist.sample(&mut rng); + // sample 40 numbers + let tree_locations_rnd = self.dist.sample_iter(&mut rng).take(40).collect::>(); + + for i in 0..20 { + let x = tree_locations_rnd[i]; + let z = tree_locations_rnd[i + 20]; let pos = WorldPos { x: (chunk_pos.x * CHUNK_WIDTH) as i32 + x as i32, @@ -307,7 +318,7 @@ impl BasicChunkGetter { let mut chunk = Chunk::new(*chunk_pos); - let trees_in_chunk = TreeRandomSpreadGenerator { seed: 100 }; + let trees_in_chunk = TreeRandomSpreadGenerator::make_from_seed(100); let trees = trees_in_chunk.get_trees(*chunk_pos); diff --git a/lib/world/src/positions.rs b/lib/world/src/positions.rs index 560274c..8e78bf7 100644 --- a/lib/world/src/positions.rs +++ b/lib/world/src/positions.rs @@ -112,6 +112,14 @@ impl ChunkPos { ChunkPos { x, y } } + pub fn to_world_pos(&self) -> WorldPos { + WorldPos { + x: self.x as i32 * CHUNK_WIDTH as i32 + CHUNK_WIDTH as i32 / 2, + y: 0, + z: self.y as i32 * CHUNK_WIDTH as i32 + CHUNK_WIDTH as i32 / 2, + } + } + } diff --git a/lib/world/src/world/world_duct.rs b/lib/world/src/world/world_duct.rs index 34db268..0592eb2 100644 --- a/lib/world/src/world/world_duct.rs +++ b/lib/world/src/world/world_duct.rs @@ -42,6 +42,15 @@ impl World { return to_value(&keys); } + pub fn get_loaded_chunk_ids(&self) -> Vec { + let keys = self + .chunks + .values() + .map(|c| c.position.to_id()) + .collect::>(); + keys + } + pub fn is_chunk_loaded_wasm(&self, val: JsValue) -> Result { from_value(val).map(|pos: ChunkPos| self.get_chunk(&pos).is_ok()) } @@ -71,6 +80,8 @@ impl World { pub fn get_chunk_mesh_wasm(&self, chunk_id: ChunkId) -> Result { let chunk_pos = ChunkPos::from_id(chunk_id); + web_sys::console::log_1(&JsValue::from_str(&format!("Rust Getting chunk mesh: {}", chunk_id))); + let mesh = self.get_chunk_mesh(&chunk_pos).map_err(Self::convert_error)?; let wasm_chunk_mesh = mesh From 09bbf0b9c27464211d7224ca04198f76afca7548 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 18 Aug 2024 13:28:00 -0700 Subject: [PATCH 07/61] refactor entities to a list of components --- apps/web-client/src/renders/chunkRender.ts | 1 - lib/engine/src/playerActions.ts | 2 +- lib/engine/src/wrappers.ts | 17 +- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/entities/entity.rs | 127 ++++++- lib/world/src/entities/entity_action.rs | 65 ++++ lib/world/src/entities/entity_component.rs | 21 ++ lib/world/src/entities/game.rs | 329 +++++++------------ lib/world/src/entities/game_script.rs | 93 ++++++ lib/world/src/entities/mod.rs | 5 + lib/world/src/entities/player.rs | 139 ++++---- lib/world/src/entities/player_jump_script.rs | 134 ++++---- lib/world/src/entities/player_move_script.rs | 69 +++- lib/world/src/entities/player_rot_script.rs | 88 ++--- lib/world/src/entities/sandbox.rs | 32 +- lib/world/src/entities/terrain_gen.rs | 1 + lib/world/src/entities/test.rs | 0 lib/world/src/entities/velocity_script.rs | 25 ++ lib/world/src/geometry/mod.rs | 1 + lib/world/src/geometry/rotation.rs | 8 +- lib/world/src/geometry/velocity.rs | 14 + lib/world/src/lib.rs | 2 +- lib/world/src/positions.rs | 10 +- lib/world/src/utils.rs | 21 +- 24 files changed, 726 insertions(+), 480 deletions(-) create mode 100644 lib/world/src/entities/entity_action.rs create mode 100644 lib/world/src/entities/entity_component.rs create mode 100644 lib/world/src/entities/game_script.rs create mode 100644 lib/world/src/entities/test.rs create mode 100644 lib/world/src/entities/velocity_script.rs create mode 100644 lib/world/src/geometry/velocity.rs diff --git a/apps/web-client/src/renders/chunkRender.ts b/apps/web-client/src/renders/chunkRender.ts index d04dbc3..e70dde5 100644 --- a/apps/web-client/src/renders/chunkRender.ts +++ b/apps/web-client/src/renders/chunkRender.ts @@ -32,7 +32,6 @@ export class ChunkRenderer extends Renderer { render(camera: Camera, trans?: boolean): void { // if (!this.isLoaded) return; - console.log("Rendering chunk", this.chunkPos, camera); this.setActiveTexture(this.webGlGScript.textureAtlas); this.renderObject(this.worldPos, camera, trans); diff --git a/lib/engine/src/playerActions.ts b/lib/engine/src/playerActions.ts index 04b96f4..7916527 100644 --- a/lib/engine/src/playerActions.ts +++ b/lib/engine/src/playerActions.ts @@ -1,4 +1,4 @@ -import { Direction } from "@craft/rust-world"; +import { BlockType, Direction } from "@craft/rust-world"; import { EntityAction, GameWrapper } from "./wrappers.js"; // export enum PlayerActionType { diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index ad64c5b..a44938d 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -95,8 +95,8 @@ export class PlayerWrapper { distanceMoved = 0; moving_directions: WorldWasm.Direction[] = []; - constructor(player: WorldWasm.Player) { - // console.log("Constructing Player NOT DONE", player); + constructor(player: WorldWasm.Player, rot_script: WorldWasm.PlayerRotScript) { + this.rot = new Vector3D([0, rot_script.rot.phi, rot_script.rot.theta]); } } @@ -141,11 +141,14 @@ export class GameWrapper { } makeRotateAction(entityId: number, x: number, y: number) { + console.log("Making rotate action", entityId, x, y); return WorldWasm.PlayerRotAction.make_wasm(entityId, x, y); } handleAction(action: WorldWasm.EntityAction) { - this.game.handle_action_wasm(action); + const newAction = action.clone(); + console.log("Handling action", newAction); + this.game.handle_action_wasm(newAction); } getChunkPosFromChunkId(chunkId: number): Vector2D { @@ -182,7 +185,11 @@ export class GameWrapper { getPlayer(uid: number): PlayerWrapper { const player: WorldWasm.Player = this.game.get_player_wasm(uid); - return new PlayerWrapper(player); + const rot_script = this.game.get_player_rot_script_wasm(uid); + if (!rot_script) { + throw new Error("Player rot script not found"); + } + return new PlayerWrapper(player, rot_script); } getBlock(pos: Vector3D): BlockWrapper { @@ -192,7 +199,7 @@ export class GameWrapper { getEntities(): PlayerWrapper[] { const entities: WorldWasm.Player[] = this.game.get_entities_wasm(); - return entities.map((entity) => new PlayerWrapper(entity)); + return entities.map((entity) => this.getPlayer(entity.uid)); } getLoadedChunkIds(): number[] { diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 556663d..e8efac1 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c5f0d301835cbd0cd4a65e2312add9880ac06b9139df61fb67fd8f221d16cf1","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"78710cec70833643e347d5e6d6bf8041301d0d4b75f3c1600a3dcb8bf03fc362","signature":"f8bdf03cb8caf7408c197c78529a238f7e15e48e2b14495af9e1bfa07962f820","impliedFormat":99},{"version":"a031eb7acadc8468d1870bb0a79c173fa94b7eee80634d40cb5921b83c85ab30","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"7484717fcd4e2c209b77eac1389101e18238e203102d5736107656bc7524508e","signature":"416c090664e32b92f521f38b7888aa24f792987da90331eea9980d1bec400979","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"64e2b3db37b9ca974dece1425157b8428b1afbcf3e725aa92d4db3fa4decc065","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"94e20665956a270a887cd4deddbe72ccd322b868c732366f76142fffbfe09a9f","signature":"d870a26306af502148387d8dc641d7cb86a298567c901ea9213e4e9425f19095","impliedFormat":99},{"version":"a031eb7acadc8468d1870bb0a79c173fa94b7eee80634d40cb5921b83c85ab30","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"a6be64ec5be12e7ae5cd07eef124ca68a49d6c8028a3a4505e9fd1516bf7f9fe","signature":"416c090664e32b92f521f38b7888aa24f792987da90331eea9980d1bec400979","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index cc9b9ab..0a4d350 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -1,24 +1,125 @@ -use std::any::Any; +use std::{any::{Any, TypeId}, fmt::Debug}; use wasm_bindgen::prelude::*; -use crate::world::World; + +use super::entity_component::Component; pub type EntityId = u32; -pub trait Entity: Any { - fn update(&mut self, world: &World) -> (); - fn id(&self) -> u32; + +pub struct Entity { + pub id: EntityId, + components: Vec>, +} + +impl Entity { + pub fn new(id: EntityId) -> Self { + Self { id, components: Vec::new() } + } + + pub fn add(&mut self, component: T) { + self.components.push(Box::new(component)); + } + + pub fn get(&self) -> Option<&T> { + self.components.iter().find_map(|c| c.as_any().downcast_ref::()) + } + + pub fn set(&mut self, component: T) { + self.components.retain(|c| c.as_any().type_id() != TypeId::of::()); + self.components.push(Box::new(component)); + } + + pub fn has(&self) -> bool { + self.components.iter().any(|c| c.type_id() == TypeId::of::()) + } + + pub fn has_typeid(&self, type_id: TypeId) -> bool { + self.components.iter().any(|c| c.type_id() == type_id) + } +} + +pub struct EntityQuery { + type_ids: Vec, +} + +impl EntityQuery { + pub fn new() -> Self { + Self { + type_ids: vec![], + } + } + + pub fn add(&mut self) { + self.type_ids.push(TypeId::of::()); + } +} + +// New struct to hold mutable references to filtered entities +pub struct EntityQueryResults<'a> { + pub entities: Vec<&'a mut Entity>, } +impl<'a> EntityQueryResults<'a> { + pub fn new(entities: Vec<&'a mut Entity>) -> Self { + Self { entities } + } + + // pub fn get_entity_mut(&mut self, id: EntityId) -> Option<&'a mut Entity> { + // self.entities.iter_mut().find_map(|entity| { + // if entity.id == id { + // Some(entity) + // } else { + // None + // } + // }) + // } + + + // Add methods to work with the filtered entities if needed + pub fn len(&self) -> usize { + self.entities.len() + } +} -#[wasm_bindgen] -pub struct EntityAction { - pub entity_id: EntityId, - #[wasm_bindgen(skip)] - pub name: &'static str, - #[wasm_bindgen(skip)] - pub data: Box, +pub struct EntityHolder { + entities: Vec, } +impl EntityHolder { + pub fn new() -> EntityHolder { + EntityHolder { + entities: Vec::new(), + } + } + + pub fn add_entity(&mut self, entity: Entity) { + self.entities.push(entity); + } + + pub fn get_entity_by_id(&self, id: EntityId) -> Option<&Entity> { + self.entities.iter().find(|entity| entity.id == id) + } + + pub fn get_entity_by_id_mut(&mut self, id: EntityId) -> Option<&mut Entity> { + self.entities.iter_mut().find(|entity| entity.id == id) + } + + pub fn get_all(&self) -> &Vec { + &self.entities + } + + pub fn get_all_mut(&mut self) -> &mut Vec { + &mut self.entities + } + + pub fn query(&mut self, filter: &EntityQuery) -> EntityQueryResults { + let filtered_entities = self.entities + .iter_mut() + .filter(|entity| filter.type_ids.iter().all(|&type_id| + entity.has_typeid(type_id) + )) + .collect(); -pub mod wasm { + EntityQueryResults::new(filtered_entities) + } } \ No newline at end of file diff --git a/lib/world/src/entities/entity_action.rs b/lib/world/src/entities/entity_action.rs new file mode 100644 index 0000000..5fb43f9 --- /dev/null +++ b/lib/world/src/entities/entity_action.rs @@ -0,0 +1,65 @@ +use std::any::Any; +use wasm_bindgen::prelude::*; +use std::fmt::Debug; + +use super::entity::Entity; + +#[wasm_bindgen] +pub struct EntityActionDto { + pub entity_id: super::entity::EntityId, + #[wasm_bindgen(skip)] + pub name: &'static str, + #[wasm_bindgen(skip)] + pub data: Box, +} + +pub trait EntityAction { + fn entity_id(&self) -> super::entity::EntityId; + fn get_name(&self) -> &'static str; + fn get_dto(&self) -> EntityActionDto; + fn handle(&self, entity: &mut Entity); +} + +pub trait CloneAny: Any + Debug { + fn clone_box(&self) -> Box; + + fn as_any(&self) -> &dyn Any; +} + +impl CloneAny for T +where + T: Any + Clone + Debug, +{ + fn clone_box(&self) -> Box { + Box::new(self.clone()) + } + + fn as_any(&self) -> &dyn Any { + self + } +} + +impl EntityActionDto { + pub fn is_action_type(&self, name: &'static str) -> Option<&T> { + if self.name == name { + self.data.as_any().downcast_ref::() + } else { + None + } + } +} + +#[derive(Default)] +pub struct EntityActionHolder { + actions: Vec>, +} + +impl EntityActionHolder { + pub fn add_action(&mut self, action: Box) { + self.actions.push(action); + } + + pub fn get_actions(&self) -> &Vec> { + &self.actions + } +} diff --git a/lib/world/src/entities/entity_component.rs b/lib/world/src/entities/entity_component.rs new file mode 100644 index 0000000..1fcc980 --- /dev/null +++ b/lib/world/src/entities/entity_component.rs @@ -0,0 +1,21 @@ +use std::{any::Any, fmt::Debug}; + +pub trait Component: Any + Debug { + fn as_any(&self) -> &dyn Any; + fn as_any_mut(&mut self) -> &mut dyn Any; +} + +macro_rules! impl_component { + ($type:ty) => { + impl $crate::entities::entity_component::Component for $type { + fn as_any(&self) -> &dyn std::any::Any { + self + } + fn as_any_mut(&mut self) -> &mut dyn std::any::Any { + self + } + } + }; +} +pub(crate) use impl_component; + diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 8de5a44..5b4e2e8 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -1,143 +1,77 @@ use super::{ - entity::{Entity, EntityAction, EntityId}, - player::Player, + entity::{Entity, EntityHolder, EntityId}, entity_action::EntityActionHolder, game_script::{EntityScriptHolder, GameScript} }; use crate::{ chunk::{Chunk, ChunkId}, world::{world_block::WorldBlock, World}, }; use serde::{Deserialize, Serialize}; -use std::{any::Any, borrow::BorrowMut, collections::HashMap}; -use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; - -pub trait GameScript { - fn update(&self, world: &World, ents: &Vec>, delta: u8) -> GameSchedule; - fn on_diff(&self, diff: GameDiff) -> (); -} - -pub trait PlayerScript: Any { - fn name(&self) -> &'static str; - fn update(&mut self, world: &World, player: &mut Player); - fn handle_action(&mut self, action: EntityAction); - fn as_any(&self) -> &dyn Any; -} - -type ScriptId = u32; +use wasm_bindgen::{prelude::wasm_bindgen}; #[wasm_bindgen] pub struct Game { world: World, - entities: Vec>, - game_scripts: Vec>, - player_scripts: HashMap>, - player_scripts_entity_map: HashMap, + scripts: EntityScriptHolder, schedule: GameSchedule, + entity_holder: EntityHolder, + action_holder: EntityActionHolder, } impl Game { pub fn new() -> Game { Game { world: World::default(), - entities: Vec::new(), - game_scripts: Vec::new(), - player_scripts: HashMap::new(), - player_scripts_entity_map: HashMap::new(), + entity_holder: EntityHolder::new(), + scripts: EntityScriptHolder::default(), schedule: GameSchedule::empty(), + action_holder: EntityActionHolder::default(), } } - pub fn add_script(&mut self, entity_id: EntityId, script: Box) { - let id = 1; - self.player_scripts.insert(id, script); - self.player_scripts_entity_map.insert(id, entity_id); + pub fn add_script(&mut self, script: Box) { + self.scripts.add_script(script); } - pub fn get_entity_script(&self, entity_id: EntityId) -> Option<&T> - where - T: PlayerScript + Any, - { - let player_scripts: Vec<&Box> = self - .player_scripts - .iter() - .filter(|(script_id, _)| { - let ent_id = *self - .player_scripts_entity_map - .get(script_id) - .expect("Script not found"); - ent_id == entity_id - }) - .map(|(_, script)| script) - .collect(); - - println!("player_scripts_len: {:?}", player_scripts.len()); - - for script in player_scripts.iter() { - println!("script_name: {:?}", script.name()); - } - - let script = player_scripts - .iter() - .find_map(|script| script.as_any().downcast_ref::()); - - script - } - - pub fn handle_action(&mut self, action: EntityAction) { - for (id, script) in self.player_scripts.iter_mut() { - let script_entity_id = *self - .player_scripts_entity_map - .get(id) - .expect("Script not found"); - - if action.entity_id == script_entity_id { - script.handle_action(action); - break; - } - } - } + // pub fn get_entity_script(&self, entity_id: EntityId) -> Option<&T> + // where + // T: EntityScript + Any, + // { + // self.entity_scripts.get_script::(entity_id) + // } pub fn update(&mut self) { let world = &self.world; - - // update all entities - self.entities - .iter_mut() - .for_each(|entity| entity.update(world)); - - for (script_id, script) in &mut self.player_scripts { - let script_entity = *self - .player_scripts_entity_map - .get(script_id) - .expect("Script not found"); - - let mut player = self - .entities - .iter_mut() - .find(|entity| entity.id() == script_entity) - .expect("Player not found"); - - script.update(world, &mut player); + // apply actions + for action in self.action_holder.get_actions() { + let entity = self.entity_holder.get_entity_by_id_mut(action.entity_id()).unwrap(); + action.handle(entity); } - // send diff to all scripts - - for gscript in &mut self.game_scripts { - let diff = gscript.update(&self.world, &self.entities, 1); - self.schedule.combine(diff) + for script in self.scripts.get_scripts_mut() { + let query = script.get_query(); + let query_results = self.entity_holder.query(&query); + let diff = script.update(world, query_results); + if let Some(diff) = diff { + self.schedule.combine(diff); + } } - self.game_scripts.iter().for_each(|script| { - script.on_diff(self.schedule.to_game_diff()); + let game_diff = self.schedule.to_game_diff(); + + self.scripts.iter_mut().for_each(|script| { + script.on_diff(game_diff.clone()); }); // Apply diff to game // Add all new entities let new_ents = std::mem::take(&mut self.schedule.new_entities); - self.entities.extend(new_ents); + self.entity_holder.get_all_mut().extend(new_ents); // Remove entities - for entid in self.schedule.removed_entities.clone() { - self.entities.retain(|entity| entity.id() != entid); + for entity_id in self.schedule.removed_entities.clone() { + self.entity_holder + .get_all_mut() + .retain(|entity| entity.id != entity_id); } // add chunks to world @@ -147,35 +81,23 @@ impl Game { } } - pub fn add_game_script(&mut self, game_script: Box) { - self.game_scripts.push(game_script); - } - - pub fn get_entities(&self) -> &Vec> { - &self.entities - } - - pub fn get_entity_by_id(&self, id: EntityId) -> Option<&Box> { - self.entities.iter().find(|entity| entity.id() == id) - } - pub fn schedule_chunk_insert(&mut self, chunk: Chunk) { self.schedule.new_chunks.push(chunk) } - pub fn schedule_entity_insert(&mut self, entity: Box) { + pub fn schedule_entity_insert(&mut self, entity: Entity) { self.schedule.new_entities.push(entity); } } -#[derive(Serialize, Deserialize)] +#[derive(Clone, Serialize, Deserialize)] pub struct GameDiff { pub updated_entities: Vec, pub updated_chunks: Vec, } pub struct GameSchedule { - pub new_entities: Vec>, + pub new_entities: Vec, pub new_blocks: Vec, pub new_chunks: Vec, pub removed_entities: Vec, @@ -195,7 +117,7 @@ impl GameSchedule { pub fn to_game_diff(&self) -> GameDiff { let mut updated_entities: Vec = - self.new_entities.iter().map(|entity| entity.id()).collect(); + self.new_entities.iter().map(|entity| entity.id).collect(); updated_entities.extend(self.removed_entities.iter().map(|entity_id| entity_id)); let updated_chunks = self.new_chunks.iter().map(|chunk| chunk.get_id()).collect(); GameDiff { @@ -212,7 +134,7 @@ impl GameSchedule { self.removed_blocks.extend(other.removed_blocks); } - pub fn add_entity(&mut self, entity: Box) { + pub fn add_entity(&mut self, entity: Entity) { self.new_entities.push(entity) } @@ -230,55 +152,48 @@ impl GameSchedule { } mod tests { - use crate::entities::{ - player::Player, - player_jump_script::{PlayerJumpAction, PlayerJumpScript}, - sandbox::SandBoxGScript, - }; - - use super::*; + use crate::{entities::{ + game::Game, player::make_player, player_jump_script::PlayerJumpAction, sandbox::SandBoxGScript + }, geometry::velocity::Velocity}; #[test] - pub fn jump_script() { + pub fn add_player() { let mut game = Game::new(); - let player = Box::new(Player::make(1)); - let jump_script = Box::new(PlayerJumpScript::new()); + let player = make_player(1); game.schedule_entity_insert(player); game.update(); - game.add_script(1, jump_script); - game.update(); - let jump_action = PlayerJumpAction::new(1); - game.handle_action(jump_action); - game.update(); - let player = game.get_entity_by_id(1).unwrap(); - assert!(player.vel.y > 0.0); - let jump_script = game.get_entity_script::(1); - assert!(jump_script.is_some()); + // expect game to have a player in it + game.entity_holder.get_all_mut().iter().for_each(|ent| { + assert_eq!(ent.id, 1); + }); } #[test] - pub fn add_player() { + pub fn jump_script() { let mut game = Game::new(); - let player = Box::new(Player::make(1)); + let player = make_player(1); game.schedule_entity_insert(player); game.update(); + let jump_action = Box::new(PlayerJumpAction::new(1)); + game.action_holder.add_action(jump_action); + game.update(); + let player = game.entity_holder.get_entity_by_id(1).unwrap(); + let player_vel = player.get::().unwrap(); + println!("player_vel: {:?}", player_vel); - // expect game to have a player in it - game.get_entities().iter().for_each(|ent| { - assert_eq!(ent.id(), 1); - }); + assert!(player_vel.y > 0.0); } #[test] pub fn generate_chunk() { let mut game = Game::new(); - let player = Box::new(Player::make(1)); + let player = make_player(1); game.schedule_entity_insert(player); game.update(); let sandbox_game_script = Box::new(SandBoxGScript::default()); - game.add_game_script(sandbox_game_script); + game.add_script(sandbox_game_script); game.update(); // Check that chunks loaded @@ -297,60 +212,63 @@ pub mod wasm { use super::{Game, GameDiff, GameSchedule, GameScript}; use crate::{ - chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, entities::{ - entity::{EntityAction, EntityId}, - player::Player, - player_rot_script::PlayerRotScript, sandbox::SandBoxGScript, - }, positions::{ChunkPos, WorldPos}, world::World + chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, + entities::{ + entity::{Entity, EntityId}, entity_action::EntityAction, player::make_player, sandbox::SandBoxGScript + }, + positions::{ChunkPos, WorldPos}, + world::World, }; use serde_wasm_bindgen::{from_value, Error}; use wasm_bindgen::prelude::*; - - - #[wasm_bindgen] impl Game { pub fn new_wasm() -> Game { + console_error_panic_hook::set_once(); let mut g = Game::new(); - let sandbox_game_script = Box::new(SandBoxGScript::default()); - g.add_game_script(sandbox_game_script); + let sandbox_script = Box::new(SandBoxGScript::default()); + g.add_script(sandbox_script); g.update(); g } - pub fn make_player_wasm() -> Player { - Player::make(1) - } + // pub fn make_player_wasm() -> Entity { + // make_player(1) + // } pub fn update_wasm(&mut self) { self.update(); } pub fn make_and_add_player_wasm(&mut self, uid: EntityId) -> () { - let player = Player::make(uid); - self.add_player_wasm(player); + let player = make_player(uid); + self.schedule_entity_insert(player); + self.update(); } - pub fn get_player_rot_script(&self, player_id: EntityId) -> Option { - self.get_entity_script::(player_id) - .and_then(|script| Some(*script)) - } + // pub fn get_player_rot_script_wasm(&self, player_id: EntityId) -> Option { + // self.get_entity_script::(player_id) + // .and_then(|script| Some(*script)) + // } - pub fn handle_action_wasm(&mut self, action: EntityAction) { - self.handle_action(action); - } + // pub fn handle_action_wasm(&mut self, action: EntityAction) { + // self.action_holder.add_action(action); + // } pub fn schedule_chunk_insert_wasm(&mut self, chunk: Chunk) { self.schedule_chunk_insert(chunk); } - pub fn add_game_script_wasm(&mut self, script: WasmGameScript) { - self.add_game_script(Box::new(script)); - } + // pub fn add_game_script_wasm(&mut self, script: WasmGameScript) { + // self.add_script(Box::new(script)); + // } pub fn get_chunk_mesh_by_chunkid_wasm(&self, chunk_id: ChunkId) -> Result { - web_sys::console::log_1(&JsValue::from_str(&format!("Rust Getting chunk mesh: {}", chunk_id))); + web_sys::console::log_1(&JsValue::from_str(&format!( + "Rust Getting chunk mesh: {}", + chunk_id + ))); self.world.get_chunk_mesh_wasm(chunk_id) } @@ -372,32 +290,37 @@ pub mod wasm { Ok(world_pos_js) } - pub fn get_chunk_pos_from_world_pos_wasm(&self, x: i32, y: i32, z: i32) -> Result { + pub fn get_chunk_pos_from_world_pos_wasm( + &self, + x: i32, + y: i32, + z: i32, + ) -> Result { let world_pos = WorldPos { x, y, z }; let chunk_pos: ChunkPos = world_pos.to_chunk_pos(); let chunk_pos_js = serde_wasm_bindgen::to_value(&chunk_pos).unwrap(); Ok(chunk_pos_js) } - pub fn add_player_wasm(&mut self, player: Player) { - self.schedule_entity_insert(Box::new(player)); - } - - pub fn get_player_wasm(&self, player_id: EntityId) -> Result { - let maybe_player = self.get_entity_by_id(player_id); - if let Some(player) = maybe_player { - let player_js = serde_wasm_bindgen::to_value(&player).unwrap(); - Ok(player_js) - } else { - Err(Error::new("Player not found")) - } - } - - pub fn get_entities_wasm(&self) -> Result { - let entities = self.get_entities(); - let entities_js = serde_wasm_bindgen::to_value(&entities).unwrap(); - Ok(entities_js) - } + // pub fn add_player_wasm(&mut self, player: Player) { + // self.schedule_entity_insert(Box::new(player)); + // } + + // pub fn get_player_wasm(&self, player_id: EntityId) -> Result { + // let maybe_player = self.entity_holder.get_entity_by_id(player_id); + // if let Some(player) = maybe_player { + // let player_js = serde_wasm_bindgen::to_value(&player).unwrap(); + // Ok(player_js) + // } else { + // Err(Error::new("Player not found")) + // } + // } + + // pub fn get_entities_wasm(&self) -> Result { + // let entities = self.entity_holder.get_all(); + // let entities_js = serde_wasm_bindgen::to_value(&entities).unwrap(); + // Ok(entities_js) + // } pub fn get_loaded_chunk_ids_wasm(&self) -> Vec { return self.world.get_loaded_chunk_ids(); @@ -428,15 +351,15 @@ pub mod wasm { } } - impl GameScript for WasmGameScript { - fn update(&self, world: &World, ents: &Vec>, delta: u8) -> GameSchedule { - GameSchedule::empty() - } - - fn on_diff(&self, diff: GameDiff) -> () { - // console log diff - let val = serde_wasm_bindgen::to_value(&diff).unwrap(); - self.on_diff_jsfn.call1(&self.context, &val).unwrap(); - } - } + // impl GameScript for WasmGameScript { + // fn update(&self, world: &World, ents: &Vec>, delta: u8) -> GameSchedule { + // GameSchedule::empty() + // } + + // fn on_diff(&self, diff: GameDiff) -> () { + // // console log diff + // let val = serde_wasm_bindgen::to_value(&diff).unwrap(); + // self.on_diff_jsfn.call1(&self.context, &val).unwrap(); + // } + // } } diff --git a/lib/world/src/entities/game_script.rs b/lib/world/src/entities/game_script.rs new file mode 100644 index 0000000..e61d8dd --- /dev/null +++ b/lib/world/src/entities/game_script.rs @@ -0,0 +1,93 @@ +use super::entity::{EntityId, EntityQuery, EntityQueryResults}; +use super::game::{GameDiff, GameSchedule}; +use crate::world::World; +use std::any::Any; +use std::fmt::Debug; + +pub trait GameScript: Any + Debug { + fn update(&mut self, world: &World, query_results: EntityQueryResults) -> Option { + None + } + + fn get_query(&self) -> EntityQuery { + EntityQuery::new() + } + + fn on_diff(&self, diff: GameDiff) { + // Default implementation does nothing + } +} + +macro_rules! impl_script { + ($type:ty) => { + impl Component for $type { + fn as_any(&self) -> &dyn std::any::Any { + self + } + fn as_any_mut(&mut self) -> &mut dyn std::any::Any { + self + } + } + }; +} +pub(crate) use impl_script; + +impl std::error::Error for ScriptNotFoundError {} + +#[derive(Debug)] +pub struct ScriptNotFoundError { + pub entity_id: EntityId, + pub script_name: String, +} + +impl std::fmt::Display for ScriptNotFoundError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "Script '{}' not found for entity with ID {}", + self.script_name, self.entity_id + ) + } +} + +#[derive(Debug, Default)] +pub struct EntityScriptHolder { + scripts: Vec>, +} + +impl EntityScriptHolder { + pub fn add_script(&mut self, script: Box) { + self.scripts.push(script); + } + + pub fn get_scripts_mut(&mut self) -> &mut Vec> { + &mut self.scripts + } + + pub fn iter_mut(&mut self) -> std::slice::IterMut> { + self.scripts.iter_mut() + } + + // pub fn get_script(&self, entity_id: EntityId) -> Option<&T> + // where + // T: EntityScript + Any, + // { + // let ent_scripts = self.get_scripts_for_entity(entity_id); + + // let script = ent_scripts + // .iter() + // .find_map(|script| script.as_any().downcast_ref::()); + + // script + // } + + // pub fn copy(&self) -> EntityScriptHolder { + // EntityScriptHolder { + // scripts: self + // .scripts + // .into_iter() + // .map(|(id, script)| (id, script.clone())) + // .collect(), + // } + // } +} diff --git a/lib/world/src/entities/mod.rs b/lib/world/src/entities/mod.rs index 5ba4d96..0e39a59 100644 --- a/lib/world/src/entities/mod.rs +++ b/lib/world/src/entities/mod.rs @@ -1,7 +1,12 @@ pub mod entity; +pub mod entity_component; pub mod game; pub mod player; +pub mod game_script; pub mod player_jump_script; pub mod player_rot_script; +pub mod player_move_script; pub mod sandbox; pub mod terrain_gen; +pub mod entity_action; +pub mod velocity_script; \ No newline at end of file diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index cddcd4a..08f2c7a 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -1,92 +1,89 @@ -use super::entity::{Entity, EntityId}; +use std::fs::File; +use super::{entity::{Entity, EntityId}, entity_component::impl_component, player_jump_script::JumpData, player_move_script::MovingDirection}; use crate::{ - direction::Direction, geometry::rotation::SphericalRotation, positions::FineWorldPos, + direction::Direction, geometry::{rotation::SphericalRotation, velocity::Velocity}, positions::FineWorldPos, vec::Vec3, world::World, }; use serde::{Deserialize, Serialize}; use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; -pub type Velocity = Vec3; -pub type Size3 = Vec3; -impl Velocity { - pub fn zero() -> Velocity { - Velocity { - x: 0.0, - y: 0.0, - z: 0.0, - } - } -} - -#[derive(Serialize, Deserialize)] -#[wasm_bindgen] -pub struct Player { - // config - speed: f32, - max_speed: f32, - gravity: f32, +// #[derive(Serialize, Deserialize)] +// #[wasm_bindgen] +// pub struct Player { +// // config +// speed: f32, +// max_speed: f32, +// gravity: f32, - uid: EntityId, +// #[wasm_bindgen(skip)] +// pub pos: FineWorldPos, +// dim: Size3, - #[wasm_bindgen(skip)] - pub pos: FineWorldPos, - dim: Size3, +// pub is_flying: bool, +// on_ground: bool, +// } - rot: SphericalRotation, - #[wasm_bindgen(skip)] - pub vel: Velocity, +#[derive(Debug)] +pub struct Flying { pub is_flying: bool, - on_ground: bool, - moving_directions: Vec, + pub on_ground: bool, } +impl_component!(Flying); -impl Entity for Player { - fn update(&mut self, world: &World) {} - fn id(&self) -> u32 { - self.uid - } +pub fn make_player(uid: EntityId) -> Entity { + let mut ent = Entity::new(uid); + ent.add::(FineWorldPos { + x: 0.0, + y: 0.0, + z: 0.0, + }); + ent.add::(Velocity::zero()); + ent.add::(SphericalRotation::new(0.0, 0.0)); + ent.add::(None); + ent.add::(JumpData::new(2.0)); + ent } -impl Player { - pub fn make(uid: EntityId) -> Player { - Player { - speed: 0.0, - max_speed: 0.0, - gravity: 0.0, - uid, - pos: FineWorldPos { - x: 0.0, - y: 0.0, - z: 0.0, - }, - dim: Size3 { - x: 0.8, - y: 1.8, - z: 0.8, - }, - rot: SphericalRotation::new(0.0, 0.0), - vel: Velocity::zero(), - is_flying: false, - on_ground: false, - moving_directions: Vec::new(), - } - } -} +// impl Player { +// pub fn make(uid: EntityId) -> Player { +// Player { +// speed: 0.0, +// max_speed: 0.0, +// gravity: 0.0, +// uid, +// pos: FineWorldPos { +// x: 0.0, +// y: 0.0, +// z: 0.0, +// }, +// dim: Size3 { +// x: 0.8, +// y: 1.8, +// z: 0.8, +// }, +// rot: SphericalRotation::new(0.0, 0.0), +// vel: Velocity::zero(), +// is_flying: false, +// on_ground: false, +// moving_directions: Vec::new(), +// } +// } +// } -pub mod wasm { - use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; +// pub mod wasm { +// use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; - use crate::entities::entity::EntityId; +// use crate::entities::entity::EntityId; - use super::Player; +// use super::Player; - #[wasm_bindgen] - impl Player { - pub fn make_wasm(uid: EntityId) -> JsValue { - serde_wasm_bindgen::to_value(&Player::make(uid)).unwrap() - } - } -} +// #[wasm_bindgen] +// impl Player { +// pub fn make_wasm(uid: EntityId) -> JsValue { +// serde_wasm_bindgen::to_value(&Player::make(uid)).unwrap() +// } +// } +// } diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/entities/player_jump_script.rs index 06b4519..569d66f 100644 --- a/lib/world/src/entities/player_jump_script.rs +++ b/lib/world/src/entities/player_jump_script.rs @@ -1,105 +1,97 @@ -use super::{ - entity::{self, EntityAction, EntityId}, - game::PlayerScript, - player::{Player, Velocity}, -}; -use crate::world::World; +use crate::{geometry::velocity::Velocity, world::World}; use wasm_bindgen::prelude::wasm_bindgen; +use super::{entity::{Entity, EntityId, EntityQuery, EntityQueryResults}, entity_action::{EntityAction, EntityActionDto}, entity_component::impl_component, game::GameSchedule, game_script::GameScript, player::Flying}; #[wasm_bindgen] pub struct PlayerJumpAction { - pub entityid: EntityId, + pub entity_id: EntityId, } impl PlayerJumpAction { - pub fn new(entity_id: EntityId) -> EntityAction { - EntityAction { - entity_id: entity_id, - name: "Jump-Action", - data: Box::new(()), - } + pub fn new(entity_id: EntityId) -> Self { + Self { entity_id } } } -#[wasm_bindgen] -pub struct PlayerJumpScript { - jump_speed: f32, - is_jumping: bool, - have_db_jumped: bool, - jump_count: u8, -} +impl EntityAction for PlayerJumpAction { + fn get_name(&self) -> &'static str { + "Jump-Action" + } -impl PlayerJumpScript { - pub fn new() -> PlayerJumpScript { - PlayerJumpScript { - jump_speed: 2.0, - is_jumping: false, - have_db_jumped: false, - jump_count: 0, + fn get_dto(&self) -> EntityActionDto { + EntityActionDto { + entity_id: self.entity_id, + name: "Jump-Action", + data: Box::new(()), } } - fn jump_force(&mut self, player: &mut Player) -> Velocity { - if player.is_flying { - return Velocity::zero(); + fn handle(&self, entity: &mut Entity) { + let jump_data = entity.get::().unwrap().to_owned(); + let vel = entity.get::().unwrap().to_owned(); + + println!("jump_data: {:?}", jump_data); + + let flying = entity.get::(); + + if flying.is_some() && flying.unwrap().is_flying { + return; } - if !self.is_jumping { - return Velocity::zero(); + + if jump_data.is_jumping { + return; } - self.is_jumping = false; - let diff_y_vel = self.jump_speed - player.vel.y; + let new_jump_data = jump_data.stop_jumping(); + - Velocity { + let diff_y_vel = jump_data.jump_speed - vel.y; + + let jump_force = Velocity { x: 0.0, y: diff_y_vel, z: 0.0, - } - } + }; - pub fn jump(&mut self) { - println!("Jump Called"); - self.is_jumping = true; - } -} + let new_vel = jump_force + vel; -impl PlayerScript for PlayerJumpScript { - fn name(&self) -> &'static str { - "Jump" - } + println!("new_vel: {:?}", new_vel); - fn as_any(&self) -> &dyn std::any::Any { - self + entity.set::(new_vel); + entity.set::(new_jump_data); } - fn update(&mut self, world: &World, player: &mut Player) { - let jump_force = self.jump_force(player); - player.vel = jump_force + player.vel; - println!("Jumping"); - println!("Jump force: {:?}", jump_force); - println!("Player velocity: {:?}", player.vel); + fn entity_id(&self) -> super::entity::EntityId { + self.entity_id } - fn handle_action(&mut self, action: EntityAction) { - println!("Handling action"); - - if action.name == "Jump-Action" { - self.jump(); - } - } } +#[wasm_bindgen] +#[derive(Debug)] +pub struct JumpData { + jump_speed: f32, + is_jumping: bool, + have_db_jumped: bool, + jump_count: u8, +} -pub mod wasm { - use wasm_bindgen::prelude::*; - use crate::entities::entity::{EntityAction, EntityId}; - use super::{PlayerJumpAction, PlayerJumpScript}; +impl JumpData { + pub fn new(jump_speed: f32) -> Self { + Self { + jump_speed, + is_jumping: false, + have_db_jumped: false, + jump_count: 0, + } + } - #[wasm_bindgen] - impl PlayerJumpAction { - // make jump action - pub fn make_wasm(entity_id: EntityId) -> EntityAction { - PlayerJumpAction::new(entity_id) + pub fn stop_jumping(&self) -> JumpData { + JumpData { + is_jumping: false, + ..*self } } -} \ No newline at end of file +} + +impl_component!(JumpData); diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs index dfcc5e3..bb4c1a9 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/entities/player_move_script.rs @@ -1,20 +1,65 @@ -impl Player { - fn move_in_direction(&mut self, directions: Vec) { - self.moving_directions = directions; +use crate::{direction::Direction, geometry::{rotation::SphericalRotation, velocity::Velocity}}; +use wasm_bindgen::prelude::*; +use super::{entity::{Entity, EntityId, EntityQuery, EntityQueryResults}, entity_action::{EntityAction, EntityActionDto}, entity_component::impl_component, game::GameSchedule, game_script::GameScript}; + +#[wasm_bindgen] +pub struct PlayerMoveAction { + pub entity_id: super::entity::EntityId, + pub direction: crate::direction::Direction, +} + +impl EntityAction for PlayerMoveAction { + fn entity_id(&self) -> EntityId { + self.entity_id + } + + fn get_name(&self) -> &'static str { + "player_move" + } + + fn get_dto(&self) -> EntityActionDto { + EntityActionDto { + entity_id: self.entity_id, + name: self.get_name(), + data: Box::new(self.direction), + } + } + + fn handle(&self, entity: &mut Entity) { + entity.set::(Some(self.direction)); } } -impl Player { - pub fn god_force(&self) -> Velocity { - // add the current players roation to the direction - let mut new_rot = self.rot; +pub type MovingDirection = Option; +impl_component!(MovingDirection); + +#[derive(Debug)] +pub struct PlayerMoveScript { } + +impl GameScript for PlayerMoveScript { + + fn get_query(&self) -> EntityQuery { + let mut query = EntityQuery::new(); + query.add::(); + query.add::(); + query.add::(); + query + } + + fn update(&mut self, world: &crate::world::World, query_results: EntityQueryResults) -> Option { + for entity in query_results.entities { + let mut new_rot = entity.get::().unwrap(); + let moving_dir = entity.get::().unwrap(); + let vel = entity.get::().unwrap().to_owned(); - let dirs = self.moving_directions.clone(); + // let force = moving_dir.into(); - new_rot = dirs - .into_iter() - .fold(new_rot, |acc, direction| acc + direction.into()); + let new_vel = vel; - new_rot.into() + entity.set::(new_vel); + } + + None } } + diff --git a/lib/world/src/entities/player_rot_script.rs b/lib/world/src/entities/player_rot_script.rs index 0775230..25ff4f3 100644 --- a/lib/world/src/entities/player_rot_script.rs +++ b/lib/world/src/entities/player_rot_script.rs @@ -1,69 +1,33 @@ -use std::any::Any; -use crate::{geometry::rotation::SphericalRotation, world::World}; -use super::{entity::{EntityAction, EntityId}, game::{Game, PlayerScript}, player::Player}; +use super::entity::EntityId; +use super::entity_action::{EntityAction, EntityActionDto}; +use crate::geometry::rotation::SphericalRotation; use wasm_bindgen::prelude::wasm_bindgen; #[wasm_bindgen] pub struct PlayerRotAction { - pub player_id: EntityId, - pub rot_diff: SphericalRotation, + pub player_id: EntityId, + pub rot_diff: SphericalRotation, } -impl PlayerRotAction { - pub fn new(player_id: EntityId, rot_diff: SphericalRotation) -> EntityAction { - EntityAction { - entity_id: player_id, - name: "PlayerRot", - data: Box::new(rot_diff), - } - } +impl EntityAction for PlayerRotAction { + fn entity_id(&self) -> super::entity::EntityId { + self.player_id + } + + fn get_name(&self) -> &'static str { + "PlayerRot" + } + + fn get_dto(&self) -> super::entity_action::EntityActionDto { + EntityActionDto { + entity_id: self.player_id, + name: "PlayerRot", + data: Box::new(self.rot_diff), + } + } + + fn handle(&self, entity: &mut super::entity::Entity) { + let new_rot = entity.get::().unwrap().to_owned() + self.rot_diff; + entity.set::(new_rot); + } } - -#[wasm_bindgen] -#[derive(Clone, Copy)] -pub struct PlayerRotScript { - pub rot: SphericalRotation, -} - -impl PlayerRotScript { - pub fn apply_rot(&mut self, rot: SphericalRotation) { - self.rot = self.rot + rot; - } -} - -impl PlayerScript for PlayerRotScript { - fn name(&self) -> &'static str { - "PlayerRot" - } - - fn handle_action(&mut self, action: EntityAction) { - if action.name == "PlayerRot" { - let data = action.data; - if let Some(rot_diff) = data.downcast_ref::() { - self.apply_rot(*rot_diff); - } else { - panic!("PlayerRotScript received invalid action data"); - } - } - } - - fn as_any(&self) -> &dyn Any { - self - } - - - fn update(&mut self, world: &World, player: &mut Player) { - // NO-OP - - } -} - -pub mod wasm { - use super::*; - #[wasm_bindgen] - impl PlayerRotAction { - pub fn make_wasm(player_id: EntityId, x: f32, y: f32) -> EntityAction { - PlayerRotAction::new(player_id, SphericalRotation::new(x, y)) - } - } -} \ No newline at end of file diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index 4e6fd43..4693561 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -1,10 +1,9 @@ use super::{ - game::{Game, GameDiff, GameSchedule, GameScript}, - player::Player, - terrain_gen::TerrainGenerator, + entity::EntityQueryResults, game::{Game, GameDiff, GameSchedule}, game_script::GameScript, terrain_gen::TerrainGenerator }; -use crate::{positions::ChunkPos, world::World}; +use crate::{positions::{ChunkPos, FineWorldPos}, world::World}; +#[derive(Debug)] pub struct SandBoxGScript { seed: u32, flat_world: bool, @@ -33,10 +32,10 @@ impl SandBoxGScript { } } - fn get_chunks_around_player(&self, player: &Player) -> Vec { + fn get_chunks_around_player(&self, pos: &FineWorldPos) -> Vec { let mut poses = vec![]; - let player_chunk_pos: ChunkPos = player.pos.to_world_pos().to_chunk_pos(); + let player_chunk_pos: ChunkPos = pos.to_world_pos().to_chunk_pos(); for i in -(self.load_distance as i16)..self.load_distance as i16 { for j in -(self.load_distance as i16)..self.load_distance as i16 { @@ -47,9 +46,14 @@ impl SandBoxGScript { poses } +} + +impl GameScript for SandBoxGScript { + fn update(&mut self, world: &World, query_results: EntityQueryResults) -> Option { - fn load_chunks_around_player(&self, players: &Vec>, world: &World) -> GameSchedule { - let nearby_unloaded_chunks: Vec = players + let entity_poses: Vec = query_results.entities.iter().map(|ent| ent.get::().unwrap().clone()).collect(); + + let nearby_unloaded_chunks: Vec = entity_poses .iter() .flat_map(|p| self.get_chunks_around_player(p)) .filter(|pos| !world.has_chunk(pos)) @@ -65,16 +69,6 @@ impl SandBoxGScript { gdiff.add_chunk(chunk); } - gdiff - } -} - -impl GameScript for SandBoxGScript { - fn update(&self, world: &World, ents: &Vec>, _delta: u8) -> GameSchedule { - self.load_chunks_around_player(ents, world) - } - - fn on_diff(&self, _diff: GameDiff) -> () { - // on diff + Some(gdiff) } } diff --git a/lib/world/src/entities/terrain_gen.rs b/lib/world/src/entities/terrain_gen.rs index 8f399d8..e474bb8 100644 --- a/lib/world/src/entities/terrain_gen.rs +++ b/lib/world/src/entities/terrain_gen.rs @@ -495,6 +495,7 @@ impl ParkorChunkGetter { } // #[wasm_bindgen] +#[derive(Clone, Debug, Serialize, Deserialize)] pub struct TerrainGenerator { pub seed: u32, pub flat_world: bool, diff --git a/lib/world/src/entities/test.rs b/lib/world/src/entities/test.rs new file mode 100644 index 0000000..e69de29 diff --git a/lib/world/src/entities/velocity_script.rs b/lib/world/src/entities/velocity_script.rs new file mode 100644 index 0000000..a53320c --- /dev/null +++ b/lib/world/src/entities/velocity_script.rs @@ -0,0 +1,25 @@ +use crate::{geometry::velocity::Velocity, positions::{FineWorldPos, WorldPos}}; +use super::{entity::{EntityQuery, EntityQueryResults}, entity_action::EntityAction, game::GameSchedule, game_script::GameScript}; + + +#[derive(Debug)] +struct VelocityScript { } + +impl GameScript for VelocityScript { + fn get_query(&self) -> EntityQuery { + super::entity::EntityQuery::new() + } + + fn update(&mut self, _world: &crate::world::World, query_results: EntityQueryResults) -> Option { + for entity in query_results.entities { + let vel = entity.get::().unwrap().to_owned(); + let pos = entity.get::().unwrap().to_owned(); + + let new_pos = pos + vel; + + entity.set::(new_pos); + } + + None + } +} \ No newline at end of file diff --git a/lib/world/src/geometry/mod.rs b/lib/world/src/geometry/mod.rs index 4b92387..7999f9a 100644 --- a/lib/world/src/geometry/mod.rs +++ b/lib/world/src/geometry/mod.rs @@ -2,3 +2,4 @@ pub mod line_segment; pub mod ray; pub mod rect3; pub mod rotation; +pub mod velocity; diff --git a/lib/world/src/geometry/rotation.rs b/lib/world/src/geometry/rotation.rs index 9ee463a..e449d88 100644 --- a/lib/world/src/geometry/rotation.rs +++ b/lib/world/src/geometry/rotation.rs @@ -1,9 +1,11 @@ -use crate::{entities::player::Velocity, vec::Vec3}; +use crate::{entities::{entity_component::impl_component}, vec::Vec3}; use serde::{Deserialize, Serialize}; use std::{f32::consts::PI, ops::Add}; use wasm_bindgen::prelude::wasm_bindgen; -#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)] +use super::velocity::Velocity; + +#[derive(Clone, Copy, PartialEq, Debug, Default,Serialize, Deserialize)] #[wasm_bindgen] pub struct SphericalRotation { /** The flat angle. [0, 2PI] */ @@ -13,6 +15,8 @@ pub struct SphericalRotation { pub phi: f32, } +impl_component!(SphericalRotation); + impl SphericalRotation { pub fn new(theta: f32, phi: f32) -> SphericalRotation { SphericalRotation { theta, phi } diff --git a/lib/world/src/geometry/velocity.rs b/lib/world/src/geometry/velocity.rs new file mode 100644 index 0000000..cf67825 --- /dev/null +++ b/lib/world/src/geometry/velocity.rs @@ -0,0 +1,14 @@ +use crate::vec::Vec3; + +pub type Velocity = Vec3; + +impl Velocity { + pub fn zero() -> Velocity { + Velocity { + x: 0.0, + y: 0.0, + z: 0.0, + } + } +} + diff --git a/lib/world/src/lib.rs b/lib/world/src/lib.rs index e71c740..987f386 100644 --- a/lib/world/src/lib.rs +++ b/lib/world/src/lib.rs @@ -5,7 +5,7 @@ pub mod entities; pub mod geometry; pub mod plane; pub mod positions; -mod utils; +pub mod utils; pub mod vec; pub mod world; diff --git a/lib/world/src/positions.rs b/lib/world/src/positions.rs index 8e78bf7..73d080c 100644 --- a/lib/world/src/positions.rs +++ b/lib/world/src/positions.rs @@ -1,5 +1,6 @@ use crate::{ - chunk::{ChunkId, CHUNK_WIDTH}, + chunk::CHUNK_WIDTH, + entities::entity_component::impl_component, vec::{Vec2, Vec3}, }; @@ -11,6 +12,11 @@ pub type WorldPos = Vec3; pub type ChunkPos = Vec2; pub type FineWorldPos = Vec3; +impl_component!(WorldPos); +impl_component!(ChunkPos); +impl_component!(InnerChunkPos); +impl_component!(FineWorldPos); + impl InnerChunkPos { pub fn to_chunk_index(&self) -> usize { let x_part = (self.x as usize) << (4 + 6); @@ -119,8 +125,6 @@ impl ChunkPos { z: self.y as i32 * CHUNK_WIDTH as i32 + CHUNK_WIDTH as i32 / 2, } } - - } impl std::ops::Add for ChunkPos { diff --git a/lib/world/src/utils.rs b/lib/world/src/utils.rs index de1f157..54529b0 100644 --- a/lib/world/src/utils.rs +++ b/lib/world/src/utils.rs @@ -1,16 +1,7 @@ -#[allow(dead_code)] -pub fn set_panic_hook() { - // When the `console_error_panic_hook` feature is enabled, we can call the - // `set_panic_hook` function at least once during initialization, and then - // we will get better error messages if our code ever panics. - // - // For more details see - // https://github.com/rustwasm/console_error_panic_hook#readme - #[cfg(feature = "console_error_panic_hook")] - console_error_panic_hook::set_once(); -} -// pub fn js_log(s: &str) { -// use wasm_bindgen::JsValue; -// web_sys::console::log_1(&JsValue::from_str(s)); -// } + + +pub fn js_log(s: &str) { + use wasm_bindgen::JsValue; + web_sys::console::log_1(&JsValue::from_str(s)); +} \ No newline at end of file From b84b60ed6da981dbb5deef8b9e128c9881818996 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Mon, 19 Aug 2024 00:38:19 -0700 Subject: [PATCH 08/61] Better Action System --- lib/engine/src/wrappers.ts | 34 +++++-- lib/world/src/entities/entity.rs | 1 + lib/world/src/entities/entity_action.rs | 94 +++++++++++++------- lib/world/src/entities/game.rs | 67 ++++++-------- lib/world/src/entities/player.rs | 83 ++++++----------- lib/world/src/entities/player_jump_script.rs | 49 +++++----- lib/world/src/entities/player_move_script.rs | 35 ++++---- lib/world/src/entities/player_rot_script.rs | 44 +++++---- lib/world/src/entities/velocity_script.rs | 2 +- 9 files changed, 209 insertions(+), 200 deletions(-) diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index a44938d..7c4355c 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -82,6 +82,14 @@ export class ChunkMeshWrapper { } } +type RustPlayer = { + uid: number; + pos: RustPos; + dim: RustPos; + rot: { phi: number; theta: number }; + moving_direction: WorldWasm.Direction; +}; + export class PlayerWrapper { speed = 0; max_speed = 0; @@ -93,10 +101,13 @@ export class PlayerWrapper { is_flying = false; on_ground = false; distanceMoved = 0; - moving_directions: WorldWasm.Direction[] = []; + moving_direction: WorldWasm.Direction | undefined; - constructor(player: WorldWasm.Player, rot_script: WorldWasm.PlayerRotScript) { - this.rot = new Vector3D([0, rot_script.rot.phi, rot_script.rot.theta]); + constructor(player: RustPlayer) { + this.pos = new Vector3D([player.pos.x, player.pos.y, player.pos.z]); + this.dim = new Vector3D([player.dim.x, player.dim.y, player.dim.z]); + this.rot = new Vector3D([0, player.rot.phi, player.rot.theta]); + this.moving_direction = player.moving_direction; } } @@ -136,16 +147,23 @@ export class GameWrapper { this.game.make_and_add_player_wasm(uid); } - makeJumpAction(entityId: number) { - return WorldWasm.PlayerJumpAction.make_wasm(entityId); + makeJumpAction(entityId: number): WorldWasm.EntityActionDto { + return WorldWasm.PlayerJumpAction.new(entityId); } - makeRotateAction(entityId: number, x: number, y: number) { + makeRotateAction( + entityId: number, + x: number, + y: number + ): WorldWasm.EntityActionDto { console.log("Making rotate action", entityId, x, y); - return WorldWasm.PlayerRotAction.make_wasm(entityId, x, y); + const rotDiff = new WorldWasm.SphericalRotation(); + rotDiff.phi = x; + rotDiff.theta = y; + return WorldWasm.PlayerRotAction.new(entityId, rotDiff); } - handleAction(action: WorldWasm.EntityAction) { + handleAction(action: WorldWasm.EntityActionDto) { const newAction = action.clone(); console.log("Handling action", newAction); this.game.handle_action_wasm(newAction); diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index 0a4d350..1811467 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -6,6 +6,7 @@ use super::entity_component::Component; pub type EntityId = u32; +#[derive(Debug)] pub struct Entity { pub id: EntityId, components: Vec>, diff --git a/lib/world/src/entities/entity_action.rs b/lib/world/src/entities/entity_action.rs index 5fb43f9..2f0f4ae 100644 --- a/lib/world/src/entities/entity_action.rs +++ b/lib/world/src/entities/entity_action.rs @@ -1,36 +1,19 @@ use std::any::Any; use wasm_bindgen::prelude::*; use std::fmt::Debug; +use super::entity::{Entity, EntityHolder, EntityId}; -use super::entity::Entity; - -#[wasm_bindgen] -pub struct EntityActionDto { - pub entity_id: super::entity::EntityId, - #[wasm_bindgen(skip)] - pub name: &'static str, - #[wasm_bindgen(skip)] - pub data: Box, -} - -pub trait EntityAction { - fn entity_id(&self) -> super::entity::EntityId; - fn get_name(&self) -> &'static str; - fn get_dto(&self) -> EntityActionDto; - fn handle(&self, entity: &mut Entity); -} - -pub trait CloneAny: Any + Debug { - fn clone_box(&self) -> Box; +pub trait ActionData: Any + Debug { + fn clone_box(&self) -> Box; fn as_any(&self) -> &dyn Any; } -impl CloneAny for T +impl ActionData for T where T: Any + Clone + Debug, { - fn clone_box(&self) -> Box { + fn clone_box(&self) -> Box { Box::new(self.clone()) } @@ -39,27 +22,74 @@ where } } + +#[wasm_bindgen] +#[derive(Debug)] +pub struct EntityActionDto { + pub entity_id: super::entity::EntityId, + #[wasm_bindgen(skip)] + pub name: &'static str, + #[wasm_bindgen(skip)] + pub data: Box, +} + impl EntityActionDto { - pub fn is_action_type(&self, name: &'static str) -> Option<&T> { - if self.name == name { - self.data.as_any().downcast_ref::() - } else { - None + pub fn get_data(&self) -> Option<&T> { + self.data.as_any().downcast_ref::() + } +} + +pub trait EntityActionHandler { + fn get_action_type(&self) -> &'static str; + fn handle_dto(&self, entity: &mut Entity, data: &EntityActionDto); +} + +pub trait EntityActionDtoMaker: EntityActionHandler { + fn get_action_type_static() -> &'static str; + + fn make_handler() -> Box + where + Self: Sized + Default + 'static, + { + Box::new(Self::default()) + } + + fn make_dto(entity_id: EntityId, data: T) -> EntityActionDto { + EntityActionDto { + entity_id, + name: Self::get_action_type_static(), + data: Box::new(data) } } } #[derive(Default)] pub struct EntityActionHolder { - actions: Vec>, + actions: Vec, + handlers: Vec>, } impl EntityActionHolder { - pub fn add_action(&mut self, action: Box) { - self.actions.push(action); + pub fn add(&mut self, dto: EntityActionDto) { + self.actions.push(dto); } - pub fn get_actions(&self) -> &Vec> { - &self.actions + pub fn add_handler(&mut self, handler: Box) { + self.handlers.push(handler); + } + + pub fn handle_actions(&self, entity_holder: &mut EntityHolder) { + for action in &self.actions { + println!("Handling action: {:?}", action); + let entity = entity_holder.get_entity_by_id_mut(action.entity_id); + println!("Entity: {:?}", entity); + if let Some(entity) = entity { + for handler in &self.handlers { + if handler.get_action_type() == action.name { + handler.handle_dto(entity, action); + } + } + } + } } } diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 5b4e2e8..8e8a4f7 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -42,10 +42,8 @@ impl Game { pub fn update(&mut self) { let world = &self.world; // apply actions - for action in self.action_holder.get_actions() { - let entity = self.entity_holder.get_entity_by_id_mut(action.entity_id()).unwrap(); - action.handle(entity); - } + + self.action_holder.handle_actions(&mut self.entity_holder); for script in self.scripts.get_scripts_mut() { let query = script.get_query(); @@ -153,7 +151,7 @@ impl GameSchedule { mod tests { use crate::{entities::{ - game::Game, player::make_player, player_jump_script::PlayerJumpAction, sandbox::SandBoxGScript + entity_action::EntityActionDtoMaker, game::Game, player::make_player, player_jump_script::{JumpAction, JumpActionData}, sandbox::SandBoxGScript }, geometry::velocity::Velocity}; #[test] @@ -175,13 +173,13 @@ mod tests { let player = make_player(1); game.schedule_entity_insert(player); game.update(); - let jump_action = Box::new(PlayerJumpAction::new(1)); - game.action_holder.add_action(jump_action); + let jump_action_handler = JumpAction::make_handler(); + game.action_holder.add_handler(jump_action_handler); + let jump_action = JumpAction::make_dto(1, JumpActionData{}); + game.action_holder.add(jump_action); game.update(); let player = game.entity_holder.get_entity_by_id(1).unwrap(); let player_vel = player.get::().unwrap(); - println!("player_vel: {:?}", player_vel); - assert!(player_vel.y > 0.0); } @@ -214,7 +212,7 @@ pub mod wasm { use crate::{ chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, entities::{ - entity::{Entity, EntityId}, entity_action::EntityAction, player::make_player, sandbox::SandBoxGScript + entity::{Entity, EntityId}, entity_action::{EntityActionDto}, player::{make_player, wasm::WasmPlayer}, sandbox::SandBoxGScript }, positions::{ChunkPos, WorldPos}, world::World, @@ -233,10 +231,6 @@ pub mod wasm { g } - // pub fn make_player_wasm() -> Entity { - // make_player(1) - // } - pub fn update_wasm(&mut self) { self.update(); } @@ -247,14 +241,9 @@ pub mod wasm { self.update(); } - // pub fn get_player_rot_script_wasm(&self, player_id: EntityId) -> Option { - // self.get_entity_script::(player_id) - // .and_then(|script| Some(*script)) - // } - - // pub fn handle_action_wasm(&mut self, action: EntityAction) { - // self.action_holder.add_action(action); - // } + pub fn handle_action_wasm(&mut self, action: EntityActionDto) { + self.action_holder.add(action); + } pub fn schedule_chunk_insert_wasm(&mut self, chunk: Chunk) { self.schedule_chunk_insert(chunk); @@ -302,25 +291,23 @@ pub mod wasm { Ok(chunk_pos_js) } - // pub fn add_player_wasm(&mut self, player: Player) { - // self.schedule_entity_insert(Box::new(player)); - // } - - // pub fn get_player_wasm(&self, player_id: EntityId) -> Result { - // let maybe_player = self.entity_holder.get_entity_by_id(player_id); - // if let Some(player) = maybe_player { - // let player_js = serde_wasm_bindgen::to_value(&player).unwrap(); - // Ok(player_js) - // } else { - // Err(Error::new("Player not found")) - // } - // } + pub fn get_player_wasm(&self, player_id: EntityId) -> Result { + let maybe_player = self.entity_holder.get_entity_by_id(player_id); + if let Some(player) = maybe_player { + let wasm_player = WasmPlayer::make_from_entity(player); + let player_js = serde_wasm_bindgen::to_value(&wasm_player).unwrap(); + Ok(player_js) + } else { + Err(Error::new("Player not found")) + } + } - // pub fn get_entities_wasm(&self) -> Result { - // let entities = self.entity_holder.get_all(); - // let entities_js = serde_wasm_bindgen::to_value(&entities).unwrap(); - // Ok(entities_js) - // } + pub fn get_players_wasm(&self) -> Result { + let players = self.entity_holder.get_all(); + let players_wasm: Vec = players.iter().map(|player| WasmPlayer::make_from_entity(player)).collect(); + let players_js = serde_wasm_bindgen::to_value(&players_wasm).unwrap(); + Ok(players_js) + } pub fn get_loaded_chunk_ids_wasm(&self) -> Vec { return self.world.get_loaded_chunk_ids(); diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index 08f2c7a..f96ae9c 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -7,24 +7,6 @@ use crate::{ use serde::{Deserialize, Serialize}; use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; - -// #[derive(Serialize, Deserialize)] -// #[wasm_bindgen] -// pub struct Player { -// // config -// speed: f32, -// max_speed: f32, -// gravity: f32, - -// #[wasm_bindgen(skip)] -// pub pos: FineWorldPos, -// dim: Size3, - -// pub is_flying: bool, -// on_ground: bool, -// } - - #[derive(Debug)] pub struct Flying { pub is_flying: bool, @@ -47,43 +29,28 @@ pub fn make_player(uid: EntityId) -> Entity { ent } -// impl Player { -// pub fn make(uid: EntityId) -> Player { -// Player { -// speed: 0.0, -// max_speed: 0.0, -// gravity: 0.0, -// uid, -// pos: FineWorldPos { -// x: 0.0, -// y: 0.0, -// z: 0.0, -// }, -// dim: Size3 { -// x: 0.8, -// y: 1.8, -// z: 0.8, -// }, -// rot: SphericalRotation::new(0.0, 0.0), -// vel: Velocity::zero(), -// is_flying: false, -// on_ground: false, -// moving_directions: Vec::new(), -// } -// } -// } - -// pub mod wasm { -// use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; - -// use crate::entities::entity::EntityId; - -// use super::Player; - -// #[wasm_bindgen] -// impl Player { -// pub fn make_wasm(uid: EntityId) -> JsValue { -// serde_wasm_bindgen::to_value(&Player::make(uid)).unwrap() -// } -// } -// } +pub mod wasm { + use serde::{Deserialize, Serialize}; + use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; + use crate::{entities::{entity::{Entity, EntityId}, player_move_script::MovingDirection}, geometry::{rotation::SphericalRotation, velocity::Velocity}, positions::FineWorldPos}; + + #[derive(Serialize, Deserialize)] + + pub struct WasmPlayer { + pos: FineWorldPos, + vel: Velocity, + rot: SphericalRotation, + moving_direction: MovingDirection, + } + + impl WasmPlayer { + pub fn make_from_entity(entity: &Entity) -> WasmPlayer { + WasmPlayer { + pos: entity.get::().unwrap().to_owned(), + vel: entity.get::().unwrap().to_owned(), + rot: entity.get::().unwrap().to_owned(), + moving_direction: entity.get::().unwrap().to_owned(), + } + } + } +} diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/entities/player_jump_script.rs index 569d66f..2208c3a 100644 --- a/lib/world/src/entities/player_jump_script.rs +++ b/lib/world/src/entities/player_jump_script.rs @@ -1,32 +1,26 @@ use crate::{geometry::velocity::Velocity, world::World}; use wasm_bindgen::prelude::wasm_bindgen; -use super::{entity::{Entity, EntityId, EntityQuery, EntityQueryResults}, entity_action::{EntityAction, EntityActionDto}, entity_component::impl_component, game::GameSchedule, game_script::GameScript, player::Flying}; +use super::{entity::{Entity, EntityId, EntityQuery, EntityQueryResults}, entity_action::{ActionData, EntityActionDto, EntityActionDtoMaker, EntityActionHandler}, entity_component::impl_component, game::GameSchedule, game_script::GameScript, player::Flying}; -#[wasm_bindgen] -pub struct PlayerJumpAction { - pub entity_id: EntityId, -} -impl PlayerJumpAction { - pub fn new(entity_id: EntityId) -> Self { - Self { entity_id } - } -} +#[derive(Clone, Debug)] +pub struct JumpActionData {} -impl EntityAction for PlayerJumpAction { - fn get_name(&self) -> &'static str { +#[derive(Clone, Debug, Default)] +pub struct JumpAction { } +impl EntityActionDtoMaker for JumpAction { + fn get_action_type_static() -> &'static str { "Jump-Action" } +} - fn get_dto(&self) -> EntityActionDto { - EntityActionDto { - entity_id: self.entity_id, - name: "Jump-Action", - data: Box::new(()), - } +impl EntityActionHandler for JumpAction { + fn get_action_type(&self) -> &'static str { + "Jump-Action" } - fn handle(&self, entity: &mut Entity) { + fn handle_dto(&self, entity: &mut Entity, data: &EntityActionDto) { + let _data = data.get_data::().unwrap(); let jump_data = entity.get::().unwrap().to_owned(); let vel = entity.get::().unwrap().to_owned(); @@ -61,10 +55,6 @@ impl EntityAction for PlayerJumpAction { entity.set::(new_jump_data); } - fn entity_id(&self) -> super::entity::EntityId { - self.entity_id - } - } #[wasm_bindgen] @@ -95,3 +85,16 @@ impl JumpData { } impl_component!(JumpData); + + +pub mod wasm { + use super::*; + + #[wasm_bindgen] + impl JumpAction { + pub fn make_wasm(entity_id: EntityId) -> EntityActionDto { + let data = JumpActionData { }; + JumpAction::make_dto(entity_id, data) + } + } +} \ No newline at end of file diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs index bb4c1a9..4aa73de 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/entities/player_move_script.rs @@ -1,32 +1,27 @@ use crate::{direction::Direction, geometry::{rotation::SphericalRotation, velocity::Velocity}}; use wasm_bindgen::prelude::*; -use super::{entity::{Entity, EntityId, EntityQuery, EntityQueryResults}, entity_action::{EntityAction, EntityActionDto}, entity_component::impl_component, game::GameSchedule, game_script::GameScript}; +use super::{entity::{Entity, EntityQuery, EntityQueryResults}, entity_action::{ActionData, EntityActionDto, EntityActionHandler, EntityActionDtoMaker}, entity_component::impl_component, game::GameSchedule, game_script::GameScript}; #[wasm_bindgen] -pub struct PlayerMoveAction { - pub entity_id: super::entity::EntityId, - pub direction: crate::direction::Direction, +#[derive(Clone, Debug)] +pub struct MoveActionData { + pub direction: Direction, } -impl EntityAction for PlayerMoveAction { - fn entity_id(&self) -> EntityId { - self.entity_id +pub struct MoveAction { } +impl EntityActionDtoMaker for MoveAction { + fn get_action_type_static() -> &'static str { + "PlayerMove" } - - fn get_name(&self) -> &'static str { - "player_move" - } - - fn get_dto(&self) -> EntityActionDto { - EntityActionDto { - entity_id: self.entity_id, - name: self.get_name(), - data: Box::new(self.direction), - } +} +impl EntityActionHandler for MoveAction { + fn get_action_type(&self) -> &'static str { + "PlayerMove" } - fn handle(&self, entity: &mut Entity) { - entity.set::(Some(self.direction)); + fn handle_dto(&self, entity: &mut Entity, data: &EntityActionDto) { + let data = data.get_data::().unwrap(); + entity.set::(Some(data.direction)); } } diff --git a/lib/world/src/entities/player_rot_script.rs b/lib/world/src/entities/player_rot_script.rs index 25ff4f3..380d7f9 100644 --- a/lib/world/src/entities/player_rot_script.rs +++ b/lib/world/src/entities/player_rot_script.rs @@ -1,33 +1,41 @@ -use super::entity::EntityId; -use super::entity_action::{EntityAction, EntityActionDto}; +use super::entity::{Entity, EntityId}; +use super::entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}; use crate::geometry::rotation::SphericalRotation; use wasm_bindgen::prelude::wasm_bindgen; #[wasm_bindgen] -pub struct PlayerRotAction { - pub player_id: EntityId, +#[derive(Clone, Debug)] +pub struct RotateActionData { pub rot_diff: SphericalRotation, } -impl EntityAction for PlayerRotAction { - fn entity_id(&self) -> super::entity::EntityId { - self.player_id +pub struct RotateAction { } +impl EntityActionDtoMaker for RotateAction { + fn get_action_type_static() -> &'static str { + "PlayerRot-Action" } - - fn get_name(&self) -> &'static str { +} +impl EntityActionHandler for RotateAction { + fn get_action_type(&self) -> &'static str { "PlayerRot" } - fn get_dto(&self) -> super::entity_action::EntityActionDto { - EntityActionDto { - entity_id: self.player_id, - name: "PlayerRot", - data: Box::new(self.rot_diff), - } - } + fn handle_dto(&self, entity: &mut Entity, data: &EntityActionDto) { + let data = data.get_data::().unwrap(); - fn handle(&self, entity: &mut super::entity::Entity) { - let new_rot = entity.get::().unwrap().to_owned() + self.rot_diff; + let new_rot = entity.get::().unwrap().to_owned() + data.rot_diff; entity.set::(new_rot); } } + +pub mod wasm { + use super::*; + + #[wasm_bindgen] + impl RotateAction { + pub fn make_wasm(entity_id: EntityId, rot_diff: SphericalRotation) -> EntityActionDto { + let data = RotateActionData { rot_diff }; + RotateAction::make_dto(entity_id, data) + } + } +} \ No newline at end of file diff --git a/lib/world/src/entities/velocity_script.rs b/lib/world/src/entities/velocity_script.rs index a53320c..a212e23 100644 --- a/lib/world/src/entities/velocity_script.rs +++ b/lib/world/src/entities/velocity_script.rs @@ -1,5 +1,5 @@ use crate::{geometry::velocity::Velocity, positions::{FineWorldPos, WorldPos}}; -use super::{entity::{EntityQuery, EntityQueryResults}, entity_action::EntityAction, game::GameSchedule, game_script::GameScript}; +use super::{entity::{EntityQuery, EntityQueryResults}, game::GameSchedule, game_script::GameScript}; #[derive(Debug)] From 6b7d9e40c75dbac0d9ac8cac0f35513edcd460dd Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 1 Sep 2024 12:27:14 -0700 Subject: [PATCH 09/61] Almost all vectors build --- .zed/settings.json | 9 + lib/world/src/chunk.rs | 4 +- lib/world/src/chunk/chunk_duct.rs | 4 +- lib/world/src/chunk/chunk_mesh.rs | 15 +- lib/world/src/components/fine_world_pos.rs | 69 ++ lib/world/src/components/mod.rs | 4 + lib/world/src/components/size3.rs | 15 + lib/world/src/components/velocity.rs | 30 + lib/world/src/components/world_pos.rs | 58 ++ lib/world/src/direction.rs | 86 ++- lib/world/src/entities/entity.rs | 66 +- lib/world/src/entities/game.rs | 46 +- lib/world/src/entities/player.rs | 36 +- lib/world/src/entities/player_jump_script.rs | 4 +- lib/world/src/entities/player_move_script.rs | 33 +- lib/world/src/entities/sandbox.rs | 11 +- lib/world/src/entities/terrain_gen.rs | 19 +- lib/world/src/entities/velocity_script.rs | 14 +- lib/world/src/geometry/line_segment.rs | 61 +- lib/world/src/geometry/mod.rs | 2 +- lib/world/src/geometry/ray.rs | 30 +- lib/world/src/geometry/rect3.rs | 48 +- lib/world/src/geometry/rotation.rs | 52 +- lib/world/src/geometry/vec2.rs | 155 ++++ lib/world/src/geometry/velocity.rs | 14 - lib/world/src/lib.rs | 1 + lib/world/src/plane.rs | 7 +- lib/world/src/positions.rs | 106 +-- lib/world/src/vec.rs | 717 ++++++++++--------- lib/world/src/world/mod.rs | 10 +- lib/world/src/world/world_block.rs | 9 +- lib/world/src/world/world_chunk.rs | 14 +- lib/world/src/world/world_mesh.rs | 13 +- 33 files changed, 1123 insertions(+), 639 deletions(-) create mode 100644 .zed/settings.json create mode 100644 lib/world/src/components/fine_world_pos.rs create mode 100644 lib/world/src/components/mod.rs create mode 100644 lib/world/src/components/size3.rs create mode 100644 lib/world/src/components/velocity.rs create mode 100644 lib/world/src/components/world_pos.rs create mode 100644 lib/world/src/geometry/vec2.rs delete mode 100644 lib/world/src/geometry/velocity.rs diff --git a/.zed/settings.json b/.zed/settings.json new file mode 100644 index 0000000..dffe4d3 --- /dev/null +++ b/.zed/settings.json @@ -0,0 +1,9 @@ +// Folder-specific settings +// +// For a full list of overridable settings, and general information on folder-specific settings, +// see the documentation: https://zed.dev/docs/configuring-zed#settings-files +{ + "rust-analyzer": { + "linkedProjects": ["./lib/world/Cargo.toml"] + } +} diff --git a/lib/world/src/chunk.rs b/lib/world/src/chunk.rs index ccc77e8..d9d8019 100644 --- a/lib/world/src/chunk.rs +++ b/lib/world/src/chunk.rs @@ -99,8 +99,8 @@ impl Chunk { .collect() } - pub fn get_uuid(&self) -> String { - self.position.to_index() + pub fn get_uuid(&self) -> u64 { + self.position.to_id() } pub fn add_block(&mut self, block: ChunkBlock) { diff --git a/lib/world/src/chunk/chunk_duct.rs b/lib/world/src/chunk/chunk_duct.rs index 256b221..6c94e44 100644 --- a/lib/world/src/chunk/chunk_duct.rs +++ b/lib/world/src/chunk/chunk_duct.rs @@ -15,8 +15,8 @@ impl Chunk { }) } - pub fn get_chunk_id(&self) -> String { - self.position.to_index() + pub fn get_chunk_id(&self) -> u64 { + self.position.to_id() } pub fn add_block_wasm(&mut self, js_block: JsValue) -> Result<(), Error> { diff --git a/lib/world/src/chunk/chunk_mesh.rs b/lib/world/src/chunk/chunk_mesh.rs index 4ede490..a1ee53e 100644 --- a/lib/world/src/chunk/chunk_mesh.rs +++ b/lib/world/src/chunk/chunk_mesh.rs @@ -1,10 +1,7 @@ use crate::{ - direction::Directions, - plane::WorldPlane, - positions::{ChunkPos, InnerChunkPos, WorldPos}, + components::world_pos::WorldPos, direction::Directions, plane::WorldPlane, positions::{ChunkPos, InnerChunkPos} }; use js_sys::wasm_bindgen; - use wasm_bindgen::prelude::*; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -81,9 +78,7 @@ impl IntoIterator for &ChunkMesh { #[cfg(test)] mod tests { use crate::{ - chunk::chunk_mesh::{BlockMesh, ChunkMesh}, - direction::Directions, - positions::{ChunkPos, WorldPos}, + chunk::chunk_mesh::{BlockMesh, ChunkMesh}, components::world_pos::WorldPos, direction::Directions, positions::ChunkPos, vec::Vector3Ops }; #[test] @@ -92,9 +87,9 @@ mod tests { let mut chunk_mesh = ChunkMesh::new(chunk_pos); let world_pos = WorldPos::new(0, 0, 0); let directions = Directions::all(); - chunk_mesh.insert(world_pos, directions); + chunk_mesh.insert(world_pos.clone(), directions); assert_eq!( - chunk_mesh.get(world_pos), + chunk_mesh.get(world_pos.clone()), BlockMesh { world_pos, directions @@ -108,7 +103,7 @@ mod tests { let chunk_mesh = ChunkMesh::new(chunk_pos); let world_pos = WorldPos::new(0, 0, 0); assert_eq!( - chunk_mesh.get(world_pos), + chunk_mesh.get(world_pos.clone()), BlockMesh { world_pos, directions: Directions::empty() diff --git a/lib/world/src/components/fine_world_pos.rs b/lib/world/src/components/fine_world_pos.rs new file mode 100644 index 0000000..93d204c --- /dev/null +++ b/lib/world/src/components/fine_world_pos.rs @@ -0,0 +1,69 @@ +use std::ops::Add; +use crate::components::world_pos::WorldPos; +use crate::{entities::entity_component::impl_component, vec::{impl_vector_ops, Vec3f32, Vector3Ops}}; +use wasm_bindgen::prelude::*; +use serde::{Deserialize, Serialize}; + +use super::velocity::Velocity; + +const PRECISION: f32 = 0.001; // Precision to three decimal places + +#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq)] +#[wasm_bindgen] +pub struct FineWorldPos { + pub x: f32, + pub y: f32, + pub z: f32, +} + +impl_component!(FineWorldPos); + +impl_vector_ops!(FineWorldPos, f32); + +impl FineWorldPos { + pub fn from_vec3(vec: Vec3f32) -> Self { + Self { + x: vec.x(), + y: vec.y(), + z: vec.z(), + } + } + + pub fn new(x: f32, y: f32, z: f32) -> Self { + Self { x, y, z } + } + + + pub fn to_world_pos(&self) -> WorldPos { + WorldPos { + x: self.x as i32, + y: self.y as i32, + z: self.z as i32, + } + } + + pub fn round(&mut self) { + self.x = (self.x / PRECISION).round() * PRECISION; + self.y = (self.y / PRECISION).round() * PRECISION; + self.z = (self.z / PRECISION).round() * PRECISION; + } + + pub fn equal(&self, other: &FineWorldPos) -> bool { + (self.x - other.x).abs() < PRECISION + && (self.y - other.y).abs() < PRECISION + && (self.z - other.z).abs() < PRECISION + } +} + + +impl Add for FineWorldPos { + type Output = Self; + + fn add(self, other: Velocity) -> Self { + Self { + x: self.x + other.x, + y: self.y + other.y, + z: self.z + other.z, + } + } +} \ No newline at end of file diff --git a/lib/world/src/components/mod.rs b/lib/world/src/components/mod.rs new file mode 100644 index 0000000..88cfae3 --- /dev/null +++ b/lib/world/src/components/mod.rs @@ -0,0 +1,4 @@ +pub mod fine_world_pos; +pub mod velocity; +pub mod world_pos; +pub mod size3; \ No newline at end of file diff --git a/lib/world/src/components/size3.rs b/lib/world/src/components/size3.rs new file mode 100644 index 0000000..e7c8c44 --- /dev/null +++ b/lib/world/src/components/size3.rs @@ -0,0 +1,15 @@ +use serde::{Deserialize, Serialize}; +use wasm_bindgen::prelude::*; +use crate::{entities::entity_component::impl_component, positions::{ChunkPos, InnerChunkPos}, vec::{impl_vector_ops, Vector3Ops}}; + +#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq)] +#[wasm_bindgen] +pub struct Size3 { + pub x: f32, + pub y: f32, + pub z: f32, +} + +impl_component!(Size3); + +impl_vector_ops!(Size3, f32); \ No newline at end of file diff --git a/lib/world/src/components/velocity.rs b/lib/world/src/components/velocity.rs new file mode 100644 index 0000000..0fe69e2 --- /dev/null +++ b/lib/world/src/components/velocity.rs @@ -0,0 +1,30 @@ +use crate::{entities::entity_component::impl_component, vec::impl_vector_ops}; +use serde::{Deserialize, Serialize}; +use wasm_bindgen::prelude::*; + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[wasm_bindgen] +pub struct Velocity { + pub x: f32, + pub y: f32, + pub z: f32, +} + +impl_component!(Velocity); +impl_vector_ops!(Velocity, f32); + + +impl Velocity { + pub fn new(x: f32, y: f32, z: f32) -> Velocity { + Velocity { x, y, z } + } + + pub fn zero() -> Velocity { + Velocity { + x: 0.0, + y: 0.0, + z: 0.0, + } + } +} + diff --git a/lib/world/src/components/world_pos.rs b/lib/world/src/components/world_pos.rs new file mode 100644 index 0000000..becc336 --- /dev/null +++ b/lib/world/src/components/world_pos.rs @@ -0,0 +1,58 @@ +use serde::{Deserialize, Serialize}; +use wasm_bindgen::prelude::*; + +use crate::{chunk::CHUNK_WIDTH, entities::entity_component::impl_component, positions::{ChunkPos, InnerChunkPos}, vec::{impl_vector_ops, Vector3Ops}}; + +use super::fine_world_pos::FineWorldPos; + +#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, Eq)] +#[wasm_bindgen] +pub struct WorldPos { + pub x: i32, + pub y: i32, + pub z: i32, +} + +impl_component!(WorldPos); + +impl_vector_ops!(WorldPos, i32); + +impl WorldPos { + pub fn is_valid(&self) -> bool { + self.y >= 0 && self.y < 256 + } + + pub fn to_fine_world_pos(&self) -> FineWorldPos { + FineWorldPos { + x: self.x as f32, + y: self.y as f32, + z: self.z as f32, + } + } + + pub fn to_inner_chunk_pos(&self) -> InnerChunkPos { + let x = (((self.x as i8 % 16) + 16) % 16) as i8; + let y = self.y as i8; + let z = (((self.z as i8 % 16) + 16) % 16) as i8; + InnerChunkPos::new(x, y, z) + } + + pub fn to_chunk_pos(&self) -> ChunkPos { + let x = if self.x < 0 { + ((self.x + 1) / CHUNK_WIDTH as i32) - 1 + } else { + self.x / CHUNK_WIDTH as i32 + }; + + let y = if self.z < 0 { + ((self.z + 1) / CHUNK_WIDTH as i32) - 1 + } else { + self.z / CHUNK_WIDTH as i32 + }; + + ChunkPos { + x: x as i16, + y: y as i16, + } + } +} \ No newline at end of file diff --git a/lib/world/src/direction.rs b/lib/world/src/direction.rs index b5b3d0d..b2645ff 100644 --- a/lib/world/src/direction.rs +++ b/lib/world/src/direction.rs @@ -1,4 +1,5 @@ -use crate::geometry::rotation::SphericalRotation; +use crate::{geometry::{rotation::SphericalRotation, vec2::Vec2Ops}, vec::Vector3Ops}; +use num::One; use serde::{Deserialize, Serialize}; use std::{ f32::consts::PI, @@ -195,3 +196,86 @@ impl Into for Direction { } } } + + +pub trait DirectionVectorExtension: Vector3Ops { + fn get_component_from_direction(&self, direction: Direction) -> Self::Scalar { + match direction { + Direction::North => self.z(), + Direction::South => self.z(), + Direction::East => self.x(), + Direction::West => self.x(), + Direction::Up => self.y(), + Direction::Down => self.y(), + } + } + + fn get_opposite_components_from_direction(&self, direction: Direction) -> (Self::Scalar, Self::Scalar) { + match direction { + Direction::North => (self.x(), self.y()), + Direction::South => (self.x(), self.y()), + Direction::East => (self.y(), self.z()), + Direction::West => (self.y(), self.z()), + Direction::Up => (self.x(), self.z()), + Direction::Down => (self.x(), self.z()), + } + } + + fn get_component_from_axis(&self, axis: Axis) -> Self::Scalar { + match axis { + Axis::X => self.x(), + Axis::Y => self.y(), + Axis::Z => self.z(), + } + } + + fn set_component_from_axis(&mut self, axis: Axis, val: Self::Scalar) { + match axis { + Axis::X => self.set_x(val), + Axis::Y => self.set_y(val), + Axis::Z => self.set_z(val), + } + } + + fn move_direction(&self, direction: &Direction) -> Self { + let mut new_vec = self.copy(); + match direction { + Direction::North => new_vec.set_z(new_vec.z() + One::one()), + Direction::South => new_vec.set_z(new_vec.z() - One::one()), + Direction::East => new_vec.set_x(new_vec.x() + One::one()), + Direction::West => new_vec.set_x(new_vec.x() - One::one()), + Direction::Up => new_vec.set_y(new_vec.y() + One::one()), + Direction::Down => new_vec.set_y(new_vec.y() - One::one()), + } + new_vec + } + + fn move_in_flat_direction(&self, direction: &FlatDirection) -> Self { + let mut new_vec = self.copy(); + match direction { + FlatDirection::North => new_vec.set_y(new_vec.y() + One::one()), + FlatDirection::South => new_vec.set_y(new_vec.y() - One::one()), + FlatDirection::East => new_vec.set_x(new_vec.x() + One::one()), + FlatDirection::West => new_vec.set_x(new_vec.x() - One::one()) + } + new_vec + } + +} + +impl DirectionVectorExtension for V {} + +pub trait DirectionVectorExtension2: Vec2Ops { + fn move_in_flat_direction(&self, direction: &FlatDirection) -> Self { + let mut new_vec = self.copy(); + match direction { + FlatDirection::North => new_vec.set_y(new_vec.y() + One::one()), + FlatDirection::South => new_vec.set_y(new_vec.y() - One::one()), + FlatDirection::East => new_vec.set_x(new_vec.x() + One::one()), + FlatDirection::West => new_vec.set_x(new_vec.x() - One::one()) + } + new_vec + } +} + +impl DirectionVectorExtension2 for V {} diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index 1811467..fbeb9e6 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -1,11 +1,13 @@ -use std::{any::{Any, TypeId}, fmt::Debug}; +use std::{ + any::{Any, TypeId}, + fmt::Debug, +}; use wasm_bindgen::prelude::*; use super::entity_component::Component; pub type EntityId = u32; - #[derive(Debug)] pub struct Entity { pub id: EntityId, @@ -14,7 +16,10 @@ pub struct Entity { impl Entity { pub fn new(id: EntityId) -> Self { - Self { id, components: Vec::new() } + Self { + id, + components: Vec::new(), + } } pub fn add(&mut self, component: T) { @@ -22,32 +27,46 @@ impl Entity { } pub fn get(&self) -> Option<&T> { - self.components.iter().find_map(|c| c.as_any().downcast_ref::()) + self.components + .iter() + .find_map(|c| c.as_any().downcast_ref::()) } pub fn set(&mut self, component: T) { - self.components.retain(|c| c.as_any().type_id() != TypeId::of::()); + self.components + .retain(|c| c.as_any().type_id() != TypeId::of::()); self.components.push(Box::new(component)); } pub fn has(&self) -> bool { - self.components.iter().any(|c| c.type_id() == TypeId::of::()) + self.components + .iter() + .any(|c| c.as_any().type_id() == TypeId::of::()) } pub fn has_typeid(&self, type_id: TypeId) -> bool { - self.components.iter().any(|c| c.type_id() == type_id) + self.components + .iter() + .any(|c| c.as_any().type_id() == type_id) + } + + pub fn print_components(&self) { + println!("Entity ID: {:?}", self.id); + for component in &self.components { + println!("Component: {:?}", component); + println!("Component Type ID: {:?}", component.as_any().type_id()); + } } } +#[derive(Debug)] pub struct EntityQuery { type_ids: Vec, } impl EntityQuery { pub fn new() -> Self { - Self { - type_ids: vec![], - } + Self { type_ids: vec![] } } pub fn add(&mut self) { @@ -56,6 +75,7 @@ impl EntityQuery { } // New struct to hold mutable references to filtered entities +#[derive(Debug)] pub struct EntityQueryResults<'a> { pub entities: Vec<&'a mut Entity>, } @@ -65,18 +85,6 @@ impl<'a> EntityQueryResults<'a> { Self { entities } } - // pub fn get_entity_mut(&mut self, id: EntityId) -> Option<&'a mut Entity> { - // self.entities.iter_mut().find_map(|entity| { - // if entity.id == id { - // Some(entity) - // } else { - // None - // } - // }) - // } - - - // Add methods to work with the filtered entities if needed pub fn len(&self) -> usize { self.entities.len() } @@ -114,13 +122,17 @@ impl EntityHolder { } pub fn query(&mut self, filter: &EntityQuery) -> EntityQueryResults { - let filtered_entities = self.entities + let filtered_entities = self + .entities .iter_mut() - .filter(|entity| filter.type_ids.iter().all(|&type_id| - entity.has_typeid(type_id) - )) + .filter(|entity| { + filter + .type_ids + .iter() + .all(|&type_id| entity.has_typeid(type_id)) + }) .collect(); EntityQueryResults::new(filtered_entities) } -} \ No newline at end of file +} diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 8e8a4f7..742ba0b 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -150,9 +150,9 @@ impl GameSchedule { } mod tests { - use crate::{entities::{ - entity_action::EntityActionDtoMaker, game::Game, player::make_player, player_jump_script::{JumpAction, JumpActionData}, sandbox::SandBoxGScript - }, geometry::velocity::Velocity}; + use crate::{direction::Direction, entities::{ + entity_action::EntityActionDtoMaker, game::Game, player::make_player, player_jump_script::{JumpAction, JumpActionData}, player_move_script::{MoveAction, MoveActionData, MoveScript}, sandbox::SandBoxGScript, velocity_script::{self, VelocityScript} + }, components::{fine_world_pos::FineWorldPos, velocity::Velocity}}; #[test] pub fn add_player() { @@ -183,6 +183,37 @@ mod tests { assert!(player_vel.y > 0.0); } + #[test] + pub fn move_script() { + let mut game = Game::new(); + let player = make_player(1); + player.print_components(); + + game.schedule_entity_insert(player); + game.update(); + + let move_script = Box::new(MoveScript::default()); + game.add_script(move_script); + game.update(); + + let velocity_script = Box::new(VelocityScript::default()); + game.add_script(velocity_script); + game.update(); + + game.action_holder.add_handler(MoveAction::make_handler()); + + let move_action = MoveAction::make_dto(1, MoveActionData { + direction: Direction::North, + }); + game.action_holder.add(move_action); + game.update(); + + let player = game.entity_holder.get_entity_by_id(1).unwrap(); + let player_pos = player.get::().unwrap(); + assert!(player_pos.z > 0.0); + + } + #[test] pub fn generate_chunk() { let mut game = Game::new(); @@ -210,12 +241,9 @@ pub mod wasm { use super::{Game, GameDiff, GameSchedule, GameScript}; use crate::{ - chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, - entities::{ - entity::{Entity, EntityId}, entity_action::{EntityActionDto}, player::{make_player, wasm::WasmPlayer}, sandbox::SandBoxGScript - }, - positions::{ChunkPos, WorldPos}, - world::World, + chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, components::world_pos::WorldPos, entities::{ + entity::{Entity, EntityId}, entity_action::EntityActionDto, player::{make_player, wasm::WasmPlayer}, sandbox::SandBoxGScript + }, positions::ChunkPos, world::World }; use serde_wasm_bindgen::{from_value, Error}; use wasm_bindgen::prelude::*; diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index f96ae9c..2cbeed3 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -1,11 +1,13 @@ -use std::fs::File; -use super::{entity::{Entity, EntityId}, entity_component::impl_component, player_jump_script::JumpData, player_move_script::MovingDirection}; +use super::{ + entity::{Entity, EntityId}, + entity_component::impl_component, + player_jump_script::JumpData, + player_move_script::MovingDirection, +}; use crate::{ - direction::Direction, geometry::{rotation::SphericalRotation, velocity::Velocity}, positions::FineWorldPos, - vec::Vec3, world::World, + components::{fine_world_pos::FineWorldPos, velocity::Velocity}, + geometry::rotation::SphericalRotation, }; -use serde::{Deserialize, Serialize}; -use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; #[derive(Debug)] pub struct Flying { @@ -14,15 +16,10 @@ pub struct Flying { } impl_component!(Flying); - pub fn make_player(uid: EntityId) -> Entity { let mut ent = Entity::new(uid); - ent.add::(FineWorldPos { - x: 0.0, - y: 0.0, - z: 0.0, - }); - ent.add::(Velocity::zero()); + ent.add::(FineWorldPos::default()); + ent.add::(Velocity::default()); ent.add::(SphericalRotation::new(0.0, 0.0)); ent.add::(None); ent.add::(JumpData::new(2.0)); @@ -30,9 +27,14 @@ pub fn make_player(uid: EntityId) -> Entity { } pub mod wasm { + use crate::{ + components::{fine_world_pos::FineWorldPos, velocity::Velocity}, entities::{ + entity::{Entity, EntityId}, + player_move_script::MovingDirection, + }, geometry::rotation::SphericalRotation + }; use serde::{Deserialize, Serialize}; use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; - use crate::{entities::{entity::{Entity, EntityId}, player_move_script::MovingDirection}, geometry::{rotation::SphericalRotation, velocity::Velocity}, positions::FineWorldPos}; #[derive(Serialize, Deserialize)] @@ -46,9 +48,9 @@ pub mod wasm { impl WasmPlayer { pub fn make_from_entity(entity: &Entity) -> WasmPlayer { WasmPlayer { - pos: entity.get::().unwrap().to_owned(), - vel: entity.get::().unwrap().to_owned(), - rot: entity.get::().unwrap().to_owned(), + pos: entity.get::().unwrap().clone(), + vel: entity.get::().unwrap().clone(), + rot: entity.get::().unwrap().clone(), moving_direction: entity.get::().unwrap().to_owned(), } } diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/entities/player_jump_script.rs index 2208c3a..c370bee 100644 --- a/lib/world/src/entities/player_jump_script.rs +++ b/lib/world/src/entities/player_jump_script.rs @@ -1,4 +1,4 @@ -use crate::{geometry::velocity::Velocity, world::World}; +use crate::{components::velocity::Velocity, vec::Vector3Ops, world::World}; use wasm_bindgen::prelude::wasm_bindgen; use super::{entity::{Entity, EntityId, EntityQuery, EntityQueryResults}, entity_action::{ActionData, EntityActionDto, EntityActionDtoMaker, EntityActionHandler}, entity_component::impl_component, game::GameSchedule, game_script::GameScript, player::Flying}; @@ -47,7 +47,7 @@ impl EntityActionHandler for JumpAction { z: 0.0, }; - let new_vel = jump_force + vel; + let new_vel = vel.add(&jump_force); println!("new_vel: {:?}", new_vel); diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs index 4aa73de..1b64a40 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/entities/player_move_script.rs @@ -1,5 +1,6 @@ -use crate::{direction::Direction, geometry::{rotation::SphericalRotation, velocity::Velocity}}; use wasm_bindgen::prelude::*; +use crate::{components::{fine_world_pos::FineWorldPos, velocity::Velocity}, direction::Direction, geometry::rotation::SphericalRotation}; + use super::{entity::{Entity, EntityQuery, EntityQueryResults}, entity_action::{ActionData, EntityActionDto, EntityActionHandler, EntityActionDtoMaker}, entity_component::impl_component, game::GameSchedule, game_script::GameScript}; #[wasm_bindgen] @@ -8,15 +9,16 @@ pub struct MoveActionData { pub direction: Direction, } +#[derive(Clone, Debug, Default)] pub struct MoveAction { } impl EntityActionDtoMaker for MoveAction { fn get_action_type_static() -> &'static str { - "PlayerMove" + "Move" } } impl EntityActionHandler for MoveAction { fn get_action_type(&self) -> &'static str { - "PlayerMove" + "Move" } fn handle_dto(&self, entity: &mut Entity, data: &EntityActionDto) { @@ -28,10 +30,10 @@ impl EntityActionHandler for MoveAction { pub type MovingDirection = Option; impl_component!(MovingDirection); -#[derive(Debug)] -pub struct PlayerMoveScript { } +#[derive(Debug, Default)] +pub struct MoveScript { } -impl GameScript for PlayerMoveScript { +impl GameScript for MoveScript { fn get_query(&self) -> EntityQuery { let mut query = EntityQuery::new(); @@ -41,20 +43,19 @@ impl GameScript for PlayerMoveScript { query } - fn update(&mut self, world: &crate::world::World, query_results: EntityQueryResults) -> Option { + fn update(&mut self, _world: &crate::world::World, query_results: EntityQueryResults) -> Option { for entity in query_results.entities { - let mut new_rot = entity.get::().unwrap(); - let moving_dir = entity.get::().unwrap(); - let vel = entity.get::().unwrap().to_owned(); - - // let force = moving_dir.into(); + let rot = entity.get::().unwrap().to_owned(); + let moving_dir = entity.get::().unwrap().to_owned(); - let new_vel = vel; + println!("moving dir: {:?}", moving_dir); - entity.set::(new_vel); + if moving_dir.is_some() { + let new_vel: Velocity = rot.into(); + entity.set::(new_vel); + } } None } -} - +} \ No newline at end of file diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index 4693561..fbeac62 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -1,7 +1,7 @@ use super::{ - entity::EntityQueryResults, game::{Game, GameDiff, GameSchedule}, game_script::GameScript, terrain_gen::TerrainGenerator + entity::{EntityQuery, EntityQueryResults}, game::{Game, GameDiff, GameSchedule}, game_script::GameScript, terrain_gen::TerrainGenerator }; -use crate::{positions::{ChunkPos, FineWorldPos}, world::World}; +use crate::{components::fine_world_pos::FineWorldPos, positions::ChunkPos, world::World}; #[derive(Debug)] pub struct SandBoxGScript { @@ -49,6 +49,13 @@ impl SandBoxGScript { } impl GameScript for SandBoxGScript { + + fn get_query(&self) -> EntityQuery { + let mut query = EntityQuery::new(); + query.add::(); + query + } + fn update(&mut self, world: &World, query_results: EntityQueryResults) -> Option { let entity_poses: Vec = query_results.entities.iter().map(|ent| ent.get::().unwrap().clone()).collect(); diff --git a/lib/world/src/entities/terrain_gen.rs b/lib/world/src/entities/terrain_gen.rs index e474bb8..494a5ed 100644 --- a/lib/world/src/entities/terrain_gen.rs +++ b/lib/world/src/entities/terrain_gen.rs @@ -1,14 +1,11 @@ use crate::{ - block::{BlockData, BlockType, ChunkBlock}, - chunk::{Chunk, CHUNK_WIDTH}, - direction::{Direction, Directions, EVERY_FLAT_DIRECTION}, - positions::{ChunkPos, InnerChunkPos, WorldPos}, - world::world_block::WorldBlock, + block::{BlockData, BlockType, ChunkBlock}, chunk::{Chunk, CHUNK_WIDTH}, components::world_pos::WorldPos, direction::{Direction, DirectionVectorExtension, Directions, EVERY_FLAT_DIRECTION}, geometry::vec2::Vec2Ops, positions::{ChunkPos, InnerChunkPos}, vec::Vector3Ops, world::world_block::WorldBlock }; use noise::{NoiseFn, Perlin}; use rand::{rngs::StdRng, SeedableRng}; use rand_distr::{Distribution, Uniform}; use serde::{Deserialize, Serialize}; +use crate::direction::DirectionVectorExtension2; // remove all the positions that are too close to each other in the chunk fn remove_close_positions<'a, I, J>(pos_iter: I, checking_pos_iter: J) -> Vec @@ -21,7 +18,7 @@ where for pos in pos_iter { let mut too_close = false; for other_pos in checking_pos_iter.clone() { - if pos.distance_to_2::(&other_pos) < 3.0 { + if pos.distance_to(other_pos) < 3.0 { too_close = true; break; } @@ -146,7 +143,7 @@ impl TreeRandomSpreadGenerator { // loop over and make sure that the tree is not too close to any other trees let mut too_close = false; for other_pos in tree_locations.iter() { - if pos.distance_to_2::(&other_pos) < 3.0 { + if pos.distance_to(other_pos) < 3.0 { too_close = true; break; } @@ -365,7 +362,7 @@ impl BasicChunkGetter { for y in 0u8..height { let block = ChunkBlock { - pos: InnerChunkPos::new(x, y, z), + pos: InnerChunkPos::new(x as i8, y as i8, z as i8), block_type: BlockType::Stone, extra_data: BlockData::None, }; @@ -374,7 +371,7 @@ impl BasicChunkGetter { } // add top grass block let block = ChunkBlock { - pos: InnerChunkPos::new(x, height, z), + pos: InnerChunkPos::new(x as i8, height as i8, z as i8), block_type: BlockType::Grass, extra_data: BlockData::None, }; @@ -394,7 +391,7 @@ impl FlatWorldChunkGetter { for x in 0u8..CHUNK_WIDTH as u8 { for z in 0u8..CHUNK_WIDTH as u8 { let block = ChunkBlock { - pos: InnerChunkPos::new(x, 0, z), + pos: InnerChunkPos::new(x as i8, 0, z as i8), block_type: BlockType::Grass, extra_data: BlockData::None, }; @@ -467,7 +464,7 @@ impl ParkorChunkGetter { let mut count = 0; // keep loading the next block until it isn't load distance away from me - while next_block.world_pos.to_chunk_pos().distance_to(*chunk_pos) as u8 + while next_block.world_pos.to_chunk_pos().distance_to(chunk_pos) as u8 <= self.load_distance && count < 10 { diff --git a/lib/world/src/entities/velocity_script.rs b/lib/world/src/entities/velocity_script.rs index a212e23..b04484a 100644 --- a/lib/world/src/entities/velocity_script.rs +++ b/lib/world/src/entities/velocity_script.rs @@ -1,13 +1,17 @@ -use crate::{geometry::velocity::Velocity, positions::{FineWorldPos, WorldPos}}; +use crate::components::{fine_world_pos::FineWorldPos, velocity::Velocity}; + use super::{entity::{EntityQuery, EntityQueryResults}, game::GameSchedule, game_script::GameScript}; -#[derive(Debug)] -struct VelocityScript { } +#[derive(Debug, Default)] +pub struct VelocityScript { } impl GameScript for VelocityScript { fn get_query(&self) -> EntityQuery { - super::entity::EntityQuery::new() + let mut query = EntityQuery::new(); + query.add::(); + query.add::(); + query } fn update(&mut self, _world: &crate::world::World, query_results: EntityQueryResults) -> Option { @@ -15,6 +19,8 @@ impl GameScript for VelocityScript { let vel = entity.get::().unwrap().to_owned(); let pos = entity.get::().unwrap().to_owned(); + println!("entity_id: {:?} pos: {:?}, vel: {:?}", entity.id, pos, vel); + let new_pos = pos + vel; entity.set::(new_pos); diff --git a/lib/world/src/geometry/line_segment.rs b/lib/world/src/geometry/line_segment.rs index 799feaf..4581991 100644 --- a/lib/world/src/geometry/line_segment.rs +++ b/lib/world/src/geometry/line_segment.rs @@ -1,5 +1,6 @@ use crate::{ - chunk::chunk_mesh::BlockMesh, plane::WorldPlane, positions::FineWorldPos, world::World, + chunk::chunk_mesh::BlockMesh, components::fine_world_pos::FineWorldPos, + direction::DirectionVectorExtension, plane::WorldPlane, vec::Vector3Ops, world::World, }; use serde::{Deserialize, Serialize}; use std::cmp::Ordering; @@ -19,7 +20,7 @@ pub struct LineSegmentIntersectionInfo { impl LineSegment { pub fn length(&self) -> f32 { - self.start_pos.distance_to(self.end_pos) + self.start_pos.distance_to(&self.end_pos) } pub fn find_intersection(&self, plane: &WorldPlane) -> Option { @@ -50,9 +51,9 @@ impl LineSegment { // println!("t: {}", t); - let slope = self.end_pos - self.start_pos; - let scaled_slope = slope * t; - let intersection_point = self.start_pos + scaled_slope; + let slope = self.end_pos.sub(&self.start_pos); + let scaled_slope = slope.scalar_mult(t); + let intersection_point = self.start_pos.add(&scaled_slope); // println!("Intersection Point: {:?}", intersection_point); @@ -74,7 +75,7 @@ impl LineSegment { .map(|intersection_point| LineSegmentIntersectionInfo { intersection_point, world_plane, - distance: self.start_pos.distance_to(intersection_point), + distance: self.start_pos.distance_to(&intersection_point), }) }) // log the values @@ -96,7 +97,7 @@ impl LineSegment { Some(Ordering::Equal) | None => { // handle by comparing plane centers let plane_center_dist = |info: &LineSegmentIntersectionInfo| { - let dist = info.world_plane.get_center().distance_to(self.start_pos); + let dist = info.world_plane.get_center().distance_to(&self.start_pos); println!("line->block_mesh plane dist: {:?}", dist); dist }; @@ -130,8 +131,11 @@ impl World { // println!("Length: {}", (line_segment.length() + 1.0) as i32); for n in 0..(line_segment.length() + 2.0) as i32 { - let slope = (line_segment.end_pos - line_segment.start_pos).set_mag(1.0); - let marched_pos = line_segment.start_pos + slope * n as f32; + let slope = line_segment + .end_pos + .sub(&line_segment.start_pos) + .set_mag(1.0); + let marched_pos = line_segment.start_pos.add(&slope.scalar_mult(n as f32)); // println!("Marched Pos: {:?}", marched_pos); // println!("Slope: {:?}", slope); @@ -178,12 +182,7 @@ impl World { #[cfg(test)] pub mod tests { use crate::{ - chunk::{chunk_mesh::BlockMesh, Chunk}, - direction::{Direction, Directions}, - plane::WorldPlane, - positions::{FineWorldPos, WorldPos}, - vec::Vec3, - world::World, + chunk::{chunk_mesh::BlockMesh, Chunk}, components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, direction::{Direction, Directions}, plane::WorldPlane, vec::Vector3Ops }; use super::{LineSegment, LineSegmentIntersectionInfo}; @@ -205,8 +204,8 @@ pub mod tests { }; let line_segment = LineSegment { - start_pos: Vec3::new(0.5, 0.0, 0.5), - end_pos: Vec3::new(0.5, 1.5, 0.5), + start_pos: FineWorldPos::new(0.5, 0.0, 0.5), + end_pos: FineWorldPos::new(0.5, 1.5, 0.5), }; let expect_intersection = FineWorldPos { x: 0.5, @@ -221,8 +220,8 @@ pub mod tests { }; let line_segment = LineSegment { - start_pos: Vec3::new(0.2, 0.5, 0.2), - end_pos: Vec3::new(0.4, -0.5, 0.4), + start_pos: FineWorldPos::new(0.2, 0.5, 0.2), + end_pos: FineWorldPos::new(0.4, -0.5, 0.4), }; let expect_intersection = FineWorldPos { x: 0.3, @@ -237,8 +236,8 @@ pub mod tests { }; let line_segment = LineSegment { - start_pos: Vec3::new(0.2, 0.5, 0.2), - end_pos: Vec3::new(0.4, -0.5, 0.4), + start_pos: FineWorldPos::new(0.2, 0.5, 0.2), + end_pos: FineWorldPos::new(0.4, -0.5, 0.4), }; let expect_intersection = None; run_line_segment_test(plane, line_segment, expect_intersection); @@ -248,8 +247,8 @@ pub mod tests { direction: Direction::East, }; let line_segment = LineSegment { - start_pos: Vec3::new(0.5, 0.5, 0.5), - end_pos: Vec3::new(1.5, 0.5, 0.5), + start_pos: FineWorldPos::new(0.5, 0.5, 0.5), + end_pos: FineWorldPos::new(1.5, 0.5, 0.5), }; let expect_intersection = FineWorldPos { x: 1.0, @@ -267,8 +266,8 @@ pub mod tests { direction: Direction::South, }, LineSegment { - start_pos: Vec3::new(-1.5, 0.5, -1.9), - end_pos: Vec3::new(-1.5, 0.5, -2.1), + start_pos: FineWorldPos::new(-1.5, 0.5, -1.9), + end_pos: FineWorldPos::new(-1.5, 0.5, -2.1), }, Some(FineWorldPos { x: -1.5, @@ -286,8 +285,8 @@ pub mod tests { direction: Direction::South, }, LineSegment { - start_pos: Vec3::new(-1.5, 0.5, -3.0), - end_pos: Vec3::new(-1.5, 0.5, -1.0), + start_pos: FineWorldPos::new(-1.5, 0.5, -3.0), + end_pos: FineWorldPos::new(-1.5, 0.5, -1.0), }, Some(FineWorldPos { x: -1.5, @@ -309,8 +308,8 @@ pub mod tests { #[test] fn find_intersection_with_blockmesh() { let line_segment = LineSegment { - start_pos: Vec3::new(0.5, 0.0, 0.5), - end_pos: Vec3::new(0.5, 1.5, 0.5), + start_pos: FineWorldPos::new(0.5, 0.0, 0.5), + end_pos: FineWorldPos::new(0.5, 1.5, 0.5), }; let block_mesh = BlockMesh { @@ -323,8 +322,8 @@ pub mod tests { run_blockmesh_test(line_segment, block_mesh, expect_intersection_info); let line_segment = LineSegment { - start_pos: Vec3::new(0.5, 2.0, 0.5), - end_pos: Vec3::new(0.5, -1.0, 0.5), + start_pos: FineWorldPos::new(0.5, 2.0, 0.5), + end_pos: FineWorldPos::new(0.5, -1.0, 0.5), }; let block_mesh = BlockMesh { diff --git a/lib/world/src/geometry/mod.rs b/lib/world/src/geometry/mod.rs index 7999f9a..9789aaf 100644 --- a/lib/world/src/geometry/mod.rs +++ b/lib/world/src/geometry/mod.rs @@ -2,4 +2,4 @@ pub mod line_segment; pub mod ray; pub mod rect3; pub mod rotation; -pub mod velocity; +pub mod vec2; diff --git a/lib/world/src/geometry/ray.rs b/lib/world/src/geometry/ray.rs index 260193d..781c781 100644 --- a/lib/world/src/geometry/ray.rs +++ b/lib/world/src/geometry/ray.rs @@ -1,11 +1,6 @@ use super::{line_segment::LineSegment, rotation::SphericalRotation}; use crate::{ - chunk::chunk_mesh::BlockMesh, - direction::Direction, - plane::WorldPlane, - positions::FineWorldPos, - vec::Vec3, - world::{world_block::WorldBlock, World}, + chunk::chunk_mesh::BlockMesh, components::fine_world_pos::FineWorldPos, direction::{Direction, DirectionVectorExtension}, plane::WorldPlane, vec::Vector3Ops, world::{world_block::WorldBlock, World} }; use serde::{Deserialize, Serialize}; use std::cmp::Ordering; @@ -37,15 +32,16 @@ pub struct LookingAt { } impl Ray { + pub fn move_forward_mut(&mut self, amount: f32) { - let rot_vec: Vec3 = self.rot.into(); - self.pos = rot_vec.scalar_mult(amount) + let rot_vec = self.rot.get_unit_vector(); + self.pos = FineWorldPos::from_vec3(rot_vec.scalar_mult(amount)); } pub fn move_forward(&self, amount: f32) -> Ray { - let rot_vec: Vec3 = self.rot.into(); + let rot_vec = self.rot.get_unit_vector(); Ray { - pos: self.pos.add_vec(rot_vec.scalar_mult(amount)), + pos: self.pos.add(&rot_vec.scalar_mult(amount)), rot: self.rot, } } @@ -69,17 +65,17 @@ impl Ray { // PlanePos[dim] = CameraPos[dim] + t * CameraRotation // t = (PlanePos[dim] - CameraPos[dim]) / CameraRotation - let rot_vec: Vec3 = self.rot.into(); + let rot_vec = self.rot.get_unit_vector(); let t = (plane.get_relative_y() as f32 - self.pos.get_component_from_direction(plane.direction)) / rot_vec.get_component_from_direction(plane.direction); // Now find the actual position - let intersect_pos = self.pos.add_vec(rot_vec.scalar_mult(t)); + let intersect_pos = self.pos.add(&rot_vec.scalar_mult(t)); if plane.contains(intersect_pos) { - Some(self.pos.distance_to(intersect_pos)) + Some(self.pos.distance_to(&intersect_pos)) } else { None } @@ -106,13 +102,7 @@ impl World { mod tests { use super::{LookingAt, Ray}; use crate::{ - block::{BlockData, BlockType}, - chunk::{chunk_mesh::BlockMesh, Chunk}, - direction::{Direction, Directions}, - geometry::rotation::SphericalRotation, - plane::WorldPlane, - positions::{FineWorldPos, WorldPos}, - world::{world_block::WorldBlock, World}, + block::{BlockData, BlockType}, chunk::{chunk_mesh::BlockMesh, Chunk}, components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, direction::{Direction, Directions}, geometry::rotation::SphericalRotation, plane::WorldPlane, vec::Vector3Ops, world::{world_block::WorldBlock, World} }; #[test] diff --git a/lib/world/src/geometry/rect3.rs b/lib/world/src/geometry/rect3.rs index 2e7a5b1..c5e054c 100644 --- a/lib/world/src/geometry/rect3.rs +++ b/lib/world/src/geometry/rect3.rs @@ -1,6 +1,11 @@ +use crate::components::fine_world_pos::FineWorldPos; +use crate::components::size3::Size3; +use crate::components::world_pos::WorldPos; +use crate::direction::DirectionVectorExtension; +use crate::vec::Vector3Ops; +use crate::world::World; + use super::line_segment::{LineSegment, LineSegmentIntersectionInfo}; -use crate::positions::WorldPos; -use crate::{positions::FineWorldPos, vec::Vec3, world::World}; use serde::{Deserialize, Serialize}; use serde_wasm_bindgen::{from_value, to_value}; use std::cmp::Ordering; @@ -10,7 +15,7 @@ use wasm_bindgen::JsValue; #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Copy)] pub struct Rect3 { pub pos: FineWorldPos, - pub dim: Vec3, + pub dim: Size3, } static DISTANCE_EPSILON: f32 = 0.03; @@ -106,13 +111,13 @@ impl World { rect, end_pos ); - let diff = end_pos - rect.pos; + let diff = end_pos.sub(&rect.pos); println!("diff: {:?}", diff); let line_segments = rect.get_all_points().map(|point| LineSegment { start_pos: point, - end_pos: point + diff, + end_pos: point.add(&diff), }); for segment in &line_segments { @@ -225,12 +230,7 @@ impl World { #[cfg(test)] pub mod tests { use crate::{ - block::{BlockData, BlockType}, - chunk::Chunk, - geometry::rect3::Rect3, - positions::{FineWorldPos, WorldPos}, - vec::Vec3, - world::{world_block::WorldBlock, World}, + block::{BlockData, BlockType}, chunk::Chunk, components::{fine_world_pos::FineWorldPos, size3::Size3, world_pos::WorldPos}, geometry::rect3::Rect3, vec::Vector3Ops, world::{world_block::WorldBlock, World} }; use super::DISTANCE_EPSILON; @@ -298,7 +298,7 @@ pub mod tests { y: 2.3, z: 0.5, }, - dim: Vec3::new(1.0, 1.0, 1.0), + dim: Size3::new(1.0, 1.0, 1.0), }, FineWorldPos { x: 0.5, @@ -327,7 +327,7 @@ pub mod tests { y: 2.3, z: 0.5, }, - dim: Vec3::new(1.0, 1.0, 1.0), + dim: Size3::new(1.0, 1.0, 1.0), }, FineWorldPos { x: 0.5, @@ -356,7 +356,7 @@ pub mod tests { y: 1.3, z: 2.5, }, - dim: Vec3::new(1.0, 1.0, 1.0), + dim: Size3::new(1.0, 1.0, 1.0), }, FineWorldPos { x: 0.5, @@ -381,7 +381,7 @@ pub mod tests { y: 1.3, z: -1.5, }, - dim: Vec3::new(1.0, 1.0, 1.0), + dim: Size3::new(1.0, 1.0, 1.0), }, FineWorldPos { x: -3.5, @@ -410,7 +410,7 @@ pub mod tests { y: 1.5, z: -1.5, }, - dim: Vec3::new(0.8, 0.8, 0.8), + dim: Size3::new(0.8, 0.8, 0.8), }, FineWorldPos { x: 0.5, @@ -439,7 +439,7 @@ pub mod tests { y: 1.5, z: 0.5, }, - dim: Vec3::new(1.0, 1.0, 1.0), + dim: Size3::new(1.0, 1.0, 1.0), }, FineWorldPos { x: 0.5, @@ -464,7 +464,7 @@ pub mod tests { y: 1.03, z: 0.023, }, - dim: Vec3::new(1.0, 1.0, 1.0), + dim: Size3::new(1.0, 1.0, 1.0), }, FineWorldPos { x: 5.007, @@ -548,7 +548,7 @@ pub mod tests { y: 1.1, z: 0.5, }, - dim: Vec3::new(1.0, 2.0, 1.0), + dim: Size3::new(1.0, 2.0, 1.0), }, FineWorldPos { x: -0.3, @@ -584,7 +584,7 @@ pub mod tests { y: 1.3, z: -1.5, }, - dim: Vec3::new(0.8, 2.0, 0.8), + dim: Size3::new(0.8, 2.0, 0.8), }, FineWorldPos { x: -2.5, @@ -620,7 +620,7 @@ pub mod tests { y: 1.3, z: 1.9, }, - dim: Vec3::new(0.8, 2.0, 0.8), + dim: Size3::new(0.8, 2.0, 0.8), }, FineWorldPos { x: 2.3, @@ -649,7 +649,7 @@ pub mod tests { y: 1.1, z: 0.5, }, - dim: Vec3::new(1.0, 1.0, 1.0), + dim: Size3::new(1.0, 1.0, 1.0), }, FineWorldPos { x: 0.3, @@ -691,7 +691,7 @@ pub mod tests { y: 2.3, z: 0.5, }, - dim: Vec3::new(1.0, 1.0, 1.0), + dim: Size3::new(1.0, 1.0, 1.0), }, vec![], ); @@ -711,7 +711,7 @@ pub mod tests { y: 0.5, z: 0.0, }, - dim: Vec3::new(1.0, 1.0, 1.0), + dim: Size3::new(1.0, 1.0, 1.0), }, vec![WorldPos::new(0, 0, 0)], ); diff --git a/lib/world/src/geometry/rotation.rs b/lib/world/src/geometry/rotation.rs index e449d88..5a8eb76 100644 --- a/lib/world/src/geometry/rotation.rs +++ b/lib/world/src/geometry/rotation.rs @@ -1,9 +1,8 @@ -use crate::{entities::{entity_component::impl_component}, vec::Vec3}; +use crate::{components::{fine_world_pos::FineWorldPos, velocity::Velocity}, entities::entity_component::impl_component, vec::Vec3f32}; use serde::{Deserialize, Serialize}; use std::{f32::consts::PI, ops::Add}; use wasm_bindgen::prelude::wasm_bindgen; - -use super::velocity::Velocity; +use crate::vec::Vector3Ops; #[derive(Clone, Copy, PartialEq, Debug, Default,Serialize, Deserialize)] #[wasm_bindgen] @@ -21,6 +20,29 @@ impl SphericalRotation { pub fn new(theta: f32, phi: f32) -> SphericalRotation { SphericalRotation { theta, phi } } + + + pub fn get_unit_vector(&self) -> Vec3f32 { + let phi_offset = (PI / 2.0) - self.phi; + let theta_offset = self.theta + (PI / 2.0); + + Vec3f32::new( + -(theta_offset.cos() * phi_offset.sin()), + -phi_offset.cos(), + theta_offset.sin() * phi_offset.sin(), + ) + } + + pub fn to_fine_world_pos(&self) -> FineWorldPos { + let phi_offset = (PI / 2.0) - self.phi; + let theta_offset = self.theta + (PI / 2.0); + + FineWorldPos { + x: -(theta_offset.cos() * phi_offset.sin()), + y: -phi_offset.cos(), + z: theta_offset.sin() * phi_offset.sin(), + } + } } impl Add for SphericalRotation { @@ -52,7 +74,7 @@ impl Add for SphericalRotation { } } -impl Into> for SphericalRotation { +impl Into for SphericalRotation { /** * Converts a spherical rotation into a unit vector. */ @@ -60,7 +82,7 @@ impl Into> for SphericalRotation { let phi_offset = (PI / 2.0) - self.phi; let theta_offset = self.theta + (PI / 2.0); - Vec3 { + Velocity { x: -(theta_offset.cos() * phi_offset.sin()), y: -phi_offset.cos(), z: theta_offset.sin() * phi_offset.sin(), @@ -73,27 +95,27 @@ mod tests { use super::*; use crate::direction::Direction; - impl Vec3 { - fn assert_eq(&self, other: Vec3) { + impl Velocity { + fn assert_eq(&self, other: Velocity) { assert!((self.x - other.x).abs() < 0.0001); assert!((self.y - other.y).abs() < 0.0001); assert!((self.z - other.z).abs() < 0.0001); } } - fn run_direction_test(direction: Direction, expected: Vec3) { + fn run_direction_test(direction: Direction, expected: Velocity) { let rot: SphericalRotation = direction.into(); - let unit_vector: Vec3 = rot.into(); + let unit_vector: Velocity = rot.into(); unit_vector.assert_eq(expected); } #[test] fn tests_directions() { - run_direction_test(Direction::North, Vec3::new(0.0, 0.0, 1.0)); - run_direction_test(Direction::South, Vec3::new(0.0, 0.0, -1.0)); - run_direction_test(Direction::East, Vec3::new(1.0, 0.0, 0.0)); - run_direction_test(Direction::West, Vec3::new(-1.0, 0.0, 0.0)); - run_direction_test(Direction::Up, Vec3::new(0.0, 1.0, 0.0)); - run_direction_test(Direction::Down, Vec3::new(0.0, -1.0, 0.0)); + run_direction_test(Direction::North, Velocity::new(0.0, 0.0, 1.0)); + run_direction_test(Direction::South, Velocity::new(0.0, 0.0, -1.0)); + run_direction_test(Direction::East, Velocity::new(1.0, 0.0, 0.0)); + run_direction_test(Direction::West, Velocity::new(-1.0, 0.0, 0.0)); + run_direction_test(Direction::Up, Velocity::new(0.0, 1.0, 0.0)); + run_direction_test(Direction::Down, Velocity::new(0.0, -1.0, 0.0)); } } diff --git a/lib/world/src/geometry/vec2.rs b/lib/world/src/geometry/vec2.rs new file mode 100644 index 0000000..c01592d --- /dev/null +++ b/lib/world/src/geometry/vec2.rs @@ -0,0 +1,155 @@ +use num::{integer::Roots, traits::real::Real, Num, One, Zero}; +use serde::{Deserialize, Serialize}; +use std::{fmt::Display, ops::{Add, AddAssign, Div, Mul, Neg, Sub, SubAssign}}; +use crate::vec::{AsF32, Vec3i16}; + + +pub trait Vec2Ops: Sized { + type Scalar: Copy + + Add + + Sub + + Mul + + Div + + Neg + + Zero + + One + + AsF32 + + Display; + + + fn new(x: Self::Scalar, y: Self::Scalar) -> Self; + + fn x(&self) -> Self::Scalar; + fn y(&self) -> Self::Scalar; + + fn set_x(&mut self, val: Self::Scalar); + fn set_y(&mut self, val: Self::Scalar); + + fn copy(&self) -> Self { + Self::new(self.x(), self.y()) + } + + fn add(&self, other: Self) -> Self { + return Self::new(self.x() + other.x(), self.y() + other.y()) + } + + fn sub(&self, other: &Self) -> Self { + return Self::new(self.x() - other.x(), self.y() - other.y()) + } + + fn scalar_mul(&self, other: Self::Scalar) -> Self { + return Self::new(self.x() * other, self.y() * other) + } + + fn mul(&self, other: Self::Scalar) -> Self { + return Self::new(self.x() * other, self.y() * other) + } + + fn div(&self, other: Self::Scalar) -> Self { + return Self::new(self.x() / other, self.y() / other) + } + + fn sqr(&self) -> Self { + return Self::new(self.x() * self.x(), self.y() * self.y()) + } + + fn sum(&self) -> Self::Scalar { + return self.x() + self.y() + } + + fn distance_to(&self, other: &Self) -> f32 { + return self.sub(other).sqr().sum().as_f32().sqrt() + } + + + fn move_to_3d(&self, y_val: Self::Scalar) -> Self { + return Self::new(self.x(), y_val) + } +} + +macro_rules! impl_vec2_ops { + ($vector_type:ident, $scalar_type:ty) => { + impl $crate::geometry::vec2::Vec2Ops for $vector_type { + type Scalar = $scalar_type; + + fn new(x: Self::Scalar, y: Self::Scalar) -> Self { + Self { x, y } + } + + fn x(&self) -> Self::Scalar { + self.x + } + fn y(&self) -> Self::Scalar { + self.y + } + fn set_x(&mut self, val: Self::Scalar) { + self.x = val + } + fn set_y(&mut self, val: Self::Scalar) { + self.y = val + } + } + } +} +pub(crate) use impl_vec2_ops; + +pub struct Vec2f32 { + x: f32, + y: f32, +} + +impl_vec2_ops!(Vec2f32, f32); + +#[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Deserialize)] +pub struct Vec2i16 { + pub x: i16, + pub y: i16, +} + +impl_vec2_ops!(Vec2i16, i16); + +impl Vec2i16 { + pub fn new(x: i16, y: i16) -> Self { + Vec2i16 { x, y } + } + + pub fn add(&self, vec: Vec2i16) -> Self { + Vec2i16 { + x: self.x + vec.x, + y: self.y + vec.y, + } + } + + pub fn scalar_mul(&self, val: i16) -> Self { + Vec2i16 { + x: self.x * val, + y: self.y * val, + } + } + + pub fn move_to_3d(&self, y_val: i16) -> Vec3i16 { + Vec3i16 { + x: self.x, + y: y_val, + z: self.y, + } + } + + pub fn get_adjacent_vecs(&self) -> Vec { + let mut vecs = Vec::new(); + vecs.push(self.clone()); + vecs.push(self.add( + Vec2i16 { x: 0, y: 1 } + )); + vecs.push(self.add( + Vec2i16 { x: 1, y: 0 } + )); + vecs.push(self.add( + Vec2i16 { x: -1, y: 0 } + )); + vecs.push(self.add( + Vec2i16 { x: 0, y: -1 } + )); + vecs + } +} \ No newline at end of file diff --git a/lib/world/src/geometry/velocity.rs b/lib/world/src/geometry/velocity.rs deleted file mode 100644 index cf67825..0000000 --- a/lib/world/src/geometry/velocity.rs +++ /dev/null @@ -1,14 +0,0 @@ -use crate::vec::Vec3; - -pub type Velocity = Vec3; - -impl Velocity { - pub fn zero() -> Velocity { - Velocity { - x: 0.0, - y: 0.0, - z: 0.0, - } - } -} - diff --git a/lib/world/src/lib.rs b/lib/world/src/lib.rs index 987f386..3c1b880 100644 --- a/lib/world/src/lib.rs +++ b/lib/world/src/lib.rs @@ -8,6 +8,7 @@ pub mod positions; pub mod utils; pub mod vec; pub mod world; +pub mod components; use wasm_bindgen::prelude::*; diff --git a/lib/world/src/plane.rs b/lib/world/src/plane.rs index 8505fa2..0c2c74f 100644 --- a/lib/world/src/plane.rs +++ b/lib/world/src/plane.rs @@ -1,8 +1,6 @@ use serde::{Deserialize, Serialize}; - use crate::{ - direction::Direction, - positions::{FineWorldPos, WorldPos}, + components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, direction::{Direction, DirectionVectorExtension} }; #[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Copy)] @@ -73,8 +71,7 @@ impl WorldPlane { #[cfg(test)] mod tests { use crate::{ - direction::Direction, - positions::{FineWorldPos, WorldPos}, + components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, direction::Direction, vec::Vector3Ops }; use super::WorldPlane; diff --git a/lib/world/src/positions.rs b/lib/world/src/positions.rs index 73d080c..2c0196c 100644 --- a/lib/world/src/positions.rs +++ b/lib/world/src/positions.rs @@ -1,21 +1,16 @@ use crate::{ - chunk::CHUNK_WIDTH, - entities::entity_component::impl_component, - vec::{Vec2, Vec3}, + chunk::CHUNK_WIDTH, components::world_pos::WorldPos, entities::entity_component::impl_component, geometry::vec2::Vec2i16, vec::{Vec3f32, Vec3u8, Vector3Ops} }; #[cfg(test)] mod unit_tests; -pub type InnerChunkPos = Vec3; -pub type WorldPos = Vec3; -pub type ChunkPos = Vec2; -pub type FineWorldPos = Vec3; +pub type InnerChunkPos = Vec3u8; +pub type ChunkPos = Vec2i16; impl_component!(WorldPos); impl_component!(ChunkPos); impl_component!(InnerChunkPos); -impl_component!(FineWorldPos); impl InnerChunkPos { pub fn to_chunk_index(&self) -> usize { @@ -26,52 +21,54 @@ impl InnerChunkPos { } pub fn make_from_chunk_index(index: usize) -> InnerChunkPos { - let x_part = (index >> (4 + 6)) as u8; - let y_part = ((index & 0b1111110000) >> 4) as u8; - let z_part = (index & 0b1111) as u8; + let x_part = (index >> (4 + 6)) as i8; + let y_part = ((index & 0b1111110000) >> 4) as i8; + let z_part = (index & 0b1111) as i8; InnerChunkPos::new(x_part, y_part, z_part) } pub fn to_world_pos(&self, chunk_pos: &ChunkPos) -> WorldPos { - chunk_pos + let pos = chunk_pos .scalar_mul(CHUNK_WIDTH) .move_to_3d(0) - .add_vec(self.map(|x| x as i16)) - .map(|x| x as i32) + .add(self); + WorldPos::new(pos.x() as i32, pos.y() as i32, pos.z() as i32) } } -impl WorldPos { - pub fn is_valid(&self) -> bool { - self.y >= 0 && self.y < 256 - } +// impl WorldPos { - pub fn to_inner_chunk_pos(&self) -> InnerChunkPos { - let x = (((self.x as i8 % 16) + 16) % 16) as u8; - let y = self.y as u8; - let z = (((self.z as i8 % 16) + 16) % 16) as u8; - InnerChunkPos::new(x, y, z) - } - pub fn to_chunk_pos(&self) -> ChunkPos { - let x = if self.x < 0 { - ((self.x + 1) / CHUNK_WIDTH as i32) - 1 - } else { - self.x / CHUNK_WIDTH as i32 - }; +// pub fn is_valid(&self) -> bool { +// self.y >= 0 && self.y < 256 +// } - let y = if self.z < 0 { - ((self.z + 1) / CHUNK_WIDTH as i32) - 1 - } else { - self.z / CHUNK_WIDTH as i32 - }; +// pub fn to_inner_chunk_pos(&self) -> InnerChunkPos { +// let x = (((self.x as i8 % 16) + 16) % 16) as u8; +// let y = self.y as u8; +// let z = (((self.z as i8 % 16) + 16) % 16) as u8; +// InnerChunkPos::new(x, y, z) +// } - ChunkPos { - x: x as i16, - y: y as i16, - } - } -} +// pub fn to_chunk_pos(&self) -> ChunkPos { +// let x = if self.x < 0 { +// ((self.x + 1) / CHUNK_WIDTH as i32) - 1 +// } else { +// self.x / CHUNK_WIDTH as i32 +// }; + +// let y = if self.z < 0 { +// ((self.z + 1) / CHUNK_WIDTH as i32) - 1 +// } else { +// self.z / CHUNK_WIDTH as i32 +// }; + +// ChunkPos { +// x: x as i16, +// y: y as i16, +// } +// } +// } impl ChunkPos { pub fn to_world_index(&self) -> i32 { @@ -90,7 +87,7 @@ impl ChunkPos { let b = if self.y >= 0 { (2 * self.y as i64) as u64 } else { - (-2 * self.y as i64 - 1) as u64 + (2 * -self.y as i64 - 1) as u64 }; ((a + b) * (a + b + 1)) / 2 + a @@ -137,28 +134,3 @@ impl std::ops::Add for ChunkPos { } } -impl FineWorldPos { - pub fn to_world_pos(&self) -> WorldPos { - WorldPos { - x: self.x as i32, - y: self.y as i32, - z: self.z as i32, - } - } - - pub fn round(&mut self) { - const PRECISION: f32 = 0.001; // Precision to three decimal places - self.x = (self.x / PRECISION).round() * PRECISION; - self.y = (self.y / PRECISION).round() * PRECISION; - self.z = (self.z / PRECISION).round() * PRECISION; - } - - pub fn equal(&self, other: &FineWorldPos) -> bool { - const PRECISION: f32 = 0.001; // Precision to three decimal places - - // Compare components with the specified precision - (self.x - other.x).abs() < PRECISION - && (self.y - other.y).abs() < PRECISION - && (self.z - other.z).abs() < PRECISION - } -} diff --git a/lib/world/src/vec.rs b/lib/world/src/vec.rs index a2ab7ea..9b63f5d 100644 --- a/lib/world/src/vec.rs +++ b/lib/world/src/vec.rs @@ -1,361 +1,143 @@ -use crate::direction::{Axis, Direction, Directions, FlatDirection, EVERY_FLAT_DIRECTION}; -use num::{traits::real::Real, Num, One, Zero}; +use crate::direction::Directions; +use num::{integer::Roots, traits::real::Real, Num, One, Zero}; use serde::{Deserialize, Serialize}; -use std::{ - fmt::Display, - ops::{Add, AddAssign, Div, Mul, Neg, Sub, SubAssign}, -}; +use std::{fmt::Display, ops::{Add, AddAssign, Div, Mul, Neg, Sub, SubAssign}}; +use crate::direction::DirectionVectorExtension; -#[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub struct Vec2 { - pub x: T, - pub y: T, +pub trait AsF32 { + fn as_f32(self) -> f32; } -impl Sub> for Vec2 -where - T: Sub + Copy, -{ - type Output = Vec2; - - fn sub(self, rhs: Vec2) -> Self::Output { - Vec2 { - x: self.x - rhs.x, - y: self.y - rhs.y, - } +// Note: this might cut off the precision of bigger numbers +impl AsF32 for i32 { + fn as_f32(self) -> f32 { + self as f32 } } -impl Mul> for Vec2 -where - T: Mul + Copy, - U: Copy, -{ - type Output = Vec2; - - fn mul(self, rhs: Vec2) -> Self::Output { - Vec2 { - x: self.x * rhs.x, - y: self.y * rhs.y, - } +impl AsF32 for f32 { + fn as_f32(self) -> f32 { + self } } -impl + Clone + Copy + PartialOrd + Into> Vec2 { - pub fn new(x: T, y: T) -> Vec2 { - Vec2 { x, y } - } - - pub fn to_index(&self) -> String - where - T: Display, - { - format!("{},{}", self.x, self.y).as_str().to_owned() - } - - pub fn scalar_mul(&self, val: T) -> Vec2 - where - T: Mul + Copy, - { - Vec2 { - x: self.x * val, - y: self.y * val, - } - } - - pub fn add_vec(&self, vec: Vec2) -> Vec2 - where - T: Mul + Copy, - { - Vec2 { - x: self.x * vec.x, - y: self.y * vec.y, - } - } - - pub fn sum(&self) -> T { - self.x + self.y - } - - /** Returns a list of adjacent vectors that lie in a flat plane - * I.e no vectors that have a different y direction. - */ - pub fn get_adjacent_vecs(&self) -> Vec> - where - T: Copy + Add + AddAssign + One + SubAssign, - { - let mut adj_vecs: Vec> = Vec::new(); - for direction in EVERY_FLAT_DIRECTION { - let adj_vec = self.move_in_flat_direction(&direction); - adj_vecs.push(adj_vec); - } - adj_vecs +impl AsF32 for i16 { + fn as_f32(self) -> f32 { + self as f32 } - - // disclaimer, this is weird. - pub fn move_to_3d(&self, y_val: T) -> Vec3 - where - T: Copy, - { - Vec3 { - x: self.x, - y: y_val, - z: self.y, - } - } - - pub fn distance_to(&self, vec: Vec2) -> f32 - where - U: Sub + Copy + Mul + Add, - T: Sub + Copy + Mul + Add, - f32: From, - { - let diff = *self - vec; - let diff_squared = diff * diff; - let sum = diff_squared.sum(); - // take the sqrt of sum - let sum_f32: f32 = sum.into() as f32; - sum_f32.sqrt() - } - - pub fn move_in_flat_direction(&self, direction: &FlatDirection) -> Vec2 - where - T: Copy + Add + AddAssign + One + SubAssign, - { - let mut new_vec = *self; - match direction { - FlatDirection::North => new_vec.y += T::one(), - FlatDirection::South => new_vec.y -= T::one(), - FlatDirection::East => new_vec.x += T::one(), - FlatDirection::West => new_vec.x -= T::one(), - } - new_vec - } -} - -#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] -#[repr(C)] -pub struct Vec3 { - pub x: T, - pub y: T, - pub z: T, } -impl Add> for Vec3 -where - T: Add + Copy, -{ - type Output = Vec3; - fn add(self, rhs: Vec3) -> Self::Output { - Vec3 { - x: self.x + rhs.x, - y: self.y + rhs.y, - z: self.z + rhs.z, - } +impl AsF32 for u8 { + fn as_f32(self) -> f32 { + self as f32 } } -impl Sub> for Vec3 -where - T: Sub + Copy, -{ - type Output = Vec3; - - fn sub(self, rhs: Vec3) -> Self::Output { - Vec3 { - x: self.x - rhs.x, - y: self.y - rhs.y, - z: self.z - rhs.z, - } +impl AsF32 for i8 { + fn as_f32(self) -> f32 { + self as f32 } } -impl Mul> for Vec3 -where - T: Mul + Copy, - U: Copy, -{ - type Output = Vec3; - - fn mul(self, rhs: Vec3) -> Self::Output { - Vec3 { - x: self.x * rhs.x, - y: self.y * rhs.y, - z: self.z * rhs.z, - } - } -} - -impl Mul for Vec3 -where - T: Mul + Copy, - U: Copy + Num, -{ - type Output = Vec3; - - fn mul(self, val: U) -> Self::Output { - Vec3 { - x: self.x * val, - y: self.y * val, - z: self.z * val, - } - } -} - -impl< - T: Add - + Sub - + Mul - + Display - + Copy - + AddAssign - + One - + SubAssign, - > Vec3 -{ - pub fn new(x: T, y: T, z: T) -> Vec3 { - Vec3 { x, y, z } - } - - pub fn get_mag(&self) -> f32 +pub trait Vector3Ops: Sized { + type Scalar: Copy + + std::ops::Add + + std::ops::Sub + + std::ops::Mul + + std::ops::Div + + Display + + One + + Neg + + Zero + + AsF32 + + Copy; + + fn new(x: Self::Scalar, y: Self::Scalar, z: Self::Scalar) -> Self; + fn x(&self) -> Self::Scalar; + fn y(&self) -> Self::Scalar; + fn z(&self) -> Self::Scalar; + + fn set_x(&mut self, val: Self::Scalar); + fn set_y(&mut self, val: Self::Scalar); + fn set_z(&mut self, val: Self::Scalar); + + fn copy(&self) -> Self { + Self::new(self.x(), self.y(), self.z()) + } + + fn add(&self, other: &V) -> Self where - T: Into, + V: Vector3Ops, + V::Scalar: Into, + Self::Scalar: std::ops::Add, { - let x_f32: f32 = self.x.into(); - let y_f32: f32 = self.y.into(); - let z_f32: f32 = self.z.into(); - (x_f32 * x_f32 + y_f32 * y_f32 + z_f32 * z_f32).sqrt() + Self::new( + self.x() + other.x().into(), + self.y() + other.y().into(), + self.z() + other.z().into(), + ) } - pub fn get_component_from_direction(&self, direction: Direction) -> T { - match direction { - Direction::North => self.z, - Direction::South => self.z, - Direction::East => self.x, - Direction::West => self.x, - Direction::Up => self.y, - Direction::Down => self.y, - } + fn sub>(&self, other: &V) -> Self { + Self::new( + self.x() - other.x(), + self.y() - other.y(), + self.z() - other.z(), + ) } - pub fn get_opposite_components_from_direction(&self, direction: Direction) -> (T, T) { - match direction { - Direction::North => (self.x, self.y), - Direction::South => (self.x, self.y), - Direction::East => (self.y, self.z), - Direction::West => (self.y, self.z), - Direction::Up => (self.x, self.z), - Direction::Down => (self.x, self.z), - } + fn scalar_mult(&self, val: Self::Scalar) -> Self { + Self::new(self.x() * val, self.y() * val, self.z() * val) } - pub fn get_component_from_axis(&self, axis: Axis) -> T { - match axis { - Axis::X => self.x, - Axis::Y => self.y, - Axis::Z => self.z, - } + fn sqr(&self) -> Self { + Self::new(self.x() * self.x(), self.y() * self.y(), self.z() * self.z()) } - pub fn set_component_from_axis(&mut self, axis: Axis, val: T) { - match axis { - Axis::X => self.x = val, - Axis::Y => self.y = val, - Axis::Z => self.z = val, - } + fn dot>(&self, other: &V) -> Self::Scalar { + self.x() * other.x() + self.y() * other.y() + self.z() * other.z() } - pub fn to_index(&self) -> String { - format!("{},{},{}", self.x, self.y, self.z) - .as_str() - .to_owned() + fn magnitude_squared(&self) -> Self::Scalar { + self.x() * self.x() + self.y() * self.y() + self.z() * self.z() } - pub fn move_direction(&self, direction: &Direction) -> Vec3 { - let mut new_vec = self.clone(); - match direction { - Direction::North => new_vec.z += One::one(), - Direction::South => new_vec.z -= One::one(), - Direction::East => new_vec.x += One::one(), - Direction::West => new_vec.x -= One::one(), - Direction::Up => new_vec.y += One::one(), - Direction::Down => new_vec.y -= One::one(), - } - new_vec + fn get_mag(&self) -> f32 { + let x = self.x().as_f32(); + let y = self.y().as_f32(); + let z = self.z().as_f32(); + + (x * x + y * y + z * z).sqrt() } - pub fn sum(&self) -> T { - self.x + self.y + self.z + fn sum(&self) -> Self::Scalar { + self.x() + self.y() + self.z() } - pub fn set_mag(&self, mag: T) -> Vec3 + fn set_mag(&self, mag: Self::Scalar) -> Self where - T: Into + From + Div, + Self::Scalar: Into + From + Div, { let current_mag = self.get_mag(); - let scale: T = mag / current_mag; + let scale: Self::Scalar = mag / current_mag; self.scalar_mult(scale) } - pub fn scalar_mult(&self, val: T) -> Vec3 { - Vec3 { - x: self.x * val, - y: self.y * val, - z: self.z * val, - } - } - - pub fn add_vec(&self, vec: Vec3) -> Vec3 + fn distance_to(&self, vec: &U) -> f32 where - U: Add, - T: Add + Copy, + U: Vector3Ops, { - Vec3 { - x: self.x + vec.x, - y: self.y + vec.y, - z: self.z + vec.z, - } + self.sub(vec).sqr().sum().as_f32().sqrt() } - pub fn distance_to(&self, vec: Vec3) -> f32 + fn map(&self, f: F) -> Self where - U: Sub + Copy + Mul + Add, - T: Sub + Copy + Mul + Add, - f32: From, + F: Fn(Self::Scalar) -> Self::Scalar, { - let diff = *self - vec; - let diff_squared = diff * diff; - let sum = diff_squared.sum(); - // take the sqrt of sum - let sum_f32: f32 = sum.into(); - sum_f32.sqrt() + Self::new(f(self.x()), f(self.y()), f(self.z())) } - pub fn distance_to_2(&self, vec: &Vec3) -> V - where - U: Sub + Copy + Mul + Add, - T: Sub + Copy + Mul + Add, - V: From + Real, - { - let diff = *self - *vec; - let diff_squared = diff * diff; - let sum = diff_squared.sum(); - let sum_f32: V = sum.into(); - sum_f32.sqrt() - } - - pub fn map(&self, f: F) -> Vec3 - where - F: Fn(T) -> B, - { - Vec3 { - x: f(self.x), - y: f(self.y), - z: f(self.z), - } - } - - pub fn get_adjacent_vecs(&self) -> Vec> { + fn get_adjacent_vecs(&self) -> Vec { let mut vecs = Vec::new(); for direction in Directions::all() { vecs.push(self.move_direction(&direction)); @@ -366,9 +148,9 @@ impl< /** * Like get_adjacent_vecs, but also returns the original vector */ - pub fn get_cross_vecs(&self) -> Vec> { - let mut vecs = Vec::new(); - vecs.push(self.clone()); + fn get_cross_vecs(&self) -> Vec { + let mut vecs: Vec = Vec::new(); + vecs.push(self.copy()); for direction in Directions::all() { vecs.push(self.move_direction(&direction)); } @@ -379,38 +161,315 @@ impl< * Returns all blocks in a cube around the vector * I am not proud of this */ - pub fn get_cube_vecs(&self) -> Vec> - where - T: Add + Sub + Copy + One + Neg + Zero, - { - let mut vecs = Vec::new(); - - vecs.push(self.clone()); - - for x in [-T::one(), T::one(), T::zero()].iter().cloned() { - for y in [-T::one(), T::one(), T::zero()].iter().cloned() { - for z in [-T::one(), T::one(), T::zero()].iter().cloned() { - vecs.push(Vec3::new(self.x + x, self.y + y, self.z + z)); + fn get_cube_vecs(&self) -> Vec { + let mut vecs: Vec = Vec::new(); + vecs.push(self.copy()); + let one = Self::Scalar::one(); + let zero = Self::Scalar::zero(); + for x in [-one, one, zero].iter().cloned() { + for y in [-one, one, zero].iter().cloned() { + for z in [-one, one, zero].iter().cloned() { + vecs.push(Self::new(self.x() + x, self.y() + y, self.z() + z)); } } } vecs } + + fn to_index(&self) -> String { + format!("{},{},{}", self.x(), self.y(), self.z()) + .as_str() + .to_owned() + } } +// Macro to implement common operations +macro_rules! impl_vector_ops { + ($vector_type:ident, $scalar_type:ty) => { + impl $crate::vec::Vector3Ops for $vector_type { + type Scalar = $scalar_type; + + fn new(x: Self::Scalar, y: Self::Scalar, z: Self::Scalar) -> Self { + Self { x, y, z } + } + + fn x(&self) -> Self::Scalar { + self.x + } + fn y(&self) -> Self::Scalar { + self.y + } + fn z(&self) -> Self::Scalar { + self.z + } + + fn set_x(&mut self, val: Self::Scalar) { + self.x = val + } + fn set_y(&mut self, val: Self::Scalar) { + self.y = val + } + fn set_z(&mut self, val: Self::Scalar) { + self.z = val + } + } + }; +} +pub(crate) use impl_vector_ops; + +pub struct Vec3f32 { + x: f32, + y: f32, + z: f32, +} + +impl_vector_ops!(Vec3f32, f32); + +pub struct Vec3i16 { + pub x: i16, + pub y: i16, + pub z: i16, +} + +impl_vector_ops!(Vec3i16, i16); + + +#[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Deserialize)] +pub struct Vec3u8 { + pub x: i8, + pub y: i8, + pub z: i8, +} + +impl_vector_ops!(Vec3u8, i8); + + + +// #[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Deserialize)] +// pub struct Vec2 { +// pub x: T, +// pub y: T, +// } + +// impl Sub> for Vec2 +// where +// T: Sub + Copy, +// { +// type Output = Vec2; + +// fn sub(self, rhs: Vec2) -> Self::Output { +// Vec2 { +// x: self.x - rhs.x, +// y: self.y - rhs.y, +// } +// } +// } + +// impl Mul> for Vec2 +// where +// T: Mul + Copy, +// U: Copy, +// { +// type Output = Vec2; + +// fn mul(self, rhs: Vec2) -> Self::Output { +// Vec2 { +// x: self.x * rhs.x, +// y: self.y * rhs.y, +// } +// } +// } + +// impl + Clone + Copy + PartialOrd + Into> Vec2 { +// pub fn new(x: T, y: T) -> Vec2 { +// Vec2 { x, y } +// } + +// pub fn to_index(&self) -> String +// where +// T: Display, +// { +// format!("{},{}", self.x, self.y).as_str().to_owned() +// } + +// pub fn scalar_mul(&self, val: T) -> Vec2 +// where +// T: Mul + Copy, +// { +// Vec2 { +// x: self.x * val, +// y: self.y * val, +// } +// } + +// pub fn add_vec(&self, vec: Vec2) -> Vec2 +// where +// T: Mul + Copy, +// { +// Vec2 { +// x: self.x * vec.x, +// y: self.y * vec.y, +// } +// } + +// pub fn sum(&self) -> T { +// self.x + self.y +// } + +// /** Returns a list of adjacent vectors that lie in a flat plane +// * I.e no vectors that have a different y direction. +// */ +// pub fn get_adjacent_vecs(&self) -> Vec> +// where +// T: Copy + Add + AddAssign + One + SubAssign, +// { +// let mut adj_vecs: Vec> = Vec::new(); +// for direction in EVERY_FLAT_DIRECTION { +// let adj_vec = self.move_in_flat_direction(&direction); +// adj_vecs.push(adj_vec); +// } +// adj_vecs +// } + +// // disclaimer, this is weird. +// pub fn move_to_3d(&self, y_val: T) -> Vec3 +// where +// T: Copy, +// { +// Vec3 { +// x: self.x, +// y: y_val, +// z: self.y, +// } +// } + +// pub fn distance_to(&self, vec: Vec2) -> f32 +// where +// U: Sub + Copy + Mul + Add, +// T: Sub + Copy + Mul + Add, +// f32: From, +// { +// let diff = *self - vec; +// let diff_squared = diff * diff; +// let sum = diff_squared.sum(); +// // take the sqrt of sum +// let sum_f32: f32 = sum.into() as f32; +// sum_f32.sqrt() +// } + +// pub fn move_in_flat_direction(&self, direction: &FlatDirection) -> Vec2 +// where +// T: Copy + Add + AddAssign + One + SubAssign, +// { +// let mut new_vec = *self; +// match direction { +// FlatDirection::North => new_vec.y += T::one(), +// FlatDirection::South => new_vec.y -= T::one(), +// FlatDirection::East => new_vec.x += T::one(), +// FlatDirection::West => new_vec.x -= T::one(), +// } +// new_vec +// } +// } + +// #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +// #[repr(C)] +// pub struct Vec3 { +// pub x: T, +// pub y: T, +// pub z: T, +// } + +// impl Add> for Vec3 +// where +// T: Add + Copy, +// { +// type Output = Vec3; +// fn add(self, rhs: Vec3) -> Self::Output { +// Vec3 { +// x: self.x + rhs.x, +// y: self.y + rhs.y, +// z: self.z + rhs.z, +// } +// } +// } + +// impl Sub> for Vec3 +// where +// T: Sub + Copy, +// { +// type Output = Vec3; + +// fn sub(self, rhs: Vec3) -> Self::Output { +// Vec3 { +// x: self.x - rhs.x, +// y: self.y - rhs.y, +// z: self.z - rhs.z, +// } +// } +// } + +// impl Mul> for Vec3 +// where +// T: Mul + Copy, +// U: Copy, +// { +// type Output = Vec3; + +// fn mul(self, rhs: Vec3) -> Self::Output { +// Vec3 { +// x: self.x * rhs.x, +// y: self.y * rhs.y, +// z: self.z * rhs.z, +// } +// } +// } + +// impl Mul for Vec3 +// where +// T: Mul + Copy, +// U: Copy + Num, +// { +// type Output = Vec3; + +// fn mul(self, val: U) -> Self::Output { +// Vec3 { +// x: self.x * val, +// y: self.y * val, +// z: self.z * val, +// } +// } +// } + +// impl< +// T: Add +// + Sub +// + Mul +// + Display +// + Copy +// + AddAssign +// + One +// + SubAssign, +// > Vec3 +// { +// pub fn new(x: T, y: T, z: T) -> Vec3 { +// Vec3 { x, y, z } +// } +// } + #[cfg(test)] pub mod tests { - use crate::vec::Vec3; + use crate::vec::{Vec3f32, Vector3Ops}; #[test] fn test_distance_to() { - let vec1 = Vec3::new(0 as i16, 0 as i16, 0 as i16); - let vec2 = Vec3::new(1, 1, 1); - assert_eq!(vec1.distance_to(vec2), 1.7320508); + let vec1 = Vec3f32 { x: 0 as f32, y: 0 as f32, z: 0 as f32 }; + let vec2 = Vec3f32 { x: 1 as f32, y: 1 as f32, z: 1 as f32 }; + assert_eq!(vec1.distance_to(&vec2), 1.7320508); - let vec1 = Vec3::new(0 as i16, 0 as i16, 0 as i16); - let vec2 = Vec3::new(1, 0, 0); - assert_eq!(vec1.distance_to(vec2), 1.0); + let vec1 = Vec3f32 { x: 0 as f32, y: 0 as f32, z: 0 as f32 }; + let vec2 = Vec3f32 { x: 1 as f32, y: 0 as f32, z: 0 as f32 }; + assert_eq!(vec1.distance_to(&vec2), 1.0); } } diff --git a/lib/world/src/world/mod.rs b/lib/world/src/world/mod.rs index 78ba5db..91ebac8 100644 --- a/lib/world/src/world/mod.rs +++ b/lib/world/src/world/mod.rs @@ -1,8 +1,9 @@ use self::world_block::WorldBlock; use crate::chunk::chunk_mesh::ChunkMesh; use crate::chunk::Chunk; -use crate::direction::{Direction, Directions}; -use crate::positions::{ChunkPos, WorldPos}; +use crate::components::world_pos::WorldPos; +use crate::direction::{Direction, DirectionVectorExtension, Directions}; +use crate::positions::{ChunkPos}; use serde::{Deserialize, Serialize}; use std::collections::{HashMap, HashSet}; use std::{self, fmt}; @@ -46,7 +47,7 @@ impl fmt::Display for ChunkIndexOutOfBoundsError { #[derive(Serialize, Deserialize)] pub struct WorldStateDiff { /** A list of chunk ids that were changed */ - pub chunk_ids: HashSet, + pub chunk_ids: HashSet, } #[derive(Default, Serialize, Deserialize)] @@ -124,8 +125,7 @@ impl World { #[cfg(test)] mod tests { use super::*; - use crate::block::{BlockData, BlockType}; - use crate::positions::WorldPos; + use crate::{block::{BlockData, BlockType}, vec::Vector3Ops}; #[test] fn get_adjacent_blocks() { diff --git a/lib/world/src/world/world_block.rs b/lib/world/src/world/world_block.rs index 373de5f..2c0975d 100644 --- a/lib/world/src/world/world_block.rs +++ b/lib/world/src/world/world_block.rs @@ -1,7 +1,5 @@ use crate::{ - block::{BlockData, BlockMetaData, BlockShape, BlockType, ChunkBlock}, - direction::{Direction, Directions}, - positions::WorldPos, + block::{BlockData, BlockMetaData, BlockShape, BlockType, ChunkBlock}, components::world_pos::WorldPos, direction::{Direction, Directions} }; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -90,10 +88,7 @@ impl WorldBlock { #[cfg(test)] mod tests { use crate::{ - block::{BlockData, BlockType}, - direction::Direction, - positions::WorldPos, - world::world_block::WorldBlock, + block::{BlockData, BlockType}, components::world_pos::WorldPos, direction::Direction, world::world_block::WorldBlock }; use std::collections::HashMap; diff --git a/lib/world/src/world/world_chunk.rs b/lib/world/src/world/world_chunk.rs index 45daf34..735f677 100644 --- a/lib/world/src/world/world_chunk.rs +++ b/lib/world/src/world/world_chunk.rs @@ -1,10 +1,9 @@ use std::collections::HashSet; - use super::{ChunkNotLoadedError, World, WorldStateDiff}; use crate::{ - chunk::{chunk_mesh::ChunkMesh, Chunk}, - positions::{ChunkPos, WorldPos}, + chunk::{chunk_mesh::ChunkMesh, Chunk}, components::world_pos::WorldPos, positions::ChunkPos }; +use crate::vec::Vector3Ops; impl World { pub fn get_chunk(&self, chunk_pos: &ChunkPos) -> Result<&Chunk, ChunkNotLoadedError> { @@ -39,13 +38,13 @@ impl World { pub fn insert_chunk(&mut self, chunk: Chunk) -> WorldStateDiff { // Update adjacent chunk meshes - let updated_chunk_ids: HashSet = chunk + let updated_chunk_ids: HashSet = chunk .position .get_adjacent_vecs() .iter() .filter_map(|chunk_pos| { if self.update_chunk_mesh(chunk_pos).is_ok() { - Some(chunk_pos.to_index()) + Some(chunk_pos.to_id()) } else { None } @@ -79,10 +78,7 @@ impl World { #[cfg(test)] mod tests { use crate::{ - block::{BlockData, BlockType, ChunkBlock}, - chunk::Chunk, - positions::{ChunkPos, InnerChunkPos, WorldPos}, - world::{world_block::WorldBlock, World}, + block::{BlockData, BlockType, ChunkBlock}, chunk::Chunk, components::world_pos::WorldPos, positions::{ChunkPos, InnerChunkPos}, vec::Vector3Ops, world::{world_block::WorldBlock, World} }; #[test] diff --git a/lib/world/src/world/world_mesh.rs b/lib/world/src/world/world_mesh.rs index c6b5d02..220f4bc 100644 --- a/lib/world/src/world/world_mesh.rs +++ b/lib/world/src/world/world_mesh.rs @@ -2,8 +2,7 @@ use std::collections::HashSet; use super::{ChunkNotLoadedError, World, WorldStateDiff}; use crate::{ - chunk::chunk_mesh::{BlockMesh, ChunkMesh}, - positions::{ChunkPos, WorldPos}, + chunk::chunk_mesh::{BlockMesh, ChunkMesh}, components::world_pos::WorldPos, positions::ChunkPos, vec::Vector3Ops }; impl World { @@ -57,7 +56,7 @@ impl World { pub fn update_chunks_around_block(&mut self, world_pos: &WorldPos) -> WorldStateDiff { // Check to see if any of the adjacent blocks are in different chunks. // Don't need to filter out duplicates since they aren't possible - let updated_ids: HashSet = world_pos + let updated_ids: HashSet = world_pos .get_cross_vecs() .iter() // Map to chunk id @@ -66,7 +65,7 @@ impl World { .filter_map(|chunk_pos: ChunkPos| { // Forget about the result, if the chunk isn't loaded, it doesn't matter if self.update_chunk_mesh(&chunk_pos).is_ok() { - Some(chunk_pos.to_index()) + Some(chunk_pos.to_id()) } else { None } @@ -82,11 +81,7 @@ impl World { #[cfg(test)] mod tests { use crate::{ - block::{BlockData, BlockType}, - chunk::{chunk_mesh::BlockMesh, Chunk}, - direction::{Direction, Directions}, - positions::{ChunkPos, WorldPos}, - world::{world_block::WorldBlock, World}, + block::{BlockData, BlockType}, chunk::{chunk_mesh::BlockMesh, Chunk}, components::world_pos::WorldPos, direction::{Direction, Directions}, positions::ChunkPos, vec::Vector3Ops, world::{world_block::WorldBlock, World} }; #[test] From 97d097f8e756d91fef6f674466147f5fcd79ba1b Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 1 Sep 2024 12:29:24 -0700 Subject: [PATCH 10/61] All the tests pass! --- lib/world/src/chunk/chunk_unit_tests.rs | 4 +--- lib/world/src/positions.rs | 1 - lib/world/src/positions/unit_tests.rs | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/world/src/chunk/chunk_unit_tests.rs b/lib/world/src/chunk/chunk_unit_tests.rs index 575111a..c048281 100644 --- a/lib/world/src/chunk/chunk_unit_tests.rs +++ b/lib/world/src/chunk/chunk_unit_tests.rs @@ -1,8 +1,6 @@ use super::{Chunk, ChunkPos, InnerChunkPos}; use crate::{ - block::{BlockData, BlockType}, - chunk::ChunkBlock, - world::World, + block::{BlockData, BlockType}, chunk::ChunkBlock, vec::Vector3Ops, world::World }; #[test] diff --git a/lib/world/src/positions.rs b/lib/world/src/positions.rs index 2c0196c..0304a03 100644 --- a/lib/world/src/positions.rs +++ b/lib/world/src/positions.rs @@ -8,7 +8,6 @@ mod unit_tests; pub type InnerChunkPos = Vec3u8; pub type ChunkPos = Vec2i16; -impl_component!(WorldPos); impl_component!(ChunkPos); impl_component!(InnerChunkPos); diff --git a/lib/world/src/positions/unit_tests.rs b/lib/world/src/positions/unit_tests.rs index 637ec20..08684a3 100644 --- a/lib/world/src/positions/unit_tests.rs +++ b/lib/world/src/positions/unit_tests.rs @@ -1,4 +1,4 @@ -use crate::positions::{ChunkPos, InnerChunkPos, WorldPos}; +use crate::{positions::{ChunkPos, InnerChunkPos, WorldPos}, vec::Vector3Ops}; #[test] fn index_conversion() { From 9bc687a34c148b3d49a3103fda14c5e0f350c83a Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 18 May 2025 12:21:46 -0700 Subject: [PATCH 11/61] Everything is fucked and idk why, I fixed some of the wrappers --- TYLERCRAFT_ENGINE_FLOW.md | 117 ++++++++++++++++++ apps/web-client/src/game-scripts/hudRender.ts | 5 +- lib/engine/src/wrappers.ts | 44 ++----- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/components/velocity.rs | 4 +- lib/world/src/entities/game.rs | 83 +++++++++---- lib/world/src/entities/player.rs | 18 +-- lib/world/src/entities/player_jump_script.rs | 20 +-- lib/world/src/entities/player_rot_script.rs | 6 +- 9 files changed, 214 insertions(+), 85 deletions(-) create mode 100644 TYLERCRAFT_ENGINE_FLOW.md diff --git a/TYLERCRAFT_ENGINE_FLOW.md b/TYLERCRAFT_ENGINE_FLOW.md new file mode 100644 index 0000000..1c2926a --- /dev/null +++ b/TYLERCRAFT_ENGINE_FLOW.md @@ -0,0 +1,117 @@ +# Understanding Player Action and Game Script Flows in Your Game Engine + +## 1. Introduction + +Your game engine appears to follow a common pattern where a high-performance core (written in Rust and compiled to WebAssembly, in `@craft/rust-world`) handles the main game logic, physics, and world state. The TypeScript code, particularly in `lib/engine/src/wrappers.ts`, serves as a bridge or wrapper layer. Its primary role is to provide a more convenient and type-safe API for the client-side JavaScript/TypeScript codebase to interact with the Wasm module. This involves sending commands (like player actions) to the Wasm module and retrieving game state from it. + +## 2. Player Action Flow + +This describes how player actions (e.g., jumping, rotating view) are intended to be processed from initiation in TypeScript to execution in Rust, and how the game state is updated. + +### 2.1. Action Creation (TypeScript Side - in `GameWrapper`) + +* **Intention:** Your `GameWrapper` class in `wrappers.ts` has methods like `makeJumpAction(entityId)` and `makeRotateAction(entityId, x, y)`. These are designed to create action objects that can be understood by the Rust game engine. +* **Current Implementation & Problem:** + * `makeJumpAction` tries to return `WorldWasm.PlayerJumpAction.new(entityId)`. + * `makeRotateAction` tries to return `WorldWasm.PlayerRotAction.new(entityId, rotDiff)`. + * The linter errors indicate that `WorldWasm.PlayerJumpAction` and `WorldWasm.PlayerRotAction` (and their `.new` methods) are not found within the imported `WorldWasm` module. This is a key reason for the current broken state. +* **Correct Mechanism (Revealed by Rust Code Analysis):** + * The Rust codebase (specifically `player_jump_script.rs` and `player_rot_script.rs`) defines structs `JumpAction` and `RotateAction`. Each of these has a Wasm-exposed static method: + * `JumpAction::make_wasm(entityId: EntityId) -> EntityActionDto` + * `RotateAction::make_wasm(entityId: EntityId, rot_diff: SphericalRotation) -> EntityActionDto` + * These `make_wasm` functions are the correct way to create the action DTOs (Data Transfer Objects). The TypeScript code needs to call these (e.g., `WorldWasm.JumpAction.make_wasm(...)` and `WorldWasm.RotateAction.make_wasm(...)`). However, the linter errors suggest that `WorldWasm.JumpAction` and `WorldWasm.RotateAction` themselves are not being found as direct exports of the `WorldWasm` module. This points to an issue with how these Rust structs/methods are exposed or named in the generated Wasm bindings. You would need to consult the `.d.ts` typings file for `@craft/rust-world` to see the exact JavaScript interface. + +### 2.2. Action Handling (TypeScript to Rust) + +* **Intention:** Once an action DTO is created, it's passed to `GameWrapper.handleAction(action: WorldWasm.EntityActionDto)`. +* **Current Implementation & Problem:** + * Inside `handleAction`, there's an attempt to `action.clone()`. The linter error `Property 'clone' does not exist on type 'EntityActionDto'` indicates that the `EntityActionDto` type exposed from Wasm does not have a `clone` method. + * The method then calls `this.game.handle_action_wasm(newAction)`. +* **Correct Mechanism:** + * The Rust `Game::handle_action_wasm(action: EntityActionDto)` method does exist and expects an `EntityActionDto`. The TypeScript side should pass the action directly without cloning, unless a `clone` method is explicitly exposed from Rust for `EntityActionDto`. The Rust method takes ownership or processes the DTO as is. + +### 2.3. Action Processing (Rust/Wasm Side - Internal Engine Logic) + +* **Mechanism:** + 1. When `Game::handle_action_wasm` in Rust receives an `EntityActionDto`, it stores this action (e.g., in a queue or list called `action_holder`). + 2. The main game loop in Rust is driven by `Game::update_wasm()` (which is called by `GameWrapper.update()` from TypeScript). + 3. During this update cycle, the Rust engine iterates through the stored actions. + 4. For each `EntityActionDto`, the engine uses a system of `EntityActionHandler`s. It identifies the correct handler based on the action's type (e.g., a "Jump-Action" string identifier for `JumpAction`). + 5. The `handle_dto(&self, entity: &mut Entity, data: &EntityActionDto)` method of the matched Rust handler is then executed. This is where the actual game logic for the action occurs—modifying the components of the target entity (e.g., changing its `Velocity` component for a jump, or its `SphericalRotation` component for a rotation). + +### 2.4. State Update & Retrieval (Rust to TypeScript) + +* **Intention:** After the Rust engine processes actions and updates the internal game state, the TypeScript side needs to be able to fetch this new state. +* **Current Implementation & Problem:** + * `GameWrapper.getPlayer(uid: number)`: + * Tries to use `this.game.get_player_wasm(uid)` and `this.game.get_player_rot_script_wasm(uid)`. + * It expects `get_player_wasm` to return something compatible with a `WorldWasm.Player` type, which the linter says is not exported. + * `get_player_rot_script_wasm` is also reported as missing. + * The `PlayerWrapper` constructor is called with two arguments (`player`, `rot_script`), but it's defined to take only one in its current form (or needs to be adapted to the actual data from Wasm). + * `GameWrapper.getEntities(): PlayerWrapper[]`: + * Tries to use `this.game.get_entities_wasm()`. + * This method is reported as missing. +* **Correct Mechanism (Revealed by Rust Code Analysis):** + * The Rust `Game` struct exposes: + * `get_player_wasm(player_id: EntityId) -> Result`: This returns a JavaScript value (via `serde_wasm_bindgen`) representing a serialized `WasmPlayer` Rust struct. This `WasmPlayer` struct contains fields like `pos`, `vel` (velocity), `rot` (SphericalRotation), and `moving_direction`. + * `get_players_wasm() -> Result`: This returns a JavaScript value representing a serialized list (`Vec`) of all players. + * The TypeScript `PlayerWrapper` needs to be constructed using the data from this `WasmPlayer` structure. The concept of a separate `rot_script` is likely obsolete, as rotation is part of `WasmPlayer`. + +## 3. Game Script Flow (`onDiff` Callback) + +This describes how custom TypeScript game logic is intended to react to changes in the game state managed by the Rust engine. + +### 3.1. Defining a Game Script (TypeScript Side) + +* **Mechanism:** You have a `GameScript` interface in `lib/engine/src/game-script.js` (or defined in `wrappers.ts`): + ```typescript + export interface GameScript { + onDiff: (diff: GameDiff) => void; + } + ``` + And `GameDiff` is defined as: + ```typescript + export type GameDiff = { + updated_entities: number[]; + updated_chunks: number[]; + }; + ``` +* This allows users to create objects in TypeScript that implement `GameScript`, providing an `onDiff` method to handle notifications about game state changes. + +### 3.2. Registering the Script (TypeScript to Rust) + +* **Intention:** `GameWrapper.makeAndAddGameScript(script: GameScript)` is responsible for this. +* **Current Implementation & Problem:** + 1. It correctly creates a Wasm-compatible script object using `WorldWasm.WasmGameScript.make(script)`. The Rust `WasmGameScript::make` function exists and is designed to take the JavaScript `script` object and store its `onDiff` function. + 2. It then attempts to call `this.game.add_game_script_wasm(wasmScript)`. + 3. **Problem:** The linter error `Property 'add_game_script_wasm' does not exist on type 'Game'` is critical. The Rust code analysis showed that the `add_game_script_wasm` function in `game.rs` was commented out. This means there's currently no way to actually register the created `WasmGameScript` with the Rust game engine. +* **Correct Mechanism:** The `add_game_script_wasm` function (or an equivalent) needs to be present and functional in the Rust Wasm bindings. This function would take the `WasmGameScript` and store it within the Rust `Game` instance. + +### 3.3. Triggering `onDiff` (Rust/Wasm Side - Intended Logic) + +* **Intended Mechanism (based on commented-out Rust code in `game.rs` for `WasmGameScript`):** + 1. As the Rust game engine runs (likely during or after `Game::update_wasm`), if there are significant state changes (e.g., entities updated, chunks loaded/modified), the engine would identify these. + 2. It would construct a `GameDiff` object (similar to the TypeScript type) detailing these changes. + 3. The engine would then iterate through all registered `WasmGameScript` instances. + 4. For each script, it would invoke the stored JavaScript `onDiff` function (referred to as `on_diff_jsfn` in the Rust snippets), passing the serialized `GameDiff` object as an argument. + +### 3.4. Reacting to Diffs (TypeScript Side) + +* **Intention:** When the Rust engine calls the `onDiff` JavaScript function, the corresponding `onDiff` method of the user's `GameScript` object in TypeScript executes. This allows custom client-side game logic to react to these diffs, for example, by updating UI elements, triggering sounds, or modifying client-side representations of game objects. +* **Current Status:** This entire callback flow is non-functional primarily because scripts cannot be registered due to the missing `add_game_script_wasm` Wasm export. + +## 4. Conclusion and Path Forward + +The core architecture of your game, with a Rust Wasm backend and TypeScript wrappers, is sound. However, `lib/engine/src/wrappers.ts` is currently out of sync with the actual API exposed by your `@craft/rust-world` Wasm module. This desynchronization is the root cause of most of the linter errors and runtime issues. + +To get your engine working as intended: + +1. **Inspect Wasm Bindings:** The most crucial step is to examine the generated JavaScript glue code (`*.js`) and, more importantly, the TypeScript definition file (`*.d.ts`) that `wasm-pack` (or your Wasm build tool) produces for the `@craft/rust-world` package. This will provide the definitive source of truth for what functions, classes, and types are actually exported by the Wasm module and how they are named and structured in JavaScript/TypeScript. +2. **Align `wrappers.ts`:** + * **Action Creation:** Update `makeJumpAction` and `makeRotateAction` to use the correct exported Wasm functions/methods for creating `EntityActionDto`s (as revealed by your `.d.ts` file). + * **Action Handling:** Remove the `action.clone()` call in `handleAction` unless your Wasm module explicitly provides a clonable `EntityActionDto` with a `clone` method. + * **Player Data:** Modify `PlayerWrapper` and the logic in `getPlayer` and `getEntities` to correctly use `get_player_wasm` and `get_players_wasm`, and to accurately map the data from the Rust `WasmPlayer` struct (or its JS equivalent) to your `PlayerWrapper` instances. + * **Game Scripts:** For the `GameScript` `onDiff` system to work, the `add_game_script_wasm` function (or an equivalent) must be correctly implemented in your Rust code (`Game::add_script` seems to exist in Rust but isn't properly exposed to Wasm for adding JS game scripts) and exposed through `#[wasm_bindgen]`. +3. **Address Minor Issues:** Clean up any remaining linter errors, such as formatting issues. + +By systematically comparing the Wasm module's actual API (from its `.d.ts` file) with the code in `wrappers.ts` and making the necessary adjustments, you can resolve the current errors and restore the intended functionality of your game's action and event systems. \ No newline at end of file diff --git a/apps/web-client/src/game-scripts/hudRender.ts b/apps/web-client/src/game-scripts/hudRender.ts index 2c6378d..a63f46a 100644 --- a/apps/web-client/src/game-scripts/hudRender.ts +++ b/apps/web-client/src/game-scripts/hudRender.ts @@ -1,14 +1,11 @@ -import { Game } from "@craft/engine"; +import { Game, GameWrapper } from "@craft/engine"; import TextureMapper from "../textureMapper"; import { IS_MOBILE } from "../app"; import { CanvasGameScript } from "../game-scripts/canvas-gscript"; import { getEleOrError, hideElement } from "../utils"; -import { GameScript } from "@craft/engine/game-script"; -import { BasicGScript } from "./basic-gscript"; import { GameMenu } from "../renders/gameMenuRender"; import React from "react"; import ReactDOM from "react-dom"; -import { GameWrapper } from "@craft/engine/modules"; export class HudGScript extends GameScript { name = "hud"; diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index 7c4355c..abe65f6 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -30,10 +30,6 @@ export type SerializedGame = { players: PlayerWrapper[]; }; -export type PlayerAction = WorldWasm.PlayerJumpAction; - -export type EntityAction = WorldWasm.EntityAction; - export type GameDiff = { updated_entities: number[]; updated_chunks: number[]; @@ -82,14 +78,6 @@ export class ChunkMeshWrapper { } } -type RustPlayer = { - uid: number; - pos: RustPos; - dim: RustPos; - rot: { phi: number; theta: number }; - moving_direction: WorldWasm.Direction; -}; - export class PlayerWrapper { speed = 0; max_speed = 0; @@ -103,9 +91,9 @@ export class PlayerWrapper { distanceMoved = 0; moving_direction: WorldWasm.Direction | undefined; - constructor(player: RustPlayer) { + constructor(player: WorldWasm.WasmPlayer) { this.pos = new Vector3D([player.pos.x, player.pos.y, player.pos.z]); - this.dim = new Vector3D([player.dim.x, player.dim.y, player.dim.z]); + this.dim = new Vector3D([1, 1, 1]); this.rot = new Vector3D([0, player.rot.phi, player.rot.theta]); this.moving_direction = player.moving_direction; } @@ -132,7 +120,7 @@ export class BlockWrapper { } export class GameWrapper { - constructor(private game: WorldWasm.Game) {} + constructor(private game: WorldWasm.Game) { } static makeGame(): GameWrapper { const game = WorldWasm.Game.new_wasm(); @@ -148,7 +136,7 @@ export class GameWrapper { } makeJumpAction(entityId: number): WorldWasm.EntityActionDto { - return WorldWasm.PlayerJumpAction.new(entityId); + return WorldWasm.JumpAction.make_wasm(entityId); } makeRotateAction( @@ -160,13 +148,12 @@ export class GameWrapper { const rotDiff = new WorldWasm.SphericalRotation(); rotDiff.phi = x; rotDiff.theta = y; - return WorldWasm.PlayerRotAction.new(entityId, rotDiff); + return WorldWasm.RotateAction.make_wasm(entityId, rotDiff); } handleAction(action: WorldWasm.EntityActionDto) { - const newAction = action.clone(); - console.log("Handling action", newAction); - this.game.handle_action_wasm(newAction); + console.log("Handling action", action); + this.game.handle_action_wasm(action); } getChunkPosFromChunkId(chunkId: number): Vector2D { @@ -197,17 +184,9 @@ export class GameWrapper { return new ChunkMeshWrapper(val); } - addPlayer(player: WorldWasm.Player) { - this.game.add_player_wasm(player); - } - getPlayer(uid: number): PlayerWrapper { - const player: WorldWasm.Player = this.game.get_player_wasm(uid); - const rot_script = this.game.get_player_rot_script_wasm(uid); - if (!rot_script) { - throw new Error("Player rot script not found"); - } - return new PlayerWrapper(player, rot_script); + const player: WorldWasm.WasmPlayer = this.game.get_player_wasm(uid); + return new PlayerWrapper(player); } getBlock(pos: Vector3D): BlockWrapper { @@ -216,8 +195,8 @@ export class GameWrapper { } getEntities(): PlayerWrapper[] { - const entities: WorldWasm.Player[] = this.game.get_entities_wasm(); - return entities.map((entity) => this.getPlayer(entity.uid)); + const entities: WorldWasm.WasmPlayer[] = this.game.get_players_wasm(); + return entities.map((entity) => this.getPlayer(entity.id)); } getLoadedChunkIds(): number[] { @@ -249,7 +228,6 @@ export class GameWrapper { return new Vector2D([chunk_pos.x, chunk_pos.y]); } } - // async function loadWasmModule(module: any, name = "") { // console.log("Loading Wasm Module: ", name); // const loadedModule = module.default ? await module.default : await module; diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index e8efac1..620a6c6 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"64e2b3db37b9ca974dece1425157b8428b1afbcf3e725aa92d4db3fa4decc065","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"94e20665956a270a887cd4deddbe72ccd322b868c732366f76142fffbfe09a9f","signature":"d870a26306af502148387d8dc641d7cb86a298567c901ea9213e4e9425f19095","impliedFormat":99},{"version":"a031eb7acadc8468d1870bb0a79c173fa94b7eee80634d40cb5921b83c85ab30","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"a6be64ec5be12e7ae5cd07eef124ca68a49d6c8028a3a4505e9fd1516bf7f9fe","signature":"416c090664e32b92f521f38b7888aa24f792987da90331eea9980d1bec400979","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"5869e72c033cbc63c8966183aa83f3020d6fc0fa145e56f89b8c7a26ef55045b","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","impliedFormat":99},{"version":"2123925ce13d6a8ecb2d1b8624e81e3841f9e53091a621eaa1fd3892c5adb1ef","signature":"3363b8e1840517df44108f32d9b5a37c4485229d6714a4065ec74f716d499f06","impliedFormat":99},{"version":"a031eb7acadc8468d1870bb0a79c173fa94b7eee80634d40cb5921b83c85ab30","impliedFormat":99},{"version":"a6be64ec5be12e7ae5cd07eef124ca68a49d6c8028a3a4505e9fd1516bf7f9fe","signature":"416c090664e32b92f521f38b7888aa24f792987da90331eea9980d1bec400979","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"semanticDiagnosticsPerFile":[[52,[{"start":717,"length":16,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'PlayerJumpAction'.","category":1,"code":2694},{"start":773,"length":12,"messageText":"'\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member named 'EntityAction'. Did you mean 'EntityActionDto'?","category":1,"code":2724},{"start":3396,"length":16,"code":2339,"category":1,"messageText":"Property 'PlayerJumpAction' does not exist on type 'typeof import(\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\", { with: { \"resolution-mode\": \"import\" } })'."},{"start":3714,"length":15,"code":2339,"category":1,"messageText":"Property 'PlayerRotAction' does not exist on type 'typeof import(\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\", { with: { \"resolution-mode\": \"import\" } })'."},{"start":3840,"length":5,"code":2339,"category":1,"messageText":"Property 'clone' does not exist on type 'EntityActionDto'."},{"start":4486,"length":20,"code":2339,"category":1,"messageText":"Property 'add_game_script_wasm' does not exist on type 'Game'."},{"start":4844,"length":6,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'Player'.","category":1,"code":2694},{"start":4868,"length":15,"code":2551,"category":1,"messageText":"Property 'add_player_wasm' does not exist on type 'Game'. Did you mean 'get_player_wasm'?","relatedInformation":[{"file":"../world/pkg/world.d.ts","start":2835,"length":15,"messageText":"'get_player_wasm' is declared here.","category":3,"code":2728}]},{"start":4968,"length":6,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'Player'.","category":1,"code":2694},{"start":5042,"length":26,"code":2339,"category":1,"messageText":"Property 'get_player_rot_script_wasm' does not exist on type 'Game'."},{"start":5195,"length":10,"messageText":"Expected 1 arguments, but got 2.","category":1,"code":2554},{"start":5441,"length":6,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'Player'.","category":1,"code":2694},{"start":5462,"length":17,"code":2339,"category":1,"messageText":"Property 'get_entities_wasm' does not exist on type 'Game'."}]]],"affectedFilesPendingEmit":[48,53,51,57,54,52],"emitSignatures":[[51,"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175"],[52,"d870a26306af502148387d8dc641d7cb86a298567c901ea9213e4e9425f19095"],[53,"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2"]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file diff --git a/lib/world/src/components/velocity.rs b/lib/world/src/components/velocity.rs index 0fe69e2..374768c 100644 --- a/lib/world/src/components/velocity.rs +++ b/lib/world/src/components/velocity.rs @@ -2,7 +2,7 @@ use crate::{entities::entity_component::impl_component, vec::impl_vector_ops}; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; -#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize)] #[wasm_bindgen] pub struct Velocity { pub x: f32, @@ -13,7 +13,6 @@ pub struct Velocity { impl_component!(Velocity); impl_vector_ops!(Velocity, f32); - impl Velocity { pub fn new(x: f32, y: f32, z: f32) -> Velocity { Velocity { x, y, z } @@ -27,4 +26,3 @@ impl Velocity { } } } - diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 742ba0b..bd08174 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -1,12 +1,14 @@ use super::{ - entity::{Entity, EntityHolder, EntityId}, entity_action::EntityActionHolder, game_script::{EntityScriptHolder, GameScript} + entity::{Entity, EntityHolder, EntityId}, + entity_action::EntityActionHolder, + game_script::{EntityScriptHolder, GameScript}, }; use crate::{ chunk::{Chunk, ChunkId}, world::{world_block::WorldBlock, World}, }; use serde::{Deserialize, Serialize}; -use wasm_bindgen::{prelude::wasm_bindgen}; +use wasm_bindgen::prelude::wasm_bindgen; #[wasm_bindgen] pub struct Game { @@ -150,9 +152,19 @@ impl GameSchedule { } mod tests { - use crate::{direction::Direction, entities::{ - entity_action::EntityActionDtoMaker, game::Game, player::make_player, player_jump_script::{JumpAction, JumpActionData}, player_move_script::{MoveAction, MoveActionData, MoveScript}, sandbox::SandBoxGScript, velocity_script::{self, VelocityScript} - }, components::{fine_world_pos::FineWorldPos, velocity::Velocity}}; + use crate::{ + components::{fine_world_pos::FineWorldPos, velocity::Velocity}, + direction::Direction, + entities::{ + entity_action::EntityActionDtoMaker, + game::Game, + player::make_player, + player_jump_script::{JumpAction, JumpActionData}, + player_move_script::{MoveAction, MoveActionData, MoveScript}, + sandbox::SandBoxGScript, + velocity_script::{self, VelocityScript}, + }, + }; #[test] pub fn add_player() { @@ -175,7 +187,7 @@ mod tests { game.update(); let jump_action_handler = JumpAction::make_handler(); game.action_holder.add_handler(jump_action_handler); - let jump_action = JumpAction::make_dto(1, JumpActionData{}); + let jump_action = JumpAction::make_dto(1, JumpActionData {}); game.action_holder.add(jump_action); game.update(); let player = game.entity_holder.get_entity_by_id(1).unwrap(); @@ -202,16 +214,18 @@ mod tests { game.action_holder.add_handler(MoveAction::make_handler()); - let move_action = MoveAction::make_dto(1, MoveActionData { - direction: Direction::North, - }); + let move_action = MoveAction::make_dto( + 1, + MoveActionData { + direction: Direction::North, + }, + ); game.action_holder.add(move_action); game.update(); let player = game.entity_holder.get_entity_by_id(1).unwrap(); let player_pos = player.get::().unwrap(); assert!(player_pos.z > 0.0); - } #[test] @@ -241,9 +255,16 @@ pub mod wasm { use super::{Game, GameDiff, GameSchedule, GameScript}; use crate::{ - chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, components::world_pos::WorldPos, entities::{ - entity::{Entity, EntityId}, entity_action::EntityActionDto, player::{make_player, wasm::WasmPlayer}, sandbox::SandBoxGScript - }, positions::ChunkPos, world::World + chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, + components::world_pos::WorldPos, + entities::{ + entity::{Entity, EntityId, EntityQueryResults}, + entity_action::EntityActionDto, + player::{make_player, wasm::WasmPlayer}, + sandbox::SandBoxGScript, + }, + positions::ChunkPos, + world::World, }; use serde_wasm_bindgen::{from_value, Error}; use wasm_bindgen::prelude::*; @@ -277,9 +298,9 @@ pub mod wasm { self.schedule_chunk_insert(chunk); } - // pub fn add_game_script_wasm(&mut self, script: WasmGameScript) { - // self.add_script(Box::new(script)); - // } + pub fn add_game_script_wasm(&mut self, script: WasmGameScript) { + self.add_script(Box::new(script)); + } pub fn get_chunk_mesh_by_chunkid_wasm(&self, chunk_id: ChunkId) -> Result { web_sys::console::log_1(&JsValue::from_str(&format!( @@ -332,7 +353,10 @@ pub mod wasm { pub fn get_players_wasm(&self) -> Result { let players = self.entity_holder.get_all(); - let players_wasm: Vec = players.iter().map(|player| WasmPlayer::make_from_entity(player)).collect(); + let players_wasm: Vec = players + .iter() + .map(|player| WasmPlayer::make_from_entity(player)) + .collect(); let players_js = serde_wasm_bindgen::to_value(&players_wasm).unwrap(); Ok(players_js) } @@ -350,6 +374,7 @@ pub mod wasm { } #[wasm_bindgen] + #[derive(Debug)] pub struct WasmGameScript { context: JsValue, on_diff_jsfn: js_sys::Function, @@ -366,15 +391,19 @@ pub mod wasm { } } - // impl GameScript for WasmGameScript { - // fn update(&self, world: &World, ents: &Vec>, delta: u8) -> GameSchedule { - // GameSchedule::empty() - // } + impl GameScript for WasmGameScript { + fn update( + &mut self, + _world: &World, + _query_results: EntityQueryResults, + ) -> Option { + None + } - // fn on_diff(&self, diff: GameDiff) -> () { - // // console log diff - // let val = serde_wasm_bindgen::to_value(&diff).unwrap(); - // self.on_diff_jsfn.call1(&self.context, &val).unwrap(); - // } - // } + fn on_diff(&self, diff: GameDiff) -> () { + // console log diff + let val = serde_wasm_bindgen::to_value(&diff).unwrap(); + self.on_diff_jsfn.call1(&self.context, &val).unwrap(); + } + } } diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index 2cbeed3..ae53cb6 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -28,26 +28,30 @@ pub fn make_player(uid: EntityId) -> Entity { pub mod wasm { use crate::{ - components::{fine_world_pos::FineWorldPos, velocity::Velocity}, entities::{ + components::{fine_world_pos::FineWorldPos, velocity::Velocity}, + entities::{ entity::{Entity, EntityId}, player_move_script::MovingDirection, - }, geometry::rotation::SphericalRotation + }, + geometry::rotation::SphericalRotation, }; use serde::{Deserialize, Serialize}; use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; #[derive(Serialize, Deserialize)] - + #[wasm_bindgen] pub struct WasmPlayer { - pos: FineWorldPos, - vel: Velocity, - rot: SphericalRotation, - moving_direction: MovingDirection, + pub id: EntityId, + pub pos: FineWorldPos, + pub vel: Velocity, + pub rot: SphericalRotation, + pub moving_direction: MovingDirection, } impl WasmPlayer { pub fn make_from_entity(entity: &Entity) -> WasmPlayer { WasmPlayer { + id: entity.id, pos: entity.get::().unwrap().clone(), vel: entity.get::().unwrap().clone(), rot: entity.get::().unwrap().clone(), diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/entities/player_jump_script.rs index c370bee..0aa650a 100644 --- a/lib/world/src/entities/player_jump_script.rs +++ b/lib/world/src/entities/player_jump_script.rs @@ -1,13 +1,20 @@ +use super::{ + entity::{Entity, EntityId, EntityQuery, EntityQueryResults}, + entity_action::{ActionData, EntityActionDto, EntityActionDtoMaker, EntityActionHandler}, + entity_component::impl_component, + game::GameSchedule, + game_script::GameScript, + player::Flying, +}; use crate::{components::velocity::Velocity, vec::Vector3Ops, world::World}; use wasm_bindgen::prelude::wasm_bindgen; -use super::{entity::{Entity, EntityId, EntityQuery, EntityQueryResults}, entity_action::{ActionData, EntityActionDto, EntityActionDtoMaker, EntityActionHandler}, entity_component::impl_component, game::GameSchedule, game_script::GameScript, player::Flying}; - #[derive(Clone, Debug)] pub struct JumpActionData {} #[derive(Clone, Debug, Default)] -pub struct JumpAction { } +#[wasm_bindgen] +pub struct JumpAction {} impl EntityActionDtoMaker for JumpAction { fn get_action_type_static() -> &'static str { "Jump-Action" @@ -38,7 +45,6 @@ impl EntityActionHandler for JumpAction { let new_jump_data = jump_data.stop_jumping(); - let diff_y_vel = jump_data.jump_speed - vel.y; let jump_force = Velocity { @@ -54,7 +60,6 @@ impl EntityActionHandler for JumpAction { entity.set::(new_vel); entity.set::(new_jump_data); } - } #[wasm_bindgen] @@ -86,15 +91,14 @@ impl JumpData { impl_component!(JumpData); - pub mod wasm { use super::*; #[wasm_bindgen] impl JumpAction { pub fn make_wasm(entity_id: EntityId) -> EntityActionDto { - let data = JumpActionData { }; + let data = JumpActionData {}; JumpAction::make_dto(entity_id, data) } } -} \ No newline at end of file +} diff --git a/lib/world/src/entities/player_rot_script.rs b/lib/world/src/entities/player_rot_script.rs index 380d7f9..4f73d2d 100644 --- a/lib/world/src/entities/player_rot_script.rs +++ b/lib/world/src/entities/player_rot_script.rs @@ -9,7 +9,9 @@ pub struct RotateActionData { pub rot_diff: SphericalRotation, } -pub struct RotateAction { } +#[wasm_bindgen] +pub struct RotateAction {} + impl EntityActionDtoMaker for RotateAction { fn get_action_type_static() -> &'static str { "PlayerRot-Action" @@ -38,4 +40,4 @@ pub mod wasm { RotateAction::make_dto(entity_id, data) } } -} \ No newline at end of file +} From 4eb50e93f00705f065b98e32c3c7dbc99d175873 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 18 May 2025 13:22:50 -0700 Subject: [PATCH 12/61] Can view things in the UI. The chunk rendering is messed up though --- DEVLOG.md | 43 ++++---- apps/web-client/index.html | 92 +---------------- apps/web-client/index_real.html | 98 +++++++++++++++++++ apps/web-client/src/elements.ts | 28 +++--- .../src/game-scripts/canvas-gscript.ts | 4 +- apps/web-client/src/renders/chunkRender.ts | 1 - apps/web-client/src/runner.ts | 5 +- apps/web-client/src/test.html | 16 --- lib/engine/src/playerActions.ts | 17 ++-- lib/engine/src/wrappers.ts | 4 +- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/entities/entity_action.rs | 21 +++- lib/world/src/entities/game.rs | 12 ++- lib/world/src/entities/player_rot_script.rs | 6 +- lib/world/src/geometry/rotation.rs | 18 +++- 15 files changed, 196 insertions(+), 171 deletions(-) create mode 100644 apps/web-client/index_real.html delete mode 100644 apps/web-client/src/test.html diff --git a/DEVLOG.md b/DEVLOG.md index 17c99f1..223f26f 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,18 +1,27 @@ +## 05_18_25 + +This repo is in a messy state. It seems like a a lot of work is needed to clean it up. I think I was refactoring to have all of the entity logic in the rust code instead and I was half way through that. I think I'mm going to make a very simple +UI to begin with that uses the rust code and attempts to render everything instead of messing with the server stuff for now. + +I got the actions to work in the UI. They are saved and updated. But the chunk rendering is a mess and isn't working. + ## 07_11_24 -Spent a while trying to figure out why cargo randomly rebuilt dependencies. Figured out it was turbo's issue? So I removed turbo and moved to just using yarn. -I also love the game script idea. It is cleaning things up nicely. +Spent a while trying to figure out why cargo randomly rebuilt dependencies. Figured out it was turbo's issue? So I removed turbo and moved to just using yarn. +I also love the game script idea. It is cleaning things up nicely. ## 06_22_24 -Trying to get the collision detection to be better with the player and the world. + +Trying to get the collision detection to be better with the player and the world. Current plan: -- Make a lib funciton that takes a box (pos, dim) and a pos it wants to go to and return the position it can actually go to. If the box would hit something while moving to the new position, then find the shorted distance to make the box not collide with anything. + +- Make a lib funciton that takes a box (pos, dim) and a pos it wants to go to and return the position it can actually go to. If the box would hit something while moving to the new position, then find the shorted distance to make the box not collide with anything. Basic form of function: -- Take all the world points of the block corner and the world points of the new potition. Create a line segment for each of these. Make a function that determines if a line segment is intersecting the world and at which point it intersects. Then find the line segment that minimizes the distance traveled and update all the box positions with that and return the new position and the face that it hit. Only stop applying force to a player if they hit something below them. +- Take all the world points of the block corner and the world points of the new potition. Create a line segment for each of these. Make a function that determines if a line segment is intersecting the world and at which point it intersects. Then find the line segment that minimizes the distance traveled and update all the box positions with that and return the new position and the face that it hit. Only stop applying force to a player if they hit something below them. ## Some other date @@ -138,8 +147,6 @@ Real issue seems to be that wasm_pack writes twice. It now renders the chunks made in rust to the screen using the chunk mesh. Looks like it is including a couple extra faces that aren't needed but that can be fixed with time. - - # 2 / 15 / 23 I've still been working here and there. Found a bug in the ray detection on the plane level. Test should be failing need to figure out why. @@ -159,6 +166,7 @@ I think a better debug mode to aim to make is a way to have no chunks loaded, bu Maybe also make it where the block face that is being looked at is highlighted I guess to hot reload I could have something that looks like this + ``` if (hot) { const state = game.save() @@ -169,7 +177,6 @@ if (hot) { Got the placing of a debug block working, just have to figure out how to place the block when there are no chunks. Do I want to check on the client if the chunk exists before inserting or add an option to automatically create the chunk if one doesn't exist. - # 6 / 10 / 23 Seems like deleting a block doesn't update the mesh. @@ -180,41 +187,35 @@ My idea to fix this is to add a dirty array to the chunk that is updated when a That fixed it but it does not delete the dirty blocks in a chunk ever. - Seems to still be an issue with placing blocks. Sometimes a a block seems to be not found and the ray goes through it. Only seems to happen when x or y cord is negative. Also might need to have a script that adds `type: module` to the package json in the wasm folder. That is preventing nodejs from loading the wasm module. - Think I want to work on high lighting the block that is being looked at for debug purposes. It will help with this stuff a lot. Looks like the blocks that aren't being found are because the ray isn't even checking that block sometimes. Found the issue. I made the ray check many more blocks while marching and it finds the correct one now. - It is now able to be built and deployed. But there seems still be be some minor issues + - infinite terrain generation doesn't work - Transparent blocks have some issues - Textures are rotated incorrectly - Working on infinite chunk generation. I want to make it so a single chunk is rendered a frame. I made it where it now only sends a single chunk at a time to be loaded. - # 6 / 11 / 23 Added turbo repo and linting to the project. Moved everything around to make more sense and I think it is a good structure. Want to work on fixing terrain gen next. - # 6 / 15 / 23 Multiplayer kind of works not but is not robust at all. And all the textures are rotated incorrectly. - Trying to think about the best way to have an entity be controlled by gpt4. Might want an "EntityController" that moves the entity around. Entities might have a "brain" that is passed in that controls the entity. Maybe each entity needs a controller. The entity class controls the logic of the entity and the moves it can make. The controller calls those moves in interesting ways. The entity controller for a player might be a socket, a keyboard, or gpt4. @@ -224,7 +225,6 @@ type entityController = { update: () => void } - examples keyboardPlayerController { setup() { @@ -244,26 +244,21 @@ socketPlayerController { } } - # 08/23/23 Thinking of what to work on next. I think rewritting the terrain generator in rust could be a good project - # 09/03/23 -I've got covid, so I've had time to rewrite this is rust a bit. I've created a terrain gen app that does smooth height transitions, generates trees, and generates flowers. Making the trees be spread a part randomly is hard, but I solved it by doing it chunk by chunk and lazily loading the tree in nearby chunks to make sure there is no overlap. +I've got covid, so I've had time to rewrite this is rust a bit. I've created a terrain gen app that does smooth height transitions, generates trees, and generates flowers. Making the trees be spread a part randomly is hard, but I solved it by doing it chunk by chunk and lazily loading the tree in nearby chunks to make sure there is no overlap. I noticed that the transparency is broken and that some of the textures are rotated incorrectly. I think I will fix that next. - - # 09/04/23 -Fixed transparency, it was an issue with the new way I'm doing mesh generation. Fixed textured being rotated incorrectly too. Now noticing that a tree's leafs are not included if they go over a chunk boundary. Tackling that next. - -Then I'll start thinking about biomes. +Fixed transparency, it was an issue with the new way I'm doing mesh generation. Fixed textured being rotated incorrectly too. Now noticing that a tree's leafs are not included if they go over a chunk boundary. Tackling that next. +Then I'll start thinking about biomes. # 03/19/23 diff --git a/apps/web-client/index.html b/apps/web-client/index.html index 37c14ae..5b040b9 100644 --- a/apps/web-client/index.html +++ b/apps/web-client/index.html @@ -1,98 +1,14 @@ TylerCraft - + + -
- -
- -

Tyler Craft

-

A 3D sandbox by Tyler Tracy

-
-
- -
- - - - - - - + -
-
- - -
- - -
-
-
-
- -
- 0,0,0
- Fps: -
- -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
- - + \ No newline at end of file diff --git a/apps/web-client/index_real.html b/apps/web-client/index_real.html new file mode 100644 index 0000000..37c14ae --- /dev/null +++ b/apps/web-client/index_real.html @@ -0,0 +1,98 @@ + + TylerCraft + + + + + + +
+ +
+ +

Tyler Craft

+

A 3D sandbox by Tyler Tracy

+
+
+ +
+ + + + + + + + +
+ +
+ + +
+ + + +
+
+
+
+ +
+ 0,0,0
+ Fps: +
+ +
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+ + diff --git a/apps/web-client/src/elements.ts b/apps/web-client/src/elements.ts index 20edb0a..a4877be 100644 --- a/apps/web-client/src/elements.ts +++ b/apps/web-client/src/elements.ts @@ -1,16 +1,16 @@ import { getEleOrError } from "./utils"; -export const ePlayLocalButton = getEleOrError("playLocalButton"); -export const ePlayOnlineButton = getEleOrError("playOnlineButton"); -export const eStartMenu = getEleOrError("startMenu"); -export const eGameTypeScreen = getEleOrError("pickGameTypeScreen"); -export const ePickWorldScreen = getEleOrError("pickWorldScreen"); -export const eBackButton = getEleOrError("backButton"); -export const eWorldOptionsScreen = getEleOrError("worldOptionsScreen"); -export const eConfigForm = getEleOrError("configForm"); -export const eConfigFormExtra = getEleOrError("configFormExtra"); -export const eConfigFormStartButton = getEleOrError( - "configFormStartButton" -); -export const eLoadingScreen = getEleOrError("loadingScreen"); -export const eLoadingScreenMsg = getEleOrError("loadingScreenMsg"); +// export const ePlayLocalButton = getEleOrError("playLocalButton"); +// export const ePlayOnlineButton = getEleOrError("playOnlineButton"); +// export const eStartMenu = getEleOrError("startMenu"); +// export const eGameTypeScreen = getEleOrError("pickGameTypeScreen"); +// export const ePickWorldScreen = getEleOrError("pickWorldScreen"); +// export const eBackButton = getEleOrError("backButton"); +// export const eWorldOptionsScreen = getEleOrError("worldOptionsScreen"); +// export const eConfigForm = getEleOrError("configForm"); +// export const eConfigFormExtra = getEleOrError("configFormExtra"); +// export const eConfigFormStartButton = getEleOrError( +// "configFormStartButton" +// ); +// export const eLoadingScreen = getEleOrError("loadingScreen"); +// export const eLoadingScreenMsg = getEleOrError("loadingScreenMsg"); diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index f902344..e027489 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -140,8 +140,8 @@ export class CanvasGameScript extends GameScript { this.perspective === PlayerPerspective.FirstPerson ? PlayerPerspective.ThirdPersonBack : this.perspective === PlayerPerspective.ThirdPersonBack - ? PlayerPerspective.ThirdPersonFront - : PlayerPerspective.FirstPerson; + ? PlayerPerspective.ThirdPersonFront + : PlayerPerspective.FirstPerson; return this.perspective !== PlayerPerspective.FirstPerson; } diff --git a/apps/web-client/src/renders/chunkRender.ts b/apps/web-client/src/renders/chunkRender.ts index e70dde5..4cbb1e5 100644 --- a/apps/web-client/src/renders/chunkRender.ts +++ b/apps/web-client/src/renders/chunkRender.ts @@ -31,7 +31,6 @@ export class ChunkRenderer extends Renderer { render(camera: Camera, trans?: boolean): void { // if (!this.isLoaded) return; - this.setActiveTexture(this.webGlGScript.textureAtlas); this.renderObject(this.worldPos, camera, trans); diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 0c4f488..adc40ff 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -4,12 +4,13 @@ import { WebGlGScript } from "./game-scripts/webgl-gscript"; import { MobileController } from "./controllers/playerControllers/mobileController"; import { KeyboardPlayerEntityController } from "./controllers/playerControllers/keyboardPlayerController"; import { getMyUid, hideElement, IS_MOBILE, showElement } from "./utils"; -import { eStartMenu } from "./elements"; +// import { eStartMenu } from "./elements"; export function run() { // Start the game + console.log("RUNNING Starting game"); - hideElement(eStartMenu); + // hideElement(eStartMenu); const game = GameWrapper.makeGame(); diff --git a/apps/web-client/src/test.html b/apps/web-client/src/test.html deleted file mode 100644 index 7b5b864..0000000 --- a/apps/web-client/src/test.html +++ /dev/null @@ -1,16 +0,0 @@ - - TylerCraft - - - - - - - - - - - \ No newline at end of file diff --git a/lib/engine/src/playerActions.ts b/lib/engine/src/playerActions.ts index 7916527..de6a09c 100644 --- a/lib/engine/src/playerActions.ts +++ b/lib/engine/src/playerActions.ts @@ -1,5 +1,5 @@ -import { BlockType, Direction } from "@craft/rust-world"; -import { EntityAction, GameWrapper } from "./wrappers.js"; +import { BlockType, Direction, EntityActionDto } from "@craft/rust-world"; +import { GameWrapper } from "./wrappers.js"; // export enum PlayerActionType { // Jump = "jump", @@ -74,16 +74,16 @@ import { EntityAction, GameWrapper } from "./wrappers.js"; // } export class PlayerActionService { - constructor(private game: GameWrapper) {} + constructor(private game: GameWrapper) { } private playerActions = new Map< number, - Array<(action: EntityAction) => void> + Array<(action: EntityActionDto) => void> >(); addActionListener( playerId: number, - listener: (action: EntityAction) => void + listener: (action: EntityActionDto) => void ) { this.playerActions.set(playerId, [ ...(this.playerActions.get(playerId) || []), @@ -91,10 +91,11 @@ export class PlayerActionService { ]); } - performAction(action: EntityAction) { + performAction(action: EntityActionDto) { + const entityId = action.entity_id; this.game.handleAction(action); - const listeners = this.playerActions.get(action.entity_id); + const listeners = this.playerActions.get(entityId); if (!listeners) { return; } @@ -110,7 +111,7 @@ export abstract class PlayerController { protected playerActionService: PlayerActionService, protected game: GameWrapper, protected playerId: number - ) {} + ) { } jump() { const action = this.game.makeJumpAction(this.playerId); diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index abe65f6..03e5713 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -145,9 +145,7 @@ export class GameWrapper { y: number ): WorldWasm.EntityActionDto { console.log("Making rotate action", entityId, x, y); - const rotDiff = new WorldWasm.SphericalRotation(); - rotDiff.phi = x; - rotDiff.theta = y; + const rotDiff = WorldWasm.SphericalRotation.new_wasm(y, x); return WorldWasm.RotateAction.make_wasm(entityId, rotDiff); } diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 620a6c6..7c6b486 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"5869e72c033cbc63c8966183aa83f3020d6fc0fa145e56f89b8c7a26ef55045b","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","impliedFormat":99},{"version":"2123925ce13d6a8ecb2d1b8624e81e3841f9e53091a621eaa1fd3892c5adb1ef","signature":"3363b8e1840517df44108f32d9b5a37c4485229d6714a4065ec74f716d499f06","impliedFormat":99},{"version":"a031eb7acadc8468d1870bb0a79c173fa94b7eee80634d40cb5921b83c85ab30","impliedFormat":99},{"version":"a6be64ec5be12e7ae5cd07eef124ca68a49d6c8028a3a4505e9fd1516bf7f9fe","signature":"416c090664e32b92f521f38b7888aa24f792987da90331eea9980d1bec400979","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"semanticDiagnosticsPerFile":[[52,[{"start":717,"length":16,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'PlayerJumpAction'.","category":1,"code":2694},{"start":773,"length":12,"messageText":"'\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member named 'EntityAction'. Did you mean 'EntityActionDto'?","category":1,"code":2724},{"start":3396,"length":16,"code":2339,"category":1,"messageText":"Property 'PlayerJumpAction' does not exist on type 'typeof import(\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\", { with: { \"resolution-mode\": \"import\" } })'."},{"start":3714,"length":15,"code":2339,"category":1,"messageText":"Property 'PlayerRotAction' does not exist on type 'typeof import(\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\", { with: { \"resolution-mode\": \"import\" } })'."},{"start":3840,"length":5,"code":2339,"category":1,"messageText":"Property 'clone' does not exist on type 'EntityActionDto'."},{"start":4486,"length":20,"code":2339,"category":1,"messageText":"Property 'add_game_script_wasm' does not exist on type 'Game'."},{"start":4844,"length":6,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'Player'.","category":1,"code":2694},{"start":4868,"length":15,"code":2551,"category":1,"messageText":"Property 'add_player_wasm' does not exist on type 'Game'. Did you mean 'get_player_wasm'?","relatedInformation":[{"file":"../world/pkg/world.d.ts","start":2835,"length":15,"messageText":"'get_player_wasm' is declared here.","category":3,"code":2728}]},{"start":4968,"length":6,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'Player'.","category":1,"code":2694},{"start":5042,"length":26,"code":2339,"category":1,"messageText":"Property 'get_player_rot_script_wasm' does not exist on type 'Game'."},{"start":5195,"length":10,"messageText":"Expected 1 arguments, but got 2.","category":1,"code":2554},{"start":5441,"length":6,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'Player'.","category":1,"code":2694},{"start":5462,"length":17,"code":2339,"category":1,"messageText":"Property 'get_entities_wasm' does not exist on type 'Game'."}]]],"affectedFilesPendingEmit":[48,53,51,57,54,52],"emitSignatures":[[51,"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175"],[52,"d870a26306af502148387d8dc641d7cb86a298567c901ea9213e4e9425f19095"],[53,"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2"]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"aebabc4f11a0c6ab46f51b2919a17a3a031bbf4746067425f46f7d0a431ef4c5","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"255e84f9cebcc93c53c9aafba6a7e91864f4952abba3cf8e3de80805939bf76d","signature":"602d7b5fbc7bd5ddb04277ff5d5c46204f905a537639e7bbc35afc8c809c6eaa","impliedFormat":99},{"version":"a031eb7acadc8468d1870bb0a79c173fa94b7eee80634d40cb5921b83c85ab30","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"c7b616c4275adfb81bf82ef208d2c07f8e83e48dc1591f7e0e9215fff55acab6","signature":"2ff1a356c55d95d445c8953b7079ef30117b3c1eec1e0718614e487329fe7c80","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file diff --git a/lib/world/src/entities/entity_action.rs b/lib/world/src/entities/entity_action.rs index 2f0f4ae..ea9fc4a 100644 --- a/lib/world/src/entities/entity_action.rs +++ b/lib/world/src/entities/entity_action.rs @@ -1,7 +1,9 @@ +use crate::utils::js_log; + +use super::entity::{Entity, EntityHolder, EntityId}; use std::any::Any; -use wasm_bindgen::prelude::*; use std::fmt::Debug; -use super::entity::{Entity, EntityHolder, EntityId}; +use wasm_bindgen::prelude::*; pub trait ActionData: Any + Debug { fn clone_box(&self) -> Box; @@ -22,7 +24,6 @@ where } } - #[wasm_bindgen] #[derive(Debug)] pub struct EntityActionDto { @@ -58,7 +59,7 @@ pub trait EntityActionDtoMaker: EntityActionHandler { EntityActionDto { entity_id, name: Self::get_action_type_static(), - data: Box::new(data) + data: Box::new(data), } } } @@ -78,18 +79,28 @@ impl EntityActionHolder { self.handlers.push(handler); } - pub fn handle_actions(&self, entity_holder: &mut EntityHolder) { + pub fn handle_actions(&mut self, entity_holder: &mut EntityHolder) { for action in &self.actions { + js_log(&format!("Handling action: {:?}", action)); + js_log(&format!("Num handlers: {:?}", self.handlers.len())); println!("Handling action: {:?}", action); let entity = entity_holder.get_entity_by_id_mut(action.entity_id); println!("Entity: {:?}", entity); + let mut action_handled = false; if let Some(entity) = entity { for handler in &self.handlers { if handler.get_action_type() == action.name { handler.handle_dto(entity, action); + action_handled = true; } } } + if !action_handled { + js_log(&format!("Action not handled: {:?}", action)); + } } + + // clear actions + self.actions.clear(); } } diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index bd08174..7d3085f 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -259,11 +259,15 @@ pub mod wasm { components::world_pos::WorldPos, entities::{ entity::{Entity, EntityId, EntityQueryResults}, - entity_action::EntityActionDto, + entity_action::{EntityActionDto, EntityActionDtoMaker}, player::{make_player, wasm::WasmPlayer}, + player_jump_script::JumpAction, + player_move_script::MoveAction, + player_rot_script::RotateAction, sandbox::SandBoxGScript, }, positions::ChunkPos, + utils::js_log, world::World, }; use serde_wasm_bindgen::{from_value, Error}; @@ -277,6 +281,12 @@ pub mod wasm { let sandbox_script = Box::new(SandBoxGScript::default()); g.add_script(sandbox_script); g.update(); + + // Add basic action handlers + g.action_holder.add_handler(MoveAction::make_handler()); + g.action_holder.add_handler(JumpAction::make_handler()); + g.action_holder.add_handler(RotateAction::make_handler()); + g } diff --git a/lib/world/src/entities/player_rot_script.rs b/lib/world/src/entities/player_rot_script.rs index 4f73d2d..97b969b 100644 --- a/lib/world/src/entities/player_rot_script.rs +++ b/lib/world/src/entities/player_rot_script.rs @@ -1,6 +1,7 @@ use super::entity::{Entity, EntityId}; use super::entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}; use crate::geometry::rotation::SphericalRotation; +use crate::utils::js_log; use wasm_bindgen::prelude::wasm_bindgen; #[wasm_bindgen] @@ -10,16 +11,17 @@ pub struct RotateActionData { } #[wasm_bindgen] +#[derive(Clone, Debug, Default)] pub struct RotateAction {} impl EntityActionDtoMaker for RotateAction { fn get_action_type_static() -> &'static str { - "PlayerRot-Action" + "Player-Rotate" } } impl EntityActionHandler for RotateAction { fn get_action_type(&self) -> &'static str { - "PlayerRot" + "Player-Rotate" } fn handle_dto(&self, entity: &mut Entity, data: &EntityActionDto) { diff --git a/lib/world/src/geometry/rotation.rs b/lib/world/src/geometry/rotation.rs index 5a8eb76..64994bc 100644 --- a/lib/world/src/geometry/rotation.rs +++ b/lib/world/src/geometry/rotation.rs @@ -1,10 +1,14 @@ -use crate::{components::{fine_world_pos::FineWorldPos, velocity::Velocity}, entities::entity_component::impl_component, vec::Vec3f32}; +use crate::vec::Vector3Ops; +use crate::{ + components::{fine_world_pos::FineWorldPos, velocity::Velocity}, + entities::entity_component::impl_component, + vec::Vec3f32, +}; use serde::{Deserialize, Serialize}; use std::{f32::consts::PI, ops::Add}; use wasm_bindgen::prelude::wasm_bindgen; -use crate::vec::Vector3Ops; -#[derive(Clone, Copy, PartialEq, Debug, Default,Serialize, Deserialize)] +#[derive(Clone, Copy, PartialEq, Debug, Default, Serialize, Deserialize)] #[wasm_bindgen] pub struct SphericalRotation { /** The flat angle. [0, 2PI] */ @@ -14,6 +18,13 @@ pub struct SphericalRotation { pub phi: f32, } +#[wasm_bindgen] +impl SphericalRotation { + pub fn new_wasm(theta: f32, phi: f32) -> SphericalRotation { + SphericalRotation { theta, phi } + } +} + impl_component!(SphericalRotation); impl SphericalRotation { @@ -21,7 +32,6 @@ impl SphericalRotation { SphericalRotation { theta, phi } } - pub fn get_unit_vector(&self) -> Vec3f32 { let phi_offset = (PI / 2.0) - self.phi; let theta_offset = self.theta + (PI / 2.0); From 0741de7467a795a0519cb44a31950cc95bbba50f Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 18 May 2025 14:00:40 -0700 Subject: [PATCH 13/61] Rendering the blocks works again --- .../src/game-scripts/canvas-gscript.ts | 2 +- apps/web-client/src/renders/chunkRender.ts | 4 ++ apps/web-client/src/renders/renderer.ts | 13 ++--- apps/web-client/src/runner.ts | 2 +- lib/engine/src/camera.ts | 3 +- lib/engine/src/playerActions.ts | 1 - lib/engine/src/wrappers.ts | 12 ++--- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/entities/game.rs | 4 +- lib/world/src/entities/player.rs | 6 ++- lib/world/src/entities/player_rot_script.rs | 3 ++ lib/world/src/entities/sandbox.rs | 24 ++++++--- lib/world/src/entities/terrain_gen.rs | 50 ++++++++++++++++--- 13 files changed, 88 insertions(+), 38 deletions(-) diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index e027489..e28c945 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -184,7 +184,7 @@ export class CanvasGameScript extends GameScript { ) { continue; } - entityRenderer.render(camera); + // entityRenderer.render(camera); } // loop through all of the chunks that I would be able to see. diff --git a/apps/web-client/src/renders/chunkRender.ts b/apps/web-client/src/renders/chunkRender.ts index 4cbb1e5..43eff5b 100644 --- a/apps/web-client/src/renders/chunkRender.ts +++ b/apps/web-client/src/renders/chunkRender.ts @@ -73,6 +73,8 @@ export class ChunkRenderer extends Renderer { blockRenData.pushData({ textureCords }); } + console.log("BlockRenData", cube.pos, blockData); + break; } case BlockShape.Flat: { @@ -104,6 +106,8 @@ export class ChunkRenderer extends Renderer { } }); + console.log("ChunkRenderer: Buffer data", renData, transRenData); + this.setBuffers(renData, transRenData); } } diff --git a/apps/web-client/src/renders/renderer.ts b/apps/web-client/src/renders/renderer.ts index be4933f..d1e004e 100644 --- a/apps/web-client/src/renders/renderer.ts +++ b/apps/web-client/src/renders/renderer.ts @@ -15,7 +15,7 @@ export class RenderData implements IRenderData { indexOffset = 0; - constructor(private shouldLog = false) {} + constructor(private shouldLog = false) { } public pushData(renData: Partial) { if (this.shouldLog) { @@ -50,7 +50,7 @@ export abstract class Renderer { amount = 0; transAmount = 0; - constructor(protected webGlGScript: WebGlGScript) {} + constructor(protected webGlGScript: WebGlGScript) { } protected setBuffers(renData: IRenderData, transRenData?: IRenderData) { const gl = this.webGlGScript.gl; @@ -247,13 +247,8 @@ export abstract class Renderer { // Set the drawing position to the "identity" point, which is // the center of the scene. - // TODO tweak these to work - // need to invert - // theta = -this.rot.get(1) + (Math.PI * 3) / 2, - // // Convert to [-pi/2, pi/2] - // phi = -(Math.PI / 2 - this.rot.get(2)), - const theta = Math.PI / 2 - camera.rot.get(2); - const phi = Math.PI / 2 - camera.rot.get(1); + const theta = camera.rot.get(1); + const phi = camera.rot.get(2); const modelViewMatrix = mat4.create(); mat4.rotate(modelViewMatrix, modelViewMatrix, theta, [1, 0, 0]); diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index adc40ff..51a567a 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -12,7 +12,7 @@ export function run() { // hideElement(eStartMenu); - const game = GameWrapper.makeGame(); + const game = GameWrapper.makeGame(true, true); const main_player_uid = getMyUid(); diff --git a/lib/engine/src/camera.ts b/lib/engine/src/camera.ts index 3b0b1a2..e899e1b 100644 --- a/lib/engine/src/camera.ts +++ b/lib/engine/src/camera.ts @@ -18,9 +18,10 @@ const getPlayerOffset = (player: PlayerWrapper) => { }; export const makeCameraForPlayer = (player: PlayerWrapper) => { + const adjustedRot = player.rot.add(new Vector3D([0, 0, 0])); return { pos: player.pos.add(getPlayerOffset(player)), - rot: player.rot, + rot: adjustedRot, }; }; diff --git a/lib/engine/src/playerActions.ts b/lib/engine/src/playerActions.ts index de6a09c..7cc3182 100644 --- a/lib/engine/src/playerActions.ts +++ b/lib/engine/src/playerActions.ts @@ -119,7 +119,6 @@ export abstract class PlayerController { } rotate(x: number, y: number) { - // TO-DO const action = this.game.makeRotateAction(this.playerId, x, y); this.playerActionService.performAction(action); } diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index 03e5713..2137e0b 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -122,8 +122,8 @@ export class BlockWrapper { export class GameWrapper { constructor(private game: WorldWasm.Game) { } - static makeGame(): GameWrapper { - const game = WorldWasm.Game.new_wasm(); + static makeGame(flat_world: boolean, debug_world: boolean): GameWrapper { + const game = WorldWasm.Game.new_wasm(flat_world, debug_world); return new GameWrapper(game); } @@ -141,11 +141,11 @@ export class GameWrapper { makeRotateAction( entityId: number, - x: number, - y: number + theta: number, + phi: number ): WorldWasm.EntityActionDto { - console.log("Making rotate action", entityId, x, y); - const rotDiff = WorldWasm.SphericalRotation.new_wasm(y, x); + console.log("Making rotate action", entityId, theta, phi); + const rotDiff = WorldWasm.SphericalRotation.new_wasm(theta, phi); return WorldWasm.RotateAction.make_wasm(entityId, rotDiff); } diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 7c6b486..ce91bb8 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"aebabc4f11a0c6ab46f51b2919a17a3a031bbf4746067425f46f7d0a431ef4c5","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"255e84f9cebcc93c53c9aafba6a7e91864f4952abba3cf8e3de80805939bf76d","signature":"602d7b5fbc7bd5ddb04277ff5d5c46204f905a537639e7bbc35afc8c809c6eaa","impliedFormat":99},{"version":"a031eb7acadc8468d1870bb0a79c173fa94b7eee80634d40cb5921b83c85ab30","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"c7b616c4275adfb81bf82ef208d2c07f8e83e48dc1591f7e0e9215fff55acab6","signature":"2ff1a356c55d95d445c8953b7079ef30117b3c1eec1e0718614e487329fe7c80","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"dcbeb3ff4788b784da3eaf82130f8e627f7351b454d948d8b0c07bae538ce4b0","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"2d4c134e927e56039b9dacb474227bb9be5cd7e3d9ff25c2bfe62602c25ab18a","signature":"bdaec88d0a786b7a47810e1d66fe99c894b45bceab66fc0a109a9d2873910767","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"5485697b61aea26f0a369ffbfc5c01101dc387677df82a9abf35d9f49165f9a7","signature":"2ff1a356c55d95d445c8953b7079ef30117b3c1eec1e0718614e487329fe7c80","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 7d3085f..7c4ed1a 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -275,10 +275,10 @@ pub mod wasm { #[wasm_bindgen] impl Game { - pub fn new_wasm() -> Game { + pub fn new_wasm(flat_world: bool, debug_world: bool) -> Game { console_error_panic_hook::set_once(); let mut g = Game::new(); - let sandbox_script = Box::new(SandBoxGScript::default()); + let sandbox_script = Box::new(SandBoxGScript::new(0, flat_world, debug_world, 1)); g.add_script(sandbox_script); g.update(); diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index ae53cb6..d32e137 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -18,7 +18,11 @@ impl_component!(Flying); pub fn make_player(uid: EntityId) -> Entity { let mut ent = Entity::new(uid); - ent.add::(FineWorldPos::default()); + ent.add::(FineWorldPos { + x: 0.0, + y: 10.0, + z: 0.0, + }); ent.add::(Velocity::default()); ent.add::(SphericalRotation::new(0.0, 0.0)); ent.add::(None); diff --git a/lib/world/src/entities/player_rot_script.rs b/lib/world/src/entities/player_rot_script.rs index 97b969b..ac9f805 100644 --- a/lib/world/src/entities/player_rot_script.rs +++ b/lib/world/src/entities/player_rot_script.rs @@ -28,6 +28,9 @@ impl EntityActionHandler for RotateAction { let data = data.get_data::().unwrap(); let new_rot = entity.get::().unwrap().to_owned() + data.rot_diff; + + js_log(&format!("New rot: {:?}", new_rot)); + entity.set::(new_rot); } } diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index fbeac62..7aeaaab 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -1,5 +1,8 @@ use super::{ - entity::{EntityQuery, EntityQueryResults}, game::{Game, GameDiff, GameSchedule}, game_script::GameScript, terrain_gen::TerrainGenerator + entity::{EntityQuery, EntityQueryResults}, + game::{Game, GameDiff, GameSchedule}, + game_script::GameScript, + terrain_gen::TerrainGenerator, }; use crate::{components::fine_world_pos::FineWorldPos, positions::ChunkPos, world::World}; @@ -17,18 +20,23 @@ impl Default for SandBoxGScript { seed: 0, flat_world: false, load_distance: 1, - terrain_gen: TerrainGenerator::new(0, false), + terrain_gen: TerrainGenerator::new(0, false, false), } } } impl SandBoxGScript { - pub fn new(seed: u32, flat_world: bool, infinite: bool, load_distance: u8) -> SandBoxGScript { + pub fn new( + seed: u32, + flat_world: bool, + debug_world: bool, + load_distance: u8, + ) -> SandBoxGScript { SandBoxGScript { seed, flat_world, load_distance, - terrain_gen: TerrainGenerator::new(seed, flat_world), + terrain_gen: TerrainGenerator::new(seed, flat_world, debug_world), } } @@ -49,7 +57,6 @@ impl SandBoxGScript { } impl GameScript for SandBoxGScript { - fn get_query(&self) -> EntityQuery { let mut query = EntityQuery::new(); query.add::(); @@ -57,8 +64,11 @@ impl GameScript for SandBoxGScript { } fn update(&mut self, world: &World, query_results: EntityQueryResults) -> Option { - - let entity_poses: Vec = query_results.entities.iter().map(|ent| ent.get::().unwrap().clone()).collect(); + let entity_poses: Vec = query_results + .entities + .iter() + .map(|ent| ent.get::().unwrap().clone()) + .collect(); let nearby_unloaded_chunks: Vec = entity_poses .iter() diff --git a/lib/world/src/entities/terrain_gen.rs b/lib/world/src/entities/terrain_gen.rs index 494a5ed..ebebd67 100644 --- a/lib/world/src/entities/terrain_gen.rs +++ b/lib/world/src/entities/terrain_gen.rs @@ -1,11 +1,18 @@ +use crate::direction::DirectionVectorExtension2; use crate::{ - block::{BlockData, BlockType, ChunkBlock}, chunk::{Chunk, CHUNK_WIDTH}, components::world_pos::WorldPos, direction::{Direction, DirectionVectorExtension, Directions, EVERY_FLAT_DIRECTION}, geometry::vec2::Vec2Ops, positions::{ChunkPos, InnerChunkPos}, vec::Vector3Ops, world::world_block::WorldBlock + block::{BlockData, BlockType, ChunkBlock}, + chunk::{Chunk, CHUNK_WIDTH}, + components::world_pos::WorldPos, + direction::{Direction, DirectionVectorExtension, Directions, EVERY_FLAT_DIRECTION}, + geometry::vec2::Vec2Ops, + positions::{ChunkPos, InnerChunkPos}, + vec::Vector3Ops, + world::world_block::WorldBlock, }; use noise::{NoiseFn, Perlin}; use rand::{rngs::StdRng, SeedableRng}; use rand_distr::{Distribution, Uniform}; use serde::{Deserialize, Serialize}; -use crate::direction::DirectionVectorExtension2; // remove all the positions that are too close to each other in the chunk fn remove_close_positions<'a, I, J>(pos_iter: I, checking_pos_iter: J) -> Vec @@ -110,7 +117,6 @@ pub struct TreeRandomSpreadGenerator { } impl TreeRandomSpreadGenerator { - pub fn make_from_seed(seed: u64) -> TreeRandomSpreadGenerator { TreeRandomSpreadGenerator { seed, @@ -128,7 +134,11 @@ impl TreeRandomSpreadGenerator { let mut tree_locations: Vec = Vec::new(); // sample 40 numbers - let tree_locations_rnd = self.dist.sample_iter(&mut rng).take(40).collect::>(); + let tree_locations_rnd = self + .dist + .sample_iter(&mut rng) + .take(40) + .collect::>(); for i in 0..20 { let x = tree_locations_rnd[i]; @@ -402,6 +412,21 @@ impl FlatWorldChunkGetter { } } +struct DebugWorldChunkGetter {} + +impl DebugWorldChunkGetter { + pub fn get_chunk(&self, chunk_pos: &ChunkPos) -> Chunk { + let mut chunk = Chunk::new(*chunk_pos); + let block = ChunkBlock { + pos: InnerChunkPos::new(0, 0, 0), + block_type: BlockType::Grass, + extra_data: BlockData::None, + }; + chunk.add_block(block); + chunk + } +} + #[derive(Serialize, Deserialize)] // #[wasm_bindgen] struct ParkorChunkGetter { @@ -464,8 +489,7 @@ impl ParkorChunkGetter { let mut count = 0; // keep loading the next block until it isn't load distance away from me - while next_block.world_pos.to_chunk_pos().distance_to(chunk_pos) as u8 - <= self.load_distance + while next_block.world_pos.to_chunk_pos().distance_to(chunk_pos) as u8 <= self.load_distance && count < 10 { self.current_blocks.push(next_block); @@ -496,13 +520,18 @@ impl ParkorChunkGetter { pub struct TerrainGenerator { pub seed: u32, pub flat_world: bool, + pub debug_world: bool, } // #[wasm_bindgen] impl TerrainGenerator { // #[wasm_bindgen(constructor)] - pub fn new(seed: u32, flat_world: bool) -> TerrainGenerator { - TerrainGenerator { seed, flat_world } + pub fn new(seed: u32, flat_world: bool, debug_world: bool) -> TerrainGenerator { + TerrainGenerator { + seed, + flat_world, + debug_world, + } } pub fn get_chunk(&self, chunk_x: i16, chunk_y: i16) -> Chunk { @@ -516,6 +545,11 @@ impl TerrainGenerator { return chunk_getter.get_chunk(&chunk_pos); } + if self.debug_world { + let chunk_getter = DebugWorldChunkGetter {}; + return chunk_getter.get_chunk(&chunk_pos); + } + let chunk_getter = BasicChunkGetter::make(self.seed); chunk_getter.get_chunk(&chunk_pos) } From 29cd2766af3a3b03fb1fcdfc9d6234c41d1b86f5 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 18 May 2025 15:13:32 -0700 Subject: [PATCH 14/61] Can move around the infinite world again --- .../keyboardPlayerController.ts | 77 ++++++++++--------- .../src/game-scripts/canvas-gscript.ts | 19 ++--- apps/web-client/src/renders/chunkRender.ts | 4 - apps/web-client/src/renders/renderer.ts | 8 +- lib/engine/src/playerActions.ts | 5 +- lib/engine/src/wrappers.ts | 12 ++- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/components/world_pos.rs | 17 ++-- lib/world/src/entities/game.rs | 8 +- lib/world/src/entities/player_move_script.rs | 59 +++++++++++--- lib/world/src/entities/velocity_script.rs | 33 ++++++-- lib/world/src/positions.rs | 14 ++-- lib/world/src/vec.rs | 40 +++++++--- 13 files changed, 198 insertions(+), 100 deletions(-) diff --git a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts index ee58973..fc4f8d3 100644 --- a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts +++ b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts @@ -18,8 +18,7 @@ export class KeyboardPlayerEntityController extends PlayerController { private keys = new Set(); private keysPressed = new Set(); - private currentMoveDirections = new Set(); - private prevMoveDirections = new Set(); + private currentMoveDirection: Direction | "None" = "None"; private numOfUpdates = 0; @@ -70,7 +69,7 @@ export class KeyboardPlayerEntityController extends PlayerController { moveX += Math.PI; this.rotate(moveX, moveY); } else { - this.rotate(moveX, moveY); + this.rotate(-moveX, moveY); } } }); @@ -116,22 +115,28 @@ export class KeyboardPlayerEntityController extends PlayerController { this.keys.add(key.toLowerCase()); switch (key) { case "w": - this.currentMoveDirections.add(Direction.North); + this.currentMoveDirection = Direction.North; + this.move(Direction.North); break; case "s": - this.currentMoveDirections.add(Direction.South); + this.currentMoveDirection = Direction.South; + this.move(Direction.South); break; case "a": - this.currentMoveDirections.add(Direction.West); + this.currentMoveDirection = Direction.West; + this.move(Direction.West); break; case "d": - this.currentMoveDirections.add(Direction.East); + this.currentMoveDirection = Direction.East; + this.move(Direction.East); break; case "e": - this.currentMoveDirections.add(Direction.Up); + this.currentMoveDirection = Direction.Up; + this.move(Direction.Up); break; case "q": - this.currentMoveDirections.add(Direction.Down); + this.currentMoveDirection = Direction.Down; + this.move(Direction.Down); break; case "c": this.toggleCreative(); @@ -183,43 +188,39 @@ export class KeyboardPlayerEntityController extends PlayerController { this.keys.delete(key.toLowerCase()); this.keysPressed.add(key.toLowerCase()); if (key === "w") { - this.currentMoveDirections.delete(Direction.North); + if (this.currentMoveDirection === Direction.North) { + this.currentMoveDirection = "None"; + this.move("None"); + } } else if (key === "s") { - this.currentMoveDirections.delete(Direction.South); + if (this.currentMoveDirection === Direction.South) { + this.currentMoveDirection = "None"; + this.move("None"); + } } else if (key === "a") { - this.currentMoveDirections.delete(Direction.West); + if (this.currentMoveDirection === Direction.West) { + this.currentMoveDirection = "None"; + this.move("None"); + } } else if (key === "d") { - this.currentMoveDirections.delete(Direction.East); + if (this.currentMoveDirection === Direction.East) { + this.currentMoveDirection = "None"; + this.move("None"); + } } else if (key === "e") { - this.currentMoveDirections.delete(Direction.Up); + if (this.currentMoveDirection === Direction.Up) { + this.currentMoveDirection = "None"; + this.move("None"); + } } else if (key === "q") { - this.currentMoveDirections.delete(Direction.Down); + if (this.currentMoveDirection === Direction.Down) { + this.currentMoveDirection = "None"; + this.move("None"); + } } else if (key === " ") { this.hasJumped = false; } } - update() { - // check if previous directions is different than current directions - let areDifferent = false; - for (const direction of this.currentMoveDirections) { - if (!this.prevMoveDirections.has(direction)) { - areDifferent = true; - break; - } - } - for (const direction of this.prevMoveDirections) { - if (!this.currentMoveDirections.has(direction)) { - areDifferent = true; - break; - } - } - - if (areDifferent) { - this.move(Array.from(this.currentMoveDirections.values())); - - // Copy prev to current - this.prevMoveDirections = new Set(this.currentMoveDirections); - } - } + update() { } } diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index e28c945..b52a62f 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -194,7 +194,7 @@ export class CanvasGameScript extends GameScript { this.config.chunkSize * this.config.renderDistance; const cameraChunkPos = this.game.getChunkPosFromWorldPos(camera.pos); - const cameraRotNorm = camera.rot.toCartesianCoords().normalize(); + // const cameraRotNorm = camera.rot.toCartesianCoords().normalize(); const renderChunk = (chunkPos: Vector2D) => { const chunkId = this.game.getChunkIdFromChunkPos(chunkPos); @@ -232,15 +232,16 @@ export class CanvasGameScript extends GameScript { continue; } + // DISABLED: idk if this actually works // check if you are facing that right way to see the chunk - const diffChunkCamera = camera.pos.sub(chunkWorldPos).normalize(); - const dist = diffChunkCamera.distFrom(cameraRotNorm); - - if (dist > this.config.fovFactor) { - // don't render this chunk because the player isn't looking at it - skippedChunkPos.add(chunkPos); - continue; - } + // const diffChunkCamera = camera.pos.sub(chunkWorldPos).normalize(); + // const dist = diffChunkCamera.distFrom(cameraRotNorm); + + // if (dist > this.config.fovFactor) { + // // don't render this chunk because the player isn't looking at it + // skippedChunkPos.add(chunkPos); + // continue; + // } renderedSet.add(chunkPos.toIndex()); diff --git a/apps/web-client/src/renders/chunkRender.ts b/apps/web-client/src/renders/chunkRender.ts index 43eff5b..4cbb1e5 100644 --- a/apps/web-client/src/renders/chunkRender.ts +++ b/apps/web-client/src/renders/chunkRender.ts @@ -73,8 +73,6 @@ export class ChunkRenderer extends Renderer { blockRenData.pushData({ textureCords }); } - console.log("BlockRenData", cube.pos, blockData); - break; } case BlockShape.Flat: { @@ -106,8 +104,6 @@ export class ChunkRenderer extends Renderer { } }); - console.log("ChunkRenderer: Buffer data", renData, transRenData); - this.setBuffers(renData, transRenData); } } diff --git a/apps/web-client/src/renders/renderer.ts b/apps/web-client/src/renders/renderer.ts index d1e004e..3f39d4d 100644 --- a/apps/web-client/src/renders/renderer.ts +++ b/apps/web-client/src/renders/renderer.ts @@ -247,12 +247,12 @@ export abstract class Renderer { // Set the drawing position to the "identity" point, which is // the center of the scene. - const theta = camera.rot.get(1); - const phi = camera.rot.get(2); + const theta = Math.PI - camera.rot.get(2); + const phi = camera.rot.get(1); const modelViewMatrix = mat4.create(); - mat4.rotate(modelViewMatrix, modelViewMatrix, theta, [1, 0, 0]); - mat4.rotate(modelViewMatrix, modelViewMatrix, phi, [0, 1, 0]); + mat4.rotate(modelViewMatrix, modelViewMatrix, phi, [1, 0, 0]); + mat4.rotate(modelViewMatrix, modelViewMatrix, theta, [0, 1, 0]); const move_pos = pos.sub(camera.pos).data; // Now move the drawing position to where we want to start drawing the square. diff --git a/lib/engine/src/playerActions.ts b/lib/engine/src/playerActions.ts index 7cc3182..036a7cb 100644 --- a/lib/engine/src/playerActions.ts +++ b/lib/engine/src/playerActions.ts @@ -123,8 +123,9 @@ export abstract class PlayerController { this.playerActionService.performAction(action); } - move(directions: Direction[]) { - // TO-DO + move(direction: Direction | "None") { + const action = this.game.makeMoveAction(this.playerId, direction); + this.playerActionService.performAction(action); } beltRight() { diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index 2137e0b..9f7e151 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -144,11 +144,21 @@ export class GameWrapper { theta: number, phi: number ): WorldWasm.EntityActionDto { - console.log("Making rotate action", entityId, theta, phi); const rotDiff = WorldWasm.SphericalRotation.new_wasm(theta, phi); return WorldWasm.RotateAction.make_wasm(entityId, rotDiff); } + makeMoveAction( + entityId: number, + direction: WorldWasm.Direction | "None" + ): WorldWasm.EntityActionDto { + console.log("Making move action", entityId, direction); + if (direction === "None") { + return WorldWasm.MoveAction.make_wasm(entityId, undefined); + } + return WorldWasm.MoveAction.make_wasm(entityId, direction); + } + handleAction(action: WorldWasm.EntityActionDto) { console.log("Handling action", action); this.game.handle_action_wasm(action); diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index ce91bb8..a08a8af 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"dcbeb3ff4788b784da3eaf82130f8e627f7351b454d948d8b0c07bae538ce4b0","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"2d4c134e927e56039b9dacb474227bb9be5cd7e3d9ff25c2bfe62602c25ab18a","signature":"bdaec88d0a786b7a47810e1d66fe99c894b45bceab66fc0a109a9d2873910767","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"5485697b61aea26f0a369ffbfc5c01101dc387677df82a9abf35d9f49165f9a7","signature":"2ff1a356c55d95d445c8953b7079ef30117b3c1eec1e0718614e487329fe7c80","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"f92ffcb325ee49801ae72aae8b753291ebbdbd4fc888f7c14abfe71b21e0ec80","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"b2d8fc3f3324b95cbb4df8574b058c69a6ca077c78be9432d0450e7205825aab","signature":"4a57f08dd739ab68add16462a559478868966920e07593b058d873ff54007331","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"901a35f8241affd10fa2f1309df2baa8c8393813ab84a6a4446d29c32f40799f","signature":"1db4d0c03f34ec1e9f7ed486dad9680d92be6b13d5acfd8ea2fc53f06e93bb62","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/playerActions.d.ts"},"version":"5.5.3"} \ No newline at end of file diff --git a/lib/world/src/components/world_pos.rs b/lib/world/src/components/world_pos.rs index becc336..018a148 100644 --- a/lib/world/src/components/world_pos.rs +++ b/lib/world/src/components/world_pos.rs @@ -1,7 +1,12 @@ use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; -use crate::{chunk::CHUNK_WIDTH, entities::entity_component::impl_component, positions::{ChunkPos, InnerChunkPos}, vec::{impl_vector_ops, Vector3Ops}}; +use crate::{ + chunk::{CHUNK_HEIGHT, CHUNK_WIDTH}, + entities::entity_component::impl_component, + positions::{ChunkPos, InnerChunkPos}, + vec::{impl_vector_ops, Vector3Ops}, +}; use super::fine_world_pos::FineWorldPos; @@ -31,9 +36,11 @@ impl WorldPos { } pub fn to_inner_chunk_pos(&self) -> InnerChunkPos { - let x = (((self.x as i8 % 16) + 16) % 16) as i8; - let y = self.y as i8; - let z = (((self.z as i8 % 16) + 16) % 16) as i8; + let x = + (((self.x as i8 % CHUNK_WIDTH as i8) + CHUNK_WIDTH as i8) % CHUNK_WIDTH as i8) as i8; + let y = ((self.y as i8 % CHUNK_HEIGHT as i8) + CHUNK_HEIGHT as i8) % CHUNK_HEIGHT as i8; + let z = + (((self.z as i8 % CHUNK_WIDTH as i8) + CHUNK_WIDTH as i8) % CHUNK_WIDTH as i8) as i8; InnerChunkPos::new(x, y, z) } @@ -55,4 +62,4 @@ impl WorldPos { y: y as i16, } } -} \ No newline at end of file +} diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 7c4ed1a..1cc2fad 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -217,7 +217,7 @@ mod tests { let move_action = MoveAction::make_dto( 1, MoveActionData { - direction: Direction::North, + direction: Some(Direction::North), }, ); game.action_holder.add(move_action); @@ -262,9 +262,10 @@ pub mod wasm { entity_action::{EntityActionDto, EntityActionDtoMaker}, player::{make_player, wasm::WasmPlayer}, player_jump_script::JumpAction, - player_move_script::MoveAction, + player_move_script::{MoveAction, MoveScript}, player_rot_script::RotateAction, sandbox::SandBoxGScript, + velocity_script::VelocityScript, }, positions::ChunkPos, utils::js_log, @@ -280,6 +281,9 @@ pub mod wasm { let mut g = Game::new(); let sandbox_script = Box::new(SandBoxGScript::new(0, flat_world, debug_world, 1)); g.add_script(sandbox_script); + + g.add_script(Box::new(MoveScript::default())); + g.add_script(Box::new(VelocityScript::default())); g.update(); // Add basic action handlers diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs index 1b64a40..60888cc 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/entities/player_move_script.rs @@ -1,16 +1,28 @@ +use crate::{ + components::{fine_world_pos::FineWorldPos, velocity::Velocity}, + direction::Direction, + geometry::rotation::SphericalRotation, + utils::js_log, +}; use wasm_bindgen::prelude::*; -use crate::{components::{fine_world_pos::FineWorldPos, velocity::Velocity}, direction::Direction, geometry::rotation::SphericalRotation}; -use super::{entity::{Entity, EntityQuery, EntityQueryResults}, entity_action::{ActionData, EntityActionDto, EntityActionHandler, EntityActionDtoMaker}, entity_component::impl_component, game::GameSchedule, game_script::GameScript}; +use super::{ + entity::{Entity, EntityQuery, EntityQueryResults}, + entity_action::{ActionData, EntityActionDto, EntityActionDtoMaker, EntityActionHandler}, + entity_component::impl_component, + game::GameSchedule, + game_script::GameScript, +}; #[wasm_bindgen] #[derive(Clone, Debug)] pub struct MoveActionData { - pub direction: Direction, + pub direction: Option, } #[derive(Clone, Debug, Default)] -pub struct MoveAction { } +#[wasm_bindgen] +pub struct MoveAction {} impl EntityActionDtoMaker for MoveAction { fn get_action_type_static() -> &'static str { "Move" @@ -23,7 +35,8 @@ impl EntityActionHandler for MoveAction { fn handle_dto(&self, entity: &mut Entity, data: &EntityActionDto) { let data = data.get_data::().unwrap(); - entity.set::(Some(data.direction)); + js_log(&format!("MoveAction: {:?}", data.direction)); + entity.set::(data.direction); } } @@ -31,10 +44,9 @@ pub type MovingDirection = Option; impl_component!(MovingDirection); #[derive(Debug, Default)] -pub struct MoveScript { } +pub struct MoveScript {} impl GameScript for MoveScript { - fn get_query(&self) -> EntityQuery { let mut query = EntityQuery::new(); query.add::(); @@ -43,7 +55,11 @@ impl GameScript for MoveScript { query } - fn update(&mut self, _world: &crate::world::World, query_results: EntityQueryResults) -> Option { + fn update( + &mut self, + _world: &crate::world::World, + query_results: EntityQueryResults, + ) -> Option { for entity in query_results.entities { let rot = entity.get::().unwrap().to_owned(); let moving_dir = entity.get::().unwrap().to_owned(); @@ -51,11 +67,34 @@ impl GameScript for MoveScript { println!("moving dir: {:?}", moving_dir); if moving_dir.is_some() { - let new_vel: Velocity = rot.into(); + let direction_rot: SphericalRotation = moving_dir.unwrap().into(); + let move_rot = rot + direction_rot; + let new_vel: Velocity = move_rot.into(); + entity.set::(new_vel); + } else { + let new_vel: Velocity = Velocity { + x: 0.0, + y: 0.0, + z: 0.0, + }; entity.set::(new_vel); } } None } -} \ No newline at end of file +} + +pub mod wasm { + use crate::entities::entity::EntityId; + + use super::*; + + #[wasm_bindgen] + impl MoveAction { + pub fn make_wasm(entity_id: EntityId, direction: Option) -> EntityActionDto { + let data = MoveActionData { direction }; + MoveAction::make_dto(entity_id, data) + } + } +} diff --git a/lib/world/src/entities/velocity_script.rs b/lib/world/src/entities/velocity_script.rs index b04484a..4f733fa 100644 --- a/lib/world/src/entities/velocity_script.rs +++ b/lib/world/src/entities/velocity_script.rs @@ -1,10 +1,16 @@ -use crate::components::{fine_world_pos::FineWorldPos, velocity::Velocity}; - -use super::{entity::{EntityQuery, EntityQueryResults}, game::GameSchedule, game_script::GameScript}; +use crate::{ + components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}, + geometry::rect3::Rect3, +}; +use super::{ + entity::{EntityQuery, EntityQueryResults}, + game::GameSchedule, + game_script::GameScript, +}; #[derive(Debug, Default)] -pub struct VelocityScript { } +pub struct VelocityScript {} impl GameScript for VelocityScript { fn get_query(&self) -> EntityQuery { @@ -14,18 +20,31 @@ impl GameScript for VelocityScript { query } - fn update(&mut self, _world: &crate::world::World, query_results: EntityQueryResults) -> Option { + fn update( + &mut self, + world: &crate::world::World, + query_results: EntityQueryResults, + ) -> Option { for entity in query_results.entities { let vel = entity.get::().unwrap().to_owned(); let pos = entity.get::().unwrap().to_owned(); println!("entity_id: {:?} pos: {:?}, vel: {:?}", entity.id, pos, vel); - let new_pos = pos + vel; + let player_rect = Rect3 { + pos, + dim: Size3 { + x: 1.0, + y: 1.0, + z: 1.0, + }, + }; + + let new_pos = world.move_rect3(&player_rect, pos + vel); entity.set::(new_pos); } None } -} \ No newline at end of file +} diff --git a/lib/world/src/positions.rs b/lib/world/src/positions.rs index 0304a03..c98b5d4 100644 --- a/lib/world/src/positions.rs +++ b/lib/world/src/positions.rs @@ -1,5 +1,10 @@ use crate::{ - chunk::CHUNK_WIDTH, components::world_pos::WorldPos, entities::entity_component::impl_component, geometry::vec2::Vec2i16, vec::{Vec3f32, Vec3u8, Vector3Ops} + chunk::CHUNK_WIDTH, + components::world_pos::WorldPos, + entities::entity_component::impl_component, + geometry::vec2::Vec2i16, + utils::js_log, + vec::{Vec3f32, Vec3u8, Vector3Ops}, }; #[cfg(test)] @@ -27,17 +32,13 @@ impl InnerChunkPos { } pub fn to_world_pos(&self, chunk_pos: &ChunkPos) -> WorldPos { - let pos = chunk_pos - .scalar_mul(CHUNK_WIDTH) - .move_to_3d(0) - .add(self); + let pos = chunk_pos.scalar_mul(CHUNK_WIDTH).move_to_3d(0).add(self); WorldPos::new(pos.x() as i32, pos.y() as i32, pos.z() as i32) } } // impl WorldPos { - // pub fn is_valid(&self) -> bool { // self.y >= 0 && self.y < 256 // } @@ -132,4 +133,3 @@ impl std::ops::Add for ChunkPos { } } } - diff --git a/lib/world/src/vec.rs b/lib/world/src/vec.rs index 9b63f5d..77ab895 100644 --- a/lib/world/src/vec.rs +++ b/lib/world/src/vec.rs @@ -1,8 +1,11 @@ +use crate::direction::DirectionVectorExtension; use crate::direction::Directions; use num::{integer::Roots, traits::real::Real, Num, One, Zero}; use serde::{Deserialize, Serialize}; -use std::{fmt::Display, ops::{Add, AddAssign, Div, Mul, Neg, Sub, SubAssign}}; -use crate::direction::DirectionVectorExtension; +use std::{ + fmt::Display, + ops::{Add, AddAssign, Div, Mul, Neg, Sub, SubAssign}, +}; pub trait AsF32 { fn as_f32(self) -> f32; @@ -91,7 +94,11 @@ pub trait Vector3Ops: Sized { } fn sqr(&self) -> Self { - Self::new(self.x() * self.x(), self.y() * self.y(), self.z() * self.z()) + Self::new( + self.x() * self.x(), + self.y() * self.y(), + self.z() * self.z(), + ) } fn dot>(&self, other: &V) -> Self::Scalar { @@ -234,7 +241,6 @@ pub struct Vec3i16 { impl_vector_ops!(Vec3i16, i16); - #[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Deserialize)] pub struct Vec3u8 { pub x: i8, @@ -244,8 +250,6 @@ pub struct Vec3u8 { impl_vector_ops!(Vec3u8, i8); - - // #[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Deserialize)] // pub struct Vec2 { // pub x: T, @@ -464,12 +468,28 @@ pub mod tests { #[test] fn test_distance_to() { - let vec1 = Vec3f32 { x: 0 as f32, y: 0 as f32, z: 0 as f32 }; - let vec2 = Vec3f32 { x: 1 as f32, y: 1 as f32, z: 1 as f32 }; + let vec1 = Vec3f32 { + x: 0 as f32, + y: 0 as f32, + z: 0 as f32, + }; + let vec2 = Vec3f32 { + x: 1 as f32, + y: 1 as f32, + z: 1 as f32, + }; assert_eq!(vec1.distance_to(&vec2), 1.7320508); - let vec1 = Vec3f32 { x: 0 as f32, y: 0 as f32, z: 0 as f32 }; - let vec2 = Vec3f32 { x: 1 as f32, y: 0 as f32, z: 0 as f32 }; + let vec1 = Vec3f32 { + x: 0 as f32, + y: 0 as f32, + z: 0 as f32, + }; + let vec2 = Vec3f32 { + x: 1 as f32, + y: 0 as f32, + z: 0 as f32, + }; assert_eq!(vec1.distance_to(&vec2), 1.0); } } From a13c6f5c89f8f409de4eec4259624cdab1692854 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 18 May 2025 16:18:37 -0700 Subject: [PATCH 15/61] Can make gamescripts from js --- TYLERCRAFT_ENGINE_FLOW.md | 117 -------------- apps/web-client/src/game-scripts/hudRender.ts | 147 +++++++++--------- .../web-client/src/renders/gameMenuRender.tsx | 2 +- apps/web-client/src/runner.ts | 16 +- lib/engine/src/wrappers.ts | 6 +- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/entities/game.rs | 6 +- lib/world/src/entities/sandbox.rs | 43 +++-- lib/world/src/entities/terrain_gen.rs | 9 +- 9 files changed, 118 insertions(+), 230 deletions(-) delete mode 100644 TYLERCRAFT_ENGINE_FLOW.md diff --git a/TYLERCRAFT_ENGINE_FLOW.md b/TYLERCRAFT_ENGINE_FLOW.md deleted file mode 100644 index 1c2926a..0000000 --- a/TYLERCRAFT_ENGINE_FLOW.md +++ /dev/null @@ -1,117 +0,0 @@ -# Understanding Player Action and Game Script Flows in Your Game Engine - -## 1. Introduction - -Your game engine appears to follow a common pattern where a high-performance core (written in Rust and compiled to WebAssembly, in `@craft/rust-world`) handles the main game logic, physics, and world state. The TypeScript code, particularly in `lib/engine/src/wrappers.ts`, serves as a bridge or wrapper layer. Its primary role is to provide a more convenient and type-safe API for the client-side JavaScript/TypeScript codebase to interact with the Wasm module. This involves sending commands (like player actions) to the Wasm module and retrieving game state from it. - -## 2. Player Action Flow - -This describes how player actions (e.g., jumping, rotating view) are intended to be processed from initiation in TypeScript to execution in Rust, and how the game state is updated. - -### 2.1. Action Creation (TypeScript Side - in `GameWrapper`) - -* **Intention:** Your `GameWrapper` class in `wrappers.ts` has methods like `makeJumpAction(entityId)` and `makeRotateAction(entityId, x, y)`. These are designed to create action objects that can be understood by the Rust game engine. -* **Current Implementation & Problem:** - * `makeJumpAction` tries to return `WorldWasm.PlayerJumpAction.new(entityId)`. - * `makeRotateAction` tries to return `WorldWasm.PlayerRotAction.new(entityId, rotDiff)`. - * The linter errors indicate that `WorldWasm.PlayerJumpAction` and `WorldWasm.PlayerRotAction` (and their `.new` methods) are not found within the imported `WorldWasm` module. This is a key reason for the current broken state. -* **Correct Mechanism (Revealed by Rust Code Analysis):** - * The Rust codebase (specifically `player_jump_script.rs` and `player_rot_script.rs`) defines structs `JumpAction` and `RotateAction`. Each of these has a Wasm-exposed static method: - * `JumpAction::make_wasm(entityId: EntityId) -> EntityActionDto` - * `RotateAction::make_wasm(entityId: EntityId, rot_diff: SphericalRotation) -> EntityActionDto` - * These `make_wasm` functions are the correct way to create the action DTOs (Data Transfer Objects). The TypeScript code needs to call these (e.g., `WorldWasm.JumpAction.make_wasm(...)` and `WorldWasm.RotateAction.make_wasm(...)`). However, the linter errors suggest that `WorldWasm.JumpAction` and `WorldWasm.RotateAction` themselves are not being found as direct exports of the `WorldWasm` module. This points to an issue with how these Rust structs/methods are exposed or named in the generated Wasm bindings. You would need to consult the `.d.ts` typings file for `@craft/rust-world` to see the exact JavaScript interface. - -### 2.2. Action Handling (TypeScript to Rust) - -* **Intention:** Once an action DTO is created, it's passed to `GameWrapper.handleAction(action: WorldWasm.EntityActionDto)`. -* **Current Implementation & Problem:** - * Inside `handleAction`, there's an attempt to `action.clone()`. The linter error `Property 'clone' does not exist on type 'EntityActionDto'` indicates that the `EntityActionDto` type exposed from Wasm does not have a `clone` method. - * The method then calls `this.game.handle_action_wasm(newAction)`. -* **Correct Mechanism:** - * The Rust `Game::handle_action_wasm(action: EntityActionDto)` method does exist and expects an `EntityActionDto`. The TypeScript side should pass the action directly without cloning, unless a `clone` method is explicitly exposed from Rust for `EntityActionDto`. The Rust method takes ownership or processes the DTO as is. - -### 2.3. Action Processing (Rust/Wasm Side - Internal Engine Logic) - -* **Mechanism:** - 1. When `Game::handle_action_wasm` in Rust receives an `EntityActionDto`, it stores this action (e.g., in a queue or list called `action_holder`). - 2. The main game loop in Rust is driven by `Game::update_wasm()` (which is called by `GameWrapper.update()` from TypeScript). - 3. During this update cycle, the Rust engine iterates through the stored actions. - 4. For each `EntityActionDto`, the engine uses a system of `EntityActionHandler`s. It identifies the correct handler based on the action's type (e.g., a "Jump-Action" string identifier for `JumpAction`). - 5. The `handle_dto(&self, entity: &mut Entity, data: &EntityActionDto)` method of the matched Rust handler is then executed. This is where the actual game logic for the action occurs—modifying the components of the target entity (e.g., changing its `Velocity` component for a jump, or its `SphericalRotation` component for a rotation). - -### 2.4. State Update & Retrieval (Rust to TypeScript) - -* **Intention:** After the Rust engine processes actions and updates the internal game state, the TypeScript side needs to be able to fetch this new state. -* **Current Implementation & Problem:** - * `GameWrapper.getPlayer(uid: number)`: - * Tries to use `this.game.get_player_wasm(uid)` and `this.game.get_player_rot_script_wasm(uid)`. - * It expects `get_player_wasm` to return something compatible with a `WorldWasm.Player` type, which the linter says is not exported. - * `get_player_rot_script_wasm` is also reported as missing. - * The `PlayerWrapper` constructor is called with two arguments (`player`, `rot_script`), but it's defined to take only one in its current form (or needs to be adapted to the actual data from Wasm). - * `GameWrapper.getEntities(): PlayerWrapper[]`: - * Tries to use `this.game.get_entities_wasm()`. - * This method is reported as missing. -* **Correct Mechanism (Revealed by Rust Code Analysis):** - * The Rust `Game` struct exposes: - * `get_player_wasm(player_id: EntityId) -> Result`: This returns a JavaScript value (via `serde_wasm_bindgen`) representing a serialized `WasmPlayer` Rust struct. This `WasmPlayer` struct contains fields like `pos`, `vel` (velocity), `rot` (SphericalRotation), and `moving_direction`. - * `get_players_wasm() -> Result`: This returns a JavaScript value representing a serialized list (`Vec`) of all players. - * The TypeScript `PlayerWrapper` needs to be constructed using the data from this `WasmPlayer` structure. The concept of a separate `rot_script` is likely obsolete, as rotation is part of `WasmPlayer`. - -## 3. Game Script Flow (`onDiff` Callback) - -This describes how custom TypeScript game logic is intended to react to changes in the game state managed by the Rust engine. - -### 3.1. Defining a Game Script (TypeScript Side) - -* **Mechanism:** You have a `GameScript` interface in `lib/engine/src/game-script.js` (or defined in `wrappers.ts`): - ```typescript - export interface GameScript { - onDiff: (diff: GameDiff) => void; - } - ``` - And `GameDiff` is defined as: - ```typescript - export type GameDiff = { - updated_entities: number[]; - updated_chunks: number[]; - }; - ``` -* This allows users to create objects in TypeScript that implement `GameScript`, providing an `onDiff` method to handle notifications about game state changes. - -### 3.2. Registering the Script (TypeScript to Rust) - -* **Intention:** `GameWrapper.makeAndAddGameScript(script: GameScript)` is responsible for this. -* **Current Implementation & Problem:** - 1. It correctly creates a Wasm-compatible script object using `WorldWasm.WasmGameScript.make(script)`. The Rust `WasmGameScript::make` function exists and is designed to take the JavaScript `script` object and store its `onDiff` function. - 2. It then attempts to call `this.game.add_game_script_wasm(wasmScript)`. - 3. **Problem:** The linter error `Property 'add_game_script_wasm' does not exist on type 'Game'` is critical. The Rust code analysis showed that the `add_game_script_wasm` function in `game.rs` was commented out. This means there's currently no way to actually register the created `WasmGameScript` with the Rust game engine. -* **Correct Mechanism:** The `add_game_script_wasm` function (or an equivalent) needs to be present and functional in the Rust Wasm bindings. This function would take the `WasmGameScript` and store it within the Rust `Game` instance. - -### 3.3. Triggering `onDiff` (Rust/Wasm Side - Intended Logic) - -* **Intended Mechanism (based on commented-out Rust code in `game.rs` for `WasmGameScript`):** - 1. As the Rust game engine runs (likely during or after `Game::update_wasm`), if there are significant state changes (e.g., entities updated, chunks loaded/modified), the engine would identify these. - 2. It would construct a `GameDiff` object (similar to the TypeScript type) detailing these changes. - 3. The engine would then iterate through all registered `WasmGameScript` instances. - 4. For each script, it would invoke the stored JavaScript `onDiff` function (referred to as `on_diff_jsfn` in the Rust snippets), passing the serialized `GameDiff` object as an argument. - -### 3.4. Reacting to Diffs (TypeScript Side) - -* **Intention:** When the Rust engine calls the `onDiff` JavaScript function, the corresponding `onDiff` method of the user's `GameScript` object in TypeScript executes. This allows custom client-side game logic to react to these diffs, for example, by updating UI elements, triggering sounds, or modifying client-side representations of game objects. -* **Current Status:** This entire callback flow is non-functional primarily because scripts cannot be registered due to the missing `add_game_script_wasm` Wasm export. - -## 4. Conclusion and Path Forward - -The core architecture of your game, with a Rust Wasm backend and TypeScript wrappers, is sound. However, `lib/engine/src/wrappers.ts` is currently out of sync with the actual API exposed by your `@craft/rust-world` Wasm module. This desynchronization is the root cause of most of the linter errors and runtime issues. - -To get your engine working as intended: - -1. **Inspect Wasm Bindings:** The most crucial step is to examine the generated JavaScript glue code (`*.js`) and, more importantly, the TypeScript definition file (`*.d.ts`) that `wasm-pack` (or your Wasm build tool) produces for the `@craft/rust-world` package. This will provide the definitive source of truth for what functions, classes, and types are actually exported by the Wasm module and how they are named and structured in JavaScript/TypeScript. -2. **Align `wrappers.ts`:** - * **Action Creation:** Update `makeJumpAction` and `makeRotateAction` to use the correct exported Wasm functions/methods for creating `EntityActionDto`s (as revealed by your `.d.ts` file). - * **Action Handling:** Remove the `action.clone()` call in `handleAction` unless your Wasm module explicitly provides a clonable `EntityActionDto` with a `clone` method. - * **Player Data:** Modify `PlayerWrapper` and the logic in `getPlayer` and `getEntities` to correctly use `get_player_wasm` and `get_players_wasm`, and to accurately map the data from the Rust `WasmPlayer` struct (or its JS equivalent) to your `PlayerWrapper` instances. - * **Game Scripts:** For the `GameScript` `onDiff` system to work, the `add_game_script_wasm` function (or an equivalent) must be correctly implemented in your Rust code (`Game::add_script` seems to exist in Rust but isn't properly exposed to Wasm for adding JS game scripts) and exposed through `#[wasm_bindgen]`. -3. **Address Minor Issues:** Clean up any remaining linter errors, such as formatting issues. - -By systematically comparing the Wasm module's actual API (from its `.d.ts` file) with the code in `wrappers.ts` and making the necessary adjustments, you can resolve the current errors and restore the intended functionality of your game's action and event systems. \ No newline at end of file diff --git a/apps/web-client/src/game-scripts/hudRender.ts b/apps/web-client/src/game-scripts/hudRender.ts index a63f46a..e4a0acf 100644 --- a/apps/web-client/src/game-scripts/hudRender.ts +++ b/apps/web-client/src/game-scripts/hudRender.ts @@ -1,8 +1,6 @@ -import { Game, GameWrapper } from "@craft/engine"; -import TextureMapper from "../textureMapper"; -import { IS_MOBILE } from "../app"; +import { GameScript, GameWrapper } from "@craft/engine"; import { CanvasGameScript } from "../game-scripts/canvas-gscript"; -import { getEleOrError, hideElement } from "../utils"; +import { getEleOrError, hideElement, IS_MOBILE } from "../utils"; import { GameMenu } from "../renders/gameMenuRender"; import React from "react"; import ReactDOM from "react-dom"; @@ -64,7 +62,7 @@ export class HudGScript extends GameScript { } this.textureImg.onload = () => { - this.drawBelt(); + // this.drawBelt(); }; } @@ -98,12 +96,11 @@ export class HudGScript extends GameScript { } const cameraPos = mainPlayer.pos.data.map((d) => d.toFixed(2)).join(","); - const numChunks = this.game.world.getLoadedChunkIds().length; + // const numChunks = this.game.world.getLoadedChunkIds().length; const statsString = ` playerPos: ${cameraPos}
fps: ${this.canvasGScript.frameRate.toFixed(0)}
- numChunks: ${numChunks} `; if (this.lastStats !== statsString) { @@ -123,77 +120,77 @@ export class HudGScript extends GameScript { this.drawStats(); - if (this.lastSelected !== this.basicGScript.mainPlayer.belt.selectedIndex) { - this.drawBelt(); - this.lastSelected = this.basicGScript.mainPlayer.belt.selectedIndex; - } - - this.drawHealthBar(); - } - - drawBelt() { - this.eToolbeltItems.forEach((item, index) => { - if (index === this.basicGScript.mainPlayer.belt.selectedIndex) { - item.classList.add("selected"); - } else { - item.classList.remove("selected"); - } - }); - - const itemDim = this.eToolbeltItems[0].clientHeight; - - const belt = this.basicGScript.mainPlayer.belt; - - if (!belt) { - return; - } + // if (this.lastSelected !== this.basicGScript.mainPlayer.belt.selectedIndex) { + // this.drawBelt(); + // this.lastSelected = this.basicGScript.mainPlayer.belt.selectedIndex; + // } - // draw the icons - for (let i = 0; i < belt.length; i++) { - const item = belt.getItem(i); - if (!item) { - continue; - } - - const cords = TextureMapper.getBlockPreviewCords( - item, - this.textureImg.width, - this.textureImg.height - ); - // Clip the textImage to the cords - const img = this.textureImg; - const croppedImg = document.createElement("canvas"); - croppedImg.width = itemDim; - croppedImg.height = itemDim; - const ctx = croppedImg.getContext("2d"); - if (!ctx) { - throw new Error("Could not get 2d context"); - } - ctx.imageSmoothingEnabled = false; - ctx.drawImage( - img, - cords.x1, - cords.y1, - cords.x2 - cords.x1, - cords.y2 - cords.y1, - 0, - 0, - croppedImg.width, - croppedImg.height - ); - this.eToolbeltItems[ - i - ].style.backgroundImage = `url(${croppedImg.toDataURL()})`; - this.eToolbeltItems[i].style.backgroundSize = "contain"; - } + // this.drawHealthBar(); } - drawHealthBar() { - if (!this.basicGScript.mainPlayer) return; - const { current, max } = this.basicGScript.mainPlayer.health; - const healthPercent = current / max; - this.eHealthBar.style.width = `${healthPercent * 100}%`; - } + // drawBelt() { + // this.eToolbeltItems.forEach((item, index) => { + // if (index === this.basicGScript.mainPlayer.belt.selectedIndex) { + // item.classList.add("selected"); + // } else { + // item.classList.remove("selected"); + // } + // }); + + // const itemDim = this.eToolbeltItems[0].clientHeight; + + // const belt = this.basicGScript.mainPlayer.belt; + + // if (!belt) { + // return; + // } + + // // draw the icons + // for (let i = 0; i < belt.length; i++) { + // const item = belt.getItem(i); + // if (!item) { + // continue; + // } + + // const cords = TextureMapper.getBlockPreviewCords( + // item, + // this.textureImg.width, + // this.textureImg.height + // ); + // // Clip the textImage to the cords + // const img = this.textureImg; + // const croppedImg = document.createElement("canvas"); + // croppedImg.width = itemDim; + // croppedImg.height = itemDim; + // const ctx = croppedImg.getContext("2d"); + // if (!ctx) { + // throw new Error("Could not get 2d context"); + // } + // ctx.imageSmoothingEnabled = false; + // ctx.drawImage( + // img, + // cords.x1, + // cords.y1, + // cords.x2 - cords.x1, + // cords.y2 - cords.y1, + // 0, + // 0, + // croppedImg.width, + // croppedImg.height + // ); + // this.eToolbeltItems[ + // i + // ].style.backgroundImage = `url(${croppedImg.toDataURL()})`; + // this.eToolbeltItems[i].style.backgroundSize = "contain"; + // } + // } + + // drawHealthBar() { + // if (!this.basicGScript.mainPlayer) return; + // const { current, max } = this.basicGScript.mainPlayer.health; + // const healthPercent = current / max; + // this.eHealthBar.style.width = `${healthPercent * 100}%`; + // } hideControls() { hideElement(this.eForwardButton); diff --git a/apps/web-client/src/renders/gameMenuRender.tsx b/apps/web-client/src/renders/gameMenuRender.tsx index 0d8ade5..5d00d2c 100644 --- a/apps/web-client/src/renders/gameMenuRender.tsx +++ b/apps/web-client/src/renders/gameMenuRender.tsx @@ -1,8 +1,8 @@ import ReactDOM from "react-dom"; -import { Game, GameAction, GameActionType } from "@craft/engine"; import React, { useEffect } from "react"; import styles from "./gameMenu.module.css"; import { getEleOrError } from "../utils"; +import { Game } from "@craft/engine/game"; // make section button with same props as normal button const SectionButton = ( diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 51a567a..7735602 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -3,7 +3,8 @@ import { CanvasGameScript } from "./game-scripts/canvas-gscript"; import { WebGlGScript } from "./game-scripts/webgl-gscript"; import { MobileController } from "./controllers/playerControllers/mobileController"; import { KeyboardPlayerEntityController } from "./controllers/playerControllers/keyboardPlayerController"; -import { getMyUid, hideElement, IS_MOBILE, showElement } from "./utils"; +import { getMyUid, IS_MOBILE } from "./utils"; +import { SandBoxGScript, TerrainGenerator } from "@craft/rust-world"; // import { eStartMenu } from "./elements"; export function run() { @@ -12,7 +13,11 @@ export function run() { // hideElement(eStartMenu); - const game = GameWrapper.makeGame(true, true); + const game = GameWrapper.makeGame(); + + // add sandbox + const sandbox = new SandBoxGScript(1, new TerrainGenerator(0, true, false)); + game.game.add_sandbox_wasm(sandbox); const main_player_uid = getMyUid(); @@ -34,8 +39,6 @@ export function run() { game.makeAndAddGameScript(canvasGameScript); - // const hudGameScript = new HudGScript(game, canvasGameScript, main_player_uid); - const playerController = (() => { if (IS_MOBILE) { return new MobileController(playerActionService, game, main_player_uid); @@ -57,8 +60,6 @@ export function run() { playerController.update(); canvasGameScript.update(); canvasGameScript.renderLoop(0); - // const mesh = game.getChunkMeshFromChunkPos(4); - // console.log("Mesh", mesh); }; setInterval(update, 1000 / 60); @@ -68,9 +69,6 @@ export function run() { console.log(canvasGameScript); canvasGameScript.renderLoop(0); - // canvasGameScript.renderLoop(100); - // canvasGameScript.renderLoop(200); - // canvasGameScript.setup(); } run(); diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index 9f7e151..c2d890f 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -120,10 +120,10 @@ export class BlockWrapper { } export class GameWrapper { - constructor(private game: WorldWasm.Game) { } + constructor(public game: WorldWasm.Game) { } - static makeGame(flat_world: boolean, debug_world: boolean): GameWrapper { - const game = WorldWasm.Game.new_wasm(flat_world, debug_world); + static makeGame(): GameWrapper { + const game = WorldWasm.Game.new_wasm(); return new GameWrapper(game); } diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index a08a8af..f819c65 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"f92ffcb325ee49801ae72aae8b753291ebbdbd4fc888f7c14abfe71b21e0ec80","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"b2d8fc3f3324b95cbb4df8574b058c69a6ca077c78be9432d0450e7205825aab","signature":"4a57f08dd739ab68add16462a559478868966920e07593b058d873ff54007331","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"901a35f8241affd10fa2f1309df2baa8c8393813ab84a6a4446d29c32f40799f","signature":"1db4d0c03f34ec1e9f7ed486dad9680d92be6b13d5acfd8ea2fc53f06e93bb62","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/playerActions.d.ts"},"version":"5.5.3"} \ No newline at end of file +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"f148056cbb17653b464393f66ef7027ab755a2d6aad3792be1edce5fba0922fd","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"0ece6659ae311e788d8b1a580c1d86af0e3b519c6535128110960d1f41f353e6","signature":"d73ae268a48868e5b460c63ed023a21e71a899ed2162b309c6ae7c7973a65436","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"901a35f8241affd10fa2f1309df2baa8c8393813ab84a6a4446d29c32f40799f","signature":"1db4d0c03f34ec1e9f7ed486dad9680d92be6b13d5acfd8ea2fc53f06e93bb62","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 1cc2fad..09e48a8 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -264,7 +264,7 @@ pub mod wasm { player_jump_script::JumpAction, player_move_script::{MoveAction, MoveScript}, player_rot_script::RotateAction, - sandbox::SandBoxGScript, + sandbox::{self, SandBoxGScript}, velocity_script::VelocityScript, }, positions::ChunkPos, @@ -276,11 +276,9 @@ pub mod wasm { #[wasm_bindgen] impl Game { - pub fn new_wasm(flat_world: bool, debug_world: bool) -> Game { + pub fn new_wasm() -> Game { console_error_panic_hook::set_once(); let mut g = Game::new(); - let sandbox_script = Box::new(SandBoxGScript::new(0, flat_world, debug_world, 1)); - g.add_script(sandbox_script); g.add_script(Box::new(MoveScript::default())); g.add_script(Box::new(VelocityScript::default())); diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index 7aeaaab..f5c6f79 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -1,3 +1,5 @@ +use wasm_bindgen::prelude::wasm_bindgen; + use super::{ entity::{EntityQuery, EntityQueryResults}, game::{Game, GameDiff, GameSchedule}, @@ -6,19 +8,16 @@ use super::{ }; use crate::{components::fine_world_pos::FineWorldPos, positions::ChunkPos, world::World}; -#[derive(Debug)] +#[derive(Debug, Clone, Copy)] +#[wasm_bindgen] pub struct SandBoxGScript { - seed: u32, - flat_world: bool, - load_distance: u8, - terrain_gen: TerrainGenerator, + pub load_distance: u8, + pub terrain_gen: TerrainGenerator, } impl Default for SandBoxGScript { fn default() -> Self { SandBoxGScript { - seed: 0, - flat_world: false, load_distance: 1, terrain_gen: TerrainGenerator::new(0, false, false), } @@ -26,17 +25,10 @@ impl Default for SandBoxGScript { } impl SandBoxGScript { - pub fn new( - seed: u32, - flat_world: bool, - debug_world: bool, - load_distance: u8, - ) -> SandBoxGScript { + pub fn new(load_distance: u8, terrain_gen: TerrainGenerator) -> SandBoxGScript { SandBoxGScript { - seed, - flat_world, load_distance, - terrain_gen: TerrainGenerator::new(seed, flat_world, debug_world), + terrain_gen, } } @@ -89,3 +81,22 @@ impl GameScript for SandBoxGScript { Some(gdiff) } } + +pub mod wasm { + use super::*; + + #[wasm_bindgen] + impl SandBoxGScript { + #[wasm_bindgen(constructor)] + pub fn new_wasm(load_distance: u8, terrain_gen: TerrainGenerator) -> SandBoxGScript { + SandBoxGScript::new(load_distance, terrain_gen) + } + } + + #[wasm_bindgen] + impl Game { + pub fn add_sandbox_wasm(&mut self, sandbox_game_script: SandBoxGScript) { + self.add_script(Box::new(sandbox_game_script)); + } + } +} diff --git a/lib/world/src/entities/terrain_gen.rs b/lib/world/src/entities/terrain_gen.rs index ebebd67..27be475 100644 --- a/lib/world/src/entities/terrain_gen.rs +++ b/lib/world/src/entities/terrain_gen.rs @@ -13,6 +13,7 @@ use noise::{NoiseFn, Perlin}; use rand::{rngs::StdRng, SeedableRng}; use rand_distr::{Distribution, Uniform}; use serde::{Deserialize, Serialize}; +use wasm_bindgen::prelude::wasm_bindgen; // remove all the positions that are too close to each other in the chunk fn remove_close_positions<'a, I, J>(pos_iter: I, checking_pos_iter: J) -> Vec @@ -515,17 +516,17 @@ impl ParkorChunkGetter { } } -// #[wasm_bindgen] -#[derive(Clone, Debug, Serialize, Deserialize)] +#[wasm_bindgen] +#[derive(Clone, Debug, Serialize, Deserialize, Copy)] pub struct TerrainGenerator { pub seed: u32, pub flat_world: bool, pub debug_world: bool, } -// #[wasm_bindgen] +#[wasm_bindgen] impl TerrainGenerator { - // #[wasm_bindgen(constructor)] + #[wasm_bindgen(constructor)] pub fn new(seed: u32, flat_world: bool, debug_world: bool) -> TerrainGenerator { TerrainGenerator { seed, From da7d68e2f0eb11b7624d9cf0bd6dc6f30b3a5f3a Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 18 May 2025 17:04:16 -0700 Subject: [PATCH 16/61] Request chunks --- apps/web-client/src/runner.ts | 39 ++++++++++++++++++- lib/world/src/entities/sandbox.rs | 64 +++++++++++++++++++------------ lib/world/src/world/world_duct.rs | 21 ++++++---- 3 files changed, 90 insertions(+), 34 deletions(-) diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 7735602..a708967 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -4,9 +4,41 @@ import { WebGlGScript } from "./game-scripts/webgl-gscript"; import { MobileController } from "./controllers/playerControllers/mobileController"; import { KeyboardPlayerEntityController } from "./controllers/playerControllers/keyboardPlayerController"; import { getMyUid, IS_MOBILE } from "./utils"; -import { SandBoxGScript, TerrainGenerator } from "@craft/rust-world"; +import { + Chunk, + SandBoxGScript, + TerrainGenerator, + WasmRequestChunk, +} from "@craft/rust-world"; // import { eStartMenu } from "./elements"; +class SinglePlayerTerrainChunkGetter { + private chunks_to_insert: Chunk[] = []; + private terratinGen: TerrainGenerator; + + constructor(private game: GameWrapper) { + this.terratinGen = new TerrainGenerator(0, true, false); + } + + getChunk(chunkPos: { x: number; y: number }) { + console.log("REQUEST CHUNK", chunkPos); + const chunk = this.terratinGen.get_chunk(chunkPos.x, chunkPos.y); + console.log("CHUNK", chunk); + this.chunks_to_insert.push(chunk); + } + + update() { + for (const chunk of this.chunks_to_insert) { + this.game.game.schedule_chunk_insert_wasm(chunk); + } + this.chunks_to_insert = []; + } + + getWasmRequestChunk() { + return new WasmRequestChunk(this.getChunk.bind(this)); + } +} + export function run() { // Start the game console.log("RUNNING Starting game"); @@ -15,8 +47,10 @@ export function run() { const game = GameWrapper.makeGame(); + const chunkGetter = new SinglePlayerTerrainChunkGetter(game); + // add sandbox - const sandbox = new SandBoxGScript(1, new TerrainGenerator(0, true, false)); + const sandbox = new SandBoxGScript(1, chunkGetter.getWasmRequestChunk()); game.game.add_sandbox_wasm(sandbox); const main_player_uid = getMyUid(); @@ -59,6 +93,7 @@ export function run() { game.update(); playerController.update(); canvasGameScript.update(); + chunkGetter.update(); canvasGameScript.renderLoop(0); }; diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index f5c6f79..76f9d36 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -8,30 +8,19 @@ use super::{ }; use crate::{components::fine_world_pos::FineWorldPos, positions::ChunkPos, world::World}; -#[derive(Debug, Clone, Copy)] +pub trait RequestChunk: std::fmt::Debug { + fn request_chunk(&self, chunk_pos: ChunkPos); +} + +#[derive(Debug)] #[wasm_bindgen] pub struct SandBoxGScript { pub load_distance: u8, - pub terrain_gen: TerrainGenerator, -} - -impl Default for SandBoxGScript { - fn default() -> Self { - SandBoxGScript { - load_distance: 1, - terrain_gen: TerrainGenerator::new(0, false, false), - } - } + request_chunk: Box, + // pub terrain_gen: TerrainGenerator, } impl SandBoxGScript { - pub fn new(load_distance: u8, terrain_gen: TerrainGenerator) -> SandBoxGScript { - SandBoxGScript { - load_distance, - terrain_gen, - } - } - fn get_chunks_around_player(&self, pos: &FineWorldPos) -> Vec { let mut poses = vec![]; @@ -71,25 +60,52 @@ impl GameScript for SandBoxGScript { // only load the first chunk let chunk_pos = nearby_unloaded_chunks.first(); - let mut gdiff = GameSchedule::empty(); + // let mut gdiff = GameSchedule::empty(); if let Some(chunk_pos) = chunk_pos { - let chunk = self.terrain_gen.get_chunk(chunk_pos.x, chunk_pos.y); - gdiff.add_chunk(chunk); + self.request_chunk.request_chunk(*chunk_pos); } - Some(gdiff) + None } } pub mod wasm { + use wasm_bindgen::JsValue; + use super::*; + #[wasm_bindgen] + #[derive(Debug)] + pub struct WasmRequestChunk { + request_chunk: js_sys::Function, + } + + #[wasm_bindgen] + impl WasmRequestChunk { + #[wasm_bindgen(constructor)] + pub fn new(request_chunk: js_sys::Function) -> WasmRequestChunk { + WasmRequestChunk { request_chunk } + } + } + + impl RequestChunk for WasmRequestChunk { + fn request_chunk(&self, chunk_pos: ChunkPos) { + let val = serde_wasm_bindgen::to_value(&chunk_pos).unwrap(); + let context = JsValue::NULL; + self.request_chunk.call1(&context, &val).unwrap(); + } + } + #[wasm_bindgen] impl SandBoxGScript { #[wasm_bindgen(constructor)] - pub fn new_wasm(load_distance: u8, terrain_gen: TerrainGenerator) -> SandBoxGScript { - SandBoxGScript::new(load_distance, terrain_gen) + + pub fn new_wasm(load_distance: u8, wasm_request_chunk: WasmRequestChunk) -> SandBoxGScript { + SandBoxGScript { + load_distance, + request_chunk: Box::new(wasm_request_chunk), + } } } diff --git a/lib/world/src/world/world_duct.rs b/lib/world/src/world/world_duct.rs index 0592eb2..3a2f62f 100644 --- a/lib/world/src/world/world_duct.rs +++ b/lib/world/src/world/world_duct.rs @@ -80,17 +80,22 @@ impl World { pub fn get_chunk_mesh_wasm(&self, chunk_id: ChunkId) -> Result { let chunk_pos = ChunkPos::from_id(chunk_id); - web_sys::console::log_1(&JsValue::from_str(&format!("Rust Getting chunk mesh: {}", chunk_id))); + web_sys::console::log_1(&JsValue::from_str(&format!( + "Rust Getting chunk mesh: {}", + chunk_id + ))); - let mesh = self.get_chunk_mesh(&chunk_pos).map_err(Self::convert_error)?; + let mesh = self + .get_chunk_mesh(&chunk_pos) + .map_err(Self::convert_error)?; let wasm_chunk_mesh = mesh - .into_iter() - .map(|(world_pos, directions)| { - let block = self.get_block(&world_pos); - (block, directions.to_owned()) - }) - .collect::>(); + .into_iter() + .map(|(world_pos, directions)| { + let block = self.get_block(&world_pos); + (block, directions.to_owned()) + }) + .collect::>(); to_value(&wasm_chunk_mesh) } From df6234ae4ad4ed9d59c47cb1a8c3766ab668bb5f Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 18 May 2025 18:20:30 -0700 Subject: [PATCH 17/61] Can seralize entities --- apps/web-client/src/runner.ts | 10 ++++ .../src/services/sp-games-service.ts | 52 ++++++++--------- lib/world/Cargo.toml | 3 + lib/world/src/components/world_pos.rs | 2 +- lib/world/src/entities/entity.rs | 56 ++++++++++++++++++- lib/world/src/entities/entity_component.rs | 4 +- lib/world/src/entities/game.rs | 32 +++++------ lib/world/src/entities/player.rs | 4 +- lib/world/src/entities/player_jump_script.rs | 4 +- 9 files changed, 120 insertions(+), 47 deletions(-) diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index a708967..f84b7bd 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -39,6 +39,16 @@ class SinglePlayerTerrainChunkGetter { } } +class GameSaver { + constructor(private game: GameWrapper) { + this.game = game; + } + + saveChunk() { + this.game.game.save_game_wasm(); + } +} + export function run() { // Start the game console.log("RUNNING Starting game"); diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index 65aab45..1e9f15b 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -1,14 +1,26 @@ -import { - Game, - IGameMetadata, - ISerializedGame, - ICreateGameOptions, - IGameSaver, - IGamesService, - SandboxGScript, -} from "@craft/engine"; - -export class ClientDbGamesService implements IGamesService { +import { ISerializedEntities } from "@craft/engine/entities/entityHolder"; +import { ICreateGameOptions, IGameMetadata } from "@craft/engine/game"; +import { IConfig } from "@craft/engine/src/config"; +import { GameWrapper, ISerializedWorld } from "@craft/engine/src/wrappers"; +import { Game } from "@craft/rust-world"; + +export interface SerializedEntity { + id: number; + components: string[]; +} + +export interface SerializedEntities { + entities: SerializedEntity[]; +} + +export interface ISerializedGame { + gameId: string; + name: string; + entities?: ISerializedEntities; + world?: ISerializedWorld; +} + +export class ClientDbGamesService { private static WORLDS_OBS = "worlds"; static async factory() { @@ -44,25 +56,15 @@ export class ClientDbGamesService implements IGamesService { return new ClientDbGamesService(db); } - private constructor(private db: IDBDatabase) {} + private constructor(private db: IDBDatabase) { } async createGame( createGameOptions: ICreateGameOptions | ISerializedGame - ): Promise { - const gameSaver = this.getGameSaver(); - const game = Game.make(createGameOptions, gameSaver); - game.addGameScript(SandboxGScript); + ): Promise { + const game = GameWrapper.makeGame(); return game; } - private getGameSaver(): IGameSaver { - return { - save: async (game: Game) => { - this.saveGame(game); - }, - }; - } - getAllGames(): Promise { return new Promise((resolve) => { const transaction = this.db.transaction([ @@ -89,7 +91,7 @@ export class ClientDbGamesService implements IGamesService { }); } - async getGame(gameId: string): Promise { + async getGame(gameId: string): Promise { const foundGame: ISerializedGame | null = await new Promise((resolve) => { const transaction = this.db.transaction([ ClientDbGamesService.WORLDS_OBS, diff --git a/lib/world/Cargo.toml b/lib/world/Cargo.toml index 05e7670..b52e6f4 100644 --- a/lib/world/Cargo.toml +++ b/lib/world/Cargo.toml @@ -22,6 +22,7 @@ serde = { version = "1.0", features = ["derive"] } serde_repr = "0.1" serde-big-array = "0.4.1" serde-wasm-bindgen = "0.6.5" +serde_json = "1.0.140" float-cmp = "0.9.0" phf = { version = "0.11", default-features = false, features = ["macros"] } web-sys = { version = "0.3.60", features = ["console"] } @@ -29,6 +30,8 @@ noise = "0.8.2" rand = { version = "0.8.5" } rand_distr = "0.4.3" getrandom = { version = "0.2", features = ["js"] } +typetag = "0.2" + # The `console_error_panic_hook` crate provides better debugging of panics by # logging them with `console.error`. This is great for development, but requires diff --git a/lib/world/src/components/world_pos.rs b/lib/world/src/components/world_pos.rs index 018a148..90a8d21 100644 --- a/lib/world/src/components/world_pos.rs +++ b/lib/world/src/components/world_pos.rs @@ -3,7 +3,7 @@ use wasm_bindgen::prelude::*; use crate::{ chunk::{CHUNK_HEIGHT, CHUNK_WIDTH}, - entities::entity_component::impl_component, + entities::entity_component::{impl_component, Component}, positions::{ChunkPos, InnerChunkPos}, vec::{impl_vector_ops, Vector3Ops}, }; diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index fbeb9e6..b160486 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -1,11 +1,12 @@ +use super::entity_component::Component; +use serde::{Deserialize, Serialize}; +use serde_json; use std::{ any::{Any, TypeId}, fmt::Debug, }; use wasm_bindgen::prelude::*; -use super::entity_component::Component; - pub type EntityId = u32; #[derive(Debug)] @@ -14,6 +15,12 @@ pub struct Entity { components: Vec>, } +#[derive(Debug, Serialize, Deserialize)] +pub struct SerializedEntity { + pub id: EntityId, + pub components: Vec, +} + impl Entity { pub fn new(id: EntityId) -> Self { Self { @@ -50,6 +57,28 @@ impl Entity { .any(|c| c.as_any().type_id() == type_id) } + pub fn serialize(&self) -> SerializedEntity { + let components = self + .components + .iter() + .map(|c| serde_json::to_string(c).unwrap()) + .collect(); + SerializedEntity { + id: self.id, + components, + } + } + + pub fn deserialize(serialized: SerializedEntity) -> Entity { + let mut entity = Entity::new(serialized.id); + entity.components = serialized + .components + .iter() + .map(|c| serde_json::from_str(c).unwrap()) + .collect(); + entity + } + pub fn print_components(&self) { println!("Entity ID: {:?}", self.id); for component in &self.components { @@ -59,6 +88,29 @@ impl Entity { } } +#[cfg(test)] +mod tests { + use crate::components::world_pos::WorldPos; + + use super::*; + + #[test] + fn test_serialize_deserialize() { + let mut entity = Entity::new(1); + let world_pos = WorldPos { x: 1, y: 2, z: 3 }; + entity.add(world_pos); + let serialized = entity.serialize(); + let deserialized = Entity::deserialize(serialized); + assert_eq!(entity.id, deserialized.id); + assert_eq!(entity.components.len(), deserialized.components.len()); + + let deserialized_world_pos = deserialized.get::().unwrap(); + assert_eq!(world_pos.x, deserialized_world_pos.x); + assert_eq!(world_pos.y, deserialized_world_pos.y); + assert_eq!(world_pos.z, deserialized_world_pos.z); + } +} + #[derive(Debug)] pub struct EntityQuery { type_ids: Vec, diff --git a/lib/world/src/entities/entity_component.rs b/lib/world/src/entities/entity_component.rs index 1fcc980..9f9284f 100644 --- a/lib/world/src/entities/entity_component.rs +++ b/lib/world/src/entities/entity_component.rs @@ -1,5 +1,7 @@ +use serde::{Deserialize, Serialize}; use std::{any::Any, fmt::Debug}; +#[typetag::serde(tag = "type")] pub trait Component: Any + Debug { fn as_any(&self) -> &dyn Any; fn as_any_mut(&mut self) -> &mut dyn Any; @@ -7,6 +9,7 @@ pub trait Component: Any + Debug { macro_rules! impl_component { ($type:ty) => { + #[typetag::serde] impl $crate::entities::entity_component::Component for $type { fn as_any(&self) -> &dyn std::any::Any { self @@ -18,4 +21,3 @@ macro_rules! impl_component { }; } pub(crate) use impl_component; - diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 09e48a8..aead4ad 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -228,26 +228,26 @@ mod tests { assert!(player_pos.z > 0.0); } - #[test] - pub fn generate_chunk() { - let mut game = Game::new(); - let player = make_player(1); - game.schedule_entity_insert(player); - game.update(); + // #[test] + // pub fn generate_chunk() { + // let mut game = Game::new(); + // let player = make_player(1); + // game.schedule_entity_insert(player); + // game.update(); - let sandbox_game_script = Box::new(SandBoxGScript::default()); - game.add_script(sandbox_game_script); - game.update(); + // let sandbox_game_script = Box::new(SandBoxGScript::default()); + // game.add_script(sandbox_game_script); + // game.update(); - // Check that chunks loaded - let chunk_count = game.world.chunk_count(); - assert_eq!(chunk_count, 1); + // // Check that chunks loaded + // let chunk_count = game.world.chunk_count(); + // assert_eq!(chunk_count, 1); - game.update(); + // game.update(); - let chunk_count = game.world.chunk_count(); - assert_eq!(chunk_count, 2); - } + // let chunk_count = game.world.chunk_count(); + // assert_eq!(chunk_count, 2); + // } } pub mod wasm { diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index d32e137..43e2304 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -1,3 +1,5 @@ +use serde::{Deserialize, Serialize}; + use super::{ entity::{Entity, EntityId}, entity_component::impl_component, @@ -9,7 +11,7 @@ use crate::{ geometry::rotation::SphericalRotation, }; -#[derive(Debug)] +#[derive(Debug, Serialize, Deserialize)] pub struct Flying { pub is_flying: bool, pub on_ground: bool, diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/entities/player_jump_script.rs index 0aa650a..583d382 100644 --- a/lib/world/src/entities/player_jump_script.rs +++ b/lib/world/src/entities/player_jump_script.rs @@ -1,3 +1,5 @@ +use serde::{Deserialize, Serialize}; + use super::{ entity::{Entity, EntityId, EntityQuery, EntityQueryResults}, entity_action::{ActionData, EntityActionDto, EntityActionDtoMaker, EntityActionHandler}, @@ -63,7 +65,7 @@ impl EntityActionHandler for JumpAction { } #[wasm_bindgen] -#[derive(Debug)] +#[derive(Debug, Serialize, Deserialize)] pub struct JumpData { jump_speed: f32, is_jumping: bool, From f318941d8dd9352b69f5bd337a78df419e1a35d3 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 18 May 2025 22:32:05 -0700 Subject: [PATCH 18/61] Half way through game serialization --- DEVLOG.md | 2 + apps/web-client/src/runner.ts | 29 +++--- .../src/services/sp-games-service.ts | 35 ++++--- lib/engine/src/wrappers.ts | 22 +++-- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/Cargo.toml | 3 +- lib/world/src/chunk.rs | 2 +- lib/world/src/entities/entity.rs | 20 +++- lib/world/src/entities/game.rs | 91 +++++++++++-------- lib/world/src/world/mod.rs | 9 +- 10 files changed, 134 insertions(+), 81 deletions(-) diff --git a/DEVLOG.md b/DEVLOG.md index 223f26f..c59fdf0 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -5,6 +5,8 @@ UI to begin with that uses the rust code and attempts to render everything inste I got the actions to work in the UI. They are saved and updated. But the chunk rendering is a mess and isn't working. +Did a lot of work today making everything work with the UI. The wrapper isn't really needed as much anymore. I was half way through getting serializing to work but it isn't really done yet, some values aren't being saved to the DB. + ## 07_11_24 Spent a while trying to figure out why cargo randomly rebuilt dependencies. Figured out it was turbo's issue? So I removed turbo and moved to just using yarn. diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index f84b7bd..1d1fbdc 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -10,19 +10,20 @@ import { TerrainGenerator, WasmRequestChunk, } from "@craft/rust-world"; +import { ClientDbGamesService } from "./services/sp-games-service"; // import { eStartMenu } from "./elements"; class SinglePlayerTerrainChunkGetter { private chunks_to_insert: Chunk[] = []; - private terratinGen: TerrainGenerator; + public terrianGen: TerrainGenerator; constructor(private game: GameWrapper) { - this.terratinGen = new TerrainGenerator(0, true, false); + this.terrianGen = new TerrainGenerator(0, true, false); } getChunk(chunkPos: { x: number; y: number }) { console.log("REQUEST CHUNK", chunkPos); - const chunk = this.terratinGen.get_chunk(chunkPos.x, chunkPos.y); + const chunk = this.terrianGen.get_chunk(chunkPos.x, chunkPos.y); console.log("CHUNK", chunk); this.chunks_to_insert.push(chunk); } @@ -38,17 +39,7 @@ class SinglePlayerTerrainChunkGetter { return new WasmRequestChunk(this.getChunk.bind(this)); } } - -class GameSaver { - constructor(private game: GameWrapper) { - this.game = game; - } - - saveChunk() { - this.game.game.save_game_wasm(); - } -} - +const spGameService = await ClientDbGamesService.factory(); export function run() { // Start the game console.log("RUNNING Starting game"); @@ -66,7 +57,7 @@ export function run() { const main_player_uid = getMyUid(); game.makeAndAddPlayer(main_player_uid); - game.update(); + game.game.update(); const ents = game.getEntities(); console.log("Ents", ents); @@ -100,7 +91,7 @@ export function run() { // make the camera const update = () => { - game.update(); + game.game.update(); playerController.update(); canvasGameScript.update(); chunkGetter.update(); @@ -109,6 +100,12 @@ export function run() { setInterval(update, 1000 / 60); + const saveGame = async () => { + await spGameService.saveGame(game, chunkGetter.terrianGen, sandbox); + }; + + setInterval(saveGame, 1000); + console.log("Starting"); console.log(canvasGameScript); diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index 1e9f15b..0a89d49 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -2,22 +2,15 @@ import { ISerializedEntities } from "@craft/engine/entities/entityHolder"; import { ICreateGameOptions, IGameMetadata } from "@craft/engine/game"; import { IConfig } from "@craft/engine/src/config"; import { GameWrapper, ISerializedWorld } from "@craft/engine/src/wrappers"; -import { Game } from "@craft/rust-world"; - -export interface SerializedEntity { - id: number; - components: string[]; -} - -export interface SerializedEntities { - entities: SerializedEntity[]; -} +import { Game, SandBoxGScript, TerrainGenerator } from "@craft/rust-world"; export interface ISerializedGame { gameId: string; name: string; entities?: ISerializedEntities; world?: ISerializedWorld; + terrainGen?: TerrainGenerator; + sandbox?: SandBoxGScript; } export class ClientDbGamesService { @@ -117,7 +110,11 @@ export class ClientDbGamesService { return this.createGame(foundGame); } - async saveGame(data: Game) { + async saveGame( + data: GameWrapper, + terrainGen: TerrainGenerator, + sandbox: SandBoxGScript + ) { const transaction = this.db.transaction( [ClientDbGamesService.WORLDS_OBS], "readwrite" @@ -133,7 +130,21 @@ export class ClientDbGamesService { }; const objStore = transaction.objectStore("worlds"); - objStore.put(data.serialize()); + const serializedWorldData = data.game.world.serialize_wasm(); + const serializedEntities = data.game.serialize_entities(); + + const serializedGame = { + gameId: data.game.id, + name: data.game.name, + entities: serializedEntities, + world: serializedWorldData, + terrainGen: terrainGen, + sandbox: sandbox, + }; + + console.log("Serialized game", serializedGame); + + objStore.put(serializedGame); } async deleteGame(gameId: string) { diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index c2d890f..90844bf 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -25,10 +25,14 @@ export interface ISerializedWorld { chunks: ISerializedChunkHolder; } -export type SerializedGame = { - world: ISerializedWorld; - players: PlayerWrapper[]; -}; +export interface SerializedEntity { + id: number; + components: string[]; +} + +export interface SerializedEntities { + entities: SerializedEntity[]; +} export type GameDiff = { updated_entities: number[]; @@ -123,18 +127,18 @@ export class GameWrapper { constructor(public game: WorldWasm.Game) { } static makeGame(): GameWrapper { - const game = WorldWasm.Game.new_wasm(); + const game = new WorldWasm.Game(); return new GameWrapper(game); } - update() { - this.game.update_wasm(); - } - makeAndAddPlayer(uid: number) { this.game.make_and_add_player_wasm(uid); } + serializeEntities(): SerializedEntity[] { + return this.game.serialize_entities_wasm(); + } + makeJumpAction(entityId: number): WorldWasm.EntityActionDto { return WorldWasm.JumpAction.make_wasm(entityId); } diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index f819c65..5079d05 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"f148056cbb17653b464393f66ef7027ab755a2d6aad3792be1edce5fba0922fd","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"0ece6659ae311e788d8b1a580c1d86af0e3b519c6535128110960d1f41f353e6","signature":"d73ae268a48868e5b460c63ed023a21e71a899ed2162b309c6ae7c7973a65436","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"901a35f8241affd10fa2f1309df2baa8c8393813ab84a6a4446d29c32f40799f","signature":"1db4d0c03f34ec1e9f7ed486dad9680d92be6b13d5acfd8ea2fc53f06e93bb62","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1f347820d8e9001e442ddc2e35f9828dcae85f46774f855551d328025b2b8476","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"71e7cabc0ac2f5b61408dc67e6b7b89bafd4f19d9dfaaf4de35e30eaa612f3de","signature":"4f48136f62e31e14fc95e3d2183d8d39f1ba9b1b58c4f4e5b8a150122608ecc2","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"901a35f8241affd10fa2f1309df2baa8c8393813ab84a6a4446d29c32f40799f","signature":"1db4d0c03f34ec1e9f7ed486dad9680d92be6b13d5acfd8ea2fc53f06e93bb62","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file diff --git a/lib/world/Cargo.toml b/lib/world/Cargo.toml index b52e6f4..92dcb94 100644 --- a/lib/world/Cargo.toml +++ b/lib/world/Cargo.toml @@ -14,7 +14,7 @@ crate-type = ["cdylib", "rlib"] default = ["console_error_panic_hook"] [dependencies] -wasm-bindgen = { version = "0.2.92", features = ["serde-serialize"] } +wasm-bindgen = { version = "0.2.100", features = ["serde-serialize"] } lazy_static = "1.4.0" num = "0.4" js-sys = "0.3.59" @@ -31,6 +31,7 @@ rand = { version = "0.8.5" } rand_distr = "0.4.3" getrandom = { version = "0.2", features = ["js"] } typetag = "0.2" +uuid = { version = "1.16.0", features = ["v4", "js"] } # The `console_error_panic_hook` crate provides better debugging of panics by diff --git a/lib/world/src/chunk.rs b/lib/world/src/chunk.rs index d9d8019..1e8bbc9 100644 --- a/lib/world/src/chunk.rs +++ b/lib/world/src/chunk.rs @@ -32,7 +32,7 @@ fn default_block_data() -> BlockDataArray { [BlockData::None; CHUNK_MEM_SIZE] } -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Clone)] #[wasm_bindgen] pub struct Chunk { #[serde(with = "BigArray")] diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index b160486..dbe2371 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -10,12 +10,14 @@ use wasm_bindgen::prelude::*; pub type EntityId = u32; #[derive(Debug)] +#[wasm_bindgen(getter_with_clone)] pub struct Entity { pub id: EntityId, components: Vec>, } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, Clone)] +#[wasm_bindgen(getter_with_clone)] pub struct SerializedEntity { pub id: EntityId, pub components: Vec, @@ -142,6 +144,8 @@ impl<'a> EntityQueryResults<'a> { } } +#[wasm_bindgen] +#[derive(Debug)] pub struct EntityHolder { entities: Vec, } @@ -187,4 +191,18 @@ impl EntityHolder { EntityQueryResults::new(filtered_entities) } + + pub fn serialize(&self) -> Vec { + self.entities + .iter() + .map(|entity| entity.serialize()) + .collect() + } + + pub fn deserialize(&mut self, serialized_entities: Vec) { + self.entities = serialized_entities + .iter() + .map(|serialized| Entity::deserialize(serialized.clone())) + .collect(); + } } diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index aead4ad..f5cfc56 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -1,45 +1,60 @@ use super::{ - entity::{Entity, EntityHolder, EntityId}, + entity::{Entity, EntityHolder, EntityId, SerializedEntity}, entity_action::EntityActionHolder, game_script::{EntityScriptHolder, GameScript}, }; use crate::{ chunk::{Chunk, ChunkId}, + entities::{ + entity_action::EntityActionDtoMaker, + player_jump_script::JumpAction, + player_move_script::{MoveAction, MoveScript}, + player_rot_script::RotateAction, + velocity_script::VelocityScript, + }, world::{world_block::WorldBlock, World}, }; use serde::{Deserialize, Serialize}; +use uuid::Uuid; use wasm_bindgen::prelude::wasm_bindgen; -#[wasm_bindgen] +#[wasm_bindgen(getter_with_clone)] pub struct Game { - world: World, + pub name: String, + pub id: String, + pub world: World, + entity_holder: EntityHolder, scripts: EntityScriptHolder, schedule: GameSchedule, - entity_holder: EntityHolder, action_holder: EntityActionHolder, } +#[wasm_bindgen] impl Game { + #[wasm_bindgen(constructor)] pub fn new() -> Game { - Game { + console_error_panic_hook::set_once(); + let mut g = Game { + name: "".to_string(), + id: Uuid::new_v4().to_string(), world: World::default(), entity_holder: EntityHolder::new(), scripts: EntityScriptHolder::default(), schedule: GameSchedule::empty(), action_holder: EntityActionHolder::default(), - } - } + }; - pub fn add_script(&mut self, script: Box) { - self.scripts.add_script(script); - } + g.add_script(Box::new(MoveScript::default())); + g.add_script(Box::new(VelocityScript::default())); + g.update(); - // pub fn get_entity_script(&self, entity_id: EntityId) -> Option<&T> - // where - // T: EntityScript + Any, - // { - // self.entity_scripts.get_script::(entity_id) - // } + // Add basic action handlers + g.action_holder.add_handler(MoveAction::make_handler()); + g.action_holder.add_handler(JumpAction::make_handler()); + g.action_holder.add_handler(RotateAction::make_handler()); + + g + } pub fn update(&mut self) { let world = &self.world; @@ -88,6 +103,16 @@ impl Game { pub fn schedule_entity_insert(&mut self, entity: Entity) { self.schedule.new_entities.push(entity); } + + pub fn serialize_entities(&self) -> Vec { + self.entity_holder.serialize() + } +} + +impl Game { + pub fn add_script(&mut self, script: Box) { + self.scripts.add_script(script); + } } #[derive(Clone, Serialize, Deserialize)] @@ -258,7 +283,7 @@ pub mod wasm { chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, components::world_pos::WorldPos, entities::{ - entity::{Entity, EntityId, EntityQueryResults}, + entity::{Entity, EntityId, EntityQueryResults, SerializedEntity}, entity_action::{EntityActionDto, EntityActionDtoMaker}, player::{make_player, wasm::WasmPlayer}, player_jump_script::JumpAction, @@ -276,26 +301,6 @@ pub mod wasm { #[wasm_bindgen] impl Game { - pub fn new_wasm() -> Game { - console_error_panic_hook::set_once(); - let mut g = Game::new(); - - g.add_script(Box::new(MoveScript::default())); - g.add_script(Box::new(VelocityScript::default())); - g.update(); - - // Add basic action handlers - g.action_holder.add_handler(MoveAction::make_handler()); - g.action_holder.add_handler(JumpAction::make_handler()); - g.action_holder.add_handler(RotateAction::make_handler()); - - g - } - - pub fn update_wasm(&mut self) { - self.update(); - } - pub fn make_and_add_player_wasm(&mut self, uid: EntityId) -> () { let player = make_player(uid); self.schedule_entity_insert(player); @@ -383,6 +388,18 @@ pub mod wasm { let block_js = serde_wasm_bindgen::to_value(&block).unwrap(); Ok(block_js) } + + pub fn serialize_entities_wasm(&self) -> Result { + let entities: Vec = self + .entity_holder + .get_all() + .iter() + .map(|entity| entity.serialize()) + .collect(); + + let entities_js = serde_wasm_bindgen::to_value(&entities).unwrap(); + Ok(entities_js) + } } #[wasm_bindgen] diff --git a/lib/world/src/world/mod.rs b/lib/world/src/world/mod.rs index 91ebac8..6937ab2 100644 --- a/lib/world/src/world/mod.rs +++ b/lib/world/src/world/mod.rs @@ -3,7 +3,7 @@ use crate::chunk::chunk_mesh::ChunkMesh; use crate::chunk::Chunk; use crate::components::world_pos::WorldPos; use crate::direction::{Direction, DirectionVectorExtension, Directions}; -use crate::positions::{ChunkPos}; +use crate::positions::ChunkPos; use serde::{Deserialize, Serialize}; use std::collections::{HashMap, HashSet}; use std::{self, fmt}; @@ -50,7 +50,7 @@ pub struct WorldStateDiff { pub chunk_ids: HashSet, } -#[derive(Default, Serialize, Deserialize)] +#[derive(Default, Serialize, Deserialize, Clone)] #[wasm_bindgen] pub struct World { chunks: HashMap, @@ -125,7 +125,10 @@ impl World { #[cfg(test)] mod tests { use super::*; - use crate::{block::{BlockData, BlockType}, vec::Vector3Ops}; + use crate::{ + block::{BlockData, BlockType}, + vec::Vector3Ops, + }; #[test] fn get_adjacent_blocks() { From 2ff5efc50725dcadb8afaca3c0f6dbd9a0c5d15f Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 18 May 2025 23:27:03 -0700 Subject: [PATCH 19/61] Sererializing works --- apps/web-client/src/runner.ts | 7 ++++++- .../src/services/sp-games-service.ts | 11 ++++------ lib/world/src/entities/game.rs | 21 ++++++------------- lib/world/src/entities/sandbox.rs | 10 +++++++-- lib/world/src/entities/terrain_gen.rs | 6 ++++++ 5 files changed, 30 insertions(+), 25 deletions(-) diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 1d1fbdc..d1b6bca 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -52,6 +52,7 @@ export function run() { // add sandbox const sandbox = new SandBoxGScript(1, chunkGetter.getWasmRequestChunk()); + const serializedSandbox = sandbox.serialize(); game.game.add_sandbox_wasm(sandbox); const main_player_uid = getMyUid(); @@ -101,7 +102,11 @@ export function run() { setInterval(update, 1000 / 60); const saveGame = async () => { - await spGameService.saveGame(game, chunkGetter.terrianGen, sandbox); + await spGameService.saveGame( + game, + chunkGetter.terrianGen, + serializedSandbox + ); }; setInterval(saveGame, 1000); diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index 0a89d49..47b5190 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -113,7 +113,7 @@ export class ClientDbGamesService { async saveGame( data: GameWrapper, terrainGen: TerrainGenerator, - sandbox: SandBoxGScript + sandbox: any ) { const transaction = this.db.transaction( [ClientDbGamesService.WORLDS_OBS], @@ -130,15 +130,12 @@ export class ClientDbGamesService { }; const objStore = transaction.objectStore("worlds"); - const serializedWorldData = data.game.world.serialize_wasm(); - const serializedEntities = data.game.serialize_entities(); - const serializedGame = { gameId: data.game.id, name: data.game.name, - entities: serializedEntities, - world: serializedWorldData, - terrainGen: terrainGen, + entities: data.game.serialize_entities_wasm(), + world: data.game.world.serialize_wasm(), + terrainGen: terrainGen.serialize(), sandbox: sandbox, }; diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index f5cfc56..09b3d32 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -15,8 +15,9 @@ use crate::{ world::{world_block::WorldBlock, World}, }; use serde::{Deserialize, Serialize}; +use serde_wasm_bindgen::Error; use uuid::Uuid; -use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; #[wasm_bindgen(getter_with_clone)] pub struct Game { @@ -104,8 +105,10 @@ impl Game { self.schedule.new_entities.push(entity); } - pub fn serialize_entities(&self) -> Vec { - self.entity_holder.serialize() + pub fn serialize_entities_wasm(&self) -> Result { + let serialized_entities = self.entity_holder.serialize(); + let serialized_entities_js = serde_wasm_bindgen::to_value(&serialized_entities).unwrap(); + Ok(serialized_entities_js) } } @@ -388,18 +391,6 @@ pub mod wasm { let block_js = serde_wasm_bindgen::to_value(&block).unwrap(); Ok(block_js) } - - pub fn serialize_entities_wasm(&self) -> Result { - let entities: Vec = self - .entity_holder - .get_all() - .iter() - .map(|entity| entity.serialize()) - .collect(); - - let entities_js = serde_wasm_bindgen::to_value(&entities).unwrap(); - Ok(entities_js) - } } #[wasm_bindgen] diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index 76f9d36..6518d70 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -1,3 +1,4 @@ +use serde::Serialize; use wasm_bindgen::prelude::wasm_bindgen; use super::{ @@ -12,10 +13,11 @@ pub trait RequestChunk: std::fmt::Debug { fn request_chunk(&self, chunk_pos: ChunkPos); } -#[derive(Debug)] +#[derive(Debug, Serialize)] #[wasm_bindgen] pub struct SandBoxGScript { pub load_distance: u8, + #[serde(skip)] request_chunk: Box, // pub terrain_gen: TerrainGenerator, } @@ -100,13 +102,17 @@ pub mod wasm { #[wasm_bindgen] impl SandBoxGScript { #[wasm_bindgen(constructor)] - pub fn new_wasm(load_distance: u8, wasm_request_chunk: WasmRequestChunk) -> SandBoxGScript { SandBoxGScript { load_distance, request_chunk: Box::new(wasm_request_chunk), } } + + pub fn serialize(&self) -> Result { + let serialized = serde_wasm_bindgen::to_value(self).unwrap(); + Ok(serialized) + } } #[wasm_bindgen] diff --git a/lib/world/src/entities/terrain_gen.rs b/lib/world/src/entities/terrain_gen.rs index 27be475..d688737 100644 --- a/lib/world/src/entities/terrain_gen.rs +++ b/lib/world/src/entities/terrain_gen.rs @@ -14,6 +14,7 @@ use rand::{rngs::StdRng, SeedableRng}; use rand_distr::{Distribution, Uniform}; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::JsValue; // remove all the positions that are too close to each other in the chunk fn remove_close_positions<'a, I, J>(pos_iter: I, checking_pos_iter: J) -> Vec @@ -535,6 +536,11 @@ impl TerrainGenerator { } } + pub fn serialize(&self) -> Result { + let serialized = serde_wasm_bindgen::to_value(self).unwrap(); + Ok(serialized) + } + pub fn get_chunk(&self, chunk_x: i16, chunk_y: i16) -> Chunk { let chunk_pos = ChunkPos { x: chunk_x, From b69e209ee65d95211165157c861799e66632efe3 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Mon, 19 May 2025 22:41:26 -0700 Subject: [PATCH 20/61] Serializing the whole game works --- .../src/game-scripts/canvas-gscript.ts | 2 +- apps/web-client/src/runner.ts | 14 ++- .../src/services/sp-games-service.ts | 91 +++++++++------ lib/engine/game.ts | 2 - lib/engine/src/wrappers.ts | 84 +------------- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/Cargo.toml | 1 + lib/world/src/entities/entity.rs | 109 +++++++++--------- lib/world/src/entities/game.rs | 39 ++++++- lib/world/src/entities/game_script.rs | 2 + lib/world/src/entities/player.rs | 23 +++- lib/world/src/entities/player_jump_script.rs | 2 +- lib/world/src/world/mod.rs | 6 +- lib/world/src/world/world_duct.rs | 4 + 14 files changed, 187 insertions(+), 194 deletions(-) diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index b52a62f..06c4b41 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -308,6 +308,7 @@ export class CanvasGameScript extends GameScript { } onChunkUpdate(chunkId: number): void { + console.log("CanvasGameScript: Updating chunk", chunkId); const chunkPos = this.game.getChunkPosFromChunkId(chunkId); const chunkMesh = this.game.getChunkMeshFromChunkPos(chunkId); const chunkRenderer = new ChunkRenderer( @@ -317,6 +318,5 @@ export class CanvasGameScript extends GameScript { ); chunkRenderer.getBufferData(); this.chunkRenderers.set(chunkId, chunkRenderer); - console.log(this.chunkRenderers); } } diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index d1b6bca..8c8fb8d 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -40,13 +40,18 @@ class SinglePlayerTerrainChunkGetter { } } const spGameService = await ClientDbGamesService.factory(); -export function run() { +export async function run(id?: string) { // Start the game console.log("RUNNING Starting game"); // hideElement(eStartMenu); - const game = GameWrapper.makeGame(); + const game = id ? await spGameService.getGame(id) : spGameService.newGame(); + + if (!game) { + console.error("Game not found"); + return; + } const chunkGetter = new SinglePlayerTerrainChunkGetter(game); @@ -107,9 +112,10 @@ export function run() { chunkGetter.terrianGen, serializedSandbox ); + setTimeout(saveGame, 1000); }; - setInterval(saveGame, 1000); + saveGame(); console.log("Starting"); @@ -118,4 +124,4 @@ export function run() { canvasGameScript.renderLoop(0); } -run(); +run("f27fa11d-bf9e-4f82-8a3e-9e87a02c3870"); diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index 47b5190..9e54cd7 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -2,15 +2,22 @@ import { ISerializedEntities } from "@craft/engine/entities/entityHolder"; import { ICreateGameOptions, IGameMetadata } from "@craft/engine/game"; import { IConfig } from "@craft/engine/src/config"; import { GameWrapper, ISerializedWorld } from "@craft/engine/src/wrappers"; -import { Game, SandBoxGScript, TerrainGenerator } from "@craft/rust-world"; +import { + EntityHolder, + Game, + SandBoxGScript, + SerializedEntityHolder, + TerrainGenerator, + World, +} from "@craft/rust-world"; export interface ISerializedGame { gameId: string; name: string; - entities?: ISerializedEntities; - world?: ISerializedWorld; - terrainGen?: TerrainGenerator; - sandbox?: SandBoxGScript; + entities: SerializedEntityHolder; + world: World; + terrainGen: TerrainGenerator; + sandbox: SandBoxGScript; } export class ClientDbGamesService { @@ -51,11 +58,26 @@ export class ClientDbGamesService { private constructor(private db: IDBDatabase) { } - async createGame( - createGameOptions: ICreateGameOptions | ISerializedGame - ): Promise { - const game = GameWrapper.makeGame(); - return game; + newGame(): GameWrapper { + return GameWrapper.makeGame(); + } + + createGame(createGameOptions: ISerializedGame): GameWrapper { + console.log("createGameOptions", createGameOptions); + const world = World.deserialize_wasm(createGameOptions.world); + console.log("world", world); + const entityHolder = EntityHolder.deserialize_wasm( + createGameOptions.entities + ); + console.log("entityHolder", entityHolder); + const game = Game.build( + createGameOptions.gameId, + createGameOptions.name, + world, + entityHolder + ); + + return new GameWrapper(game); } getAllGames(): Promise { @@ -115,33 +137,34 @@ export class ClientDbGamesService { terrainGen: TerrainGenerator, sandbox: any ) { - const transaction = this.db.transaction( - [ClientDbGamesService.WORLDS_OBS], - "readwrite" - ); - - console.log("Saving game", data); - - transaction.oncomplete = () => { - console.log("All done!"); - }; - transaction.onerror = () => { - console.log("There was an error", event); - }; - const objStore = transaction.objectStore("worlds"); + return new Promise((resolve, reject) => { + const transaction = this.db.transaction( + [ClientDbGamesService.WORLDS_OBS], + "readwrite" + ); + const serializedGame = { + gameId: data.game.id, + name: data.game.name, + entities: data.game.serialize_entities_wasm(), + world: data.game.world.serialize_wasm(), + terrainGen: terrainGen.serialize(), + sandbox: sandbox, + }; - const serializedGame = { - gameId: data.game.id, - name: data.game.name, - entities: data.game.serialize_entities_wasm(), - world: data.game.world.serialize_wasm(), - terrainGen: terrainGen.serialize(), - sandbox: sandbox, - }; + console.log("Saving game", serializedGame); - console.log("Serialized game", serializedGame); + transaction.oncomplete = async () => { + console.log("Saving game complete"); + resolve(); + }; + transaction.onerror = () => { + console.log("There was an error", event); + reject(event); + }; + const objStore = transaction.objectStore(ClientDbGamesService.WORLDS_OBS); - objStore.put(serializedGame); + const result = objStore.put(serializedGame); + }); } async deleteGame(gameId: string) { diff --git a/lib/engine/game.ts b/lib/engine/game.ts index bbc5115..f032662 100644 --- a/lib/engine/game.ts +++ b/lib/engine/game.ts @@ -28,8 +28,6 @@ export interface IGameMetadata { name: string; } -export type ICreateGameOptions = Pick; - export type IContructGameOptions = Omit & { gameId?: string; }; diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index 90844bf..2ce1e1a 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -2,6 +2,7 @@ import * as WorldWasm from "@craft/rust-world"; import { Vector2D, Vector3D } from "./vector.js"; import { Camera } from "./camera.js"; import { GameScript } from "./game-script.js"; +import { World } from "@craft/rust-world"; export * as WorldModuleTypes from "@craft/rust-world"; export interface ISerializedChunk { @@ -240,86 +241,3 @@ export class GameWrapper { return new Vector2D([chunk_pos.x, chunk_pos.y]); } } -// async function loadWasmModule(module: any, name = "") { -// console.log("Loading Wasm Module: ", name); -// const loadedModule = module.default ? await module.default : await module; -// console.log(`Loaded Wasm Module: ${name} 🎉`); -// return loadedModule; -// } - -// Wrapper class for world logic -// class WorldModuleClass { -// private _module: typeof WorldWasm | null = null; - -// private get module() { -// if (!this._module) { -// throw new Error("Module not loaded"); -// } -// return this._module; -// } - -// async load(): Promise { -// if (this._module) return; -// this._module = await loadWasmModule(WorldWasm, "World"); -// } - -// public createWorld(data?: ISerializedWorld) { -// console.log("Creating wasm world"); -// const wasmWorld = WorldModule.module.World.new_wasm(); -// const world = new World(wasmWorld, data); -// return world; -// } - -// public createPlayer(uid: number) { -// const player = WorldModule.module.Player.make(uid); -// return player; -// } -// } - -// export const WorldModule = new WorldModuleClass(); - -// class TerrainGenModuleClass { -// private _module: typeof TerrainGenWasm | null = null; - -// private get module() { -// if (!this._module) { -// throw new Error("Terrain gen module not loaded"); -// } -// return this._module; -// } - -// public async load(): Promise { -// if (this._module) return; -// this._module = await loadWasmModule(TerrainGenWasm, "TerrainGen"); -// } - -// getParkorTerrainGenerator(seed: number) { -// const terrainGenerator = this.module.ParkorChunkGetter.new(); - -// return { -// getChunk: (chunkPos: Vector2D) => { -// console.log("Generating Chunk", chunkPos); -// const chunk = terrainGenerator -// .get_chunk_wasm(chunkPos.get(0), chunkPos.get(1)) -// .serialize(); -// return chunk as unknown as ISerializedChunk; -// }, -// }; -// } - -// getTerrainGenerator(seed: number, flatWorld: boolean) { -// const terrainGenerator = new this.module.TerrainGenerator(seed, flatWorld); - -// return { -// getChunk: (chunkPos: Vector2D) => { -// console.log("Generating Chunk", chunkPos); -// const chunk = terrainGenerator -// .get_chunk(chunkPos.get(0), chunkPos.get(1)) -// .serialize(); -// return chunk as unknown as ISerializedChunk; -// }, -// }; -// } -// } - -// export const TerrainGenModule = new TerrainGenModuleClass(); diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 5079d05..4032af7 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1f347820d8e9001e442ddc2e35f9828dcae85f46774f855551d328025b2b8476","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"71e7cabc0ac2f5b61408dc67e6b7b89bafd4f19d9dfaaf4de35e30eaa612f3de","signature":"4f48136f62e31e14fc95e3d2183d8d39f1ba9b1b58c4f4e5b8a150122608ecc2","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"901a35f8241affd10fa2f1309df2baa8c8393813ab84a6a4446d29c32f40799f","signature":"1db4d0c03f34ec1e9f7ed486dad9680d92be6b13d5acfd8ea2fc53f06e93bb62","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ed9dba8590e31543788bfc17c0133c32c7392d110ecceadd1bb939c97dab8f3","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"92a6d9ecf01687af0717791bb759b4d5dda1f5bf3bb2fe42cc84a676c84bc7e3","signature":"4f48136f62e31e14fc95e3d2183d8d39f1ba9b1b58c4f4e5b8a150122608ecc2","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"901a35f8241affd10fa2f1309df2baa8c8393813ab84a6a4446d29c32f40799f","signature":"1db4d0c03f34ec1e9f7ed486dad9680d92be6b13d5acfd8ea2fc53f06e93bb62","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file diff --git a/lib/world/Cargo.toml b/lib/world/Cargo.toml index 92dcb94..f5e8c4c 100644 --- a/lib/world/Cargo.toml +++ b/lib/world/Cargo.toml @@ -23,6 +23,7 @@ serde_repr = "0.1" serde-big-array = "0.4.1" serde-wasm-bindgen = "0.6.5" serde_json = "1.0.140" +tsify = { version = "0.5.5", features = ["js"] } float-cmp = "0.9.0" phf = { version = "0.11", default-features = false, features = ["macros"] } web-sys = { version = "0.3.60", features = ["console"] } diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index dbe2371..9e9ddf8 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -1,10 +1,12 @@ -use super::entity_component::Component; +use super::{entity_component::Component, player::wasm::Player}; +use crate::{geometry::rotation::SphericalRotation, utils::js_log}; use serde::{Deserialize, Serialize}; -use serde_json; +use serde_wasm_bindgen::from_value; use std::{ any::{Any, TypeId}, fmt::Debug, }; +use tsify::Tsify; use wasm_bindgen::prelude::*; pub type EntityId = u32; @@ -16,13 +18,6 @@ pub struct Entity { components: Vec>, } -#[derive(Debug, Serialize, Deserialize, Clone)] -#[wasm_bindgen(getter_with_clone)] -pub struct SerializedEntity { - pub id: EntityId, - pub components: Vec, -} - impl Entity { pub fn new(id: EntityId) -> Self { Self { @@ -59,28 +54,6 @@ impl Entity { .any(|c| c.as_any().type_id() == type_id) } - pub fn serialize(&self) -> SerializedEntity { - let components = self - .components - .iter() - .map(|c| serde_json::to_string(c).unwrap()) - .collect(); - SerializedEntity { - id: self.id, - components, - } - } - - pub fn deserialize(serialized: SerializedEntity) -> Entity { - let mut entity = Entity::new(serialized.id); - entity.components = serialized - .components - .iter() - .map(|c| serde_json::from_str(c).unwrap()) - .collect(); - entity - } - pub fn print_components(&self) { println!("Entity ID: {:?}", self.id); for component in &self.components { @@ -96,21 +69,30 @@ mod tests { use super::*; - #[test] - fn test_serialize_deserialize() { - let mut entity = Entity::new(1); - let world_pos = WorldPos { x: 1, y: 2, z: 3 }; - entity.add(world_pos); - let serialized = entity.serialize(); - let deserialized = Entity::deserialize(serialized); - assert_eq!(entity.id, deserialized.id); - assert_eq!(entity.components.len(), deserialized.components.len()); - - let deserialized_world_pos = deserialized.get::().unwrap(); - assert_eq!(world_pos.x, deserialized_world_pos.x); - assert_eq!(world_pos.y, deserialized_world_pos.y); - assert_eq!(world_pos.z, deserialized_world_pos.z); - } + // #[test] + // fn test_serialize_deserialize() { + // let mut entity = Entity::new(1); + // let world_pos = WorldPos { x: 1, y: 2, z: 3 }; + // let spherical_rotation = SphericalRotation::new(0.0, 0.0); + // entity.add(world_pos); + // entity.add(spherical_rotation); + // let serialized = entity.serialize(); + // let deserialized = Entity::deserialize(serialized); + // assert_eq!(entity.id, deserialized.id); + // assert_eq!(entity.components.len(), deserialized.components.len()); + + // let deserialized_world_pos = deserialized.get::().unwrap(); + // assert_eq!(world_pos.x, deserialized_world_pos.x); + // assert_eq!(world_pos.y, deserialized_world_pos.y); + // assert_eq!(world_pos.z, deserialized_world_pos.z); + + // let deserialized_spherical_rotation = deserialized.get::().unwrap(); + // assert_eq!( + // spherical_rotation.theta, + // deserialized_spherical_rotation.theta + // ); + // assert_eq!(spherical_rotation.phi, deserialized_spherical_rotation.phi); + // } } #[derive(Debug)] @@ -150,6 +132,11 @@ pub struct EntityHolder { entities: Vec, } +#[derive(Debug, Serialize, Deserialize, Tsify)] +pub struct SerializedEntityHolder { + pub entities: Vec, +} + impl EntityHolder { pub fn new() -> EntityHolder { EntityHolder { @@ -192,17 +179,31 @@ impl EntityHolder { EntityQueryResults::new(filtered_entities) } - pub fn serialize(&self) -> Vec { - self.entities - .iter() - .map(|entity| entity.serialize()) - .collect() + pub fn serialize(&self) -> SerializedEntityHolder { + SerializedEntityHolder { + entities: self + .entities + .iter() + .map(|entity| Player::make_from_entity(entity)) + .collect(), + } } - pub fn deserialize(&mut self, serialized_entities: Vec) { - self.entities = serialized_entities + pub fn deserialize(serialized_entities: SerializedEntityHolder) -> EntityHolder { + let mut entity_holder = EntityHolder::new(); + entity_holder.entities = serialized_entities + .entities .iter() - .map(|serialized| Entity::deserialize(serialized.clone())) + .map(|serialized| Player::make_entity(serialized)) .collect(); + entity_holder + } +} + +#[wasm_bindgen] +impl EntityHolder { + pub fn deserialize_wasm(value: JsValue) -> Result { + let entity_holder: SerializedEntityHolder = from_value(value)?; + Ok(EntityHolder::deserialize(entity_holder)) } } diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 09b3d32..730c4bb 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -1,5 +1,5 @@ use super::{ - entity::{Entity, EntityHolder, EntityId, SerializedEntity}, + entity::{Entity, EntityHolder, EntityId}, entity_action::EntityActionHolder, game_script::{EntityScriptHolder, GameScript}, }; @@ -57,6 +57,29 @@ impl Game { g } + pub fn build(id: String, name: String, world: World, entity_holder: EntityHolder) -> Game { + let mut g = Game { + id, + name, + world, + entity_holder, + scripts: EntityScriptHolder::default(), + schedule: GameSchedule::empty(), + action_holder: EntityActionHolder::default(), + }; + + g.add_script(Box::new(MoveScript::default())); + g.add_script(Box::new(VelocityScript::default())); + g.update(); + + // Add basic action handlers + g.action_holder.add_handler(MoveAction::make_handler()); + g.action_holder.add_handler(JumpAction::make_handler()); + g.action_holder.add_handler(RotateAction::make_handler()); + + g + } + pub fn update(&mut self) { let world = &self.world; // apply actions @@ -286,9 +309,9 @@ pub mod wasm { chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, components::world_pos::WorldPos, entities::{ - entity::{Entity, EntityId, EntityQueryResults, SerializedEntity}, + entity::{Entity, EntityId, EntityQueryResults}, entity_action::{EntityActionDto, EntityActionDtoMaker}, - player::{make_player, wasm::WasmPlayer}, + player::{make_player, wasm::Player}, player_jump_script::JumpAction, player_move_script::{MoveAction, MoveScript}, player_rot_script::RotateAction, @@ -305,6 +328,10 @@ pub mod wasm { #[wasm_bindgen] impl Game { pub fn make_and_add_player_wasm(&mut self, uid: EntityId) -> () { + // skip if player already exists + if self.entity_holder.get_entity_by_id(uid).is_some() { + return; + } let player = make_player(uid); self.schedule_entity_insert(player); self.update(); @@ -363,7 +390,7 @@ pub mod wasm { pub fn get_player_wasm(&self, player_id: EntityId) -> Result { let maybe_player = self.entity_holder.get_entity_by_id(player_id); if let Some(player) = maybe_player { - let wasm_player = WasmPlayer::make_from_entity(player); + let wasm_player = Player::make_from_entity(player); let player_js = serde_wasm_bindgen::to_value(&wasm_player).unwrap(); Ok(player_js) } else { @@ -373,9 +400,9 @@ pub mod wasm { pub fn get_players_wasm(&self) -> Result { let players = self.entity_holder.get_all(); - let players_wasm: Vec = players + let players_wasm: Vec = players .iter() - .map(|player| WasmPlayer::make_from_entity(player)) + .map(|player| Player::make_from_entity(player)) .collect(); let players_js = serde_wasm_bindgen::to_value(&players_wasm).unwrap(); Ok(players_js) diff --git a/lib/world/src/entities/game_script.rs b/lib/world/src/entities/game_script.rs index e61d8dd..544cd95 100644 --- a/lib/world/src/entities/game_script.rs +++ b/lib/world/src/entities/game_script.rs @@ -31,6 +31,7 @@ macro_rules! impl_script { }; } pub(crate) use impl_script; +use wasm_bindgen::prelude::wasm_bindgen; impl std::error::Error for ScriptNotFoundError {} @@ -51,6 +52,7 @@ impl std::fmt::Display for ScriptNotFoundError { } #[derive(Debug, Default)] +#[wasm_bindgen] pub struct EntityScriptHolder { scripts: Vec>, } diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index 43e2304..961aa61 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -37,6 +37,7 @@ pub mod wasm { components::{fine_world_pos::FineWorldPos, velocity::Velocity}, entities::{ entity::{Entity, EntityId}, + player_jump_script::JumpData, player_move_script::MovingDirection, }, geometry::rotation::SphericalRotation, @@ -44,25 +45,37 @@ pub mod wasm { use serde::{Deserialize, Serialize}; use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; - #[derive(Serialize, Deserialize)] + #[derive(Serialize, Deserialize, Debug)] #[wasm_bindgen] - pub struct WasmPlayer { + pub struct Player { pub id: EntityId, pub pos: FineWorldPos, pub vel: Velocity, pub rot: SphericalRotation, + pub jump_data: JumpData, pub moving_direction: MovingDirection, } - impl WasmPlayer { - pub fn make_from_entity(entity: &Entity) -> WasmPlayer { - WasmPlayer { + impl Player { + pub fn make_from_entity(entity: &Entity) -> Player { + Player { id: entity.id, pos: entity.get::().unwrap().clone(), vel: entity.get::().unwrap().clone(), rot: entity.get::().unwrap().clone(), moving_direction: entity.get::().unwrap().to_owned(), + jump_data: entity.get::().unwrap().to_owned(), } } + + pub fn make_entity(&self) -> Entity { + let mut ent = Entity::new(self.id); + ent.add::(self.pos); + ent.add::(self.vel); + ent.add::(self.rot); + ent.add::(self.moving_direction); + ent.add::(self.jump_data); + ent + } } } diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/entities/player_jump_script.rs index 583d382..64bae55 100644 --- a/lib/world/src/entities/player_jump_script.rs +++ b/lib/world/src/entities/player_jump_script.rs @@ -65,7 +65,7 @@ impl EntityActionHandler for JumpAction { } #[wasm_bindgen] -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, Clone, Copy)] pub struct JumpData { jump_speed: f32, is_jumping: bool, diff --git a/lib/world/src/world/mod.rs b/lib/world/src/world/mod.rs index 6937ab2..d4d87e3 100644 --- a/lib/world/src/world/mod.rs +++ b/lib/world/src/world/mod.rs @@ -7,8 +7,8 @@ use crate::positions::ChunkPos; use serde::{Deserialize, Serialize}; use std::collections::{HashMap, HashSet}; use std::{self, fmt}; +use tsify::Tsify; use wasm_bindgen::prelude::*; - pub mod world_block; mod world_chunk; mod world_duct; @@ -50,11 +50,11 @@ pub struct WorldStateDiff { pub chunk_ids: HashSet, } -#[derive(Default, Serialize, Deserialize, Clone)] +#[derive(Default, Tsify, Serialize, Deserialize, Clone)] #[wasm_bindgen] pub struct World { chunks: HashMap, - #[serde(skip)] + // #[serde(skip)] chunk_meshes: HashMap, } diff --git a/lib/world/src/world/world_duct.rs b/lib/world/src/world/world_duct.rs index 3a2f62f..6e60a7c 100644 --- a/lib/world/src/world/world_duct.rs +++ b/lib/world/src/world/world_duct.rs @@ -124,6 +124,10 @@ impl World { }) } + pub fn deserialize_wasm(value: JsValue) -> Result { + from_value(value) + } + pub fn has_chunk_wasm(&self, value: JsValue) -> bool { from_value(value) .map(|pos: ChunkPos| self.has_chunk(&pos)) From 031b3cbfef6f177b5416a49acc74151f91ebed89 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Tue, 20 May 2025 01:04:02 -0700 Subject: [PATCH 21/61] Rewrote the server, not tested, much simpler --- DEVLOG.md | 37 ++++ apps/server/db.ts | 54 +++-- apps/server/players.ts | 5 +- apps/server/server-game-manager.ts | 141 ++++++++++++ apps/server/server-game.ts | 8 +- apps/server/server.ts | 71 ++++-- .../keyboardPlayerController.ts | 14 +- .../playerControllers/mobileController.ts | 8 +- apps/web-client/src/runner.ts | 18 +- lib/engine/src/playerActions.ts | 207 ++---------------- lib/engine/src/socket-types.ts | 62 ++---- lib/engine/src/wrappers.ts | 5 - lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/entities/game.rs | 1 + 14 files changed, 330 insertions(+), 303 deletions(-) create mode 100644 apps/server/server-game-manager.ts diff --git a/DEVLOG.md b/DEVLOG.md index c59fdf0..2665b9f 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,3 +1,40 @@ +## 05_19_25 + +We now can serialize the game state and save it to indexdb. It took a while to figure out how to serialize the entities. I went down a rabbit hole trying to get to work, but it doesn't support wasm-bindgen. I ended up just assuming everything was a player for now. + +I've taken the strategy of "find the hardest problem and work on that until you know you can come back later and clean it up". + +I've been thinking about how I can turn this into an RL training system. I'm pretty excited to try to do that. + +The next hardest thing to me seems to be the server. It seem more complicated to me than it needs to be. This is how I think it should work: + +- The server the game on a loop, anytime the game state changes it will be broadcast to all the clients. +- The server can change either because the game performs an action (like spawning an entity) or because the clients send actions to the server. +But I think there is a problem: If the game sends all of these diffs to the client, it will send an update to the client for every single action. That will be too much since the clients can compute the velocity themselves. + +I think a good solution to this is to have "script actions" that are generated by game scripts. Then the server can mark the scripts whose actions will be sent to the client. +That way it can exclude scripts like "MovePlayer" but include ones like "SpawnCows" and then the client would not use the SpawnCow script. + +I don't think we need to concept of "script actions". The scripts return GameDiffs in there update functions. I can just mark certain scripts to not have their diffs sent to the client. + +This way "actions" are things that are predictable updates that are only made by clients. They can be sent over the wire. Scripts are logic that updates the game state in some way but may or may not be sent to the client. + +Now when we receive an action from a client, we immediately apply it to the game state and send it to everyone. Then in the server update function, we run the game update, and send the diffs to the clients for only the scripts we want. + +The client won't run the SandboxScript. The server will and it will just load chunks around the player. The player renderer then requests the chunks around the player. The render distance should be less than the load distance. So we shouldn't request chunks that aren't loaded. The get chunk logic should likely be moved to a rest endpoint. + +Maybe I can use trpc to have everything be typed. + +The game-service.ts, players.ts, and server-game.ts should all be combined into a single file. + +I made a new SeverGameManager that i smuch much simplier. I'll have to move the game fetching and saving logic somewhere but it is nice. + +I think I want it to be the case that players that aren't online are still entites in the game, they are just not moving. + +That way I don't have to send welcome messages to everyone when they join. (But I still can for an "online" status) that would just need to be handled by the server instead of the engine and the clients would have differnet state. + +Okay, everything is looking better. I haven't tested a thing but I'm going to go to sleep. I need to make a "server-runner" soon that copies a lot of the current runner but has different game scripts and sends actions to the server + ## 05_18_25 This repo is in a messy state. It seems like a a lot of work is needed to clean it up. I think I was refactoring to have all of the entity logic in the rust code instead and I was half way through that. I think I'mm going to make a very simple diff --git a/apps/server/db.ts b/apps/server/db.ts index 462534b..1a6f51a 100644 --- a/apps/server/db.ts +++ b/apps/server/db.ts @@ -1,14 +1,7 @@ -import { IGameMetadata, ISerializedGame } from "@craft/engine"; +import { Game, World } from "@craft/rust-world"; import { Collection, Document, MongoClient } from "mongodb"; -export interface IDbManager { - getAllGameMetadata(): Promise; - getGame(gameId: string): Promise; - saveGame(game: ISerializedGame): Promise; - deleteGame(gameId: string): Promise; -} - -export class DBManager implements IDbManager { +export class GameDb { static async makeClient() { const DB_URL = process.env.DB_URL; if (!DB_URL) { @@ -17,7 +10,7 @@ export class DBManager implements IDbManager { console.log("Connecting to database"); const client = await MongoClient.connect(DB_URL); console.log("Connected to database 🎉"); - return new DBManager(client); + return new GameDb(client); } private gameCollection: Collection; @@ -40,18 +33,49 @@ export class DBManager implements IDbManager { .toArray(); } - getGame(gameId: string): Promise { - return this.gameCollection.findOne({ gameId }); + async getGame(gameId: string): Promise { + const data: ISerializedGame | null = + await this.gameCollection.findOne({ gameId }); + if (!data) { + return null; + } + const world = World.deserialize_wasm(createGameOptions.world); + console.log("world", world); + const entityHolder = EntityHolder.deserialize_wasm( + createGameOptions.entities + ); + console.log("entityHolder", entityHolder); + const game = Game.build( + createGameOptions.gameId, + createGameOptions.name, + world, + entityHolder + ); + return game; } - async saveGame(game: ISerializedGame) { + async saveGame(game: Game) { + const serializedGame = { + gameId: game.id, + name: game.name, + entities: game.serialize_entities_wasm(), + world: game.world.serialize_wasm(), + terrainGen: game.terrainGen.serialize(), + sandbox: game.sandbox, + }; await this.gameCollection.updateOne( - { gameId: game.gameId }, - { $set: game }, + { gameId: game.id }, + { $set: serializedGame }, { upsert: true } ); } + async createGame(): Promise { + const game = Game.new(); + await this.saveGame(game); + return game; + } + async deleteGame(gameId: string) { await this.gameCollection.deleteOne({ gameId }); } diff --git a/apps/server/players.ts b/apps/server/players.ts index f71a4bb..d4c8792 100644 --- a/apps/server/players.ts +++ b/apps/server/players.ts @@ -37,7 +37,7 @@ export default class Players { // send a welcoming message to the new player const welcomeMessage = new SocketMessage(ISocketMessageType.welcome, { uid, - game: this.game.serialize(), + // game: this.game.serialize(), }); this.socketInterface.send(ws, welcomeMessage); @@ -73,8 +73,7 @@ export default class Players { ws.on("close", this.removePlayer.bind(this, ws)); console.log( - `New player! ${uid} ${ - this.game.entities.getActivePlayers().length + `New player! ${uid} ${this.game.entities.getActivePlayers().length } players` ); } diff --git a/apps/server/server-game-manager.ts b/apps/server/server-game-manager.ts new file mode 100644 index 0000000..fac7ce9 --- /dev/null +++ b/apps/server/server-game-manager.ts @@ -0,0 +1,141 @@ +import { + Chunk, + Game, + GameDiff, + SandBoxGScript, + TerrainGenerator, + WasmRequestChunk, +} from "@craft/rust-world"; +import SocketServer from "./socket"; +import WebSocket from "ws"; +import { ISocketMessageType, SocketMessage } from "@craft/engine"; + +type ClientId = string; + +interface ScriptDiff { + scriptName: string; + diff: GameDiff; +} + +class TerrainChunkGetter { + private chunks_to_insert: Chunk[] = []; + public terrianGen: TerrainGenerator; + + constructor(private game: Game) { + this.terrianGen = new TerrainGenerator(0, true, false); + } + + getChunk(chunkPos: { x: number; y: number }) { + const chunk = this.terrianGen.get_chunk(chunkPos.x, chunkPos.y); + this.chunks_to_insert.push(chunk); + } + + update() { + for (const chunk of this.chunks_to_insert) { + this.game.schedule_chunk_insert_wasm(chunk); + } + this.chunks_to_insert = []; + } + + getWasmRequestChunk() { + return new WasmRequestChunk(this.getChunk.bind(this)); + } +} + +export class ServerGameManager { + is_running = false; + clients: Map = new Map(); + scriptsToSendToClients: string[] = []; + timer: NodeJS.Timeout | null = null; + + constructor(private game: Game, private socketInterface: SocketServer) { + const chunkGetter = new TerrainChunkGetter(game); + const sandbox = new SandBoxGScript(1, chunkGetter.getWasmRequestChunk()); + game.add_sandbox_wasm(sandbox); + } + + listenForJoinRequests(ws: WebSocket) { + this.socketInterface.listenTo(ws, (message) => { + if (!message.isType(ISocketMessageType.joinWorld)) { + return; + } + const { worldId, myUid } = message.data; + if (worldId !== this.game.id) { + return; + } + + // send welcome message + this.socketInterface.send( + ws, + new SocketMessage(ISocketMessageType.welcome, { + uid: myUid, + entities: this.game.serialize_entities_wasm(), + }) + ); + + this.listenForPlayerActions(ws, myUid); + + this.clients.set(myUid, ws); + }); + } + + listenForPlayerActions(ws: WebSocket, clientId: ClientId) { + this.socketInterface.listenTo(ws, (message) => { + if (!message.isType(ISocketMessageType.actions)) { + return; + } + const action = message.data; + + this.game.handle_action_wasm(action); + + // send action to all clients (except the one that sent it) + this.clients.forEach((client, uid) => { + if (uid === clientId) { + return; + } + this.socketInterface.send(client, message); + }); + }); + } + + onGameUpdate(diff: GameDiff, scriptName: string): void { + console.log("ServerGameScript: onGameUpdate", diff, scriptName); + + if (this.scriptsToSendToClients.includes(scriptName)) { + for (const client of this.clients.values()) { + this.socketInterface.send( + client, + new SocketMessage(ISocketMessageType.gameDiff, diff) + ); + } + } + } + + update() { + const scriptDiffs: ScriptDiff[] = this.game.update(); + + for (const scriptDiff of scriptDiffs) { + this.onGameUpdate(scriptDiff.diff, scriptDiff.scriptName); + } + } + + start() { + if (this.timer) { + clearInterval(this.timer); + } + this.timer = setInterval(() => { + this.update(); + }, 1000 / 60); + } + + stop() { + if (this.timer) { + clearInterval(this.timer); + this.timer = null; + } + } + + getChunk(chunkPos: { x: number; y: number }): Chunk | ChunkNotLoaded { + return this.game.get_chunk(chunkPos); + } +} diff --git a/apps/server/server-game.ts b/apps/server/server-game.ts index 321aad6..a664527 100644 --- a/apps/server/server-game.ts +++ b/apps/server/server-game.ts @@ -1,9 +1,6 @@ import Players from "./players.js"; import WebSocket from "ws"; import { - Game, - GameAction, - GameStateDiff, ISocketMessageType, MapArray, Vector2D, @@ -13,6 +10,7 @@ import { GameScript, } from "@craft/engine"; import SocketServer from "./socket.js"; +import { Game, GameDiff } from "@craft/rust-world"; export class ServerGameScript extends GameScript { name = "server"; @@ -30,7 +28,9 @@ export class ServerGameScript extends GameScript { this.clients = new Players(game, socketInterface); } - onGameStateDiff(diff: GameStateDiff): void { + scriptsToSendToClients: string[] = []; + + onGameStateDiff(diff: GameDiff): void { const stateDiff = diff.copy(); // Set the config for the game (This is a hack since the config is global) diff --git a/apps/server/server.ts b/apps/server/server.ts index d5481bb..612ed2c 100644 --- a/apps/server/server.ts +++ b/apps/server/server.ts @@ -2,42 +2,71 @@ import express from "express"; import { Request, Response } from "express"; import { WebSocketServer } from "ws"; import cors from "cors"; -import { TerrainGenModule, WorldModule } from "@craft/engine"; import SocketServer from "./socket.js"; -import { GameService } from "./game-service.js"; -import { FileDb } from "./file-db.js"; +import { ServerGameManager } from "./server-game-manager.js"; +import { GameDb } from "./db.js"; const PORT = process.env.PORT ?? 3000; - -const app = express(); - -app.use(cors()); -app.use(express.urlencoded({ extended: false })); -app.use(express.json({ limit: "50mb" })); - const webClientPath = new URL("../../web-client/dist", import.meta.url) .pathname; -console.log("Serving web client, path: ", webClientPath); -app.use(express.static(webClientPath)); -// const db = await DBManager.makeClient(); -const fileDb = new FileDb(); +console.log("Config", { PORT, webClientPath }); + +const app = express(); +const games: Map = new Map(); +const gameDb = await GameDb.makeClient(); const server = app.listen(PORT, () => console.log(`Server running on port ${PORT} 🚀`) ); -const wss = new WebSocketServer({ server }); +const wss = new WebSocketServer({ server }); const socketService = new SocketServer(wss); -await WorldModule.load(); -await TerrainGenModule.load(); +app.use(cors()); +app.use(express.urlencoded({ extended: false })); +app.use(express.json({ limit: "50mb" })); + +app.use(express.static(webClientPath)); -const gameService = new GameService(fileDb, socketService); +app.get("/games", async (_req: Request, res: Response) => { + const gamesMetadata = await gameDb.getAllGameMetadata(); + res.send(gamesMetadata); +}); + +app.post("/game", async (req: Request, res: Response) => { + const game = await gameDb.createGame(); + res.send(game); +}); + +app.post("/game/:id/start", async (req: Request, res: Response) => { + const { id } = req.params; + const localGame = games.get(id); + if (localGame && localGame.is_running) { + res.status(404).send("Game already running"); + return; + } + const game = await gameDb.getGame(id); + if (!game) { + res.status(404).send("Game not found"); + return; + } + const gameManager = new ServerGameManager(game, socketService); + games.set(id, gameManager); + gameManager.start(); + res.send("Game started"); +}); -app.get("/worlds", async (_req: Request, res: Response) => { - const worlds = await gameService.getAllWorlds(); - res.send(worlds); +app.get("/game/:id/chunk/:x/:y", async (req: Request, res: Response) => { + const { id, x, y } = req.params; + const game = games.get(id); + if (!game) { + res.status(404).send("Game not found"); + return; + } + const chunkPos = { x: parseInt(x), y: parseInt(y) }; + const chunk = game.getChunk(chunkPos); + res.send(chunk); }); console.log("Server started"); diff --git a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts index fc4f8d3..e9bdfa6 100644 --- a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts +++ b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts @@ -1,11 +1,6 @@ -import { - CONFIG, - PlayerActionService, - PlayerController, - GameWrapper, -} from "@craft/engine"; +import { CONFIG, PlayerController } from "@craft/engine"; import { WebGlGScript } from "../../game-scripts/webgl-gscript"; -import { Direction } from "@craft/rust-world"; +import { Direction, EntityActionDto } from "@craft/rust-world"; import { CanvasGameScript, PlayerPerspective, @@ -25,13 +20,12 @@ export class KeyboardPlayerEntityController extends PlayerController { private hasJumped = false; constructor( - playerActionService: PlayerActionService, - game: GameWrapper, + handleAction: (action: EntityActionDto) => void, playerId: number, private canvasGScript: CanvasGameScript, webGlGScript: WebGlGScript ) { - super(playerActionService, game, playerId); + super(handleAction, playerId); const webGlCanvas = webGlGScript.eCanvas; diff --git a/apps/web-client/src/controllers/playerControllers/mobileController.ts b/apps/web-client/src/controllers/playerControllers/mobileController.ts index 4670f6e..6e45a9f 100644 --- a/apps/web-client/src/controllers/playerControllers/mobileController.ts +++ b/apps/web-client/src/controllers/playerControllers/mobileController.ts @@ -16,12 +16,8 @@ export class MobileController extends PlayerController { private eUseItemButton = getEleOrError("useItemButton"); private eUseItemButton2 = getEleOrError("useItemButton2"); - constructor( - playerActionService: PlayerActionService, - game: GameWrapper, - playerId: number - ) { - super(playerActionService, game, playerId); + constructor(game: GameWrapper, playerId: number) { + super(game.makeJumpAction, playerId); let lastWindowTouch: Touch; const lastTouchStartPos = new Vector2D([0, 0]); diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 8c8fb8d..1f175e0 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -1,4 +1,4 @@ -import { GameWrapper, PlayerActionService } from "@craft/engine"; +import { GameWrapper } from "@craft/engine"; import { CanvasGameScript } from "./game-scripts/canvas-gscript"; import { WebGlGScript } from "./game-scripts/webgl-gscript"; import { MobileController } from "./controllers/playerControllers/mobileController"; @@ -6,6 +6,7 @@ import { KeyboardPlayerEntityController } from "./controllers/playerControllers/ import { getMyUid, IS_MOBILE } from "./utils"; import { Chunk, + EntityActionDto, SandBoxGScript, TerrainGenerator, WasmRequestChunk, @@ -22,9 +23,7 @@ class SinglePlayerTerrainChunkGetter { } getChunk(chunkPos: { x: number; y: number }) { - console.log("REQUEST CHUNK", chunkPos); const chunk = this.terrianGen.get_chunk(chunkPos.x, chunkPos.y); - console.log("CHUNK", chunk); this.chunks_to_insert.push(chunk); } @@ -39,6 +38,7 @@ class SinglePlayerTerrainChunkGetter { return new WasmRequestChunk(this.getChunk.bind(this)); } } + const spGameService = await ClientDbGamesService.factory(); export async function run(id?: string) { // Start the game @@ -68,8 +68,6 @@ export async function run(id?: string) { const ents = game.getEntities(); console.log("Ents", ents); - const playerActionService = new PlayerActionService(game); - const webglGameScript = new WebGlGScript(game); const canvasGameScript = new CanvasGameScript( @@ -80,13 +78,17 @@ export async function run(id?: string) { game.makeAndAddGameScript(canvasGameScript); + const onAction = (action: EntityActionDto) => { + console.log("ACTION", action); + game.game.handle_action_wasm(action); + }; + const playerController = (() => { if (IS_MOBILE) { - return new MobileController(playerActionService, game, main_player_uid); + return new MobileController(onAction, main_player_uid); } else { return new KeyboardPlayerEntityController( - playerActionService, - game, + onAction, main_player_uid, canvasGameScript, webglGameScript diff --git a/lib/engine/src/playerActions.ts b/lib/engine/src/playerActions.ts index 036a7cb..ef91002 100644 --- a/lib/engine/src/playerActions.ts +++ b/lib/engine/src/playerActions.ts @@ -1,131 +1,36 @@ -import { BlockType, Direction, EntityActionDto } from "@craft/rust-world"; -import { GameWrapper } from "./wrappers.js"; - -// export enum PlayerActionType { -// Jump = "jump", -// PlaceBlock = "placeBlock", -// RemoveBlock = "removeBlock", -// ToggleCreative = "toggleCreative", -// Move = "move", -// Rotate = "rotate", -// SetPos = "setPlayerPos", -// BeltLeft = "playerBeltLeft", -// BeltRight = "playerBeltRight", -// SetBeltIndex = "playerSetBeltIndex", -// PlaceDebugBlock = "placeDebugBlock", -// } - -// interface BasePlayerAction { -// playerUid: string; -// } - -// export interface PlayerActionData -// extends Record { -// [PlayerActionType.Rotate]: { -// playerUid: string; -// playerRot: IDim; -// }; -// [PlayerActionType.Move]: { -// playerUid: string; -// playerRot: IDim; -// directions: Direction[]; -// }; -// [PlayerActionType.SetBeltIndex]: { -// playerUid: string; -// index: number; -// }; -// [PlayerActionType.BeltLeft]: { -// playerUid: string; -// }; -// [PlayerActionType.BeltRight]: { -// playerUid: string; -// }; -// [PlayerActionType.Jump]: { -// playerUid: string; -// }; -// [PlayerActionType.SetPos]: { -// playerUid: string; -// pos: IDim; -// }; -// [PlayerActionType.PlaceBlock]: { -// playerUid: string; -// playerPos: IDim; -// playerRot: IDim; -// }; -// [PlayerActionType.RemoveBlock]: { -// playerUid: string; -// playerPos: IDim; -// playerRot: IDim; -// }; -// [PlayerActionType.PlaceDebugBlock]: { -// playerUid: string; -// }; -// } - -// export type PlayerActionDto = MessageDto; - -// export class PlayerAction extends MessageHolder< -// PlayerActionType, -// PlayerActionData -// > { -// static make(type: T, data: PlayerActionData[T]) { -// return new PlayerAction(type, data); -// } -// } - -export class PlayerActionService { - constructor(private game: GameWrapper) { } - - private playerActions = new Map< - number, - Array<(action: EntityActionDto) => void> - >(); - - addActionListener( - playerId: number, - listener: (action: EntityActionDto) => void - ) { - this.playerActions.set(playerId, [ - ...(this.playerActions.get(playerId) || []), - listener, - ]); - } - - performAction(action: EntityActionDto) { - const entityId = action.entity_id; - this.game.handleAction(action); - - const listeners = this.playerActions.get(entityId); - if (!listeners) { - return; - } - - for (const listener of listeners) { - listener(action); - } - } -} - +import { + Direction, + EntityActionDto, + JumpAction, + MoveAction, + RotateAction, + SphericalRotation, +} from "@craft/rust-world"; export abstract class PlayerController { constructor( - protected playerActionService: PlayerActionService, - protected game: GameWrapper, + protected handleAction: (action: EntityActionDto) => void, protected playerId: number ) { } jump() { - const action = this.game.makeJumpAction(this.playerId); - this.playerActionService.performAction(action); + const action = JumpAction.make_wasm(this.playerId); + this.handleAction(action); } rotate(x: number, y: number) { - const action = this.game.makeRotateAction(this.playerId, x, y); - this.playerActionService.performAction(action); + const rotDiff = SphericalRotation.new_wasm(x, y); + const action = RotateAction.make_wasm(this.playerId, rotDiff); + this.handleAction(action); } move(direction: Direction | "None") { - const action = this.game.makeMoveAction(this.playerId, direction); - this.playerActionService.performAction(action); + let action: EntityActionDto; + if (direction === "None") { + action = MoveAction.make_wasm(this.playerId, undefined); + } else { + action = MoveAction.make_wasm(this.playerId, direction); + } + this.handleAction(action); } beltRight() { @@ -173,73 +78,3 @@ export abstract class PlayerController { // this.playerActionService.performAction(action); } } - -// const handlePlayerAction = ( -// game: Game, -// player: Player, -// action: PlayerAction -// ) => { -// // console.log("Handling player action", player, action); -// if (action.isType(PlayerActionType.Rotate)) { -// const { playerRot } = action.data; -// player.rot = new Vector3D(playerRot); -// return; -// } - -// if (action.isType(PlayerActionType.Jump)) { -// player.tryJump(); -// return; -// } - -// if (action.isType(PlayerActionType.PlaceBlock)) { -// const { playerPos, playerRot } = action.data; -// player.pos = new Vector3D(playerPos); -// player.rot = new Vector3D(playerRot); -// player.doPrimaryAction(game); -// return; -// } - -// if (action.isType(PlayerActionType.RemoveBlock)) { -// const { playerPos, playerRot } = action.data; -// player.pos = new Vector3D(playerPos); -// player.rot = new Vector3D(playerRot); -// player.doSecondaryAction(game); -// return; -// } - -// if (action.isType(PlayerActionType.SetPos)) { -// const { pos } = action.data; -// player.pos = new Vector3D(pos); -// return; -// } - -// if (action.isType(PlayerActionType.Move)) { -// const { directions, playerRot } = action.data; -// // TODO this might be unnecessary -// player.rot = new Vector3D(playerRot); -// player.moveDirections = directions; -// } - -// if (action.isType(PlayerActionType.BeltLeft)) { -// player.belt.moveLeft(); -// } - -// if (action.isType(PlayerActionType.BeltRight)) { -// player.belt.moveRight(); -// } - -// if (action.isType(PlayerActionType.SetBeltIndex)) { -// const { index } = action.data; -// player.belt.setIndex(index); -// } - -// if (action.isType(PlayerActionType.PlaceDebugBlock)) { -// const pos = player.pos.floor(); -// const cube = CubeHelpers.createCube(BlockType.Gold, pos); -// game.placeBlock(cube); -// } - -// if (action.isType(PlayerActionType.ToggleCreative)) { -// player.setCreative(!player.creative); -// } -// }; diff --git a/lib/engine/src/socket-types.ts b/lib/engine/src/socket-types.ts index 775fcca..38042a5 100644 --- a/lib/engine/src/socket-types.ts +++ b/lib/engine/src/socket-types.ts @@ -1,4 +1,8 @@ -import { IConfig } from "./config.js"; +import { + EntityActionDto, + GameDiff, + SerializedEntityHolder, +} from "@craft/rust-world"; export interface MessageDto< MESSAGE extends string, @@ -9,7 +13,7 @@ export interface MessageDto< } export class MessageHolder> { - constructor(public type: T, public data: DATA[T]) {} + constructor(public type: T, public data: DATA[T]) { } getDto() { return { @@ -25,21 +29,19 @@ export class MessageHolder> { export enum ISocketMessageType { // from client - getChunk = "getChunk", // server sends setChunk - newWorld = "newWorld", // server sends welcome - saveWorld = "saveWorld", - // this could be for joining an existing world or starting up an old one - joinWorld = "joinWorld", // server sends welcome or worldNotFound + joinWorld = "joinWorld", + // from server welcome = "welcome", - worldNotFound = "worldNotFound", gameDiff = "gameDiff", - setChunk = "setChunk", - newPlayer = "newPlayer", - playerLeave = "playerLeave", - // both + + // from both actions = "actions", - playerActions = "playerActions", +} + +export interface WelcomeMessage { + uid: string; + entities: SerializedEntityHolder; } export interface SocketMessageData extends Record { @@ -47,39 +49,11 @@ export interface SocketMessageData extends Record { myUid: string; worldId: string; }; - [ISocketMessageType.newWorld]: { - myUid: string; - config: IConfig; - name: string; - }; - [ISocketMessageType.saveWorld]: { - worldId: string; - }; - [ISocketMessageType.getChunk]: { - pos: string; - }; - // [ISocketMessageType.welcome]: ISocketWelcomePayload; - // [ISocketMessageType.worldNotFound]: {}; - // [ISocketMessageType.setChunk]: { - // pos: string; - // data: ISerializedChunk; - // }; - // [ISocketMessageType.newPlayer]: { - // uid: string; - // }; - // [ISocketMessageType.playerLeave]: { - // uid: string; - // }; - // [ISocketMessageType.gameDiff]: GameDiffDto; - // [ISocketMessageType.actions]: GameActionDto; - // [ISocketMessageType.playerActions]: PlayerActionDto; + [ISocketMessageType.actions]: EntityActionDto; + [ISocketMessageType.gameDiff]: GameDiff; + [ISocketMessageType.welcome]: WelcomeMessage; } -// export interface ISocketWelcomePayload { -// uid: string; -// game: ISerializedGame; -// } - export type SocketMessageDto = MessageDto< ISocketMessageType, SocketMessageData diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index 2ce1e1a..a26cea4 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -164,11 +164,6 @@ export class GameWrapper { return WorldWasm.MoveAction.make_wasm(entityId, direction); } - handleAction(action: WorldWasm.EntityActionDto) { - console.log("Handling action", action); - this.game.handle_action_wasm(action); - } - getChunkPosFromChunkId(chunkId: number): Vector2D { const data: { x: number; y: number } = this.game.get_chunk_pos_from_id_wasm( BigInt(chunkId) diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 4032af7..b30b2c3 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ed9dba8590e31543788bfc17c0133c32c7392d110ecceadd1bb939c97dab8f3","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"92a6d9ecf01687af0717791bb759b4d5dda1f5bf3bb2fe42cc84a676c84bc7e3","signature":"4f48136f62e31e14fc95e3d2183d8d39f1ba9b1b58c4f4e5b8a150122608ecc2","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"901a35f8241affd10fa2f1309df2baa8c8393813ab84a6a4446d29c32f40799f","signature":"1db4d0c03f34ec1e9f7ed486dad9680d92be6b13d5acfd8ea2fc53f06e93bb62","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"a307dbe63bccfaf0051a8db0274573021be08fdc0df2f62a2344d74ebdedc3e6","signature":"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,52,110],[49,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,6],[56,7],[55,3],[50,3],[52,8],[47,3],[60,9],[58,3],[63,10],[59,9],[61,11],[62,9],[119,12],[120,3],[118,13],[121,13],[122,3],[127,14],[131,15],[132,16],[133,3],[134,17],[123,3],[64,18],[65,18],[67,19],[68,20],[69,21],[70,22],[71,23],[72,24],[73,25],[74,26],[75,27],[76,28],[77,28],[79,29],[78,30],[80,29],[81,31],[82,32],[66,33],[116,3],[83,34],[84,35],[85,36],[117,37],[86,38],[87,39],[88,40],[89,41],[90,42],[91,43],[92,44],[93,45],[94,46],[95,47],[96,47],[97,48],[98,49],[100,50],[99,51],[101,52],[102,53],[103,54],[104,55],[105,56],[106,57],[107,58],[108,59],[109,60],[110,61],[111,62],[112,63],[113,64],[114,65],[115,66],[135,3],[126,3],[125,3],[140,67],[136,3],[139,68],[141,69],[142,3],[138,3],[143,3],[168,70],[169,71],[144,72],[147,72],[166,70],[167,70],[157,70],[156,73],[154,70],[149,70],[162,70],[160,70],[164,70],[148,70],[161,70],[165,70],[150,70],[151,70],[163,70],[145,70],[152,70],[153,70],[155,70],[159,70],[170,74],[158,70],[146,70],[183,75],[182,3],[177,74],[179,76],[178,74],[171,74],[172,74],[174,74],[176,74],[180,76],[181,76],[173,76],[175,76],[124,77],[130,78],[128,79],[129,80],[184,3],[185,3],[186,81],[187,82],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"802632c9a974600df6f8e82d0f2ef48763ba6a906887fc4635abec0b872660f8","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"e639190424481c5a3716c3e110be4cc1e05bdaf41806b3cb6f53f1e923229ffd","signature":"036ee024fea1deea040d8575af84613e50f49a1471f542661bf8b08bc034857b","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"9d753cf4da10fa33fc6e471508fe977ec860cac1f6ed4ebaababb006d54e3a04","signature":"3c709283e60c19e1441d18062b5e1a3ebdd27e3125a9f26fd98629b916fb7827","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"593635e3e424d75672480c96c26a5fc84db7500caa1807e7d8e1bd6f182ffa3f","signature":"ce1a008a84a18da075d43ca51a8820245457f2debcb5a9fd946d09e78b967bb4","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,1],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[119,10],[120,3],[118,11],[121,11],[122,3],[127,12],[131,13],[132,14],[133,3],[134,15],[123,3],[64,16],[65,16],[67,17],[68,18],[69,19],[70,20],[71,21],[72,22],[73,23],[74,24],[75,25],[76,26],[77,26],[79,27],[78,28],[80,27],[81,29],[82,30],[66,31],[116,3],[83,32],[84,33],[85,34],[117,35],[86,36],[87,37],[88,38],[89,39],[90,40],[91,41],[92,42],[93,43],[94,44],[95,45],[96,45],[97,46],[98,47],[100,48],[99,49],[101,50],[102,51],[103,52],[104,53],[105,54],[106,55],[107,56],[108,57],[109,58],[110,59],[111,60],[112,61],[113,62],[114,63],[115,64],[135,3],[126,3],[125,3],[140,65],[136,3],[139,66],[141,67],[142,3],[138,3],[143,3],[168,68],[169,69],[144,70],[147,70],[166,68],[167,68],[157,68],[156,71],[154,68],[149,68],[162,68],[160,68],[164,68],[148,68],[161,68],[165,68],[150,68],[151,68],[163,68],[145,68],[152,68],[153,68],[155,68],[159,68],[170,72],[158,68],[146,68],[183,73],[182,3],[177,72],[179,74],[178,72],[171,72],[172,72],[174,72],[176,72],[180,74],[181,74],[173,74],[175,74],[124,75],[130,76],[128,77],[129,78],[184,3],[185,3],[186,79],[187,80],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"semanticDiagnosticsPerFile":[[52,[{"start":2188,"length":10,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'WasmPlayer'.","category":1,"code":2694},{"start":4836,"length":10,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'WasmPlayer'.","category":1,"code":2694},{"start":5152,"length":10,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'WasmPlayer'.","category":1,"code":2694}]]],"affectedFilesPendingEmit":[48,53,51,57,54,56,52],"emitSignatures":[[52,"4f48136f62e31e14fc95e3d2183d8d39f1ba9b1b58c4f4e5b8a150122608ecc2"],[54,"1db4d0c03f34ec1e9f7ed486dad9680d92be6b13d5acfd8ea2fc53f06e93bb62"],[56,"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb"]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 730c4bb..2536426 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -142,6 +142,7 @@ impl Game { } #[derive(Clone, Serialize, Deserialize)] +#[wasm_bindgen(getter_with_clone)] pub struct GameDiff { pub updated_entities: Vec, pub updated_chunks: Vec, From 899f67afce3a7f23673d8d95f9926b37a4a55da1 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Wed, 21 May 2025 00:08:20 -0700 Subject: [PATCH 22/61] WIP for mp games. added server runner script that handles the logic --- .vscode/settings.json | 10 +- DEVLOG.md | 10 + apps/server/db.ts | 11 + apps/server/server-game-manager.ts | 4 + apps/server/server.ts | 16 +- apps/web-client/src/services/api-service.ts | 10 - .../src/services/mp-games-service.ts | 202 ++++------- .../src/services/sp-games-service.ts | 45 +-- lib/engine/game.ts | 321 ------------------ lib/engine/src/socket-types.ts | 9 +- lib/engine/src/wrappers.ts | 48 ++- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/engine/types.ts | 1 - 13 files changed, 174 insertions(+), 515 deletions(-) delete mode 100644 lib/engine/game.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 009ea62..3393e0f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,9 +12,6 @@ "wasd" ], "typescript.tsdk": ".yarn/sdks/typescript/lib", - "files.exclude": { - // "bin/": true - }, "rust-analyzer.linkedProjects": ["lib/world/Cargo.toml"], "search.exclude": { "**/node_modules": true, @@ -26,5 +23,10 @@ }, "editor.suggestSelection": "first", "eslint.nodePath": ".yarn/sdks", - "typescript.enablePromptUseWorkspaceTsdk": true + "editor.defaultFormatter": "dbaeumer.vscode-eslint", + + "typescript.enablePromptUseWorkspaceTsdk": true, + "[typescript]": { + "editor.defaultFormatter": "dbaeumer.vscode-eslint" + } } diff --git a/DEVLOG.md b/DEVLOG.md index 2665b9f..a42cdf0 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,3 +1,13 @@ +# 05_21_25 + +I've worked on making the server runner. I'm relizing it doesn't make a lot of sense to serpatate out the sp-game-serivce and the runner. The cut between them isn't that clean. I will just make two different runners and then see what logic I need to abstract to make a good UI. + +I've been thinking about the chunk flow. The server will be loading chunks with its sandbox game script, the client will also being doing this, but the client requests the chunks from the server instead of the terrain gen. This means the client could request a chunk too soon, but I shoudl probalby just load all the chunks around a player before they join? Maybe I can send them updates via sockets about what the server is doing. + +I need to bring back fun loading spinners + +Also the game shoudl have the property of chunkRequestor, not the client. The sandbox script shoudl be renamed to "loadchunksaroundentity" script and returns load requests to the game. The game then calls the request function on all chunks that the scripts returned, then the client will get from the server and give them to the local game and it will insert the chunks one by one. + ## 05_19_25 We now can serialize the game state and save it to indexdb. It took a while to figure out how to serialize the entities. I went down a rabbit hole trying to get to work, but it doesn't support wasm-bindgen. I ended up just assuming everything was a player for now. diff --git a/apps/server/db.ts b/apps/server/db.ts index 1a6f51a..f82cecb 100644 --- a/apps/server/db.ts +++ b/apps/server/db.ts @@ -54,6 +54,17 @@ export class GameDb { return game; } + async getSerializedGame(gameId: string): Promise { + return await this.gameCollection.findOne({ gameId }); + } + + async getGameMetadata(gameId: string): Promise<{ name: string } | null> { + return await this.gameCollection.findOne<{ name: string }>( + { gameId }, + { projection: { name: 1 } } + ); + } + async saveGame(game: Game) { const serializedGame = { gameId: game.id, diff --git a/apps/server/server-game-manager.ts b/apps/server/server-game-manager.ts index fac7ce9..0fd125a 100644 --- a/apps/server/server-game-manager.ts +++ b/apps/server/server-game-manager.ts @@ -138,4 +138,8 @@ export class ServerGameManager { getChunk(chunkPos: { x: number; y: number }): Chunk | ChunkNotLoaded { return this.game.get_chunk(chunkPos); } + + getOnlinePlayers(): number { + return this.clients.size; + } } diff --git a/apps/server/server.ts b/apps/server/server.ts index 612ed2c..8762c08 100644 --- a/apps/server/server.ts +++ b/apps/server/server.ts @@ -5,6 +5,7 @@ import cors from "cors"; import SocketServer from "./socket.js"; import { ServerGameManager } from "./server-game-manager.js"; import { GameDb } from "./db.js"; +import { IGameMetadata } from "@craft/engine"; const PORT = process.env.PORT ?? 3000; const webClientPath = new URL("../../web-client/dist", import.meta.url) @@ -31,7 +32,20 @@ app.use(express.static(webClientPath)); app.get("/games", async (_req: Request, res: Response) => { const gamesMetadata = await gameDb.getAllGameMetadata(); - res.send(gamesMetadata); + + const gameInfos: (IGameMetadata & { + isRunning: boolean; + onlinePlayers: number; + })[] = gamesMetadata.map((gameMetadata) => { + const game = games.get(gameMetadata.gameId); + return { + ...gameMetadata, + isRunning: game ? game.is_running : false, + onlinePlayers: game ? game.getOnlinePlayers() : 0, + }; + }); + + res.send(gameInfos); }); app.post("/game", async (req: Request, res: Response) => { diff --git a/apps/web-client/src/services/api-service.ts b/apps/web-client/src/services/api-service.ts index 948f7f3..e532f6c 100644 --- a/apps/web-client/src/services/api-service.ts +++ b/apps/web-client/src/services/api-service.ts @@ -1,13 +1,3 @@ import { IGameMetadata } from "@craft/engine"; -import { AppConfig } from "../appConfig"; - -export class ApiServiceClass { - constructor(private baseUrl = AppConfig.api.baseUrl) {} - - async getWorlds(): Promise { - const response = await fetch(`${this.baseUrl}/worlds`); - return await response.json(); - } -} export const ApiService = new ApiServiceClass(); diff --git a/apps/web-client/src/services/mp-games-service.ts b/apps/web-client/src/services/mp-games-service.ts index fd63223..910eb80 100644 --- a/apps/web-client/src/services/mp-games-service.ts +++ b/apps/web-client/src/services/mp-games-service.ts @@ -1,166 +1,100 @@ import { - IGameMetadata, - ISocketWelcomePayload, - ICreateGameOptions, - Game, - GameAction, + deserializeChunk, + ISerializedChunk, + ISerializedGame, + IServerGameMetadata, ISocketMessageType, - PlayerAction, + serializedGameToGame, SocketMessage, - IGamesService, - IContructGameOptions, } from "@craft/engine"; import { SocketListener } from "../socket"; -import { SocketInterface, getMyUid } from "../app"; -import { ApiService } from "../services/api-service"; -import { GameScript } from "@craft/engine/game-script"; -import { BasicGScript } from "../game-scripts/basic-gscript"; +import { SocketInterface } from "../app"; +import { ISocketWelcomePayload } from "@craft/engine/types"; +import { AppConfig } from "../appConfig"; +import { Game, SandBoxGScript, WasmRequestChunk } from "@craft/rust-world"; -export class NetworkGamesService implements IGamesService { - private async waitForWelcomeMessage() { - let listener: SocketListener | null = null; - const welcomeMessage: ISocketWelcomePayload | null = await new Promise( - (resolve) => { - listener = (message) => { - if (message.isType(ISocketMessageType.welcome)) { - resolve(message.data); - } else if (message.isType(ISocketMessageType.worldNotFound)) { - resolve(null); - console.error("Requested world not found"); - } - }; - SocketInterface.addListener(listener); - } - ); - SocketInterface.removeListener(listener!); - return welcomeMessage; - } - - private async buildGame(constructGame: IContructGameOptions) { - const gameSaver = { - save: async (game: Game) => { - this.saveGame(game); - }, - }; +async function serverRunner() { + const baseUrl = AppConfig.api.baseUrl; - const game = Game.make(constructGame, gameSaver); - - const basic = game.addGameScript(BasicGScript); - game.addGameScript(ServerSideGameScript, basic); - - return game; + async function getAllGames(): Promise { + const response = await fetch(`${baseUrl}/worlds`); + return await response.json(); } - public async createGame(options: ICreateGameOptions): Promise { - SocketInterface.send( - SocketMessage.make(ISocketMessageType.newWorld, { - myUid: getMyUid(), - ...options, - }) - ); - - console.log("Creating world"); - - const welcomeMessage = await this.waitForWelcomeMessage(); - - if (!welcomeMessage) { - throw new Error("Server didn't create the world"); - } - - console.log("Welcome Message", welcomeMessage); + async function createGame(name: string): Promise { + const response = await fetch(`${baseUrl}/game`, { + method: "POST", + body: JSON.stringify({ name }), + }); + const serializedGame: ISerializedGame = await response.json(); + return serializedGameToGame(serializedGame); + } - return this.buildGame(welcomeMessage.game); + async function startGame(gameId: string): Promise { + await fetch(`${baseUrl}/game/${gameId}/start`, { + method: "POST", + }); } - public async getGame(gameId: string): Promise { + async function joinGame(gameId: string): Promise { SocketInterface.send( - SocketMessage.make(ISocketMessageType.joinWorld, { - worldId: gameId, - myUid: getMyUid(), - }) + SocketMessage.make(ISocketMessageType.joinWorld, undefined) ); - const welcomeMessage = await this.waitForWelcomeMessage(); + const welcomeMessage = await waitForWelcomeMessage(); if (!welcomeMessage) { - return null; + throw new Error("Server didn't create the world"); } - - return this.buildGame(welcomeMessage.game); - } - - public async getAllGames(): Promise { - return await ApiService.getWorlds(); } - // we might not have to send the data to the server here. Just tell the server that we want to save and it will - // use its local copy of the game to save - public async saveGame(gameData: Game): Promise { - SocketInterface.send( - SocketMessage.make(ISocketMessageType.saveWorld, { - worldId: gameData.gameId, - }) + async function waitForWelcomeMessage() { + let listener: SocketListener | null = null; + const welcomeMessage: ISocketWelcomePayload | null = await new Promise( + (resolve) => { + listener = (message) => { + if (message.isType(ISocketMessageType.welcome)) { + resolve(message.data); + } else if (message.isType(ISocketMessageType.failedToJoin)) { + resolve(null); + console.error("Requested world not found"); + } + }; + SocketInterface.addListener(listener); + } ); + SocketInterface.removeListener(listener!); + return welcomeMessage; } - public async deleteGame(_gameId: string) { - // TO-DO implement this (REST) - } -} + const gameId = "1"; -export class ServerSideGameScript extends GameScript { - name = "server-side"; + await joinGame(gameId); - debug = true; + const game = new Game(); + const chunksToInsert: ISerializedChunk[] = []; - constructor(game: Game, private basic: BasicGScript) { - super(game); - } - - setup() { - console.log("Setting up ServerSideGameScript"); - SocketInterface.addListener(this.onSocketMessage.bind(this)); + const getChunk = async (chunkPos: { x: number; y: number }) => { + fetch(`${baseUrl}/game/${gameId}/chunk/${chunkPos.x}/${chunkPos.y}`) + .then((data) => data.json()) + .then((chunk) => { + chunksToInsert.push(chunk); + }); + }; - this.basic.playerActionService.addActionListener( - this.basic.mainPlayer.uid, - this.onPlayerAction.bind(this) - ); - } + const chunkRequester = new WasmRequestChunk(getChunk); - onGameAction(action: GameAction) { - if (this.debug) { - console.log("Sending game action", action); - } - SocketInterface.send( - SocketMessage.make(ISocketMessageType.actions, action.getDto()) - ); - } + // add sandbox + const sandbox = new SandBoxGScript(1, chunkRequester); + game.add_sandbox_wasm(sandbox); - onPlayerAction(action: PlayerAction) { - if (this.debug) { - console.log("Sending player action", action); + const gameLoop = async () => { + const chunkToInsert = chunksToInsert.pop(); + if (chunkToInsert) { + const chunk = deserializeChunk(chunkToInsert); + game.schedule_chunk_insert_wasm(chunk); } - SocketInterface.send( - SocketMessage.make(ISocketMessageType.playerActions, action.getDto()) - ); - } - - private onSocketMessage(message: SocketMessage) { - console.log("MP: Got message", message); - const mainPlayer = this.basic.mainPlayer; - const playerActionService = this.basic.playerActionService; - if (message.isType(ISocketMessageType.gameDiff)) { - this.game.handleStateDiff(message.data); - } else if (message.isType(ISocketMessageType.playerActions)) { - if (message.data.data.playerUid === mainPlayer.uid) return; - - const playerAction = new PlayerAction( - message.data.type, - message.data.data - ); - - playerActionService.performAction(playerAction); - } - } + game.update(); + }; } diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index 9e54cd7..89b6e52 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -1,24 +1,10 @@ -import { ISerializedEntities } from "@craft/engine/entities/entityHolder"; -import { ICreateGameOptions, IGameMetadata } from "@craft/engine/game"; -import { IConfig } from "@craft/engine/src/config"; -import { GameWrapper, ISerializedWorld } from "@craft/engine/src/wrappers"; +import { IGameMetadata } from "@craft/engine/game"; import { - EntityHolder, - Game, - SandBoxGScript, - SerializedEntityHolder, - TerrainGenerator, - World, -} from "@craft/rust-world"; - -export interface ISerializedGame { - gameId: string; - name: string; - entities: SerializedEntityHolder; - world: World; - terrainGen: TerrainGenerator; - sandbox: SandBoxGScript; -} + GameWrapper, + ISerializedGame, + serializedGameToGame, +} from "@craft/engine/src/wrappers"; +import { TerrainGenerator } from "@craft/rust-world"; export class ClientDbGamesService { private static WORLDS_OBS = "worlds"; @@ -56,27 +42,14 @@ export class ClientDbGamesService { return new ClientDbGamesService(db); } - private constructor(private db: IDBDatabase) { } + private constructor(private db: IDBDatabase) {} newGame(): GameWrapper { return GameWrapper.makeGame(); } createGame(createGameOptions: ISerializedGame): GameWrapper { - console.log("createGameOptions", createGameOptions); - const world = World.deserialize_wasm(createGameOptions.world); - console.log("world", world); - const entityHolder = EntityHolder.deserialize_wasm( - createGameOptions.entities - ); - console.log("entityHolder", entityHolder); - const game = Game.build( - createGameOptions.gameId, - createGameOptions.name, - world, - entityHolder - ); - + const game = serializedGameToGame(createGameOptions); return new GameWrapper(game); } @@ -163,7 +136,7 @@ export class ClientDbGamesService { }; const objStore = transaction.objectStore(ClientDbGamesService.WORLDS_OBS); - const result = objStore.put(serializedGame); + objStore.put(serializedGame); }); } diff --git a/lib/engine/game.ts b/lib/engine/game.ts deleted file mode 100644 index f032662..0000000 --- a/lib/engine/game.ts +++ /dev/null @@ -1,321 +0,0 @@ -import { Player } from "./entities/player/player.js"; -import { ISerializedWorld, World } from "./world/world.js"; -import { CONFIG, IConfig, setConfig } from "./src/config.js"; -import { EntityHolder, ISerializedEntities } from "./entities/entityHolder.js"; -import { Random } from "./utils/random.js"; -import { GameActionHandler, GameAction } from "./gameActions.js"; -import { GameStateDiff, GameDiffDto } from "./gameStateDiff.js"; -import CubeHelpers, { Cube } from "./entities/cube.js"; -import { - Entity, - EntityDto, - getChunkId, - ISerializedChunk, -} from "./src/index.js"; -import { GameScript } from "./src/game-script.js"; -import { GameWrapper } from "./modules.js"; - -export interface ISerializedGame { - name: string; - config: IConfig; - gameId: string; - entities?: ISerializedEntities; - world?: ISerializedWorld; -} - -export interface IGameMetadata { - gameId: string; - name: string; -} - -export type IContructGameOptions = Omit & { - gameId?: string; -}; - -export interface IChunkReader { - getChunk(chunkPos: string): Promise; -} - -export interface IGameSaver { - save(game: Game): Promise; -} - -// Receives client actions from somewhere. -// Generate dirty entities and dirty chunks. -export class Game { - public stateDiff: GameStateDiff; - private gameActionHandler: GameActionHandler; - private gameScripts: GameScript[] = []; - - static make(dto: IContructGameOptions, gameSaver: IGameSaver) { - const world = World.make(dto.world); - const entities = new EntityHolder(dto.entities); - const gameId = dto.gameId || Math.random().toString().slice(2, 10); - return new Game(gameId, dto.name, dto.config, entities, world, gameSaver); - } - - constructor( - public gameId: string, - public name: string, - public config: IConfig, - public entities: EntityHolder, - public world: World, - private gameSaver: IGameSaver - ) { - Random.setSeed(this.config.seed); - this.stateDiff = new GameStateDiff(this); - this.gameActionHandler = new GameActionHandler(this); - - setConfig({ - ...CONFIG, - ...this.config, - }); - } - - public serialize(): ISerializedGame { - return { - config: CONFIG, - entities: this.entities.serialize(), - world: this.world.serialize(), - gameId: this.gameId, - name: this.name, - }; - } - - public addGameScript( - script: new (game: GameWrapper, ...args: Args) => T, - ...args: Args - ): T { - const s = new script(this, ...args); - this.gameScripts.push(s); - return s; - } - - public getGameScript( - script: new (game: GameWrapper, ...args: Args) => T - ): T { - for (const s of this.gameScripts) { - if (s instanceof script) { - return s; - } - } - - throw new Error("Script not found"); - } - - public getScriptActions(): GameScript[] { - const scriptsWithActions = []; - for (const s of this.gameScripts) { - if (s.actions || s.config) { - scriptsWithActions.push(s); - } - } - return scriptsWithActions; - } - - public async setupScripts() { - for (const script of this.gameScripts) { - await script.setup?.(); - } - } - - // This could maybe be a game script - public startTimer() { - let lastTime = 0; - const update = () => { - const now = Date.now(); - const diff = now - lastTime; - lastTime = now; - - // Idk if this is still needed - if (diff > 100) { - console.log("Skipping update, time diff is too large", diff); - return; - } - this.update(diff); - }; - - setInterval(update, 1000 / 40); - } - - public update(delta: number) { - this.entities.update(this, this.world, delta); - - for (const script of this.gameScripts) { - script.update?.(delta); - } - - for (const script of this.gameScripts) { - script.onGameStateDiff?.(this.stateDiff); - } - - this.stateDiff.clear(); - } - - /** This happens on a fast loop. Mark things that change as dirty */ - public handleAction(action: GameAction) { - this.gameActionHandler.handle(action); - for (const script of this.gameScripts) { - script.onGameAction?.(action); - } - } - - /** Currently only sent by server. Will quickly update the state of the game */ - public handleStateDiff(stateDiff: GameDiffDto) { - // Might not have to do this because the updating below will append the updates - this.stateDiff.appendDto(stateDiff); - - console.log("Handling State Diff", stateDiff); - if (stateDiff.chunks.update) { - const updates = stateDiff.chunks.update; - for (const update of updates) { - this.upsertChunk(update, { updateState: false }); - } - } - - if (stateDiff.entities?.add) { - const adds = stateDiff.entities.add; - for (const add of adds) { - const ent = this.entities.createEntity(add); - this.addEntity(ent, { updateState: false }); - } - } - - if (stateDiff.entities.update) { - const updates = stateDiff.entities.update; - for (const update of updates) { - this.updateEntity(update, { updateState: false }); - } - } - - if (stateDiff.entities.remove) { - const removes = stateDiff.entities.remove; - for (const removeId of removes) { - this.removeEntity(this.entities.get(removeId), { updateState: false }); - } - } - } - - upsertChunk( - chunk: ISerializedChunk, - opts: { updateState: boolean } = { updateState: true } - ) { - console.log("Game: Upserting chunk", chunk, opts); - - const chunkId = getChunkId(chunk); - - this.world.updateChunk(chunk); - if (opts.updateState) { - this.stateDiff.updateChunk(chunkId); - } - - for (const script of this.gameScripts) { - script.onChunkUpdate?.(chunkId); - } - } - - placeBlock( - cube: Cube, - opts: { updateState: boolean } = { updateState: true } - ) { - console.log("Game: Adding block", cube); - - // Check if an entity is in the way - // Soon we will move this to rust - for (const entity of this.entities.iterable()) { - if (CubeHelpers.isPointInsideOfCube(cube, entity.pos)) { - console.log("Not adding block, entity in the way"); - return; - } - } - - const updatedChunks = this.world.addBlock(cube); - if (opts.updateState) { - for (const chunkId of updatedChunks) { - this.stateDiff.updateChunk(chunkId); - for (const script of this.gameScripts) { - script.onChunkUpdate?.(chunkId); - } - } - } - } - - removeBlock( - cube: Cube, - opts: { updateState: boolean } = { updateState: true } - ) { - console.log("Game: Removing block", cube); - const updatedChunks = this.world.removeBlock(cube.pos); - if (opts.updateState) { - for (const chunkId of updatedChunks) { - this.stateDiff.updateChunk(chunkId); - for (const script of this.gameScripts) { - script.onChunkUpdate?.(chunkId); - } - } - } - } - - addPlayer( - uid: string, - opts: { updateState: boolean } = { updateState: true } - ): Player { - console.log("Game: Adding player", uid); - - const player = this.entities.createOrGetPlayer(uid); - if (opts.updateState) { - this.stateDiff.updateEntity(player.uid); - } - for (const script of this.gameScripts) { - script.onNewEntity?.(player); - } - return player; - } - - addEntity( - entity: Entity, - opts: { updateState: boolean } = { updateState: true } - ) { - console.log("Game: Adding entity", entity); - this.entities.add(entity); - - if (opts.updateState) { - this.stateDiff.updateEntity(entity.uid); - } - - for (const script of this.gameScripts) { - script.onNewEntity?.(entity); - } - } - - updateEntity( - entity: EntityDto, - opts: { updateState: boolean } = { updateState: true } - ) { - console.log("Game: Updating entity", entity); - this.entities.updateEntity(entity); - if (opts.updateState) { - this.stateDiff.updateEntity(entity.uid); - } - } - - removeEntity( - entity: Entity, - opts: { updateState: boolean } = { updateState: true } - ) { - console.log("Game: Removing entity", entity); - this.entities.remove(entity.uid); - - if (opts.updateState) { - this.stateDiff.removeEntity(entity.uid); - } - - for (const script of this.gameScripts) { - script.onRemovedEntity?.(entity); - } - } - - async save() { - await this.gameSaver.save(this); - } -} diff --git a/lib/engine/src/socket-types.ts b/lib/engine/src/socket-types.ts index 38042a5..c5c0724 100644 --- a/lib/engine/src/socket-types.ts +++ b/lib/engine/src/socket-types.ts @@ -13,7 +13,7 @@ export interface MessageDto< } export class MessageHolder> { - constructor(public type: T, public data: DATA[T]) { } + constructor(public type: T, public data: DATA[T]) {} getDto() { return { @@ -32,6 +32,7 @@ export enum ISocketMessageType { joinWorld = "joinWorld", // from server + failedToJoin = "failedToJoin", welcome = "welcome", gameDiff = "gameDiff", @@ -45,10 +46,8 @@ export interface WelcomeMessage { } export interface SocketMessageData extends Record { - [ISocketMessageType.joinWorld]: { - myUid: string; - worldId: string; - }; + [ISocketMessageType.joinWorld]: void; + [ISocketMessageType.failedToJoin]: void; [ISocketMessageType.actions]: EntityActionDto; [ISocketMessageType.gameDiff]: GameDiff; [ISocketMessageType.welcome]: WelcomeMessage; diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index a26cea4..71a4f1b 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -2,9 +2,53 @@ import * as WorldWasm from "@craft/rust-world"; import { Vector2D, Vector3D } from "./vector.js"; import { Camera } from "./camera.js"; import { GameScript } from "./game-script.js"; -import { World } from "@craft/rust-world"; +import { + SandBoxGScript, + TerrainGenerator, + SerializedEntityHolder, + World, + Game, + EntityHolder, +} from "@craft/rust-world"; export * as WorldModuleTypes from "@craft/rust-world"; +export interface IServerGameMetadata { + gameId: string; + name: string; + isRunning: boolean; + onlinePlayers: number; +} + +export interface ISerializedGame { + gameId: string; + name: string; + entities: SerializedEntityHolder; + world: World; + terrainGen: TerrainGenerator; + sandbox: SandBoxGScript; +} + +export interface IGameMetadata { + gameId: string; + name: string; +} + +export const serializedGameToGame = (serializedGame: ISerializedGame): Game => { + const world = World.deserialize_wasm(serializedGame.world); + const entityHolder = EntityHolder.deserialize_wasm(serializedGame.entities); + const game = Game.build( + serializedGame.gameId, + serializedGame.name, + world, + entityHolder + ); + return game; +}; + +export const deserializeChunk = (chunk: ISerializedChunk): WorldWasm.Chunk => { + return WorldWasm.Chunk.deserialize(chunk); +}; + export interface ISerializedChunk { position: { x: number; @@ -125,7 +169,7 @@ export class BlockWrapper { } export class GameWrapper { - constructor(public game: WorldWasm.Game) { } + constructor(public game: WorldWasm.Game) {} static makeGame(): GameWrapper { const game = new WorldWasm.Game(); diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index b30b2c3..3efc838 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"802632c9a974600df6f8e82d0f2ef48763ba6a906887fc4635abec0b872660f8","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"e639190424481c5a3716c3e110be4cc1e05bdaf41806b3cb6f53f1e923229ffd","signature":"036ee024fea1deea040d8575af84613e50f49a1471f542661bf8b08bc034857b","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"9d753cf4da10fa33fc6e471508fe977ec860cac1f6ed4ebaababb006d54e3a04","signature":"3c709283e60c19e1441d18062b5e1a3ebdd27e3125a9f26fd98629b916fb7827","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"593635e3e424d75672480c96c26a5fc84db7500caa1807e7d8e1bd6f182ffa3f","signature":"ce1a008a84a18da075d43ca51a8820245457f2debcb5a9fd946d09e78b967bb4","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,1],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[119,10],[120,3],[118,11],[121,11],[122,3],[127,12],[131,13],[132,14],[133,3],[134,15],[123,3],[64,16],[65,16],[67,17],[68,18],[69,19],[70,20],[71,21],[72,22],[73,23],[74,24],[75,25],[76,26],[77,26],[79,27],[78,28],[80,27],[81,29],[82,30],[66,31],[116,3],[83,32],[84,33],[85,34],[117,35],[86,36],[87,37],[88,38],[89,39],[90,40],[91,41],[92,42],[93,43],[94,44],[95,45],[96,45],[97,46],[98,47],[100,48],[99,49],[101,50],[102,51],[103,52],[104,53],[105,54],[106,55],[107,56],[108,57],[109,58],[110,59],[111,60],[112,61],[113,62],[114,63],[115,64],[135,3],[126,3],[125,3],[140,65],[136,3],[139,66],[141,67],[142,3],[138,3],[143,3],[168,68],[169,69],[144,70],[147,70],[166,68],[167,68],[157,68],[156,71],[154,68],[149,68],[162,68],[160,68],[164,68],[148,68],[161,68],[165,68],[150,68],[151,68],[163,68],[145,68],[152,68],[153,68],[155,68],[159,68],[170,72],[158,68],[146,68],[183,73],[182,3],[177,72],[179,74],[178,72],[171,72],[172,72],[174,72],[176,72],[180,74],[181,74],[173,74],[175,74],[124,75],[130,76],[128,77],[129,78],[184,3],[185,3],[186,79],[187,80],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"semanticDiagnosticsPerFile":[[52,[{"start":2188,"length":10,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'WasmPlayer'.","category":1,"code":2694},{"start":4836,"length":10,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'WasmPlayer'.","category":1,"code":2694},{"start":5152,"length":10,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'WasmPlayer'.","category":1,"code":2694}]]],"affectedFilesPendingEmit":[48,53,51,57,54,56,52],"emitSignatures":[[52,"4f48136f62e31e14fc95e3d2183d8d39f1ba9b1b58c4f4e5b8a150122608ecc2"],[54,"1db4d0c03f34ec1e9f7ed486dad9680d92be6b13d5acfd8ea2fc53f06e93bb62"],[56,"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb"]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"802632c9a974600df6f8e82d0f2ef48763ba6a906887fc4635abec0b872660f8","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"670dc41693b0b9774ef315bc71f7f69721e515da562a0791475657245c84bfc0","signature":"e07cf21d9a24c52c2a49d5d1652c28b1c3c8bdf8391952bc00ddfe4b8aaa2198","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"9d753cf4da10fa33fc6e471508fe977ec860cac1f6ed4ebaababb006d54e3a04","signature":"3c709283e60c19e1441d18062b5e1a3ebdd27e3125a9f26fd98629b916fb7827","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"dd99ed842600c6bab2a9224fe71b829e758edfff2c103a49fb994e3ab1241fe2","signature":"2d1903199cc2f98172a787571d0f49fb3f184d6219678ab99da366ed78fe4c68","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,1],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[119,10],[120,3],[118,11],[121,11],[122,3],[127,12],[131,13],[132,14],[133,3],[134,15],[123,3],[64,16],[65,16],[67,17],[68,18],[69,19],[70,20],[71,21],[72,22],[73,23],[74,24],[75,25],[76,26],[77,26],[79,27],[78,28],[80,27],[81,29],[82,30],[66,31],[116,3],[83,32],[84,33],[85,34],[117,35],[86,36],[87,37],[88,38],[89,39],[90,40],[91,41],[92,42],[93,43],[94,44],[95,45],[96,45],[97,46],[98,47],[100,48],[99,49],[101,50],[102,51],[103,52],[104,53],[105,54],[106,55],[107,56],[108,57],[109,58],[110,59],[111,60],[112,61],[113,62],[114,63],[115,64],[135,3],[126,3],[125,3],[140,65],[136,3],[139,66],[141,67],[142,3],[138,3],[143,3],[168,68],[169,69],[144,70],[147,70],[166,68],[167,68],[157,68],[156,71],[154,68],[149,68],[162,68],[160,68],[164,68],[148,68],[161,68],[165,68],[150,68],[151,68],[163,68],[145,68],[152,68],[153,68],[155,68],[159,68],[170,72],[158,68],[146,68],[183,73],[182,3],[177,72],[179,74],[178,72],[171,72],[172,72],[174,72],[176,72],[180,74],[181,74],[173,74],[175,74],[124,75],[130,76],[128,77],[129,78],[184,3],[185,3],[186,79],[187,80],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"semanticDiagnosticsPerFile":[[52,[{"start":3137,"length":10,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'WasmPlayer'.","category":1,"code":2694},{"start":5784,"length":10,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'WasmPlayer'.","category":1,"code":2694},{"start":6100,"length":10,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'WasmPlayer'.","category":1,"code":2694}]]],"affectedFilesPendingEmit":[48,53,51,57,54,56,52],"emitSignatures":[[52,"4f48136f62e31e14fc95e3d2183d8d39f1ba9b1b58c4f4e5b8a150122608ecc2"],[54,"1db4d0c03f34ec1e9f7ed486dad9680d92be6b13d5acfd8ea2fc53f06e93bb62"],[56,"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb"]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file diff --git a/lib/engine/types.ts b/lib/engine/types.ts index bdd91be..d8cc410 100644 --- a/lib/engine/types.ts +++ b/lib/engine/types.ts @@ -112,7 +112,6 @@ export interface SocketMessageData extends Record { export interface ISocketWelcomePayload { uid: string; - game: ISerializedGame; } export type SocketMessageDto = MessageDto< From 5cc1c80dcb0d18659dfc3250cc43b519b25c9a40 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sat, 24 May 2025 15:13:57 -0700 Subject: [PATCH 23/61] Server is sending chunks and accepting player actions --- .vscode/settings.json | 1 + apps/server/db.ts | 28 +- apps/server/file-db.ts | 3 +- apps/server/game-service.ts | 151 - apps/server/players.ts | 128 - apps/server/server-game-manager.ts | 53 +- apps/server/server-game.ts | 137 - apps/server/server.ts | 2 +- apps/web-client/index.html | 7 +- apps/web-client/package.json | 3 +- apps/web-client/public/app.css | 1 - apps/web-client/src/App.tsx | 19 + apps/web-client/src/app.ts | 2 - apps/web-client/src/components/GameView.tsx | 49 + apps/web-client/src/components/HomePage.tsx | 73 + .../src/game-scripts/canvas-gscript.ts | 31 +- apps/web-client/src/game-scripts/hudRender.ts | 2 +- .../src/game-scripts/webgl-gscript.ts | 7 +- apps/web-client/src/index.tsx | 10 + apps/web-client/src/runner.ts | 4 +- .../src/services/mp-games-service.ts | 128 +- .../src/services/sp-games-service.ts | 2 +- lib/engine/src/game-script.ts | 3 +- lib/engine/src/socket-types.ts | 11 +- lib/engine/src/wrappers.ts | 15 +- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/engine/types.ts | 4 - lib/world/src/chunk/chunk_mesh.rs | 15 +- lib/world/src/direction.rs | 17 +- lib/world/src/entities/entity.rs | 1 + lib/world/src/entities/entity_action.rs | 46 +- lib/world/src/entities/game.rs | 17 +- lib/world/src/entities/player.rs | 2 +- lib/world/src/entities/player_rot_script.rs | 10 +- lib/world/src/geometry/vec2.rs | 58 +- lib/world/src/positions.rs | 4 + lib/world/src/world/mod.rs | 1 + yarn.lock | 5991 +++++++++-------- 38 files changed, 3852 insertions(+), 3186 deletions(-) delete mode 100644 apps/server/game-service.ts delete mode 100644 apps/server/players.ts delete mode 100644 apps/server/server-game.ts create mode 100644 apps/web-client/src/App.tsx create mode 100644 apps/web-client/src/components/GameView.tsx create mode 100644 apps/web-client/src/components/HomePage.tsx create mode 100644 apps/web-client/src/index.tsx diff --git a/.vscode/settings.json b/.vscode/settings.json index 3393e0f..bbeb372 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,6 +6,7 @@ "gravitable", "mult", "toolbelt", + "Tsify", "tylercraft", "upsert", "vecs", diff --git a/apps/server/db.ts b/apps/server/db.ts index f82cecb..d858839 100644 --- a/apps/server/db.ts +++ b/apps/server/db.ts @@ -1,4 +1,9 @@ -import { Game, World } from "@craft/rust-world"; +import { + IGameMetadata, + ISerializedGame, + serializedGameToGame, +} from "@craft/engine"; +import { Game } from "@craft/rust-world"; import { Collection, Document, MongoClient } from "mongodb"; export class GameDb { @@ -16,7 +21,7 @@ export class GameDb { private gameCollection: Collection; private constructor(private client: MongoClient) { - this.gameCollection = this.client.db("games").collection("games"); + this.gameCollection = this.client.db("tylercraft").collection("games"); } getAllGameMetadata(): Promise { @@ -39,18 +44,7 @@ export class GameDb { if (!data) { return null; } - const world = World.deserialize_wasm(createGameOptions.world); - console.log("world", world); - const entityHolder = EntityHolder.deserialize_wasm( - createGameOptions.entities - ); - console.log("entityHolder", entityHolder); - const game = Game.build( - createGameOptions.gameId, - createGameOptions.name, - world, - entityHolder - ); + const game = serializedGameToGame(data); return game; } @@ -71,8 +65,8 @@ export class GameDb { name: game.name, entities: game.serialize_entities_wasm(), world: game.world.serialize_wasm(), - terrainGen: game.terrainGen.serialize(), - sandbox: game.sandbox, + // terrainGen: game.terrainGen.serialize(), + // sandbox: game.sandbox, }; await this.gameCollection.updateOne( { gameId: game.id }, @@ -82,7 +76,7 @@ export class GameDb { } async createGame(): Promise { - const game = Game.new(); + const game = new Game(); await this.saveGame(game); return game; } diff --git a/apps/server/file-db.ts b/apps/server/file-db.ts index dca4420..ca0f467 100644 --- a/apps/server/file-db.ts +++ b/apps/server/file-db.ts @@ -1,5 +1,4 @@ import { IGameMetadata, ISerializedGame } from "@craft/engine"; -import { IDbManager } from "./db"; import fs from "fs"; const DATA_DIR = process.env.DATA_DIR || "./game-data/"; @@ -7,7 +6,7 @@ if (!fs.existsSync(DATA_DIR)) { fs.mkdirSync(DATA_DIR); } -export class FileDb implements IDbManager { +export class FileDb { getAllGameMetadata(): Promise { const gameFiles = fs.readdirSync(DATA_DIR); return Promise.resolve( diff --git a/apps/server/game-service.ts b/apps/server/game-service.ts deleted file mode 100644 index b12f5ed..0000000 --- a/apps/server/game-service.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { - Game, - ICreateGameOptions, - ISerializedGame, - ISocketMessageType, - SandboxGScript, - SocketMessage, - setConfig, -} from "@craft/engine"; -import { ServerGameScript } from "./server-game.js"; -import Websocket from "ws"; -import { IDbManager } from "./db.js"; -import SocketServer from "./socket.js"; - -export class TimerRunner { - private lastTime = Date.now(); - - constructor(private game: Game) { - setInterval(this.update.bind(this), 1000 / 40); - } - - update() { - const now = Date.now(); - const diff = now - this.lastTime; - // if we leave the tab for a long time delta gets very big, and the play falls out of the world. - // I'm just going to make them not move for now, but I need to remove make the system more tollerant of large deltas - if (diff > 100) { - console.log("Skipping update, time diff is too large", diff); - this.lastTime = now; - return; - } - this.game.update(diff); - this.lastTime = now; - } -} - -export class GameService { - private games: Map = new Map(); - - constructor( - private dbManager: IDbManager, - private socketInterface: SocketServer - ) { - this.socketInterface.listenForConnection((ws: Websocket) => { - this.socketInterface.listenTo(ws, (message) => { - this.handleSocketMessage(message, ws) - .then(() => void 0) - .catch((e) => { - console.log("Error handling socket message", message, e); - }); - }); - }); - } - - private async buildGame( - id: string, - options: ICreateGameOptions | ISerializedGame - ): Promise { - const gameSaver = { - save: async (game: Game) => { - await this.dbManager.saveGame(game.serialize()); - }, - }; - - const game = Game.make(options, gameSaver); - - game.addGameScript(ServerGameScript, this.socketInterface); - - game.addGameScript(SandboxGScript); - - await game.setupScripts(); - - console.log("Starting game", id, game.stateDiff.get()); - - new TimerRunner(game); - - this.games.set(id, game); - - return game; - } - - async handleSocketMessage(message: SocketMessage, ws: Websocket) { - if (message.isType(ISocketMessageType.joinWorld)) { - const { worldId, myUid } = message.data; - console.log("Got join world message", worldId, myUid); - - const game = await this.getWorld(worldId); - if (!game) { - console.log("That world doesn't exist", worldId); - - this.socketInterface.send( - ws, - new SocketMessage(ISocketMessageType.worldNotFound, {}) - ); - - return; - } - - const serverGameScript = game.getGameScript(ServerGameScript); - - // this function sends a welcome message to the client - serverGameScript.addSocket(myUid, ws); - } else if (message.isType(ISocketMessageType.newWorld)) { - const payload = message.data; - const game = await this.createGame(payload); - const serverGameScript = game.getGameScript(ServerGameScript); - console.log("Create Id: ", game.gameId); - serverGameScript.addSocket(payload.myUid, ws); - } else if (message.isType(ISocketMessageType.saveWorld)) { - const payload = message.data; - const game = this.games.get(payload.worldId); - if (!game) { - console.log("That world doesn't exist", payload); - return; - } - await this.dbManager.saveGame(game.serialize()); - } - } - - async getWorld(gameId: string): Promise { - console.log("Getting game", gameId); - - const foundGame = this.games.get(gameId); - if (foundGame) { - console.log("Found game in memory"); - return foundGame; - } - - const dbGame = await this.dbManager.getGame(gameId); - if (!dbGame) { - console.log("Game not found"); - return null; - } - - return this.buildGame(gameId, dbGame); - } - - async getAllWorlds() { - return this.dbManager.getAllGameMetadata(); - } - - async createGame(options: ICreateGameOptions): Promise { - console.log("Creating game with options", options); - - setConfig(options.config); - - const id = String(Math.random()); - - return this.buildGame(id, options); - } -} diff --git a/apps/server/players.ts b/apps/server/players.ts deleted file mode 100644 index d4c8792..0000000 --- a/apps/server/players.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { - Game, - GameStateDiff, - ISocketMessageType, - Player, - PlayerAction, - PlayerActionService, - SocketMessage, -} from "@craft/engine"; -import WebSocket from "ws"; -import SocketServer from "./socket"; - -export default class Players { - players: Map = new Map(); - - private playerActionsService: PlayerActionService; - - constructor(public game: Game, private socketInterface: SocketServer) { - this.playerActionsService = new PlayerActionService(this.game); - } - - getSockets(): WebSocket[] { - return Array.from(this.players.keys()); - } - - sendMessageToAll(message: SocketMessage, exclude?: WebSocket) { - console.log("Sending message to all", message); - for (const socket of this.players.keys()) { - if (exclude && socket === exclude) continue; - this.socketInterface.send(socket, message); - } - } - - addPlayer(uid: string, ws: WebSocket): void { - // generate a random ID for the new player - - // send a welcoming message to the new player - const welcomeMessage = new SocketMessage(ISocketMessageType.welcome, { - uid, - // game: this.game.serialize(), - }); - this.socketInterface.send(ws, welcomeMessage); - - const player = this.game.addPlayer(uid); - - // add them to the SYSTEM - this.players.set(ws, player); - - // listen for changes from the player - const listener = (message: SocketMessage) => { - if (message.isType(ISocketMessageType.playerActions)) { - const playerAction = new PlayerAction( - message.data.type, - message.data.data - ); - this.onPlayerAction(ws, playerAction); - } - }; - this.socketInterface.listenTo(ws, listener); - - const gameDiff = new GameStateDiff(this.game); - gameDiff.addEntity(uid); - - console.log("Alerting about new guy"); - - // tell Everyone about the new guy - this.sendMessageToAll( - new SocketMessage(ISocketMessageType.gameDiff, gameDiff.get()), - ws - ); - - // If they leave, KILL THEM - ws.on("close", this.removePlayer.bind(this, ws)); - - console.log( - `New player! ${uid} ${this.game.entities.getActivePlayers().length - } players` - ); - } - - removePlayer(ws: WebSocket): void { - const player = this.players.get(ws); - - if (!player) { - return; - } - - const gameDiff = new GameStateDiff(this.game); - gameDiff.removeEntity(player.uid); - - // tell everyone about this tragedy - this.sendMessageToAll( - new SocketMessage(ISocketMessageType.gameDiff, gameDiff.get()), - ws - ); - - console.log( - "Player left", - player.uid, - this.game.entities.getActivePlayers().length - ); - - // FINISH THEM! - this.game.entities.removePlayer(player.uid); - this.players.delete(ws); - - console.log( - `Remove Player! ${this.game.entities.getActivePlayers().length} players` - ); - } - - onPlayerAction(ws: WebSocket, playerAction: PlayerAction) { - const player = this.players.get(ws); - if (!player) { - return; - } - this.playerActionsService.performAction(playerAction); - - // tell everyone about the new action - this.sendMessageToAll( - new SocketMessage( - ISocketMessageType.playerActions, - playerAction.getDto() - ), - ws - ); - } -} diff --git a/apps/server/server-game-manager.ts b/apps/server/server-game-manager.ts index 0fd125a..065a953 100644 --- a/apps/server/server-game-manager.ts +++ b/apps/server/server-game-manager.ts @@ -1,16 +1,19 @@ import { Chunk, + ChunkNotLoadedError, + EntityActionJson, Game, GameDiff, SandBoxGScript, TerrainGenerator, + Vec2i16, WasmRequestChunk, } from "@craft/rust-world"; import SocketServer from "./socket"; import WebSocket from "ws"; import { ISocketMessageType, SocketMessage } from "@craft/engine"; -type ClientId = string; +type ClientId = number; interface ScriptDiff { scriptName: string; @@ -26,6 +29,7 @@ class TerrainChunkGetter { } getChunk(chunkPos: { x: number; y: number }) { + console.log("Getting chunk", chunkPos); const chunk = this.terrianGen.get_chunk(chunkPos.x, chunkPos.y); this.chunks_to_insert.push(chunk); } @@ -47,23 +51,34 @@ export class ServerGameManager { clients: Map = new Map(); scriptsToSendToClients: string[] = []; timer: NodeJS.Timeout | null = null; + chunkGetter: TerrainChunkGetter; constructor(private game: Game, private socketInterface: SocketServer) { - const chunkGetter = new TerrainChunkGetter(game); - const sandbox = new SandBoxGScript(1, chunkGetter.getWasmRequestChunk()); + this.chunkGetter = new TerrainChunkGetter(game); + const sandbox = new SandBoxGScript( + 1, + this.chunkGetter.getWasmRequestChunk() + ); game.add_sandbox_wasm(sandbox); + + this.socketInterface.listenForConnection((ws) => { + this.listenForJoinRequests(ws); + }); } listenForJoinRequests(ws: WebSocket) { this.socketInterface.listenTo(ws, (message) => { + console.log("Socket message from client", message); if (!message.isType(ISocketMessageType.joinWorld)) { return; } - const { worldId, myUid } = message.data; - if (worldId !== this.game.id) { + const { gameId, myUid } = message.data; + if (gameId !== this.game.id) { return; } + this.game.make_and_add_player_wasm(myUid); + // send welcome message this.socketInterface.send( ws, @@ -81,12 +96,19 @@ export class ServerGameManager { listenForPlayerActions(ws: WebSocket, clientId: ClientId) { this.socketInterface.listenTo(ws, (message) => { + console.log("Socket message from client", JSON.stringify(message)); if (!message.isType(ISocketMessageType.actions)) { return; } const action = message.data; - this.game.handle_action_wasm(action); + const actionDto = EntityActionJson.deserialize_wasm( + action.entity_id, + action.name, + action.data + ); + + this.game.handle_action_wasm(actionDto); // send action to all clients (except the one that sent it) this.clients.forEach((client, uid) => { @@ -112,14 +134,17 @@ export class ServerGameManager { } update() { - const scriptDiffs: ScriptDiff[] = this.game.update(); + this.game.update(); + this.chunkGetter.update(); - for (const scriptDiff of scriptDiffs) { - this.onGameUpdate(scriptDiff.diff, scriptDiff.scriptName); - } + // const scriptDiffs: ScriptDiff[] = this.game.update(); + // for (const scriptDiff of scriptDiffs) { + // this.onGameUpdate(scriptDiff.diff, scriptDiff.scriptName); + // } } start() { + console.log("Starting game", this.game.id); if (this.timer) { clearInterval(this.timer); } @@ -135,8 +160,12 @@ export class ServerGameManager { } } - getChunk(chunkPos: { x: number; y: number }): Chunk | ChunkNotLoaded { - return this.game.get_chunk(chunkPos); + getChunk(chunkPos: { x: number; y: number }): { + Ok: Chunk; + Err: ChunkNotLoadedError; + } { + const chunkPosWasm = new Vec2i16(chunkPos.x, chunkPos.y); + return this.game.get_chunk_wasm(chunkPosWasm); } getOnlinePlayers(): number { diff --git a/apps/server/server-game.ts b/apps/server/server-game.ts deleted file mode 100644 index a664527..0000000 --- a/apps/server/server-game.ts +++ /dev/null @@ -1,137 +0,0 @@ -import Players from "./players.js"; -import WebSocket from "ws"; -import { - ISocketMessageType, - MapArray, - Vector2D, - SocketMessage, - setConfig, - ISerializedChunk, - GameScript, -} from "@craft/engine"; -import SocketServer from "./socket.js"; -import { Game, GameDiff } from "@craft/rust-world"; - -export class ServerGameScript extends GameScript { - name = "server"; - - public clients: Players; - public actionMap: MapArray = new MapArray(); - - constructor(game: Game, private socketInterface: SocketServer) { - super(game); - // Remove all players since none are connected yet - game.entities.removeAllPlayers(); - - setConfig(game.config); - - this.clients = new Players(game, socketInterface); - } - - scriptsToSendToClients: string[] = []; - - onGameStateDiff(diff: GameDiff): void { - const stateDiff = diff.copy(); - - // Set the config for the game (This is a hack since the config is global) - setConfig(this.game.config); - - // Send the initial state diff to all clients - // This state diff has no client sent actions so it should - // only be passive things (An entity spawning) - if (stateDiff.hasData()) { - console.log("Sending initial diff"); - this.clients.sendMessageToAll( - new SocketMessage(ISocketMessageType.gameDiff, stateDiff.get()) - ); - } - - stateDiff.clear(); - - // Run through each client's actions and save the combined state diff - // from the other client's actions. Combining them lets us send all client - // updates as one socket message. - - // Set the initial state diff for each client - const clientDiffs = new Map(); - for (const ws of this.clients.getSockets()) { - clientDiffs.set(ws, stateDiff.copy()); - } - - if (this.actionMap.size > 0) { - for (const actions of this.actionMap.values()) { - console.log("Actions", actions); - } - } - - for (const [ws, actions] of this.actionMap.entries()) { - stateDiff.clear(); - - // Handle all the actions. The new diff should only have updates - // for the player who made them and chunk they might have affected - for (const action of actions) { - this.game.handleAction(action); - } - - console.log("Diff after actions", stateDiff.get()); - - // Append the diff to all clients but the one that sent the actions - this.clients - .getSockets() - .filter((s) => s !== ws) - .forEach((s) => { - clientDiffs.get(s)?.append(stateDiff); - }); - } - - // Send the combined state diff to all clients - for (const [ws, diff] of clientDiffs.entries()) { - if (diff.hasData()) { - const diffData = diff.get(); - console.log("Sending diff", diffData); - this.socketInterface.send( - ws, - new SocketMessage(ISocketMessageType.gameDiff, diffData) - ); - } - } - - this.actionMap.clear(); - } - - private async sendChunkTo(chunkPosString: string, ws: WebSocket) { - // Set the config for the game (This is a hack since the config is global) - setConfig(this.game.config); - const world = this.game.world; - console.log("ServerGame: Sending chunk to player: ", chunkPosString); - const chunkPos = Vector2D.fromIndex(chunkPosString); - let chunk: ISerializedChunk | null = null; - if (world.hasChunk(chunkPos)) { - chunk = world.getChunkFromPos(chunkPos); - } else { - // chunk = await world.loadChunk(chunkPos); - } - if (!chunk) throw new Error("Chunk wasn't found"); - this.socketInterface.send( - ws, - new SocketMessage(ISocketMessageType.setChunk, { - pos: chunkPosString, - data: chunk, - }) - ); - } - - addSocket(uid: string, ws: WebSocket): void { - this.clients.addPlayer(uid, ws); - - this.socketInterface.listenTo(ws, (message) => { - console.log("Got Message", message); - if (message.isType(ISocketMessageType.actions)) { - const gameAction = new GameAction(message.data.type, message.data.data); - this.actionMap.append(ws, gameAction); - } else if (message.isType(ISocketMessageType.getChunk)) { - this.sendChunkTo(message.data.pos, ws); - } - }); - } -} diff --git a/apps/server/server.ts b/apps/server/server.ts index 8762c08..952db64 100644 --- a/apps/server/server.ts +++ b/apps/server/server.ts @@ -50,7 +50,7 @@ app.get("/games", async (_req: Request, res: Response) => { app.post("/game", async (req: Request, res: Response) => { const game = await gameDb.createGame(); - res.send(game); + res.send(game.id); }); app.post("/game/:id/start", async (req: Request, res: Response) => { diff --git a/apps/web-client/index.html b/apps/web-client/index.html index 5b040b9..d22157d 100644 --- a/apps/web-client/index.html +++ b/apps/web-client/index.html @@ -3,12 +3,15 @@ - + - + +
+ + \ No newline at end of file diff --git a/apps/web-client/package.json b/apps/web-client/package.json index 5d68e6a..2e9aef0 100644 --- a/apps/web-client/package.json +++ b/apps/web-client/package.json @@ -12,7 +12,8 @@ "@craft/engine": "1.0.0", "gl-matrix": "2.4.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-router-dom": "^6.8.0" }, "devDependencies": { "@craft/eslint-config-tylercraft": "^1.0.0", diff --git a/apps/web-client/public/app.css b/apps/web-client/public/app.css index 44f3d42..d1fd37a 100644 --- a/apps/web-client/public/app.css +++ b/apps/web-client/public/app.css @@ -23,7 +23,6 @@ html, body { margin: 0px; padding: 0px; - overflow: hidden; font-family: "Roboto", sans-serif; } diff --git a/apps/web-client/src/App.tsx b/apps/web-client/src/App.tsx new file mode 100644 index 0000000..5267225 --- /dev/null +++ b/apps/web-client/src/App.tsx @@ -0,0 +1,19 @@ +import React from "react"; +import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; +import HomePage from "./components/HomePage"; +import GameView from "./components/GameView"; + +function App() { + return ( + +
+ + } /> + } /> + +
+
+ ); +} + +export default App; diff --git a/apps/web-client/src/app.ts b/apps/web-client/src/app.ts index 914bda1..b7a1d02 100644 --- a/apps/web-client/src/app.ts +++ b/apps/web-client/src/app.ts @@ -41,8 +41,6 @@ const LoadingScreen = { ePlayLocalButton.addEventListener("click", showLocalWorldPicker); ePlayOnlineButton.addEventListener("click", showOnlineWorldPicker); -export const SocketInterface = new SocketHandler(); - // Screens: // Start diff --git a/apps/web-client/src/components/GameView.tsx b/apps/web-client/src/components/GameView.tsx new file mode 100644 index 0000000..95d1474 --- /dev/null +++ b/apps/web-client/src/components/GameView.tsx @@ -0,0 +1,49 @@ +import React, { useState } from "react"; +import { useParams, useNavigate } from "react-router-dom"; +import { startGame, serverRunner } from "../services/mp-games-service"; + +function GameView() { + const { gameId } = useParams<{ gameId: string }>(); + const navigate = useNavigate(); + const [isJoined, setIsJoined] = useState(false); + + if (!gameId) { + return
No game ID provided
; + } + + function joinGame(gameId: string) { + serverRunner(gameId); + setIsJoined(true); + } + + if (isJoined) { + return
; + } + + return ( +
+ +

Game {gameId}

+
+ + +
+
+ ); +} + +export default GameView; diff --git a/apps/web-client/src/components/HomePage.tsx b/apps/web-client/src/components/HomePage.tsx new file mode 100644 index 0000000..ec0328a --- /dev/null +++ b/apps/web-client/src/components/HomePage.tsx @@ -0,0 +1,73 @@ +import { IServerGameMetadata } from "@craft/engine"; +import React, { useEffect, useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { createGame, getAllGames } from "../services/mp-games-service"; + +function HomePage() { + const [games, setGames] = useState([]); + const [loading, setLoading] = useState(true); + const navigate = useNavigate(); + + const createGameWrapper = async (gameId: string) => { + console.log("Starting game", gameId); + const game = await createGame(gameId); + navigate(`/game/${game}`); + }; + + useEffect(() => { + getAllGames().then((games) => { + setGames(games); + setLoading(false); + }); + }, []); + + if (loading) { + return
Loading...
; + } + + return ( +
+

TylerCraft Games

+
+

Existing Games

+ {games.length > 0 ? ( +
+ {games.map((game) => ( +
+ {game.name} + +
+ ))} +
+ ) : ( +

No games available

+ )} +
+
+

Create New Game

+ +
+
+ ); +} + +export default HomePage; diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index 06c4b41..a5645a0 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -14,7 +14,7 @@ import { import { WebGlGScript } from "./webgl-gscript"; import { Renderer } from "../renders/renderer"; import { ChunkRenderer } from "../renders/chunkRender"; -import { BlockType } from "@craft/rust-world"; +import { BlockType, Game } from "@craft/rust-world"; import { PlayerRenderer } from "../renders/playerRender"; type Config = { @@ -52,8 +52,10 @@ export class CanvasGameScript extends GameScript { totTime = 0; pastDeltas: number[] = []; + gameWrapper: GameWrapper = new GameWrapper(this.game); + constructor( - game: GameWrapper, + game: Game, private webGlGScript: WebGlGScript, private mainPlayerId: number ) { @@ -66,12 +68,12 @@ export class CanvasGameScript extends GameScript { }); // Create renderers for initial entities - for (const entity of this.game.getEntities()) { + for (const entity of this.gameWrapper.getEntities()) { this.onNewEntity(entity); } // Create renderers for initial chunks - for (const chunkId of this.game.getLoadedChunkIds()) { + for (const chunkId of this.gameWrapper.getLoadedChunkIds()) { this.onChunkUpdate(chunkId); } @@ -79,7 +81,7 @@ export class CanvasGameScript extends GameScript { } getCamera(): Camera { - const player = this.game.getPlayer(this.mainPlayerId); + const player = this.gameWrapper.getPlayer(this.mainPlayerId); if (this.webGlGScript.isXr) { return makeXRCamera(player); } else { @@ -105,7 +107,7 @@ export class CanvasGameScript extends GameScript { } for (const entityId of this.lastDiff.updated_entities) { - const entity = this.game.getPlayer(entityId); + const entity = this.gameWrapper.getPlayer(entityId); this.onNewEntity(entity); } @@ -116,7 +118,7 @@ export class CanvasGameScript extends GameScript { getFilter(camera: Camera): Vector3D { const shiftedDown = camera.pos.sub(new Vector3D([0, 0.5, 0])); - const block = this.game.getBlock(shiftedDown); + const block = this.gameWrapper.getBlock(shiftedDown); if (block?.type === BlockType.Water) { return new Vector3D([0, 0.3, 1]); @@ -140,8 +142,8 @@ export class CanvasGameScript extends GameScript { this.perspective === PlayerPerspective.FirstPerson ? PlayerPerspective.ThirdPersonBack : this.perspective === PlayerPerspective.ThirdPersonBack - ? PlayerPerspective.ThirdPersonFront - : PlayerPerspective.FirstPerson; + ? PlayerPerspective.ThirdPersonFront + : PlayerPerspective.FirstPerson; return this.perspective !== PlayerPerspective.FirstPerson; } @@ -192,12 +194,12 @@ export class CanvasGameScript extends GameScript { const realRenderDistance = this.config.chunkSize * this.config.renderDistance; - const cameraChunkPos = this.game.getChunkPosFromWorldPos(camera.pos); + const cameraChunkPos = this.gameWrapper.getChunkPosFromWorldPos(camera.pos); // const cameraRotNorm = camera.rot.toCartesianCoords().normalize(); const renderChunk = (chunkPos: Vector2D) => { - const chunkId = this.game.getChunkIdFromChunkPos(chunkPos); + const chunkId = this.gameWrapper.getChunkIdFromChunkPos(chunkPos); const chunkRenderer = this.chunkRenderers.get(chunkId); if (!chunkRenderer) { return; @@ -220,7 +222,8 @@ export class CanvasGameScript extends GameScript { ) { const indexVec = new Vector2D([i, j]); const chunkPos = cameraChunkPos.add(indexVec); - const chunkWorldPos = this.game.getWorldPosFromChunkPos(chunkPos); + const chunkWorldPos = + this.gameWrapper.getWorldPosFromChunkPos(chunkPos); const chunkXYPos = new Vector2D([ chunkWorldPos.get(0), chunkWorldPos.get(2), @@ -309,8 +312,8 @@ export class CanvasGameScript extends GameScript { onChunkUpdate(chunkId: number): void { console.log("CanvasGameScript: Updating chunk", chunkId); - const chunkPos = this.game.getChunkPosFromChunkId(chunkId); - const chunkMesh = this.game.getChunkMeshFromChunkPos(chunkId); + const chunkPos = this.gameWrapper.getChunkPosFromChunkId(chunkId); + const chunkMesh = this.gameWrapper.getChunkMeshFromChunkPos(chunkId); const chunkRenderer = new ChunkRenderer( this.webGlGScript, chunkPos, diff --git a/apps/web-client/src/game-scripts/hudRender.ts b/apps/web-client/src/game-scripts/hudRender.ts index e4a0acf..4c79bb8 100644 --- a/apps/web-client/src/game-scripts/hudRender.ts +++ b/apps/web-client/src/game-scripts/hudRender.ts @@ -42,7 +42,7 @@ export class HudGScript extends GameScript { this.eHud.style.visibility = "visible"; this.textureImg = document.createElement("img"); - this.textureImg.src = "./img/texture_map.png"; + this.textureImg.src = "/img/texture_map.png"; document.body.appendChild(this.textureImg); const getCanvasDimensions = () => { diff --git a/apps/web-client/src/game-scripts/webgl-gscript.ts b/apps/web-client/src/game-scripts/webgl-gscript.ts index 137e3af..6e4d5e2 100644 --- a/apps/web-client/src/game-scripts/webgl-gscript.ts +++ b/apps/web-client/src/game-scripts/webgl-gscript.ts @@ -9,6 +9,7 @@ import type { import { mat4 } from "gl-matrix"; import VertexShader from "../../shaders/vertex.glsl?raw"; import FragmentShader from "../../shaders/fragment.glsl?raw"; +import { Game } from "@craft/rust-world"; const WebGlLayer = (window as any).XRWebGLLayer as typeof XRWebGLLayer; @@ -43,9 +44,11 @@ export class WebGlGScript extends GameScript { glFov: (45 * Math.PI) / 180, }; - constructor(game: GameWrapper) { + constructor(game: Game) { super(game); + this.eCanvas.style.display = "block"; + // init gl eCanvas const gl = this.eCanvas.getContext("webgl2", { // premultipliedAlpha: false, @@ -53,7 +56,7 @@ export class WebGlGScript extends GameScript { }); if (gl === null) throw new Error("WebGL failed to load"); // Only continue if WebGL is available and working - this.textureAtlas = this.loadTextureFromUrl("./img/texture_map.png", gl); + this.textureAtlas = this.loadTextureFromUrl("/img/texture_map.png", gl); this.galleryImagesPaths.forEach((path) => { const img = new Image(); diff --git a/apps/web-client/src/index.tsx b/apps/web-client/src/index.tsx new file mode 100644 index 0000000..128473f --- /dev/null +++ b/apps/web-client/src/index.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; + +import App from "./App"; + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + +); diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 1f175e0..424eb64 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -68,10 +68,10 @@ export async function run(id?: string) { const ents = game.getEntities(); console.log("Ents", ents); - const webglGameScript = new WebGlGScript(game); + const webglGameScript = new WebGlGScript(game.game); const canvasGameScript = new CanvasGameScript( - game, + game.game, webglGameScript, main_player_uid ); diff --git a/apps/web-client/src/services/mp-games-service.ts b/apps/web-client/src/services/mp-games-service.ts index 910eb80..79e4ca0 100644 --- a/apps/web-client/src/services/mp-games-service.ts +++ b/apps/web-client/src/services/mp-games-service.ts @@ -1,58 +1,73 @@ import { deserializeChunk, ISerializedChunk, - ISerializedGame, IServerGameMetadata, ISocketMessageType, - serializedGameToGame, SocketMessage, + WelcomeMessage, } from "@craft/engine"; -import { SocketListener } from "../socket"; -import { SocketInterface } from "../app"; -import { ISocketWelcomePayload } from "@craft/engine/types"; +import { SocketHandler, SocketListener } from "../socket"; import { AppConfig } from "../appConfig"; -import { Game, SandBoxGScript, WasmRequestChunk } from "@craft/rust-world"; - -async function serverRunner() { - const baseUrl = AppConfig.api.baseUrl; - - async function getAllGames(): Promise { - const response = await fetch(`${baseUrl}/worlds`); - return await response.json(); - } +import { + EntityActionDto, + EntityActionJson, + Game, + SandBoxGScript, + WasmGameScript, + WasmRequestChunk, +} from "@craft/rust-world"; +import { CanvasGameScript } from "../game-scripts/canvas-gscript"; +import { WebGlGScript } from "../game-scripts/webgl-gscript"; +import { getMyUid } from "../utils"; +import { KeyboardPlayerEntityController } from "../controllers/playerControllers/keyboardPlayerController"; + +export const SocketInterface = new SocketHandler(); + +const baseUrl = AppConfig.api.baseUrl; + +export async function getAllGames(): Promise { + const response = await fetch(`${baseUrl}/games`); + return await response.json(); +} - async function createGame(name: string): Promise { - const response = await fetch(`${baseUrl}/game`, { - method: "POST", - body: JSON.stringify({ name }), - }); - const serializedGame: ISerializedGame = await response.json(); - return serializedGameToGame(serializedGame); - } +export async function createGame(name: string): Promise { + const response = await fetch(`${baseUrl}/game`, { + method: "POST", + body: JSON.stringify({ name }), + }); + return await response.text(); +} - async function startGame(gameId: string): Promise { - await fetch(`${baseUrl}/game/${gameId}/start`, { - method: "POST", - }); - } +export async function startGame(gameId: string): Promise { + await fetch(`${baseUrl}/game/${gameId}/start`, { + method: "POST", + }); +} - async function joinGame(gameId: string): Promise { +export async function serverRunner(gameId: string) { + async function joinGame(gameId: string): Promise { SocketInterface.send( - SocketMessage.make(ISocketMessageType.joinWorld, undefined) + SocketMessage.make(ISocketMessageType.joinWorld, { + gameId, + myUid: getMyUid(), + }) ); const welcomeMessage = await waitForWelcomeMessage(); + console.log("Welcome message", welcomeMessage); if (!welcomeMessage) { throw new Error("Server didn't create the world"); } + return welcomeMessage; } async function waitForWelcomeMessage() { let listener: SocketListener | null = null; - const welcomeMessage: ISocketWelcomePayload | null = await new Promise( + const welcomeMessage: WelcomeMessage | null = await new Promise( (resolve) => { listener = (message) => { + console.log("SocketMessage", message); if (message.isType(ISocketMessageType.welcome)) { resolve(message.data); } else if (message.isType(ISocketMessageType.failedToJoin)) { @@ -67,18 +82,58 @@ async function serverRunner() { return welcomeMessage; } - const gameId = "1"; + await SocketInterface.connect(() => { + console.error("Socket disconnected"); + }); + + const welcomeMessage = await joinGame(gameId); + + console.log("Joined game", welcomeMessage); - await joinGame(gameId); + const myUid = getMyUid(); const game = new Game(); + (window as any).game = game; + + game.deserialize_entities_wasm(welcomeMessage.entities); + + console.log(game.serialize_entities_wasm()); + + const webglGameScript = new WebGlGScript(game); + + const canvasGameScript = new CanvasGameScript(game, webglGameScript, myUid); + const wasmCanvasGameScript = new WasmGameScript(canvasGameScript); + game.add_game_script_wasm(wasmCanvasGameScript); const chunksToInsert: ISerializedChunk[] = []; + const onAction = (action: EntityActionDto) => { + console.log("Player Action", action); + const entityId = action.entity_id; + const name = action.get_name(); + const data = EntityActionJson.from_entity_action_dto(action); + game.handle_action_wasm(action); + SocketInterface.send( + SocketMessage.make(ISocketMessageType.actions, { + entity_id: entityId, + name, + data, + }) + ); + }; + + const playerController = new KeyboardPlayerEntityController( + onAction, + myUid, + canvasGameScript, + webglGameScript + ); + const getChunk = async (chunkPos: { x: number; y: number }) => { + console.log("Getting chunk", chunkPos); fetch(`${baseUrl}/game/${gameId}/chunk/${chunkPos.x}/${chunkPos.y}`) .then((data) => data.json()) .then((chunk) => { - chunksToInsert.push(chunk); + chunksToInsert.push(chunk.Ok); }); }; @@ -88,6 +143,8 @@ async function serverRunner() { const sandbox = new SandBoxGScript(1, chunkRequester); game.add_sandbox_wasm(sandbox); + console.log(game.serialize_entities_wasm()); + const gameLoop = async () => { const chunkToInsert = chunksToInsert.pop(); if (chunkToInsert) { @@ -96,5 +153,10 @@ async function serverRunner() { } game.update(); + playerController.update(); + canvasGameScript.update(); + canvasGameScript.renderLoop(0); }; + + setInterval(gameLoop, 1000 / 60); } diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index 89b6e52..b0d5e5f 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -1,6 +1,6 @@ -import { IGameMetadata } from "@craft/engine/game"; import { GameWrapper, + IGameMetadata, ISerializedGame, serializedGameToGame, } from "@craft/engine/src/wrappers"; diff --git a/lib/engine/src/game-script.ts b/lib/engine/src/game-script.ts index ec7bd5b..0322b42 100644 --- a/lib/engine/src/game-script.ts +++ b/lib/engine/src/game-script.ts @@ -1,3 +1,4 @@ +import { Game } from "@craft/rust-world"; import { GameWrapper } from "./wrappers.js"; export type GameScriptConfig = Record | undefined; @@ -10,7 +11,7 @@ export abstract class GameScript< config?: Config; - constructor(protected game: GameWrapper, ..._args: unknown[]) {} + constructor(protected game: Game, ..._args: unknown[]) {} setConfig?(config: Config): void; diff --git a/lib/engine/src/socket-types.ts b/lib/engine/src/socket-types.ts index c5c0724..70c169a 100644 --- a/lib/engine/src/socket-types.ts +++ b/lib/engine/src/socket-types.ts @@ -1,8 +1,10 @@ import { EntityActionDto, + EntityActionJson, GameDiff, SerializedEntityHolder, } from "@craft/rust-world"; +import { ISerializedAction } from "./wrappers.js"; export interface MessageDto< MESSAGE extends string, @@ -41,14 +43,17 @@ export enum ISocketMessageType { } export interface WelcomeMessage { - uid: string; + uid: number; entities: SerializedEntityHolder; } export interface SocketMessageData extends Record { - [ISocketMessageType.joinWorld]: void; + [ISocketMessageType.joinWorld]: { + gameId: string; + myUid: number; + }; [ISocketMessageType.failedToJoin]: void; - [ISocketMessageType.actions]: EntityActionDto; + [ISocketMessageType.actions]: ISerializedAction; [ISocketMessageType.gameDiff]: GameDiff; [ISocketMessageType.welcome]: WelcomeMessage; } diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index 71a4f1b..a3d6b17 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -9,9 +9,16 @@ import { World, Game, EntityHolder, + RotateActionData, } from "@craft/rust-world"; export * as WorldModuleTypes from "@craft/rust-world"; +export interface ISerializedAction { + entity_id: number; + name: string; + data: any; +} + export interface IServerGameMetadata { gameId: string; name: string; @@ -140,7 +147,7 @@ export class PlayerWrapper { distanceMoved = 0; moving_direction: WorldWasm.Direction | undefined; - constructor(player: WorldWasm.WasmPlayer) { + constructor(player: WorldWasm.Player) { this.pos = new Vector3D([player.pos.x, player.pos.y, player.pos.z]); this.dim = new Vector3D([1, 1, 1]); this.rot = new Vector3D([0, player.rot.phi, player.rot.theta]); @@ -224,7 +231,7 @@ export class GameWrapper { } makeAndAddGameScript(script: GameScript) { - const wasmScript = WorldWasm.WasmGameScript.make(script); + const wasmScript = new WorldWasm.WasmGameScript(script); this.game.add_game_script_wasm(wasmScript); } @@ -237,7 +244,7 @@ export class GameWrapper { } getPlayer(uid: number): PlayerWrapper { - const player: WorldWasm.WasmPlayer = this.game.get_player_wasm(uid); + const player: WorldWasm.Player = this.game.get_player_wasm(uid); return new PlayerWrapper(player); } @@ -247,7 +254,7 @@ export class GameWrapper { } getEntities(): PlayerWrapper[] { - const entities: WorldWasm.WasmPlayer[] = this.game.get_players_wasm(); + const entities: WorldWasm.Player[] = this.game.get_players_wasm(); return entities.map((entity) => this.getPlayer(entity.id)); } diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 3efc838..8b805a2 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/Mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"802632c9a974600df6f8e82d0f2ef48763ba6a906887fc4635abec0b872660f8","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"3b638d9f7e3ebcbf71e5da6fa8f518ff034154de5da466ad3ccdd59bb0c4273d","signature":"e8488cc57c1ad32066792cbdf9a1a495fa7a21d32e968703ff25900378329175","impliedFormat":99},{"version":"670dc41693b0b9774ef315bc71f7f69721e515da562a0791475657245c84bfc0","signature":"e07cf21d9a24c52c2a49d5d1652c28b1c3c8bdf8391952bc00ddfe4b8aaa2198","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"9d753cf4da10fa33fc6e471508fe977ec860cac1f6ed4ebaababb006d54e3a04","signature":"3c709283e60c19e1441d18062b5e1a3ebdd27e3125a9f26fd98629b916fb7827","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"dd99ed842600c6bab2a9224fe71b829e758edfff2c103a49fb994e3ab1241fe2","signature":"2d1903199cc2f98172a787571d0f49fb3f184d6219678ab99da366ed78fe4c68","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"4489c6a9fde8934733aa7df6f7911461ee6e9e4ad092736bd416f6b2cc20b2c6","impliedFormat":1},{"version":"2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","impliedFormat":1},{"version":"8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","impliedFormat":1},{"version":"a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a","impliedFormat":1},{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228","impliedFormat":1},{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","impliedFormat":1},{"version":"1edfef06edaa8ed3d1d220e739080d6899eb2cc476d3dcd9fdc385782aa98d92","impliedFormat":1},{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true,"impliedFormat":1},{"version":"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","impliedFormat":1},{"version":"b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","impliedFormat":1},{"version":"3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","impliedFormat":1},{"version":"5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","impliedFormat":1},{"version":"be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","impliedFormat":1},{"version":"8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","impliedFormat":1},{"version":"1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd","impliedFormat":1},{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true,"impliedFormat":1},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","impliedFormat":1},{"version":"fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","impliedFormat":1},{"version":"55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","impliedFormat":1},{"version":"790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","impliedFormat":1},{"version":"42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","impliedFormat":1},{"version":"354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80","impliedFormat":1},{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","impliedFormat":1},{"version":"5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","impliedFormat":1},{"version":"3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d","impliedFormat":1},{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","impliedFormat":1},{"version":"e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","impliedFormat":1},{"version":"a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","impliedFormat":1},{"version":"c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","impliedFormat":1},{"version":"898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","impliedFormat":1},{"version":"0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","impliedFormat":1},{"version":"1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","impliedFormat":1},{"version":"785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","impliedFormat":1},{"version":"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","impliedFormat":1},{"version":"164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","impliedFormat":1},{"version":"1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e","impliedFormat":1},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","impliedFormat":1},{"version":"bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","impliedFormat":1},{"version":"812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","impliedFormat":1},{"version":"993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661","impliedFormat":1},{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true,"impliedFormat":1},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","impliedFormat":1},{"version":"92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","impliedFormat":1},{"version":"16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b","impliedFormat":1},{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b","impliedFormat":1},{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true,"impliedFormat":1},{"version":"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","impliedFormat":1},{"version":"6d829824ead8999f87b6df21200df3c6150391b894b4e80662caa462bd48d073","impliedFormat":1},{"version":"afc559c1b93df37c25aef6b3dfa2d64325b0e112e887ee18bf7e6f4ec383fc90","impliedFormat":1},{"version":"f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","impliedFormat":1},{"version":"efdced704bd09db6984a2a26e3573bc43cdc2379bdef3bcff6cff77efe8ba82b","impliedFormat":1},{"version":"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","impliedFormat":1},{"version":"84e3bbd6f80983d468260fdbfeeb431cc81f7ea98d284d836e4d168e36875e86","impliedFormat":1},{"version":"aad5ffa61406b8e19524738fcf0e6fda8b3485bba98626268fdf252d1b2b630a","impliedFormat":1},{"version":"16d51f964ec125ad2024cf03f0af444b3bc3ec3614d9345cc54d09bab45c9a4c","impliedFormat":1},{"version":"ba601641fac98c229ccd4a303f747de376d761babb33229bb7153bed9356c9cc","impliedFormat":1},{"version":"352fc8497a30bc806d7defa0043d85802e5f35a7688731ee9a21456f5cb32a94","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b9ecf7da4d71cf3832dbb8336150fa924631811f488ad4690c2dfec2b4fb1d7","impliedFormat":1},{"version":"951c85f75aac041dddbedfedf565886a7b494e29ec1532e2a9b4a6180560b50e","impliedFormat":1},{"version":"e6f0cb9d8cb2e38bec66e032e73caa3e7c6671f21ed7196acb821aec462051f2","impliedFormat":1},{"version":"43cdd474c5aa3340da4816bb8f1ae7f3b1bcf9e70d997afc36a0f2c432378c84","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","impliedFormat":1},{"version":"55461596dc873b866911ef4e640fae4c39da7ac1fbc7ef5e649cb2f2fb42c349","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"fa519cc7186714fddd1dd619ec14f80ecb911fc8da38c795130ef704a12d1515","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","impliedFormat":1},{"version":"3cfb0cb51cc2c2e1b313d7c4df04dbf7e5bda0a133c6b309bf6af77cf614b971","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"6f20650b796e5047b2616ca8c87a1961bd4f9371b757ce62697c934ad7203435","impliedFormat":1},{"version":"2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","impliedFormat":1},{"version":"2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","impliedFormat":1},{"version":"42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","impliedFormat":1},{"version":"d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","impliedFormat":1},{"version":"b9f96255e1048ed2ea33ec553122716f0e57fc1c3ad778e9aa15f5b46547bd23","impliedFormat":1},{"version":"7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","impliedFormat":1},{"version":"906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","impliedFormat":1},{"version":"5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","impliedFormat":1},{"version":"c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","impliedFormat":1},{"version":"e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","impliedFormat":1},{"version":"e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","impliedFormat":1},{"version":"9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","impliedFormat":1},{"version":"0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","impliedFormat":1},{"version":"71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","impliedFormat":1},{"version":"c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","impliedFormat":1},{"version":"2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","impliedFormat":1},{"version":"479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","impliedFormat":1},{"version":"ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","impliedFormat":1},{"version":"f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","impliedFormat":1},{"version":"86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","impliedFormat":1},{"version":"2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","impliedFormat":1},{"version":"a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","impliedFormat":1},{"version":"b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","impliedFormat":1},{"version":"61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","impliedFormat":1},{"version":"6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","impliedFormat":1},{"version":"c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","impliedFormat":1},{"version":"38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","impliedFormat":1},{"version":"d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","impliedFormat":1},{"version":"3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","impliedFormat":1},{"version":"b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","impliedFormat":1},{"version":"f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","impliedFormat":1},{"version":"843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","impliedFormat":1},{"version":"f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","impliedFormat":1},{"version":"6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","impliedFormat":1},{"version":"e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","impliedFormat":1},{"version":"a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","impliedFormat":1},{"version":"a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","impliedFormat":1},{"version":"da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","impliedFormat":1},{"version":"ea2d34766aa08df002a696e27d2140c0834cb8d7e9cb35687ecfd578253c196c","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"67483628398336d0f9368578a9514bd8cc823a4f3b3ab784f3942077e5047335","impliedFormat":1},{"version":"2dd1d4cea14cead7a7fc9eec8f40593089dff0de8c0199458446143c9b8c4ea9","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"fileIdsList":[[47,110],[49,50,52,110],[110],[52,110],[48,49,50,51,52,53,54,55,56,110],[47,50,51,53,110],[58,110],[58,59,60,61,62,110],[58,60,110],[83,110,117,118],[83,110,117],[80,83,110,117,124,125,126],[110,119,126,127,130],[110,132],[80,110,117],[64,110],[67,110],[68,73,101,110],[69,80,81,88,98,109,110],[69,70,80,88,110],[71,110],[72,73,81,89,110],[73,98,106,110],[74,76,80,88,110],[75,110],[76,77,110],[80,110],[78,80,110],[80,81,82,98,109,110],[80,81,82,95,98,101,110],[110,114],[76,80,83,88,98,109,110],[80,81,83,84,88,98,106,109,110],[83,85,98,106,109,110],[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[80,86,110],[87,109,110],[76,80,88,98,110],[89,110],[90,110],[67,91,110],[92,108,110,114],[93,110],[94,110],[80,95,96,110],[95,97,110,112],[68,80,98,99,100,101,110],[68,98,100,110],[98,99,110],[101,110],[102,110],[98,110],[80,104,105,110],[104,105,110],[73,88,98,106,110],[107,110],[88,108,110],[68,83,94,109,110],[73,110],[98,110,111],[110,112],[110,113],[68,73,80,82,91,98,109,110,112,114],[98,110,115],[110,139],[110,135,136,137,138],[83,98,110,117],[110,144,183],[110,144,168,183],[110,183],[110,144],[110,144,169,183],[110,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182],[110,169,183],[81,98,110,117,123],[83,110,117,129],[110,129],[110,128],[110,117],[80,83,85,98,106,109,110,115,117]],"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,1],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[119,10],[120,3],[118,11],[121,11],[122,3],[127,12],[131,13],[132,14],[133,3],[134,15],[123,3],[64,16],[65,16],[67,17],[68,18],[69,19],[70,20],[71,21],[72,22],[73,23],[74,24],[75,25],[76,26],[77,26],[79,27],[78,28],[80,27],[81,29],[82,30],[66,31],[116,3],[83,32],[84,33],[85,34],[117,35],[86,36],[87,37],[88,38],[89,39],[90,40],[91,41],[92,42],[93,43],[94,44],[95,45],[96,45],[97,46],[98,47],[100,48],[99,49],[101,50],[102,51],[103,52],[104,53],[105,54],[106,55],[107,56],[108,57],[109,58],[110,59],[111,60],[112,61],[113,62],[114,63],[115,64],[135,3],[126,3],[125,3],[140,65],[136,3],[139,66],[141,67],[142,3],[138,3],[143,3],[168,68],[169,69],[144,70],[147,70],[166,68],[167,68],[157,68],[156,71],[154,68],[149,68],[162,68],[160,68],[164,68],[148,68],[161,68],[165,68],[150,68],[151,68],[163,68],[145,68],[152,68],[153,68],[155,68],[159,68],[170,72],[158,68],[146,68],[183,73],[182,3],[177,72],[179,74],[178,72],[171,72],[172,72],[174,72],[176,72],[180,74],[181,74],[173,74],[175,74],[124,75],[130,76],[128,77],[129,78],[184,3],[185,3],[186,79],[187,80],[137,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[4,3],[20,3],[24,3],[21,3],[22,3],[23,3],[25,3],[26,3],[27,3],[5,3],[28,3],[29,3],[30,3],[31,3],[6,3],[35,3],[32,3],[33,3],[34,3],[36,3],[7,3],[37,3],[42,3],[43,3],[38,3],[39,3],[40,3],[41,3],[1,3],[44,3]],"semanticDiagnosticsPerFile":[[52,[{"start":3137,"length":10,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'WasmPlayer'.","category":1,"code":2694},{"start":5784,"length":10,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'WasmPlayer'.","category":1,"code":2694},{"start":6100,"length":10,"messageText":"Namespace '\"/home/tylord/dev/TylerCraft/lib/world/pkg/world\"' has no exported member 'WasmPlayer'.","category":1,"code":2694}]]],"affectedFilesPendingEmit":[48,53,51,57,54,56,52],"emitSignatures":[[52,"4f48136f62e31e14fc95e3d2183d8d39f1ba9b1b58c4f4e5b8a150122608ecc2"],[54,"1db4d0c03f34ec1e9f7ed486dad9680d92be6b13d5acfd8ea2fc53f06e93bb62"],[56,"23c2ff8d0f24d0e7fb240bb8572b6bc1d6f4d6a0ccfa7bc7b46b71f5191f3ceb"]],"latestChangedDtsFile":"./dist/wrappers.d.ts"},"version":"5.5.3"} \ No newline at end of file +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[49,50,52,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,51,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f3351fc22047afd24c6526fd26f6efa2b31bb3940d2a18c0410974db628b494","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"909de4c604dc98111ed27190cd1d8a0bd75dc8131cb8e13b40823c3d3f475e8c","signature":"775cc59b4ae0007d83834d10a4273997b97464773ef9e02b52358de844062ce4","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"9d753cf4da10fa33fc6e471508fe977ec860cac1f6ed4ebaababb006d54e3a04","signature":"3c709283e60c19e1441d18062b5e1a3ebdd27e3125a9f26fd98629b916fb7827","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"9b02d2fd9dae7f987d6e3ced9daf38cc95e6d0f4793b3bfd7dec8527bf9719d7","signature":"12618848438739a7b972947cb18bb89e0bea988b671511fafc2d66beff616cbb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file diff --git a/lib/engine/types.ts b/lib/engine/types.ts index d8cc410..01ee3e4 100644 --- a/lib/engine/types.ts +++ b/lib/engine/types.ts @@ -110,10 +110,6 @@ export interface SocketMessageData extends Record { [ISocketMessageType.playerActions]: PlayerActionDto; } -export interface ISocketWelcomePayload { - uid: string; -} - export type SocketMessageDto = MessageDto< ISocketMessageType, SocketMessageData diff --git a/lib/world/src/chunk/chunk_mesh.rs b/lib/world/src/chunk/chunk_mesh.rs index a1ee53e..8769229 100644 --- a/lib/world/src/chunk/chunk_mesh.rs +++ b/lib/world/src/chunk/chunk_mesh.rs @@ -1,11 +1,14 @@ use crate::{ - components::world_pos::WorldPos, direction::Directions, plane::WorldPlane, positions::{ChunkPos, InnerChunkPos} + components::world_pos::WorldPos, + direction::Directions, + plane::WorldPlane, + positions::{ChunkPos, InnerChunkPos}, }; -use js_sys::wasm_bindgen; use serde::{Deserialize, Serialize}; use std::collections::HashMap; +use tsify::Tsify; -#[derive(Serialize, Deserialize, Clone)] +#[derive(Tsify, Serialize, Deserialize, Clone)] pub struct ChunkMesh { face_map: HashMap, chunk_pos: ChunkPos, @@ -78,7 +81,11 @@ impl IntoIterator for &ChunkMesh { #[cfg(test)] mod tests { use crate::{ - chunk::chunk_mesh::{BlockMesh, ChunkMesh}, components::world_pos::WorldPos, direction::Directions, positions::ChunkPos, vec::Vector3Ops + chunk::chunk_mesh::{BlockMesh, ChunkMesh}, + components::world_pos::WorldPos, + direction::Directions, + positions::ChunkPos, + vec::Vector3Ops, }; #[test] diff --git a/lib/world/src/direction.rs b/lib/world/src/direction.rs index b2645ff..1a77a8a 100644 --- a/lib/world/src/direction.rs +++ b/lib/world/src/direction.rs @@ -1,4 +1,7 @@ -use crate::{geometry::{rotation::SphericalRotation, vec2::Vec2Ops}, vec::Vector3Ops}; +use crate::{ + geometry::{rotation::SphericalRotation, vec2::Vec2Ops}, + vec::Vector3Ops, +}; use num::One; use serde::{Deserialize, Serialize}; use std::{ @@ -63,6 +66,7 @@ pub const EVERY_DIRECTION: [Direction; 6] = [ ]; #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[wasm_bindgen] pub struct Directions { data: [bool; 6], } @@ -197,7 +201,6 @@ impl Into for Direction { } } - pub trait DirectionVectorExtension: Vector3Ops { fn get_component_from_direction(&self, direction: Direction) -> Self::Scalar { match direction { @@ -210,7 +213,10 @@ pub trait DirectionVectorExtension: Vector3Ops { } } - fn get_opposite_components_from_direction(&self, direction: Direction) -> (Self::Scalar, Self::Scalar) { + fn get_opposite_components_from_direction( + &self, + direction: Direction, + ) -> (Self::Scalar, Self::Scalar) { match direction { Direction::North => (self.x(), self.y()), Direction::South => (self.x(), self.y()), @@ -256,11 +262,10 @@ pub trait DirectionVectorExtension: Vector3Ops { FlatDirection::North => new_vec.set_y(new_vec.y() + One::one()), FlatDirection::South => new_vec.set_y(new_vec.y() - One::one()), FlatDirection::East => new_vec.set_x(new_vec.x() + One::one()), - FlatDirection::West => new_vec.set_x(new_vec.x() - One::one()) + FlatDirection::West => new_vec.set_x(new_vec.x() - One::one()), } new_vec } - } impl DirectionVectorExtension for V {} @@ -272,7 +277,7 @@ pub trait DirectionVectorExtension2: Vec2Ops { FlatDirection::North => new_vec.set_y(new_vec.y() + One::one()), FlatDirection::South => new_vec.set_y(new_vec.y() - One::one()), FlatDirection::East => new_vec.set_x(new_vec.x() + One::one()), - FlatDirection::West => new_vec.set_x(new_vec.x() - One::one()) + FlatDirection::West => new_vec.set_x(new_vec.x() - One::one()), } new_vec } diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index 9e9ddf8..584f460 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -133,6 +133,7 @@ pub struct EntityHolder { } #[derive(Debug, Serialize, Deserialize, Tsify)] +#[wasm_bindgen(getter_with_clone)] pub struct SerializedEntityHolder { pub entities: Vec, } diff --git a/lib/world/src/entities/entity_action.rs b/lib/world/src/entities/entity_action.rs index ea9fc4a..e7eb547 100644 --- a/lib/world/src/entities/entity_action.rs +++ b/lib/world/src/entities/entity_action.rs @@ -1,6 +1,8 @@ +use crate::entities::player_rot_script::RotateActionData; use crate::utils::js_log; use super::entity::{Entity, EntityHolder, EntityId}; +use serde::Serialize; use std::any::Any; use std::fmt::Debug; use wasm_bindgen::prelude::*; @@ -24,7 +26,7 @@ where } } -#[wasm_bindgen] +#[wasm_bindgen(getter_with_clone)] #[derive(Debug)] pub struct EntityActionDto { pub entity_id: super::entity::EntityId, @@ -40,6 +42,13 @@ impl EntityActionDto { } } +#[wasm_bindgen] +impl EntityActionDto { + pub fn get_name(&self) -> String { + self.name.to_string() + } +} + pub trait EntityActionHandler { fn get_action_type(&self) -> &'static str; fn handle_dto(&self, entity: &mut Entity, data: &EntityActionDto); @@ -104,3 +113,38 @@ impl EntityActionHolder { self.actions.clear(); } } + +#[wasm_bindgen] +struct EntityActionJson { + entity_id: EntityId, + name: String, + data: JsValue, +} + +#[wasm_bindgen] +impl EntityActionJson { + pub fn from_entity_action_dto(dto: &EntityActionDto) -> JsValue { + match dto.name { + "Player-Rotate" => { + let data = dto.get_data::().unwrap(); + serde_wasm_bindgen::to_value(&data).unwrap() + } + _ => JsValue::null(), + } + } + + pub fn deserialize_wasm(entity_id: EntityId, name: String, data: JsValue) -> EntityActionDto { + js_log(&format!("Deserializing action: {:?}", name)); + match name.as_str() { + "Player-Rotate" => { + let data = serde_wasm_bindgen::from_value::(data).unwrap(); + EntityActionDto { + entity_id, + name: "Player-Rotate", + data: Box::new(data), + } + } + _ => panic!("Unknown action: {}", name), + } + } +} diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 2536426..87b9914 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -1,5 +1,5 @@ use super::{ - entity::{Entity, EntityHolder, EntityId}, + entity::{Entity, EntityHolder, EntityId, SerializedEntityHolder}, entity_action::EntityActionHolder, game_script::{EntityScriptHolder, GameScript}, }; @@ -133,6 +133,14 @@ impl Game { let serialized_entities_js = serde_wasm_bindgen::to_value(&serialized_entities).unwrap(); Ok(serialized_entities_js) } + + pub fn deserialize_entities_wasm(&mut self, entities: JsValue) { + let serialized_entities: SerializedEntityHolder = + serde_wasm_bindgen::from_value(entities).unwrap(); + + let entity_holder = EntityHolder::deserialize(serialized_entities); + self.entity_holder = entity_holder; + } } impl Game { @@ -419,6 +427,12 @@ pub mod wasm { let block_js = serde_wasm_bindgen::to_value(&block).unwrap(); Ok(block_js) } + + pub fn get_chunk_wasm(&self, chunk_pos: ChunkPos) -> Result { + let chunk = self.world.get_chunk(&chunk_pos); + let chunk_js = serde_wasm_bindgen::to_value(&chunk); + chunk_js + } } #[wasm_bindgen] @@ -430,6 +444,7 @@ pub mod wasm { #[wasm_bindgen] impl WasmGameScript { + #[wasm_bindgen(constructor)] pub fn make(val: JsValue) -> WasmGameScript { let on_diff_jsfn = js_sys::Reflect::get(&val, &JsValue::from("onDiff")).unwrap(); WasmGameScript { diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index 961aa61..e587452 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -45,7 +45,7 @@ pub mod wasm { use serde::{Deserialize, Serialize}; use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; - #[derive(Serialize, Deserialize, Debug)] + #[derive(Serialize, Deserialize, Debug, Clone)] #[wasm_bindgen] pub struct Player { pub id: EntityId, diff --git a/lib/world/src/entities/player_rot_script.rs b/lib/world/src/entities/player_rot_script.rs index ac9f805..8896151 100644 --- a/lib/world/src/entities/player_rot_script.rs +++ b/lib/world/src/entities/player_rot_script.rs @@ -2,10 +2,11 @@ use super::entity::{Entity, EntityId}; use super::entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}; use crate::geometry::rotation::SphericalRotation; use crate::utils::js_log; +use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::wasm_bindgen; #[wasm_bindgen] -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize, Deserialize)] pub struct RotateActionData { pub rot_diff: SphericalRotation, } @@ -36,6 +37,8 @@ impl EntityActionHandler for RotateAction { } pub mod wasm { + use wasm_bindgen::JsValue; + use super::*; #[wasm_bindgen] @@ -44,5 +47,10 @@ pub mod wasm { let data = RotateActionData { rot_diff }; RotateAction::make_dto(entity_id, data) } + + pub fn serialize_wasm(action: EntityActionDto) -> JsValue { + let data = action.get_data::().unwrap(); + serde_wasm_bindgen::to_value(&data).unwrap() + } } } diff --git a/lib/world/src/geometry/vec2.rs b/lib/world/src/geometry/vec2.rs index c01592d..f5b71ef 100644 --- a/lib/world/src/geometry/vec2.rs +++ b/lib/world/src/geometry/vec2.rs @@ -1,8 +1,11 @@ +use crate::vec::{AsF32, Vec3i16}; use num::{integer::Roots, traits::real::Real, Num, One, Zero}; use serde::{Deserialize, Serialize}; -use std::{fmt::Display, ops::{Add, AddAssign, Div, Mul, Neg, Sub, SubAssign}}; -use crate::vec::{AsF32, Vec3i16}; - +use std::{ + fmt::Display, + ops::{Add, AddAssign, Div, Mul, Neg, Sub, SubAssign}, +}; +use wasm_bindgen::prelude::wasm_bindgen; pub trait Vec2Ops: Sized { type Scalar: Copy @@ -16,7 +19,6 @@ pub trait Vec2Ops: Sized { + AsF32 + Display; - fn new(x: Self::Scalar, y: Self::Scalar) -> Self; fn x(&self) -> Self::Scalar; @@ -30,40 +32,39 @@ pub trait Vec2Ops: Sized { } fn add(&self, other: Self) -> Self { - return Self::new(self.x() + other.x(), self.y() + other.y()) + return Self::new(self.x() + other.x(), self.y() + other.y()); } fn sub(&self, other: &Self) -> Self { - return Self::new(self.x() - other.x(), self.y() - other.y()) + return Self::new(self.x() - other.x(), self.y() - other.y()); } fn scalar_mul(&self, other: Self::Scalar) -> Self { - return Self::new(self.x() * other, self.y() * other) + return Self::new(self.x() * other, self.y() * other); } fn mul(&self, other: Self::Scalar) -> Self { - return Self::new(self.x() * other, self.y() * other) + return Self::new(self.x() * other, self.y() * other); } fn div(&self, other: Self::Scalar) -> Self { - return Self::new(self.x() / other, self.y() / other) + return Self::new(self.x() / other, self.y() / other); } fn sqr(&self) -> Self { - return Self::new(self.x() * self.x(), self.y() * self.y()) + return Self::new(self.x() * self.x(), self.y() * self.y()); } fn sum(&self) -> Self::Scalar { - return self.x() + self.y() + return self.x() + self.y(); } fn distance_to(&self, other: &Self) -> f32 { - return self.sub(other).sqr().sum().as_f32().sqrt() + return self.sub(other).sqr().sum().as_f32().sqrt(); } - fn move_to_3d(&self, y_val: Self::Scalar) -> Self { - return Self::new(self.x(), y_val) + return Self::new(self.x(), y_val); } } @@ -89,7 +90,7 @@ macro_rules! impl_vec2_ops { self.y = val } } - } + }; } pub(crate) use impl_vec2_ops; @@ -101,11 +102,20 @@ pub struct Vec2f32 { impl_vec2_ops!(Vec2f32, f32); #[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Deserialize)] +#[wasm_bindgen] pub struct Vec2i16 { pub x: i16, pub y: i16, } +#[wasm_bindgen] +impl Vec2i16 { + #[wasm_bindgen(constructor)] + pub fn new_wasm(x: i16, y: i16) -> Self { + Vec2i16 { x, y } + } +} + impl_vec2_ops!(Vec2i16, i16); impl Vec2i16 { @@ -138,18 +148,10 @@ impl Vec2i16 { pub fn get_adjacent_vecs(&self) -> Vec { let mut vecs = Vec::new(); vecs.push(self.clone()); - vecs.push(self.add( - Vec2i16 { x: 0, y: 1 } - )); - vecs.push(self.add( - Vec2i16 { x: 1, y: 0 } - )); - vecs.push(self.add( - Vec2i16 { x: -1, y: 0 } - )); - vecs.push(self.add( - Vec2i16 { x: 0, y: -1 } - )); + vecs.push(self.add(Vec2i16 { x: 0, y: 1 })); + vecs.push(self.add(Vec2i16 { x: 1, y: 0 })); + vecs.push(self.add(Vec2i16 { x: -1, y: 0 })); + vecs.push(self.add(Vec2i16 { x: 0, y: -1 })); vecs } -} \ No newline at end of file +} diff --git a/lib/world/src/positions.rs b/lib/world/src/positions.rs index c98b5d4..c2dabb7 100644 --- a/lib/world/src/positions.rs +++ b/lib/world/src/positions.rs @@ -1,3 +1,6 @@ +use tsify::declare; +use wasm_bindgen::prelude::wasm_bindgen; + use crate::{ chunk::CHUNK_WIDTH, components::world_pos::WorldPos, @@ -11,6 +14,7 @@ use crate::{ mod unit_tests; pub type InnerChunkPos = Vec3u8; +#[declare] pub type ChunkPos = Vec2i16; impl_component!(ChunkPos); diff --git a/lib/world/src/world/mod.rs b/lib/world/src/world/mod.rs index d4d87e3..aef0b26 100644 --- a/lib/world/src/world/mod.rs +++ b/lib/world/src/world/mod.rs @@ -23,6 +23,7 @@ pub struct WorldPosWasm { } #[derive(Debug, Serialize, Deserialize)] +#[wasm_bindgen] pub struct ChunkNotLoadedError; impl std::error::Error for ChunkNotLoadedError {} diff --git a/yarn.lock b/yarn.lock index 0a997af..b010715 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,1817 +15,1898 @@ __metadata: languageName: node linkType: hard -"@aws-crypto/crc32@npm:3.0.0": - version: 3.0.0 - resolution: "@aws-crypto/crc32@npm:3.0.0" +"@aws-crypto/sha256-browser@npm:5.2.0": + version: 5.2.0 + resolution: "@aws-crypto/sha256-browser@npm:5.2.0" dependencies: - "@aws-crypto/util": "npm:^3.0.0" + "@aws-crypto/sha256-js": "npm:^5.2.0" + "@aws-crypto/supports-web-crypto": "npm:^5.2.0" + "@aws-crypto/util": "npm:^5.2.0" "@aws-sdk/types": "npm:^3.222.0" - tslib: "npm:^1.11.1" - checksum: 10/672d593fd98a88709a1b488db92aabf584b6dad3e8099e04b6d2870e34a2ee668cbbe0e5406e60c0d776b9c34a91cfc427999230ad959518fed56a3db037704c + "@aws-sdk/util-locate-window": "npm:^3.0.0" + "@smithy/util-utf8": "npm:^2.0.0" + tslib: "npm:^2.6.2" + checksum: 10/2b1b701ca6caa876333b4eb2b96e5187d71ebb51ebf8e2d632690dbcdedeff038202d23adcc97e023437ed42bb1963b7b463e343687edf0635fd4b98b2edad1a languageName: node linkType: hard -"@aws-crypto/ie11-detection@npm:^3.0.0": - version: 3.0.0 - resolution: "@aws-crypto/ie11-detection@npm:3.0.0" +"@aws-crypto/sha256-js@npm:5.2.0, @aws-crypto/sha256-js@npm:^5.2.0": + version: 5.2.0 + resolution: "@aws-crypto/sha256-js@npm:5.2.0" dependencies: - tslib: "npm:^1.11.1" - checksum: 10/f5aee4a11a113ab9640474e75d398c99538aa30775f484cd519f0de0096ae0d4a6b68d2f0c685f24bd6f2425067c565bc20592c36c0dc1f4d28c1b4751a40734 + "@aws-crypto/util": "npm:^5.2.0" + "@aws-sdk/types": "npm:^3.222.0" + tslib: "npm:^2.6.2" + checksum: 10/f46aace7b873c615be4e787ab0efd0148ef7de48f9f12c7d043e05c52e52b75bb0bf6dbcb9b2852d940d7724fab7b6d5ff1469160a3dd024efe7a68b5f70df8c languageName: node linkType: hard -"@aws-crypto/sha256-browser@npm:3.0.0": - version: 3.0.0 - resolution: "@aws-crypto/sha256-browser@npm:3.0.0" +"@aws-crypto/supports-web-crypto@npm:^5.2.0": + version: 5.2.0 + resolution: "@aws-crypto/supports-web-crypto@npm:5.2.0" dependencies: - "@aws-crypto/ie11-detection": "npm:^3.0.0" - "@aws-crypto/sha256-js": "npm:^3.0.0" - "@aws-crypto/supports-web-crypto": "npm:^3.0.0" - "@aws-crypto/util": "npm:^3.0.0" - "@aws-sdk/types": "npm:^3.222.0" - "@aws-sdk/util-locate-window": "npm:^3.0.0" - "@aws-sdk/util-utf8-browser": "npm:^3.0.0" - tslib: "npm:^1.11.1" - checksum: 10/4e075906c48a46bbb8babb60db3e6b280db405a88c68b77c1496c26218292d5ea509beae3ccc19366ca6bc944c6d37fe347d0917909900dbac86f054a19c71c7 + tslib: "npm:^2.6.2" + checksum: 10/6ed0c7e17f4f6663d057630805c45edb35d5693380c24ab52d4c453ece303c6c8a6ade9ee93c97dda77d9f6cae376ffbb44467057161c513dffa3422250edaf5 languageName: node linkType: hard -"@aws-crypto/sha256-js@npm:3.0.0, @aws-crypto/sha256-js@npm:^3.0.0": - version: 3.0.0 - resolution: "@aws-crypto/sha256-js@npm:3.0.0" +"@aws-crypto/util@npm:^5.2.0": + version: 5.2.0 + resolution: "@aws-crypto/util@npm:5.2.0" dependencies: - "@aws-crypto/util": "npm:^3.0.0" "@aws-sdk/types": "npm:^3.222.0" - tslib: "npm:^1.11.1" - checksum: 10/f9fc2d51631950434d0f91f51c2ce17845d4e8e75971806e21604987e3186ee1e54de8a89e5349585b91cb36e56d5f058d6a45004e1bfbce1351dbb40f479152 + "@smithy/util-utf8": "npm:^2.0.0" + tslib: "npm:^2.6.2" + checksum: 10/f80a174c404e1ad4364741c942f440e75f834c08278fa754349fe23a6edc679d480ea9ced5820774aee58091ed270067022d8059ecf1a7ef452d58134ac7e9e1 + languageName: node + linkType: hard + +"@aws-sdk/client-cognito-identity@npm:3.817.0": + version: 3.817.0 + resolution: "@aws-sdk/client-cognito-identity@npm:3.817.0" + dependencies: + "@aws-crypto/sha256-browser": "npm:5.2.0" + "@aws-crypto/sha256-js": "npm:5.2.0" + "@aws-sdk/core": "npm:3.816.0" + "@aws-sdk/credential-provider-node": "npm:3.817.0" + "@aws-sdk/middleware-host-header": "npm:3.804.0" + "@aws-sdk/middleware-logger": "npm:3.804.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.804.0" + "@aws-sdk/middleware-user-agent": "npm:3.816.0" + "@aws-sdk/region-config-resolver": "npm:3.808.0" + "@aws-sdk/types": "npm:3.804.0" + "@aws-sdk/util-endpoints": "npm:3.808.0" + "@aws-sdk/util-user-agent-browser": "npm:3.804.0" + "@aws-sdk/util-user-agent-node": "npm:3.816.0" + "@smithy/config-resolver": "npm:^4.1.2" + "@smithy/core": "npm:^3.3.3" + "@smithy/fetch-http-handler": "npm:^5.0.2" + "@smithy/hash-node": "npm:^4.0.2" + "@smithy/invalid-dependency": "npm:^4.0.2" + "@smithy/middleware-content-length": "npm:^4.0.2" + "@smithy/middleware-endpoint": "npm:^4.1.6" + "@smithy/middleware-retry": "npm:^4.1.7" + "@smithy/middleware-serde": "npm:^4.0.5" + "@smithy/middleware-stack": "npm:^4.0.2" + "@smithy/node-config-provider": "npm:^4.1.1" + "@smithy/node-http-handler": "npm:^4.0.4" + "@smithy/protocol-http": "npm:^5.1.0" + "@smithy/smithy-client": "npm:^4.2.6" + "@smithy/types": "npm:^4.2.0" + "@smithy/url-parser": "npm:^4.0.2" + "@smithy/util-base64": "npm:^4.0.0" + "@smithy/util-body-length-browser": "npm:^4.0.0" + "@smithy/util-body-length-node": "npm:^4.0.0" + "@smithy/util-defaults-mode-browser": "npm:^4.0.14" + "@smithy/util-defaults-mode-node": "npm:^4.0.14" + "@smithy/util-endpoints": "npm:^3.0.4" + "@smithy/util-middleware": "npm:^4.0.2" + "@smithy/util-retry": "npm:^4.0.3" + "@smithy/util-utf8": "npm:^4.0.0" + tslib: "npm:^2.6.2" + checksum: 10/95670ae5b13e4af9729d7dce919dab202a103f3650c3db28f9658d4d40b37dfb9802eb245e8bb7c63a23f3b0567cd6a4c935e2417697d6577a485d07edd6a7c1 + languageName: node + linkType: hard + +"@aws-sdk/client-sso@npm:3.817.0": + version: 3.817.0 + resolution: "@aws-sdk/client-sso@npm:3.817.0" + dependencies: + "@aws-crypto/sha256-browser": "npm:5.2.0" + "@aws-crypto/sha256-js": "npm:5.2.0" + "@aws-sdk/core": "npm:3.816.0" + "@aws-sdk/middleware-host-header": "npm:3.804.0" + "@aws-sdk/middleware-logger": "npm:3.804.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.804.0" + "@aws-sdk/middleware-user-agent": "npm:3.816.0" + "@aws-sdk/region-config-resolver": "npm:3.808.0" + "@aws-sdk/types": "npm:3.804.0" + "@aws-sdk/util-endpoints": "npm:3.808.0" + "@aws-sdk/util-user-agent-browser": "npm:3.804.0" + "@aws-sdk/util-user-agent-node": "npm:3.816.0" + "@smithy/config-resolver": "npm:^4.1.2" + "@smithy/core": "npm:^3.3.3" + "@smithy/fetch-http-handler": "npm:^5.0.2" + "@smithy/hash-node": "npm:^4.0.2" + "@smithy/invalid-dependency": "npm:^4.0.2" + "@smithy/middleware-content-length": "npm:^4.0.2" + "@smithy/middleware-endpoint": "npm:^4.1.6" + "@smithy/middleware-retry": "npm:^4.1.7" + "@smithy/middleware-serde": "npm:^4.0.5" + "@smithy/middleware-stack": "npm:^4.0.2" + "@smithy/node-config-provider": "npm:^4.1.1" + "@smithy/node-http-handler": "npm:^4.0.4" + "@smithy/protocol-http": "npm:^5.1.0" + "@smithy/smithy-client": "npm:^4.2.6" + "@smithy/types": "npm:^4.2.0" + "@smithy/url-parser": "npm:^4.0.2" + "@smithy/util-base64": "npm:^4.0.0" + "@smithy/util-body-length-browser": "npm:^4.0.0" + "@smithy/util-body-length-node": "npm:^4.0.0" + "@smithy/util-defaults-mode-browser": "npm:^4.0.14" + "@smithy/util-defaults-mode-node": "npm:^4.0.14" + "@smithy/util-endpoints": "npm:^3.0.4" + "@smithy/util-middleware": "npm:^4.0.2" + "@smithy/util-retry": "npm:^4.0.3" + "@smithy/util-utf8": "npm:^4.0.0" + tslib: "npm:^2.6.2" + checksum: 10/72e4e1767d444784933d0414a7c6c197d216c8ff6aa760efea97533ec2bd10a9f841d9ef36d19510d644b42d455f0aec63bb97c13b8b4f3bab645c4741ceead2 + languageName: node + linkType: hard + +"@aws-sdk/core@npm:3.816.0": + version: 3.816.0 + resolution: "@aws-sdk/core@npm:3.816.0" + dependencies: + "@aws-sdk/types": "npm:3.804.0" + "@smithy/core": "npm:^3.3.3" + "@smithy/node-config-provider": "npm:^4.1.1" + "@smithy/property-provider": "npm:^4.0.2" + "@smithy/protocol-http": "npm:^5.1.0" + "@smithy/signature-v4": "npm:^5.1.0" + "@smithy/smithy-client": "npm:^4.2.6" + "@smithy/types": "npm:^4.2.0" + "@smithy/util-middleware": "npm:^4.0.2" + fast-xml-parser: "npm:4.4.1" + tslib: "npm:^2.6.2" + checksum: 10/2b6c4188969e00af0f4d77ed88b8b23b4654c0e66b3356ae062a0d40ab6831c78db1473efd20514c182f8d4033ce2728b0425a292c57246ceb22a177c17d970f + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-cognito-identity@npm:3.817.0": + version: 3.817.0 + resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.817.0" + dependencies: + "@aws-sdk/client-cognito-identity": "npm:3.817.0" + "@aws-sdk/types": "npm:3.804.0" + "@smithy/property-provider": "npm:^4.0.2" + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/caba36f8c92314016cb71b3ae757142f4f83cc600665341b1ba51a469ccb13dfcef4d5916d228edc25e055aeeb5a7617b2e5e850e8241527fe4cb07bd576a393 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-env@npm:3.816.0": + version: 3.816.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.816.0" + dependencies: + "@aws-sdk/core": "npm:3.816.0" + "@aws-sdk/types": "npm:3.804.0" + "@smithy/property-provider": "npm:^4.0.2" + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/0fcc1f287bfd4daa650b5d72a83c87c031f7b99e1877bd2ff78efc4d756b30e1f69770f2034294da1da05466b961cd4596a848b8e3295d8abf6502abdc48b35f + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-http@npm:3.816.0": + version: 3.816.0 + resolution: "@aws-sdk/credential-provider-http@npm:3.816.0" + dependencies: + "@aws-sdk/core": "npm:3.816.0" + "@aws-sdk/types": "npm:3.804.0" + "@smithy/fetch-http-handler": "npm:^5.0.2" + "@smithy/node-http-handler": "npm:^4.0.4" + "@smithy/property-provider": "npm:^4.0.2" + "@smithy/protocol-http": "npm:^5.1.0" + "@smithy/smithy-client": "npm:^4.2.6" + "@smithy/types": "npm:^4.2.0" + "@smithy/util-stream": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/ddc59373a984a1df1cb4efa50027d01dba0d7031b3d0d720edd8bf03d35e4c6ff2333fd8310603c7cc034308124f4f0412e3ca52d7c3d12dad6b0528de11fea0 + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-ini@npm:3.817.0": + version: 3.817.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.817.0" + dependencies: + "@aws-sdk/core": "npm:3.816.0" + "@aws-sdk/credential-provider-env": "npm:3.816.0" + "@aws-sdk/credential-provider-http": "npm:3.816.0" + "@aws-sdk/credential-provider-process": "npm:3.816.0" + "@aws-sdk/credential-provider-sso": "npm:3.817.0" + "@aws-sdk/credential-provider-web-identity": "npm:3.817.0" + "@aws-sdk/nested-clients": "npm:3.817.0" + "@aws-sdk/types": "npm:3.804.0" + "@smithy/credential-provider-imds": "npm:^4.0.4" + "@smithy/property-provider": "npm:^4.0.2" + "@smithy/shared-ini-file-loader": "npm:^4.0.2" + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/d7c6f44e1dbf2eedb20f45581990136e531975870866573ca2256c325f9ea96264c6e7a45e691622668f034f8d04937c65da5a5ddc18f169f02652ea37c1b7bb + languageName: node + linkType: hard + +"@aws-sdk/credential-provider-node@npm:3.817.0": + version: 3.817.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.817.0" + dependencies: + "@aws-sdk/credential-provider-env": "npm:3.816.0" + "@aws-sdk/credential-provider-http": "npm:3.816.0" + "@aws-sdk/credential-provider-ini": "npm:3.817.0" + "@aws-sdk/credential-provider-process": "npm:3.816.0" + "@aws-sdk/credential-provider-sso": "npm:3.817.0" + "@aws-sdk/credential-provider-web-identity": "npm:3.817.0" + "@aws-sdk/types": "npm:3.804.0" + "@smithy/credential-provider-imds": "npm:^4.0.4" + "@smithy/property-provider": "npm:^4.0.2" + "@smithy/shared-ini-file-loader": "npm:^4.0.2" + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/19aee97abcbbd3e84004d2be109c0e05e50947a78f3493ca98cadc1210a597d68eed6ab9a42b188dae8545349ea5e92fc43ae32209799e5e4ab4541df4e85f70 languageName: node linkType: hard -"@aws-crypto/supports-web-crypto@npm:^3.0.0": - version: 3.0.0 - resolution: "@aws-crypto/supports-web-crypto@npm:3.0.0" +"@aws-sdk/credential-provider-process@npm:3.816.0": + version: 3.816.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.816.0" dependencies: - tslib: "npm:^1.11.1" - checksum: 10/8a48788d2866e391354f256aa79b577b2ba1474b50184cbe690467de7e64a79928afece95007ab69a1556f99da97ea129487db091d94489847e14decdc7c9a6f + "@aws-sdk/core": "npm:3.816.0" + "@aws-sdk/types": "npm:3.804.0" + "@smithy/property-provider": "npm:^4.0.2" + "@smithy/shared-ini-file-loader": "npm:^4.0.2" + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/f52781ce364a37b7187a10f1f4beb5977e58fc8a2eedb1c67afd6f5cd1f07495be5f928a5aa1731a3b5874d86bb198754d6d81ef5a3b3a4e58bf4c35f16bc479 languageName: node linkType: hard -"@aws-crypto/util@npm:^3.0.0": - version: 3.0.0 - resolution: "@aws-crypto/util@npm:3.0.0" +"@aws-sdk/credential-provider-sso@npm:3.817.0": + version: 3.817.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.817.0" dependencies: - "@aws-sdk/types": "npm:^3.222.0" - "@aws-sdk/util-utf8-browser": "npm:^3.0.0" - tslib: "npm:^1.11.1" - checksum: 10/92c835b83d7a888b37b2f2a37c82e58bb8fabb617e371173c488d2a71b916c69ee566f0ea0b3f7f4e16296226c49793f95b3d59fc07a7ca00af91f8f9f29e6c4 - languageName: node - linkType: hard - -"@aws-sdk/abort-controller@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/abort-controller@npm:3.347.0" - dependencies: - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/7bce9589e601628ce89ed3254693345ee222c3c77d662f8121a85747dfb049f46cce340925bac65d62d2fb03770543ac74f8c470a7f6bdd39f32a50641b064d3 - languageName: node - linkType: hard - -"@aws-sdk/client-cognito-identity@npm:3.350.0": - version: 3.350.0 - resolution: "@aws-sdk/client-cognito-identity@npm:3.350.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:3.0.0" - "@aws-crypto/sha256-js": "npm:3.0.0" - "@aws-sdk/client-sts": "npm:3.350.0" - "@aws-sdk/config-resolver": "npm:3.347.0" - "@aws-sdk/credential-provider-node": "npm:3.350.0" - "@aws-sdk/fetch-http-handler": "npm:3.347.0" - "@aws-sdk/hash-node": "npm:3.347.0" - "@aws-sdk/invalid-dependency": "npm:3.347.0" - "@aws-sdk/middleware-content-length": "npm:3.347.0" - "@aws-sdk/middleware-endpoint": "npm:3.347.0" - "@aws-sdk/middleware-host-header": "npm:3.347.0" - "@aws-sdk/middleware-logger": "npm:3.347.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.347.0" - "@aws-sdk/middleware-retry": "npm:3.347.0" - "@aws-sdk/middleware-serde": "npm:3.347.0" - "@aws-sdk/middleware-signing": "npm:3.347.0" - "@aws-sdk/middleware-stack": "npm:3.347.0" - "@aws-sdk/middleware-user-agent": "npm:3.347.0" - "@aws-sdk/node-config-provider": "npm:3.347.0" - "@aws-sdk/node-http-handler": "npm:3.350.0" - "@aws-sdk/smithy-client": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/url-parser": "npm:3.347.0" - "@aws-sdk/util-base64": "npm:3.310.0" - "@aws-sdk/util-body-length-browser": "npm:3.310.0" - "@aws-sdk/util-body-length-node": "npm:3.310.0" - "@aws-sdk/util-defaults-mode-browser": "npm:3.347.0" - "@aws-sdk/util-defaults-mode-node": "npm:3.347.0" - "@aws-sdk/util-endpoints": "npm:3.347.0" - "@aws-sdk/util-retry": "npm:3.347.0" - "@aws-sdk/util-user-agent-browser": "npm:3.347.0" - "@aws-sdk/util-user-agent-node": "npm:3.347.0" - "@aws-sdk/util-utf8": "npm:3.310.0" - "@smithy/protocol-http": "npm:^1.0.1" - "@smithy/types": "npm:^1.0.0" - tslib: "npm:^2.5.0" - checksum: 10/7031979d8380e90525c835e7e1db704acb323681d2588ecabf07b2e49f055e3b3e65a57a0ae2f80476ecf232f156b8afb7079fd28c228676d87a2acdbe7948a3 - languageName: node - linkType: hard - -"@aws-sdk/client-sso-oidc@npm:3.350.0": - version: 3.350.0 - resolution: "@aws-sdk/client-sso-oidc@npm:3.350.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:3.0.0" - "@aws-crypto/sha256-js": "npm:3.0.0" - "@aws-sdk/config-resolver": "npm:3.347.0" - "@aws-sdk/fetch-http-handler": "npm:3.347.0" - "@aws-sdk/hash-node": "npm:3.347.0" - "@aws-sdk/invalid-dependency": "npm:3.347.0" - "@aws-sdk/middleware-content-length": "npm:3.347.0" - "@aws-sdk/middleware-endpoint": "npm:3.347.0" - "@aws-sdk/middleware-host-header": "npm:3.347.0" - "@aws-sdk/middleware-logger": "npm:3.347.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.347.0" - "@aws-sdk/middleware-retry": "npm:3.347.0" - "@aws-sdk/middleware-serde": "npm:3.347.0" - "@aws-sdk/middleware-stack": "npm:3.347.0" - "@aws-sdk/middleware-user-agent": "npm:3.347.0" - "@aws-sdk/node-config-provider": "npm:3.347.0" - "@aws-sdk/node-http-handler": "npm:3.350.0" - "@aws-sdk/smithy-client": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/url-parser": "npm:3.347.0" - "@aws-sdk/util-base64": "npm:3.310.0" - "@aws-sdk/util-body-length-browser": "npm:3.310.0" - "@aws-sdk/util-body-length-node": "npm:3.310.0" - "@aws-sdk/util-defaults-mode-browser": "npm:3.347.0" - "@aws-sdk/util-defaults-mode-node": "npm:3.347.0" - "@aws-sdk/util-endpoints": "npm:3.347.0" - "@aws-sdk/util-retry": "npm:3.347.0" - "@aws-sdk/util-user-agent-browser": "npm:3.347.0" - "@aws-sdk/util-user-agent-node": "npm:3.347.0" - "@aws-sdk/util-utf8": "npm:3.310.0" - "@smithy/protocol-http": "npm:^1.0.1" - "@smithy/types": "npm:^1.0.0" - tslib: "npm:^2.5.0" - checksum: 10/af0573ad1c47de247e55fa158b92f4d3e92c1fa8ef5bec7cd6d8f8c6e676bf5b7a9fad3dd7c67596db763da587d925ea9f4668ae6d42d7846373133597a4aecd - languageName: node - linkType: hard - -"@aws-sdk/client-sso@npm:3.350.0": - version: 3.350.0 - resolution: "@aws-sdk/client-sso@npm:3.350.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:3.0.0" - "@aws-crypto/sha256-js": "npm:3.0.0" - "@aws-sdk/config-resolver": "npm:3.347.0" - "@aws-sdk/fetch-http-handler": "npm:3.347.0" - "@aws-sdk/hash-node": "npm:3.347.0" - "@aws-sdk/invalid-dependency": "npm:3.347.0" - "@aws-sdk/middleware-content-length": "npm:3.347.0" - "@aws-sdk/middleware-endpoint": "npm:3.347.0" - "@aws-sdk/middleware-host-header": "npm:3.347.0" - "@aws-sdk/middleware-logger": "npm:3.347.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.347.0" - "@aws-sdk/middleware-retry": "npm:3.347.0" - "@aws-sdk/middleware-serde": "npm:3.347.0" - "@aws-sdk/middleware-stack": "npm:3.347.0" - "@aws-sdk/middleware-user-agent": "npm:3.347.0" - "@aws-sdk/node-config-provider": "npm:3.347.0" - "@aws-sdk/node-http-handler": "npm:3.350.0" - "@aws-sdk/smithy-client": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/url-parser": "npm:3.347.0" - "@aws-sdk/util-base64": "npm:3.310.0" - "@aws-sdk/util-body-length-browser": "npm:3.310.0" - "@aws-sdk/util-body-length-node": "npm:3.310.0" - "@aws-sdk/util-defaults-mode-browser": "npm:3.347.0" - "@aws-sdk/util-defaults-mode-node": "npm:3.347.0" - "@aws-sdk/util-endpoints": "npm:3.347.0" - "@aws-sdk/util-retry": "npm:3.347.0" - "@aws-sdk/util-user-agent-browser": "npm:3.347.0" - "@aws-sdk/util-user-agent-node": "npm:3.347.0" - "@aws-sdk/util-utf8": "npm:3.310.0" - "@smithy/protocol-http": "npm:^1.0.1" - "@smithy/types": "npm:^1.0.0" - tslib: "npm:^2.5.0" - checksum: 10/0da663b0bc6f67ee3ed704b9e244d0c1bea959cfe2d1c86b631e152c2377ccd5642d63509a6c00202b0076d72c0d07e69fa58103e836009fc9069e394416135d - languageName: node - linkType: hard - -"@aws-sdk/client-sts@npm:3.350.0": - version: 3.350.0 - resolution: "@aws-sdk/client-sts@npm:3.350.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:3.0.0" - "@aws-crypto/sha256-js": "npm:3.0.0" - "@aws-sdk/config-resolver": "npm:3.347.0" - "@aws-sdk/credential-provider-node": "npm:3.350.0" - "@aws-sdk/fetch-http-handler": "npm:3.347.0" - "@aws-sdk/hash-node": "npm:3.347.0" - "@aws-sdk/invalid-dependency": "npm:3.347.0" - "@aws-sdk/middleware-content-length": "npm:3.347.0" - "@aws-sdk/middleware-endpoint": "npm:3.347.0" - "@aws-sdk/middleware-host-header": "npm:3.347.0" - "@aws-sdk/middleware-logger": "npm:3.347.0" - "@aws-sdk/middleware-recursion-detection": "npm:3.347.0" - "@aws-sdk/middleware-retry": "npm:3.347.0" - "@aws-sdk/middleware-sdk-sts": "npm:3.347.0" - "@aws-sdk/middleware-serde": "npm:3.347.0" - "@aws-sdk/middleware-signing": "npm:3.347.0" - "@aws-sdk/middleware-stack": "npm:3.347.0" - "@aws-sdk/middleware-user-agent": "npm:3.347.0" - "@aws-sdk/node-config-provider": "npm:3.347.0" - "@aws-sdk/node-http-handler": "npm:3.350.0" - "@aws-sdk/smithy-client": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/url-parser": "npm:3.347.0" - "@aws-sdk/util-base64": "npm:3.310.0" - "@aws-sdk/util-body-length-browser": "npm:3.310.0" - "@aws-sdk/util-body-length-node": "npm:3.310.0" - "@aws-sdk/util-defaults-mode-browser": "npm:3.347.0" - "@aws-sdk/util-defaults-mode-node": "npm:3.347.0" - "@aws-sdk/util-endpoints": "npm:3.347.0" - "@aws-sdk/util-retry": "npm:3.347.0" - "@aws-sdk/util-user-agent-browser": "npm:3.347.0" - "@aws-sdk/util-user-agent-node": "npm:3.347.0" - "@aws-sdk/util-utf8": "npm:3.310.0" - "@smithy/protocol-http": "npm:^1.0.1" - "@smithy/types": "npm:^1.0.0" - fast-xml-parser: "npm:4.2.4" - tslib: "npm:^2.5.0" - checksum: 10/9b7a5e23c82915546e07a8bec6cda4b9ad905e41f37ba4547883ec27c6ffde0fee4753eae2d5446a9d6831a9015b4d088248ea2441516753ba9635abd6e72f8a - languageName: node - linkType: hard - -"@aws-sdk/config-resolver@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/config-resolver@npm:3.347.0" - dependencies: - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/util-config-provider": "npm:3.310.0" - "@aws-sdk/util-middleware": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/4709deafbf1eb5af5142435dd5c4b47b6e614e7287445bdf6e322ddfbc396f4dc4efaa1c8d690a7d8449d3cef2e314bf942c4ffecc94dfd27e643c4c2705bc51 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-cognito-identity@npm:3.350.0": - version: 3.350.0 - resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.350.0" - dependencies: - "@aws-sdk/client-cognito-identity": "npm:3.350.0" - "@aws-sdk/property-provider": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/edad650da30779a22bc3c46f96f0a40e62b780986ea2deabf759755245c377c16aeee2d4802e64d5a66ab295a5dc28db99cf0ec498fd1f89eb06c76ac652e4e3 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-env@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.347.0" - dependencies: - "@aws-sdk/property-provider": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/41f8669df7ef56a82016e77d3e05fe7e0f6670ff296a9cab4474f90e21b7663929bd4db496529c0e5f0cd86248dd45b72f1545ab74685c51b2ebf38d57a9d716 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-imds@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/credential-provider-imds@npm:3.347.0" - dependencies: - "@aws-sdk/node-config-provider": "npm:3.347.0" - "@aws-sdk/property-provider": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/url-parser": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/9b8e63f636f1418fd041da450cce7f79bbe50049be68fc16b2667ebc438444f8fc2bc9eee2f1d1799d0b3f143010ac1d021f9511465c9003e43bcf61632d03b5 + "@aws-sdk/client-sso": "npm:3.817.0" + "@aws-sdk/core": "npm:3.816.0" + "@aws-sdk/token-providers": "npm:3.817.0" + "@aws-sdk/types": "npm:3.804.0" + "@smithy/property-provider": "npm:^4.0.2" + "@smithy/shared-ini-file-loader": "npm:^4.0.2" + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/b6fc63d0c7e6582591b30f53250429a9eb6f8e116ec3fce1cff4cb892264ff87d5c69b68a3eea23f1630d63d8a80b544142726a0687f2c76a6533bd58bd6ddec languageName: node - linkType: hard + linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.350.0": - version: 3.350.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.350.0" +"@aws-sdk/credential-provider-web-identity@npm:3.817.0": + version: 3.817.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.817.0" dependencies: - "@aws-sdk/credential-provider-env": "npm:3.347.0" - "@aws-sdk/credential-provider-imds": "npm:3.347.0" - "@aws-sdk/credential-provider-process": "npm:3.347.0" - "@aws-sdk/credential-provider-sso": "npm:3.350.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.347.0" - "@aws-sdk/property-provider": "npm:3.347.0" - "@aws-sdk/shared-ini-file-loader": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/3d3fe05907247674a2a55ecf66ac658c61b76b4dedb78e0b95f991e6753a736b265e1ff58da9913a5b9afca115b1cd3b0e8d47036290e336f743dfae0c551a7e + "@aws-sdk/core": "npm:3.816.0" + "@aws-sdk/nested-clients": "npm:3.817.0" + "@aws-sdk/types": "npm:3.804.0" + "@smithy/property-provider": "npm:^4.0.2" + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/8b6b3fe7c20e633a576af4a3ae085bc5d858883a78630372082085294f2f37ef951a1f86574981b52dd6946ff49015f61eec4b3e457ef73491563f47b4873389 languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.350.0": - version: 3.350.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.350.0" - dependencies: - "@aws-sdk/credential-provider-env": "npm:3.347.0" - "@aws-sdk/credential-provider-imds": "npm:3.347.0" - "@aws-sdk/credential-provider-ini": "npm:3.350.0" - "@aws-sdk/credential-provider-process": "npm:3.347.0" - "@aws-sdk/credential-provider-sso": "npm:3.350.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.347.0" - "@aws-sdk/property-provider": "npm:3.347.0" - "@aws-sdk/shared-ini-file-loader": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/38106859b2c870cd315e7048b640ab04fdb2026eb0251dcb3ecb644356bb6194e00a45503b26a41e12e1f25d9cbe70abdec6610e1ad131dcabb83d6dd2191593 +"@aws-sdk/credential-providers@npm:^3.186.0": + version: 3.817.0 + resolution: "@aws-sdk/credential-providers@npm:3.817.0" + dependencies: + "@aws-sdk/client-cognito-identity": "npm:3.817.0" + "@aws-sdk/core": "npm:3.816.0" + "@aws-sdk/credential-provider-cognito-identity": "npm:3.817.0" + "@aws-sdk/credential-provider-env": "npm:3.816.0" + "@aws-sdk/credential-provider-http": "npm:3.816.0" + "@aws-sdk/credential-provider-ini": "npm:3.817.0" + "@aws-sdk/credential-provider-node": "npm:3.817.0" + "@aws-sdk/credential-provider-process": "npm:3.816.0" + "@aws-sdk/credential-provider-sso": "npm:3.817.0" + "@aws-sdk/credential-provider-web-identity": "npm:3.817.0" + "@aws-sdk/nested-clients": "npm:3.817.0" + "@aws-sdk/types": "npm:3.804.0" + "@smithy/config-resolver": "npm:^4.1.2" + "@smithy/core": "npm:^3.3.3" + "@smithy/credential-provider-imds": "npm:^4.0.4" + "@smithy/node-config-provider": "npm:^4.1.1" + "@smithy/property-provider": "npm:^4.0.2" + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/deeec91aecf71cbd7a9141559053cdf6be60944fb0fe1a217811e87a03ddb7e8daa6fccf872041f47cccc9e5a7b8871853ba98848b6e734ec972d89dd50814e8 + languageName: node + linkType: hard + +"@aws-sdk/middleware-host-header@npm:3.804.0": + version: 3.804.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.804.0" + dependencies: + "@aws-sdk/types": "npm:3.804.0" + "@smithy/protocol-http": "npm:^5.1.0" + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/e511fc88eabf44a88458a24ad134933a01cc44704db5f9baaa179e87a541da7fee2de55ea5d1e16daedb5cad40d270d4f2fab41dd0b16db7ffa812461409194d + languageName: node + linkType: hard + +"@aws-sdk/middleware-logger@npm:3.804.0": + version: 3.804.0 + resolution: "@aws-sdk/middleware-logger@npm:3.804.0" + dependencies: + "@aws-sdk/types": "npm:3.804.0" + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/18097aae48558cf5d40bda906829b500693c9a22378babd9f177886cdb88eaf3da28cf38c09952502d9f951f50821a4f9082270c77329a12e61dc4d74905ec32 + languageName: node + linkType: hard + +"@aws-sdk/middleware-recursion-detection@npm:3.804.0": + version: 3.804.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.804.0" + dependencies: + "@aws-sdk/types": "npm:3.804.0" + "@smithy/protocol-http": "npm:^5.1.0" + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/781b4fa873a10b2b058f66eb5e5ddb758695edc62a1e802f2cba6e845e1e5e578d59e6adad4e0978020271eec5d1974b044bd529798cec1105b93ecc077ffa7d + languageName: node + linkType: hard + +"@aws-sdk/middleware-user-agent@npm:3.816.0": + version: 3.816.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.816.0" + dependencies: + "@aws-sdk/core": "npm:3.816.0" + "@aws-sdk/types": "npm:3.804.0" + "@aws-sdk/util-endpoints": "npm:3.808.0" + "@smithy/core": "npm:^3.3.3" + "@smithy/protocol-http": "npm:^5.1.0" + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/1b5fafbd21b1cf96309c5063472d3a91c8e202e1762bf965310da3723bc191eccc891e1d89b3602a312b051ce8221ec029d13215920dfb42502c897478da3ef9 + languageName: node + linkType: hard + +"@aws-sdk/nested-clients@npm:3.817.0": + version: 3.817.0 + resolution: "@aws-sdk/nested-clients@npm:3.817.0" + dependencies: + "@aws-crypto/sha256-browser": "npm:5.2.0" + "@aws-crypto/sha256-js": "npm:5.2.0" + "@aws-sdk/core": "npm:3.816.0" + "@aws-sdk/middleware-host-header": "npm:3.804.0" + "@aws-sdk/middleware-logger": "npm:3.804.0" + "@aws-sdk/middleware-recursion-detection": "npm:3.804.0" + "@aws-sdk/middleware-user-agent": "npm:3.816.0" + "@aws-sdk/region-config-resolver": "npm:3.808.0" + "@aws-sdk/types": "npm:3.804.0" + "@aws-sdk/util-endpoints": "npm:3.808.0" + "@aws-sdk/util-user-agent-browser": "npm:3.804.0" + "@aws-sdk/util-user-agent-node": "npm:3.816.0" + "@smithy/config-resolver": "npm:^4.1.2" + "@smithy/core": "npm:^3.3.3" + "@smithy/fetch-http-handler": "npm:^5.0.2" + "@smithy/hash-node": "npm:^4.0.2" + "@smithy/invalid-dependency": "npm:^4.0.2" + "@smithy/middleware-content-length": "npm:^4.0.2" + "@smithy/middleware-endpoint": "npm:^4.1.6" + "@smithy/middleware-retry": "npm:^4.1.7" + "@smithy/middleware-serde": "npm:^4.0.5" + "@smithy/middleware-stack": "npm:^4.0.2" + "@smithy/node-config-provider": "npm:^4.1.1" + "@smithy/node-http-handler": "npm:^4.0.4" + "@smithy/protocol-http": "npm:^5.1.0" + "@smithy/smithy-client": "npm:^4.2.6" + "@smithy/types": "npm:^4.2.0" + "@smithy/url-parser": "npm:^4.0.2" + "@smithy/util-base64": "npm:^4.0.0" + "@smithy/util-body-length-browser": "npm:^4.0.0" + "@smithy/util-body-length-node": "npm:^4.0.0" + "@smithy/util-defaults-mode-browser": "npm:^4.0.14" + "@smithy/util-defaults-mode-node": "npm:^4.0.14" + "@smithy/util-endpoints": "npm:^3.0.4" + "@smithy/util-middleware": "npm:^4.0.2" + "@smithy/util-retry": "npm:^4.0.3" + "@smithy/util-utf8": "npm:^4.0.0" + tslib: "npm:^2.6.2" + checksum: 10/ee798825612fd68566af155e79b200f02809f3e367c05105baec617bb06a46b958766f096b9221732f7bec53c921cef1df63c3a10868b5ea170fec7d6d53f9bf languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.347.0" +"@aws-sdk/region-config-resolver@npm:3.808.0": + version: 3.808.0 + resolution: "@aws-sdk/region-config-resolver@npm:3.808.0" dependencies: - "@aws-sdk/property-provider": "npm:3.347.0" - "@aws-sdk/shared-ini-file-loader": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/f0403438e1238b6513f6b1fb2e226d81c83641e84e0932311db2ae6cbb46852f4a7fdada9a198f39dccc6368bcd8c463695a13b8def29811f057ee0c95e91b3a + "@aws-sdk/types": "npm:3.804.0" + "@smithy/node-config-provider": "npm:^4.1.1" + "@smithy/types": "npm:^4.2.0" + "@smithy/util-config-provider": "npm:^4.0.0" + "@smithy/util-middleware": "npm:^4.0.2" + tslib: "npm:^2.6.2" + checksum: 10/b3710a568ba23af4169a87c497ffaebfa764f3439f3e515ec6ab4b6cd445b16901445b907fb8496a6175f86dccefbef396df23211cad5c75b899a473a8e3fda3 languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.350.0": - version: 3.350.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.350.0" - dependencies: - "@aws-sdk/client-sso": "npm:3.350.0" - "@aws-sdk/property-provider": "npm:3.347.0" - "@aws-sdk/shared-ini-file-loader": "npm:3.347.0" - "@aws-sdk/token-providers": "npm:3.350.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/da6222ad43d56752520b58734b94516782042f39b927a647fe3d24b02f1ca3e835066f7e2f1b306d23eaa0da6d4ada723621c6bc7fe485df9c3240c28d8b707f +"@aws-sdk/token-providers@npm:3.817.0": + version: 3.817.0 + resolution: "@aws-sdk/token-providers@npm:3.817.0" + dependencies: + "@aws-sdk/core": "npm:3.816.0" + "@aws-sdk/nested-clients": "npm:3.817.0" + "@aws-sdk/types": "npm:3.804.0" + "@smithy/property-provider": "npm:^4.0.2" + "@smithy/shared-ini-file-loader": "npm:^4.0.2" + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/f28319417ac3b94a8340d35672b6e75d421c7dc837d5dfb45a1e06ad94f5d6b2cf4b0b7639b7f2869dcf9a94c7a5d7ecfe23f7cd02efa81ef6fa99a8e30845c2 + languageName: node + linkType: hard + +"@aws-sdk/types@npm:3.804.0, @aws-sdk/types@npm:^3.222.0": + version: 3.804.0 + resolution: "@aws-sdk/types@npm:3.804.0" + dependencies: + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + checksum: 10/832be8774a2322f2114c93a632876308edd94b4def2005facade754e0ada38a96dab0919444387440ae94f5b562c6b8195b93a70c401c3fa6541f1980224739d + languageName: node + linkType: hard + +"@aws-sdk/util-endpoints@npm:3.808.0": + version: 3.808.0 + resolution: "@aws-sdk/util-endpoints@npm:3.808.0" + dependencies: + "@aws-sdk/types": "npm:3.804.0" + "@smithy/types": "npm:^4.2.0" + "@smithy/util-endpoints": "npm:^3.0.4" + tslib: "npm:^2.6.2" + checksum: 10/bc735ac0d7c58d12e5ef820050879bba7300534ff9e05a3f0c3cb32ac5874e208b7e000e5cb4d04f407789cef0e48926e1564a5edc89f64a141b3494970f6ba4 languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.347.0" +"@aws-sdk/util-locate-window@npm:^3.0.0": + version: 3.804.0 + resolution: "@aws-sdk/util-locate-window@npm:3.804.0" dependencies: - "@aws-sdk/property-provider": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/f1cb28eb8a6fe13b9f2b12b91af2558cc523fecbb7e965d643fe69773968375a1dfa99b13a8be464239126d65df2c948259ef5c5ce0c72b38592d997f35c7c22 + tslib: "npm:^2.6.2" + checksum: 10/4f1ad094cf9f23a6f09dbad8823d3c58d628412352a045e2fb3bea66281aa59a944545ffd8ed09b096b60b44671fb3fd3f3bfb5b924f3326ee82fb68c2c7b785 languageName: node linkType: hard -"@aws-sdk/credential-providers@npm:^3.186.0": - version: 3.350.0 - resolution: "@aws-sdk/credential-providers@npm:3.350.0" +"@aws-sdk/util-user-agent-browser@npm:3.804.0": + version: 3.804.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.804.0" dependencies: - "@aws-sdk/client-cognito-identity": "npm:3.350.0" - "@aws-sdk/client-sso": "npm:3.350.0" - "@aws-sdk/client-sts": "npm:3.350.0" - "@aws-sdk/credential-provider-cognito-identity": "npm:3.350.0" - "@aws-sdk/credential-provider-env": "npm:3.347.0" - "@aws-sdk/credential-provider-imds": "npm:3.347.0" - "@aws-sdk/credential-provider-ini": "npm:3.350.0" - "@aws-sdk/credential-provider-node": "npm:3.350.0" - "@aws-sdk/credential-provider-process": "npm:3.347.0" - "@aws-sdk/credential-provider-sso": "npm:3.350.0" - "@aws-sdk/credential-provider-web-identity": "npm:3.347.0" - "@aws-sdk/property-provider": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/eb342eee88a35bb4037804b46f16fab864cce448e2384127f9fd159ef6db3a8afc57bcd13a995093ff8f1e7032c40b65edcd2c99bba69361ae4684c0507bb3ae + "@aws-sdk/types": "npm:3.804.0" + "@smithy/types": "npm:^4.2.0" + bowser: "npm:^2.11.0" + tslib: "npm:^2.6.2" + checksum: 10/6fe62a4625acc86cc018e6646b6737eec1aface0f0ae8215431eef740635cf3d2339e859f77d4030db696ac36a69a309fe2d2534b45e790feeb596f39c83e135 languageName: node linkType: hard -"@aws-sdk/eventstream-codec@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/eventstream-codec@npm:3.347.0" +"@aws-sdk/util-user-agent-node@npm:3.816.0": + version: 3.816.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.816.0" dependencies: - "@aws-crypto/crc32": "npm:3.0.0" - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/util-hex-encoding": "npm:3.310.0" - tslib: "npm:^2.5.0" - checksum: 10/9bef859bf6f19a4a5c20103c61a040efb34318e7730122d41161ba473e8a6820276de945fec213c4ce3e4df2349f26bcd7ef2321c85c3b816fb78d17a465fee1 + "@aws-sdk/middleware-user-agent": "npm:3.816.0" + "@aws-sdk/types": "npm:3.804.0" + "@smithy/node-config-provider": "npm:^4.1.1" + "@smithy/types": "npm:^4.2.0" + tslib: "npm:^2.6.2" + peerDependencies: + aws-crt: ">=1.0.0" + peerDependenciesMeta: + aws-crt: + optional: true + checksum: 10/96ac27c29054912103420c6d2b5997d04f60ec135ee3b4c26ce09a241cbba1de74a39217278186be91e44ab936f0a2b302644d2365265a8b53669b3599dc289e languageName: node linkType: hard -"@aws-sdk/fetch-http-handler@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/fetch-http-handler@npm:3.347.0" +"@babel/code-frame@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/code-frame@npm:7.27.1" dependencies: - "@aws-sdk/protocol-http": "npm:3.347.0" - "@aws-sdk/querystring-builder": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/util-base64": "npm:3.310.0" - tslib: "npm:^2.5.0" - checksum: 10/f5818475d70ed8624c51b06019fb75bd2ab2d6520b9e5f7721079c5003dc57c1e0eda74227c35e8ffebbfe7e496748859fed0bb167eb8f26412a2298c2d6a675 + "@babel/helper-validator-identifier": "npm:^7.27.1" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10/721b8a6e360a1fa0f1c9fe7351ae6c874828e119183688b533c477aa378f1010f37cc9afbfc4722c686d1f5cdd00da02eab4ba7278a0c504fa0d7a321dcd4fdf languageName: node linkType: hard -"@aws-sdk/hash-node@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/hash-node@npm:3.347.0" - dependencies: - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/util-buffer-from": "npm:3.310.0" - "@aws-sdk/util-utf8": "npm:3.310.0" - tslib: "npm:^2.5.0" - checksum: 10/ccfdbcb9b4f6ef2be67057aa96ee20fbd5c2f46d485c5f371d4267ff8a7e075c3dcd3453a085d52bd456310228cf6e5e6921d33cd844266d95bb9be8e1d25167 +"@babel/compat-data@npm:^7.27.2": + version: 7.27.2 + resolution: "@babel/compat-data@npm:7.27.2" + checksum: 10/eaa9f8aaeb9475779f4411fa397f712a6441b650d4e0b40c5535c954c891cd35c0363004db42902192aa8224532ac31ce06890478b060995286fe4fadd54e542 languageName: node linkType: hard -"@aws-sdk/invalid-dependency@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/invalid-dependency@npm:3.347.0" +"@babel/core@npm:^7.26.10": + version: 7.27.1 + resolution: "@babel/core@npm:7.27.1" dependencies: - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/1c0b0c883fd8c090eeccd67545f03c6309928bbfbd24a697d65e286280c3ee467f85d48839a42b9be0aaf6b783505ca8996d7c64caac52bd0d0fd66196e87f63 + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.27.1" + "@babel/generator": "npm:^7.27.1" + "@babel/helper-compilation-targets": "npm:^7.27.1" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helpers": "npm:^7.27.1" + "@babel/parser": "npm:^7.27.1" + "@babel/template": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10/3dfec88f84b3ce567e6c482db0119f02f451bd3f86b0835c71c029fedb657969786507fafedd3a0732bd1be9fbc9f0635d734efafabad6dbc67d3eb7b494cdd8 languageName: node linkType: hard -"@aws-sdk/is-array-buffer@npm:3.310.0": - version: 3.310.0 - resolution: "@aws-sdk/is-array-buffer@npm:3.310.0" +"@babel/generator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/generator@npm:7.27.1" dependencies: - tslib: "npm:^2.5.0" - checksum: 10/5d4ed0d6ce00eed0dea61f5ce7ea23ae691ef2fa8c0eea88e0c334fd533483c4892110adb7ae671e7e5c7b26c1b7dcad5560e388fa04947d92e689ffef942340 + "@babel/parser": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10/6101825922a8a116e64b507d9309b38c5bc027b333d7111fcb760422741d3c72bd8f8e5aa935c2944c434ffe376353a27afa3a25a8526dc2ef90743d266770db languageName: node linkType: hard -"@aws-sdk/middleware-content-length@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/middleware-content-length@npm:3.347.0" +"@babel/helper-compilation-targets@npm:^7.27.1": + version: 7.27.2 + resolution: "@babel/helper-compilation-targets@npm:7.27.2" dependencies: - "@aws-sdk/protocol-http": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/32844e5d95f566d6962676cc973c6d6d5dc4fbeb4d7893857cac46e9a1963426f17e28f298a5a6e142823e619d38a89805f8dc53d705bdb27ae1ef2619528805 + "@babel/compat-data": "npm:^7.27.2" + "@babel/helper-validator-option": "npm:^7.27.1" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10/bd53c30a7477049db04b655d11f4c3500aea3bcbc2497cf02161de2ecf994fec7c098aabbcebe210ffabc2ecbdb1e3ffad23fb4d3f18723b814f423ea1749fe8 languageName: node linkType: hard -"@aws-sdk/middleware-endpoint@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/middleware-endpoint@npm:3.347.0" +"@babel/helper-module-imports@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-module-imports@npm:7.27.1" dependencies: - "@aws-sdk/middleware-serde": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/url-parser": "npm:3.347.0" - "@aws-sdk/util-middleware": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/0b25737da00fce1ea82879a36d1b08c829370f261dfb75f25dd0380027bf60ef4d2d74e62999e3e0e237d8b3cb4501de0830be253ed43de4fb435dfb8ebcd657 + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10/58e792ea5d4ae71676e0d03d9fef33e886a09602addc3bd01388a98d87df9fcfd192968feb40ac4aedb7e287ec3d0c17b33e3ecefe002592041a91d8a1998a8d languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.347.0" +"@babel/helper-module-transforms@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-module-transforms@npm:7.27.1" dependencies: - "@aws-sdk/protocol-http": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/45e2cd7e0c4a8496294a2a5157b77c5247dd4f338ca319d9711807745f8232cded71f268318d91310788cc669a5e8f7f8d3bc6df36a451882234414d51f7f7df + "@babel/helper-module-imports": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/415509a5854203073755aab3ad293664146a55777355b5b5187902f976162c9565907d2276f7f6e778527be4829db2d926015d446100a65f2538d6397d83e248 languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/middleware-logger@npm:3.347.0" - dependencies: - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/ef0e1b8ada4d99390b91dfa6988cf6095fff117744fd7f1bb273d11db8fd6eb85a9ab24bdfbee464c92e0fc20d028c32814eac976932321d4ae5cc3feacc0cf4 +"@babel/helper-plugin-utils@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-plugin-utils@npm:7.27.1" + checksum: 10/96136c2428888e620e2ec493c25888f9ceb4a21099dcf3dd4508ea64b58cdedbd5a9fb6c7b352546de84d6c24edafe482318646932a22c449ebd16d16c22d864 languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.347.0" - dependencies: - "@aws-sdk/protocol-http": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/99c6a7c217fb827c77ea50e38a9faedc5decc8eed369d8a08f238102de955a2ba0fbe30f93fa1a0863f430edf509582c20e9361830264f9e716a0983149459cf +"@babel/helper-string-parser@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 10/0ae29cc2005084abdae2966afdb86ed14d41c9c37db02c3693d5022fba9f5d59b011d039380b8e537c34daf117c549f52b452398f576e908fb9db3c7abbb3a00 languageName: node linkType: hard -"@aws-sdk/middleware-retry@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/middleware-retry@npm:3.347.0" - dependencies: - "@aws-sdk/protocol-http": "npm:3.347.0" - "@aws-sdk/service-error-classification": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/util-middleware": "npm:3.347.0" - "@aws-sdk/util-retry": "npm:3.347.0" - tslib: "npm:^2.5.0" - uuid: "npm:^8.3.2" - checksum: 10/e5f86f05ed80b4f925c525d1058841c94e65586cc7c56552558eb143ba23b8ed8a0b32202fde510134aff66dfe56f9be1c97235c54793a48eb5e6d5f73156129 +"@babel/helper-validator-identifier@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-identifier@npm:7.27.1" + checksum: 10/75041904d21bdc0cd3b07a8ac90b11d64cd3c881e89cb936fa80edd734bf23c35e6bd1312611e8574c4eab1f3af0f63e8a5894f4699e9cfdf70c06fcf4252320 languageName: node linkType: hard -"@aws-sdk/middleware-sdk-sts@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/middleware-sdk-sts@npm:3.347.0" - dependencies: - "@aws-sdk/middleware-signing": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/618928e88ddf7205a1bd402c53ca0e0ed3a3e2d6423c96615c7ec3c6c4f8673f2c06e0eed70fbaac0d57b7c0251b4cf1fc5a2939eff8591e48df0eab2c1e02a9 +"@babel/helper-validator-option@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-option@npm:7.27.1" + checksum: 10/db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903 languageName: node linkType: hard -"@aws-sdk/middleware-serde@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/middleware-serde@npm:3.347.0" +"@babel/helpers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helpers@npm:7.27.1" dependencies: - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/c8909f853958434cdce75114dc128a336de8940150451183e73b3cdebe875de81e4d18e65ea4b342ff8601e21ce75ee6b67315f66a968258abbbc5500da6f389 + "@babel/template": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10/b86ee2c87d52640c63ec1fdf139d4560efc173ae6379659e0df49a3c0cf1d5f24436132ebb4459a4ee72418b43b39ee001f4e01465b48c8d31911a745ec4fd74 languageName: node linkType: hard -"@aws-sdk/middleware-signing@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/middleware-signing@npm:3.347.0" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.27.1, @babel/parser@npm:^7.27.2": + version: 7.27.2 + resolution: "@babel/parser@npm:7.27.2" dependencies: - "@aws-sdk/property-provider": "npm:3.347.0" - "@aws-sdk/protocol-http": "npm:3.347.0" - "@aws-sdk/signature-v4": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/util-middleware": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/7eaeb9267438669af8a00b6364c10460b87e037b39710c126e9b8b1f2cd562a42768630decbad76e0a8d245520b542fd00cea2ae3a6cd2d712d091c38a2207d6 + "@babel/types": "npm:^7.27.1" + bin: + parser: ./bin/babel-parser.js + checksum: 10/133b4ccfbc01d4f36b0945937aabff87026c29fda6dcd3c842053a672e50f2487a101a3acd150bbaa2eecd33f3bd35650f95b806567c926f93b2af35c2b615c9 languageName: node linkType: hard -"@aws-sdk/middleware-stack@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/middleware-stack@npm:3.347.0" +"@babel/plugin-transform-react-jsx-self@npm:^7.25.9": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.27.1" dependencies: - tslib: "npm:^2.5.0" - checksum: 10/cbe170aee62d756529f05ac548968c32d8331bebe4bea22e09c0b610151a08bf3ebdb39fe839b8592c17bb0377bbbc91ea95c6953bc6b72732e30ec3ef7dbd78 + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/72cbae66a58c6c36f7e12e8ed79f292192d858dd4bb00e9e89d8b695e4c5cb6ef48eec84bffff421a5db93fd10412c581f1cccdb00264065df76f121995bdb68 languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.347.0" +"@babel/plugin-transform-react-jsx-source@npm:^7.25.9": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.27.1" dependencies: - "@aws-sdk/protocol-http": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/util-endpoints": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/e0c7e46034de60323aba06c8a910cdae24a457ce715cfe05b675735e6795c542494134757edada67290b4c8ed63e11453dde5d11b0501d7949163f106f3647de + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/e2843362adb53692be5ee9fa07a386d2d8883daad2063a3575b3c373fc14cdf4ea7978c67a183cb631b4c9c8d77b2f48c24c088f8e65cc3600cb8e97d72a7161 languageName: node linkType: hard -"@aws-sdk/node-config-provider@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/node-config-provider@npm:3.347.0" +"@babel/template@npm:^7.27.1": + version: 7.27.2 + resolution: "@babel/template@npm:7.27.2" dependencies: - "@aws-sdk/property-provider": "npm:3.347.0" - "@aws-sdk/shared-ini-file-loader": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/0a6fb694ad621ba3436908c4f4aefe6eac60b017019b3b9b709b6c2cc0a3da4a65787102bf70dcd4a092a4ba4900d60d13dd97fac9a1cf3dc4f2db80aba47772 + "@babel/code-frame": "npm:^7.27.1" + "@babel/parser": "npm:^7.27.2" + "@babel/types": "npm:^7.27.1" + checksum: 10/fed15a84beb0b9340e5f81566600dbee5eccd92e4b9cc42a944359b1aa1082373391d9d5fc3656981dff27233ec935d0bc96453cf507f60a4b079463999244d8 languageName: node linkType: hard -"@aws-sdk/node-http-handler@npm:3.350.0": - version: 3.350.0 - resolution: "@aws-sdk/node-http-handler@npm:3.350.0" +"@babel/traverse@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/traverse@npm:7.27.1" dependencies: - "@aws-sdk/abort-controller": "npm:3.347.0" - "@aws-sdk/protocol-http": "npm:3.347.0" - "@aws-sdk/querystring-builder": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/98a6d12777dcdf67e8a20ee89af54e2cd1b9a0bfaa17bf7c818513fe9dad3cddb9dc5bdf98a1b1ab5f924c97337d690fa36bd2122d91ef160bc427f29ca57151 + "@babel/code-frame": "npm:^7.27.1" + "@babel/generator": "npm:^7.27.1" + "@babel/parser": "npm:^7.27.1" + "@babel/template": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10/9977271aa451293d3f184521412788d6ddaff9d6a29626d7435b5dacd059feb2d7753bc94f59f4f5b76e65bd2e2cabc8a10d7e1f93709feda28619f2e8cbf4d6 languageName: node linkType: hard -"@aws-sdk/property-provider@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/property-provider@npm:3.347.0" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/types@npm:7.27.1" dependencies: - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/e127e0c333a179f20bbb0baaa38d7ad4e66a8b36529924ca514af947e9a559916efacba2a35856533c9d4d79793ab39b8f566753822707be308a24fb9f21d043 + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + checksum: 10/81f8ada28c4b29695d7d4c4cbfaa5ec3138ccebbeb26628c7c3cc570fdc84f28967c9e68caf4977d51ff4f4d3159c88857ef278317f84f3515dd65e5b8a74995 languageName: node linkType: hard -"@aws-sdk/protocol-http@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/protocol-http@npm:3.347.0" +"@craft/engine@npm:1.0.0, @craft/engine@workspace:lib/engine": + version: 0.0.0-use.local + resolution: "@craft/engine@workspace:lib/engine" dependencies: - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/4b04411f2be88c46303bfc3d85250f7d73c7f4b7c6b2c8eabea98e70234491ae18901910337ad9f3901402b9b2cde24002efb91752671a8fdedb3aa782fe769b - languageName: node - linkType: hard + "@craft/eslint-config-tylercraft": "npm:^1.0.0" + "@craft/rust-world": "npm:1.0.0" + "@craft/terrain-gen": "npm:1.0.0" + "@types/seedrandom": "npm:^3.0.4" + eslint: "npm:^8.42.0" + random: "npm:^4.1.0" + seedrandom: "npm:^3.0.5" + simplex-noise: "npm:^2.4.0" + typescript: "npm:^5.5.3" + languageName: unknown + linkType: soft -"@aws-sdk/querystring-builder@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/querystring-builder@npm:3.347.0" +"@craft/eslint-config-tylercraft@npm:^1.0.0, @craft/eslint-config-tylercraft@workspace:lib/eslint": + version: 0.0.0-use.local + resolution: "@craft/eslint-config-tylercraft@workspace:lib/eslint" dependencies: - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/util-uri-escape": "npm:3.310.0" - tslib: "npm:^2.5.0" - checksum: 10/86c1e0352fe2b79d168a57d8ef0a0cec57ec5b3247d9e0b2f9d337fd656d77874748669bf33ee143363fd0686a5636ff1620e5cd88c5dd4aaccb904212b5a07e - languageName: node - linkType: hard + "@typescript-eslint/eslint-plugin": "npm:^5.59.9" + "@typescript-eslint/parser": "npm:^5.59.9" + eslint: "npm:^8.42.0" + eslint-config-prettier: "npm:^8.6.0" + eslint-plugin-prettier: "npm:^4.2.1" + prettier: "npm:^2.8.7" + typescript: "npm:^5.5.3" + peerDependencies: + eslint: ">= 8" + languageName: unknown + linkType: soft + +"@craft/rust-world@npm:1.0.0, @craft/rust-world@workspace:lib/world": + version: 0.0.0-use.local + resolution: "@craft/rust-world@workspace:lib/world" + languageName: unknown + linkType: soft + +"@craft/server@workspace:apps/server": + version: 0.0.0-use.local + resolution: "@craft/server@workspace:apps/server" + dependencies: + "@craft/engine": "npm:1.0.0" + "@craft/eslint-config-tylercraft": "npm:^1.0.0" + "@types/cors": "npm:^2.8.9" + "@types/express": "npm:^4.17.7" + "@types/mongodb": "npm:^4.0.7" + "@types/ws": "npm:^8.5.3" + cors: "npm:^2.8.5" + dotenv: "npm:^16.1.4" + eslint: "npm:^8.42.0" + express: "npm:^4.18.1" + mongodb: "npm:^4.12.1" + nodemon: "npm:1.19.1" + npm-run-all: "npm:^4.1.5" + typescript: "npm:^5.5.3" + ws: "npm:^8.8.0" + languageName: unknown + linkType: soft + +"@craft/terrain-app@workspace:apps/terrain-app": + version: 0.0.0-use.local + resolution: "@craft/terrain-app@workspace:apps/terrain-app" + dependencies: + "@craft/engine": "npm:1.0.0" + "@craft/eslint-config-tylercraft": "npm:^1.0.0" + "@craft/terrain-gen": "npm:1.0.0" + eslint: "npm:^8.42.0" + serve: "npm:^14.2.0" + typescript: "npm:^5.5.3" + vite: "npm:^5.1.6" + vite-plugin-top-level-await: "npm:^1.4.1" + vite-plugin-wasm: "npm:^3.3.0" + languageName: unknown + linkType: soft + +"@craft/terrain-gen@npm:1.0.0, @craft/terrain-gen@workspace:lib/terrain-gen": + version: 0.0.0-use.local + resolution: "@craft/terrain-gen@workspace:lib/terrain-gen" + languageName: unknown + linkType: soft -"@aws-sdk/querystring-parser@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/querystring-parser@npm:3.347.0" +"@craft/web-client@workspace:apps/web-client": + version: 0.0.0-use.local + resolution: "@craft/web-client@workspace:apps/web-client" dependencies: - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/1b31b654e3397d1b8008305adf37192320658a5ccf45dc7564cc0b85769a18b4ca71d1ddd781409159bbb99a7ff99b4f79e00c0eef133669be81169b6ae73ed3 + "@craft/engine": "npm:1.0.0" + "@craft/eslint-config-tylercraft": "npm:^1.0.0" + "@types/gl-matrix": "npm:^2.4.5" + "@types/react": "npm:^18.2.67" + "@types/react-dom": "npm:^18" + "@types/webxr": "npm:^0.2.3" + "@vitejs/plugin-react": "npm:^4.2.1" + eslint: "npm:^8.42.0" + gl-matrix: "npm:2.4.0" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" + react-router-dom: "npm:^6.8.0" + typescript: "npm:^5.5.3" + vite: "npm:^5.1.6" + vite-plugin-top-level-await: "npm:^1.4.1" + vite-plugin-wasm: "npm:^3.3.0" + languageName: unknown + linkType: soft + +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" + conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@aws-sdk/service-error-classification@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/service-error-classification@npm:3.347.0" - checksum: 10/6710a83af828bfbc81104cd11d98d7ef68ddd255a0fa1b4630b7548e9faed406bdf2c41f245aceb08107cdb6052d9ed200147f7113da28b653f3f29e87278ff9 +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" + conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@aws-sdk/shared-ini-file-loader@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/shared-ini-file-loader@npm:3.347.0" - dependencies: - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/a55740a6117ffdcb717f6b2629dd1df91ad055745148f03d231c4f457c4e7f9ac59de76e7b1341f804253bef542046eda4a1a44676c1690b61417e68cd6c2ad7 +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" + conditions: os=android & cpu=arm languageName: node linkType: hard -"@aws-sdk/signature-v4@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/signature-v4@npm:3.347.0" - dependencies: - "@aws-sdk/eventstream-codec": "npm:3.347.0" - "@aws-sdk/is-array-buffer": "npm:3.310.0" - "@aws-sdk/types": "npm:3.347.0" - "@aws-sdk/util-hex-encoding": "npm:3.310.0" - "@aws-sdk/util-middleware": "npm:3.347.0" - "@aws-sdk/util-uri-escape": "npm:3.310.0" - "@aws-sdk/util-utf8": "npm:3.310.0" - tslib: "npm:^2.5.0" - checksum: 10/90e8acb577d11cf31c5738a4bb3ff488cc3447d734aa190e36bfff8f045e2a3c86e5d132cc5127f94e132bc490c41a1e7832273c801c04f9640de6fe4bbf55d1 +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" + conditions: os=android & cpu=x64 languageName: node linkType: hard -"@aws-sdk/smithy-client@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/smithy-client@npm:3.347.0" - dependencies: - "@aws-sdk/middleware-stack": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/34ab9666d68e088c00e369e6451c948148850589c7d583f788a64d45d096a4a309b8ef58bc6a73d857456ce8cf773f63511e0da0c262ef25e42f0bb89afe3be8 +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.350.0": - version: 3.350.0 - resolution: "@aws-sdk/token-providers@npm:3.350.0" - dependencies: - "@aws-sdk/client-sso-oidc": "npm:3.350.0" - "@aws-sdk/property-provider": "npm:3.347.0" - "@aws-sdk/shared-ini-file-loader": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/b25551e16d879568375433aa1a3b7a491e590d54138f968b7ae562ae78502e088d726955ac2c60d11f03e10e74525a7d6a832124cca51f4ec6f75ee80ff6145b +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@aws-sdk/types@npm:3.347.0, @aws-sdk/types@npm:^3.222.0": - version: 3.347.0 - resolution: "@aws-sdk/types@npm:3.347.0" - dependencies: - tslib: "npm:^2.5.0" - checksum: 10/baa08033d5d1bee02c54caeb2e36fd0c23c747c9644587df439a7da072b0bb3a66f363f6ff58d1c49a5cf543df788f22e1880be936c3f551900b6c52d340766f +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" + conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@aws-sdk/url-parser@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/url-parser@npm:3.347.0" - dependencies: - "@aws-sdk/querystring-parser": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/d25c5bd152b842cf32042c2a1368923b8f50d10a313173cf0f3b5dfba2df8e0e47e04d9a7a78281dd415802821ceb25ccf5ce4ab7fdfe6c8f543fc669d35c1c1 +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@aws-sdk/util-base64@npm:3.310.0": - version: 3.310.0 - resolution: "@aws-sdk/util-base64@npm:3.310.0" - dependencies: - "@aws-sdk/util-buffer-from": "npm:3.310.0" - tslib: "npm:^2.5.0" - checksum: 10/d30027c81a05bda6dcdfe82c58882b8e0f8da802a9eb3da67e0f66ab7b48e9a756c6d286a3cf77ee117375fec8c6fb7f66d9eb081bf88f348c38623321554b3a +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" + conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@aws-sdk/util-body-length-browser@npm:3.310.0": - version: 3.310.0 - resolution: "@aws-sdk/util-body-length-browser@npm:3.310.0" - dependencies: - tslib: "npm:^2.5.0" - checksum: 10/a6fe0b1c95d236d1a6ee1a1b045a329dea53f12072999482677201b274201c2d06c25a55861677dd859c3f56972f3b090bef3e1c363d4a8ee33e0f276a787289 +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" + conditions: os=linux & cpu=arm languageName: node linkType: hard -"@aws-sdk/util-body-length-node@npm:3.310.0": - version: 3.310.0 - resolution: "@aws-sdk/util-body-length-node@npm:3.310.0" - dependencies: - tslib: "npm:^2.5.0" - checksum: 10/3775cb82812c4bcf7f39bce07be5646b6a6ff720b5173aeec7cb6b004633191115920610622162639a28774d2c25fa04e768ffaa2817562c62729de5dcbda3c5 +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" + conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@aws-sdk/util-buffer-from@npm:3.310.0": - version: 3.310.0 - resolution: "@aws-sdk/util-buffer-from@npm:3.310.0" - dependencies: - "@aws-sdk/is-array-buffer": "npm:3.310.0" - tslib: "npm:^2.5.0" - checksum: 10/bb160d9e7eae5ad1c0858c2d2e861d9fadbf6696dbea608bfafbe8bd5d55b8e5c7eca447bef954d63ef2ba5b0acaf79df9aba8d1016c2727ac0227c30d8a7ac3 +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" + conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@aws-sdk/util-config-provider@npm:3.310.0": - version: 3.310.0 - resolution: "@aws-sdk/util-config-provider@npm:3.310.0" - dependencies: - tslib: "npm:^2.5.0" - checksum: 10/40d7369dc932c389efdbbf9b7c0c3a7beaee1b4082d2b63ef667e61f72e40875bd8246d1cf0e4af79d2234bf5126dd61db6fb5ebdf366becd4787140b9bcfd2d +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" + conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-browser@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/util-defaults-mode-browser@npm:3.347.0" - dependencies: - "@aws-sdk/property-provider": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - bowser: "npm:^2.11.0" - tslib: "npm:^2.5.0" - checksum: 10/ff19b25c47a691547247c5051465d1bf134c6ac428d658d58d2ad00d0470aaa7b7ad8ea52f56a6b1045b561a27f39a3e2664f14df99586cbf59088a08b9a38f2 +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" + conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@aws-sdk/util-defaults-mode-node@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/util-defaults-mode-node@npm:3.347.0" - dependencies: - "@aws-sdk/config-resolver": "npm:3.347.0" - "@aws-sdk/credential-provider-imds": "npm:3.347.0" - "@aws-sdk/node-config-provider": "npm:3.347.0" - "@aws-sdk/property-provider": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/20d9eaea6dc36d102cc82b233f857b865347112f5e7e47e6daa47cfc3d4f3feafb045381143a07ff88fa992ddfd2620f628cb44e4b04146aca07f2f08b934bed +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" + conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/util-endpoints@npm:3.347.0" - dependencies: - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/f643fa4fb332d4fc77232aa00d222a760e8b592d1b597ec339515226559fb6b45f8a5c6084bf3fe075349bbd0c060b563569b6d6749660a85014685fde2657bf +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" + conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@aws-sdk/util-hex-encoding@npm:3.310.0": - version: 3.310.0 - resolution: "@aws-sdk/util-hex-encoding@npm:3.310.0" - dependencies: - tslib: "npm:^2.5.0" - checksum: 10/9ec0388c9667d4d616c61530be88422a315e3d92bf93b941d6f6d8339d6e703f4cacb2e11402658d716b1166e90d0fddb497284220e11075a0c17821c468c44b +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" + conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@aws-sdk/util-locate-window@npm:^3.0.0": - version: 3.310.0 - resolution: "@aws-sdk/util-locate-window@npm:3.310.0" - dependencies: - tslib: "npm:^2.5.0" - checksum: 10/163f27aad377c3f798b814bea57bfe1388fbc8a8411407e4c0c23328e32d171645645ac3f4c72e14bf2430a4794b5a5966d9b40c675256b23fa6299a2eb976aa +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" + conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@aws-sdk/util-middleware@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/util-middleware@npm:3.347.0" - dependencies: - tslib: "npm:^2.5.0" - checksum: 10/2cb72f33427d5c9ee0157b176c472676c9b6ed9c03c4f21743ab93a5a01ed4b4b755d8f798d2d999a63f64d5bcb94a188b0095f6928316e9eb7026877c23b08e +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" + conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@aws-sdk/util-retry@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/util-retry@npm:3.347.0" - dependencies: - "@aws-sdk/service-error-classification": "npm:3.347.0" - tslib: "npm:^2.5.0" - checksum: 10/551ef97c33d060781e3ee38d507065720c1714fc826f74561bbc47b0bb00d3de4ba0a837de41b09b740b216a6ad641f500d8cd9e935a8074ef6af689ca55f64a +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" + conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@aws-sdk/util-uri-escape@npm:3.310.0": - version: 3.310.0 - resolution: "@aws-sdk/util-uri-escape@npm:3.310.0" - dependencies: - tslib: "npm:^2.5.0" - checksum: 10/04ca4f2ee9226236d6c629a58329312c5c316b2a0bf29c55f63075447de039c041144755e42ca11db2fd79a793d82bd9e548e7ba5b3ef6b41db5f66aac769e23 +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.347.0" - dependencies: - "@aws-sdk/types": "npm:3.347.0" - bowser: "npm:^2.11.0" - tslib: "npm:^2.5.0" - checksum: 10/9fa6a9f680eeb5807c462953511dd0826101aedc6097f79180131bb2aecfcc81158e911864d75cbc5a163fac3a7ad0796f2fbfe2410c6e0deed8cb41e33fab4d +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" + conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.347.0": - version: 3.347.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.347.0" - dependencies: - "@aws-sdk/node-config-provider": "npm:3.347.0" - "@aws-sdk/types": "npm:3.347.0" - tslib: "npm:^2.5.0" - peerDependencies: - aws-crt: ">=1.0.0" - peerDependenciesMeta: - aws-crt: - optional: true - checksum: 10/1afd13c459e047b5a7dbd0082c51be276b20d20105ceaa16c625512c416e9bf0abcef99b3c39b3cf14396680fdcd0f03f119bcd2c9d36171aa7cf92c14ec43ea +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@aws-sdk/util-utf8-browser@npm:^3.0.0": - version: 3.259.0 - resolution: "@aws-sdk/util-utf8-browser@npm:3.259.0" +"@eslint-community/eslint-utils@npm:^4.2.0": + version: 4.7.0 + resolution: "@eslint-community/eslint-utils@npm:4.7.0" dependencies: - tslib: "npm:^2.3.1" - checksum: 10/bdcf29a92a9a1010b44bf8bade3f1224cb6577a6550b39df97cc053d353f2868d355c25589d61e1da54691d65350d8578a496840ad770ed916a6c3af0971f657 + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10/43ed5d391526d9f5bbe452aef336389a473026fca92057cf97c576db11401ce9bcf8ef0bf72625bbaf6207ed8ba6bf0dcf4d7e809c24f08faa68a28533c491a7 languageName: node linkType: hard -"@aws-sdk/util-utf8@npm:3.310.0": - version: 3.310.0 - resolution: "@aws-sdk/util-utf8@npm:3.310.0" - dependencies: - "@aws-sdk/util-buffer-from": "npm:3.310.0" - tslib: "npm:^2.5.0" - checksum: 10/88bf031527a1fe99712b4e2cb00bc47436b39aa29ce0ceeace3bd0bc7d436d14940f190c249b9a69e684f8d3f01f96847848f5d8ebab7e3103c0084c1e609ce4 +"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.6.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10/c08f1dd7dd18fbb60bdd0d85820656d1374dd898af9be7f82cb00451313402a22d5e30569c150315b4385907cdbca78c22389b2a72ab78883b3173be317620cc languageName: node linkType: hard -"@babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.1": - version: 7.24.2 - resolution: "@babel/code-frame@npm:7.24.2" +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" dependencies: - "@babel/highlight": "npm:^7.24.2" - picocolors: "npm:^1.0.0" - checksum: 10/7db8f5b36ffa3f47a37f58f61e3d130b9ecad21961f3eede7e2a4ac2c7e4a5efb6e9d03a810c669bc986096831b6c0dfc2c3082673d93351b82359c1b03e0590 + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10/7a3b14f4b40fc1a22624c3f84d9f467a3d9ea1ca6e9a372116cb92507e485260359465b58e25bcb6c9981b155416b98c9973ad9b796053fd7b3f776a6946bce8 languageName: node linkType: hard -"@babel/compat-data@npm:^7.23.5": - version: 7.24.1 - resolution: "@babel/compat-data@npm:7.24.1" - checksum: 10/d5460b99c07ff8487467c52f742a219c7e3bcdcaa2882456a13c0d0c8116405f0c85a651fb60511284dc64ed627a5e989f24c3cd6e71d07a9947e7c8954b433c +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 10/7562b21be10c2adbfa4aa5bb2eccec2cb9ac649a3569560742202c8d1cb6c931ce634937a2f0f551e078403a1c1285d6c2c0aa345dafc986149665cd69fe8b59 languageName: node linkType: hard -"@babel/core@npm:^7.23.5": - version: 7.24.1 - resolution: "@babel/core@npm:7.24.1" +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.1" - "@babel/generator": "npm:^7.24.1" - "@babel/helper-compilation-targets": "npm:^7.23.6" - "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.24.1" - "@babel/parser": "npm:^7.24.1" - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10/f8c153acd619a5d17caee7aff052a2aa306ceda280ffc07182d7b5dd40c41c7511ae89d64bc23ec5555e4639fc9c87ceb7b4afc12252acab548ebb7654397680 + "@humanwhocodes/object-schema": "npm:^2.0.3" + debug: "npm:^4.3.1" + minimatch: "npm:^3.0.5" + checksum: 10/524df31e61a85392a2433bf5d03164e03da26c03d009f27852e7dcfdafbc4a23f17f021dacf88e0a7a9fe04ca032017945d19b57a16e2676d9114c22a53a9d11 languageName: node linkType: hard -"@babel/generator@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/generator@npm:7.24.1" - dependencies: - "@babel/types": "npm:^7.24.0" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 10/c6160e9cd63d7ed7168dee27d827f9c46fab820c45861a5df56cd5c78047f7c3fc97c341e9ccfa1a6f97c87ec2563d9903380b5f92794e3540a6c5f99eb8f075 +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10/e993950e346331e5a32eefb27948ecdee2a2c4ab3f072b8f566cd213ef485dd50a3ca497050608db91006f5479e43f91a439aef68d2a313bd3ded06909c7c5b3 languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helper-compilation-targets@npm:7.23.6" - dependencies: - "@babel/compat-data": "npm:^7.23.5" - "@babel/helper-validator-option": "npm:^7.23.5" - browserslist: "npm:^4.22.2" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10/05595cd73087ddcd81b82d2f3297aac0c0422858dfdded43d304786cf680ec33e846e2317e6992d2c964ee61d93945cbf1fa8ec80b55aee5bfb159227fb02cb9 +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: 10/05bb99ed06c16408a45a833f03a732f59bf6184795d4efadd33238ff8699190a8c871ad1121241bb6501589a9598dc83bf25b99dcbcf41e155cdf36e35e937a3 languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: 10/d80ee98ff66f41e233f36ca1921774c37e88a803b2f7dca3db7c057a5fea0473804db9fb6729e5dbfd07f4bed722d60f7852035c2c739382e84c335661590b69 +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10/e9ed5fd27c3aec1095e3a16e0c0cf148d1fee55a38665c35f7b3f86a9b5d00d042ddaabc98e8a1cb7463b9378c15f22a94eb35e99469c201453eb8375191f243 languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-function-name@npm:7.23.0" +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" dependencies: - "@babel/template": "npm:^7.22.15" - "@babel/types": "npm:^7.23.0" - checksum: 10/7b2ae024cd7a09f19817daf99e0153b3bf2bc4ab344e197e8d13623d5e36117ed0b110914bc248faa64e8ccd3e97971ec7b41cc6fd6163a2b980220c58dcdf6d + minipass: "npm:^7.0.4" + checksum: 10/4412e9e6713c89c1e66d80bb0bb5a2a93192f10477623a27d08f228ba0316bb880affabc5bfe7f838f58a34d26c2c190da726e576cdfc18c49a72e89adabdcf5 languageName: node linkType: hard -"@babel/helper-hoist-variables@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-hoist-variables@npm:7.22.5" +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.8 + resolution: "@jridgewell/gen-mapping@npm:0.3.8" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10/394ca191b4ac908a76e7c50ab52102669efe3a1c277033e49467913c7ed6f7c64d7eacbeabf3bed39ea1f41731e22993f763b1edce0f74ff8563fd1f380d92cc + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10/9d3a56ab3612ab9b85d38b2a93b87f3324f11c5130859957f6500e4ac8ce35f299d5ccc3ecd1ae87597601ecf83cee29e9afd04c18777c24011073992ff946df languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.22.15": - version: 7.24.1 - resolution: "@babel/helper-module-imports@npm:7.24.1" - dependencies: - "@babel/types": "npm:^7.24.0" - checksum: 10/f771c1e8776890d85c2af06a6a36410cb41ff4bbcf162e7eecce7d53ebdc5196cc38c3abea3a06df9d778bb20edccb2909dfb8187ae82730e4d021329b631921 +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10/97106439d750a409c22c8bff822d648f6a71f3aa9bc8e5129efdc36343cd3096ddc4eeb1c62d2fe48e9bdd4db37b05d4646a17114ecebd3bbcacfa2de51c3c1d languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-simple-access": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/helper-validator-identifier": "npm:^7.22.20" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/583fa580f8e50e6f45c4f46aa76a8e49c2528deb84e25f634d66461b9a0e2420e13979b0a607b67aef67eaf8db8668eb9edc038b4514b16e3879fe09e8fd294b +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10/832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/helper-plugin-utils@npm:7.24.0" - checksum: 10/dc8c7af321baf7653d93315beffee1790eb2c464b4f529273a24c8743a3f3095bf3f2d11828cb2c52d56282ef43a4bdc67a79c9ab8dd845e35d01871f3f28a0e +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10/4ed6123217569a1484419ac53f6ea0d9f3b57e5b57ab30d7c267bdb27792a27eb0e4b08e84a2680aa55cc2f2b411ffd6ec3db01c44fdc6dc43aca4b55f8374fd languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-simple-access@npm:7.22.5" +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10/7d5430eecf880937c27d1aed14245003bd1c7383ae07d652b3932f450f60bfcf8f2c1270c593ab063add185108d26198c69d1aca0e6fb7c6fdada4bcf72ab5b7 + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10/dced32160a44b49d531b80a4a2159dceab6b3ddf0c8e95a0deae4b0e894b172defa63d5ac52a19c2068e1fe7d31ea4ba931fbeec103233ecb4208953967120fc languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-split-export-declaration@npm:7.22.6" +"@mongodb-js/saslprep@npm:^1.1.0, @mongodb-js/saslprep@npm:^1.1.9": + version: 1.2.2 + resolution: "@mongodb-js/saslprep@npm:1.2.2" dependencies: - "@babel/types": "npm:^7.22.5" - checksum: 10/e141cace583b19d9195f9c2b8e17a3ae913b7ee9b8120246d0f9ca349ca6f03cb2c001fd5ec57488c544347c0bb584afec66c936511e447fd20a360e591ac921 + sparse-bitfield: "npm:^3.0.3" + checksum: 10/f62b2ffc072c0df0fe7d60c8159fb67dcb8ce8d8ad5ba72a09dac432acaf548c8d978a20fc2ec15cff06920029eb75ed3ad368f699e65b83f929fb4dd9b9b2f8 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.24.1 - resolution: "@babel/helper-string-parser@npm:7.24.1" - checksum: 10/04c0ede77b908b43e6124753b48bc485528112a9335f0a21a226bff1ace75bb6e64fab24c85cb4b1610ef3494dacd1cb807caeb6b79a7b36c43d48c289b35949 +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-validator-identifier@npm:7.22.20" - checksum: 10/df882d2675101df2d507b95b195ca2f86a3ef28cb711c84f37e79ca23178e13b9f0d8b522774211f51e40168bf5142be4c1c9776a150cddb61a0d5bf3e95750b +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 10/537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 languageName: node linkType: hard -"@babel/helpers@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/helpers@npm:7.24.1" +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" dependencies: - "@babel/template": "npm:^7.24.0" - "@babel/traverse": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - checksum: 10/82d3cdd3beafc4583f237515ef220bc205ced8b0540c6c6e191fc367a9589bd7304b8f9800d3d7574d4db9f079bd555979816b1874c86e53b3e7dd2032ad6c7c + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10/775c9a7eb1f88c195dfb3bce70c31d0fe2a12b28b754e25c08a3edb4bc4816bfedb7ac64ef1e730579d078ca19dacf11630e99f8f3c3e0fd7b23caa5fd6d30a6 languageName: node linkType: hard -"@babel/highlight@npm:^7.24.2": - version: 7.24.2 - resolution: "@babel/highlight@npm:7.24.2" +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" dependencies: - "@babel/helper-validator-identifier": "npm:^7.22.20" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10/4555124235f34403bb28f55b1de58edf598491cc181c75f8afc8fe529903cb598cd52fe3bf2faab9bc1f45c299681ef0e44eea7a848bb85c500c5a4fe13f54f6 + semver: "npm:^7.3.5" + checksum: 10/405c4490e1ff11cf299775449a3c254a366a4b1ffc79d87159b0ee7d5558ac9f6a2f8c0735fd6ff3873cef014cb1a44a5f9127cb6a1b2dbc408718cca9365b5a languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/parser@npm:7.24.1" - bin: - parser: ./bin/babel-parser.js - checksum: 10/561d9454091e07ecfec3828ce79204c0fc9d24e17763f36181c6984392be4ca6b79c8225f2224fdb7b1b3b70940e243368c8f83ac77ec2dc20f46d3d06bd6795 +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10/115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-self@npm:^7.23.3": - version: 7.24.1 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/a0ff893b946bb0e501ad5aab43ce4b321ed9e74b94c0bc7191e2ee6409014fc96ee1a47dcb1ecdf445c44868564667ae16507ed4516dcacf6aa9c37a0ad28382 +"@remix-run/router@npm:1.23.0": + version: 1.23.0 + resolution: "@remix-run/router@npm:1.23.0" + checksum: 10/0a9f02c26c150d8210b05927c43d2f57ee8b7f812c81abb76df1721c7367ef692e54f4044981e756ce13d0619fb3c6a9b1514524d69aea9b32bfaf565299a8c7 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-source@npm:^7.23.3": - version: 7.24.1 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.24.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/396ce878dc588e74113d38c5a1773e0850bb878a073238a74f8cdf62d968d56a644f5485bf4032dc095fe8863fe2bd9fbbbab6abc3adf69542e038ac5c689d4c +"@rolldown/pluginutils@npm:1.0.0-beta.9": + version: 1.0.0-beta.9 + resolution: "@rolldown/pluginutils@npm:1.0.0-beta.9" + checksum: 10/6d28647e1c186b0e31e07666b850a609efcf5cd5fb0ab57730f932bf57dd2ff9dec15407422e2207503463cbe2fdb4759aaf735f27cb3bbdcca6a083e78a32c0 languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.24.0": - version: 7.24.0 - resolution: "@babel/template@npm:7.24.0" - dependencies: - "@babel/code-frame": "npm:^7.23.5" - "@babel/parser": "npm:^7.24.0" - "@babel/types": "npm:^7.24.0" - checksum: 10/8c538338c7de8fac8ada691a5a812bdcbd60bd4a4eb5adae2cc9ee19773e8fb1a724312a00af9e1ce49056ffd3c3475e7287b5668cf6360bfb3f8ac827a06ffe +"@rollup/plugin-virtual@npm:^3.0.2": + version: 3.0.2 + resolution: "@rollup/plugin-virtual@npm:3.0.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10/962bc9efece57a07c328a3d093bd1a62b9b4396a88640ac79cfc04181e06b31c4b37726ca27ded71178ace27db9b0085b43c4de823378773bb44cb233ea1340e languageName: node linkType: hard -"@babel/traverse@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/traverse@npm:7.24.1" - dependencies: - "@babel/code-frame": "npm:^7.24.1" - "@babel/generator": "npm:^7.24.1" - "@babel/helper-environment-visitor": "npm:^7.22.20" - "@babel/helper-function-name": "npm:^7.23.0" - "@babel/helper-hoist-variables": "npm:^7.22.5" - "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.24.1" - "@babel/types": "npm:^7.24.0" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10/b9b0173c286ef549e179f3725df3c4958069ad79fe5b9840adeb99692eb4a5a08db4e735c0f086aab52e7e08ec711cee9e7c06cb908d8035641d1382172308d3 +"@rollup/rollup-android-arm-eabi@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.41.1" + conditions: os=android & cpu=arm languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.0, @babel/types@npm:^7.8.3": - version: 7.24.0 - resolution: "@babel/types@npm:7.24.0" - dependencies: - "@babel/helper-string-parser": "npm:^7.23.4" - "@babel/helper-validator-identifier": "npm:^7.22.20" - to-fast-properties: "npm:^2.0.0" - checksum: 10/a0b4875ce2e132f9daff0d5b27c7f4c4fcc97f2b084bdc5834e92c9d32592778489029e65d99d00c406da612d87b72d7a236c0afccaa1435c028d0c94c9b6da4 +"@rollup/rollup-android-arm64@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-android-arm64@npm:4.41.1" + conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@craft/engine@npm:1.0.0, @craft/engine@workspace:lib/engine": - version: 0.0.0-use.local - resolution: "@craft/engine@workspace:lib/engine" - dependencies: - "@craft/eslint-config-tylercraft": "npm:^1.0.0" - "@craft/rust-world": "npm:1.0.0" - "@craft/terrain-gen": "npm:1.0.0" - "@types/seedrandom": "npm:^3.0.4" - eslint: "npm:^8.42.0" - random: "npm:^4.1.0" - seedrandom: "npm:^3.0.5" - simplex-noise: "npm:^2.4.0" - typescript: "npm:^5.5.3" - languageName: unknown - linkType: soft - -"@craft/eslint-config-tylercraft@npm:^1.0.0, @craft/eslint-config-tylercraft@workspace:lib/eslint": - version: 0.0.0-use.local - resolution: "@craft/eslint-config-tylercraft@workspace:lib/eslint" - dependencies: - "@typescript-eslint/eslint-plugin": "npm:^5.59.9" - "@typescript-eslint/parser": "npm:^5.59.9" - eslint: "npm:^8.42.0" - eslint-config-prettier: "npm:^8.6.0" - eslint-plugin-prettier: "npm:^4.2.1" - prettier: "npm:^2.8.7" - typescript: "npm:^5.5.3" - peerDependencies: - eslint: ">= 8" - languageName: unknown - linkType: soft - -"@craft/rust-world@npm:1.0.0, @craft/rust-world@workspace:lib/world": - version: 0.0.0-use.local - resolution: "@craft/rust-world@workspace:lib/world" - languageName: unknown - linkType: soft - -"@craft/server@workspace:apps/server": - version: 0.0.0-use.local - resolution: "@craft/server@workspace:apps/server" - dependencies: - "@craft/engine": "npm:1.0.0" - "@craft/eslint-config-tylercraft": "npm:^1.0.0" - "@types/cors": "npm:^2.8.9" - "@types/express": "npm:^4.17.7" - "@types/mongodb": "npm:^4.0.7" - "@types/ws": "npm:^8.5.3" - cors: "npm:^2.8.5" - dotenv: "npm:^16.1.4" - eslint: "npm:^8.42.0" - express: "npm:^4.18.1" - mongodb: "npm:^4.12.1" - nodemon: "npm:1.19.1" - npm-run-all: "npm:^4.1.5" - typescript: "npm:^5.5.3" - ws: "npm:^8.8.0" - languageName: unknown - linkType: soft - -"@craft/terrain-app@workspace:apps/terrain-app": - version: 0.0.0-use.local - resolution: "@craft/terrain-app@workspace:apps/terrain-app" - dependencies: - "@craft/engine": "npm:1.0.0" - "@craft/eslint-config-tylercraft": "npm:^1.0.0" - "@craft/terrain-gen": "npm:1.0.0" - eslint: "npm:^8.42.0" - serve: "npm:^14.2.0" - typescript: "npm:^5.5.3" - vite: "npm:^5.1.6" - vite-plugin-top-level-await: "npm:^1.4.1" - vite-plugin-wasm: "npm:^3.3.0" - languageName: unknown - linkType: soft - -"@craft/terrain-gen@npm:1.0.0, @craft/terrain-gen@workspace:lib/terrain-gen": - version: 0.0.0-use.local - resolution: "@craft/terrain-gen@workspace:lib/terrain-gen" - languageName: unknown - linkType: soft - -"@craft/web-client@workspace:apps/web-client": - version: 0.0.0-use.local - resolution: "@craft/web-client@workspace:apps/web-client" - dependencies: - "@craft/engine": "npm:1.0.0" - "@craft/eslint-config-tylercraft": "npm:^1.0.0" - "@types/gl-matrix": "npm:^2.4.5" - "@types/react": "npm:^18.2.67" - "@types/react-dom": "npm:^18" - "@types/webxr": "npm:^0.2.3" - "@vitejs/plugin-react": "npm:^4.2.1" - eslint: "npm:^8.42.0" - gl-matrix: "npm:2.4.0" - react: "npm:^18.2.0" - react-dom: "npm:^18.2.0" - typescript: "npm:^5.5.3" - vite: "npm:^5.1.6" - vite-plugin-top-level-await: "npm:^1.4.1" - vite-plugin-wasm: "npm:^3.3.0" - languageName: unknown - linkType: soft - -"@esbuild/aix-ppc64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/aix-ppc64@npm:0.19.12" - conditions: os=aix & cpu=ppc64 +"@rollup/rollup-darwin-arm64@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-darwin-arm64@npm:4.41.1" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-arm64@npm:0.19.12" - conditions: os=android & cpu=arm64 +"@rollup/rollup-darwin-x64@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-darwin-x64@npm:4.41.1" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-arm@npm:0.19.12" - conditions: os=android & cpu=arm +"@rollup/rollup-freebsd-arm64@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.41.1" + conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-x64@npm:0.19.12" - conditions: os=android & cpu=x64 +"@rollup/rollup-freebsd-x64@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-freebsd-x64@npm:4.41.1" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/darwin-arm64@npm:0.19.12" - conditions: os=darwin & cpu=arm64 +"@rollup/rollup-linux-arm-gnueabihf@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.41.1" + conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/darwin-x64@npm:0.19.12" - conditions: os=darwin & cpu=x64 +"@rollup/rollup-linux-arm-musleabihf@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.41.1" + conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/freebsd-arm64@npm:0.19.12" - conditions: os=freebsd & cpu=arm64 +"@rollup/rollup-linux-arm64-gnu@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.41.1" + conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/freebsd-x64@npm:0.19.12" - conditions: os=freebsd & cpu=x64 +"@rollup/rollup-linux-arm64-musl@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.41.1" + conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-arm64@npm:0.19.12" - conditions: os=linux & cpu=arm64 +"@rollup/rollup-linux-loongarch64-gnu@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.41.1" + conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-arm@npm:0.19.12" - conditions: os=linux & cpu=arm +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.41.1" + conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-ia32@npm:0.19.12" - conditions: os=linux & cpu=ia32 +"@rollup/rollup-linux-riscv64-gnu@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.41.1" + conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-loong64@npm:0.19.12" - conditions: os=linux & cpu=loong64 +"@rollup/rollup-linux-riscv64-musl@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.41.1" + conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-mips64el@npm:0.19.12" - conditions: os=linux & cpu=mips64el +"@rollup/rollup-linux-s390x-gnu@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.41.1" + conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-ppc64@npm:0.19.12" - conditions: os=linux & cpu=ppc64 +"@rollup/rollup-linux-x64-gnu@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.41.1" + conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-riscv64@npm:0.19.12" - conditions: os=linux & cpu=riscv64 +"@rollup/rollup-linux-x64-musl@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.41.1" + conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-s390x@npm:0.19.12" - conditions: os=linux & cpu=s390x +"@rollup/rollup-win32-arm64-msvc@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.41.1" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-x64@npm:0.19.12" - conditions: os=linux & cpu=x64 +"@rollup/rollup-win32-ia32-msvc@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.41.1" + conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/netbsd-x64@npm:0.19.12" - conditions: os=netbsd & cpu=x64 +"@rollup/rollup-win32-x64-msvc@npm:4.41.1": + version: 4.41.1 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.41.1" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/openbsd-x64@npm:0.19.12" - conditions: os=openbsd & cpu=x64 +"@smithy/abort-controller@npm:^4.0.3": + version: 4.0.3 + resolution: "@smithy/abort-controller@npm:4.0.3" + dependencies: + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/254721823c9f7f65a5db53542c3559eac3038e2aa3f3579791f673fa92d7c87110e79ac162461fc12b2dca3b2d4e03067a4515b0700ee6db4c1b14f5502a493a languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/sunos-x64@npm:0.19.12" - conditions: os=sunos & cpu=x64 +"@smithy/config-resolver@npm:^4.1.2, @smithy/config-resolver@npm:^4.1.3": + version: 4.1.3 + resolution: "@smithy/config-resolver@npm:4.1.3" + dependencies: + "@smithy/node-config-provider": "npm:^4.1.2" + "@smithy/types": "npm:^4.3.0" + "@smithy/util-config-provider": "npm:^4.0.0" + "@smithy/util-middleware": "npm:^4.0.3" + tslib: "npm:^2.6.2" + checksum: 10/b32d9d719f69a75a2dd0933f6e714ed6cd0d80c86e88706e8fe835d66e04ece50e5fe2daa27043178163836b2611952cc40829a0d28c3f82b1b30fbc3350f4b4 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-arm64@npm:0.19.12" - conditions: os=win32 & cpu=arm64 +"@smithy/core@npm:^3.3.3, @smithy/core@npm:^3.4.0": + version: 3.4.0 + resolution: "@smithy/core@npm:3.4.0" + dependencies: + "@smithy/middleware-serde": "npm:^4.0.6" + "@smithy/protocol-http": "npm:^5.1.1" + "@smithy/types": "npm:^4.3.0" + "@smithy/util-body-length-browser": "npm:^4.0.0" + "@smithy/util-middleware": "npm:^4.0.3" + "@smithy/util-stream": "npm:^4.2.1" + "@smithy/util-utf8": "npm:^4.0.0" + tslib: "npm:^2.6.2" + checksum: 10/f08310266485cdb854a78d00f875bd60c68db62159de3516b096a3a57ee49947fcd8292b1611eca5e51ad90906987b7d494ba9dc9f8acc910912483c62faafd6 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-ia32@npm:0.19.12" - conditions: os=win32 & cpu=ia32 +"@smithy/credential-provider-imds@npm:^4.0.4, @smithy/credential-provider-imds@npm:^4.0.5": + version: 4.0.5 + resolution: "@smithy/credential-provider-imds@npm:4.0.5" + dependencies: + "@smithy/node-config-provider": "npm:^4.1.2" + "@smithy/property-provider": "npm:^4.0.3" + "@smithy/types": "npm:^4.3.0" + "@smithy/url-parser": "npm:^4.0.3" + tslib: "npm:^2.6.2" + checksum: 10/204e3c5f5899a76164e27bf3cc96b66d8423954e48537962dfa0060a8f922518c2394f27ba940b795ca1347384f2fae72b0ab6043375c0e16217d334e42bf703 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-x64@npm:0.19.12" - conditions: os=win32 & cpu=x64 +"@smithy/fetch-http-handler@npm:^5.0.2, @smithy/fetch-http-handler@npm:^5.0.3": + version: 5.0.3 + resolution: "@smithy/fetch-http-handler@npm:5.0.3" + dependencies: + "@smithy/protocol-http": "npm:^5.1.1" + "@smithy/querystring-builder": "npm:^4.0.3" + "@smithy/types": "npm:^4.3.0" + "@smithy/util-base64": "npm:^4.0.0" + tslib: "npm:^2.6.2" + checksum: 10/bc0ac0882f20cbfaf2668eb3cd8935496658cf4e6d72a436ac7b789d8ce3b3b0621236d83ca271d7a1b7265565cc03647157c0b0a777198e06b8e5f3f997540b languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" +"@smithy/hash-node@npm:^4.0.2": + version: 4.0.3 + resolution: "@smithy/hash-node@npm:4.0.3" dependencies: - eslint-visitor-keys: "npm:^3.3.0" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10/8d70bcdcd8cd279049183aca747d6c2ed7092a5cf0cf5916faac1ef37ffa74f0c245c2a3a3d3b9979d9dfdd4ca59257b4c5621db699d637b847a2c5e02f491c2 + "@smithy/types": "npm:^4.3.0" + "@smithy/util-buffer-from": "npm:^4.0.0" + "@smithy/util-utf8": "npm:^4.0.0" + tslib: "npm:^2.6.2" + checksum: 10/9f9aa9fb25cc91416e0548018b594eaa968a1d294d4ae632b55108aa6388123f7ded52a7b20144e1b735dc3f8a34755dba2754e2d4691413007ed5d29aff77f0 languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.4.0": - version: 4.5.1 - resolution: "@eslint-community/regexpp@npm:4.5.1" - checksum: 10/e31e456d44e9bf98d59c8ac445549098e1a6d9c4e22053cad58e86a9f78a1e64104ef7f7f46255c442e0c878fe0e566ffba287787d070196c83510ef30d1d197 +"@smithy/invalid-dependency@npm:^4.0.2": + version: 4.0.3 + resolution: "@smithy/invalid-dependency@npm:4.0.3" + dependencies: + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/155d1097c9faf61bc728ba179965283e7010583b5c4873a240becc6e8ec2a88fe9b13efb4b720ceb2b67a04d46b11bd82236640cbe87d04c303cab922c1b3c11 languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.0.3": - version: 2.0.3 - resolution: "@eslint/eslintrc@npm:2.0.3" +"@smithy/is-array-buffer@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/is-array-buffer@npm:2.2.0" dependencies: - ajv: "npm:^6.12.4" - debug: "npm:^4.3.2" - espree: "npm:^9.5.2" - globals: "npm:^13.19.0" - ignore: "npm:^5.2.0" - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - minimatch: "npm:^3.1.2" - strip-json-comments: "npm:^3.1.1" - checksum: 10/3508a9eb1a1cdf205f34648a993862b15c178669b71d6a9544787558b925ac689d8ddf3e598990156a17b708e79d3cb867fb45d5662908d14c1b10eaad858516 + tslib: "npm:^2.6.2" + checksum: 10/d366743ecc7a9fc3bad21dbb3950d213c12bdd4aeb62b1265bf6cbe38309df547664ef3e51ab732e704485194f15e89d361943b0bfbe3fe1a4b3178b942913cc languageName: node linkType: hard -"@eslint/js@npm:8.42.0": - version: 8.42.0 - resolution: "@eslint/js@npm:8.42.0" - checksum: 10/f6efef5c8071c997e68d6d83dd67e1de51b68932c61e9d9db10166d01c589c4d4b4dbf1ba10f6eb6f4381a790dc3036d0843f2f2c15635423af88d4a37f3117e +"@smithy/is-array-buffer@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/is-array-buffer@npm:4.0.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10/3985046ac490968fe86e2d5e87d023d67f29aa4778abebacecb0f7962d07e32507a5612701c7aa7b1fb63b5a6e68086c915cae5229e5f1abfb39419dc07e00c8 languageName: node linkType: hard -"@gar/promisify@npm:^1.1.3": - version: 1.1.3 - resolution: "@gar/promisify@npm:1.1.3" - checksum: 10/052dd232140fa60e81588000cbe729a40146579b361f1070bce63e2a761388a22a16d00beeffc504bd3601cb8e055c57b21a185448b3ed550cf50716f4fd442e +"@smithy/middleware-content-length@npm:^4.0.2": + version: 4.0.3 + resolution: "@smithy/middleware-content-length@npm:4.0.3" + dependencies: + "@smithy/protocol-http": "npm:^5.1.1" + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/65f13e41243417ed078d11c5b380831fc13b911f30dc7b9110f3d425455e19bd270e62b63ea5bc1cffc2cd17f73eda2669d3802560ffeac9508a683bdf8d7aab languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.10": - version: 0.11.10 - resolution: "@humanwhocodes/config-array@npm:0.11.10" +"@smithy/middleware-endpoint@npm:^4.1.6, @smithy/middleware-endpoint@npm:^4.1.7": + version: 4.1.7 + resolution: "@smithy/middleware-endpoint@npm:4.1.7" dependencies: - "@humanwhocodes/object-schema": "npm:^1.2.1" - debug: "npm:^4.1.1" - minimatch: "npm:^3.0.5" - checksum: 10/f93086ae6a340e739a6bb23d4575b69f52acc4e4e3d62968eaaf77a77db4ba69d6d3e50c0028ba19b634ef6b241553a9d9a13d91b797b3ea33d5d711bb3362fb + "@smithy/core": "npm:^3.4.0" + "@smithy/middleware-serde": "npm:^4.0.6" + "@smithy/node-config-provider": "npm:^4.1.2" + "@smithy/shared-ini-file-loader": "npm:^4.0.3" + "@smithy/types": "npm:^4.3.0" + "@smithy/url-parser": "npm:^4.0.3" + "@smithy/util-middleware": "npm:^4.0.3" + tslib: "npm:^2.6.2" + checksum: 10/11301a1957e8d6bc369a47a4c627b1708448d7fd3252c9bb9b7af8ccc1c8e7165e79502c76d69736f86ac1ab84c488539de3477b4be9f28e47c9fa36adf642ae languageName: node linkType: hard -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 10/e993950e346331e5a32eefb27948ecdee2a2c4ab3f072b8f566cd213ef485dd50a3ca497050608db91006f5479e43f91a439aef68d2a313bd3ded06909c7c5b3 +"@smithy/middleware-retry@npm:^4.1.7": + version: 4.1.8 + resolution: "@smithy/middleware-retry@npm:4.1.8" + dependencies: + "@smithy/node-config-provider": "npm:^4.1.2" + "@smithy/protocol-http": "npm:^5.1.1" + "@smithy/service-error-classification": "npm:^4.0.4" + "@smithy/smithy-client": "npm:^4.3.0" + "@smithy/types": "npm:^4.3.0" + "@smithy/util-middleware": "npm:^4.0.3" + "@smithy/util-retry": "npm:^4.0.4" + tslib: "npm:^2.6.2" + uuid: "npm:^9.0.1" + checksum: 10/8437f443e0fd724787665a2ca35077ba20ae8cda5e0485c0fb64d5dffb465ecda76a7429296ea59b78637b68371e1ee70a1d151310507c900ab69bd77f587626 languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: 10/b48a8f87fcd5fdc4ac60a31a8bf710d19cc64556050575e6a35a4a48a8543cf8cde1598a65640ff2cdfbfd165b38f9db4fa3782bea7848eb585cc3db824002e6 +"@smithy/middleware-serde@npm:^4.0.5, @smithy/middleware-serde@npm:^4.0.6": + version: 4.0.6 + resolution: "@smithy/middleware-serde@npm:4.0.6" + dependencies: + "@smithy/protocol-http": "npm:^5.1.1" + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/85e3da9116888d565bc448839ec3508a270c6f51871a1d88716baf53e1dd7c6cc3ea7417f068ccb0ce5524c31751f753323d543ad663109a69e34f58b04352a0 languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" +"@smithy/middleware-stack@npm:^4.0.2, @smithy/middleware-stack@npm:^4.0.3": + version: 4.0.3 + resolution: "@smithy/middleware-stack@npm:4.0.3" dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10/81587b3c4dd8e6c60252122937cea0c637486311f4ed208b52b62aae2e7a87598f63ec330e6cd0984af494bfb16d3f0d60d3b21d7e5b4aedd2602ff3fe9d32e2 + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/1e7b77e8d065e04277c998ca110922594d1de7a96458784744e4478ca9bac18575d586419a0af2cb17dcc1fe8bbb054796af5f70bc1f6e37d1bf005411694e00 languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.2 - resolution: "@jridgewell/resolve-uri@npm:3.1.2" - checksum: 10/97106439d750a409c22c8bff822d648f6a71f3aa9bc8e5129efdc36343cd3096ddc4eeb1c62d2fe48e9bdd4db37b05d4646a17114ecebd3bbcacfa2de51c3c1d +"@smithy/node-config-provider@npm:^4.1.1, @smithy/node-config-provider@npm:^4.1.2": + version: 4.1.2 + resolution: "@smithy/node-config-provider@npm:4.1.2" + dependencies: + "@smithy/property-provider": "npm:^4.0.3" + "@smithy/shared-ini-file-loader": "npm:^4.0.3" + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/0bf7bddf1101d54039e40d2526ad736a333eafe6dcc55b18f83befa20cc02def8cb35864a0201c4150671d633a3ff9fc3f4dac8293a8584f8fd337eb8cc998b3 languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10/832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 +"@smithy/node-http-handler@npm:^4.0.4, @smithy/node-http-handler@npm:^4.0.5": + version: 4.0.5 + resolution: "@smithy/node-http-handler@npm:4.0.5" + dependencies: + "@smithy/abort-controller": "npm:^4.0.3" + "@smithy/protocol-http": "npm:^5.1.1" + "@smithy/querystring-builder": "npm:^4.0.3" + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/535e7946f801c70a4dc7f84d13db8177dd98e728ed91a5485f7c4e656f8c26ad2b43381a9260b05b073556a416b7f6d83ab0774c334465d5f72606d2a5dfa87d languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: 10/89960ac087781b961ad918978975bcdf2051cd1741880469783c42de64239703eab9db5230d776d8e6a09d73bb5e4cb964e07d93ee6e2e7aea5a7d726e865c09 +"@smithy/property-provider@npm:^4.0.2, @smithy/property-provider@npm:^4.0.3": + version: 4.0.3 + resolution: "@smithy/property-provider@npm:4.0.3" + dependencies: + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/dce9b104f20f5364b9d7036f02e15f211ec6c8fbada034c759a9c2851eac83b9e1faea4bc8a5ec29e89bbbe745de61fe9cdb9863d611c8356732496e2e5fa3bd languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" +"@smithy/protocol-http@npm:^5.1.0, @smithy/protocol-http@npm:^5.1.1": + version: 5.1.1 + resolution: "@smithy/protocol-http@npm:5.1.1" dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10/dced32160a44b49d531b80a4a2159dceab6b3ddf0c8e95a0deae4b0e894b172defa63d5ac52a19c2068e1fe7d31ea4ba931fbeec103233ecb4208953967120fc + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/56b5b6a7c2ba99491193daa8787305b65a4f90483d51777fecf477f9386e1703912772502d535de34120c6ae2b628d44834749b1e02daded138f472c5847b9eb languageName: node linkType: hard -"@nodelib/fs.scandir@npm:2.1.3": - version: 2.1.3 - resolution: "@nodelib/fs.scandir@npm:2.1.3" +"@smithy/querystring-builder@npm:^4.0.3": + version: 4.0.3 + resolution: "@smithy/querystring-builder@npm:4.0.3" dependencies: - "@nodelib/fs.stat": "npm:2.0.3" - run-parallel: "npm:^1.1.9" - checksum: 10/7a37ebcfadf6fd5c1aafefd7f6759d341be42cb7e1dd53455d0bfc2f730e2449bd71ba299b38ca0200f16af1bdf3ebc45bcb2972bf91df17e49acf433537bc8e + "@smithy/types": "npm:^4.3.0" + "@smithy/util-uri-escape": "npm:^4.0.0" + tslib: "npm:^2.6.2" + checksum: 10/a671e20dcf23d67613fbd1ee9ba5c04249d791e87bf55226351f43de8653ebc876c2117e224266ecfcb48725c90c25bfdc507dfcda0ecacdff92214a9fb7f23d languageName: node linkType: hard -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" +"@smithy/querystring-parser@npm:^4.0.3": + version: 4.0.3 + resolution: "@smithy/querystring-parser@npm:4.0.3" dependencies: - "@nodelib/fs.stat": "npm:2.0.5" - run-parallel: "npm:^1.1.9" - checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/3d6b2f254f315989eb0ea2c187f6a7c2a96e9829f0ffda63f56f3003b8ddcc3cb8a195ad8608b2aaf6b855ee70c9fe2b0f66a3a6a2111cb1f6de50d627dad1e5 languageName: node linkType: hard -"@nodelib/fs.stat@npm:2.0.3, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.3 - resolution: "@nodelib/fs.stat@npm:2.0.3" - checksum: 10/c883a168a7bf1931f6818fa23691c7ed0f9129149f91a0926a86a7aee4f0febc9df479d898ef2b2a6de5533824ede506cfbec076e8fa17bfd82c76d2001cd4a0 +"@smithy/service-error-classification@npm:^4.0.4": + version: 4.0.4 + resolution: "@smithy/service-error-classification@npm:4.0.4" + dependencies: + "@smithy/types": "npm:^4.3.0" + checksum: 10/8d821bf7fb50d141437400c451659a923fbb00325741996d68064441ed7317347f7b98890ff9bb57e4c2a0dd91580c56b23f267fef31e794402d0d44f406f9cc languageName: node linkType: hard -"@nodelib/fs.stat@npm:2.0.5": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 +"@smithy/shared-ini-file-loader@npm:^4.0.2, @smithy/shared-ini-file-loader@npm:^4.0.3": + version: 4.0.3 + resolution: "@smithy/shared-ini-file-loader@npm:4.0.3" + dependencies: + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/a389c3dbc844eda79df506b90ca28e0d1e8c247d534e5adc043837cea7afb36e9d5dfbd0759524ee854986b1d443f2dfd5c6c0713a37e86ff7946dc3920ac2f5 languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3": - version: 1.2.4 - resolution: "@nodelib/fs.walk@npm:1.2.4" +"@smithy/signature-v4@npm:^5.1.0": + version: 5.1.1 + resolution: "@smithy/signature-v4@npm:5.1.1" dependencies: - "@nodelib/fs.scandir": "npm:2.1.3" - fastq: "npm:^1.6.0" - checksum: 10/31b13e243cc7f8656e936be684f16f81ede62c3be5968f832ca9dab385db0c3bcd537aeb139bdec4cdb6973ba55035069978397a0d08317b7023e53128e915bd + "@smithy/is-array-buffer": "npm:^4.0.0" + "@smithy/protocol-http": "npm:^5.1.1" + "@smithy/types": "npm:^4.3.0" + "@smithy/util-hex-encoding": "npm:^4.0.0" + "@smithy/util-middleware": "npm:^4.0.3" + "@smithy/util-uri-escape": "npm:^4.0.0" + "@smithy/util-utf8": "npm:^4.0.0" + tslib: "npm:^2.6.2" + checksum: 10/b23ab5f94d9891cfa3562d4999c058534a543e8f01109267af39657f2e559dcc2b2c6c4aa102acad3c4e0e553a144edbd038d1abc0a9338c0e49ee4523e5bd6e languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" +"@smithy/smithy-client@npm:^4.2.6, @smithy/smithy-client@npm:^4.3.0": + version: 4.3.0 + resolution: "@smithy/smithy-client@npm:4.3.0" dependencies: - "@nodelib/fs.scandir": "npm:2.1.5" - fastq: "npm:^1.6.0" - checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 + "@smithy/core": "npm:^3.4.0" + "@smithy/middleware-endpoint": "npm:^4.1.7" + "@smithy/middleware-stack": "npm:^4.0.3" + "@smithy/protocol-http": "npm:^5.1.1" + "@smithy/types": "npm:^4.3.0" + "@smithy/util-stream": "npm:^4.2.1" + tslib: "npm:^2.6.2" + checksum: 10/4c30258bfe1d4eeae2c6cf47ef9e2986718fe2cd35b53c65148dda266155b6afd4b10a306b6e0657b1d76b5a7c791cb4c780ad9165392cf591370926e49166e8 languageName: node linkType: hard -"@npmcli/fs@npm:^2.1.0": - version: 2.1.2 - resolution: "@npmcli/fs@npm:2.1.2" +"@smithy/types@npm:^4.2.0, @smithy/types@npm:^4.3.0": + version: 4.3.0 + resolution: "@smithy/types@npm:4.3.0" dependencies: - "@gar/promisify": "npm:^1.1.3" - semver: "npm:^7.3.5" - checksum: 10/c5d4dfee80de2236e1e4ed595d17e217aada72ebd8215183fc46096fa010f583dd2aaaa486758de7cc0b89440dbc31cfe8b276269d75d47af35c716e896f78ec + tslib: "npm:^2.6.2" + checksum: 10/ee80b47e5ec14c1acb5b29225f0e71709e6238eb239e46e92864f108f8af9d2c744efd0a31265d8739f90b31e4a815240c2a633c6f0b193c3c6c45f14eb5252d languageName: node linkType: hard -"@npmcli/move-file@npm:^2.0.0": - version: 2.0.1 - resolution: "@npmcli/move-file@npm:2.0.1" +"@smithy/url-parser@npm:^4.0.2, @smithy/url-parser@npm:^4.0.3": + version: 4.0.3 + resolution: "@smithy/url-parser@npm:4.0.3" dependencies: - mkdirp: "npm:^1.0.4" - rimraf: "npm:^3.0.2" - checksum: 10/52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 + "@smithy/querystring-parser": "npm:^4.0.3" + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/9626289aa03961ad6307fed215e45abc7f4b0bbd5828be3cc109779f7a24968b1a2fb17b400a03ff335c6b772040e4adb92f4b83ff22f844ef7f2f2008f701a5 languageName: node linkType: hard -"@rollup/plugin-virtual@npm:^3.0.2": - version: 3.0.2 - resolution: "@rollup/plugin-virtual@npm:3.0.2" - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10/962bc9efece57a07c328a3d093bd1a62b9b4396a88640ac79cfc04181e06b31c4b37726ca27ded71178ace27db9b0085b43c4de823378773bb44cb233ea1340e +"@smithy/util-base64@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-base64@npm:4.0.0" + dependencies: + "@smithy/util-buffer-from": "npm:^4.0.0" + "@smithy/util-utf8": "npm:^4.0.0" + tslib: "npm:^2.6.2" + checksum: 10/f495fa8f5be60a1b94f88e2de4b1236df5cfee78f32191840adffcc520f2f55cdc2f287dd7abddcac4759c51970b5326b6b371c60ad65b640992018e95e30d19 languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.13.0": - version: 4.13.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.13.0" - conditions: os=android & cpu=arm +"@smithy/util-body-length-browser@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-body-length-browser@npm:4.0.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10/041a5e3c98d5b0a935c992c0217dcc033886798406df803945c994fbf3302eb0d9bdea7f7f8e6abaabf3e547bdffda6f1fb00829be3e93adac6b1949d77b741f languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.13.0": - version: 4.13.0 - resolution: "@rollup/rollup-android-arm64@npm:4.13.0" - conditions: os=android & cpu=arm64 +"@smithy/util-body-length-node@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-body-length-node@npm:4.0.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10/28d7b25b1465b290507b90be595bb161f9c1de755b35b4b99c3cf752725806b7d1f0c364535007f45a6aba95f2b49c2be9ebabaa4f03b5d36f9fc3287cd9d17a languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.13.0": - version: 4.13.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.13.0" - conditions: os=darwin & cpu=arm64 +"@smithy/util-buffer-from@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-buffer-from@npm:2.2.0" + dependencies: + "@smithy/is-array-buffer": "npm:^2.2.0" + tslib: "npm:^2.6.2" + checksum: 10/53253e4e351df3c4b7907dca48a0a6ceae783e98a8e73526820b122b3047a53fd127c19f4d8301f68d852011d821da519da783de57e0b22eed57c4df5b90d089 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.13.0": - version: 4.13.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.13.0" - conditions: os=darwin & cpu=x64 +"@smithy/util-buffer-from@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-buffer-from@npm:4.0.0" + dependencies: + "@smithy/is-array-buffer": "npm:^4.0.0" + tslib: "npm:^2.6.2" + checksum: 10/077fd6fe88b9db69ef0d4e2dfa9946bb1e1ae3d899515d7102f8648d18fb012fcbc87244cce569c0e9e86c5001bfe309b2de874fe508e1a9a591b11540b0a2c8 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.13.0": - version: 4.13.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.13.0" - conditions: os=linux & cpu=arm +"@smithy/util-config-provider@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-config-provider@npm:4.0.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10/74f3cb317056f0974b0942c79d43859031cb860fcf6eb5c9244bee369fc6c4b9c823491a40ca4f03f65641f4128d7fa5c2d322860cb7ee8517c0b2e63088ac6f languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.13.0": - version: 4.13.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.13.0" - conditions: os=linux & cpu=arm64 & libc=glibc +"@smithy/util-defaults-mode-browser@npm:^4.0.14": + version: 4.0.15 + resolution: "@smithy/util-defaults-mode-browser@npm:4.0.15" + dependencies: + "@smithy/property-provider": "npm:^4.0.3" + "@smithy/smithy-client": "npm:^4.3.0" + "@smithy/types": "npm:^4.3.0" + bowser: "npm:^2.11.0" + tslib: "npm:^2.6.2" + checksum: 10/ef05f70979443a404f3dd86a4bac992fc517ffd6db0dd16fe347573cae1f398237c48e39727eddfbdb57baaf4cd57478ee59ce2b22e11fd157db8009f38e44a1 languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.13.0": - version: 4.13.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.13.0" - conditions: os=linux & cpu=arm64 & libc=musl +"@smithy/util-defaults-mode-node@npm:^4.0.14": + version: 4.0.15 + resolution: "@smithy/util-defaults-mode-node@npm:4.0.15" + dependencies: + "@smithy/config-resolver": "npm:^4.1.3" + "@smithy/credential-provider-imds": "npm:^4.0.5" + "@smithy/node-config-provider": "npm:^4.1.2" + "@smithy/property-provider": "npm:^4.0.3" + "@smithy/smithy-client": "npm:^4.3.0" + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/8fdebf845f7de1c254ce843fbd06ce2fe4989b79686ca33fee5bb3ef0a0f9fcb64db3c2d3cb0cdb705d279e115b2a5879b637f9ad795c6c34a5d73dfe278d692 languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.13.0": - version: 4.13.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.13.0" - conditions: os=linux & cpu=riscv64 & libc=glibc +"@smithy/util-endpoints@npm:^3.0.4": + version: 3.0.5 + resolution: "@smithy/util-endpoints@npm:3.0.5" + dependencies: + "@smithy/node-config-provider": "npm:^4.1.2" + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/260302b09f6a770f5a852833e6b4f2861ad28aab64ca7c44f9c128fbaf4575ea2755801d555d66429940a90c7ed865828b04f0e55cb28551cdb76599db96dcfb languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.13.0": - version: 4.13.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.13.0" - conditions: os=linux & cpu=x64 & libc=glibc +"@smithy/util-hex-encoding@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-hex-encoding@npm:4.0.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10/447475cad8510d2727bbdf8490021a7ca8cb52b391f4bfe646c73a3aa1d5678152f1b5c4c2aaeebd9f6650272d973a1739e2d42294bd68c957429e3a30db3546 languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.13.0": - version: 4.13.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.13.0" - conditions: os=linux & cpu=x64 & libc=musl +"@smithy/util-middleware@npm:^4.0.2, @smithy/util-middleware@npm:^4.0.3": + version: 4.0.3 + resolution: "@smithy/util-middleware@npm:4.0.3" + dependencies: + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/17057f18f5b70edfd4729852491dd0259df1a94e544969e604d675e421f5b748634e41361732505caa747c06d510ac8d948f9522ae52022e79bfa28a56238de1 languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.13.0": - version: 4.13.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.13.0" - conditions: os=win32 & cpu=arm64 +"@smithy/util-retry@npm:^4.0.3, @smithy/util-retry@npm:^4.0.4": + version: 4.0.4 + resolution: "@smithy/util-retry@npm:4.0.4" + dependencies: + "@smithy/service-error-classification": "npm:^4.0.4" + "@smithy/types": "npm:^4.3.0" + tslib: "npm:^2.6.2" + checksum: 10/243e0e48092007281f2732c8267deadb8d6991ec900ed59b13005617cbfae2d715470d9cacb5aa819bbffc1dc30fc0bf1c1a27b5d8f2ec8ed3f24077bc627601 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.13.0": - version: 4.13.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.13.0" - conditions: os=win32 & cpu=ia32 +"@smithy/util-stream@npm:^4.2.0, @smithy/util-stream@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-stream@npm:4.2.1" + dependencies: + "@smithy/fetch-http-handler": "npm:^5.0.3" + "@smithy/node-http-handler": "npm:^4.0.5" + "@smithy/types": "npm:^4.3.0" + "@smithy/util-base64": "npm:^4.0.0" + "@smithy/util-buffer-from": "npm:^4.0.0" + "@smithy/util-hex-encoding": "npm:^4.0.0" + "@smithy/util-utf8": "npm:^4.0.0" + tslib: "npm:^2.6.2" + checksum: 10/1e3639829cd93c5e1fb20550092a52f12ca31e0a23ec53e0409b9927731522fe149534e2f31fdde5eb32b15498d9516b30bb396cd017c9b0120f4f3d9ccab79d languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.13.0": - version: 4.13.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.13.0" - conditions: os=win32 & cpu=x64 +"@smithy/util-uri-escape@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-uri-escape@npm:4.0.0" + dependencies: + tslib: "npm:^2.6.2" + checksum: 10/27b71d7c1bc21d9038b86fd55380449a7a1dab52959566372d24a86df027c0ad9190980879cc4903be999dc36a5619f0794acf9cdc789adba5e57e26cd6ce4a6 languageName: node linkType: hard -"@smithy/protocol-http@npm:^1.0.1": - version: 1.0.1 - resolution: "@smithy/protocol-http@npm:1.0.1" +"@smithy/util-utf8@npm:^2.0.0": + version: 2.3.0 + resolution: "@smithy/util-utf8@npm:2.3.0" dependencies: - "@smithy/types": "npm:^1.0.0" - tslib: "npm:^2.5.0" - checksum: 10/ce35abbe2a82e395eaafbb339e338b43a691b26923a6e95cc0bf1b3001ccf3ccbd7c746e62f6c36e3675b5255915ac08e3ec84b90ca0f7a9f729f67164467313 + "@smithy/util-buffer-from": "npm:^2.2.0" + tslib: "npm:^2.6.2" + checksum: 10/c766ead8dac6bc6169f4cac1cc47ef7bd86928d06255148f9528228002f669c8cc49f78dc2b9ba5d7e214d40315024a9e32c5c9130b33e20f0fe4532acd0dff5 languageName: node linkType: hard -"@smithy/types@npm:^1.0.0": - version: 1.0.0 - resolution: "@smithy/types@npm:1.0.0" +"@smithy/util-utf8@npm:^4.0.0": + version: 4.0.0 + resolution: "@smithy/util-utf8@npm:4.0.0" dependencies: - tslib: "npm:^2.5.0" - checksum: 10/f0a6942ee6358456094d56365663a859fd3bacb9b1c290beefd7308fe08a66b5423fe95f80156b6bbb177c1549cdd1e9a6e4b854e868b87a0f3a8f2b1ad91c86 + "@smithy/util-buffer-from": "npm:^4.0.0" + tslib: "npm:^2.6.2" + checksum: 10/4de06914d08753ce14ec553cf2dabe4a432cf982e415ec7dec82dfb8a6af793ddd08587fbcaeb889a0f6cc917eecca3a026880cf914082ee8e293f5bfc44e248 languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.4.8": - version: 1.4.8 - resolution: "@swc/core-darwin-arm64@npm:1.4.8" +"@swc/core-darwin-arm64@npm:1.11.29": + version: 1.11.29 + resolution: "@swc/core-darwin-arm64@npm:1.11.29" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.4.8": - version: 1.4.8 - resolution: "@swc/core-darwin-x64@npm:1.4.8" +"@swc/core-darwin-x64@npm:1.11.29": + version: 1.11.29 + resolution: "@swc/core-darwin-x64@npm:1.11.29" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.4.8": - version: 1.4.8 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.4.8" +"@swc/core-linux-arm-gnueabihf@npm:1.11.29": + version: 1.11.29 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.11.29" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.4.8": - version: 1.4.8 - resolution: "@swc/core-linux-arm64-gnu@npm:1.4.8" +"@swc/core-linux-arm64-gnu@npm:1.11.29": + version: 1.11.29 + resolution: "@swc/core-linux-arm64-gnu@npm:1.11.29" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.4.8": - version: 1.4.8 - resolution: "@swc/core-linux-arm64-musl@npm:1.4.8" +"@swc/core-linux-arm64-musl@npm:1.11.29": + version: 1.11.29 + resolution: "@swc/core-linux-arm64-musl@npm:1.11.29" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.4.8": - version: 1.4.8 - resolution: "@swc/core-linux-x64-gnu@npm:1.4.8" +"@swc/core-linux-x64-gnu@npm:1.11.29": + version: 1.11.29 + resolution: "@swc/core-linux-x64-gnu@npm:1.11.29" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.4.8": - version: 1.4.8 - resolution: "@swc/core-linux-x64-musl@npm:1.4.8" +"@swc/core-linux-x64-musl@npm:1.11.29": + version: 1.11.29 + resolution: "@swc/core-linux-x64-musl@npm:1.11.29" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.4.8": - version: 1.4.8 - resolution: "@swc/core-win32-arm64-msvc@npm:1.4.8" +"@swc/core-win32-arm64-msvc@npm:1.11.29": + version: 1.11.29 + resolution: "@swc/core-win32-arm64-msvc@npm:1.11.29" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.4.8": - version: 1.4.8 - resolution: "@swc/core-win32-ia32-msvc@npm:1.4.8" +"@swc/core-win32-ia32-msvc@npm:1.11.29": + version: 1.11.29 + resolution: "@swc/core-win32-ia32-msvc@npm:1.11.29" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.4.8": - version: 1.4.8 - resolution: "@swc/core-win32-x64-msvc@npm:1.4.8" +"@swc/core-win32-x64-msvc@npm:1.11.29": + version: 1.11.29 + resolution: "@swc/core-win32-x64-msvc@npm:1.11.29" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:^1.3.100": - version: 1.4.8 - resolution: "@swc/core@npm:1.4.8" +"@swc/core@npm:^1.10.16": + version: 1.11.29 + resolution: "@swc/core@npm:1.11.29" dependencies: - "@swc/core-darwin-arm64": "npm:1.4.8" - "@swc/core-darwin-x64": "npm:1.4.8" - "@swc/core-linux-arm-gnueabihf": "npm:1.4.8" - "@swc/core-linux-arm64-gnu": "npm:1.4.8" - "@swc/core-linux-arm64-musl": "npm:1.4.8" - "@swc/core-linux-x64-gnu": "npm:1.4.8" - "@swc/core-linux-x64-musl": "npm:1.4.8" - "@swc/core-win32-arm64-msvc": "npm:1.4.8" - "@swc/core-win32-ia32-msvc": "npm:1.4.8" - "@swc/core-win32-x64-msvc": "npm:1.4.8" - "@swc/counter": "npm:^0.1.2" - "@swc/types": "npm:^0.1.5" + "@swc/core-darwin-arm64": "npm:1.11.29" + "@swc/core-darwin-x64": "npm:1.11.29" + "@swc/core-linux-arm-gnueabihf": "npm:1.11.29" + "@swc/core-linux-arm64-gnu": "npm:1.11.29" + "@swc/core-linux-arm64-musl": "npm:1.11.29" + "@swc/core-linux-x64-gnu": "npm:1.11.29" + "@swc/core-linux-x64-musl": "npm:1.11.29" + "@swc/core-win32-arm64-msvc": "npm:1.11.29" + "@swc/core-win32-ia32-msvc": "npm:1.11.29" + "@swc/core-win32-x64-msvc": "npm:1.11.29" + "@swc/counter": "npm:^0.1.3" + "@swc/types": "npm:^0.1.21" peerDependencies: - "@swc/helpers": ^0.5.0 + "@swc/helpers": ">=0.5.17" dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -1850,30 +1931,23 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10/817b674130bc43345e7d8e7fbcf56658d4a655d9544c646475063c7849529c0a6c236a15f3217e7b0b2b99050bda189d3ff26e225b80b838a87b954b97abcb2a + checksum: 10/6945229bf6da91adff26033910e8e02ccc457a8229724d0539a0b32995d05949c7709cb9cae2cd7ab10cf4d346b235e22dd4d6b207ded765597304e21e6b6101 languageName: node linkType: hard -"@swc/counter@npm:^0.1.2, @swc/counter@npm:^0.1.3": +"@swc/counter@npm:^0.1.3": version: 0.1.3 resolution: "@swc/counter@npm:0.1.3" checksum: 10/df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598 languageName: node linkType: hard -"@swc/types@npm:^0.1.5": - version: 0.1.6 - resolution: "@swc/types@npm:0.1.6" +"@swc/types@npm:^0.1.21": + version: 0.1.21 + resolution: "@swc/types@npm:0.1.21" dependencies: "@swc/counter": "npm:^0.1.3" - checksum: 10/b42fbca6f1ad56d1909fa6114b62107418a665730bb9b4d8bd8fa1c86921f8758a73959928342638fb57490b5d618a46881045fa9f094763a00f939944835d36 - languageName: node - linkType: hard - -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: 10/ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 + checksum: 10/6554bf5c78519f49099a2ba448d170191a14b1c7a35df848f10ee4d6c03ecd681e5213884905187de1d1d221589ec8b5cb77f477d099dc1627c3ec9d7f2fcdb0 languageName: node linkType: hard @@ -1891,11 +1965,11 @@ __metadata: linkType: hard "@types/babel__generator@npm:*": - version: 7.6.8 - resolution: "@types/babel__generator@npm:7.6.8" + version: 7.27.0 + resolution: "@types/babel__generator@npm:7.27.0" dependencies: "@babel/types": "npm:^7.0.0" - checksum: 10/b53c215e9074c69d212402990b0ca8fa57595d09e10d94bda3130aa22b55d796e50449199867879e4ea0ee968f3a2099e009cfb21a726a53324483abbf25cd30 + checksum: 10/f572e67a9a39397664350a4437d8a7fbd34acc83ff4887a8cf08349e39f8aeb5ad2f70fb78a0a0a23a280affe3a5f4c25f50966abdce292bcf31237af1c27b1a languageName: node linkType: hard @@ -1910,77 +1984,70 @@ __metadata: linkType: hard "@types/babel__traverse@npm:*": - version: 7.20.5 - resolution: "@types/babel__traverse@npm:7.20.5" + version: 7.20.7 + resolution: "@types/babel__traverse@npm:7.20.7" dependencies: "@babel/types": "npm:^7.20.7" - checksum: 10/f0352d537448e1e37f27e6bb8c962d7893720a92fde9d8601a68a93dbc14e15c088b4c0c8f71021d0966d09fba802ef3de11fdb6766c33993f8cf24f1277c6a9 + checksum: 10/d005b58e1c26bdafc1ce564f60db0ee938393c7fc586b1197bdb71a02f7f33f72bc10ae4165776b6cafc77c4b6f2e1a164dd20bc36518c471b1131b153b4baa6 languageName: node linkType: hard "@types/body-parser@npm:*": - version: 1.19.2 - resolution: "@types/body-parser@npm:1.19.2" + version: 1.19.5 + resolution: "@types/body-parser@npm:1.19.5" dependencies: "@types/connect": "npm:*" "@types/node": "npm:*" - checksum: 10/e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 - languageName: node - linkType: hard - -"@types/color-name@npm:^1.1.1": - version: 1.1.1 - resolution: "@types/color-name@npm:1.1.1" - checksum: 10/73e0e230a6708210bcfc040f3bd3d7c4c0bf5ff7338e8e497cca3d05d20a0c29fb74a7bde0fa2cdf3322d4b1ffd5194c456712908974ae52d56c0d060ca55ae2 + checksum: 10/1e251118c4b2f61029cc43b0dc028495f2d1957fe8ee49a707fb940f86a9bd2f9754230805598278fe99958b49e9b7e66eec8ef6a50ab5c1f6b93e1ba2aaba82 languageName: node linkType: hard "@types/connect@npm:*": - version: 3.4.35 - resolution: "@types/connect@npm:3.4.35" + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" dependencies: "@types/node": "npm:*" - checksum: 10/fe81351470f2d3165e8b12ce33542eef89ea893e36dd62e8f7d72566dfb7e448376ae962f9f3ea888547ce8b55a40020ca0e01d637fab5d99567673084542641 + checksum: 10/7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 languageName: node linkType: hard "@types/cors@npm:^2.8.9": - version: 2.8.13 - resolution: "@types/cors@npm:2.8.13" + version: 2.8.18 + resolution: "@types/cors@npm:2.8.18" dependencies: "@types/node": "npm:*" - checksum: 10/7ef197ea19d2e5bf1313b8416baa6f3fd6dd887fd70191da1f804f557395357dafd8bc8bed0ac60686923406489262a7c8a525b55748f7b2b8afa686700de907 + checksum: 10/6e49b741345e67834cd19d766228509e4b37d6d5c272355bb059502b4787f5adf58776d9114ac5f0f407966e0347ae8d1f995d7ea41e6a24f716d36b3010401b languageName: node linkType: hard -"@types/estree@npm:1.0.5": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10/7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 +"@types/estree@npm:1.0.7": + version: 1.0.7 + resolution: "@types/estree@npm:1.0.7" + checksum: 10/419c845ece767ad4b21171e6e5b63dabb2eb46b9c0d97361edcd9cabbf6a95fcadb91d89b5fa098d1336fa0b8fceaea82fca97a2ef3971f5c86e53031e157b21 languageName: node linkType: hard "@types/express-serve-static-core@npm:^4.17.33": - version: 4.17.35 - resolution: "@types/express-serve-static-core@npm:4.17.35" + version: 4.19.6 + resolution: "@types/express-serve-static-core@npm:4.19.6" dependencies: "@types/node": "npm:*" "@types/qs": "npm:*" "@types/range-parser": "npm:*" "@types/send": "npm:*" - checksum: 10/9f08212ac163e9b2a1005d84cc43ace52d5057dfaa009c575eb3f3a659949b9c9cecec0cbff863622871c56e1c604bd67857a5e1d353256eaf9adacec59f87bf + checksum: 10/a2e00b6c5993f0dd63ada2239be81076fe0220314b9e9fde586e8946c9c09ce60f9a2dd0d74410ee2b5fd10af8c3e755a32bb3abf134533e2158142488995455 languageName: node linkType: hard "@types/express@npm:^4.17.7": - version: 4.17.17 - resolution: "@types/express@npm:4.17.17" + version: 4.17.22 + resolution: "@types/express@npm:4.17.22" dependencies: "@types/body-parser": "npm:*" "@types/express-serve-static-core": "npm:^4.17.33" "@types/qs": "npm:*" "@types/serve-static": "npm:*" - checksum: 10/e2959a5fecdc53f8a524891a16e66dfc330ee0519e89c2579893179db686e10cfa6079a68e0fb8fd00eedbcaf3eabfd10916461939f3bc02ef671d848532c37e + checksum: 10/9497634fc341ff4ac966ec0c529ded03bdacd2c3dae164f10a060ff250c66591b873aedce92d0239869cf3d05615ae9bcad584c7349fe68780242f6fef010c62 languageName: node linkType: hard @@ -1991,10 +2058,17 @@ __metadata: languageName: node linkType: hard +"@types/http-errors@npm:*": + version: 2.0.4 + resolution: "@types/http-errors@npm:2.0.4" + checksum: 10/1f3d7c3b32c7524811a45690881736b3ef741bf9849ae03d32ad1ab7062608454b150a4e7f1351f83d26a418b2d65af9bdc06198f1c079d75578282884c4e8e3 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.9": - version: 7.0.12 - resolution: "@types/json-schema@npm:7.0.12" - checksum: 10/7a72ba9cb7d2b45d7bb032e063c9eeb1ce4102d62551761e84c91f99f8273ba5aaffd34be835869456ec7c40761b4389009d9e777c0020a7227ca0f5e3238e94 + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 languageName: node linkType: hard @@ -2007,17 +2081,10 @@ __metadata: languageName: node linkType: hard -"@types/mime@npm:*": - version: 3.0.1 - resolution: "@types/mime@npm:3.0.1" - checksum: 10/4040fac73fd0cea2460e29b348c1a6173da747f3a87da0dbce80dd7a9355a3d0e51d6d9a401654f3e5550620e3718b5a899b2ec1debf18424e298a2c605346e7 - languageName: node - linkType: hard - "@types/mime@npm:^1": - version: 1.3.2 - resolution: "@types/mime@npm:1.3.2" - checksum: 10/0493368244cced1a69cb791b485a260a422e6fcc857782e1178d1e6f219f1b161793e9f87f5fae1b219af0f50bee24fcbe733a18b4be8fdd07a38a8fb91146fd + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: 10/e29a5f9c4776f5229d84e525b7cd7dd960b51c30a0fb9a028c0821790b82fca9f672dab56561e2acd9e8eed51d431bde52eafdfef30f643586c4162f1aecfc78 languageName: node linkType: hard @@ -2031,107 +2098,102 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 20.3.0 - resolution: "@types/node@npm:20.3.0" - checksum: 10/c1fdc2d64313f53fbd0d2d4172e61b2e088c4474c2d33f448cbda54948bc52f56b0fb78d39f958d4add630cd91d03bee292a34615e94a05251b7a4cb335899de + version: 22.15.21 + resolution: "@types/node@npm:22.15.21" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10/cb4189587cca445bfb8166c0ed39f9344d743f37f3da892f2999a99bbabda45dc773237e61ecb7d1dc83dd95718cb1b5715b0be5dd7953565b19019e36a7cf39 languageName: node linkType: hard "@types/prop-types@npm:*": - version: 15.7.11 - resolution: "@types/prop-types@npm:15.7.11" - checksum: 10/7519ff11d06fbf6b275029fe03fff9ec377b4cb6e864cac34d87d7146c7f5a7560fd164bdc1d2dbe00b60c43713631251af1fd3d34d46c69cd354602bc0c7c54 + version: 15.7.14 + resolution: "@types/prop-types@npm:15.7.14" + checksum: 10/d0c5407b9ccc3dd5fae0ccf9b1007e7622ba5e6f1c18399b4f24dff33619d469da4b9fa918a374f19dc0d9fe6a013362aab0b844b606cfc10676efba3f5f736d languageName: node linkType: hard "@types/qs@npm:*": - version: 6.9.7 - resolution: "@types/qs@npm:6.9.7" - checksum: 10/7fd6f9c25053e9b5bb6bc9f9f76c1d89e6c04f7707a7ba0e44cc01f17ef5284adb82f230f542c2d5557d69407c9a40f0f3515e8319afd14e1e16b5543ac6cdba + version: 6.14.0 + resolution: "@types/qs@npm:6.14.0" + checksum: 10/1909205514d22b3cbc7c2314e2bd8056d5f05dfb21cf4377f0730ee5e338ea19957c41735d5e4806c746176563f50005bbab602d8358432e25d900bdf4970826 languageName: node linkType: hard "@types/range-parser@npm:*": - version: 1.2.4 - resolution: "@types/range-parser@npm:1.2.4" - checksum: 10/b7c0dfd5080a989d6c8bb0b6750fc0933d9acabeb476da6fe71d8bdf1ab65e37c136169d84148034802f48378ab94e3c37bb4ef7656b2bec2cb9c0f8d4146a95 + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 10/95640233b689dfbd85b8c6ee268812a732cf36d5affead89e806fe30da9a430767af8ef2cd661024fd97e19d61f3dec75af2df5e80ec3bea000019ab7028629a languageName: node linkType: hard "@types/react-dom@npm:^18": - version: 18.2.22 - resolution: "@types/react-dom@npm:18.2.22" - dependencies: - "@types/react": "npm:*" - checksum: 10/310da22244c1bb65a7f213f8727bda821dd211cfb2dd62d1f9b28dd50ef1c196d59e908494bd5f25c13a3844343f3a6135f39fb830aca6f79646fa56c1b56c08 + version: 18.3.7 + resolution: "@types/react-dom@npm:18.3.7" + peerDependencies: + "@types/react": ^18.0.0 + checksum: 10/317569219366d487a3103ba1e5e47154e95a002915fdcf73a44162c48fe49c3a57fcf7f57fc6979e70d447112681e6b13c6c3c1df289db8b544df4aab2d318f3 languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:^18.2.67": - version: 18.2.67 - resolution: "@types/react@npm:18.2.67" +"@types/react@npm:^18.2.67": + version: 18.3.22 + resolution: "@types/react@npm:18.3.22" dependencies: "@types/prop-types": "npm:*" - "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 10/d7e248dbe8d9d3b05f0d8e128d615fc9c85aa2c5d15634271d20cb9b343dbeffb0875f31a44e7ac63b42afc25949bd4c3633b7ebee45ee4666591ca934a8dffb + checksum: 10/580496f2768db339206c215aba4347ca07cf5d87a825311355760c9018bf4e2020810a85e8c525681ab78aa53be1ccc3751c9f4ec9cbc0d1b8217c7aeaa62e32 languageName: node linkType: hard "@types/responselike@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/responselike@npm:1.0.0" + version: 1.0.3 + resolution: "@types/responselike@npm:1.0.3" dependencies: "@types/node": "npm:*" - checksum: 10/e4972389457e4edce3cbba5e8474fb33684d73879433a9eec989d0afb7e550fd6fa3ffb8fe68dbb429288d10707796a193bc0007c4e8429fd267bdc4d8404632 - languageName: node - linkType: hard - -"@types/scheduler@npm:*": - version: 0.16.8 - resolution: "@types/scheduler@npm:0.16.8" - checksum: 10/6c091b096daa490093bf30dd7947cd28e5b2cd612ec93448432b33f724b162587fed9309a0acc104d97b69b1d49a0f3fc755a62282054d62975d53d7fd13472d + checksum: 10/6ac4b35723429b11b117e813c7acc42c3af8b5554caaf1fc750404c1ae59f9b7376bc69b9e9e194a5a97357a597c2228b7173d317320f0360d617b6425212f58 languageName: node linkType: hard "@types/seedrandom@npm:^3.0.4": - version: 3.0.5 - resolution: "@types/seedrandom@npm:3.0.5" - checksum: 10/d63d56ebc609203cf8cbe2ab7e7934237446bc2463ade664be130dcd4a3d74915d529909de2e1b18141cfabc9e42784998b7e5ff30c016919ac5b83911a700f0 + version: 3.0.8 + resolution: "@types/seedrandom@npm:3.0.8" + checksum: 10/9651de4ecb5ad060053678d6a42403dd78222bcca80016417c23b58b4f739e544b7197a78b97d6862cf417ea80fd2df612cc50ca0fa387fbe794e326a382ab0b languageName: node linkType: hard "@types/semver@npm:^7.3.12": - version: 7.5.0 - resolution: "@types/semver@npm:7.5.0" - checksum: 10/8fbfbf79e9c14c3c20160a42145a146cba44d9763d0fac78358b394dc36e41bc2590bc4f0129c6fcbbc9b30f12ea1ba821bfe84b29dc80897f315cc7dd251393 + version: 7.7.0 + resolution: "@types/semver@npm:7.7.0" + checksum: 10/ee4514c6c852b1c38f951239db02f9edeea39f5310fad9396a00b51efa2a2d96b3dfca1ae84c88181ea5b7157c57d32d7ef94edacee36fbf975546396b85ba5b languageName: node linkType: hard "@types/send@npm:*": - version: 0.17.1 - resolution: "@types/send@npm:0.17.1" + version: 0.17.4 + resolution: "@types/send@npm:0.17.4" dependencies: "@types/mime": "npm:^1" "@types/node": "npm:*" - checksum: 10/6420837887858f7aa82f2c0272f73edb42385bd0978f43095e83590a405d86c8cc6d918c30b2d542f1d8bddc9f3d16c2e8fdfca936940de71b97c45f228d1896 + checksum: 10/28320a2aa1eb704f7d96a65272a07c0bf3ae7ed5509c2c96ea5e33238980f71deeed51d3631927a77d5250e4091b3e66bce53b42d770873282c6a20bb8b0280d languageName: node linkType: hard "@types/serve-static@npm:*": - version: 1.15.1 - resolution: "@types/serve-static@npm:1.15.1" + version: 1.15.7 + resolution: "@types/serve-static@npm:1.15.7" dependencies: - "@types/mime": "npm:*" + "@types/http-errors": "npm:*" "@types/node": "npm:*" - checksum: 10/e556d611a4240d338afe90c080f9987bbeecee97f8fd3a8aabac07fa6bc3652a3c3f06214fb25f709547c4dcee9f0a723f24c799758484c6db7f46c0235d5b4f + "@types/send": "npm:*" + checksum: 10/c5a7171d5647f9fbd096ed1a26105759f3153ccf683824d99fee4c7eb9cde2953509621c56a070dd9fb1159e799e86d300cbe4e42245ebc5b0c1767e8ca94a67 languageName: node linkType: hard "@types/webidl-conversions@npm:*": - version: 7.0.0 - resolution: "@types/webidl-conversions@npm:7.0.0" - checksum: 10/60142c7ddd9eb6f907d232d6b3a81ecf990f73b5a62a004eba8bd0f54809a42ece68ce512e7e3e1d98af8b6393d66cddb96f3622d2fb223c4e9c8937c61bfed7 + version: 7.0.3 + resolution: "@types/webidl-conversions@npm:7.0.3" + checksum: 10/535ead9de4d3d6c8e4f4fa14e9db780d2a31e8020debc062f337e1420a41c3265e223e4f4b628f97a11ecf3b96390962cd88a9ffe34f44e159dec583ff49aa34 languageName: node linkType: hard @@ -2142,6 +2204,15 @@ __metadata: languageName: node linkType: hard +"@types/whatwg-url@npm:^11.0.2": + version: 11.0.5 + resolution: "@types/whatwg-url@npm:11.0.5" + dependencies: + "@types/webidl-conversions": "npm:*" + checksum: 10/23a0c45aff51817807b473a6adb181d6e3bb0d27dde54e84883d5d5bc93358e95204d2188e7ff7fdc2cdaf157e97e1188ef0a22ec79228da300fc30d4a05b56a + languageName: node + linkType: hard + "@types/whatwg-url@npm:^8.2.1": version: 8.2.2 resolution: "@types/whatwg-url@npm:8.2.2" @@ -2153,24 +2224,24 @@ __metadata: linkType: hard "@types/ws@npm:^8.5.3": - version: 8.5.5 - resolution: "@types/ws@npm:8.5.5" + version: 8.18.1 + resolution: "@types/ws@npm:8.18.1" dependencies: "@types/node": "npm:*" - checksum: 10/b2d7da5bd469c2ff1ddcfba1da33a556dc02c539e727001e7dc7b4182935154143e96a101cc091686acefb4e115c8ee38111c6634934748b8dd2db0c851c50ab + checksum: 10/1ce05e3174dcacf28dae0e9b854ef1c9a12da44c7ed73617ab6897c5cbe4fccbb155a20be5508ae9a7dde2f83bd80f5cf3baa386b934fc4b40889ec963e94f3a languageName: node linkType: hard "@typescript-eslint/eslint-plugin@npm:^5.59.9": - version: 5.59.9 - resolution: "@typescript-eslint/eslint-plugin@npm:5.59.9" + version: 5.62.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" dependencies: "@eslint-community/regexpp": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:5.59.9" - "@typescript-eslint/type-utils": "npm:5.59.9" - "@typescript-eslint/utils": "npm:5.59.9" + "@typescript-eslint/scope-manager": "npm:5.62.0" + "@typescript-eslint/type-utils": "npm:5.62.0" + "@typescript-eslint/utils": "npm:5.62.0" debug: "npm:^4.3.4" - grapheme-splitter: "npm:^1.0.4" + graphemer: "npm:^1.4.0" ignore: "npm:^5.2.0" natural-compare-lite: "npm:^1.4.0" semver: "npm:^7.3.7" @@ -2181,43 +2252,43 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/8d25afe8574930f6680a043f314449ac5063fa382e7ee4d346172ba514b140bf126d19da546d5d5f2946a7d2bbff139312cd98aa83c55506b50a17f3226780b5 + checksum: 10/9cc8319c6fd8a21938f5b69476974a7e778c283a55ef9fad183c850995b9adcb0087d57cea7b2ac6b9449570eee983aad39491d14cdd2e52d6b4b0485e7b2482 languageName: node linkType: hard "@typescript-eslint/parser@npm:^5.59.9": - version: 5.59.9 - resolution: "@typescript-eslint/parser@npm:5.59.9" + version: 5.62.0 + resolution: "@typescript-eslint/parser@npm:5.62.0" dependencies: - "@typescript-eslint/scope-manager": "npm:5.59.9" - "@typescript-eslint/types": "npm:5.59.9" - "@typescript-eslint/typescript-estree": "npm:5.59.9" + "@typescript-eslint/scope-manager": "npm:5.62.0" + "@typescript-eslint/types": "npm:5.62.0" + "@typescript-eslint/typescript-estree": "npm:5.62.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10/49a0bb14165c4c6308ac8d777f3483c128c4357f4e7525e73e51e07b9e6c386c61dc041518c31337e34f789bd5af264255a9b98456f16feb7c245be52a23259c + checksum: 10/b6ca629d8f4e6283ff124501731cc886703eb4ce2c7d38b3e4110322ea21452b9d9392faf25be6bd72f54b89de7ffc72a40d9b159083ac54345a3d04b4fa5394 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.59.9": - version: 5.59.9 - resolution: "@typescript-eslint/scope-manager@npm:5.59.9" +"@typescript-eslint/scope-manager@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/scope-manager@npm:5.62.0" dependencies: - "@typescript-eslint/types": "npm:5.59.9" - "@typescript-eslint/visitor-keys": "npm:5.59.9" - checksum: 10/83b538212fc422cd6a26eee49deab60a29fa6d8bbd0dffca6daa02318959c76ddf1dc00db9ce0236258f26c1f726be78a25d2f6c5603233f591716d6299480e5 + "@typescript-eslint/types": "npm:5.62.0" + "@typescript-eslint/visitor-keys": "npm:5.62.0" + checksum: 10/e827770baa202223bc0387e2fd24f630690809e460435b7dc9af336c77322290a770d62bd5284260fa881c86074d6a9fd6c97b07382520b115f6786b8ed499da languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.59.9": - version: 5.59.9 - resolution: "@typescript-eslint/type-utils@npm:5.59.9" +"@typescript-eslint/type-utils@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/type-utils@npm:5.62.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:5.59.9" - "@typescript-eslint/utils": "npm:5.59.9" + "@typescript-eslint/typescript-estree": "npm:5.62.0" + "@typescript-eslint/utils": "npm:5.62.0" debug: "npm:^4.3.4" tsutils: "npm:^3.21.0" peerDependencies: @@ -2225,23 +2296,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/a510ddf2783b1f70ff2a2242b5d45833036817e22649cfbc662f3b8427e98675b9d3e170747f90b3654a4ccfa97d3aee17bba708a74e35ce372f4704ac508dab + checksum: 10/f9a4398d6d2aae09e3e765eff04cf4ab364376a87868031ac5c6a64c9bbb555cb1a7f99b07b3d1017e7422725b5f0bbee537f13b82ab2d930f161c987b3dece0 languageName: node linkType: hard -"@typescript-eslint/types@npm:5.59.9": - version: 5.59.9 - resolution: "@typescript-eslint/types@npm:5.59.9" - checksum: 10/49226e5384ac801db245fe668b4bd7610a11c5ade9c05ee93767fd188462c4d25755b8592f21210cc9856fae3c5566d4811ed0f7fefe30e48e5823e71ab4623e +"@typescript-eslint/types@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/types@npm:5.62.0" + checksum: 10/24e8443177be84823242d6729d56af2c4b47bfc664dd411a1d730506abf2150d6c31bdefbbc6d97c8f91043e3a50e0c698239dcb145b79bb6b0c34469aaf6c45 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.59.9": - version: 5.59.9 - resolution: "@typescript-eslint/typescript-estree@npm:5.59.9" +"@typescript-eslint/typescript-estree@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" dependencies: - "@typescript-eslint/types": "npm:5.59.9" - "@typescript-eslint/visitor-keys": "npm:5.59.9" + "@typescript-eslint/types": "npm:5.62.0" + "@typescript-eslint/visitor-keys": "npm:5.62.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -2250,64 +2321,72 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/79cf330815244f2ab12762df9296812c20f3ff859f14dc997a79ce09eabd7c8d0d190ed00fcdf380288a2b4035ca40c9f0002dc9c6c2875885ad3b94c2eab58b + checksum: 10/06c975eb5f44b43bd19fadc2e1023c50cf87038fe4c0dd989d4331c67b3ff509b17fa60a3251896668ab4d7322bdc56162a9926971218d2e1a1874d2bef9a52e languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.59.9": - version: 5.59.9 - resolution: "@typescript-eslint/utils@npm:5.59.9" +"@typescript-eslint/utils@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/utils@npm:5.62.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@types/json-schema": "npm:^7.0.9" "@types/semver": "npm:^7.3.12" - "@typescript-eslint/scope-manager": "npm:5.59.9" - "@typescript-eslint/types": "npm:5.59.9" - "@typescript-eslint/typescript-estree": "npm:5.59.9" + "@typescript-eslint/scope-manager": "npm:5.62.0" + "@typescript-eslint/types": "npm:5.62.0" + "@typescript-eslint/typescript-estree": "npm:5.62.0" eslint-scope: "npm:^5.1.1" semver: "npm:^7.3.7" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10/e48429d9dd83d7ae1b95c64b35af790e36cd8c1b2b9b63b2f69b5f804bb58a12918396f2f0540afd413673e1e0d22399a2cd2e2ad6534e50af2990a04e8ca7c4 + checksum: 10/15ef13e43998a082b15f85db979f8d3ceb1f9ce4467b8016c267b1738d5e7cdb12aa90faf4b4e6dd6486c236cf9d33c463200465cf25ff997dbc0f12358550a1 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.59.9": - version: 5.59.9 - resolution: "@typescript-eslint/visitor-keys@npm:5.59.9" +"@typescript-eslint/visitor-keys@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" dependencies: - "@typescript-eslint/types": "npm:5.59.9" + "@typescript-eslint/types": "npm:5.62.0" eslint-visitor-keys: "npm:^3.3.0" - checksum: 10/85761ef0be6910cb4de841b3cd8f39a734f5373ed92f808365882ef357f0a33ad6f75c4b3bf0b408f0399781ac5d14f12033de3e4b53a46b61015444b05854c0 + checksum: 10/dc613ab7569df9bbe0b2ca677635eb91839dfb2ca2c6fa47870a5da4f160db0b436f7ec0764362e756d4164e9445d49d5eb1ff0b87f4c058946ae9d8c92eb388 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 10/80d6910946f2b1552a2406650051c91bbd1f24a6bf854354203d84fe2714b3e8ce4618f49cc3410494173a1c1e8e9777372fe68dce74bd45faf0a7a1a6ccf448 languageName: node linkType: hard "@vitejs/plugin-react@npm:^4.2.1": - version: 4.2.1 - resolution: "@vitejs/plugin-react@npm:4.2.1" + version: 4.5.0 + resolution: "@vitejs/plugin-react@npm:4.5.0" dependencies: - "@babel/core": "npm:^7.23.5" - "@babel/plugin-transform-react-jsx-self": "npm:^7.23.3" - "@babel/plugin-transform-react-jsx-source": "npm:^7.23.3" + "@babel/core": "npm:^7.26.10" + "@babel/plugin-transform-react-jsx-self": "npm:^7.25.9" + "@babel/plugin-transform-react-jsx-source": "npm:^7.25.9" + "@rolldown/pluginutils": "npm:1.0.0-beta.9" "@types/babel__core": "npm:^7.20.5" - react-refresh: "npm:^0.14.0" + react-refresh: "npm:^0.17.0" peerDependencies: - vite: ^4.2.0 || ^5.0.0 - checksum: 10/d7fa6dacd3c246bcee482ff4b7037b2978b6ca002b79780ad4921e91ae4bc85ab234cfb94f8d4d825fed8488a0acdda2ff02b47c27b3055187c0727b18fc725e + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + checksum: 10/0a1c4815fb5a404681443f6e3c4b5a82ec4527dc9fb606f9282bbff5d487b9af5e3433eee2386d4582045bcd691d1aca93df3cbf558164b763b7464710544fe8 languageName: node linkType: hard -"@zeit/schemas@npm:2.29.0": - version: 2.29.0 - resolution: "@zeit/schemas@npm:2.29.0" - checksum: 10/ad6afd42e77acdac32651ab594d8caafa0abe121db0de8858b276819a366f257d8b87476949c845e4e4293b24fa7c15def60b6e823ee7d65714dc9f150195e1b +"@zeit/schemas@npm:2.36.0": + version: 2.36.0 + resolution: "@zeit/schemas@npm:2.36.0" + checksum: 10/0d6e2ecf57f0e12c2b17dbdfa2f06f88519c1241275b5b8a1679dd591ee72fe45f5d87ef6ab35e068b07554b768c824dce3e2536f29d03c77cff4259209903e0 languageName: node linkType: hard -"abbrev@npm:1, abbrev@npm:^1.0.0": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: 10/2d882941183c66aa665118bafdab82b7a177e9add5eb2776c33e960a4f3c89cff88a1b38aba13a456de01d0dd9d66a8bea7c903268b21ea91dd1097e1e2e8243 +"abbrev@npm:^3.0.0": + version: 3.0.1 + resolution: "abbrev@npm:3.0.1" + checksum: 10/ebd2c149dda6f543b66ce3779ea612151bb3aa9d0824f169773ee9876f1ca5a4e0adbcccc7eed048c04da7998e1825e2aa76fcca92d9e67dea50ac2b0a58dc2e languageName: node linkType: hard @@ -2330,66 +2409,43 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.8.0": - version: 8.8.2 - resolution: "acorn@npm:8.8.2" +"acorn@npm:^8.9.0": + version: 8.14.1 + resolution: "acorn@npm:8.14.1" bin: acorn: bin/acorn - checksum: 10/b4e77d56d24d3e11a45d9ac8ae661b4e14a4af04ae33edbf1e6bf910887e5bb352cc60e9ea06a0944880e6b658f58c095d3b54e88e1921cb9319608b51085dd7 + checksum: 10/d1379bbee224e8d44c3c3946e6ba6973e999fbdd4e22e41c3455d7f9b6f72f7ce18d3dc218002e1e48eea789539cf1cb6d1430c81838c6744799c712fb557d92 languageName: node linkType: hard -"agent-base@npm:6, agent-base@npm:^6.0.2": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" - dependencies: - debug: "npm:4" - checksum: 10/21fb903e0917e5cb16591b4d0ef6a028a54b83ac30cd1fca58dece3d4e0990512a8723f9f83130d88a41e2af8b1f7be1386fda3ea2d181bb1a62155e75e95e23 - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.2.1": - version: 4.3.0 - resolution: "agentkeepalive@npm:4.3.0" - dependencies: - debug: "npm:^4.1.0" - depd: "npm:^2.0.0" - humanize-ms: "npm:^1.2.1" - checksum: 10/f791317eb4b42278d094547669b9b745e19e5d783bb42a8695820c94098ef18fc99f9d2777b5871cae76d761e45b0add8e6703e044de5d74d47181038ec7b536 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: "npm:^2.0.0" - indent-string: "npm:^4.0.0" - checksum: 10/1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 10/3db6d8d4651f2aa1a9e4af35b96ab11a7607af57a24f3bc721a387eaa3b5f674e901f0a648b0caefd48f3fd117c7761b79a3b55854e2aebaa96c3f32cf76af84 languageName: node linkType: hard -"ajv@npm:8.11.0": - version: 8.11.0 - resolution: "ajv@npm:8.11.0" +"ajv@npm:8.12.0": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" dependencies: fast-deep-equal: "npm:^3.1.1" json-schema-traverse: "npm:^1.0.0" require-from-string: "npm:^2.0.2" uri-js: "npm:^4.2.2" - checksum: 10/aa0dfd6cebdedde8e77747e84e7b7c55921930974b8547f54b4156164ff70445819398face32dafda4bd4c61bbc7513d308d4c2bf769f8ea6cb9c8449f9faf54 + checksum: 10/b406f3b79b5756ac53bfe2c20852471b08e122bc1ee4cde08ae4d6a800574d9cd78d60c81c69c63ff81e4da7cd0b638fafbb2303ae580d49cf1600b9059efb85 languageName: node linkType: hard -"ajv@npm:^6.10.0, ajv@npm:^6.12.4": - version: 6.12.5 - resolution: "ajv@npm:6.12.5" +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" dependencies: fast-deep-equal: "npm:^3.1.1" fast-json-stable-stringify: "npm:^2.0.0" json-schema-traverse: "npm:^0.4.1" uri-js: "npm:^4.2.2" - checksum: 10/38b579261bd85cff492331c07d488c868fec9f339459b64156dc8401a33be4c6f44655ef54ca7cc4e12cfd74dae0c9d122006ed7d05444defc519030182935f3 + checksum: 10/48d6ad21138d12eb4d16d878d630079a2bda25a04e745c07846a4ad768319533031e28872a9b3c5790fa1ec41aabdf2abed30a56e5a03ebc2cf92184b8ee306c languageName: node linkType: hard @@ -2412,9 +2468,9 @@ __metadata: linkType: hard "ansi-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "ansi-regex@npm:3.0.0" - checksum: 10/2ad11c416f81c39f5c65eafc88cf1d71aa91d76a2f766e75e457c2a3c43e8a003aadbf2966b61c497aa6a6940a36412486c975b3270cdfc3f413b69826189ec3 + version: 3.0.1 + resolution: "ansi-regex@npm:3.0.1" + checksum: 10/09daf180c5f59af9850c7ac1bd7fda85ba596cc8cbeb210826e90755f06c818af86d9fa1e6e8322fab2c3b9e9b03f56c537b42241139f824dd75066a1e7257cc languageName: node linkType: hard @@ -2426,9 +2482,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 10/1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10/495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac languageName: node linkType: hard @@ -2441,13 +2497,12 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^4.1.0": - version: 4.2.1 - resolution: "ansi-styles@npm:4.2.1" +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" dependencies: - "@types/color-name": "npm:^1.1.1" color-convert: "npm:^2.0.1" - checksum: 10/7c74dbc7ec912b9e45dacbfaa7e2513bea6aa24d5357a0cd3255e7f83ecfc62e1454c77ab150a8df60de700c83c17fbbf040e7c204b4b6fc7aa250c8afcb865f + checksum: 10/b4494dfbfc7e4591b4711a396bd27e540f8153914123dccb4cdbbcb514015ada63a3809f362b9d8d4f6b17a706f1d7bea3c6f974b15fa5ae76b5b502070889ff languageName: node linkType: hard @@ -2468,27 +2523,10 @@ __metadata: languageName: node linkType: hard -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 10/c2b9a631298e8d6f3797547e866db642f68493808f5b37cd61da778d5f6ada890d16f668285f7d60bd4fc3b03889bd590ffe62cf81b700e9bb353431238a0a7b - languageName: node - linkType: hard - -"arch@npm:^2.2.0": - version: 2.2.0 - resolution: "arch@npm:2.2.0" - checksum: 10/e35dbc6d362297000ab90930069576ba165fe63cd52383efcce14bd66c1b16a91ce849e1fd239964ed029d5e0bdfc32f68e9c7331b7df6c84ddebebfdbf242f7 - languageName: node - linkType: hard - -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" - dependencies: - delegates: "npm:^1.0.0" - readable-stream: "npm:^3.6.0" - checksum: 10/390731720e1bf9ed5d0efc635ea7df8cbc4c90308b0645a932f06e8495a0bf1ecc7987d3b97e805f62a17d6c4b634074b25200aa4d149be2a7b17250b9744bc4 +"arch@npm:^2.2.0": + version: 2.2.0 + resolution: "arch@npm:2.2.0" + checksum: 10/e35dbc6d362297000ab90930069576ba165fe63cd52383efcce14bd66c1b16a91ce849e1fd239964ed029d5e0bdfc32f68e9c7331b7df6c84ddebebfdbf242f7 languageName: node linkType: hard @@ -2527,6 +2565,16 @@ __metadata: languageName: node linkType: hard +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + is-array-buffer: "npm:^3.0.5" + checksum: 10/0ae3786195c3211b423e5be8dd93357870e6fb66357d81da968c2c39ef43583ef6eece1f9cb1caccdae4806739c65dea832b44b8593414313cd76a89795fca63 + languageName: node + linkType: hard + "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" @@ -2548,6 +2596,21 @@ __metadata: languageName: node linkType: hard +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + is-array-buffer: "npm:^3.0.4" + checksum: 10/4821ebdfe7d699f910c7f09bc9fa996f09b96b80bccb4f5dd4b59deae582f6ad6e505ecef6376f8beac1eda06df2dbc89b70e82835d104d6fcabd33c1aed1ae9 + languageName: node + linkType: hard + "assign-symbols@npm:^1.0.0": version: 1.0.0 resolution: "assign-symbols@npm:1.0.0" @@ -2562,6 +2625,13 @@ __metadata: languageName: node linkType: hard +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 10/1a09379937d846f0ce7614e75071c12826945d4e417db634156bf0e4673c495989302f52186dfa9767a1d9181794554717badd193ca2bbab046ef1da741d8efd + languageName: node + linkType: hard + "atob@npm:^2.1.2": version: 2.1.2 resolution: "atob@npm:2.1.2" @@ -2571,10 +2641,19 @@ __metadata: languageName: node linkType: hard +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: "npm:^1.0.0" + checksum: 10/6c9da3a66caddd83c875010a1ca8ef11eac02ba15fb592dc9418b2b5e7b77b645fa7729380a92d9835c2f05f2ca1b6251f39b993e0feb3f1517c74fa1af02cab + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": - version: 1.0.0 - resolution: "balanced-match@npm:1.0.0" - checksum: 10/9b67bfe558772f40cf743a3469b48b286aecec2ea9fe80c48d74845e53aab1cef524fafedf123a63019b49ac397760573ef5f173f539423061f7217cbb5fbd40 + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10/9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 languageName: node linkType: hard @@ -2616,23 +2695,23 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.1": - version: 1.20.1 - resolution: "body-parser@npm:1.20.1" +"body-parser@npm:1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" dependencies: bytes: "npm:3.1.2" - content-type: "npm:~1.0.4" + content-type: "npm:~1.0.5" debug: "npm:2.6.9" depd: "npm:2.0.0" destroy: "npm:1.2.0" http-errors: "npm:2.0.0" iconv-lite: "npm:0.4.24" on-finished: "npm:2.4.1" - qs: "npm:6.11.0" - raw-body: "npm:2.5.1" + qs: "npm:6.13.0" + raw-body: "npm:2.5.2" type-is: "npm:~1.6.18" unpipe: "npm:1.0.0" - checksum: 10/5f8d128022a2fb8b6e7990d30878a0182f300b70e46b3f9d358a9433ad6275f0de46add6d63206da3637c01c3b38b6111a7480f7e7ac2e9f7b989f6133fe5510 + checksum: 10/8723e3d7a672eb50854327453bed85ac48d045f4958e81e7d470c56bf111f835b97e5b73ae9f6393d0011cc9e252771f46fd281bbabc57d33d3986edf1e6aeca languageName: node linkType: hard @@ -2711,26 +2790,26 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" dependencies: - fill-range: "npm:^7.0.1" - checksum: 10/966b1fb48d193b9d155f810e5efd1790962f2c4e0829f8440b8ad236ba009222c501f70185ef732fef17a4c490bb33a03b90dab0631feafbdf447da91e8165b1 + fill-range: "npm:^7.1.1" + checksum: 10/fad11a0d4697a27162840b02b1fad249c1683cbc510cd5bf1a471f2f8085c046d41094308c577a50a03a579dd99d5a6b3724c4b5e8b14df2c4443844cfcda2c6 languageName: node linkType: hard -"browserslist@npm:^4.22.2": - version: 4.23.0 - resolution: "browserslist@npm:4.23.0" +"browserslist@npm:^4.24.0": + version: 4.24.5 + resolution: "browserslist@npm:4.24.5" dependencies: - caniuse-lite: "npm:^1.0.30001587" - electron-to-chromium: "npm:^1.4.668" - node-releases: "npm:^2.0.14" - update-browserslist-db: "npm:^1.0.13" + caniuse-lite: "npm:^1.0.30001716" + electron-to-chromium: "npm:^1.5.149" + node-releases: "npm:^2.0.19" + update-browserslist-db: "npm:^1.1.3" bin: browserslist: cli.js - checksum: 10/496c3862df74565dd942b4ae65f502c575cbeba1fa4a3894dad7aa3b16130dc3033bc502d8848147f7b625154a284708253d9598bcdbef5a1e34cf11dc7bad8e + checksum: 10/93fde829b77f20e2c4e1e0eaed154681c05e4828420e4afba790d480daa5de742977a44bbac8567881b8fbec3da3dea7ca1cb578ac1fd4385ef4ae91ca691d64 languageName: node linkType: hard @@ -2743,10 +2822,10 @@ __metadata: languageName: node linkType: hard -"bson@npm:^5.3.0": - version: 5.3.0 - resolution: "bson@npm:5.3.0" - checksum: 10/491172c38ff11fd321471757fc57676f4ec3608ff0f0d148601d59c61b491ab282844bbfcbaaca1a3669e9ab8055255677d96579c3574cb8a19bce7dcdfde214 +"bson@npm:^6.10.3": + version: 6.10.3 + resolution: "bson@npm:6.10.3" + checksum: 10/53693ad7636fa1a128f32d5c30a9584b4a09a2b2aa2040ea8bf8dca35a283eb1394138770bc6c2dae91b0c6df96b3caef3b14532644736f4d7a1d3177969537b languageName: node linkType: hard @@ -2774,29 +2853,23 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^16.1.0": - version: 16.1.3 - resolution: "cacache@npm:16.1.3" +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" dependencies: - "@npmcli/fs": "npm:^2.1.0" - "@npmcli/move-file": "npm:^2.0.0" - chownr: "npm:^2.0.0" - fs-minipass: "npm:^2.1.0" - glob: "npm:^8.0.1" - infer-owner: "npm:^1.0.4" - lru-cache: "npm:^7.7.1" - minipass: "npm:^3.1.6" - minipass-collect: "npm:^1.0.2" + "@npmcli/fs": "npm:^4.0.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" - mkdirp: "npm:^1.0.4" - p-map: "npm:^4.0.0" - promise-inflight: "npm:^1.0.1" - rimraf: "npm:^3.0.2" - ssri: "npm:^9.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^2.0.0" - checksum: 10/a14524d90e377ee691d63a81173b33c473f8bc66eb299c64290b58e1d41b28842397f8d6c15a01b4c57ca340afcec019ae112a45c2f67a79f76130d326472e92 + p-map: "npm:^7.0.2" + ssri: "npm:^12.0.0" + tar: "npm:^7.4.3" + unique-filename: "npm:^4.0.0" + checksum: 10/ea026b27b13656330c2bbaa462a88181dcaa0435c1c2e705db89b31d9bdf7126049d6d0445ba746dca21454a0cfdf1d6f47fd39d34c8c8435296b30bc5738a13 languageName: node linkType: hard @@ -2817,13 +2890,35 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0": +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": version: 1.0.2 - resolution: "call-bind@npm:1.0.2" + resolution: "call-bind-apply-helpers@npm:1.0.2" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + checksum: 10/00482c1f6aa7cfb30fb1dbeb13873edf81cfac7c29ed67a5957d60635a56b2a4a480f1016ddbdb3395cc37900d46037fb965043a51c5c789ffeab4fc535d18b5 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: "npm:^1.0.0" + es-define-property: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.2" + checksum: 10/659b03c79bbfccf0cde3a79e7d52570724d7290209823e1ca5088f94b52192dc1836b82a324d0144612f816abb2f1734447438e38d9dafe0b3f82c2a1b9e3bce + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" dependencies: - function-bind: "npm:^1.1.1" - get-intrinsic: "npm:^1.0.2" - checksum: 10/ca787179c1cbe09e1697b56ad499fd05dc0ae6febe5081d728176ade699ea6b1589240cb1ff1fe11fcf9f61538c1af60ad37e8eb2ceb4ef21cd6085dfd3ccedd + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: 10/ef2b96e126ec0e58a7ff694db43f4d0d44f80e641370c21549ed911fecbdbc2df3ebc9bddad918d6bbdefeafb60bb3337902006d5176d72bcd2da74820991af7 languageName: node linkType: hard @@ -2848,10 +2943,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001587": - version: 1.0.30001599 - resolution: "caniuse-lite@npm:1.0.30001599" - checksum: 10/c9a5ad806fc0d446e4f995d551b840d8fdcbe97958b7f83ff7a255a8ef5e40ca12ca1a508c66b3ab147e19eef932d28772d205c046500dd0740ea9dfb602e2e1 +"caniuse-lite@npm:^1.0.30001716": + version: 1.0.30001718 + resolution: "caniuse-lite@npm:1.0.30001718" + checksum: 10/e172a4c156f743cc947e659f353ad9edb045725cc109a02cc792dcbf98569356ebfa4bb4356e3febf87427aab0951c34c1ee5630629334f25ae6f76de7d86fd0 languageName: node linkType: hard @@ -2878,7 +2973,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.0.1, chalk@npm:^2.4.1, chalk@npm:^2.4.2": +"chalk@npm:^2.0.1, chalk@npm:^2.4.1": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -2889,17 +2984,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0": - version: 4.1.0 - resolution: "chalk@npm:4.1.0" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10/e8d2b9b9abe5aee78caae44e2fd86ade56e440df5822006d702ce18771c00418b6f2c0eb294093d5486b852c83f021e409205d0ee07095fb14f5c8f9db9e7f80 - languageName: node - linkType: hard - -"chalk@npm:^4.1.2": +"chalk@npm:^4.0.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -2910,9 +2995,9 @@ __metadata: linkType: hard "chalk@npm:^5.0.1": - version: 5.3.0 - resolution: "chalk@npm:5.3.0" - checksum: 10/6373caaab21bd64c405bfc4bd9672b145647fc9482657b5ea1d549b3b2765054e9d3d928870cdf764fb4aad67555f5061538ff247b8310f110c5c888d92397ea + version: 5.4.1 + resolution: "chalk@npm:5.4.1" + checksum: 10/29df3ffcdf25656fed6e95962e2ef86d14dfe03cd50e7074b06bad9ffbbf6089adbb40f75c00744d843685c8d008adaf3aed31476780312553caf07fa86e5bc7 languageName: node linkType: hard @@ -2939,10 +3024,10 @@ __metadata: languageName: node linkType: hard -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: 10/c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10/b63cb1f73d171d140a2ed8154ee6566c8ab775d3196b0e03a2a94b5f6a0ce7777ee5685ca56849403c8d17bd457a6540672f9a60696a6137c7a409097495b82c languageName: node linkType: hard @@ -2965,13 +3050,6 @@ __metadata: languageName: node linkType: hard -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 10/2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - "cli-boxes@npm:^1.0.0": version: 1.0.0 resolution: "cli-boxes@npm:1.0.0" @@ -3039,19 +3117,10 @@ __metadata: languageName: node linkType: hard -"color-support@npm:^1.1.3": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 10/4bcfe30eea1498fe1cabc852bbda6c9770f230ea0e4faf4611c5858b1b9e4dde3730ac485e65f54ca182f4c50b626c1bea7c8441ceda47367a54a818c248aa7a - languageName: node - linkType: hard - "component-emitter@npm:^1.2.1": - version: 1.3.0 - resolution: "component-emitter@npm:1.3.0" - checksum: 10/dfc1ec2e7aa2486346c068f8d764e3eefe2e1ca0b24f57506cd93b2ae3d67829a7ebd7cc16e2bf51368fac2f45f78fcff231718e40b1975647e4a86be65e1d05 + version: 1.3.1 + resolution: "component-emitter@npm:1.3.1" + checksum: 10/94550aa462c7bd5a61c1bc480e28554aa306066930152d1b1844a0dd3845d4e5db7e261ddec62ae184913b3e59b55a2ad84093b9d3596a8f17c341514d6c483d languageName: node linkType: hard @@ -3100,13 +3169,6 @@ __metadata: languageName: node linkType: hard -"console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 10/27b5fa302bc8e9ae9e98c03c66d76ca289ad0c61ce2fe20ab288d288bee875d217512d2edb2363fc83165e88f1c405180cf3f5413a46e51b4fe1a004840c6cdb - languageName: node - linkType: hard - "content-disposition@npm:0.5.2": version: 0.5.2 resolution: "content-disposition@npm:0.5.2" @@ -3123,7 +3185,7 @@ __metadata: languageName: node linkType: hard -"content-type@npm:~1.0.4": +"content-type@npm:~1.0.4, content-type@npm:~1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: 10/585847d98dc7fb8035c02ae2cb76c7a9bd7b25f84c447e5ed55c45c2175e83617c8813871b4ee22f368126af6b2b167df655829007b21aa10302873ea9c62662 @@ -3144,10 +3206,10 @@ __metadata: languageName: node linkType: hard -"cookie@npm:0.5.0": - version: 0.5.0 - resolution: "cookie@npm:0.5.0" - checksum: 10/aae7911ddc5f444a9025fbd979ad1b5d60191011339bce48e555cb83343d0f98b865ff5c4d71fecdfb8555a5cafdc65632f6fce172f32aaf6936830a883a0380 +"cookie@npm:0.7.1": + version: 0.7.1 + resolution: "cookie@npm:0.7.1" + checksum: 10/aec6a6aa0781761bf55d60447d6be08861d381136a0fe94aa084fddd4f0300faa2b064df490c6798adfa1ebaef9e0af9b08a189c823e0811b8b313b3d9a03380 languageName: node linkType: hard @@ -3196,26 +3258,26 @@ __metadata: linkType: hard "cross-spawn@npm:^6.0.5": - version: 6.0.5 - resolution: "cross-spawn@npm:6.0.5" + version: 6.0.6 + resolution: "cross-spawn@npm:6.0.6" dependencies: nice-try: "npm:^1.0.4" path-key: "npm:^2.0.1" semver: "npm:^5.5.0" shebang-command: "npm:^1.2.0" which: "npm:^1.2.9" - checksum: 10/f07e643b4875f26adffcd7f13bc68d9dff20cf395f8ed6f43a23f3ee24fc3a80a870a32b246fd074e514c8fd7da5f978ac6a7668346eec57aa87bac89c1ed3a1 + checksum: 10/7abf6137b23293103a22bfeaf320f2d63faae70d97ddb4b58597237501d2efdd84cdc69a30246977e0c5f68216593894d41a7f122915dd4edf448db14c74171b languageName: node linkType: hard -"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" +"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" dependencies: path-key: "npm:^3.1.0" shebang-command: "npm:^2.0.0" which: "npm:^2.0.1" - checksum: 10/e1a13869d2f57d974de0d9ef7acbf69dc6937db20b918525a01dacb5032129bd552d290d886d981e99f1b624cb03657084cc87bd40f115c07ecf376821c729ce + checksum: 10/0d52657d7ae36eb130999dffff1168ec348687b48dd38e2ff59992ed916c88d328cf1d07ff4a4a10bc78de5e1c23f04b306d569e42f7a2293915c081e4dfee86 languageName: node linkType: hard @@ -3233,6 +3295,39 @@ __metadata: languageName: node linkType: hard +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10/c10b155a4e93999d3a215d08c23eea95f865e1f510b2e7748fcae1882b776df1afe8c99f483ace7fc0e5a3193ab08da138abebc9829d12003746c5a338c4d644 + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10/2a47055fcf1ab3ec41b00b6f738c6461a841391a643c9ed9befec1117c1765b4d492661d97fb7cc899200c328949dca6ff189d2c6537d96d60e8a02dfe3c95f7 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10/fa3bdfa0968bea6711ee50375094b39f561bce3f15f9e558df59de9c25f0bdd4cddc002d9c1d70ac7772ebd36854a7e22d1761e7302a934e6f1c2263bcf44aa2 + languageName: node + linkType: hard + "debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.3.3": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -3242,15 +3337,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": + version: 4.4.1 + resolution: "debug@npm:4.4.1" dependencies: - ms: "npm:2.1.2" + ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10/0073c3bcbd9cb7d71dd5f6b55be8701af42df3e56e911186dfa46fac3a5b9eb7ce7f377dd1d3be6db8977221f8eb333d945216f645cf56f6b688cd484837d255 + checksum: 10/8e2709b2144f03c7950f8804d01ccb3786373df01e406a0f66928e47001cf2d336cbed9ee137261d4f90d68d8679468c755e3548ed83ddacdc82b194d2468afe languageName: node linkType: hard @@ -3263,18 +3358,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.1.1": - version: 4.2.0 - resolution: "debug@npm:4.2.0" - dependencies: - ms: "npm:2.1.2" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10/4877714f15003830eed9f4a71c2ee3eb6032807b5f31638ec5069280f8d6f5719b75f95308bb51361b32799f14d95494940f7ba21c81a731e4394af700012a1a - languageName: node - linkType: hard - "decode-uri-component@npm:^0.2.0": version: 0.2.2 resolution: "decode-uri-component@npm:0.2.2" @@ -3290,18 +3373,31 @@ __metadata: linkType: hard "deep-is@npm:^0.1.3": - version: 0.1.3 - resolution: "deep-is@npm:0.1.3" - checksum: 10/dee1094e987a784a9a9c8549fc65eeca3422aef3bf2f9579f76c126085f280311d09273826c2f430d84fd09d64f6a578e5e7a4ac6ba1d50ea6cff0ddf605c025 + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10/ec12d074aef5ae5e81fa470b9317c313142c9e8e2afe3f8efa124db309720db96d1d222b82b84c834e5f87e7a614b44a4684b6683583118b87c833b3be40d4d8 languageName: node linkType: hard -"define-properties@npm:^1.1.2, define-properties@npm:^1.1.3": - version: 1.1.3 - resolution: "define-properties@npm:1.1.3" +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10/abdcb2505d80a53524ba871273e5da75e77e52af9e15b3aa65d8aad82b8a3a424dad7aee2cc0b71470ac7acf501e08defac362e8b6a73cdb4309f028061df4ae + languageName: node + linkType: hard + +"define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" dependencies: - object-keys: "npm:^1.0.12" - checksum: 10/33125cafaf4de2c9934cfba20e0a45bccc53fa6d85370a48c0b5a9a0c76c7d0497a5fdf01bc5c1186cb61f2747f19f43520ca6fdd37b4d0290f552c6747e0a17 + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10/b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 languageName: node linkType: hard @@ -3333,14 +3429,7 @@ __metadata: languageName: node linkType: hard -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: 10/a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd - languageName: node - linkType: hard - -"depd@npm:2.0.0, depd@npm:^2.0.0": +"depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: 10/c0c8ff36079ce5ada64f46cc9d6fd47ebcf38241105b6e0c98f412e8ad91f084bcf906ff644cc3a4bd876ca27a62accb8b0fff72ea6ed1a414b89d8506f4a5ca @@ -3382,9 +3471,20 @@ __metadata: linkType: hard "dotenv@npm:^16.1.4": - version: 16.1.4 - resolution: "dotenv@npm:16.1.4" - checksum: 10/b0caa00283490d1cdb6ad892fcdbc86a6f5e3e0fb5e8da32e599fb3f9fa778095812ae1b936761090416b355fe8724cb47624333a7bd770bb9c667f7d186d8a0 + version: 16.5.0 + resolution: "dotenv@npm:16.5.0" + checksum: 10/e68a16834f1a41cc2dfb01563bc150668ad675e6cd09191211467b5c0806b6ecd6ec438e021aa8e01cd0e72d2b70ef4302bec7cc0fe15b6955f85230b62dc8a9 + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10/5add88a3d68d42d6e6130a0cac450b7c2edbe73364bbd2fc334564418569bea97c6943a8fcd70e27130bf32afc236f30982fc4905039b703f23e9e0433c29934 languageName: node linkType: hard @@ -3409,10 +3509,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.668": - version: 1.4.711 - resolution: "electron-to-chromium@npm:1.4.711" - checksum: 10/48ae0e074d4c2fe4594aded24547c31ee010732a40a970751b4205dc2397f2ceeaafcded9fa03079d0453cc514a0d72ff38992235328d056bd266722452a4e13 +"electron-to-chromium@npm:^1.5.149": + version: 1.5.157 + resolution: "electron-to-chromium@npm:1.5.157" + checksum: 10/806cbb515f17d6599369d184032f21b5cc2bf4194267c08a5b134eb9a6c2fc291c87acda5c0baccd6f3833fb543b74b7edc5767d5594dec92c626a153797e7cf languageName: node linkType: hard @@ -3437,6 +3537,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10/abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe + languageName: node + linkType: hard + "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -3469,63 +3576,138 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.0-next.1, es-abstract@npm:^1.17.5": - version: 1.17.6 - resolution: "es-abstract@npm:1.17.6" - dependencies: - es-to-primitive: "npm:^1.2.1" - function-bind: "npm:^1.1.1" - has: "npm:^1.0.3" - has-symbols: "npm:^1.0.1" - is-callable: "npm:^1.2.0" - is-regex: "npm:^1.1.0" - object-inspect: "npm:^1.7.0" +"es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.9": + version: 1.23.10 + resolution: "es-abstract@npm:1.23.10" + dependencies: + array-buffer-byte-length: "npm:^1.0.2" + arraybuffer.prototype.slice: "npm:^1.0.4" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + data-view-buffer: "npm:^1.0.2" + data-view-byte-length: "npm:^1.0.2" + data-view-byte-offset: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + es-set-tostringtag: "npm:^2.1.0" + es-to-primitive: "npm:^1.3.0" + function.prototype.name: "npm:^1.1.8" + get-intrinsic: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + get-symbol-description: "npm:^1.1.0" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.1.0" + is-array-buffer: "npm:^3.0.5" + is-callable: "npm:^1.2.7" + is-data-view: "npm:^1.0.2" + is-regex: "npm:^1.2.1" + is-shared-array-buffer: "npm:^1.0.4" + is-string: "npm:^1.1.1" + is-typed-array: "npm:^1.1.15" + is-weakref: "npm:^1.1.1" + math-intrinsics: "npm:^1.1.0" + object-inspect: "npm:^1.13.4" object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.0" - string.prototype.trimend: "npm:^1.0.1" - string.prototype.trimstart: "npm:^1.0.1" - checksum: 10/70c5b7feed56e9ffc0d9ce3b37c89bfd29d523227aa75b421bba392b3c34190337df779770f3ede6ac7a8c779d01a5bbdbda4979cc1347bd56e100ae03bdf248 + object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.1" + regexp.prototype.flags: "npm:^1.5.4" + safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" + safe-regex-test: "npm:^1.1.0" + set-proto: "npm:^1.0.0" + string.prototype.trim: "npm:^1.2.10" + string.prototype.trimend: "npm:^1.0.9" + string.prototype.trimstart: "npm:^1.0.8" + typed-array-buffer: "npm:^1.0.3" + typed-array-byte-length: "npm:^1.0.3" + typed-array-byte-offset: "npm:^1.0.4" + typed-array-length: "npm:^1.0.7" + unbox-primitive: "npm:^1.1.0" + which-typed-array: "npm:^1.1.19" + checksum: 10/d3b6d560fa5eb6f3b4da4d4031d0a9455a7ec18f64ae0698831c0ce13d241f074a40e9711be3eb5f50c5844dde6070439ccfd6ce789a12bc9676e76379616d0c + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10/f8dc9e660d90919f11084db0a893128f3592b781ce967e4fccfb8f3106cb83e400a4032c559184ec52ee1dbd4b01e7776c7cd0b3327b1961b1a4a7008920fe78 languageName: node linkType: hard -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" - dependencies: - is-callable: "npm:^1.1.4" - is-date-object: "npm:^1.0.1" - is-symbol: "npm:^1.0.2" - checksum: 10/74aeeefe2714cf99bb40cab7ce3012d74e1e2c1bd60d0a913b467b269edde6e176ca644b5ba03a5b865fb044a29bca05671cd445c85ca2cdc2de155d7fc8fe9b - languageName: node - linkType: hard - -"esbuild@npm:^0.19.3": - version: 0.19.12 - resolution: "esbuild@npm:0.19.12" - dependencies: - "@esbuild/aix-ppc64": "npm:0.19.12" - "@esbuild/android-arm": "npm:0.19.12" - "@esbuild/android-arm64": "npm:0.19.12" - "@esbuild/android-x64": "npm:0.19.12" - "@esbuild/darwin-arm64": "npm:0.19.12" - "@esbuild/darwin-x64": "npm:0.19.12" - "@esbuild/freebsd-arm64": "npm:0.19.12" - "@esbuild/freebsd-x64": "npm:0.19.12" - "@esbuild/linux-arm": "npm:0.19.12" - "@esbuild/linux-arm64": "npm:0.19.12" - "@esbuild/linux-ia32": "npm:0.19.12" - "@esbuild/linux-loong64": "npm:0.19.12" - "@esbuild/linux-mips64el": "npm:0.19.12" - "@esbuild/linux-ppc64": "npm:0.19.12" - "@esbuild/linux-riscv64": "npm:0.19.12" - "@esbuild/linux-s390x": "npm:0.19.12" - "@esbuild/linux-x64": "npm:0.19.12" - "@esbuild/netbsd-x64": "npm:0.19.12" - "@esbuild/openbsd-x64": "npm:0.19.12" - "@esbuild/sunos-x64": "npm:0.19.12" - "@esbuild/win32-arm64": "npm:0.19.12" - "@esbuild/win32-ia32": "npm:0.19.12" - "@esbuild/win32-x64": "npm:0.19.12" +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10/96e65d640156f91b707517e8cdc454dd7d47c32833aa3e85d79f24f9eb7ea85f39b63e36216ef0114996581969b59fe609a94e30316b08f5f4df1d44134cf8d5 + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10/54fe77de288451dae51c37bfbfe3ec86732dc3778f98f3eb3bdb4bf48063b2c0b8f9c93542656986149d08aa5be3204286e2276053d19582b76753f1a2728867 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10/86814bf8afbcd8966653f731415888019d4bc4aca6b6c354132a7a75bb87566751e320369654a101d23a91c87a85c79b178bcf40332839bd347aff437c4fb65f + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" + dependencies: + is-callable: "npm:^1.2.7" + is-date-object: "npm:^1.0.5" + is-symbol: "npm:^1.0.4" + checksum: 10/17faf35c221aad59a16286cbf58ef6f080bf3c485dff202c490d074d8e74da07884e29b852c245d894eac84f73c58330ec956dfd6d02c0b449d75eb1012a3f9b + languageName: node + linkType: hard + +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -3575,14 +3757,14 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10/861fa8eb2428e8d6521a4b7c7930139e3f45e8d51a86985cc29408172a41f6b18df7b3401e7e5e2d528cdf83742da601ddfdc77043ddc4f1c715a8ddb2d8a255 + checksum: 10/d2ff2ca84d30cce8e871517374d6c2290835380dc7cd413b2d49189ed170d45e407be14de2cb4794cf76f75cf89955c4714726ebd3de7444b3046f5cab23ab6b languageName: node linkType: hard -"escalade@npm:^3.1.1": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 10/a1e07fea2f15663c30e40b9193d658397846ffe28ce0a3e4da0d8e485fedfeca228ab846aee101a05015829adf39f9934ff45b2a3fca47bed37a29646bd05cd3 +"escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10/9d7169e3965b2f9ae46971afa392f6e5a25545ea30f2e2dd99c9b0a95a3f52b5653681a84f5b2911a413ddad2d7a93d3514165072f349b5ffc59c75a899970d6 languageName: node linkType: hard @@ -3608,13 +3790,13 @@ __metadata: linkType: hard "eslint-config-prettier@npm:^8.6.0": - version: 8.8.0 - resolution: "eslint-config-prettier@npm:8.8.0" + version: 8.10.0 + resolution: "eslint-config-prettier@npm:8.10.0" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 10/3638144cecada897105ff9442bc85aba71c4f44d7d25b576cb34d50a207f6655f7cc55e729aad1a934a9f15e55c88e7adcbd1067d6582325fc89864c879b52f1 + checksum: 10/0a51ab1417cbf80fabcf7a406960a142663539c8140fdb0a187b78f3d708b9d137a62a4bc4e689150e290b667750ddabd1740a516623b0cb4adb6cc1962cfe2c languageName: node linkType: hard @@ -3643,43 +3825,44 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.2.0": - version: 7.2.0 - resolution: "eslint-scope@npm:7.2.0" +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10/94d8942840b35bf5e6559bd0f0a8b10610d65b1e44e41295e66ed1fe82f83bc51756e7af607d611b75f435adf821122bd901aa565701596ca1a628db41c0cd87 + checksum: 10/5c660fb905d5883ad018a6fea2b49f3cb5b1cbf2cd4bd08e98646e9864f9bc2c74c0839bed2d292e90a4a328833accc197c8f0baed89cbe8d605d6f918465491 languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1": - version: 3.4.1 - resolution: "eslint-visitor-keys@npm:3.4.1" - checksum: 10/92641e7ccde470065aa2931161a6a053690a54aae35ae08f38e376ecfd7c012573c542b37a3baecf921eb951fd57943411392f464c2b8f3399adee4723a1369f +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 10/3f357c554a9ea794b094a09bd4187e5eacd1bc0d0653c3adeb87962c548e6a1ab8f982b86963ae1337f5d976004146536dcee5d0e2806665b193fbfbf1a9231b languageName: node linkType: hard "eslint@npm:^8.42.0": - version: 8.42.0 - resolution: "eslint@npm:8.42.0" + version: 8.57.1 + resolution: "eslint@npm:8.57.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.4.0" - "@eslint/eslintrc": "npm:^2.0.3" - "@eslint/js": "npm:8.42.0" - "@humanwhocodes/config-array": "npm:^0.11.10" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" "@humanwhocodes/module-importer": "npm:^1.0.1" "@nodelib/fs.walk": "npm:^1.2.8" - ajv: "npm:^6.10.0" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" cross-spawn: "npm:^7.0.2" debug: "npm:^4.3.2" doctrine: "npm:^3.0.0" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.0" - eslint-visitor-keys: "npm:^3.4.1" - espree: "npm:^9.5.2" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" esquery: "npm:^1.4.2" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" @@ -3689,7 +3872,6 @@ __metadata: globals: "npm:^13.19.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.2.0" - import-fresh: "npm:^3.0.0" imurmurhash: "npm:^0.1.4" is-glob: "npm:^4.0.0" is-path-inside: "npm:^3.0.3" @@ -3699,33 +3881,32 @@ __metadata: lodash.merge: "npm:^4.6.2" minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" - optionator: "npm:^0.9.1" + optionator: "npm:^0.9.3" strip-ansi: "npm:^6.0.1" - strip-json-comments: "npm:^3.1.0" text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: 10/189ba2ae856703c187deef590fa2cee70f294a381837e6acf0fdd9a715235bc91381c62d8ccc891de09155e950d1bd9495c9b18019053fdde7db0a39938b2934 + checksum: 10/5504fa24879afdd9f9929b2fbfc2ee9b9441a3d464efd9790fbda5f05738858530182029f13323add68d19fec749d3ab4a70320ded091ca4432b1e9cc4ed104c languageName: node linkType: hard -"espree@npm:^9.5.2": - version: 9.5.2 - resolution: "espree@npm:9.5.2" +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" dependencies: - acorn: "npm:^8.8.0" + acorn: "npm:^8.9.0" acorn-jsx: "npm:^5.3.2" eslint-visitor-keys: "npm:^3.4.1" - checksum: 10/2c9d0fec9ac1230856baec338bd238ca9a69b451ee451f0da25e07d356e1bdef45a2ae5f8c374f492f4bb568d17fc7c998ef44f04a2e9b6a11fc8c194c677ba4 + checksum: 10/255ab260f0d711a54096bdeda93adff0eadf02a6f9b92f02b323e83a2b7fc258797919437ad331efec3930475feb0142c5ecaaf3cdab4befebd336d47d3f3134 languageName: node linkType: hard "esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: estraverse: "npm:^5.1.0" - checksum: 10/e65fcdfc1e0ff5effbf50fb4f31ea20143ae5df92bb2e4953653d8d40aa4bc148e0d06117a592ce4ea53eeab1dafdfded7ea7e22a5be87e82d73757329a1b01d + checksum: 10/c587fb8ec9ed83f2b1bc97cf2f6854cc30bf784a79d62ba08c6e358bf22280d69aee12827521cf38e69ae9761d23fb7fde593ce315610f85655c139d99b05e5a languageName: node linkType: hard @@ -3746,9 +3927,9 @@ __metadata: linkType: hard "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.2.0 - resolution: "estraverse@npm:5.2.0" - checksum: 10/9740a8fa4257682c1d6c14a0befc884af31e76013a97c647aed21aeb1766270e153e34cc06ab8d354a377bb6ed6b785b1f5deb1228ceb7e3792bf88fb79b2ce8 + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10/37cbe6e9a68014d34dbdc039f90d0baf72436809d02edffcc06ba3c2a12eb298048f877511353b130153e532aac8d68ba78430c0dd2f44806ebc7c014b01585e languageName: node linkType: hard @@ -3813,42 +3994,49 @@ __metadata: languageName: node linkType: hard +"exponential-backoff@npm:^3.1.1": + version: 3.1.2 + resolution: "exponential-backoff@npm:3.1.2" + checksum: 10/ca2f01f1aa4dafd3f3917bd531ab5be08c6f5f4b2389d2e974f903de3cbeb50b9633374353516b6afd70905775e33aba11afab1232d3acf0aa2963b98a611c51 + languageName: node + linkType: hard + "express@npm:^4.18.1": - version: 4.18.2 - resolution: "express@npm:4.18.2" + version: 4.21.2 + resolution: "express@npm:4.21.2" dependencies: accepts: "npm:~1.3.8" array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.1" + body-parser: "npm:1.20.3" content-disposition: "npm:0.5.4" content-type: "npm:~1.0.4" - cookie: "npm:0.5.0" + cookie: "npm:0.7.1" cookie-signature: "npm:1.0.6" debug: "npm:2.6.9" depd: "npm:2.0.0" - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" etag: "npm:~1.8.1" - finalhandler: "npm:1.2.0" + finalhandler: "npm:1.3.1" fresh: "npm:0.5.2" http-errors: "npm:2.0.0" - merge-descriptors: "npm:1.0.1" + merge-descriptors: "npm:1.0.3" methods: "npm:~1.1.2" on-finished: "npm:2.4.1" parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.7" + path-to-regexp: "npm:0.1.12" proxy-addr: "npm:~2.0.7" - qs: "npm:6.11.0" + qs: "npm:6.13.0" range-parser: "npm:~1.2.1" safe-buffer: "npm:5.2.1" - send: "npm:0.18.0" - serve-static: "npm:1.15.0" + send: "npm:0.19.0" + serve-static: "npm:1.16.2" setprototypeof: "npm:1.2.0" statuses: "npm:2.0.1" type-is: "npm:~1.6.18" utils-merge: "npm:1.0.1" vary: "npm:~1.1.2" - checksum: 10/869ae89ed6ff4bed7b373079dc58e5dddcf2915a2669b36037ff78c99d675ae930e5fe052b35c24f56557d28a023bb1cbe3e2f2fb87eaab96a1cedd7e597809d + checksum: 10/34571c442fc8c9f2c4b442d2faa10ea1175cf8559237fc6a278f5ce6254a8ffdbeb9a15d99f77c1a9f2926ab183e3b7ba560e3261f1ad4149799e3412ab66bd1 languageName: node linkType: hard @@ -3902,15 +4090,15 @@ __metadata: linkType: hard "fast-glob@npm:^3.2.9": - version: 3.2.12 - resolution: "fast-glob@npm:3.2.12" + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" dependencies: "@nodelib/fs.stat": "npm:^2.0.2" "@nodelib/fs.walk": "npm:^1.2.3" glob-parent: "npm:^5.1.2" merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 10/641e748664ae0fdc4dadd23c812fd7d6c80cd92d451571cb1f81fa87edb750e917f25abf74fc9503c97438b0b67ecf75b738bb8e50a83b16bd2a88b4d64e81fa + micromatch: "npm:^4.0.8" + checksum: 10/dcc6432b269762dd47381d8b8358bf964d8f4f60286ac6aa41c01ade70bda459ff2001b516690b96d5365f68a49242966112b5d5cc9cd82395fa8f9d017c90ad languageName: node linkType: hard @@ -3928,32 +4116,35 @@ __metadata: languageName: node linkType: hard -"fast-url-parser@npm:1.1.3": - version: 1.1.3 - resolution: "fast-url-parser@npm:1.1.3" - dependencies: - punycode: "npm:^1.3.2" - checksum: 10/6d33f46ce9776f7f3017576926207a950ca39bc5eb78fc794404f2288fe494720f9a119084b75569bd9eb09d2b46678bfaf39c191fb2c808ef3c833dc8982752 - languageName: node - linkType: hard - -"fast-xml-parser@npm:4.2.4": - version: 4.2.4 - resolution: "fast-xml-parser@npm:4.2.4" +"fast-xml-parser@npm:4.4.1": + version: 4.4.1 + resolution: "fast-xml-parser@npm:4.4.1" dependencies: strnum: "npm:^1.0.5" bin: fxparser: src/cli/cli.js - checksum: 10/157f64a142d37f2c937d5308d62668119e40218dab41a07d1a9563c3f92663c81fd08db0efc9fe484e0bc4dfea59827f319adc510426ff9b97c83a779d511b6f + checksum: 10/0c05ab8703630d8c857fafadbd78d0020d3a8e54310c3842179cd4a0d9d97e96d209ce885e91241f4aa9dd8dfc2fd924a682741a423d65153cad34da2032ec44 languageName: node linkType: hard "fastq@npm:^1.6.0": - version: 1.8.0 - resolution: "fastq@npm:1.8.0" + version: 1.19.1 + resolution: "fastq@npm:1.19.1" dependencies: reusify: "npm:^1.0.4" - checksum: 10/7b7908a90e908c7c19ea5237a4cf1380665df718f5b8f643ead5245b27be105e76c04405bef28c439018976eef1e8741fde3db382d6b06435c9990fe3ce3533e + checksum: 10/75679dc226316341c4f2a6b618571f51eac96779906faecd8921b984e844d6ae42fabb2df69b1071327d398d5716693ea9c9c8941f64ac9e89ec2032ce59d730 + languageName: node + linkType: hard + +"fdir@npm:^6.4.4": + version: 6.4.4 + resolution: "fdir@npm:6.4.4" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10/d0000d6b790059b35f4ed19acc8847a66452e0bc68b28766c929ffd523e5ec2083811fc8a545e4a1d4945ce70e887b3a610c145c681073b506143ae3076342ed languageName: node linkType: hard @@ -3985,27 +4176,27 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" dependencies: to-regex-range: "npm:^5.0.1" - checksum: 10/e260f7592fd196b4421504d3597cc76f4a1ca7a9488260d533b611fc3cefd61e9a9be1417cb82d3b01ad9f9c0ff2dbf258e1026d2445e26b0cf5148ff4250429 + checksum: 10/a7095cb39e5bc32fada2aa7c7249d3f6b01bd1ce461a61b0adabacccabd9198500c6fb1f68a7c851a657e273fce2233ba869638897f3d7ed2e87a2d89b4436ea languageName: node linkType: hard -"finalhandler@npm:1.2.0": - version: 1.2.0 - resolution: "finalhandler@npm:1.2.0" +"finalhandler@npm:1.3.1": + version: 1.3.1 + resolution: "finalhandler@npm:1.3.1" dependencies: debug: "npm:2.6.9" - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" on-finished: "npm:2.4.1" parseurl: "npm:~1.3.3" statuses: "npm:2.0.1" unpipe: "npm:~1.0.0" - checksum: 10/635718cb203c6d18e6b48dfbb6c54ccb08ea470e4f474ddcef38c47edcf3227feec316f886dd701235997d8af35240cae49856721ce18f539ad038665ebbf163 + checksum: 10/4babe72969b7373b5842bc9f75c3a641a4d0f8eb53af6b89fa714d4460ce03fb92b28de751d12ba415e96e7e02870c436d67412120555e2b382640535697305b languageName: node linkType: hard @@ -4020,19 +4211,29 @@ __metadata: linkType: hard "flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" dependencies: - flatted: "npm:^3.1.0" + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" rimraf: "npm:^3.0.2" - checksum: 10/9fe5d0cb97c988e3b25242e71346965fae22757674db3fca14206850af2efa3ca3b04a3ba0eba8d5e20fd8a3be80a2e14b1c2917e70ffe1acb98a8c3327e4c9f + checksum: 10/02381c6ece5e9fa5b826c9bbea481d7fd77645d96e4b0b1395238124d581d10e56f17f723d897b6d133970f7a57f0fab9148cbbb67237a0a0ffe794ba60c0c70 languageName: node linkType: hard -"flatted@npm:^3.1.0": - version: 3.2.7 - resolution: "flatted@npm:3.2.7" - checksum: 10/427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 +"flatted@npm:^3.2.9": + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 10/8c96c02fbeadcf4e8ffd0fa24983241e27698b0781295622591fc13585e2f226609d95e422bcf2ef044146ffacb6b68b1f20871454eddf75ab3caa6ee5f4a1fe + languageName: node + linkType: hard + +"for-each@npm:^0.3.3, for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" + dependencies: + is-callable: "npm:^1.2.7" + checksum: 10/330cc2439f85c94f4609de3ee1d32c5693ae15cdd7fe3d112c4fd9efd4ce7143f2c64ef6c2c9e0cfdb0058437f33ef05b5bdae5b98fcc903fb2143fbaf0fea0f languageName: node linkType: hard @@ -4043,6 +4244,16 @@ __metadata: languageName: node linkType: hard +"foreground-child@npm:^3.1.0": + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" + dependencies: + cross-spawn: "npm:^7.0.6" + signal-exit: "npm:^4.0.1" + checksum: 10/427b33f997a98073c0424e5c07169264a62cda806d8d2ded159b5b903fdfc8f0a1457e06b5fc35506497acb3f1e353f025edee796300209ac6231e80edece835 + languageName: node + linkType: hard + "forwarded@npm:0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" @@ -4066,12 +4277,12 @@ __metadata: languageName: node linkType: hard -"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" dependencies: - minipass: "npm:^3.0.0" - checksum: 10/03191781e94bc9a54bd376d3146f90fe8e082627c502185dbf7b9b3032f66b0b142c1115f3b2cc5936575fc1b44845ce903dd4c21bec2a8d69f3bd56f9cee9ec + minipass: "npm:^7.0.3" + checksum: 10/af143246cf6884fe26fa281621d45cfe111d34b30535a475bfa38dafe343dadb466c047a924ffc7d6b7b18265df4110224ce3803806dbb07173bf2087b648d7f languageName: node linkType: hard @@ -4093,17 +4304,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.2": - version: 2.3.2 - resolution: "fsevents@npm:2.3.2" - dependencies: - node-gyp: "npm:latest" - checksum: 10/6b5b6f5692372446ff81cf9501c76e3e0459a4852b3b5f1fc72c103198c125a6b8c72f5f166bdd76ffb2fca261e7f6ee5565daf80dca6e571e55bcc589cc1256 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@npm:~2.3.3": +"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -4123,44 +4324,40 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": - version: 2.3.2 - resolution: "fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1" +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: node-gyp: "npm:latest" conditions: os=darwin languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" - dependencies: - node-gyp: "npm:latest" - conditions: os=darwin +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10/185e20d20f10c8d661d59aac0f3b63b31132d492e1b11fcc2a93cb2c47257ebaee7407c38513efd2b35cafdf972d9beb2ea4593c1e0f3bf8f2744836928d7454 languageName: node linkType: hard -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: 10/d83f2968030678f0b8c3f2183d63dcd969344eb8b55b4eb826a94ccac6de8b87c95bebffda37a6386c74f152284eb02956ff2c496897f35d32bdc2628ac68ac5 +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + functions-have-names: "npm:^1.2.3" + hasown: "npm:^2.0.2" + is-callable: "npm:^1.2.7" + checksum: 10/25b9e5bea936732a6f0c0c08db58cc0d609ac1ed458c6a07ead46b32e7b9bf3fe5887796c3f83d35994efbc4fdde81c08ac64135b2c399b8f2113968d44082bc languageName: node linkType: hard -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" - dependencies: - aproba: "npm:^1.0.3 || ^2.0.0" - color-support: "npm:^1.1.3" - console-control-strings: "npm:^1.1.0" - has-unicode: "npm:^2.0.1" - signal-exit: "npm:^3.0.7" - string-width: "npm:^4.2.3" - strip-ansi: "npm:^6.0.1" - wide-align: "npm:^1.1.5" - checksum: 10/09535dd53b5ced6a34482b1fa9f3929efdeac02f9858569cde73cef3ed95050e0f3d095706c1689614059898924b7a74aa14042f51381a1ccc4ee5c29d2389c4 +"functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: 10/0ddfd3ed1066a55984aaecebf5419fbd9344a5c38dd120ffb0739fac4496758dcf371297440528b115e4367fc46e3abc86a2cc0ff44612181b175ae967a11a05 languageName: node linkType: hard @@ -4171,15 +4368,31 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2": - version: 1.2.1 - resolution: "get-intrinsic@npm:1.2.1" +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": + version: 1.3.0 + resolution: "get-intrinsic@npm:1.3.0" dependencies: - function-bind: "npm:^1.1.1" - has: "npm:^1.0.3" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - checksum: 10/aee631852063f8ad0d4a374970694b5c17c2fb5c92bd1929476d7eb8798ce7aebafbf9a34022c05fd1adaa2ce846d5877a627ce1986f81fc65adf3b81824bd54 + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + function-bind: "npm:^1.1.2" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10/6e9dd920ff054147b6f44cb98104330e87caafae051b6d37b13384a45ba15e71af33c3baeac7cb630a0aaa23142718dcf25b45cfdd86c184c5dcb4e56d953a10 + languageName: node + linkType: hard + +"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b languageName: node linkType: hard @@ -4197,6 +4410,17 @@ __metadata: languageName: node linkType: hard +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + checksum: 10/a353e3a9595a74720b40fb5bae3ba4a4f826e186e83814d93375182384265676f59e49998b9cdfac4a2225ce95a3d32a68f502a2c5619303987f1c183ab80494 + languageName: node + linkType: hard + "get-value@npm:^2.0.3, get-value@npm:^2.0.6": version: 2.0.6 resolution: "get-value@npm:2.0.6" @@ -4239,21 +4463,23 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.3": - version: 7.1.6 - resolution: "glob@npm:7.1.6" +"glob@npm:^10.2.2": + version: 10.4.5 + resolution: "glob@npm:10.4.5" dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.0.4" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10/7d6ec98bc746980d5fe4d764b9c7ada727e3fbd2a7d85cd96dd95fb18638c9c54a70c692fd2ab5d68a186dc8cd9d6a4192d3df220beed891f687db179c430237 + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10/698dfe11828b7efd0514cd11e573eaed26b2dff611f0400907281ce3eab0c1e56143ef9b35adc7c77ecc71fba74717b510c7c223d34ca8a98ec81777b293d4ac languageName: node linkType: hard -"glob@npm:^7.1.4": +"glob@npm:^7.1.3": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -4267,19 +4493,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^8.0.1": - version: 8.1.0 - resolution: "glob@npm:8.1.0" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^5.0.1" - once: "npm:^1.3.0" - checksum: 10/9aab1c75eb087c35dbc41d1f742e51d0507aa2b14c910d96fb8287107a10a22f4bbdce26fc0a3da4c69a20f7b26d62f1640b346a4f6e6becfff47f335bb1dc5e - languageName: node - linkType: hard - "global-dirs@npm:^0.1.0": version: 0.1.1 resolution: "global-dirs@npm:0.1.1" @@ -4297,11 +4510,21 @@ __metadata: linkType: hard "globals@npm:^13.19.0": - version: 13.20.0 - resolution: "globals@npm:13.20.0" + version: 13.24.0 + resolution: "globals@npm:13.24.0" dependencies: type-fest: "npm:^0.20.2" - checksum: 10/9df85cde2f0dce6ac9b3a5e08bec109d2f3b38ddd055a83867e0672c55704866d53ce6a4265859fa630624baadd46f50ca38602a13607ad86be853a8c179d3e7 + checksum: 10/62c5b1997d06674fc7191d3e01e324d3eda4d65ac9cc4e78329fa3b5c4fd42a0e1c8722822497a6964eee075255ce21ccf1eec2d83f92ef3f06653af4d0ee28e + languageName: node + linkType: hard + +"globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10/1f1fd078fb2f7296306ef9dd51019491044ccf17a59ed49d375b576ca108ff37e47f3d29aead7add40763574a992f16a5367dd1e2173b8634ef18556ab719ac4 languageName: node linkType: hard @@ -4319,6 +4542,13 @@ __metadata: languageName: node linkType: hard +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10/94e296d69f92dc1c0768fcfeecfb3855582ab59a7c75e969d5f96ce50c3d201fd86d5a2857c22565764d5bb8a816c7b1e58f133ec318cd56274da36c5e3fb1a1 + languageName: node + linkType: hard + "got@npm:^6.7.1": version: 6.7.1 resolution: "got@npm:6.7.1" @@ -4338,27 +4568,13 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 languageName: node linkType: hard -"graceful-fs@npm:^4.1.2": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 10/0c83c52b62c68a944dcfb9d66b0f9f10f7d6e3d081e8067b9bfdc9e5f3a8896584d576036f82915773189eec1eba599397fc620e75c03c0610fb3d67c6713c1a - languageName: node - linkType: hard - -"grapheme-splitter@npm:^1.0.4": - version: 1.0.4 - resolution: "grapheme-splitter@npm:1.0.4" - checksum: 10/fdb2f51fd430ce881e18e44c4934ad30e59736e46213f7ad35ea5970a9ebdf7d0fe56150d15cc98230d55d2fd48c73dc6781494c38d8cf2405718366c36adb88 - languageName: node - linkType: hard - "graphemer@npm:^1.4.0": version: 1.4.0 resolution: "graphemer@npm:1.4.0" @@ -4366,6 +4582,13 @@ __metadata: languageName: node linkType: hard +"has-bigints@npm:^1.0.2": + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 10/90fb1b24d40d2472bcd1c8bd9dd479037ec240215869bdbff97b2be83acef57d28f7e96bdd003a21bed218d058b49097f4acc8821c05b1629cc5d48dd7bfcccd + languageName: node + linkType: hard + "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -4380,31 +4603,37 @@ __metadata: languageName: node linkType: hard -"has-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "has-proto@npm:1.0.1" - checksum: 10/eab2ab0ed1eae6d058b9bbc4c1d99d2751b29717be80d02fd03ead8b62675488de0c7359bc1fdd4b87ef6fd11e796a9631ad4d7452d9324fdada70158c2e5be7 +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10/2d8c9ab8cebb572e3362f7d06139a4592105983d4317e68f7adba320fe6ddfc8874581e0971e899e633fd5f72e262830edce36d5a0bc863dad17ad20572484b2 languageName: node linkType: hard -"has-symbols@npm:^1.0.0, has-symbols@npm:^1.0.1": - version: 1.0.1 - resolution: "has-symbols@npm:1.0.1" - checksum: 10/d7a6d0b8f2b4595d6d5aafd4e020f65785779a654b52b77457f69c33e2c36400780ece296b964ae885714e4c83b503b01e2024d682d95794628d9c5a83c113bf +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: "npm:^1.0.0" + checksum: 10/7eaed07728eaa28b77fadccabce53f30de467ff186a766872669a833ac2e87d8922b76a22cc58339d7e0277aefe98d6d00762113b27a97cdf65adcf958970935 languageName: node linkType: hard -"has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: 10/464f97a8202a7690dadd026e6d73b1ceeddd60fe6acfd06151106f050303eaa75855aaa94969df8015c11ff7c505f196114d22f7386b4a471038da5874cf5e9b +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10/959385c98696ebbca51e7534e0dc723ada325efa3475350951363cce216d27373e0259b63edb599f72eb94d6cde8577b4b2375f080b303947e560f85692834fa languageName: node linkType: hard -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 10/041b4293ad6bf391e21c5d85ed03f412506d6623786b801c4ab39e4e6ca54993f13201bceb544d92963f9e0024e6e7fbf0cb1d84c9d6b31cb9c79c8c990d13d8 +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10/c74c5f5ceee3c8a5b8bc37719840dc3749f5b0306d818974141dda2471a1a2ca6c8e46b9d6ac222c5345df7a901c9b6f350b1e6d62763fec877e26609a401bfe languageName: node linkType: hard @@ -4447,26 +4676,26 @@ __metadata: languageName: node linkType: hard -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" +"hasown@npm:^2.0.0, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" dependencies: - function-bind: "npm:^1.1.1" - checksum: 10/a449f3185b1d165026e8d25f6a8c3390bd25c201ff4b8c1aaf948fc6a5fcfd6507310b8c00c13a3325795ea9791fcc3d79d61eafa313b5750438fc19183df57b + function-bind: "npm:^1.1.2" + checksum: 10/7898a9c1788b2862cf0f9c345a6bec77ba4a0c0983c7f19d610c382343d4f98fa260686b225dfb1f88393a66679d2ec58ee310c1d6868c081eda7918f32cc70a languageName: node linkType: hard "hosted-git-info@npm:^2.1.4": - version: 2.8.8 - resolution: "hosted-git-info@npm:2.8.8" - checksum: 10/176b7c4770852a21c0b2492d2bd34b993f3a73d092ad2137999b17a0fc65645a5f72538c0198cbaa90171413cd9a10356d9f4ab3550b38a4bd7ed78a4f68e9c1 + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: 10/96da7d412303704af41c3819207a09ea2cab2de97951db4cf336bb8bce8d8e36b9a6821036ad2e55e67d3be0af8f967a7b57981203fbfb88bc05cd803407b8c3 languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.0": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10/362d5ed66b12ceb9c0a328fb31200b590ab1b02f4a254a697dc796850cc4385603e75f53ec59f768b2dad3bfa1464bd229f7de278d2899a0e3beffc634b6683f +"http-cache-semantics@npm:^4.1.1": + version: 4.2.0 + resolution: "http-cache-semantics@npm:4.2.0" + checksum: 10/4efd2dfcfeea9d5e88c84af450b9980be8a43c2c8179508b1c57c7b4421c855f3e8efe92fa53e0b3f4a43c85824ada930eabbc306d1b3beab750b6dcc5187693 languageName: node linkType: hard @@ -4483,24 +4712,23 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" dependencies: - "@tootallnate/once": "npm:2" - agent-base: "npm:6" - debug: "npm:4" - checksum: 10/5ee19423bc3e0fd5f23ce991b0755699ad2a46a440ce9cec99e8126bb98448ad3479d2c0ea54be5519db5b19a4ffaa69616bac01540db18506dd4dac3dc418f0 + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10/d062acfa0cb82beeb558f1043c6ba770ea892b5fb7b28654dbc70ea2aeea55226dd34c02a294f6c1ca179a5aa483c4ea641846821b182edbd9cc5d89b54c6848 languageName: node linkType: hard -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" +"https-proxy-agent@npm:^7.0.1": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" dependencies: - agent-base: "npm:6" + agent-base: "npm:^7.1.2" debug: "npm:4" - checksum: 10/f0dce7bdcac5e8eaa0be3c7368bb8836ed010fb5b6349ffb412b172a203efe8f807d9a6681319105ea1b6901e1972c7b5ea899672a7b9aad58309f766dcbe0df + checksum: 10/784b628cbd55b25542a9d85033bdfd03d4eda630fb8b3c9477959367f3be95dc476ed2ecbb9836c359c7c698027fc7b45723a302324433590f45d6c1706e8c13 languageName: node linkType: hard @@ -4511,15 +4739,6 @@ __metadata: languageName: node linkType: hard -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: "npm:^2.0.0" - checksum: 10/9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 - languageName: node - linkType: hard - "iconv-lite@npm:0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -4553,19 +4772,19 @@ __metadata: linkType: hard "ignore@npm:^5.2.0": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 10/4f7caf5d2005da21a382d4bd1d2aa741a3bed51de185c8562dd7f899a81a620ac4fd0619b06f7029a38ae79e4e4c134399db3bd0192c703c3ef54bb82df3086c + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10/cceb6a457000f8f6a50e1196429750d782afce5680dd878aa4221bd79972d68b3a55b4b1458fc682be978f4d3c6a249046aa0880637367216444ab7b014cfc98 languageName: node linkType: hard -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": - version: 3.2.1 - resolution: "import-fresh@npm:3.2.1" +"import-fresh@npm:^3.2.1": + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" dependencies: parent-module: "npm:^1.0.0" resolve-from: "npm:^4.0.0" - checksum: 10/caef42418a087c3951fb676943a7f21ba8971aa07f9b622dff4af7edcef4160e1b172dccd85a88d7eb109cf41406a4592f70259e6b3b33aeafd042bb61f81d96 + checksum: 10/a06b19461b4879cc654d46f8a6244eb55eb053437afd4cbb6613cad6be203811849ed3e4ea038783092879487299fda24af932b86bdfff67c9055ba3612b8c87 languageName: node linkType: hard @@ -4583,20 +4802,6 @@ __metadata: languageName: node linkType: hard -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 10/cd3f5cbc9ca2d624c6a1f53f12e6b341659aba0e2d3254ae2b4464aaea8b4294cdb09616abbc59458f980531f2429784ed6a420d48d245bcad0811980c9efae9 - languageName: node - linkType: hard - -"infer-owner@npm:^1.0.4": - version: 1.0.4 - resolution: "infer-owner@npm:1.0.4" - checksum: 10/181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 - languageName: node - linkType: hard - "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -4614,24 +4819,31 @@ __metadata: languageName: node linkType: hard -"ini@npm:^1.3.4": +"ini@npm:^1.3.4, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: 10/314ae176e8d4deb3def56106da8002b462221c174ddb7ce0c49ee72c8cd1f9044f7b10cc555a7d8850982c3b9ca96fc212122749f5234bc2b6fb05fb942ed566 languageName: node linkType: hard -"ini@npm:~1.3.0": - version: 1.3.5 - resolution: "ini@npm:1.3.5" - checksum: 10/3d69b7730b021fafc1ba356f1fdb7b12d97fe20ac3fbc88d5e63b59c7147236288a51ce3b6c42d5449fc99f89d94548a0005605da74d82f0c045e2bbdbc2ca79 +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + hasown: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 10/1d5219273a3dab61b165eddf358815eefc463207db33c20fcfca54717da02e3f492003757721f972fd0bf21e4b426cab389c5427b99ceea4b8b670dc88ee6d4a languageName: node linkType: hard -"ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: 10/1270b11e534a466fb4cf4426cbcc3a907c429389f7f4e4e3b288b42823562e88d6a509ceda8141a507de147ca506141f745005c0aa144569d94cf24a54eb52bc +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 10/1ed81e06721af012306329b31f532b5e24e00cb537be18ddc905a84f19fe8f83a09a1699862bf3a1ec4b9dea93c55a3fa5faf8b5ea380431469df540f38b092c languageName: node linkType: hard @@ -4642,21 +4854,23 @@ __metadata: languageName: node linkType: hard -"is-accessor-descriptor@npm:^0.1.6": - version: 0.1.6 - resolution: "is-accessor-descriptor@npm:0.1.6" +"is-accessor-descriptor@npm:^1.0.1": + version: 1.0.1 + resolution: "is-accessor-descriptor@npm:1.0.1" dependencies: - kind-of: "npm:^3.0.2" - checksum: 10/3d629a086a9585bc16a83a8e8a3416f400023301855cafb7ccc9a1d63145b7480f0ad28877dcc2cce09492c4ec1c39ef4c071996f24ee6ac626be4217b8ffc8a + hasown: "npm:^2.0.0" + checksum: 10/df0d1da1a320e57c594e6f9b52dab8a6bece6dc90e51689d05ac8e5247164aa3eb3e9c66b37027bebfc0ea5fcce6d9503dbc41dccd82f4b57add79a307735365 languageName: node linkType: hard -"is-accessor-descriptor@npm:^1.0.0": - version: 1.0.0 - resolution: "is-accessor-descriptor@npm:1.0.0" +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" dependencies: - kind-of: "npm:^6.0.0" - checksum: 10/8e475968e9b22f9849343c25854fa24492dbe8ba0dea1a818978f9f1b887339190b022c9300d08c47fe36f1b913d70ce8cbaca00369c55a56705fdb7caed37fe + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10/ef1095c55b963cd0dcf6f88a113e44a0aeca91e30d767c475e7d746d28d1195b10c5076b94491a7a0cd85020ca6a4923070021d74651d093dc909e9932cf689b languageName: node linkType: hard @@ -4667,6 +4881,28 @@ __metadata: languageName: node linkType: hard +"is-async-function@npm:^2.0.0": + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" + dependencies: + async-function: "npm:^1.0.0" + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10/7c2ac7efdf671e03265e74a043bcb1c0a32e226bc2a42dfc5ec8644667df668bbe14b91c08e6c1414f392f8cf86cd1d489b3af97756e2c7a49dd1ba63fd40ca6 + languageName: node + linkType: hard + +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" + dependencies: + has-bigints: "npm:^1.0.2" + checksum: 10/10cf327310d712fe227cfaa32d8b11814c214392b6ac18c827f157e1e85363cf9c8e2a22df526689bd5d25e53b58cc110894787afb54e138e7c504174dba15fd + languageName: node + linkType: hard + "is-binary-path@npm:^1.0.0": version: 1.0.1 resolution: "is-binary-path@npm:1.0.1" @@ -4676,6 +4912,16 @@ __metadata: languageName: node linkType: hard +"is-boolean-object@npm:^1.2.1": + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10/051fa95fdb99d7fbf653165a7e6b2cba5d2eb62f7ffa81e793a790f3fb5366c91c1b7b6af6820aa2937dd86c73aa3ca9d9ca98f500988457b1c59692c52ba911 + languageName: node + linkType: hard + "is-buffer@npm:^1.1.5": version: 1.1.6 resolution: "is-buffer@npm:1.1.6" @@ -4683,10 +4929,10 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.4, is-callable@npm:^1.2.0": - version: 1.2.0 - resolution: "is-callable@npm:1.2.0" - checksum: 10/00f052d484dc44eb00396aa53e09ecec1ea2fe21b244f10aa0d875adfeafa9f0ff2fb2d9b027bef8332b5fee93207dd0dd27e37c3b0a1327477c8c95c1cec970 +"is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 10/48a9297fb92c99e9df48706241a189da362bff3003354aea4048bd5f7b2eb0d823cd16d0a383cece3d76166ba16d85d9659165ac6fcce1ac12e6c649d66dbdb9 languageName: node linkType: hard @@ -4701,50 +4947,62 @@ __metadata: languageName: node linkType: hard -"is-data-descriptor@npm:^0.1.4": - version: 0.1.4 - resolution: "is-data-descriptor@npm:0.1.4" +"is-core-module@npm:^2.16.0": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" dependencies: - kind-of: "npm:^3.0.2" - checksum: 10/5c622e078ba933a78338ae398a3d1fc5c23332b395312daf4f74bab4afb10d061cea74821add726cb4db8b946ba36217ee71a24fe71dd5bca4632edb7f6aad87 + hasown: "npm:^2.0.2" + checksum: 10/452b2c2fb7f889cbbf7e54609ef92cf6c24637c568acc7e63d166812a0fb365ae8a504c333a29add8bdb1686704068caa7f4e4b639b650dde4f00a038b8941fb languageName: node linkType: hard -"is-data-descriptor@npm:^1.0.0": - version: 1.0.0 - resolution: "is-data-descriptor@npm:1.0.0" +"is-data-descriptor@npm:^1.0.1": + version: 1.0.1 + resolution: "is-data-descriptor@npm:1.0.1" dependencies: - kind-of: "npm:^6.0.0" - checksum: 10/b8b1f13a535800a9f35caba2743b2cfd1e76312c0f94248c333d3b724d6ac6e07f06011e8b00eb2442f27dfc8fb71faf3dd52ced6bee41bb836be3df5d7811ee + hasown: "npm:^2.0.0" + checksum: 10/49b36e903b31623b0c5b416e182e366810ef97a3a19ab0e6cd501eb5599112680b7d9e768b07a84fb52aa2510a92b3eb51a3e18ce8d5f7978a49f4b50e6ec6dd languageName: node linkType: hard -"is-date-object@npm:^1.0.1": +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": version: 1.0.2 - resolution: "is-date-object@npm:1.0.2" - checksum: 10/96c56c04631f866b3a3aea4b889eac6120c13d8a06dc7e105479ffd6f57e5ea3668f1d779ef30063d4b27aa8e9b235ea7d15bbdab54b056affc678c4769ff143 + resolution: "is-data-view@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + is-typed-array: "npm:^1.1.13" + checksum: 10/357e9a48fa38f369fd6c4c3b632a3ab2b8adca14997db2e4b3fe94c4cd0a709af48e0fb61b02c64a90c0dd542fd489d49c2d03157b05ae6c07f5e4dec9e730a8 + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10/3a811b2c3176fb31abee1d23d3dc78b6c65fd9c07d591fcb67553cab9e7f272728c3dd077d2d738b53f9a2103255b0a6e8dfc9568a7805c56a78b2563e8d1dec languageName: node linkType: hard "is-descriptor@npm:^0.1.0": - version: 0.1.6 - resolution: "is-descriptor@npm:0.1.6" + version: 0.1.7 + resolution: "is-descriptor@npm:0.1.7" dependencies: - is-accessor-descriptor: "npm:^0.1.6" - is-data-descriptor: "npm:^0.1.4" - kind-of: "npm:^5.0.0" - checksum: 10/b946ba842187c2784a5a0d67bd0e0271b14678f4fdce7d2295dfda9201f3408f55f56e11e5e66bfa4d2b9d45655b6105ad872ad7d37fb63f582587464fd414d7 + is-accessor-descriptor: "npm:^1.0.1" + is-data-descriptor: "npm:^1.0.1" + checksum: 10/38783182c3d83f839a9fa3e87b4d6de11fa9639833ed98993ea51aea2296b2da155121956e148695a738228871d1057c5f963d0b1c857bb8a4a38d8dd9ceeb56 languageName: node linkType: hard "is-descriptor@npm:^1.0.0, is-descriptor@npm:^1.0.2": - version: 1.0.2 - resolution: "is-descriptor@npm:1.0.2" + version: 1.0.3 + resolution: "is-descriptor@npm:1.0.3" dependencies: - is-accessor-descriptor: "npm:^1.0.0" - is-data-descriptor: "npm:^1.0.0" - kind-of: "npm:^6.0.2" - checksum: 10/e68059b333db331d5ea68cb367ce12fc6810853ced0e2221e6747143bbdf223dee73ebe8f331bafe04e34fdbe3da584b6af3335e82eabfaa33d5026efa33ca34 + is-accessor-descriptor: "npm:^1.0.1" + is-data-descriptor: "npm:^1.0.1" + checksum: 10/b940d04d93adaffb749b3ca7f7f6d73dd3c5582b674f372513ecb5511a8a3f3ff4a24f4c1161cb10e48fe4886f9e84c09fa71785def27905ca8df1197e563dc6 languageName: node linkType: hard @@ -4780,6 +5038,15 @@ __metadata: languageName: node linkType: hard +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10/0bfb145e9a1ba852ddde423b0926d2169ae5fe9e37882cde9e8f69031281a986308df4d982283e152396e88b86562ed2256cbaa5e6390fb840a4c25ab54b8a80 + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^2.0.0": version: 2.0.0 resolution: "is-fullwidth-code-point@npm:2.0.0" @@ -4794,6 +5061,18 @@ __metadata: languageName: node linkType: hard +"is-generator-function@npm:^1.0.10": + version: 1.1.0 + resolution: "is-generator-function@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.0" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10/5906ff51a856a5fbc6b90a90fce32040b0a6870da905f98818f1350f9acadfc9884f7c3dec833fce04b83dd883937b86a190b6593ede82e8b1af8b6c4ecf7cbd + languageName: node + linkType: hard + "is-glob@npm:^3.1.0": version: 3.1.0 resolution: "is-glob@npm:3.1.0" @@ -4803,16 +5082,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1": - version: 4.0.1 - resolution: "is-glob@npm:4.0.1" - dependencies: - is-extglob: "npm:^2.1.1" - checksum: 10/998cdc412db39a9ad10b5484bbbe43f8dfb6eb0467380c49d53a5105108ac2e590cca3c3ac0ff5e0dcc9c3342c5c235e77fd699576bcd16384eb5a62d4dd086a - languageName: node - linkType: hard - -"is-glob@npm:^4.0.3": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -4831,10 +5101,10 @@ __metadata: languageName: node linkType: hard -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 10/93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 +"is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: 10/8de7b41715b08bcb0e5edb0fb9384b80d2d5bcd10e142188f33247d19ff078abaf8e9b6f858e2302d8d05376a26a55cd23a3c9f8ab93292b02fcd2cc9e4e92bb languageName: node linkType: hard @@ -4845,6 +5115,16 @@ __metadata: languageName: node linkType: hard +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10/a5922fb8779ab1ea3b8a9c144522b3d0bea5d9f8f23f7a72470e61e1e4df47714e28e0154ac011998b709cce260c3c9447ad3cd24a96c2f2a0abfdb2cbdc76c8 + languageName: node + linkType: hard + "is-number@npm:^3.0.0": version: 3.0.0 resolution: "is-number@npm:3.0.0" @@ -4907,12 +5187,15 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.1.0": - version: 1.1.1 - resolution: "is-regex@npm:1.1.1" +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" dependencies: - has-symbols: "npm:^1.0.1" - checksum: 10/1ed55cadc258a4fb88fb44e74e1825cb81ad8ffba83ea03e18125ed6c3c6054d0799cabdb67445d0bdfd568a99f629656a1ab67862ea0c099fd641d49f9fb244 + call-bound: "npm:^1.0.2" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10/c42b7efc5868a5c9a4d8e6d3e9816e8815c611b09535c00fead18a1138455c5cb5e1887f0023a467ad3f9c419d62ba4dc3d9ba8bafe55053914d6d6454a945d2 languageName: node linkType: hard @@ -4923,6 +5206,22 @@ __metadata: languageName: node linkType: hard +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 10/5685df33f0a4a6098a98c72d94d67cad81b2bc72f1fb2091f3d9283c4a1c582123cd709145b02a9745f0ce6b41e3e43f1c944496d1d74d4ea43358be61308669 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10/0380d7c60cc692856871526ffcd38a8133818a2ee42d47bb8008248a0cd2121d8c8b5f66b6da3cac24bc5784553cacb6faaf678f66bc88c6615b42af2825230e + languageName: node + linkType: hard + "is-stream@npm:^1.0.0, is-stream@npm:^1.1.0": version: 1.1.0 resolution: "is-stream@npm:1.1.0" @@ -4937,12 +5236,59 @@ __metadata: languageName: node linkType: hard -"is-symbol@npm:^1.0.2": - version: 1.0.3 - resolution: "is-symbol@npm:1.0.3" +"is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10/5277cb9e225a7cc8a368a72623b44a99f2cfa139659c6b203553540681ad4276bfc078420767aad0e73eef5f0bd07d4abf39a35d37ec216917879d11cebc1f8b + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + safe-regex-test: "npm:^1.1.0" + checksum: 10/db495c0d8cd0a7a66b4f4ef7fccee3ab5bd954cb63396e8ac4d32efe0e9b12fdfceb851d6c501216a71f4f21e5ff20fc2ee845a3d52d455e021c466ac5eb2db2 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" + dependencies: + which-typed-array: "npm:^1.1.16" + checksum: 10/e8cf60b9ea85667097a6ad68c209c9722cfe8c8edf04d6218366469e51944c5cc25bae45ffb845c23f811d262e4314d3b0168748eb16711aa34d12724cdf0735 + languageName: node + linkType: hard + +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: 10/a7b7e23206c542dcf2fa0abc483142731788771527e90e7e24f658c0833a0d91948a4f7b30d78f7a65255a48512e41a0288b778ba7fc396137515c12e201fd11 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1": + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10/543506fd8259038b371bb083aac25b16cb4fd8b12fc58053aa3d45ac28dfd001cd5c6dffbba7aeea4213c74732d46b6cb2cfb5b412eed11f2db524f3f97d09a0 + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.3": + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" dependencies: - has-symbols: "npm:^1.0.1" - checksum: 10/4854604be4abb5f9d885d4bbc9f9318b7dbda9402fbe172c09861bb8910d97e70fac6dabbf1023a7ec56986f457c92abb08f1c99decce83c06c944130a0b1cd1 + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10/1d5e1d0179beeed3661125a6faa2e59bfb48afda06fc70db807f178aa0ebebc3758fb6358d76b3d528090d5ef85148c345dcfbf90839592fe293e3e5e82f2134 languageName: node linkType: hard @@ -4969,6 +5315,13 @@ __metadata: languageName: node linkType: hard +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 10/1d8bc7911e13bb9f105b1b3e0b396c787a9e63046af0b8fe0ab1414488ab06b2b099b87a2d8a9e31d21c9a6fad773c7fc8b257c4880f2d957274479d28ca3414 + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -4976,6 +5329,13 @@ __metadata: languageName: node linkType: hard +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10/7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e + languageName: node + linkType: hard + "isobject@npm:^2.0.0": version: 2.1.0 resolution: "isobject@npm:2.1.0" @@ -4992,6 +5352,19 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10/96f8786eaab98e4bf5b2a5d6d9588ea46c4d06bbc4f2eb861fdd7b6b182b16f71d8a70e79820f335d52653b16d4843b29dd9cdcf38ae80406756db9199497cf3 + languageName: node + linkType: hard + "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -5010,12 +5383,26 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 10/bebe7ae829bbd586ce8cbe83501dd8cb8c282c8902a8aeeed0a073a89dc37e8103b1244f3c6acd60278bcbfe12d93a3f83c9ac396868a3b3bbc3c5e5e3b648ef + languageName: node + linkType: hard + +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" bin: jsesc: bin/jsesc - checksum: 10/d2096abdcdec56969764b40ffc91d4a23408aa2f351b4d1c13f736f25476643238c43fdbaf38a191c26b1b78fd856d965f5d4d0dde7b89459cd94025190cdf13 + checksum: 10/20bd37a142eca5d1794f354db8f1c9aeb54d85e1f5c247b371de05d23a9751ecd7bd3a9c4fc5298ea6fa09a100dafb4190fa5c98c6610b75952c3487f3ce7967 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 10/82876154521b7b68ba71c4f969b91572d1beabadd87bd3a6b236f85fbc7dc4695089191ed60bb59f9340993c51b33d479f45b6ba9f3548beb519705281c32c3c languageName: node linkType: hard @@ -5056,6 +5443,15 @@ __metadata: languageName: node linkType: hard +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10/167eb6ef64cc84b6fa0780ee50c9de456b422a1e18802209234f7c2cf7eae648c7741f32e50d7e24ccb22b24c13154070b01563d642755b156c357431a191e75 + languageName: node + linkType: hard + "kind-of@npm:^3.0.2, kind-of@npm:^3.0.3, kind-of@npm:^3.2.0": version: 3.2.2 resolution: "kind-of@npm:3.2.2" @@ -5074,14 +5470,7 @@ __metadata: languageName: node linkType: hard -"kind-of@npm:^5.0.0": - version: 5.1.0 - resolution: "kind-of@npm:5.1.0" - checksum: 10/acf7cc73881f27629f700a80de77ff7fe4abc9430eac7ddb09117f75126e578ee8d7e44c4dacb6a9e802d5d881abf007ee6af3cfbe55f8b5cf0a7fdc49a02aa3 - languageName: node - linkType: hard - -"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2": +"kind-of@npm:^6.0.2": version: 6.0.3 resolution: "kind-of@npm:6.0.3" checksum: 10/5873d303fb36aad875b7538798867da2ae5c9e328d67194b0162a3659a627d22f742fc9c4ae95cd1704132a24b00cae5041fc00c0f6ef937dc17080dc4dbb962 @@ -5153,6 +5542,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a + languageName: node + linkType: hard + "lru-cache@npm:^4.0.1": version: 4.1.5 resolution: "lru-cache@npm:4.1.5" @@ -5172,22 +5568,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10/fc1fe2ee205f7c8855fa0f34c1ab0bcf14b6229e35579ec1fd1079f31d6fc8ef8eb6fd17f2f4d99788d7e339f50e047555551ebd5e434dda503696e7c6591825 - languageName: node - linkType: hard - -"lru-cache@npm:^7.7.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: 10/6029ca5aba3aacb554e919d7ef804fffd4adfc4c83db00fac8248c7c78811fb6d4b6f70f7fd9d55032b3823446546a007edaa66ad1f2377ae833bd983fac5d98 - languageName: node - linkType: hard - "make-dir@npm:^1.0.0": version: 1.3.0 resolution: "make-dir@npm:1.3.0" @@ -5197,27 +5577,22 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^10.0.3": - version: 10.2.1 - resolution: "make-fetch-happen@npm:10.2.1" +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" dependencies: - agentkeepalive: "npm:^4.2.1" - cacache: "npm:^16.1.0" - http-cache-semantics: "npm:^4.1.0" - http-proxy-agent: "npm:^5.0.0" - https-proxy-agent: "npm:^5.0.0" - is-lambda: "npm:^1.0.1" - lru-cache: "npm:^7.7.1" - minipass: "npm:^3.1.6" - minipass-collect: "npm:^1.0.2" - minipass-fetch: "npm:^2.0.3" + "@npmcli/agent": "npm:^3.0.0" + cacache: "npm:^19.0.1" + http-cache-semantics: "npm:^4.1.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^4.0.0" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" + negotiator: "npm:^1.0.0" + proc-log: "npm:^5.0.0" promise-retry: "npm:^2.0.1" - socks-proxy-agent: "npm:^7.0.0" - ssri: "npm:^9.0.0" - checksum: 10/fef5acb865a46f25ad0b5ad7d979799125db5dbb24ea811ffa850fbb804bc8e495df2237a8ec3a4fc6250e73c2f95549cca6d6d36a73b1faa61224504eb1188f + ssri: "npm:^12.0.0" + checksum: 10/fce0385840b6d86b735053dfe941edc2dd6468fda80fe74da1eeff10cbd82a75760f406194f2bc2fa85b99545b2bc1f84c08ddf994b21830775ba2d1a87e8bdf languageName: node linkType: hard @@ -5237,6 +5612,13 @@ __metadata: languageName: node linkType: hard +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10/11df2eda46d092a6035479632e1ec865b8134bdfc4bd9e571a656f4191525404f13a283a515938c3a8de934dbfd9c09674d9da9fa831e6eb7e22b50b197d2edd + languageName: node + linkType: hard + "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -5258,10 +5640,10 @@ __metadata: languageName: node linkType: hard -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 10/5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 10/52117adbe0313d5defa771c9993fe081e2d2df9b840597e966aadafde04ae8d0e3da46bac7ca4efc37d4d2b839436582659cd49c6a43eacb3fe3050896a105d1 languageName: node linkType: hard @@ -5307,30 +5689,30 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" +"micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" dependencies: - braces: "npm:^3.0.2" + braces: "npm:^3.0.3" picomatch: "npm:^2.3.1" - checksum: 10/a749888789fc15cac0e03273844dbd749f9f8e8d64e70c564bcf06a033129554c789bb9e30d7566d7ff6596611a08e58ac12cf2a05f6e3c9c47c50c4c7e12fa2 - languageName: node - linkType: hard - -"mime-db@npm:1.44.0": - version: 1.44.0 - resolution: "mime-db@npm:1.44.0" - checksum: 10/7cde7b1d8e9ac68033a40686a944f42f3007d0c58fb78ed5720ac999d9c724b9330ee15ba40338d93eb17653d769736955b104d9c52666b37b001791649f8d6a + checksum: 10/6bf2a01672e7965eb9941d1f02044fad2bd12486b5553dc1116ff24c09a8723157601dc992e74c911d896175918448762df3b3fd0a6b61037dd1a9766ddfbf58 languageName: node linkType: hard -"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": +"mime-db@npm:1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" checksum: 10/54bb60bf39e6f8689f6622784e668a3d7f8bed6b0d886f5c3c446cb3284be28b30bf707ed05d0fe44a036f8469976b2629bbea182684977b084de9da274694d7 languageName: node linkType: hard +"mime-db@npm:>= 1.43.0 < 2": + version: 1.54.0 + resolution: "mime-db@npm:1.54.0" + checksum: 10/9e7834be3d66ae7f10eaa69215732c6d389692b194f876198dca79b2b90cbf96688d9d5d05ef7987b20f749b769b11c01766564264ea5f919c88b32a29011311 + languageName: node + linkType: hard + "mime-db@npm:~1.33.0": version: 1.33.0 resolution: "mime-db@npm:1.33.0" @@ -5347,16 +5729,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:~2.1.24": - version: 2.1.27 - resolution: "mime-types@npm:2.1.27" - dependencies: - mime-db: "npm:1.44.0" - checksum: 10/056a86257296dd7a73d6c74f8adb118c2dc8beaa4c46898042e275fcc85aaf2a33a8533cb4bd38c97a42512146e3c4fa0140c3a9508456260ee444474b7fc618 - languageName: node - linkType: hard - -"mime-types@npm:~2.1.34": +"mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -5381,7 +5754,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:3.1.2, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -5390,52 +5763,43 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4": - version: 3.0.4 - resolution: "minimatch@npm:3.0.4" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10/3b3f17f76582417dd139646505f1d1bb5f148ea5191eb98fe73cd41224a678dadb94cc674c7d06b36de4ab5c303f039cfd7cd2d089348d6f70d04db169cf3770 - languageName: node - linkType: hard - -"minimatch@npm:^5.0.1": - version: 5.1.6 - resolution: "minimatch@npm:5.1.6" +"minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" dependencies: brace-expansion: "npm:^2.0.1" - checksum: 10/126b36485b821daf96d33b5c821dac600cc1ab36c87e7a532594f9b1652b1fa89a1eebcaad4dff17c764dce1a7ac1531327f190fed5f97d8f6e5f889c116c429 + checksum: 10/dd6a8927b063aca6d910b119e1f2df6d2ce7d36eab91de83167dd136bb85e1ebff97b0d3de1cb08bd1f7e018ca170b4962479fefab5b2a69e2ae12cb2edc8348 languageName: node linkType: hard "minimist@npm:^1.2.0": - version: 1.2.6 - resolution: "minimist@npm:1.2.6" - checksum: 10/b956a7d48669c5007f0afce100a92d3af18e77939a25b5b4f62e9ea07c2777033608327e14c2af85684d5cd504f623f2a04d30a4a43379d21dd3c6dcf12b8ab8 + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10/908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f languageName: node linkType: hard -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" dependencies: - minipass: "npm:^3.0.0" - checksum: 10/14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + minipass: "npm:^7.0.3" + checksum: 10/b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 languageName: node linkType: hard -"minipass-fetch@npm:^2.0.3": - version: 2.1.2 - resolution: "minipass-fetch@npm:2.1.2" +"minipass-fetch@npm:^4.0.0": + version: 4.0.1 + resolution: "minipass-fetch@npm:4.0.1" dependencies: encoding: "npm:^0.1.13" - minipass: "npm:^3.1.6" + minipass: "npm:^7.0.3" minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" + minizlib: "npm:^3.0.1" dependenciesMeta: encoding: optional: true - checksum: 10/8cfc589563ae2a11eebbf79121ef9a526fd078fca949ed3f1e4a51472ca4a4aad89fcea1738982ce9d7d833116ecc9c6ae9ebbd844832a94e3f4a3d4d1b9d3b9 + checksum: 10/7ddfebdbb87d9866e7b5f7eead5a9e3d9d507992af932a11d275551f60006cf7d9178e66d586dbb910894f3e3458d27c0ddf93c76e94d49d0a54a541ddc1263d languageName: node linkType: hard @@ -5466,7 +5830,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": +"minipass@npm:^3.0.0": version: 3.3.6 resolution: "minipass@npm:3.3.6" dependencies: @@ -5475,20 +5839,19 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 10/61682162d29f45d3152b78b08bab7fb32ca10899bc5991ffe98afc18c9e9543bd1e3be94f8b8373ba6262497db63607079dc242ea62e43e7b2270837b7347c93 +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10/c25f0ee8196d8e6036661104bacd743785b2599a21de5c516b32b3fa2b83113ac89a2358465bc04956baab37ffb956ae43be679b2262bf7be15fce467ccd7950 languageName: node linkType: hard -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" +"minizlib@npm:^3.0.1": + version: 3.0.2 + resolution: "minizlib@npm:3.0.2" dependencies: - minipass: "npm:^3.0.0" - yallist: "npm:^4.0.0" - checksum: 10/ae0f45436fb51344dcb87938446a32fbebb540d0e191d63b35e1c773d47512e17307bf54aa88326cc6d176594d00e4423563a091f7266c2f9a6872cdc1e234d1 + minipass: "npm:^7.1.2" + checksum: 10/c075bed1594f68dcc8c35122333520112daefd4d070e5d0a228bd4cf5580e9eed3981b96c0ae1d62488e204e80fd27b2b9d0068ca9a5ef3993e9565faf63ca41 languageName: node linkType: hard @@ -5502,16 +5865,16 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" bin: - mkdirp: bin/cmd.js - checksum: 10/d71b8dcd4b5af2fe13ecf3bd24070263489404fe216488c5ba7e38ece1f54daf219e72a833a3a2dc404331e870e9f44963a33399589490956bff003a3404d3b2 + mkdirp: dist/cjs/src/bin.js + checksum: 10/16fd79c28645759505914561e249b9a1f5fe3362279ad95487a4501e4467abeb714fd35b95307326b8fd03f3c7719065ef11a6f97b7285d7888306d1bd2232ba languageName: node linkType: hard -"mongodb-connection-string-url@npm:^2.5.4, mongodb-connection-string-url@npm:^2.6.0": +"mongodb-connection-string-url@npm:^2.6.0": version: 2.6.0 resolution: "mongodb-connection-string-url@npm:2.6.0" dependencies: @@ -5521,47 +5884,65 @@ __metadata: languageName: node linkType: hard +"mongodb-connection-string-url@npm:^3.0.0": + version: 3.0.2 + resolution: "mongodb-connection-string-url@npm:3.0.2" + dependencies: + "@types/whatwg-url": "npm:^11.0.2" + whatwg-url: "npm:^14.1.0 || ^13.0.0" + checksum: 10/99ac939a67cc963b90cfe70a8e45250a8386c531be7d22ffa5d1f3e5dd2406b149fb823b91ac161e4a4a29dfac754b49bca8f6dd786cfc66ae0ca80db5f5f23d + languageName: node + linkType: hard + "mongodb@npm:*": - version: 5.6.0 - resolution: "mongodb@npm:5.6.0" + version: 6.16.0 + resolution: "mongodb@npm:6.16.0" dependencies: - bson: "npm:^5.3.0" - mongodb-connection-string-url: "npm:^2.6.0" - saslprep: "npm:^1.0.3" - socks: "npm:^2.7.1" + "@mongodb-js/saslprep": "npm:^1.1.9" + bson: "npm:^6.10.3" + mongodb-connection-string-url: "npm:^3.0.0" peerDependencies: - "@aws-sdk/credential-providers": ^3.201.0 - mongodb-client-encryption: ">=2.3.0 <3" + "@aws-sdk/credential-providers": ^3.188.0 + "@mongodb-js/zstd": ^1.1.0 || ^2.0.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: ">=6.0.0 <7" snappy: ^7.2.2 - dependenciesMeta: - saslprep: - optional: true + socks: ^2.7.1 peerDependenciesMeta: "@aws-sdk/credential-providers": optional: true + "@mongodb-js/zstd": + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true mongodb-client-encryption: optional: true snappy: optional: true - checksum: 10/9ad910e71022b77d9012cd846c9a70226050d15d24fbcc6a251b421b35d923313b7c2d8eb5e724aa1de00c91226413fb0a3e18aa140a5e8531cee6bbe598a087 + socks: + optional: true + checksum: 10/eb47da9ef00331aca1804426424a8630f9e42c48bf6021786ebb1766b1d53bda62c64498b41627b5fe5c01260ec5ca2e8cbc2468e394df5d5b874cee646e9c06 languageName: node linkType: hard "mongodb@npm:^4.12.1": - version: 4.16.0 - resolution: "mongodb@npm:4.16.0" + version: 4.17.2 + resolution: "mongodb@npm:4.17.2" dependencies: "@aws-sdk/credential-providers": "npm:^3.186.0" + "@mongodb-js/saslprep": "npm:^1.1.0" bson: "npm:^4.7.2" - mongodb-connection-string-url: "npm:^2.5.4" - saslprep: "npm:^1.0.3" + mongodb-connection-string-url: "npm:^2.6.0" socks: "npm:^2.7.1" dependenciesMeta: "@aws-sdk/credential-providers": optional: true - saslprep: + "@mongodb-js/saslprep": optional: true - checksum: 10/86624ba95fd28e38e2407190b0d3145c3f0ce06a83545f1ceddb3cc202bbb869608783aa4c08ef827b7863c3f60dd5cdb9b497befb47c01ec16c306f5089c514 + checksum: 10/e9f252c13a12b6339b5b4912c32d40f447eaeae77f0b0d0e36b7fbaa6800eae69ae68c6e6f005f97e90c90ad2a9f56369a0924963b83f959c83a4c1398093642 languageName: node linkType: hard @@ -5572,14 +5953,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 10/673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -5587,20 +5961,20 @@ __metadata: linkType: hard "nan@npm:^2.12.1": - version: 2.17.0 - resolution: "nan@npm:2.17.0" + version: 2.22.2 + resolution: "nan@npm:2.22.2" dependencies: node-gyp: "npm:latest" - checksum: 10/bba1efee2475afb0cce154300b554863fb4bb0a683a28f5d0fa7390794b3b4381356aabeab6472c70651d9c8a2830e7595963f3ec0aa2008e5c4d83dbeb820fa + checksum: 10/bee49de633650213970596ffbdf036bfe2109ff283a40f7742c3aa6d1fc15b9836f62bfee82192b879f56ab5f9fa9a1e5c58a908a50e5c87d91fb2118ef70827 languageName: node linkType: hard -"nanoid@npm:^3.3.7": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" +"nanoid@npm:^3.3.8": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" bin: nanoid: bin/nanoid.cjs - checksum: 10/ac1eb60f615b272bccb0e2b9cd933720dad30bf9708424f691b8113826bb91aca7e9d14ef5d9415a6ba15c266b37817256f58d8ce980c82b0ba3185352565679 + checksum: 10/73b5afe5975a307aaa3c95dfe3334c52cdf9ae71518176895229b8d65ab0d1c0417dd081426134eb7571c055720428ea5d57c645138161e7d10df80815527c48 languageName: node linkType: hard @@ -5637,13 +6011,20 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": +"negotiator@npm:0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" checksum: 10/2723fb822a17ad55c93a588a4bc44d53b22855bf4be5499916ca0cab1e7165409d0b288ba2577d7b029f10ce18cf2ed8e703e5af31c984e1e2304277ef979837 languageName: node linkType: hard +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10/b5734e87295324fabf868e36fb97c84b7d7f3156ec5f4ee5bf6e488079c11054f818290fc33804cef7b1ee21f55eeb14caea83e7dafae6492a409b3e573153e5 + languageName: node + linkType: hard + "nice-try@npm:^1.0.4": version: 1.0.5 resolution: "nice-try@npm:1.0.5" @@ -5652,29 +6033,29 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 9.3.1 - resolution: "node-gyp@npm:9.3.1" + version: 11.2.0 + resolution: "node-gyp@npm:11.2.0" dependencies: env-paths: "npm:^2.2.0" - glob: "npm:^7.1.4" + exponential-backoff: "npm:^3.1.1" graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^10.0.3" - nopt: "npm:^6.0.0" - npmlog: "npm:^6.0.0" - rimraf: "npm:^3.0.2" + make-fetch-happen: "npm:^14.0.3" + nopt: "npm:^8.0.0" + proc-log: "npm:^5.0.0" semver: "npm:^7.3.5" - tar: "npm:^6.1.2" - which: "npm:^2.0.2" + tar: "npm:^7.4.3" + tinyglobby: "npm:^0.2.12" + which: "npm:^5.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10/e9345b22be0a3256af87a16ba9604362cd8e4db304e67e71dd83bb8e573f3fdbaf69e359b5af572a14a98730cc3e1813679444ee029093d2a2f38ba3cac4ed7e + checksum: 10/806fd8e3adc9157e17bf0d4a2c899cf6b98a0bbe9f453f630094ce791866271f6cddcaf2133e6513715d934fcba2014d287c7053d5d7934937b3a34d5a3d84ad languageName: node linkType: hard -"node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 10/0f7607ec7db5ef1dc616899a5f24ae90c869b6a54c2d4f36ff6d84a282ab9343c7ff3ca3670fe4669171bb1e8a9b3e286e1ef1c131f09a83d70554f855d54f24 +"node-releases@npm:^2.0.19": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 10/c2b33b4f0c40445aee56141f13ca692fa6805db88510e5bbb3baadb2da13e1293b738e638e15e4a8eb668bb9e97debb08e7a35409b477b5cc18f171d35a83045 languageName: node linkType: hard @@ -5698,25 +6079,14 @@ __metadata: languageName: node linkType: hard -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" +"nopt@npm:^8.0.0": + version: 8.1.0 + resolution: "nopt@npm:8.1.0" dependencies: - abbrev: "npm:^1.0.0" + abbrev: "npm:^3.0.0" bin: nopt: bin/nopt.js - checksum: 10/3c1128e07cd0241ae66d6e6a472170baa9f3e84dd4203950ba8df5bafac4efa2166ce917a57ef02b01ba7c40d18b2cc64b29b225fd3640791fe07b24f0b33a32 - languageName: node - linkType: hard - -"nopt@npm:~1.0.10": - version: 1.0.10 - resolution: "nopt@npm:1.0.10" - dependencies: - abbrev: "npm:1" - bin: - nopt: ./bin/nopt.js - checksum: 10/4f01ad1e144883a190d70bd6003f26e2f3a899230fe1b0f3310e43779c61cab5ae0063a9209912cd52fc4c552b266b38173853aa9abe27ecb04acbdfdca2e9fc + checksum: 10/26ab456c51a96f02a9e5aa8d1b80ef3219f2070f3f3528a040e32fb735b1e651e17bdf0f1476988d3a46d498f35c65ed662d122f340d38ce4a7e71dd7b20c4bc languageName: node linkType: hard @@ -5787,18 +6157,6 @@ __metadata: languageName: node linkType: hard -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" - dependencies: - are-we-there-yet: "npm:^3.0.0" - console-control-strings: "npm:^1.1.0" - gauge: "npm:^4.0.3" - set-blocking: "npm:^2.0.0" - checksum: 10/82b123677e62deb9e7472e27b92386c09e6e254ee6c8bcd720b3011013e4168bc7088e984f4fbd53cb6e12f8b4690e23e4fa6132689313e0d0dc4feea45489bb - languageName: node - linkType: hard - "object-assign@npm:^4": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -5817,21 +6175,14 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.7.0": - version: 1.8.0 - resolution: "object-inspect@npm:1.8.0" - checksum: 10/065e1b3e10d8bf57b0b7a9eaa949df92762a1e53af2ef799194dd974515a08de9d14c5923cb61ec5bad47663a0e26f6115294c7f976a9237eef6b086e72bf9b1 - languageName: node - linkType: hard - -"object-inspect@npm:^1.9.0": - version: 1.12.3 - resolution: "object-inspect@npm:1.12.3" - checksum: 10/532b0036f0472f561180fac0d04fe328ee01f57637624c83fb054f81b5bfe966cdf4200612a499ed391a7ca3c46b20a0bc3a55fc8241d944abe687c556a32b39 +"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10/aa13b1190ad3e366f6c83ad8a16ed37a19ed57d267385aa4bfdccda833d7b90465c057ff6c55d035a6b2e52c1a2295582b294217a0a3a1ae7abdd6877ef781fb languageName: node linkType: hard -"object-keys@npm:^1.0.11, object-keys@npm:^1.0.12, object-keys@npm:^1.1.1": +"object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" checksum: 10/3d81d02674115973df0b7117628ea4110d56042e5326413e4b4313f0bcdf7dd78d4a3acef2c831463fa3796a66762c49daef306f4a0ea1af44877d7086d73bde @@ -5847,15 +6198,17 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.0": - version: 4.1.0 - resolution: "object.assign@npm:4.1.0" +"object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" dependencies: - define-properties: "npm:^1.1.2" - function-bind: "npm:^1.1.1" - has-symbols: "npm:^1.0.0" - object-keys: "npm:^1.0.11" - checksum: 10/9ca3797cdbd3ff8a196aaee7b4808f2d1802c4d3655b1a03d15ca0284fc1034d097c112c6be60a11a866bcbf728b05318326834054d36f11a17aacb15d04ec9e + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + object-keys: "npm:^1.1.1" + checksum: 10/3fe28cdd779f2a728a9a66bd688679ba231a2b16646cd1e46b528fe7c947494387dda4bc189eff3417f3717ef4f0a8f2439347cf9a9aa3cef722fbfd9f615587 languageName: node linkType: hard @@ -5902,17 +6255,28 @@ __metadata: languageName: node linkType: hard -"optionator@npm:^0.9.1": - version: 0.9.1 - resolution: "optionator@npm:0.9.1" +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" dependencies: deep-is: "npm:^0.1.3" fast-levenshtein: "npm:^2.0.6" levn: "npm:^0.4.1" prelude-ls: "npm:^1.2.1" type-check: "npm:^0.4.0" - word-wrap: "npm:^1.2.3" - checksum: 10/19cfb625ba3cafd99c204744595a8b5111491632d379be341a8286c53a0101adac6f7ca9be4319ccecaaf5d43a55e65dde8b434620726032472833d958d43698 + word-wrap: "npm:^1.2.5" + checksum: 10/a8398559c60aef88d7f353a4f98dcdff6090a4e70f874c827302bf1213d9106a1c4d5fcb68dacb1feb3c30a04c4102f41047aa55d4c576b863d6fc876e001af6 + languageName: node + linkType: hard + +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.2.6" + object-keys: "npm:^1.1.1" + safe-push-apply: "npm:^1.0.0" + checksum: 10/ab4bb3b8636908554fc19bf899e225444195092864cb61503a0d048fdaf662b04be2605b636a4ffeaf6e8811f6fcfa8cbb210ec964c0eb1a41eb853e1d5d2f41 languageName: node linkType: hard @@ -5941,12 +6305,17 @@ __metadata: languageName: node linkType: hard -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: "npm:^3.0.0" - checksum: 10/7ba4a2b1e24c05e1fc14bbaea0fc6d85cf005ae7e9c9425d4575550f37e2e584b1af97bcde78eacd7559208f20995988d52881334db16cf77bc1bcf68e48ed7c +"p-map@npm:^7.0.2": + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 10/2ef48ccfc6dd387253d71bf502604f7893ed62090b2c9d73387f10006c342606b05233da0e4f29388227b61eb5aeface6197e166520c465c234552eeab2fe633 + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10/58ee9538f2f762988433da00e26acc788036914d57c71c246bf0be1b60cdbd77dd60b6a3e1a30465f0b248aeb80079e0b34cb6050b1dfa18c06953bb1cbc7602 languageName: node linkType: hard @@ -6037,24 +6406,34 @@ __metadata: languageName: node linkType: hard -"path-parse@npm:^1.0.6": - version: 1.0.6 - resolution: "path-parse@npm:1.0.6" - checksum: 10/962a85dd384d68d469ec5ba4010df8f8f9b7e936ce603bbe3211476c5615feb3c2b1ca61211a78445fadc833f0b1a86ea6484c861035ec4ac93011ba9aff9a11 +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10/49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a languageName: node linkType: hard -"path-to-regexp@npm:0.1.7": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 10/701c99e1f08e3400bea4d701cf6f03517474bb1b608da71c78b1eb261415b645c5670dfae49808c89e12cea2dccd113b069f040a80de012da0400191c6dbd1c8 +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10/5e8845c159261adda6f09814d7725683257fcc85a18f329880ab4d7cc1d12830967eae5d5894e453f341710d5484b8fdbbd4d75181b4d6e1eb2f4dc7aeadc434 languageName: node linkType: hard -"path-to-regexp@npm:2.2.1": - version: 2.2.1 - resolution: "path-to-regexp@npm:2.2.1" - checksum: 10/1a7125f8c1b5904d556a29722333219df4aa779039e903efe2fbfe0cc3ae9246672846fc8ad285664020b70e434347e0bc9af691fd7d61df8eaa7b018dcd56fb +"path-to-regexp@npm:0.1.12": + version: 0.1.12 + resolution: "path-to-regexp@npm:0.1.12" + checksum: 10/2e30f6a0144679c1f95c98e166b96e6acd1e72be9417830fefc8de7ac1992147eb9a4c7acaa59119fb1b3c34eec393b2129ef27e24b2054a3906fc4fb0d1398e + languageName: node + linkType: hard + +"path-to-regexp@npm:3.3.0": + version: 3.3.0 + resolution: "path-to-regexp@npm:3.3.0" + checksum: 10/8d256383af8db66233ee9027cfcbf8f5a68155efbb4f55e784279d3ab206dcaee554ddb72ff0dae97dd2882af9f7fa802634bb7cffa2e796927977e31b829259 languageName: node linkType: hard @@ -6074,10 +6453,10 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: 10/a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 +"picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 languageName: node linkType: hard @@ -6088,6 +6467,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 10/ce617b8da36797d09c0baacb96ca8a44460452c89362d7cb8f70ca46b4158ba8bc3606912de7c818eb4a939f7f9015cef3c766ec8a0c6bfc725fdc078e39c717 + languageName: node + linkType: hard + "pidtree@npm:^0.3.0": version: 0.3.1 resolution: "pidtree@npm:0.3.1" @@ -6111,14 +6497,21 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.35": - version: 8.4.36 - resolution: "postcss@npm:8.4.36" +"possible-typed-array-names@npm:^1.0.0": + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: 10/2f44137b8d3dd35f4a7ba7469eec1cd9cfbb46ec164b93a5bc1f4c3d68599c9910ee3b91da1d28b4560e9cc8414c3cd56fedc07259c67e52cc774476270d3302 + languageName: node + linkType: hard + +"postcss@npm:^8.4.43": + version: 8.5.3 + resolution: "postcss@npm:8.5.3" dependencies: - nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.1.0" - checksum: 10/8b8bb8e6b67ed8bd3c6773b9b7e9f5fabcf3c6bce35f08dcbea099ce971e81ed5e0639dd08edcdd7078aa78523cdd195f985dde2e070013897f8a7aa4e95adf3 + nanoid: "npm:^3.3.8" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10/6d7e21a772e8b05bf102636918654dac097bac013f0dc8346b72ac3604fc16829646f94ea862acccd8f82e910b00e2c11c1f0ea276543565d278c7ca35516a7c languageName: node linkType: hard @@ -6154,6 +6547,13 @@ __metadata: languageName: node linkType: hard +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: 10/35610bdb0177d3ab5d35f8827a429fb1dc2518d9e639f2151ac9007f01a061c30e0c635a970c9b00c39102216160f6ec54b62377c92fac3b7bfc2ad4b98d195c + languageName: node + linkType: hard + "process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" @@ -6161,13 +6561,6 @@ __metadata: languageName: node linkType: hard -"promise-inflight@npm:^1.0.1": - version: 1.0.1 - resolution: "promise-inflight@npm:1.0.1" - checksum: 10/1560d413ea20c5a74f3631d39ba8cbd1972b9228072a755d01e1f5ca5110382d9af76a1582d889445adc6e75bb5ac4886b56dc4b6eae51b30145d7bb1ac7505b - languageName: node - linkType: hard - "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -6202,33 +6595,26 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^1.3.2": - version: 1.4.1 - resolution: "punycode@npm:1.4.1" - checksum: 10/af2700dde1a116791ff8301348ff344c47d6c224e875057237d1b5112035655fb07a6175cfdb8bf0e3a8cdfd2dc82b3a622e0aefd605566c0e949a6d0d1256a4 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.1.1 - resolution: "punycode@npm:2.1.1" - checksum: 10/939daa010c2cacebdb060c40ecb52fef0a739324a66f7fffe0f94353a1ee83e3b455e9032054c4a0c4977b0a28e27086f2171c392832b59a01bd948fd8e20914 +"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10/febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 languageName: node linkType: hard -"punycode@npm:^2.1.1": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: 10/d4e7fbb96f570c57d64b09a35a1182c879ac32833de7c6926a2c10619632c1377865af3dab5479f59d51da18bcd5035a20a5ef6ceb74020082a3e78025d9a9ca +"qs@npm:6.13.0": + version: 6.13.0 + resolution: "qs@npm:6.13.0" + dependencies: + side-channel: "npm:^1.0.6" + checksum: 10/f548b376e685553d12e461409f0d6e5c59ec7c7d76f308e2a888fd9db3e0c5e89902bedd0754db3a9038eda5f27da2331a6f019c8517dc5e0a16b3c9a6e9cef8 languageName: node linkType: hard -"qs@npm:6.11.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" - dependencies: - side-channel: "npm:^1.0.4" - checksum: 10/5a3bfea3e2f359ede1bfa5d2f0dbe54001aa55e40e27dc3e60fab814362d83a9b30758db057c2011b6f53a2d4e4e5150194b5bac45372652aecb3e3c0d4b256e +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10/72900df0616e473e824202113c3df6abae59150dfb73ed13273503127235320e9c8ca4aaaaccfd58cf417c6ca92a6e68ee9a5c3182886ae949a768639b388a7b languageName: node linkType: hard @@ -6255,15 +6641,15 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:2.5.1": - version: 2.5.1 - resolution: "raw-body@npm:2.5.1" +"raw-body@npm:2.5.2": + version: 2.5.2 + resolution: "raw-body@npm:2.5.2" dependencies: bytes: "npm:3.1.2" http-errors: "npm:2.0.0" iconv-lite: "npm:0.4.24" unpipe: "npm:1.0.0" - checksum: 10/280bedc12db3490ecd06f740bdcf66093a07535374b51331242382c0e130bb273ebb611b7bc4cba1b4b4e016cc7b1f4b05a6df885a6af39c2bc3b94c02291c84 + checksum: 10/863b5171e140546a4d99f349b720abac4410338e23df5e409cfcc3752538c9caf947ce382c89129ba976f71894bd38b5806c774edac35ebf168d02aa1ac11a95 languageName: node linkType: hard @@ -6282,30 +6668,54 @@ __metadata: linkType: hard "react-dom@npm:^18.2.0": - version: 18.2.0 - resolution: "react-dom@npm:18.2.0" + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" dependencies: loose-envify: "npm:^1.1.0" - scheduler: "npm:^0.23.0" + scheduler: "npm:^0.23.2" + peerDependencies: + react: ^18.3.1 + checksum: 10/3f4b73a3aa083091173b29812b10394dd06f4ac06aff410b74702cfb3aa29d7b0ced208aab92d5272919b612e5cda21aeb1d54191848cf6e46e9e354f3541f81 + languageName: node + linkType: hard + +"react-refresh@npm:^0.17.0": + version: 0.17.0 + resolution: "react-refresh@npm:0.17.0" + checksum: 10/5e94f07d43bb1cfdc9b0c6e0c8c73e754005489950dcff1edb53aa8451d1d69a47b740b195c7c80fb4eb511c56a3585dc55eddd83f0097fb5e015116a1460467 + languageName: node + linkType: hard + +"react-router-dom@npm:^6.8.0": + version: 6.30.1 + resolution: "react-router-dom@npm:6.30.1" + dependencies: + "@remix-run/router": "npm:1.23.0" + react-router: "npm:6.30.1" peerDependencies: - react: ^18.2.0 - checksum: 10/ca5e7762ec8c17a472a3605b6f111895c9f87ac7d43a610ab7024f68cd833d08eda0625ce02ec7178cc1f3c957cf0b9273cdc17aa2cd02da87544331c43b1d21 + react: ">=16.8" + react-dom: ">=16.8" + checksum: 10/d61f04a36ca8a0a61e71bac2616f3f0d4142ced4a473d872738ca363b43d042f4d6dc249e7f7ae1c06f89599277e2fde11583d61cf6b34e999e79caf845acb37 languageName: node linkType: hard -"react-refresh@npm:^0.14.0": - version: 0.14.0 - resolution: "react-refresh@npm:0.14.0" - checksum: 10/75941262ce3ed4fc79b52492943fd59692f29b84f30f3822713b7e920f28e85c62a4386f85cbfbaea95ed62d3e74209f0a0bb065904b7ab2f166a74ac3812e2a +"react-router@npm:6.30.1": + version: 6.30.1 + resolution: "react-router@npm:6.30.1" + dependencies: + "@remix-run/router": "npm:1.23.0" + peerDependencies: + react: ">=16.8" + checksum: 10/880d6cafd6376dd1e624f6f600b7a208c4142d60eaea66241980ef57260c237b3465c3ff96b28f21ae354410345bbbb1817c3bba083012aade6626027d53506f languageName: node linkType: hard "react@npm:^18.2.0": - version: 18.2.0 - resolution: "react@npm:18.2.0" + version: 18.3.1 + resolution: "react@npm:18.3.1" dependencies: loose-envify: "npm:^1.1.0" - checksum: 10/b9214a9bd79e99d08de55f8bef2b7fc8c39630be97c4e29d7be173d14a9a10670b5325e94485f74cd8bff4966ef3c78ee53c79a7b0b9b70cba20aa8973acc694 + checksum: 10/261137d3f3993eaa2368a83110466fc0e558bc2c7f7ae7ca52d94f03aac945f45146bd85e5f481044db1758a1dbb57879e2fcdd33924e2dde1bdc550ce73f7bf languageName: node linkType: hard @@ -6335,17 +6745,6 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.6.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: "npm:^2.0.3" - string_decoder: "npm:^1.1.1" - util-deprecate: "npm:^1.0.1" - checksum: 10/d9e3e53193adcdb79d8f10f2a1f6989bd4389f5936c6f8b870e77570853561c362bee69feca2bbb7b32368ce96a85504aa4cedf7cf80f36e6a9de30d64244048 - languageName: node - linkType: hard - "readdirp@npm:^2.2.1": version: 2.2.1 resolution: "readdirp@npm:2.2.1" @@ -6357,6 +6756,22 @@ __metadata: languageName: node linkType: hard +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.9" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.1" + which-builtin-type: "npm:^1.2.1" + checksum: 10/80a4e2be716f4fe46a89a08ccad0863b47e8ce0f49616cab2d65dab0fbd53c6fdba0f52935fd41d37a2e4e22355c272004f920d63070de849f66eea7aeb4a081 + languageName: node + linkType: hard + "regex-not@npm:^1.0.0, regex-not@npm:^1.0.2": version: 1.0.2 resolution: "regex-not@npm:1.0.2" @@ -6367,6 +6782,20 @@ __metadata: languageName: node linkType: hard +"regexp.prototype.flags@npm:^1.5.4": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + set-function-name: "npm:^2.0.2" + checksum: 10/8ab897ca445968e0b96f6237641510f3243e59c180ee2ee8d83889c52ff735dd1bf3657fcd36db053e35e1d823dd53f2565d0b8021ea282c9fe62401c6c3bd6d + languageName: node + linkType: hard + "registry-auth-token@npm:3.3.2": version: 3.3.2 resolution: "registry-auth-token@npm:3.3.2" @@ -6439,20 +6868,28 @@ __metadata: linkType: hard "resolve@npm:^1.10.0": - version: 1.17.0 - resolution: "resolve@npm:1.17.0" + version: 1.22.10 + resolution: "resolve@npm:1.22.10" dependencies: - path-parse: "npm:^1.0.6" - checksum: 10/74141da8c56192fd46f6aa887864f8fd74c1755425174526610cb775177278bb414c6f6feb3051ccd73d774d2ae124c6c97e463e30d7ffd9a87f7da202b851dd + is-core-module: "npm:^2.16.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/0a398b44da5c05e6e421d70108822c327675febb880eebe905587628de401854c61d5df02866ff34fc4cb1173a51c9f0e84a94702738df3611a62e2acdc68181 languageName: node linkType: hard "resolve@patch:resolve@npm%3A^1.10.0#optional!builtin": - version: 1.17.0 - resolution: "resolve@patch:resolve@npm%3A1.17.0#optional!builtin::version=1.17.0&hash=c3c19d" + version: 1.22.10 + resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" dependencies: - path-parse: "npm:^1.0.6" - checksum: 10/02e87fe9233d169fdc5220572c7b8933c9e23323aaecfd5b8d0b106a7f09dc676dd4d380e66c72b1369489292bcb337b13aad28b480a1bde5a5c040ff16758ea + is-core-module: "npm:^2.16.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/d4d878bfe3702d215ea23e75e0e9caf99468e3db76f5ca100d27ebdc527366fee3877e54bce7d47cc72ca8952fc2782a070d238bfa79a550eeb0082384c3b81a languageName: node linkType: hard @@ -6471,9 +6908,9 @@ __metadata: linkType: hard "reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: 10/14222c9e1d3f9ae01480c50d96057228a8524706db79cdeb5a2ce5bb7070dd9f409a6f84a02cbef8cdc80d39aef86f2dd03d155188a1300c599b05437dcd2ffb + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 10/af47851b547e8a8dc89af144fceee17b80d5beaf5e6f57ed086432d79943434ff67ca526e92275be6f54b6189f6920a24eace75c2657eed32d02c400312b21ec languageName: node linkType: hard @@ -6488,24 +6925,31 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.2.0": - version: 4.13.0 - resolution: "rollup@npm:4.13.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.13.0" - "@rollup/rollup-android-arm64": "npm:4.13.0" - "@rollup/rollup-darwin-arm64": "npm:4.13.0" - "@rollup/rollup-darwin-x64": "npm:4.13.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.13.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.13.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.13.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.13.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.13.0" - "@rollup/rollup-linux-x64-musl": "npm:4.13.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.13.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.13.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.13.0" - "@types/estree": "npm:1.0.5" +"rollup@npm:^4.20.0": + version: 4.41.1 + resolution: "rollup@npm:4.41.1" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.41.1" + "@rollup/rollup-android-arm64": "npm:4.41.1" + "@rollup/rollup-darwin-arm64": "npm:4.41.1" + "@rollup/rollup-darwin-x64": "npm:4.41.1" + "@rollup/rollup-freebsd-arm64": "npm:4.41.1" + "@rollup/rollup-freebsd-x64": "npm:4.41.1" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.41.1" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.41.1" + "@rollup/rollup-linux-arm64-gnu": "npm:4.41.1" + "@rollup/rollup-linux-arm64-musl": "npm:4.41.1" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.41.1" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.41.1" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.41.1" + "@rollup/rollup-linux-riscv64-musl": "npm:4.41.1" + "@rollup/rollup-linux-s390x-gnu": "npm:4.41.1" + "@rollup/rollup-linux-x64-gnu": "npm:4.41.1" + "@rollup/rollup-linux-x64-musl": "npm:4.41.1" + "@rollup/rollup-win32-arm64-msvc": "npm:4.41.1" + "@rollup/rollup-win32-ia32-msvc": "npm:4.41.1" + "@rollup/rollup-win32-x64-msvc": "npm:4.41.1" + "@types/estree": "npm:1.0.7" fsevents: "npm:~2.3.2" dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -6516,14 +6960,28 @@ __metadata: optional: true "@rollup/rollup-darwin-x64": optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true "@rollup/rollup-linux-arm-gnueabihf": optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true "@rollup/rollup-linux-arm64-gnu": optional: true "@rollup/rollup-linux-arm64-musl": optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true "@rollup/rollup-linux-riscv64-gnu": optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true "@rollup/rollup-linux-x64-gnu": optional: true "@rollup/rollup-linux-x64-musl": @@ -6538,14 +6996,29 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10/3ebced8ad49e8b5617cb7013cb106dd8ac99ae31a71f9689dc689b8fdaf0eb109f3d861330ef659e5f28a2c38e040282aea0e1df150b165f53f649d46275df84 + checksum: 10/b7b5a5668bc05445766b1b7342475d9dbb173925e806805720bcfad277a591c5452f11fe1f1fd9f8030b4e52f093610a10200599258ad5faad9104944b984c36 languageName: node linkType: hard "run-parallel@npm:^1.1.9": - version: 1.1.9 - resolution: "run-parallel@npm:1.1.9" - checksum: 10/8bbeda89c2c1dbfeaa0cdb9f17e93a011ac58ef77339ef1e61a62208b67c8e7b661891df677bb7c5be84b8792e27061177368d500b3c731bb019b0c71e667591 + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10/cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + has-symbols: "npm:^1.1.0" + isarray: "npm:^2.0.5" + checksum: 10/fac4f40f20a3f7da024b54792fcc61059e814566dcbb04586bfefef4d3b942b2408933f25b7b3dd024affd3f2a6bbc916bef04807855e4f192413941369db864 languageName: node linkType: hard @@ -6556,13 +7029,34 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10/32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451 languageName: node linkType: hard +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + isarray: "npm:^2.0.5" + checksum: 10/2bd4e53b6694f7134b9cf93631480e7fafc8637165f0ee91d5a4af5e7f33d37de9562d1af5021178dd4217d0230cde8d6530fa28cfa1ebff9a431bf8fff124b4 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.2.1" + checksum: 10/ebdb61f305bf4756a5b023ad86067df5a11b26898573afe9e52a548a63c3bd594825d9b0e2dde2eb3c94e57e0e04ac9929d4107c394f7b8e56a4613bed46c69a + languageName: node + linkType: hard + "safe-regex@npm:^1.1.0": version: 1.1.0 resolution: "safe-regex@npm:1.1.0" @@ -6579,21 +7073,12 @@ __metadata: languageName: node linkType: hard -"saslprep@npm:^1.0.3": - version: 1.0.3 - resolution: "saslprep@npm:1.0.3" - dependencies: - sparse-bitfield: "npm:^3.0.3" - checksum: 10/d6cae5f0adc960f355b7a78c25616c2aea31e7eeb6322eb2d553f09f1db249594651c1e5d54910e9a47b1dc6131beda82db13ffafbceea92f2a673d69c839982 - languageName: node - linkType: hard - -"scheduler@npm:^0.23.0": - version: 0.23.0 - resolution: "scheduler@npm:0.23.0" +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" dependencies: loose-envify: "npm:^1.1.0" - checksum: 10/0c4557aa37bafca44ff21dc0ea7c92e2dbcb298bc62eae92b29a39b029134f02fb23917d6ebc8b1fa536b4184934314c20d8864d156a9f6357f3398aaf7bfda8 + checksum: 10/e8d68b89d18d5b028223edf090092846868a765a591944760942b77ea1f69b17235f7e956696efbb62c8130ab90af7e0949bfb8eba7896335507317236966bc9 languageName: node linkType: hard @@ -6614,11 +7099,11 @@ __metadata: linkType: hard "semver@npm:2 || 3 || 4 || 5, semver@npm:^5.0.3, semver@npm:^5.1.0, semver@npm:^5.5.0": - version: 5.7.1 - resolution: "semver@npm:5.7.1" + version: 5.7.2 + resolution: "semver@npm:5.7.2" bin: - semver: ./bin/semver - checksum: 10/fbc71cf00736480ca0dd67f2527cda6e0fde5447af00bd2ce06cb522d510216603a63ed0c6c87d8904507c1a4e8113e628a71424ebd9e0fd7d345ee8ed249690 + semver: bin/semver + checksum: 10/fca14418a174d4b4ef1fecb32c5941e3412d52a4d3d85165924ce3a47fbc7073372c26faf7484ceb4bbc2bde25880c6b97e492473dc7e9708fdfb1c6a02d546e languageName: node linkType: hard @@ -6632,19 +7117,17 @@ __metadata: linkType: hard "semver@npm:^7.3.5, semver@npm:^7.3.7": - version: 7.5.1 - resolution: "semver@npm:7.5.1" - dependencies: - lru-cache: "npm:^6.0.0" + version: 7.7.2 + resolution: "semver@npm:7.7.2" bin: semver: bin/semver.js - checksum: 10/01fcb5ff66fb8cb9ff54e898ac9786fbafec65f93d0df910ea9300451719b204b1c5e8007c99c1abb410eb60f84497a1f8c02b1a0e97880842b7f6075e1d82b6 + checksum: 10/7a24cffcaa13f53c09ce55e05efe25cd41328730b2308678624f8b9f5fc3093fc4d189f47950f0b811ff8f3c3039c24a2c36717ba7961615c682045bf03e1dda languageName: node linkType: hard -"send@npm:0.18.0": - version: 0.18.0 - resolution: "send@npm:0.18.0" +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" dependencies: debug: "npm:2.6.9" depd: "npm:2.0.0" @@ -6659,44 +7142,43 @@ __metadata: on-finished: "npm:2.4.1" range-parser: "npm:~1.2.1" statuses: "npm:2.0.1" - checksum: 10/ec66c0ad109680ad8141d507677cfd8b4e40b9559de23191871803ed241718e99026faa46c398dcfb9250676076573bd6bfe5d0ec347f88f4b7b8533d1d391cb + checksum: 10/1f6064dea0ae4cbe4878437aedc9270c33f2a6650a77b56a16b62d057527f2766d96ee282997dd53ec0339082f2aad935bc7d989b46b48c82fc610800dc3a1d0 languageName: node linkType: hard -"serve-handler@npm:6.1.5": - version: 6.1.5 - resolution: "serve-handler@npm:6.1.5" +"serve-handler@npm:6.1.6": + version: 6.1.6 + resolution: "serve-handler@npm:6.1.6" dependencies: bytes: "npm:3.0.0" content-disposition: "npm:0.5.2" - fast-url-parser: "npm:1.1.3" mime-types: "npm:2.1.18" minimatch: "npm:3.1.2" path-is-inside: "npm:1.0.2" - path-to-regexp: "npm:2.2.1" + path-to-regexp: "npm:3.3.0" range-parser: "npm:1.2.0" - checksum: 10/cab6f381d380ae77ae6da017b5c7b1c25d8f0bed00cf509a18bc768c1830a0043ce53668390ad8a84366e47b353b3f1f7c9d10c7167886179f2e89cb95243a90 + checksum: 10/7e7d93eb7e69fcd9f9c5afc2ef2b46cb0072b4af13cbabef9bca725afb350ddae6857d8c8be2c256f7ce1f7677c20347801399c11caa5805c0090339f894e8f2 languageName: node linkType: hard -"serve-static@npm:1.15.0": - version: 1.15.0 - resolution: "serve-static@npm:1.15.0" +"serve-static@npm:1.16.2": + version: 1.16.2 + resolution: "serve-static@npm:1.16.2" dependencies: - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" parseurl: "npm:~1.3.3" - send: "npm:0.18.0" - checksum: 10/699b2d4c29807a51d9b5e0f24955346911437aebb0178b3c4833ad30d3eca93385ff9927254f5c16da345903cad39d9cd4a532198c95a5129cc4ed43911b15a4 + send: "npm:0.19.0" + checksum: 10/7fa9d9c68090f6289976b34fc13c50ac8cd7f16ae6bce08d16459300f7fc61fbc2d7ebfa02884c073ec9d6ab9e7e704c89561882bbe338e99fcacb2912fde737 languageName: node linkType: hard "serve@npm:^14.2.0": - version: 14.2.0 - resolution: "serve@npm:14.2.0" + version: 14.2.4 + resolution: "serve@npm:14.2.4" dependencies: - "@zeit/schemas": "npm:2.29.0" - ajv: "npm:8.11.0" + "@zeit/schemas": "npm:2.36.0" + ajv: "npm:8.12.0" arg: "npm:5.0.2" boxen: "npm:7.0.0" chalk: "npm:5.0.1" @@ -6704,18 +7186,48 @@ __metadata: clipboardy: "npm:3.0.0" compression: "npm:1.7.4" is-port-reachable: "npm:4.0.0" - serve-handler: "npm:6.1.5" + serve-handler: "npm:6.1.6" update-check: "npm:1.5.4" bin: serve: build/main.js - checksum: 10/0fcc61d73b6b8f3d21eec690905d3843b4d0b27bbc552a8a998467bb4a40711e96b1164577560fb9023625e51d50d93011d2ca67966a16c86169addc913776ef + checksum: 10/79627f399226b765f6e2f0f62faeceda5db17d00f40f9ad9faa39049729ea4ce7b595a72cc0dba3543947288772cb60f2b0ab91efa3bbedfe644ca7ee0484df1 languageName: node linkType: hard -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 10/8980ebf7ae9eb945bb036b6e283c547ee783a1ad557a82babf758a065e2fb6ea337fd82cac30dd565c1e606e423f30024a19fff7afbf4977d784720c4026a8ef +"set-function-length@npm:^1.2.2": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 10/505d62b8e088468917ca4e3f8f39d0e29f9a563b97dbebf92f4bd2c3172ccfb3c5b8e4566d5fcd00784a00433900e7cb8fbc404e2dbd8c3818ba05bb9d4a8a6d + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + checksum: 10/c7614154a53ebf8c0428a6c40a3b0b47dac30587c1a19703d1b75f003803f73cdfa6a93474a9ba678fa565ef5fbddc2fae79bca03b7d22ab5fd5163dbe571a74 + languageName: node + linkType: hard + +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10/b87f8187bca595ddc3c0721ece4635015fd9d7cb294e6dd2e394ce5186a71bbfa4dc8a35010958c65e43ad83cde09642660e61a952883c24fd6b45ead15f045c languageName: node linkType: hard @@ -6771,37 +7283,74 @@ __metadata: linkType: hard "shell-quote@npm:^1.6.1": - version: 1.7.2 - resolution: "shell-quote@npm:1.7.2" - checksum: 10/5d7540d320ee5acb5a1d5ca3163d5706fbe055cc4e0adf6f1f85ef8f54c55b453c492d125c450f20d9bec223dcac9df4c74510b4ea3ff4c24f15f7d848a0fc4c + version: 1.8.2 + resolution: "shell-quote@npm:1.8.2" + checksum: 10/3ae4804fd80a12ba07650d0262804ae3b479a62a6b6971a6dc5fa12995507aa63d3de3e6a8b7a8d18f4ce6eb118b7d75db7fcb2c0acbf016f210f746b10cfe02 languageName: node linkType: hard -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" dependencies: - call-bind: "npm:^1.0.0" - get-intrinsic: "npm:^1.0.2" - object-inspect: "npm:^1.9.0" - checksum: 10/c4998d9fc530b0e75a7fd791ad868fdc42846f072734f9080ff55cc8dc7d3899abcda24fd896aa6648c3ab7021b4bb478073eb4f44dfd55bce9714bc1a7c5d45 + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + checksum: 10/603b928997abd21c5a5f02ae6b9cc36b72e3176ad6827fab0417ead74580cc4fb4d5c7d0a8a2ff4ead34d0f9e35701ed7a41853dac8a6d1a664fcce1a044f86f languageName: node linkType: hard -"signal-exit@npm:^3.0.0": - version: 3.0.3 - resolution: "signal-exit@npm:3.0.3" - checksum: 10/f0169d3f1263d06df32ca072b0bf33b34c6f8f0341a7a1621558a2444dfbe8f5fec76b35537fcc6f0bc4944bdb5336fe0bdcf41a5422c4e45a1dba3f45475e6c +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10/5771861f77feefe44f6195ed077a9e4f389acc188f895f570d56445e251b861754b547ea9ef73ecee4e01fdada6568bfe9020d2ec2dfc5571e9fa1bbc4a10615 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10/a815c89bc78c5723c714ea1a77c938377ea710af20d4fb886d362b0d1f8ac73a17816a5f6640f354017d7e292a43da9c5e876c22145bac00b76cfb3468001736 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + side-channel-list: "npm:^1.0.0" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10/7d53b9db292c6262f326b6ff3bc1611db84ece36c2c7dc0e937954c13c73185b0406c56589e2bb8d071d6fee468e14c39fb5d203ee39be66b7b8174f179afaba languageName: node linkType: hard -"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10/a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 languageName: node linkType: hard +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10/c9fa63bbbd7431066174a48ba2dd9986dfd930c3a8b59de9c29d7b6854ec1c12a80d15310869ea5166d413b99f041bfa3dd80a7947bcd44ea8e6eb3ffeabfa1f + languageName: node + linkType: hard + "simplex-noise@npm:^2.4.0": version: 2.4.0 resolution: "simplex-noise@npm:2.4.0" @@ -6859,31 +7408,31 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" dependencies: - agent-base: "npm:^6.0.2" - debug: "npm:^4.3.3" - socks: "npm:^2.6.2" - checksum: 10/26c75d9c62a9ed3fd494df60e65e88da442f78e0d4bc19bfd85ac37bd2c67470d6d4bba5202e804561cda6674db52864c9e2a2266775f879bc8d89c1445a5f4c + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10/ee99e1dacab0985b52cbe5a75640be6e604135e9489ebdc3048635d186012fbaecc20fbbe04b177dee434c319ba20f09b3e7dfefb7d932466c0d707744eac05c languageName: node linkType: hard -"socks@npm:^2.6.2, socks@npm:^2.7.1": - version: 2.7.1 - resolution: "socks@npm:2.7.1" +"socks@npm:^2.7.1, socks@npm:^2.8.3": + version: 2.8.4 + resolution: "socks@npm:2.8.4" dependencies: - ip: "npm:^2.0.0" + ip-address: "npm:^9.0.5" smart-buffer: "npm:^4.2.0" - checksum: 10/5074f7d6a13b3155fa655191df1c7e7a48ce3234b8ccf99afa2ccb56591c195e75e8bb78486f8e9ea8168e95a29573cbaad55b2b5e195160ae4d2ea6811ba833 + checksum: 10/ab3af97aeb162f32c80e176c717ccf16a11a6ebb4656a62b94c0f96495ea2a1f4a8206c04b54438558485d83d0c5f61920c07a1a5d3963892a589b40cc6107dd languageName: node linkType: hard -"source-map-js@npm:^1.1.0": - version: 1.1.0 - resolution: "source-map-js@npm:1.1.0" - checksum: 10/6319690f50f8da9445433d7edfb8cc4ffd42b9deb69739c73bb65992c61dfdf6f5979f49d4a25e85e51ebf235fde65e061291e8ee2a68da2b87a38c62cb4aef4 +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10/ff9d8c8bf096d534a5b7707e0382ef827b4dd360a577d3f34d2b9f48e12c9d230b5747974ee7c607f0df65113732711bb701fe9ece3c7edbd43cb2294d707df3 languageName: node linkType: hard @@ -6924,19 +7473,19 @@ __metadata: linkType: hard "spdx-correct@npm:^3.0.0": - version: 3.1.1 - resolution: "spdx-correct@npm:3.1.1" + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" dependencies: spdx-expression-parse: "npm:^3.0.0" spdx-license-ids: "npm:^3.0.0" - checksum: 10/688e028c3ca6090d1b516272a2dd60b30f163cbf166295ac4b8078fd74f524365cd996e2b18cabdaa41647aa806e117604aa3b3216f69076a554999913d09d47 + checksum: 10/cc2e4dbef822f6d12142116557d63f5facf3300e92a6bd24e907e4865e17b7e1abd0ee6b67f305cae6790fc2194175a24dc394bfcc01eea84e2bdad728e9ae9a languageName: node linkType: hard "spdx-exceptions@npm:^2.1.0": - version: 2.3.0 - resolution: "spdx-exceptions@npm:2.3.0" - checksum: 10/cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: 10/bb127d6e2532de65b912f7c99fc66097cdea7d64c10d3ec9b5e96524dbbd7d20e01cba818a6ddb2ae75e62bb0c63d5e277a7e555a85cbc8ab40044984fa4ae15 languageName: node linkType: hard @@ -6951,9 +7500,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.5 - resolution: "spdx-license-ids@npm:3.0.5" - checksum: 10/a5b78b6765826db9a98c890588e474fadb06dfaecc7b579b545ccc11f0a9739f097d11d741c1e0302562884f5d6e3ce0008ca68fa0036646831e0e61331b85b0 + version: 3.0.21 + resolution: "spdx-license-ids@npm:3.0.21" + checksum: 10/17a033b4c3485f081fc9faa1729dde8782a85d9131b156f2397c71256c2e1663132857d3cba1457c4965f179a4dcf1b69458a31e9d3d0c766d057ef0e3a0b4f2 languageName: node linkType: hard @@ -6966,12 +7515,19 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^9.0.0": - version: 9.0.1 - resolution: "ssri@npm:9.0.1" +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10/e7587128c423f7e43cc625fe2f87e6affdf5ca51c1cc468e910d8aaca46bb44a7fbcfa552f787b1d3987f7043aeb4527d1b99559e6621e01b42b3f45e5a24cbb + languageName: node + linkType: hard + +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" dependencies: - minipass: "npm:^3.1.1" - checksum: 10/7638a61e91432510718e9265d48d0438a17d53065e5184f1336f234ef6aa3479663942e41e97df56cda06bb24d9d0b5ef342c10685add3cac7267a82d7fa6718 + minipass: "npm:^7.0.3" + checksum: 10/7024c1a6e39b3f18aa8f1c8290e884fe91b0f9ca5a6c6d410544daad54de0ba664db879afe16412e187c6c292fd60b937f047ee44292e5c2af2dcc6d8e1a9b48 languageName: node linkType: hard @@ -6992,7 +7548,7 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -7025,41 +7581,52 @@ __metadata: linkType: hard "string.prototype.padend@npm:^3.0.0": - version: 3.1.0 - resolution: "string.prototype.padend@npm:3.1.0" + version: 3.1.6 + resolution: "string.prototype.padend@npm:3.1.6" dependencies: - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.17.0-next.1" - checksum: 10/22981a2aa20010c6322f02e83d66c502af8d690d070865e4b0c9fd8f7daf706100382f11865702f66e977666fc1afd7a4c2da6f23e8c15d0841f236a6f7c4ba4 + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10/52cebc58a0252ef45dd0fec3ee4e8655bcc8b6c07b4956c5965542316f5ab3a38ca8d1d06e9804979828fba9de61e59294fe23f64e5d413ac40963a4d4969c19 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.1": - version: 1.0.1 - resolution: "string.prototype.trimend@npm:1.0.1" +"string.prototype.trim@npm:^1.2.10": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" dependencies: - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.17.5" - checksum: 10/e4e2c21f0145a6fa8c111b1bee6075d509a40702611329bcebd7ffc5cc13562cfa99636faeacccbea306d01c023dc763ce0cf38cf5d7b654705b74847b0f0e57 + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-data-property: "npm:^1.1.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-object-atoms: "npm:^1.0.0" + has-property-descriptors: "npm:^1.0.2" + checksum: 10/47bb63cd2470a64bc5e2da1e570d369c016ccaa85c918c3a8bb4ab5965120f35e66d1f85ea544496fac84b9207a6b722adf007e6c548acd0813e5f8a82f9712a languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.1": - version: 1.0.1 - resolution: "string.prototype.trimstart@npm:1.0.1" +"string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" dependencies: - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.17.5" - checksum: 10/0fe3cad8d597a418b058b6ec2d5c48b73172c71cb60089a0a38373eb3c2d501c4d9a00bbfad90e581c2ecf136f10f85a9dc664390e059b805dae9e4707465e0f + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/140c73899b6747de9e499c7c2e7a83d549c47a26fa06045b69492be9cfb9e2a95187499a373983a08a115ecff8bc3bd7b0fb09b8ff72fb2172abe766849272ef languageName: node linkType: hard -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" dependencies: - safe-buffer: "npm:~5.2.0" - checksum: 10/54d23f4a6acae0e93f999a585e673be9e561b65cd4cca37714af1e893ab8cd8dfa52a9e4f58f48f87b4a44918d3a9254326cb80ed194bf2e4c226e2b21767e56 + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/160167dfbd68e6f7cb9f51a16074eebfce1571656fc31d40c3738ca9e30e35496f2c046fe57b6ad49f65f238a152be8c86fd9a2dd58682b5eba39dad995b3674 languageName: node linkType: hard @@ -7072,6 +7639,15 @@ __metadata: languageName: node linkType: hard +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10/ae3b5436d34fadeb6096367626ce987057713c566e1e7768818797e00ac5d62023d0f198c4e681eae9e20701721980b26a64a8f5b91238869592a9c6800719a2 + languageName: node + linkType: hard + "strip-ansi@npm:^4.0.0": version: 4.0.0 resolution: "strip-ansi@npm:4.0.0" @@ -7081,15 +7657,6 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: "npm:^5.0.1" - checksum: 10/ae3b5436d34fadeb6096367626ce987057713c566e1e7768818797e00ac5d62023d0f198c4e681eae9e20701721980b26a64a8f5b91238869592a9c6800719a2 - languageName: node - linkType: hard - "strip-ansi@npm:^7.0.1": version: 7.1.0 resolution: "strip-ansi@npm:7.1.0" @@ -7120,7 +7687,7 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": +"strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 10/492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 @@ -7135,9 +7702,9 @@ __metadata: linkType: hard "strnum@npm:^1.0.5": - version: 1.0.5 - resolution: "strnum@npm:1.0.5" - checksum: 10/d3117975db8372d4d7b2c07601ed2f65bf21cc48d741f37a8617b76370d228f2ec26336e53791ebc3638264d23ca54e6c241f57f8c69bd4941c63c79440525ca + version: 1.1.2 + resolution: "strnum@npm:1.1.2" + checksum: 10/ccd6297a1fdaf0fc8ea0ea904acdae76878d49a4b0d98a70155df4bc081fd88eac5ec99fb150f3d1d1af065c1898d38420705259ba6c39aa850c671bcd54e35d languageName: node linkType: hard @@ -7159,17 +7726,24 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.1.15 - resolution: "tar@npm:6.1.15" +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10/a9dc19ae2220c952bd2231d08ddeecb1b0328b61e72071ff4000c8384e145cc07c1c0bdb3b5a1cb06e186a7b2790f1dee793418b332f6ddf320de25d9125be7e + languageName: node + linkType: hard + +"tar@npm:^7.4.3": + version: 7.4.3 + resolution: "tar@npm:7.4.3" dependencies: - chownr: "npm:^2.0.0" - fs-minipass: "npm:^2.0.0" - minipass: "npm:^5.0.0" - minizlib: "npm:^2.1.1" - mkdirp: "npm:^1.0.3" - yallist: "npm:^4.0.0" - checksum: 10/4848b92da8581e64ce4d8a760b47468dd9d212a4612846d8dd75b5c224a42c66ed5bcf8cfa9e9cd2eb64ebe1351413fb3eac93324a4eee536f0941beefa1f2eb + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.0.1" + mkdirp: "npm:^3.0.1" + yallist: "npm:^5.0.0" + checksum: 10/12a2a4fc6dee23e07cc47f1aeb3a14a1afd3f16397e1350036a8f4cdfee8dcac7ef5978337a4e7b2ac2c27a9a6d46388fc2088ea7c80cb6878c814b1425f8ecf languageName: node linkType: hard @@ -7196,10 +7770,13 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: 10/be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 +"tinyglobby@npm:^0.2.12": + version: 0.2.13 + resolution: "tinyglobby@npm:0.2.13" + dependencies: + fdir: "npm:^6.4.4" + picomatch: "npm:^4.0.2" + checksum: 10/b04557ee58ad2be5f2d2cbb4b441476436c92bb45ba2e1fc464d686b793392b305ed0bcb8b877429e9b5036bdd46770c161a08384c0720b6682b7cd6ac80e403 languageName: node linkType: hard @@ -7251,13 +7828,11 @@ __metadata: linkType: hard "touch@npm:^3.1.0": - version: 3.1.0 - resolution: "touch@npm:3.1.0" - dependencies: - nopt: "npm:~1.0.10" + version: 3.1.1 + resolution: "touch@npm:3.1.1" bin: - nodetouch: ./bin/nodetouch.js - checksum: 10/ece1d9693fbc9b73d8a6d902537b787b5685ac1aeab7562857c50e6671415a73c985055393442b518f4ac37b85c3e7a3e6c36af71142fed13b8bb04fb6664936 + nodetouch: bin/nodetouch.js + checksum: 10/853e763a1f4903302c5654ed353f84ad85baf757dac62c2d37ab67e0477cfd271e8c64771fcfad42310aff7c9d284ddb435ee5ca13ff36d0f3693fedd8e971d1 languageName: node linkType: hard @@ -7270,24 +7845,26 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.11.1": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: 10/7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb +"tr46@npm:^5.1.0": + version: 5.1.1 + resolution: "tr46@npm:5.1.1" + dependencies: + punycode: "npm:^2.3.1" + checksum: 10/833a0e1044574da5790148fd17866d4ddaea89e022de50279967bcd6b28b4ce0d30d59eb3acf9702b60918975b3bad481400337e3a2e6326cffa5c77b874753d languageName: node linkType: hard "tslib@npm:^1.8.1": - version: 1.13.0 - resolution: "tslib@npm:1.13.0" - checksum: 10/703f52fe8437e3aa3f85f8811dced64c99eb44b6d67cb84acacf64d68fbabedae23b429973af3b4872f497b4b497f5b2019a479666ef1cb8e5b71c8c3862687f + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: 10/7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb languageName: node linkType: hard -"tslib@npm:^2.3.1, tslib@npm:^2.5.0": - version: 2.5.3 - resolution: "tslib@npm:2.5.3" - checksum: 10/d507e60ebe2480af4efc1655dfdb2762bb6ca57d76c4ba680375af801493648c2e97808bbd7e54691eb40e33a7e2e793cdef9c24ce6a8539b03cac8b26e09a61 +"tslib@npm:^2.6.2": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 languageName: node linkType: hard @@ -7341,23 +7918,88 @@ __metadata: languageName: node linkType: hard +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.14" + checksum: 10/3fb91f0735fb413b2bbaaca9fabe7b8fc14a3fa5a5a7546bab8a57e755be0e3788d893195ad9c2b842620592de0e68d4c077d4c2c41f04ec25b8b5bb82fa9a80 + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.8" + for-each: "npm:^0.3.3" + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.14" + checksum: 10/269dad101dda73e3110117a9b84db86f0b5c07dad3a9418116fd38d580cab7fc628a4fc167e29b6d7c39da2f53374b78e7cb578b3c5ec7a556689d985d193519 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-byte-offset@npm:1.0.4" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + for-each: "npm:^0.3.3" + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.15" + reflect.getprototypeof: "npm:^1.0.9" + checksum: 10/c2869aa584cdae24ecfd282f20a0f556b13a49a9d5bca1713370bb3c89dff0ccbc5ceb45cb5b784c98f4579e5e3e2a07e438c3a5b8294583e2bd4abbd5104fb5 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.7": + version: 1.0.7 + resolution: "typed-array-length@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + is-typed-array: "npm:^1.1.13" + possible-typed-array-names: "npm:^1.0.0" + reflect.getprototypeof: "npm:^1.0.6" + checksum: 10/d6b2f0e81161682d2726eb92b1dc2b0890890f9930f33f9bcf6fc7272895ce66bc368066d273e6677776de167608adc53fcf81f1be39a146d64b630edbf2081c + languageName: node + linkType: hard + "typescript@npm:^5.5.3": - version: 5.5.3 - resolution: "typescript@npm:5.5.3" + version: 5.8.3 + resolution: "typescript@npm:5.8.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/11a867312419ed497929aafd2f1d28b2cd41810a5eb6c6e9e169559112e9ea073d681c121a29102e67cd4478d0a4ae37a306a5800f3717f59c4337e6a9bd5e8d + checksum: 10/65c40944c51b513b0172c6710ee62e951b70af6f75d5a5da745cb7fab132c09ae27ffdf7838996e3ed603bb015dadd099006658046941bd0ba30340cc563ae92 languageName: node linkType: hard "typescript@patch:typescript@npm%3A^5.5.3#optional!builtin": - version: 5.5.3 - resolution: "typescript@patch:typescript@npm%3A5.5.3#optional!builtin::version=5.5.3&hash=379a07" + version: 5.8.3 + resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=379a07" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/7cf7acb78a80f749b82842f2ffe01e90e7b3e709a6f4268588e0b7599c41dca1059be217f47778fe1a380bfaf60933021ef20d002c426d4d7745e1b36c11467b + checksum: 10/98470634034ec37fd9ea61cc82dcf9a27950d0117a4646146b767d085a2ec14b137aae9642a83d1c62732d7fdcdac19bb6288b0bb468a72f7a06ae4e1d2c72c9 + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + which-boxed-primitive: "npm:^1.1.1" + checksum: 10/fadb347020f66b2c8aeacf8b9a79826fa34cc5e5457af4eb0bbc4e79bd87fed0fa795949825df534320f7c13f199259516ad30abc55a6e7b91d8d996ca069e50 languageName: node linkType: hard @@ -7368,6 +8010,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10/ec8f41aa4359d50f9b59fa61fe3efce3477cc681908c8f84354d8567bb3701fafdddf36ef6bff307024d3feb42c837cf6f670314ba37fc8145e219560e473d14 + languageName: node + linkType: hard + "union-value@npm:^1.0.0": version: 1.0.1 resolution: "union-value@npm:1.0.1" @@ -7380,21 +8029,21 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^2.0.0": - version: 2.0.1 - resolution: "unique-filename@npm:2.0.1" +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" dependencies: - unique-slug: "npm:^3.0.0" - checksum: 10/807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f + unique-slug: "npm:^5.0.0" + checksum: 10/6a62094fcac286b9ec39edbd1f8f64ff92383baa430af303dfed1ffda5e47a08a6b316408554abfddd9730c78b6106bef4ca4d02c1231a735ddd56ced77573df languageName: node linkType: hard -"unique-slug@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-slug@npm:3.0.0" +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" dependencies: imurmurhash: "npm:^0.1.4" - checksum: 10/26fc5bc209a875956dd5e84ca39b89bc3be777b112504667c35c861f9547df95afc80439358d836b878b6d91f6ee21fe5ba1a966e9ec2e9f071ddf3fd67d45ee + checksum: 10/beafdf3d6f44990e0a5ce560f8f881b4ee811be70b6ba0db25298c31c8cf525ed963572b48cd03be1c1349084f9e339be4241666d7cf1ebdad20598d3c652b27 languageName: node linkType: hard @@ -7438,17 +8087,17 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" +"update-browserslist-db@npm:^1.1.3": + version: 1.1.3 + resolution: "update-browserslist-db@npm:1.1.3" dependencies: - escalade: "npm:^3.1.1" - picocolors: "npm:^1.0.0" + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10/9074b4ef34d2ed931f27d390aafdd391ee7c45ad83c508e8fed6aaae1eb68f81999a768ed8525c6f88d4001a4fbf1b8c0268f099d0e8e72088ec5945ac796acf + checksum: 10/87af2776054ffb9194cf95e0201547d041f72ee44ce54b144da110e65ea7ca01379367407ba21de5c9edd52c74d95395366790de67f3eb4cc4afa0fe4424e76f languageName: node linkType: hard @@ -7481,11 +8130,11 @@ __metadata: linkType: hard "uri-js@npm:^4.2.2": - version: 4.2.2 - resolution: "uri-js@npm:4.2.2" + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" dependencies: punycode: "npm:^2.1.0" - checksum: 10/e9499d30bfa7559acc255ab196bf7be0db9e5e5550cc0dfd8aeaeabbe423c323b18e261b31b996a409465b29f6ad814f8683f0c4f476ee347a57103dba0fb7f7 + checksum: 10/b271ca7e3d46b7160222e3afa3e531505161c9a4e097febae9664e4b59912f4cbe94861361a4175edac3a03fee99d91e44b6a58c17a634bc5a664b19fc76fbcb languageName: node linkType: hard @@ -7512,7 +8161,7 @@ __metadata: languageName: node linkType: hard -"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": +"util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" checksum: 10/474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 @@ -7526,12 +8175,12 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" +"uuid@npm:^10.0.0": + version: 10.0.0 + resolution: "uuid@npm:10.0.0" bin: uuid: dist/bin/uuid - checksum: 10/9a5f7aa1d6f56dd1e8d5f2478f855f25c645e64e26e347a98e98d95781d5ed20062d6cca2eecb58ba7c84bc3910be95c0451ef4161906abaab44f9cb68ffbdd1 + checksum: 10/35aa60614811a201ff90f8ca5e9ecb7076a75c3821e17f0f5ff72d44e36c2d35fcbc2ceee9c4ac7317f4cc41895da30e74f3885e30313bee48fda6338f250538 languageName: node linkType: hard @@ -7562,40 +8211,41 @@ __metadata: linkType: hard "vite-plugin-top-level-await@npm:^1.4.1": - version: 1.4.1 - resolution: "vite-plugin-top-level-await@npm:1.4.1" + version: 1.5.0 + resolution: "vite-plugin-top-level-await@npm:1.5.0" dependencies: "@rollup/plugin-virtual": "npm:^3.0.2" - "@swc/core": "npm:^1.3.100" - uuid: "npm:^9.0.1" + "@swc/core": "npm:^1.10.16" + uuid: "npm:^10.0.0" peerDependencies: vite: ">=2.8" - checksum: 10/68c82f5fa2e860ebe0867337ced237042127a03ec367cfeadb890dc20f623811263bac59a1afeac8b9ac7c11501752ded03cd035ac75c35d20531a7e42f096a7 + checksum: 10/d6875a20ba57d2f72616f41e35bf97477e1494a6185a21b054f0b08101347f78378b63d9866d46dca402d09c71cec7f4ef7584b6524bb178435ea627ea16da4d languageName: node linkType: hard "vite-plugin-wasm@npm:^3.3.0": - version: 3.3.0 - resolution: "vite-plugin-wasm@npm:3.3.0" + version: 3.4.1 + resolution: "vite-plugin-wasm@npm:3.4.1" peerDependencies: - vite: ^2 || ^3 || ^4 || ^5 - checksum: 10/1bcfb50f03280f1966247a4bf9e6ab3a4a76a26fa58fd178708cb3758629cffea544a13c87d0982de0a95a4b41bfc2ad46ae51d3b22080eec965ebfaa17e0454 + vite: ^2 || ^3 || ^4 || ^5 || ^6 + checksum: 10/4329318a6ece0e4021e89d83738bbe9214e85f93fd8cfe3a9026fcf46cf5fe9d921a37c1ef2f9c726c753e4ace203c575edfb10a14adf817b885a307c0cbb10c languageName: node linkType: hard "vite@npm:^5.1.6": - version: 5.1.6 - resolution: "vite@npm:5.1.6" + version: 5.4.19 + resolution: "vite@npm:5.4.19" dependencies: - esbuild: "npm:^0.19.3" + esbuild: "npm:^0.21.3" fsevents: "npm:~2.3.3" - postcss: "npm:^8.4.35" - rollup: "npm:^4.2.0" + postcss: "npm:^8.4.43" + rollup: "npm:^4.20.0" peerDependencies: "@types/node": ^18.0.0 || >=20.0.0 less: "*" lightningcss: ^1.21.0 sass: "*" + sass-embedded: "*" stylus: "*" sugarss: "*" terser: ^5.4.0 @@ -7611,6 +8261,8 @@ __metadata: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -7619,7 +8271,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10/f48073e93ead62fa58034398442de4517c824b3e50184f8b4059fb24077a26f2c04e910e29d7fb7ec51ea53eb61b9c7d94d56b14a38851de80c67480094cc79d + checksum: 10/27900c87ec6f84967ba12bd4a24c2b9182c3ddad278a13a1c7736ccc4ac7e325f3fbdc11836e2906857140cc89c55121cb0746d4100046e797e21e1e7570d9c4 languageName: node linkType: hard @@ -7640,6 +8292,77 @@ __metadata: languageName: node linkType: hard +"whatwg-url@npm:^14.1.0 || ^13.0.0": + version: 14.2.0 + resolution: "whatwg-url@npm:14.2.0" + dependencies: + tr46: "npm:^5.1.0" + webidl-conversions: "npm:^7.0.0" + checksum: 10/f0a95b0601c64f417c471536a2d828b4c16fe37c13662483a32f02f183ed0f441616609b0663fb791e524e8cd56d9a86dd7366b1fc5356048ccb09b576495e7c + languageName: node + linkType: hard + +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" + dependencies: + is-bigint: "npm:^1.1.0" + is-boolean-object: "npm:^1.2.1" + is-number-object: "npm:^1.1.1" + is-string: "npm:^1.1.1" + is-symbol: "npm:^1.1.1" + checksum: 10/a877c0667bc089518c83ad4d845cf8296b03efe3565c1de1940c646e00a2a1ae9ed8a185bcfa27cbf352de7906f0616d83b9d2f19ca500ee02a551fb5cf40740 + languageName: node + linkType: hard + +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + function.prototype.name: "npm:^1.1.6" + has-tostringtag: "npm:^1.0.2" + is-async-function: "npm:^2.0.0" + is-date-object: "npm:^1.1.0" + is-finalizationregistry: "npm:^1.1.0" + is-generator-function: "npm:^1.0.10" + is-regex: "npm:^1.2.1" + is-weakref: "npm:^1.0.2" + isarray: "npm:^2.0.5" + which-boxed-primitive: "npm:^1.1.0" + which-collection: "npm:^1.0.2" + which-typed-array: "npm:^1.1.16" + checksum: 10/22c81c5cb7a896c5171742cd30c90d992ff13fb1ea7693e6cf80af077791613fb3f89aa9b4b7f890bd47b6ce09c6322c409932359580a2a2a54057f7b52d1cbe + languageName: node + linkType: hard + +"which-collection@npm:^1.0.2": + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" + dependencies: + is-map: "npm:^2.0.3" + is-set: "npm:^2.0.3" + is-weakmap: "npm:^2.0.2" + is-weakset: "npm:^2.0.3" + checksum: 10/674bf659b9bcfe4055f08634b48a8588e879161b9fefed57e9ec4ff5601e4d50a05ccd76cf10f698ef5873784e5df3223336d56c7ce88e13bcf52ebe582fc8d7 + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": + version: 1.1.19 + resolution: "which-typed-array@npm:1.1.19" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + for-each: "npm:^0.3.5" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + checksum: 10/12be30fb88567f9863186bee1777f11bea09dd59ed8b3ce4afa7dd5cade75e2f4cc56191a2da165113cc7cf79987ba021dac1e22b5b62aa7e5c56949f2469a68 + languageName: node + linkType: hard + "which@npm:^1.2.9": version: 1.3.1 resolution: "which@npm:1.3.1" @@ -7651,7 +8374,7 @@ __metadata: languageName: node linkType: hard -"which@npm:^2.0.1, which@npm:^2.0.2": +"which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" dependencies: @@ -7662,12 +8385,14 @@ __metadata: languageName: node linkType: hard -"wide-align@npm:^1.1.5": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" dependencies: - string-width: "npm:^1.0.2 || 2 || 3 || 4" - checksum: 10/d5f8027b9a8255a493a94e4ec1b74a27bff6679d5ffe29316a3215e4712945c84ef73ca4045c7e20ae7d0c72f5f57f296e04a4928e773d4276a2f1222e4c2e99 + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10/6ec99e89ba32c7e748b8a3144e64bfc74aa63e2b2eacbb61a0060ad0b961eb1a632b08fb1de067ed59b002cec3e21de18299216ebf2325ef0f78e0f121e14e90 languageName: node linkType: hard @@ -7689,14 +8414,25 @@ __metadata: languageName: node linkType: hard -"word-wrap@npm:^1.2.3": - version: 1.2.3 - resolution: "word-wrap@npm:1.2.3" - checksum: 10/08a677e1578b9cc367a03d52bc51b6869fec06303f68d29439e4ed647257411f857469990c31066c1874678937dac737c9f8f20d3fd59918fb86b7d926a76b15 +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10/1ec6f6089f205f83037be10d0c4b34c9183b0b63fca0834a5b3cee55dd321429d73d40bb44c8fc8471b5203d6e8f8275717f49a8ff4b2b0ab41d7e1b563e0854 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10/cebdaeca3a6880da410f75209e68cd05428580de5ad24535f22696d7d9cab134d1f8498599f344c3cf0fb37c1715807a183778d8c648d6cc0cb5ff2bb4236540 languageName: node linkType: hard -"wrap-ansi@npm:^8.0.1": +"wrap-ansi@npm:^8.0.1, wrap-ansi@npm:^8.1.0": version: 8.1.0 resolution: "wrap-ansi@npm:8.1.0" dependencies: @@ -7726,8 +8462,8 @@ __metadata: linkType: hard "ws@npm:^8.8.0": - version: 8.13.0 - resolution: "ws@npm:8.13.0" + version: 8.18.2 + resolution: "ws@npm:8.18.2" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -7736,7 +8472,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10/1769532b6fdab9ff659f0b17810e7501831d34ecca23fd179ee64091dd93a51f42c59f6c7bb4c7a384b6c229aca8076fb312aa35626257c18081511ef62a161d + checksum: 10/018e04ec95561d88248d53a2eaf094b4ae131e9b062f2679e6e8a62f04649bc543448f1e038125225ac6bbb25f54c1e65d7a2cc9dbc1e28b43e5e6b7162ad88e languageName: node linkType: hard @@ -7768,6 +8504,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10/1884d272d485845ad04759a255c71775db0fac56308764b4c77ea56a20d56679fad340213054c8c9c9c26fcfd4c4b2a90df993b7e0aaf3cdb73c618d1d1a802a + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" From 7f7fc90c0961303add562b811974b586d5c6ab94 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sat, 24 May 2025 16:56:31 -0700 Subject: [PATCH 24/61] Players can see eachother move --- apps/server/server-game-manager.ts | 31 ++++++++- apps/server/server.ts | 2 +- .../src/game-scripts/canvas-gscript.ts | 10 ++- apps/web-client/src/renders/playerRender.ts | 63 ++++++++++++++----- .../src/services/mp-games-service.ts | 19 ++++++ apps/web-client/src/utils.ts | 7 +++ lib/engine/src/socket-types.ts | 3 + lib/engine/src/wrappers.ts | 1 + lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/entities/entity.rs | 11 ++++ lib/world/src/entities/entity_action.rs | 13 ++++ lib/world/src/entities/game.rs | 11 +++- lib/world/src/entities/player_move_script.rs | 3 +- 13 files changed, 151 insertions(+), 25 deletions(-) diff --git a/apps/server/server-game-manager.ts b/apps/server/server-game-manager.ts index 065a953..2e32db7 100644 --- a/apps/server/server-game-manager.ts +++ b/apps/server/server-game-manager.ts @@ -12,6 +12,7 @@ import { import SocketServer from "./socket"; import WebSocket from "ws"; import { ISocketMessageType, SocketMessage } from "@craft/engine"; +import { GameDb } from "./db"; type ClientId = number; @@ -53,7 +54,11 @@ export class ServerGameManager { timer: NodeJS.Timeout | null = null; chunkGetter: TerrainChunkGetter; - constructor(private game: Game, private socketInterface: SocketServer) { + constructor( + private game: Game, + private socketInterface: SocketServer, + private gameDb: GameDb + ) { this.chunkGetter = new TerrainChunkGetter(game); const sandbox = new SandBoxGScript( 1, @@ -88,6 +93,16 @@ export class ServerGameManager { }) ); + this.clients.forEach((client, _) => { + this.socketInterface.send( + client, + new SocketMessage( + ISocketMessageType.newPlayer, + this.game.get_player_wasm(myUid) + ) + ); + }); + this.listenForPlayerActions(ws, myUid); this.clients.set(myUid, ws); @@ -151,6 +166,11 @@ export class ServerGameManager { this.timer = setInterval(() => { this.update(); }, 1000 / 60); + + setInterval(() => { + console.log("Saving game", this.game.id); + this.save(); + }, 5000); } stop() { @@ -171,4 +191,13 @@ export class ServerGameManager { getOnlinePlayers(): number { return this.clients.size; } + + save() { + const serializedGame = { + gameId: this.game.id, + name: this.game.name, + entities: this.game.serialize_entities_wasm(), + world: this.game.world.serialize_wasm(), + }; + } } diff --git a/apps/server/server.ts b/apps/server/server.ts index 952db64..57964af 100644 --- a/apps/server/server.ts +++ b/apps/server/server.ts @@ -65,7 +65,7 @@ app.post("/game/:id/start", async (req: Request, res: Response) => { res.status(404).send("Game not found"); return; } - const gameManager = new ServerGameManager(game, socketService); + const gameManager = new ServerGameManager(game, socketService, gameDb); games.set(id, gameManager); gameManager.start(); res.send("Game started"); diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index a5645a0..7046e42 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -181,12 +181,12 @@ export class CanvasGameScript extends GameScript { // Skip rendering the player if we aren't supposed to if ( entityRenderer instanceof PlayerRenderer && - entityRenderer.player.uid === this.mainPlayerId && + entityRenderer.entityId === this.mainPlayerId && !shouldRenderMainPlayer ) { continue; } - // entityRenderer.render(camera); + entityRenderer.render(camera); } // loop through all of the chunks that I would be able to see. @@ -297,7 +297,11 @@ export class CanvasGameScript extends GameScript { onNewEntity(entity: PlayerWrapper): void { console.log("CanvasGameScript: Adding entity", entity); // if (entity instanceof PlayerWrapper) { - const renderer = new PlayerRenderer(this.webGlGScript, entity); + const renderer = new PlayerRenderer( + this.game, + this.webGlGScript, + entity.uid + ); this.entityRenderers.set(entity.uid, renderer); // } else if (entity instanceof Projectile) { // const renderer = new SphereRenderer(this.webGlGScript, entity); diff --git a/apps/web-client/src/renders/playerRender.ts b/apps/web-client/src/renders/playerRender.ts index 2f14da6..3ce5b7b 100644 --- a/apps/web-client/src/renders/playerRender.ts +++ b/apps/web-client/src/renders/playerRender.ts @@ -3,18 +3,49 @@ import { RenderData, Renderer } from "./renderer"; import ShapeBuilder from "../services/shape-builder"; import TextureMapper from "../textureMapper"; import { WebGlGScript } from "../game-scripts/webgl-gscript"; +import { Game, Player } from "@craft/rust-world"; + +class PlayerRenderWrapper { + constructor(private player: Player) {} + + get pos() { + return this.player.pos; + } + + get distanceMoved() { + return 0; + } + + get dim() { + return new Vector3D([1, 1, 1]); + } + + get rot() { + return this.player.rot; + } +} export class PlayerRenderer extends Renderer { private renderData = new RenderData(); - constructor(webGlGScript: WebGlGScript, public player: PlayerWrapper) { + constructor( + private game: Game, + webGlGScript: WebGlGScript, + public entityId: number + ) { super(webGlGScript); this.setActiveTexture(this.webGlGScript.textureAtlas); } render(camera: Camera) { - this.calculateBuffers(); - this.renderObject(this.player.pos, camera); + const player = new PlayerRenderWrapper( + this.game.get_player_wasm(this.entityId) + ); + this.calculateBuffers(player); + this.renderObject( + new Vector3D([player.pos.x, player.pos.y, player.pos.z]), + camera + ); } static handSize = new Vector3D([0.2, 0.2, 0.2]); @@ -26,11 +57,11 @@ export class PlayerRenderer extends Renderer { static headSize = new Vector3D([0.6, 0.6, 0.6]); static halfHeadSize = PlayerRenderer.headSize.scalarMultiply(0.5); - drawHead() { - const theta = this.player.rot.get(1); - const phi = -this.player.rot.get(2) + Math.PI / 2; - const rightLegRot = Math.sin(this.player.distanceMoved); - const halfPlayerSize = this.player.dim.scalarMultiply(0.5); + drawHead(player: PlayerRenderWrapper) { + const theta = player.rot.theta; + const phi = -player.rot.phi + Math.PI / 2; + const rightLegRot = Math.sin(0); + const halfPlayerSize = player.dim.scalarMultiply(0.5); const headPos = halfPlayerSize.add(new Vector3D([0, 0.9, 0])); ShapeBuilder.buildBox((edge) => { return edge @@ -42,7 +73,7 @@ export class PlayerRenderer extends Renderer { }, this.renderData); } - private calculateBuffers() { + private calculateBuffers(player: PlayerRenderWrapper) { this.renderData.clear(); const { renderData } = this; @@ -55,14 +86,14 @@ export class PlayerRenderer extends Renderer { textureCords, }); - const theta = this.player.rot.get(1); + const theta = player.rot.theta; // const phi = -this.player.rot.get(2) + Math.PI / 2; const armSize = new Vector3D([0.3, 0.8, 0.3]); const bodySize = new Vector3D([0.4, 0.8, 0.8]); const legSize = new Vector3D([0.4, 0.7, 0.4]); - const halfPlayerSize = this.player.dim.scalarMultiply(0.5); + const halfPlayerSize = player.dim.scalarMultiply(0.5); const bodyOrigin = bodySize.scalarMultiply(0.5); const armOrigin = armSize.multiply(new Vector3D([0.5, 1, 0.5])); const legOrigin = legSize.multiply(new Vector3D([0.5, 1, 0.5])); @@ -81,13 +112,13 @@ export class PlayerRenderer extends Renderer { new Vector3D([0, -0.2, -0.2]).rotateY(theta) ); - const rightArmRot = Math.sin(this.player.distanceMoved); - const leftArmRot = Math.sin(this.player.distanceMoved + Math.PI); - const rightLegRot = Math.sin(this.player.distanceMoved); - const leftLegRot = Math.sin(this.player.distanceMoved + Math.PI); + const rightArmRot = Math.sin(player.distanceMoved); + const leftArmRot = Math.sin(player.distanceMoved + Math.PI); + const rightLegRot = Math.sin(player.distanceMoved); + const leftLegRot = Math.sin(player.distanceMoved + Math.PI); // draw head - this.drawHead(); + this.drawHead(player); // draw body ShapeBuilder.buildBox((edge) => { diff --git a/apps/web-client/src/services/mp-games-service.ts b/apps/web-client/src/services/mp-games-service.ts index 79e4ca0..eaf45c9 100644 --- a/apps/web-client/src/services/mp-games-service.ts +++ b/apps/web-client/src/services/mp-games-service.ts @@ -92,6 +92,8 @@ export async function serverRunner(gameId: string) { const myUid = getMyUid(); + console.log("My UID", myUid); + const game = new Game(); (window as any).game = game; @@ -121,6 +123,23 @@ export async function serverRunner(gameId: string) { ); }; + SocketInterface.addListener((message) => { + console.log("Got actions message from server", message); + if (message.isType(ISocketMessageType.actions)) { + const action = message.data; + const actionDto = EntityActionJson.deserialize_wasm( + action.entity_id, + action.name, + action.data + ); + game.handle_action_wasm(actionDto); + } + if (message.isType(ISocketMessageType.newPlayer)) { + const player = message.data; + game.deserialize_entity_wasm(player); + } + }); + const playerController = new KeyboardPlayerEntityController( onAction, myUid, diff --git a/apps/web-client/src/utils.ts b/apps/web-client/src/utils.ts index e342548..884a624 100644 --- a/apps/web-client/src/utils.ts +++ b/apps/web-client/src/utils.ts @@ -26,6 +26,13 @@ if (!localStorage.getItem(UID_KEY)) { } export function getMyUid() { + // check url for uid override + const urlParams = new URLSearchParams(window.location.search); + const uidOverride = urlParams.get("uid"); + if (uidOverride) { + return Number(uidOverride); + } + const uid = Number(localStorage.getItem(UID_KEY)); if (!uid) throw new Error("UID not defined"); return uid; diff --git a/lib/engine/src/socket-types.ts b/lib/engine/src/socket-types.ts index 70c169a..8b12021 100644 --- a/lib/engine/src/socket-types.ts +++ b/lib/engine/src/socket-types.ts @@ -2,6 +2,7 @@ import { EntityActionDto, EntityActionJson, GameDiff, + Player, SerializedEntityHolder, } from "@craft/rust-world"; import { ISerializedAction } from "./wrappers.js"; @@ -37,6 +38,7 @@ export enum ISocketMessageType { failedToJoin = "failedToJoin", welcome = "welcome", gameDiff = "gameDiff", + newPlayer = "newPlayer", // from both actions = "actions", @@ -56,6 +58,7 @@ export interface SocketMessageData extends Record { [ISocketMessageType.actions]: ISerializedAction; [ISocketMessageType.gameDiff]: GameDiff; [ISocketMessageType.welcome]: WelcomeMessage; + [ISocketMessageType.newPlayer]: Player; } export type SocketMessageDto = MessageDto< diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index a3d6b17..a42dec2 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -148,6 +148,7 @@ export class PlayerWrapper { moving_direction: WorldWasm.Direction | undefined; constructor(player: WorldWasm.Player) { + this.uid = player.id; this.pos = new Vector3D([player.pos.x, player.pos.y, player.pos.z]); this.dim = new Vector3D([1, 1, 1]); this.rot = new Vector3D([0, player.rot.phi, player.rot.theta]); diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 8b805a2..087c2fd 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[49,50,52,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,51,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f3351fc22047afd24c6526fd26f6efa2b31bb3940d2a18c0410974db628b494","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"909de4c604dc98111ed27190cd1d8a0bd75dc8131cb8e13b40823c3d3f475e8c","signature":"775cc59b4ae0007d83834d10a4273997b97464773ef9e02b52358de844062ce4","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"9d753cf4da10fa33fc6e471508fe977ec860cac1f6ed4ebaababb006d54e3a04","signature":"3c709283e60c19e1441d18062b5e1a3ebdd27e3125a9f26fd98629b916fb7827","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"9b02d2fd9dae7f987d6e3ced9daf38cc95e6d0f4793b3bfd7dec8527bf9719d7","signature":"12618848438739a7b972947cb18bb89e0bea988b671511fafc2d66beff616cbb","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[49,50,52,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,51,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"379ac4331cfd20a06381e9b556e73215adc7c6213ef22c23255a1b78e91d2520","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"2ac9d42b88663e5e0b4fc064b132445d84ca23bd822e12b43b9b79362e249773","signature":"775cc59b4ae0007d83834d10a4273997b97464773ef9e02b52358de844062ce4","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"9d753cf4da10fa33fc6e471508fe977ec860cac1f6ed4ebaababb006d54e3a04","signature":"3c709283e60c19e1441d18062b5e1a3ebdd27e3125a9f26fd98629b916fb7827","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"dec7988a350062d4ea1cd99a2f44fc57797a7921818e3c3cf2afdedb4cc2e4c7","signature":"e490d7d77f0e379a276d3282603fe4b74bb4cba966f146cfe96dbb0473cbcc35","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index 584f460..ea7acea 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -199,6 +199,17 @@ impl EntityHolder { .collect(); entity_holder } + + pub fn deserialize_entity(&mut self, entity: JsValue) { + let player: Player = from_value(entity).unwrap(); + let entity = Player::make_entity(&player); + // add or update entity + if let Some(existing_entity) = self.get_entity_by_id_mut(entity.id) { + existing_entity.components = entity.components; + } else { + self.add_entity(entity); + } + } } #[wasm_bindgen] diff --git a/lib/world/src/entities/entity_action.rs b/lib/world/src/entities/entity_action.rs index e7eb547..9965165 100644 --- a/lib/world/src/entities/entity_action.rs +++ b/lib/world/src/entities/entity_action.rs @@ -1,3 +1,4 @@ +use crate::entities::player_move_script::MoveActionData; use crate::entities::player_rot_script::RotateActionData; use crate::utils::js_log; @@ -129,6 +130,10 @@ impl EntityActionJson { let data = dto.get_data::().unwrap(); serde_wasm_bindgen::to_value(&data).unwrap() } + "Move" => { + let data = dto.get_data::().unwrap(); + serde_wasm_bindgen::to_value(&data).unwrap() + } _ => JsValue::null(), } } @@ -144,6 +149,14 @@ impl EntityActionJson { data: Box::new(data), } } + "Move" => { + let data = serde_wasm_bindgen::from_value::(data).unwrap(); + EntityActionDto { + entity_id, + name: "Move", + data: Box::new(data), + } + } _ => panic!("Unknown action: {}", name), } } diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 87b9914..0df56d0 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -7,6 +7,7 @@ use crate::{ chunk::{Chunk, ChunkId}, entities::{ entity_action::EntityActionDtoMaker, + player::wasm::Player, player_jump_script::JumpAction, player_move_script::{MoveAction, MoveScript}, player_rot_script::RotateAction, @@ -15,7 +16,7 @@ use crate::{ world::{world_block::WorldBlock, World}, }; use serde::{Deserialize, Serialize}; -use serde_wasm_bindgen::Error; +use serde_wasm_bindgen::{from_value, Error}; use uuid::Uuid; use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; @@ -141,6 +142,12 @@ impl Game { let entity_holder = EntityHolder::deserialize(serialized_entities); self.entity_holder = entity_holder; } + + pub fn deserialize_entity_wasm(&mut self, entity: JsValue) { + let player: Player = from_value(entity).unwrap(); + let entity = Player::make_entity(&player); + self.schedule_entity_insert(entity); + } } impl Game { @@ -403,7 +410,7 @@ pub mod wasm { let player_js = serde_wasm_bindgen::to_value(&wasm_player).unwrap(); Ok(player_js) } else { - Err(Error::new("Player not found")) + Err(Error::new(format!("Player {} not found", player_id))) } } diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs index 60888cc..3445ec1 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/entities/player_move_script.rs @@ -4,6 +4,7 @@ use crate::{ geometry::rotation::SphericalRotation, utils::js_log, }; +use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; use super::{ @@ -15,7 +16,7 @@ use super::{ }; #[wasm_bindgen] -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize, Deserialize)] pub struct MoveActionData { pub direction: Option, } From 9b9d2130c190402a5e41981ad2af67f966a84e98 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 25 May 2025 08:59:45 -0700 Subject: [PATCH 25/61] Placing blocks works --- apps/web-client/index.html | 49 ++++++++- apps/web-client/index_real.html | 16 +-- .../keyboardPlayerController.ts | 11 +- .../src/game-scripts/canvas-gscript.ts | 2 + apps/web-client/src/game-scripts/hudRender.ts | 9 +- .../web-client/src/renders/gameMenuRender.tsx | 68 ++++++------ apps/web-client/src/runner.ts | 15 ++- lib/engine/src/playerActions.ts | 6 +- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/components/world_pos.rs | 1 + lib/world/src/entities/entity_action.rs | 43 +++++++- lib/world/src/entities/game.rs | 41 ++++++- lib/world/src/entities/mod.rs | 9 +- lib/world/src/entities/player.rs | 4 + lib/world/src/entities/player_belt_script.rs | 103 ++++++++++++++++++ lib/world/src/entities/player_jump_script.rs | 18 ++- lib/world/src/entities/player_move_script.rs | 12 +- lib/world/src/entities/player_rot_script.rs | 11 +- lib/world/src/geometry/ray.rs | 23 +++- 19 files changed, 356 insertions(+), 87 deletions(-) create mode 100644 lib/world/src/entities/player_belt_script.rs diff --git a/apps/web-client/index.html b/apps/web-client/index.html index d22157d..c547c42 100644 --- a/apps/web-client/index.html +++ b/apps/web-client/index.html @@ -7,11 +7,54 @@ - -
+
+ + +
+ + + +
+
+
+
+ +
+ 0,0,0
+ Fps: +
+ +
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + - \ No newline at end of file diff --git a/apps/web-client/index_real.html b/apps/web-client/index_real.html index 37c14ae..86799f6 100644 --- a/apps/web-client/index_real.html +++ b/apps/web-client/index_real.html @@ -1,9 +1,6 @@ TylerCraft - + @@ -11,10 +8,10 @@
@@ -90,9 +87,8 @@

A 3D sandbox by Tyler Tracy

-
- + \ No newline at end of file diff --git a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts index e9bdfa6..a5b4e3d 100644 --- a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts +++ b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts @@ -27,10 +27,11 @@ export class KeyboardPlayerEntityController extends PlayerController { ) { super(handleAction, playerId); - const webGlCanvas = webGlGScript.eCanvas; + const webGlCanvas = document.getElementById("hud") as HTMLCanvasElement; // Pointer lock to the canvas webGlCanvas.addEventListener("mousedown", (e: MouseEvent) => { + console.log("mousedown", e.target); if (e.target !== webGlCanvas) { return; } @@ -44,10 +45,12 @@ export class KeyboardPlayerEntityController extends PlayerController { return; } + console.log("mousedown", e.button); + if (e.button === 2) { this.primaryAction(); } else if (e.button === 0) { - this.secondaryAction(); + this.primaryAction(); } e.preventDefault(); }); @@ -216,5 +219,7 @@ export class KeyboardPlayerEntityController extends PlayerController { } } - update() { } + update() { + // NO-OP + } } diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index 7046e42..1fc79c2 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -114,6 +114,8 @@ export class CanvasGameScript extends GameScript { for (const chunkId of this.lastDiff.updated_chunks) { this.onChunkUpdate(chunkId); } + + this.lastDiff = null; } getFilter(camera: Camera): Vector3D { diff --git a/apps/web-client/src/game-scripts/hudRender.ts b/apps/web-client/src/game-scripts/hudRender.ts index 4c79bb8..0dbb35a 100644 --- a/apps/web-client/src/game-scripts/hudRender.ts +++ b/apps/web-client/src/game-scripts/hudRender.ts @@ -4,6 +4,7 @@ import { getEleOrError, hideElement, IS_MOBILE } from "../utils"; import { GameMenu } from "../renders/gameMenuRender"; import React from "react"; import ReactDOM from "react-dom"; +import { Game } from "@craft/rust-world"; export class HudGScript extends GameScript { name = "hud"; @@ -27,7 +28,7 @@ export class HudGScript extends GameScript { private lastSelected = -1; constructor( - game: GameWrapper, + game: Game, private canvasGScript: CanvasGameScript, private mainPlayerUid: number ) { @@ -90,12 +91,14 @@ export class HudGScript extends GameScript { private lastStats = ""; drawStats() { - const mainPlayer = this.game.getPlayer(this.mainPlayerUid); + const mainPlayer = this.game.get_player_wasm(this.mainPlayerUid); if (!mainPlayer) { return; } - const cameraPos = mainPlayer.pos.data.map((d) => d.toFixed(2)).join(","); + const cameraPos = mainPlayer.pos.data + .map((d: number) => d.toFixed(2)) + .join(","); // const numChunks = this.game.world.getLoadedChunkIds().length; const statsString = ` diff --git a/apps/web-client/src/renders/gameMenuRender.tsx b/apps/web-client/src/renders/gameMenuRender.tsx index 5d00d2c..a158228 100644 --- a/apps/web-client/src/renders/gameMenuRender.tsx +++ b/apps/web-client/src/renders/gameMenuRender.tsx @@ -2,7 +2,7 @@ import ReactDOM from "react-dom"; import React, { useEffect } from "react"; import styles from "./gameMenu.module.css"; import { getEleOrError } from "../utils"; -import { Game } from "@craft/engine/game"; +import { Game } from "@craft/rust-world"; // make section button with same props as normal button const SectionButton = ( @@ -18,10 +18,10 @@ export const GameMenu = (props: { game: Game }) => { const [gameName, setGameName] = React.useState(game.name); const changeGameName = (event: React.ChangeEvent) => { - game.handleAction( - GameAction.create(GameActionType.ChangeName, { name: gameName }) - ); - setGameName(event.target.value); + // game.handleAction( + // GameAction.create(GameActionType.ChangeName, { name: gameName }) + // ); + // setGameName(event.target.value); }; const toggleFullScreen = () => { @@ -34,7 +34,7 @@ export const GameMenu = (props: { game: Game }) => { }; const saveGame = () => { - game.handleAction(GameAction.create(GameActionType.Save, undefined)); + // game.handleAction(GameAction.create(GameActionType.Save, undefined)); }; useEffect(() => { @@ -66,30 +66,34 @@ export const GameMenu = (props: { game: Game }) => { ); - const gameScriptSections = game.getScriptActions().map((s, i) => { - const actions = s.actions; - - return ( - openSection === "script-" + i && ( -
- {actions && - Object.keys(actions).map((name) => { - return ; - })} - - {s.config &&
{JSON.stringify(s.config, null, 2)}
} -
- ) - ); - }); - - const gameScriptButtons = game.getScriptActions().map((_s, i) => { - return ( - setOpenSection("script-" + i)} key={i}> - {"GameScript " + (i + 1)} - - ); - }); + // const gameScriptSections = game + // .getScriptActions() + // .map((s: any, i: number) => { + // const actions = s.actions; + + // return ( + // openSection === "script-" + i && ( + //
+ // {actions && + // Object.keys(actions).map((name) => { + // return ; + // })} + + // {s.config &&
{JSON.stringify(s.config, null, 2)}
} + //
+ // ) + // ); + // }); + + // const gameScriptButtons = game + // .getScriptActions() + // .map((_s: any, i: number) => { + // return ( + // setOpenSection("script-" + i)} key={i}> + // {"GameScript " + (i + 1)} + // + // ); + // }); return ( <> @@ -110,14 +114,14 @@ export const GameMenu = (props: { game: Game }) => { Config - {gameScriptButtons} + {/* {gameScriptButtons} */}
{openSection === "main" && mainSection} {openSection === "about" && } {openSection === "config" && } - {gameScriptSections} + {/* {gameScriptSections} */}
)} diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 424eb64..d862e6a 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -12,6 +12,7 @@ import { WasmRequestChunk, } from "@craft/rust-world"; import { ClientDbGamesService } from "./services/sp-games-service"; +import { HudGScript } from "./game-scripts/hudRender"; // import { eStartMenu } from "./elements"; class SinglePlayerTerrainChunkGetter { @@ -78,6 +79,12 @@ export async function run(id?: string) { game.makeAndAddGameScript(canvasGameScript); + const hudRender = new HudGScript( + game.game, + canvasGameScript, + main_player_uid + ); + const onAction = (action: EntityActionDto) => { console.log("ACTION", action); game.game.handle_action_wasm(action); @@ -108,16 +115,14 @@ export async function run(id?: string) { setInterval(update, 1000 / 60); - const saveGame = async () => { + setInterval(async () => { + console.log("Saving game"); await spGameService.saveGame( game, chunkGetter.terrianGen, serializedSandbox ); - setTimeout(saveGame, 1000); - }; - - saveGame(); + }, 3000); console.log("Starting"); diff --git a/lib/engine/src/playerActions.ts b/lib/engine/src/playerActions.ts index ef91002..b13e9d5 100644 --- a/lib/engine/src/playerActions.ts +++ b/lib/engine/src/playerActions.ts @@ -5,12 +5,13 @@ import { MoveAction, RotateAction, SphericalRotation, + UsePrimaryItemAction, } from "@craft/rust-world"; export abstract class PlayerController { constructor( protected handleAction: (action: EntityActionDto) => void, protected playerId: number - ) { } + ) {} jump() { const action = JumpAction.make_wasm(this.playerId); @@ -46,6 +47,9 @@ export abstract class PlayerController { } primaryAction() { + const action = UsePrimaryItemAction.make_wasm(this.playerId); + console.log("primaryAction", action); + this.handleAction(action); // const action = PlayerAction.make(PlayerActionType.PlaceBlock, { // playerUid: this.player.uid, // playerPos: this.player.pos.data as IDim, diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 087c2fd..aba30dc 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[49,50,52,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,51,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"379ac4331cfd20a06381e9b556e73215adc7c6213ef22c23255a1b78e91d2520","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"2ac9d42b88663e5e0b4fc064b132445d84ca23bd822e12b43b9b79362e249773","signature":"775cc59b4ae0007d83834d10a4273997b97464773ef9e02b52358de844062ce4","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"9d753cf4da10fa33fc6e471508fe977ec860cac1f6ed4ebaababb006d54e3a04","signature":"3c709283e60c19e1441d18062b5e1a3ebdd27e3125a9f26fd98629b916fb7827","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"dec7988a350062d4ea1cd99a2f44fc57797a7921818e3c3cf2afdedb4cc2e4c7","signature":"e490d7d77f0e379a276d3282603fe4b74bb4cba966f146cfe96dbb0473cbcc35","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[49,50,52,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,51,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a95f46b9a28217b3f7cbaf6f93cc340008343303964ab180eaadd7b58e67a6a","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"2ac9d42b88663e5e0b4fc064b132445d84ca23bd822e12b43b9b79362e249773","signature":"775cc59b4ae0007d83834d10a4273997b97464773ef9e02b52358de844062ce4","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"5def06d7bb8068516b5ceb307f92eac2750636fcb1392da1cc94675ec36b4e63","signature":"3c709283e60c19e1441d18062b5e1a3ebdd27e3125a9f26fd98629b916fb7827","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"dec7988a350062d4ea1cd99a2f44fc57797a7921818e3c3cf2afdedb4cc2e4c7","signature":"e490d7d77f0e379a276d3282603fe4b74bb4cba966f146cfe96dbb0473cbcc35","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file diff --git a/lib/world/src/components/world_pos.rs b/lib/world/src/components/world_pos.rs index 90a8d21..e095992 100644 --- a/lib/world/src/components/world_pos.rs +++ b/lib/world/src/components/world_pos.rs @@ -3,6 +3,7 @@ use wasm_bindgen::prelude::*; use crate::{ chunk::{CHUNK_HEIGHT, CHUNK_WIDTH}, + direction::Direction, entities::entity_component::{impl_component, Component}, positions::{ChunkPos, InnerChunkPos}, vec::{impl_vector_ops, Vector3Ops}, diff --git a/lib/world/src/entities/entity_action.rs b/lib/world/src/entities/entity_action.rs index 9965165..3577c68 100644 --- a/lib/world/src/entities/entity_action.rs +++ b/lib/world/src/entities/entity_action.rs @@ -1,8 +1,11 @@ +use crate::entities::player_belt_script::UsePrimaryItemActionData; use crate::entities::player_move_script::MoveActionData; use crate::entities::player_rot_script::RotateActionData; use crate::utils::js_log; +use crate::world::World; use super::entity::{Entity, EntityHolder, EntityId}; +use super::game::GameSchedule; use serde::Serialize; use std::any::Any; use std::fmt::Debug; @@ -52,7 +55,12 @@ impl EntityActionDto { pub trait EntityActionHandler { fn get_action_type(&self) -> &'static str; - fn handle_dto(&self, entity: &mut Entity, data: &EntityActionDto); + fn handle_dto( + &self, + world: &World, + entity: &mut Entity, + data: &EntityActionDto, + ) -> GameSchedule; } pub trait EntityActionDtoMaker: EntityActionHandler { @@ -89,18 +97,26 @@ impl EntityActionHolder { self.handlers.push(handler); } - pub fn handle_actions(&mut self, entity_holder: &mut EntityHolder) { + pub fn handle_actions( + &mut self, + world: &World, + entity_holder: &mut EntityHolder, + ) -> GameSchedule { + let mut schedule = GameSchedule::empty(); for action in &self.actions { js_log(&format!("Handling action: {:?}", action)); - js_log(&format!("Num handlers: {:?}", self.handlers.len())); - println!("Handling action: {:?}", action); + js_log(&format!("Action handlers: {:?}", self.handlers.len())); let entity = entity_holder.get_entity_by_id_mut(action.entity_id); - println!("Entity: {:?}", entity); let mut action_handled = false; if let Some(entity) = entity { for handler in &self.handlers { if handler.get_action_type() == action.name { - handler.handle_dto(entity, action); + let new_schedule = handler.handle_dto(world, entity, action); + js_log(&format!( + "New schedule blocks: {:?}", + new_schedule.new_blocks + )); + schedule.combine(new_schedule); action_handled = true; } } @@ -112,6 +128,8 @@ impl EntityActionHolder { // clear actions self.actions.clear(); + + schedule } } @@ -134,6 +152,10 @@ impl EntityActionJson { let data = dto.get_data::().unwrap(); serde_wasm_bindgen::to_value(&data).unwrap() } + "UseItemAction" => { + let data = dto.get_data::().unwrap(); + serde_wasm_bindgen::to_value(&data).unwrap() + } _ => JsValue::null(), } } @@ -157,6 +179,15 @@ impl EntityActionJson { data: Box::new(data), } } + "UseItemAction" => { + let data = + serde_wasm_bindgen::from_value::(data).unwrap(); + EntityActionDto { + entity_id, + name: "UseItemAction", + data: Box::new(data), + } + } _ => panic!("Unknown action: {}", name), } } diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 0df56d0..6e7bf28 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -8,6 +8,7 @@ use crate::{ entities::{ entity_action::EntityActionDtoMaker, player::wasm::Player, + player_belt_script::UsePrimaryItemAction, player_jump_script::JumpAction, player_move_script::{MoveAction, MoveScript}, player_rot_script::RotateAction, @@ -54,6 +55,8 @@ impl Game { g.action_holder.add_handler(MoveAction::make_handler()); g.action_holder.add_handler(JumpAction::make_handler()); g.action_holder.add_handler(RotateAction::make_handler()); + g.action_holder + .add_handler(UsePrimaryItemAction::make_handler()); g } @@ -77,6 +80,8 @@ impl Game { g.action_holder.add_handler(MoveAction::make_handler()); g.action_holder.add_handler(JumpAction::make_handler()); g.action_holder.add_handler(RotateAction::make_handler()); + g.action_holder + .add_handler(UsePrimaryItemAction::make_handler()); g } @@ -85,7 +90,10 @@ impl Game { let world = &self.world; // apply actions - self.action_holder.handle_actions(&mut self.entity_holder); + let schedule = self + .action_holder + .handle_actions(&self.world, &mut self.entity_holder); + self.schedule.combine(schedule); for script in self.scripts.get_scripts_mut() { let query = script.get_query(); @@ -119,6 +127,14 @@ impl Game { for chunk in new_chunks { self.world.insert_chunk(chunk); } + + // add blocks to world + let new_blocks = std::mem::take(&mut self.schedule.new_blocks); + for block in new_blocks { + self.world.add_block(&block); + } + + self.schedule.clear(); } pub fn schedule_chunk_insert(&mut self, chunk: Chunk) { @@ -182,11 +198,32 @@ impl GameSchedule { } } + pub fn clear(&mut self) { + self.new_entities.clear(); + self.new_blocks.clear(); + self.new_chunks.clear(); + self.removed_entities.clear(); + self.removed_blocks.clear(); + } + pub fn to_game_diff(&self) -> GameDiff { let mut updated_entities: Vec = self.new_entities.iter().map(|entity| entity.id).collect(); updated_entities.extend(self.removed_entities.iter().map(|entity_id| entity_id)); - let updated_chunks = self.new_chunks.iter().map(|chunk| chunk.get_id()).collect(); + + let mut updated_chunks: Vec = Vec::new(); + for block in self.new_blocks.iter() { + let chunk_pos = block.world_pos.to_chunk_pos(); + if !updated_chunks.contains(&chunk_pos.to_id()) { + updated_chunks.push(chunk_pos.to_id()); + } + } + for new_chunk in self.new_chunks.iter() { + if !updated_chunks.contains(&new_chunk.get_id()) { + updated_chunks.push(new_chunk.get_id()); + } + } + GameDiff { updated_entities, updated_chunks, diff --git a/lib/world/src/entities/mod.rs b/lib/world/src/entities/mod.rs index 0e39a59..763b52d 100644 --- a/lib/world/src/entities/mod.rs +++ b/lib/world/src/entities/mod.rs @@ -1,12 +1,13 @@ pub mod entity; +pub mod entity_action; pub mod entity_component; pub mod game; -pub mod player; pub mod game_script; +pub mod player; +pub mod player_belt_script; pub mod player_jump_script; -pub mod player_rot_script; pub mod player_move_script; +pub mod player_rot_script; pub mod sandbox; pub mod terrain_gen; -pub mod entity_action; -pub mod velocity_script; \ No newline at end of file +pub mod velocity_script; diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index e587452..a9e72aa 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -3,6 +3,7 @@ use serde::{Deserialize, Serialize}; use super::{ entity::{Entity, EntityId}, entity_component::impl_component, + player_belt_script::Belt, player_jump_script::JumpData, player_move_script::MovingDirection, }; @@ -29,6 +30,7 @@ pub fn make_player(uid: EntityId) -> Entity { ent.add::(SphericalRotation::new(0.0, 0.0)); ent.add::(None); ent.add::(JumpData::new(2.0)); + ent.add::(Belt::default()); ent } @@ -37,6 +39,7 @@ pub mod wasm { components::{fine_world_pos::FineWorldPos, velocity::Velocity}, entities::{ entity::{Entity, EntityId}, + player_belt_script::Belt, player_jump_script::JumpData, player_move_script::MovingDirection, }, @@ -75,6 +78,7 @@ pub mod wasm { ent.add::(self.rot); ent.add::(self.moving_direction); ent.add::(self.jump_data); + ent.add::(Belt::default()); ent } } diff --git a/lib/world/src/entities/player_belt_script.rs b/lib/world/src/entities/player_belt_script.rs new file mode 100644 index 0000000..2f91622 --- /dev/null +++ b/lib/world/src/entities/player_belt_script.rs @@ -0,0 +1,103 @@ +use crate::{ + block::{BlockData, BlockType}, + components::fine_world_pos::FineWorldPos, + geometry::{ray::Ray, rotation::SphericalRotation}, + world::world_block::WorldBlock, +}; + +use super::{entity_action::EntityActionHandler, game::GameSchedule}; +use serde::{Deserialize, Serialize}; + +use super::{ + entity::{Entity, EntityId}, + entity_action::{EntityActionDto, EntityActionDtoMaker}, + entity_component::impl_component, + player::Flying, +}; +use crate::direction::DirectionVectorExtension; +use crate::{components::velocity::Velocity, vec::Vector3Ops, world::World}; +use wasm_bindgen::prelude::wasm_bindgen; + +#[wasm_bindgen] +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct UsePrimaryItemActionData {} + +#[wasm_bindgen] +#[derive(Clone, Debug, Default)] +pub struct UsePrimaryItemAction {} + +#[wasm_bindgen] +impl UsePrimaryItemAction { + pub fn make_wasm(entity_id: EntityId) -> EntityActionDto { + let data = UsePrimaryItemActionData {}; + UsePrimaryItemAction::make_dto(entity_id, data) + } +} + +impl EntityActionDtoMaker for UsePrimaryItemAction { + fn get_action_type_static() -> &'static str { + "UseItemAction" + } +} + +impl EntityActionHandler for UsePrimaryItemAction { + fn get_action_type(&self) -> &'static str { + "UseItemAction" + } + + fn handle_dto( + &self, + world: &World, + entity: &mut Entity, + _data: &EntityActionDto, + ) -> GameSchedule { + let mut schedule = GameSchedule::empty(); + let belt = entity.get::().unwrap(); + let pos = entity.get::().unwrap(); + let rot = entity.get::().unwrap(); + let selected_item = belt.selected_item; + let belt_item = belt.belt_items[selected_item]; + + let camera_ray = Ray { + pos: *pos, + rot: *rot, + }; + + let pointed_at = world.get_pointed_at_block(camera_ray); + + if let Some(pointed_at) = pointed_at { + let looking_at_pos = pointed_at.block.world_pos; + let new_pos = looking_at_pos.move_direction(&pointed_at.face); + let block = WorldBlock { + block_type: belt_item, + extra_data: BlockData::None, + world_pos: new_pos, + }; + + schedule.add_block(block); + } + + schedule + } +} + +pub struct SecondaryBeltAction {} + +pub struct SelectItemAction {} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Belt { + belt_items: [BlockType; 10], + selected_item: usize, +} + +impl Default for Belt { + fn default() -> Self { + Belt { + belt_items: [BlockType::Gold; 10], + selected_item: 0, + } + } +} + +impl_component!(Belt); diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/entities/player_jump_script.rs index 64bae55..144d167 100644 --- a/lib/world/src/entities/player_jump_script.rs +++ b/lib/world/src/entities/player_jump_script.rs @@ -1,11 +1,10 @@ use serde::{Deserialize, Serialize}; use super::{ - entity::{Entity, EntityId, EntityQuery, EntityQueryResults}, - entity_action::{ActionData, EntityActionDto, EntityActionDtoMaker, EntityActionHandler}, + entity::{Entity, EntityId}, + entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}, entity_component::impl_component, game::GameSchedule, - game_script::GameScript, player::Flying, }; use crate::{components::velocity::Velocity, vec::Vector3Ops, world::World}; @@ -28,7 +27,12 @@ impl EntityActionHandler for JumpAction { "Jump-Action" } - fn handle_dto(&self, entity: &mut Entity, data: &EntityActionDto) { + fn handle_dto( + &self, + _world: &World, + entity: &mut Entity, + data: &EntityActionDto, + ) -> GameSchedule { let _data = data.get_data::().unwrap(); let jump_data = entity.get::().unwrap().to_owned(); let vel = entity.get::().unwrap().to_owned(); @@ -38,11 +42,11 @@ impl EntityActionHandler for JumpAction { let flying = entity.get::(); if flying.is_some() && flying.unwrap().is_flying { - return; + return GameSchedule::empty(); } if jump_data.is_jumping { - return; + return GameSchedule::empty(); } let new_jump_data = jump_data.stop_jumping(); @@ -61,6 +65,8 @@ impl EntityActionHandler for JumpAction { entity.set::(new_vel); entity.set::(new_jump_data); + + GameSchedule::empty() } } diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs index 3445ec1..1746c50 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/entities/player_move_script.rs @@ -3,6 +3,7 @@ use crate::{ direction::Direction, geometry::rotation::SphericalRotation, utils::js_log, + world::World, }; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; @@ -34,10 +35,15 @@ impl EntityActionHandler for MoveAction { "Move" } - fn handle_dto(&self, entity: &mut Entity, data: &EntityActionDto) { + fn handle_dto( + &self, + _world: &World, + entity: &mut Entity, + data: &EntityActionDto, + ) -> GameSchedule { let data = data.get_data::().unwrap(); - js_log(&format!("MoveAction: {:?}", data.direction)); entity.set::(data.direction); + GameSchedule::empty() } } @@ -65,8 +71,6 @@ impl GameScript for MoveScript { let rot = entity.get::().unwrap().to_owned(); let moving_dir = entity.get::().unwrap().to_owned(); - println!("moving dir: {:?}", moving_dir); - if moving_dir.is_some() { let direction_rot: SphericalRotation = moving_dir.unwrap().into(); let move_rot = rot + direction_rot; diff --git a/lib/world/src/entities/player_rot_script.rs b/lib/world/src/entities/player_rot_script.rs index 8896151..667991d 100644 --- a/lib/world/src/entities/player_rot_script.rs +++ b/lib/world/src/entities/player_rot_script.rs @@ -1,7 +1,9 @@ use super::entity::{Entity, EntityId}; use super::entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}; +use super::game::GameSchedule; use crate::geometry::rotation::SphericalRotation; use crate::utils::js_log; +use crate::world::World; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::wasm_bindgen; @@ -25,7 +27,12 @@ impl EntityActionHandler for RotateAction { "Player-Rotate" } - fn handle_dto(&self, entity: &mut Entity, data: &EntityActionDto) { + fn handle_dto( + &self, + _world: &World, + entity: &mut Entity, + data: &EntityActionDto, + ) -> GameSchedule { let data = data.get_data::().unwrap(); let new_rot = entity.get::().unwrap().to_owned() + data.rot_diff; @@ -33,6 +40,8 @@ impl EntityActionHandler for RotateAction { js_log(&format!("New rot: {:?}", new_rot)); entity.set::(new_rot); + + GameSchedule::empty() } } diff --git a/lib/world/src/geometry/ray.rs b/lib/world/src/geometry/ray.rs index 781c781..e00a861 100644 --- a/lib/world/src/geometry/ray.rs +++ b/lib/world/src/geometry/ray.rs @@ -1,6 +1,11 @@ use super::{line_segment::LineSegment, rotation::SphericalRotation}; use crate::{ - chunk::chunk_mesh::BlockMesh, components::fine_world_pos::FineWorldPos, direction::{Direction, DirectionVectorExtension}, plane::WorldPlane, vec::Vector3Ops, world::{world_block::WorldBlock, World} + chunk::chunk_mesh::BlockMesh, + components::fine_world_pos::FineWorldPos, + direction::{Direction, DirectionVectorExtension}, + plane::WorldPlane, + vec::Vector3Ops, + world::{world_block::WorldBlock, World}, }; use serde::{Deserialize, Serialize}; use std::cmp::Ordering; @@ -20,19 +25,18 @@ pub struct LookingAt { /** * The block a camera is pointing at */ - block: WorldBlock, + pub block: WorldBlock, /** * The face of the block that is being looked at */ - face: Direction, + pub face: Direction, /** * How far the face is away from the camera */ - distance: f32, + pub distance: f32, } impl Ray { - pub fn move_forward_mut(&mut self, amount: f32) { let rot_vec = self.rot.get_unit_vector(); self.pos = FineWorldPos::from_vec3(rot_vec.scalar_mult(amount)); @@ -102,7 +106,14 @@ impl World { mod tests { use super::{LookingAt, Ray}; use crate::{ - block::{BlockData, BlockType}, chunk::{chunk_mesh::BlockMesh, Chunk}, components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, direction::{Direction, Directions}, geometry::rotation::SphericalRotation, plane::WorldPlane, vec::Vector3Ops, world::{world_block::WorldBlock, World} + block::{BlockData, BlockType}, + chunk::{chunk_mesh::BlockMesh, Chunk}, + components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, + direction::{Direction, Directions}, + geometry::rotation::SphericalRotation, + plane::WorldPlane, + vec::Vector3Ops, + world::{world_block::WorldBlock, World}, }; #[test] From 8908ba3d7805a91e9f653ed1b4986c3c8d5e0e44 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 25 May 2025 12:33:22 -0700 Subject: [PATCH 26/61] Making player controls better --- DEVLOG.md | 10 +++ .../src/game-scripts/canvas-gscript.ts | 15 ++-- apps/web-client/src/runner.ts | 27 ++++--- lib/world/src/entities/game.rs | 41 +++++----- lib/world/src/entities/mod.rs | 1 + lib/world/src/entities/player.rs | 8 ++ .../src/entities/player_gravity_script.rs | 76 ++++++++++++++----- lib/world/src/entities/player_move_script.rs | 52 ++++++++++--- lib/world/src/entities/velocity_script.rs | 35 ++++++++- lib/world/src/geometry/rect3.rs | 9 ++- 10 files changed, 198 insertions(+), 76 deletions(-) diff --git a/DEVLOG.md b/DEVLOG.md index a42cdf0..5161e85 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,3 +1,13 @@ +# 05_25_25 + +I've fixed up the server now and multiplayer seems to work. I can now also add blocks to the game again. I don't know what is left for things that I'm confused about, maybe I should just start cleaning everything up now. Could work on mobile development as well. + +List of things to do for single player: + +- Add gravity and creative mode +- Fix movement controls +- Add back third person view + # 05_21_25 I've worked on making the server runner. I'm relizing it doesn't make a lot of sense to serpatate out the sp-game-serivce and the runner. The cut between them isn't that clean. I will just make two different runners and then see what logic I need to abstract to make a good UI. diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index 1fc79c2..c3c2249 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -29,16 +29,16 @@ export enum PlayerPerspective { ThirdPersonFront, } +const DEFAULT_CONFIG: Config = { + renderDistance: 5, + fovFactor: 0.5, + chunkSize: 16, +}; + // This class should only read game and not write. export class CanvasGameScript extends GameScript { name = "world-renderer"; - config = { - renderDistance: 5, - fovFactor: 0.5, - chunkSize: 16, - }; - private renderers: Renderer[] = []; private entityRenderers: Map = new Map(); private chunkRenderers: Map = new Map(); @@ -57,7 +57,8 @@ export class CanvasGameScript extends GameScript { constructor( game: Game, private webGlGScript: WebGlGScript, - private mainPlayerId: number + private mainPlayerId: number, + public config: Config = DEFAULT_CONFIG ) { super(game); diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index d862e6a..7d36eb4 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -49,6 +49,8 @@ export async function run(id?: string) { const game = id ? await spGameService.getGame(id) : spGameService.newGame(); + (window as any).game = game; + if (!game) { console.error("Game not found"); return; @@ -74,7 +76,12 @@ export async function run(id?: string) { const canvasGameScript = new CanvasGameScript( game.game, webglGameScript, - main_player_uid + main_player_uid, + { + renderDistance: 10, + fovFactor: 0.5, + chunkSize: 16, + } ); game.makeAndAddGameScript(canvasGameScript); @@ -103,8 +110,6 @@ export async function run(id?: string) { } })(); - // make the camera - const update = () => { game.game.update(); playerController.update(); @@ -115,14 +120,14 @@ export async function run(id?: string) { setInterval(update, 1000 / 60); - setInterval(async () => { - console.log("Saving game"); - await spGameService.saveGame( - game, - chunkGetter.terrianGen, - serializedSandbox - ); - }, 3000); + // setInterval(async () => { + // console.log("Saving game"); + // await spGameService.saveGame( + // game, + // chunkGetter.terrianGen, + // serializedSandbox + // ); + // }, 3000); console.log("Starting"); diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 6e7bf28..f72fc14 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -9,6 +9,7 @@ use crate::{ entity_action::EntityActionDtoMaker, player::wasm::Player, player_belt_script::UsePrimaryItemAction, + player_gravity_script::GravityScript, player_jump_script::JumpAction, player_move_script::{MoveAction, MoveScript}, player_rot_script::RotateAction, @@ -34,6 +35,20 @@ pub struct Game { #[wasm_bindgen] impl Game { + fn add_default_scripts(&mut self) { + self.add_script(Box::new(MoveScript::default())); + self.add_script(Box::new(VelocityScript::default())); + self.add_script(Box::new(GravityScript::default())); + + self.action_holder.add_handler(MoveAction::make_handler()); + self.action_holder.add_handler(JumpAction::make_handler()); + self.action_holder.add_handler(RotateAction::make_handler()); + self.action_holder + .add_handler(UsePrimaryItemAction::make_handler()); + + self.update(); + } + #[wasm_bindgen(constructor)] pub fn new() -> Game { console_error_panic_hook::set_once(); @@ -46,18 +61,7 @@ impl Game { schedule: GameSchedule::empty(), action_holder: EntityActionHolder::default(), }; - - g.add_script(Box::new(MoveScript::default())); - g.add_script(Box::new(VelocityScript::default())); - g.update(); - - // Add basic action handlers - g.action_holder.add_handler(MoveAction::make_handler()); - g.action_holder.add_handler(JumpAction::make_handler()); - g.action_holder.add_handler(RotateAction::make_handler()); - g.action_holder - .add_handler(UsePrimaryItemAction::make_handler()); - + g.add_default_scripts(); g } @@ -71,18 +75,7 @@ impl Game { schedule: GameSchedule::empty(), action_holder: EntityActionHolder::default(), }; - - g.add_script(Box::new(MoveScript::default())); - g.add_script(Box::new(VelocityScript::default())); - g.update(); - - // Add basic action handlers - g.action_holder.add_handler(MoveAction::make_handler()); - g.action_holder.add_handler(JumpAction::make_handler()); - g.action_holder.add_handler(RotateAction::make_handler()); - g.action_holder - .add_handler(UsePrimaryItemAction::make_handler()); - + g.add_default_scripts(); g } diff --git a/lib/world/src/entities/mod.rs b/lib/world/src/entities/mod.rs index 763b52d..7f61eb4 100644 --- a/lib/world/src/entities/mod.rs +++ b/lib/world/src/entities/mod.rs @@ -5,6 +5,7 @@ pub mod game; pub mod game_script; pub mod player; pub mod player_belt_script; +pub mod player_gravity_script; pub mod player_jump_script; pub mod player_move_script; pub mod player_rot_script; diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index a9e72aa..01b077e 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -4,8 +4,10 @@ use super::{ entity::{Entity, EntityId}, entity_component::impl_component, player_belt_script::Belt, + player_gravity_script::GravityData, player_jump_script::JumpData, player_move_script::MovingDirection, + velocity_script::Forces, }; use crate::{ components::{fine_world_pos::FineWorldPos, velocity::Velocity}, @@ -31,6 +33,8 @@ pub fn make_player(uid: EntityId) -> Entity { ent.add::(None); ent.add::(JumpData::new(2.0)); ent.add::(Belt::default()); + ent.add::(GravityData { has_gravity: true }); + ent.add::(Forces::default()); ent } @@ -40,8 +44,10 @@ pub mod wasm { entities::{ entity::{Entity, EntityId}, player_belt_script::Belt, + player_gravity_script::GravityData, player_jump_script::JumpData, player_move_script::MovingDirection, + velocity_script::Forces, }, geometry::rotation::SphericalRotation, }; @@ -79,6 +85,8 @@ pub mod wasm { ent.add::(self.moving_direction); ent.add::(self.jump_data); ent.add::(Belt::default()); + ent.add::(GravityData { has_gravity: true }); + ent.add::(Forces::default()); ent } } diff --git a/lib/world/src/entities/player_gravity_script.rs b/lib/world/src/entities/player_gravity_script.rs index fe45070..4dc7749 100644 --- a/lib/world/src/entities/player_gravity_script.rs +++ b/lib/world/src/entities/player_gravity_script.rs @@ -1,30 +1,66 @@ -struct PlayerGravityScript { - player: Player, +use serde::{Deserialize, Serialize}; + +use crate::{components::velocity::Velocity, utils::js_log, vec::Vector3Ops, world::World}; + +use super::{ + entity::{EntityQuery, EntityQueryResults}, + entity_component::impl_component, + game::GameSchedule, + game_script::GameScript, + velocity_script::Forces, +}; + +#[derive(Debug, Serialize, Deserialize, Default)] +pub struct GravityData { + pub has_gravity: bool, } -impl PlayerGravityScript { - pub fn gravity_force(&self) -> Option { - if self.player.is_flying { - return None; - } +impl_component!(GravityData); - if self.player.on_ground { - return None; - } +#[derive(Debug)] +pub struct GravityScript { + gravity: f32, +} - Some(Velocity { - x: 0.0, - y: self.player.gravity, - z: 0.0, - }) +impl Default for GravityScript { + fn default() -> Self { + Self { gravity: 0.1 } } +} + +impl GameScript for GravityScript { + fn get_query(&self) -> EntityQuery { + let mut query = EntityQuery::new(); + query.add::(); + query.add::(); + query.add::(); + query + } + + fn update( + &mut self, + _world: &World, + query_results: EntityQueryResults, + ) -> Option { + for entity in query_results.entities { + let data = entity.get::().unwrap(); + + if !data.has_gravity { + continue; + } + + let gravity_force = Velocity { + x: 0.0, + y: -self.gravity, + z: 0.0, + }; - fn update(&mut self, world: &World) { - let gravity_force = self.gravity_force(); - if let Some(gravity_force) = gravity_force { - self.player.vel = gravity_force + self.player.vel; + let forces = entity.get::().unwrap().to_owned(); + let mut new_forces = forces.forces.clone(); + new_forces.push(gravity_force); + entity.set::(Forces { forces: new_forces }); } - // loop through scripts and update + None } } diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs index 1746c50..d5549de 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/entities/player_move_script.rs @@ -1,8 +1,11 @@ +use std::cmp::min; + use crate::{ components::{fine_world_pos::FineWorldPos, velocity::Velocity}, direction::Direction, geometry::rotation::SphericalRotation, utils::js_log, + vec::Vector3Ops, world::World, }; use serde::{Deserialize, Serialize}; @@ -14,6 +17,7 @@ use super::{ entity_component::impl_component, game::GameSchedule, game_script::GameScript, + velocity_script::Forces, }; #[wasm_bindgen] @@ -50,8 +54,16 @@ impl EntityActionHandler for MoveAction { pub type MovingDirection = Option; impl_component!(MovingDirection); -#[derive(Debug, Default)] -pub struct MoveScript {} +#[derive(Debug)] +pub struct MoveScript { + pub max_speed: f32, +} + +impl Default for MoveScript { + fn default() -> Self { + Self { max_speed: 1.0 } + } +} impl GameScript for MoveScript { fn get_query(&self) -> EntityQuery { @@ -59,6 +71,7 @@ impl GameScript for MoveScript { query.add::(); query.add::(); query.add::(); + query.add::(); query } @@ -70,19 +83,38 @@ impl GameScript for MoveScript { for entity in query_results.entities { let rot = entity.get::().unwrap().to_owned(); let moving_dir = entity.get::().unwrap().to_owned(); + let vel = entity.get::().unwrap().to_owned(); + let forces = entity.get::().unwrap().to_owned(); if moving_dir.is_some() { let direction_rot: SphericalRotation = moving_dir.unwrap().into(); let move_rot = rot + direction_rot; - let new_vel: Velocity = move_rot.into(); - entity.set::(new_vel); + let mut move_force: Velocity = move_rot.into(); + + // don't allow the player to move up or down + move_force.y = 0.0; + + // check if this move force would make the player exceed the max speed, if so, scale the force down so it would make us reach the max speed once applied + let final_vel = vel.add(&move_force); + let max_vel = move_force.set_mag(self.max_speed); + if final_vel.get_mag() > max_vel.get_mag() { + move_force = max_vel.sub(&vel); + } + + let mut new_forces = forces.forces.clone(); + new_forces.push(move_force); + entity.set::(Forces { forces: new_forces }); } else { - let new_vel: Velocity = Velocity { - x: 0.0, - y: 0.0, - z: 0.0, - }; - entity.set::(new_vel); + // If the player is moving, then slow them down by applying a force in the opposite direction of their velocity until they reach 0 velocity + let mut new_forces = forces.forces.clone(); + let vel_mag = vel.get_mag(); + if vel_mag > 0.0 { + let slow_force_mag = f32::min(vel_mag, 0.1); + let mut slow_force = vel.set_mag(-slow_force_mag); + slow_force.y = 0.0; + new_forces.push(slow_force); + } + entity.set::(Forces { forces: new_forces }); } } diff --git a/lib/world/src/entities/velocity_script.rs b/lib/world/src/entities/velocity_script.rs index 4f733fa..24c145f 100644 --- a/lib/world/src/entities/velocity_script.rs +++ b/lib/world/src/entities/velocity_script.rs @@ -1,14 +1,26 @@ +use serde::{Deserialize, Serialize}; + use crate::{ components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}, geometry::rect3::Rect3, + utils::js_log, + vec::Vector3Ops, }; use super::{ entity::{EntityQuery, EntityQueryResults}, + entity_component::impl_component, game::GameSchedule, game_script::GameScript, }; +#[derive(Debug, Default, Serialize, Deserialize, Clone)] +pub struct Forces { + pub forces: Vec, +} + +impl_component!(Forces); + #[derive(Debug, Default)] pub struct VelocityScript {} @@ -26,10 +38,13 @@ impl GameScript for VelocityScript { query_results: EntityQueryResults, ) -> Option { for entity in query_results.entities { - let vel = entity.get::().unwrap().to_owned(); + let mut vel = entity.get::().unwrap().to_owned(); let pos = entity.get::().unwrap().to_owned(); + let forces = entity.get::().unwrap().to_owned(); - println!("entity_id: {:?} pos: {:?}, vel: {:?}", entity.id, pos, vel); + for force in forces.forces.iter() { + vel = vel.add(force); + } let player_rect = Rect3 { pos, @@ -41,8 +56,24 @@ impl GameScript for VelocityScript { }; let new_pos = world.move_rect3(&player_rect, pos + vel); + let intersection_info = + world.get_moving_rect3_intersection_info(&player_rect, pos + vel); + + js_log(&format!( + "entity_id: {:?} pos: {:?}, vel: {:?}, new_pos: {:?}, intersection_info: {:?}", + entity.id, pos, vel, new_pos, intersection_info, + )); + for force in forces.forces.iter() { + js_log(&format!("force: {:?}", force)); + } + + if new_pos.y < 1.0 { + panic!("player fell through the world"); + } entity.set::(new_pos); + entity.set::(vel); + entity.set::(Forces { forces: vec![] }); } None diff --git a/lib/world/src/geometry/rect3.rs b/lib/world/src/geometry/rect3.rs index c5e054c..a01f07a 100644 --- a/lib/world/src/geometry/rect3.rs +++ b/lib/world/src/geometry/rect3.rs @@ -101,7 +101,7 @@ impl Rect3 { } impl World { - fn get_moving_rect3_intersection_info( + pub fn get_moving_rect3_intersection_info( &self, rect: &Rect3, end_pos: FineWorldPos, @@ -230,7 +230,12 @@ impl World { #[cfg(test)] pub mod tests { use crate::{ - block::{BlockData, BlockType}, chunk::Chunk, components::{fine_world_pos::FineWorldPos, size3::Size3, world_pos::WorldPos}, geometry::rect3::Rect3, vec::Vector3Ops, world::{world_block::WorldBlock, World} + block::{BlockData, BlockType}, + chunk::Chunk, + components::{fine_world_pos::FineWorldPos, size3::Size3, world_pos::WorldPos}, + geometry::rect3::Rect3, + vec::Vector3Ops, + world::{world_block::WorldBlock, World}, }; use super::DISTANCE_EPSILON; From b676cea459b2bbcd79bc7742d09810c495b215eb Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 25 May 2025 14:18:52 -0700 Subject: [PATCH 27/61] Jumping and gravity works --- DEVLOG.md | 4 + apps/web-client/src/game-scripts/hudRender.ts | 1 + lib/world/src/entities/player.rs | 4 +- .../src/entities/player_gravity_script.rs | 9 +- lib/world/src/entities/player_jump_script.rs | 40 +++--- lib/world/src/entities/player_move_script.rs | 15 ++- lib/world/src/entities/velocity_script.rs | 36 ++++-- lib/world/src/geometry/line_segment.rs | 16 ++- lib/world/src/geometry/rect3.rs | 114 ++++++++++++------ lib/world/src/utils.rs | 11 +- 10 files changed, 151 insertions(+), 99 deletions(-) diff --git a/DEVLOG.md b/DEVLOG.md index 5161e85..1ebc731 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -8,6 +8,10 @@ List of things to do for single player: - Fix movement controls - Add back third person view +Claude found a bug that let the player fall through the world and came up with a good fix. That is crazy. + +There are still times where the player can go through the world a little and I'm not sure why it happens. It is very rare. But now jumping and gravity works well. + # 05_21_25 I've worked on making the server runner. I'm relizing it doesn't make a lot of sense to serpatate out the sp-game-serivce and the runner. The cut between them isn't that clean. I will just make two different runners and then see what logic I need to abstract to make a good UI. diff --git a/apps/web-client/src/game-scripts/hudRender.ts b/apps/web-client/src/game-scripts/hudRender.ts index 0dbb35a..c00514a 100644 --- a/apps/web-client/src/game-scripts/hudRender.ts +++ b/apps/web-client/src/game-scripts/hudRender.ts @@ -44,6 +44,7 @@ export class HudGScript extends GameScript { this.textureImg = document.createElement("img"); this.textureImg.src = "/img/texture_map.png"; + this.textureImg.style.display = "none"; document.body.appendChild(this.textureImg); const getCanvasDimensions = () => { diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index 01b077e..438b69d 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -31,7 +31,7 @@ pub fn make_player(uid: EntityId) -> Entity { ent.add::(Velocity::default()); ent.add::(SphericalRotation::new(0.0, 0.0)); ent.add::(None); - ent.add::(JumpData::new(2.0)); + ent.add::(JumpData::default()); ent.add::(Belt::default()); ent.add::(GravityData { has_gravity: true }); ent.add::(Forces::default()); @@ -83,7 +83,7 @@ pub mod wasm { ent.add::(self.vel); ent.add::(self.rot); ent.add::(self.moving_direction); - ent.add::(self.jump_data); + ent.add::(JumpData::default()); ent.add::(Belt::default()); ent.add::(GravityData { has_gravity: true }); ent.add::(Forces::default()); diff --git a/lib/world/src/entities/player_gravity_script.rs b/lib/world/src/entities/player_gravity_script.rs index 4dc7749..f903620 100644 --- a/lib/world/src/entities/player_gravity_script.rs +++ b/lib/world/src/entities/player_gravity_script.rs @@ -24,7 +24,7 @@ pub struct GravityScript { impl Default for GravityScript { fn default() -> Self { - Self { gravity: 0.1 } + Self { gravity: 0.05 } } } @@ -55,10 +55,9 @@ impl GameScript for GravityScript { z: 0.0, }; - let forces = entity.get::().unwrap().to_owned(); - let mut new_forces = forces.forces.clone(); - new_forces.push(gravity_force); - entity.set::(Forces { forces: new_forces }); + let mut forces = entity.get::().unwrap().to_owned(); + forces.add_force(gravity_force); + entity.set::(forces); } None diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/entities/player_jump_script.rs index 144d167..6ee6f24 100644 --- a/lib/world/src/entities/player_jump_script.rs +++ b/lib/world/src/entities/player_jump_script.rs @@ -7,7 +7,9 @@ use super::{ game::GameSchedule, player::Flying, }; -use crate::{components::velocity::Velocity, vec::Vector3Ops, world::World}; +use crate::{ + components::velocity::Velocity, entities::velocity_script::Forces, utils::js_log, world::World, +}; use wasm_bindgen::prelude::wasm_bindgen; #[derive(Clone, Debug)] @@ -31,40 +33,22 @@ impl EntityActionHandler for JumpAction { &self, _world: &World, entity: &mut Entity, - data: &EntityActionDto, + _data: &EntityActionDto, ) -> GameSchedule { - let _data = data.get_data::().unwrap(); let jump_data = entity.get::().unwrap().to_owned(); - let vel = entity.get::().unwrap().to_owned(); - - println!("jump_data: {:?}", jump_data); - - let flying = entity.get::(); - - if flying.is_some() && flying.unwrap().is_flying { - return GameSchedule::empty(); - } - - if jump_data.is_jumping { - return GameSchedule::empty(); - } - - let new_jump_data = jump_data.stop_jumping(); - - let diff_y_vel = jump_data.jump_speed - vel.y; + let mut forces = entity.get::().unwrap().to_owned(); let jump_force = Velocity { x: 0.0, - y: diff_y_vel, + y: jump_data.jump_speed, z: 0.0, }; - let new_vel = vel.add(&jump_force); + forces.add_force(jump_force); - println!("new_vel: {:?}", new_vel); + js_log(&format!("jump_force: {:?}", jump_force)); - entity.set::(new_vel); - entity.set::(new_jump_data); + entity.set::(forces); GameSchedule::empty() } @@ -79,6 +63,12 @@ pub struct JumpData { jump_count: u8, } +impl Default for JumpData { + fn default() -> Self { + Self::new(0.5) + } +} + impl JumpData { pub fn new(jump_speed: f32) -> Self { Self { diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs index d5549de..5b9712d 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/entities/player_move_script.rs @@ -61,7 +61,7 @@ pub struct MoveScript { impl Default for MoveScript { fn default() -> Self { - Self { max_speed: 1.0 } + Self { max_speed: 0.5 } } } @@ -84,16 +84,13 @@ impl GameScript for MoveScript { let rot = entity.get::().unwrap().to_owned(); let moving_dir = entity.get::().unwrap().to_owned(); let vel = entity.get::().unwrap().to_owned(); - let forces = entity.get::().unwrap().to_owned(); + let mut forces = entity.get::().unwrap().to_owned(); if moving_dir.is_some() { let direction_rot: SphericalRotation = moving_dir.unwrap().into(); let move_rot = rot + direction_rot; let mut move_force: Velocity = move_rot.into(); - // don't allow the player to move up or down - move_force.y = 0.0; - // check if this move force would make the player exceed the max speed, if so, scale the force down so it would make us reach the max speed once applied let final_vel = vel.add(&move_force); let max_vel = move_force.set_mag(self.max_speed); @@ -101,9 +98,11 @@ impl GameScript for MoveScript { move_force = max_vel.sub(&vel); } - let mut new_forces = forces.forces.clone(); - new_forces.push(move_force); - entity.set::(Forces { forces: new_forces }); + // don't allow the player to move up or down + move_force.y = 0.0; + + forces.add_force(move_force); + entity.set::(forces); } else { // If the player is moving, then slow them down by applying a force in the opposite direction of their velocity until they reach 0 velocity let mut new_forces = forces.forces.clone(); diff --git a/lib/world/src/entities/velocity_script.rs b/lib/world/src/entities/velocity_script.rs index 24c145f..1ca99b7 100644 --- a/lib/world/src/entities/velocity_script.rs +++ b/lib/world/src/entities/velocity_script.rs @@ -19,6 +19,12 @@ pub struct Forces { pub forces: Vec, } +impl Forces { + pub fn add_force(&mut self, force: Velocity) { + self.forces.push(force); + } +} + impl_component!(Forces); #[derive(Debug, Default)] @@ -55,24 +61,32 @@ impl GameScript for VelocityScript { }, }; - let new_pos = world.move_rect3(&player_rect, pos + vel); - let intersection_info = - world.get_moving_rect3_intersection_info(&player_rect, pos + vel); + let end_pos = pos + vel; - js_log(&format!( - "entity_id: {:?} pos: {:?}, vel: {:?}, new_pos: {:?}, intersection_info: {:?}", - entity.id, pos, vel, new_pos, intersection_info, - )); - for force in forces.forces.iter() { - js_log(&format!("force: {:?}", force)); - } + let new_pos = world.move_rect3(&player_rect, end_pos); if new_pos.y < 1.0 { + let intersection_info = + world.get_moving_rect3_intersection_info(&player_rect, end_pos); + js_log(&format!( + "entity_id: {:?} \npos: {:?} \nvel: {:?} \nnew_pos: {:?} \nintersection_info: {:?} \nend_pos: {:?}", + entity.id, pos, vel, new_pos, intersection_info, end_pos, + )); + for force in forces.forces.iter() { + js_log(&format!("force: {:?}", force)); + } panic!("player fell through the world"); } + let pos_diff = new_pos.sub(&pos); + let real_vel = Velocity { + x: pos_diff.x, + y: pos_diff.y, + z: pos_diff.z, + }; + entity.set::(new_pos); - entity.set::(vel); + entity.set::(real_vel); entity.set::(Forces { forces: vec![] }); } diff --git a/lib/world/src/geometry/line_segment.rs b/lib/world/src/geometry/line_segment.rs index 4581991..02628ff 100644 --- a/lib/world/src/geometry/line_segment.rs +++ b/lib/world/src/geometry/line_segment.rs @@ -11,7 +11,7 @@ pub struct LineSegment { pub end_pos: FineWorldPos, } -#[derive(Debug, PartialEq, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] pub struct LineSegmentIntersectionInfo { pub intersection_point: FineWorldPos, pub world_plane: WorldPlane, @@ -130,11 +130,15 @@ impl World { // println!("Length: {}", line_segment.length()); // println!("Length: {}", (line_segment.length() + 1.0) as i32); - for n in 0..(line_segment.length() + 2.0) as i32 { + // Use smaller step size to catch more intersections, especially near block boundaries + let step_size = 0.25; + let num_steps = ((line_segment.length() / step_size) + 2.0) as i32; + + for n in 0..num_steps { let slope = line_segment .end_pos .sub(&line_segment.start_pos) - .set_mag(1.0); + .set_mag(step_size); let marched_pos = line_segment.start_pos.add(&slope.scalar_mult(n as f32)); // println!("Marched Pos: {:?}", marched_pos); @@ -182,7 +186,11 @@ impl World { #[cfg(test)] pub mod tests { use crate::{ - chunk::{chunk_mesh::BlockMesh, Chunk}, components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, direction::{Direction, Directions}, plane::WorldPlane, vec::Vector3Ops + chunk::{chunk_mesh::BlockMesh, Chunk}, + components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, + direction::{Direction, Directions}, + plane::WorldPlane, + vec::Vector3Ops, }; use super::{LineSegment, LineSegmentIntersectionInfo}; diff --git a/lib/world/src/geometry/rect3.rs b/lib/world/src/geometry/rect3.rs index a01f07a..d9ed2db 100644 --- a/lib/world/src/geometry/rect3.rs +++ b/lib/world/src/geometry/rect3.rs @@ -2,6 +2,7 @@ use crate::components::fine_world_pos::FineWorldPos; use crate::components::size3::Size3; use crate::components::world_pos::WorldPos; use crate::direction::DirectionVectorExtension; +use crate::utils::js_log; use crate::vec::Vector3Ops; use crate::world::World; @@ -136,49 +137,40 @@ impl World { } pub fn move_rect3(&self, rect: &Rect3, end_pos: FineWorldPos) -> FineWorldPos { - let new_pos_from_info = |info: LineSegmentIntersectionInfo, end_pos: FineWorldPos| { - let hit_axis = info.world_plane.direction.to_axis(); - let mut new_pos = end_pos.clone(); - let outward = info.world_plane.direction.is_outward(); - let rect_dim_dir = rect.dim.get_component_from_axis(hit_axis); - - let eplison_diff = if outward { - DISTANCE_EPSILON - } else { - -(rect_dim_dir + DISTANCE_EPSILON) - }; - - let hit_plane_pos = info.world_plane.get_relative_y() as f32; - - let new_axis_pos = eplison_diff + hit_plane_pos; - - // println!( - // "outward: {}, eplison_diff: {}, hit_plane_pos: {}, new_axis_pos: {}", - // outward, eplison_diff, hit_plane_pos, new_axis_pos - // ); - - new_pos.set_component_from_axis(hit_axis, new_axis_pos); - new_pos - }; - + // Handle multiple sequential collisions (e.g., hitting a wall then the ground) let mut current_end_pos = end_pos; + let mut current_rect = *rect; - for _ in 0..3 { - let intersection = self.get_moving_rect3_intersection_info(rect, current_end_pos); + // loop 3 times to handle multiple collisions one for each axis + for iteration in 0..3 { + // Check for collisions from current position to target + let intersection = + self.get_moving_rect3_intersection_info(¤t_rect, current_end_pos); if let Some(info) = intersection { - // unsafe { - // web_sys::console::log_2(&"intersection".into(), &to_value(&info).unwrap()) - // } - println!("intersection: {:?}", info); - - current_end_pos = new_pos_from_info(info, current_end_pos); - // unsafe { - // web_sys::console::log_2(&"new_pos".into(), &to_value(¤t_end_pos).unwrap()) - // } - println!("new_pos: {:?}", current_end_pos); + // Only adjust the axis that was hit, leave other axes unchanged + let hit_axis = info.world_plane.direction.to_axis(); + let outward = info.world_plane.direction.is_outward(); + let hit_plane_pos = info.world_plane.get_relative_y() as f32; + + let new_axis_pos = if outward { + hit_plane_pos + DISTANCE_EPSILON + } else { + let rect_dim_dir = current_rect.dim.get_component_from_axis(hit_axis); + hit_plane_pos - (rect_dim_dir + DISTANCE_EPSILON) + }; + + // Only update the hit axis, preserve movement on other axes + current_end_pos.set_component_from_axis(hit_axis, new_axis_pos); + current_rect + .pos + .set_component_from_axis(hit_axis, new_axis_pos); + + js_log(&format!( + "intersection (iteration {}): {:?}, new_pos: {:?}", + iteration, info, current_end_pos + )); } else { - // If no intersection is found, break the loop break; } } @@ -669,6 +661,52 @@ pub mod tests { ); } + #[test] + fn test_cursed_movement() { + // test_try_moving_blocks( + // vec![ + // WorldBlock { + // block_type: BlockType::Leaf, + // extra_data: BlockData::None, + // world_pos: WorldPos::new(-15, 0, -24), + // }, + // WorldBlock { + // block_type: BlockType::Leaf, + // extra_data: BlockData::None, + // world_pos: WorldPos::new(-15, 0, -25), + // }, + // WorldBlock { + // block_type: BlockType::Leaf, + // extra_data: BlockData::None, + // world_pos: WorldPos::new(-14, 0, -24), + // }, + // WorldBlock { + // block_type: BlockType::Leaf, + // extra_data: BlockData::None, + // world_pos: WorldPos::new(-14, 0, -25), + // }, + // ], + // Rect3 { + // pos: FineWorldPos { + // x: -14.833749, + // y: 1.03, + // z: -25.27446, + // }, + // dim: Size3::new(1.0, 1.0, 1.0), + // }, + // FineWorldPos { + // x: -15.493927, + // y: 0.92999995, + // z: -24.523352, + // }, + // FineWorldPos { + // x: -15.493927, + // y: 1.03, + // z: -24.523352, + // }, + // ); + } + fn test_get_rect3_intersecting_blocks( block: WorldBlock, rect: Rect3, diff --git a/lib/world/src/utils.rs b/lib/world/src/utils.rs index 54529b0..e4d242b 100644 --- a/lib/world/src/utils.rs +++ b/lib/world/src/utils.rs @@ -1,7 +1,6 @@ - - - pub fn js_log(s: &str) { - use wasm_bindgen::JsValue; - web_sys::console::log_1(&JsValue::from_str(s)); -} \ No newline at end of file + if cfg!(target_arch = "wasm32") { + use wasm_bindgen::JsValue; + web_sys::console::log_1(&JsValue::from_str(s)); + } +} From a5563ac5e615fd10247c69429732c3a119caa443 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 25 May 2025 14:34:27 -0700 Subject: [PATCH 28/61] Fix rendering --- .../keyboardPlayerController.ts | 4 +--- apps/web-client/src/game-scripts/hudRender.ts | 21 ++++++++++++++----- apps/web-client/src/renders/renderer.ts | 8 +++++-- apps/web-client/src/runner.ts | 1 + 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts index a5b4e3d..29df067 100644 --- a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts +++ b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts @@ -15,8 +15,6 @@ export class KeyboardPlayerEntityController extends PlayerController { private keysPressed = new Set(); private currentMoveDirection: Direction | "None" = "None"; - private numOfUpdates = 0; - private hasJumped = false; constructor( @@ -66,7 +64,7 @@ export class KeyboardPlayerEntityController extends PlayerController { moveX += Math.PI; this.rotate(moveX, moveY); } else { - this.rotate(-moveX, moveY); + this.rotate(moveX, moveY); } } }); diff --git a/apps/web-client/src/game-scripts/hudRender.ts b/apps/web-client/src/game-scripts/hudRender.ts index c00514a..c75d698 100644 --- a/apps/web-client/src/game-scripts/hudRender.ts +++ b/apps/web-client/src/game-scripts/hudRender.ts @@ -4,7 +4,7 @@ import { getEleOrError, hideElement, IS_MOBILE } from "../utils"; import { GameMenu } from "../renders/gameMenuRender"; import React from "react"; import ReactDOM from "react-dom"; -import { Game } from "@craft/rust-world"; +import { Game, Player } from "@craft/rust-world"; export class HudGScript extends GameScript { name = "hud"; @@ -92,18 +92,29 @@ export class HudGScript extends GameScript { private lastStats = ""; drawStats() { - const mainPlayer = this.game.get_player_wasm(this.mainPlayerUid); + const mainPlayer: Player = this.game.get_player_wasm(this.mainPlayerUid); if (!mainPlayer) { return; } - const cameraPos = mainPlayer.pos.data - .map((d: number) => d.toFixed(2)) - .join(","); + const cameraPos = + "X: " + + mainPlayer.pos.x.toFixed(2) + + ", Y: " + + mainPlayer.pos.y.toFixed(2) + + ", Z: " + + mainPlayer.pos.z.toFixed(2); + + const cameraRot = + "Theta: " + + mainPlayer.rot.theta.toFixed(2) + + ", Phi: " + + mainPlayer.rot.phi.toFixed(2); // const numChunks = this.game.world.getLoadedChunkIds().length; const statsString = ` playerPos: ${cameraPos}
+ playerRot: ${cameraRot}
fps: ${this.canvasGScript.frameRate.toFixed(0)}
`; diff --git a/apps/web-client/src/renders/renderer.ts b/apps/web-client/src/renders/renderer.ts index 3f39d4d..4bc571a 100644 --- a/apps/web-client/src/renders/renderer.ts +++ b/apps/web-client/src/renders/renderer.ts @@ -15,7 +15,7 @@ export class RenderData implements IRenderData { indexOffset = 0; - constructor(private shouldLog = false) { } + constructor(private shouldLog = false) {} public pushData(renData: Partial) { if (this.shouldLog) { @@ -50,7 +50,7 @@ export abstract class Renderer { amount = 0; transAmount = 0; - constructor(protected webGlGScript: WebGlGScript) { } + constructor(protected webGlGScript: WebGlGScript) {} protected setBuffers(renData: IRenderData, transRenData?: IRenderData) { const gl = this.webGlGScript.gl; @@ -251,10 +251,14 @@ export abstract class Renderer { const phi = camera.rot.get(1); const modelViewMatrix = mat4.create(); + // Flip the image across the Y-axis by scaling X by -1 + mat4.scale(modelViewMatrix, modelViewMatrix, [-1, 1, 1]); + mat4.rotate(modelViewMatrix, modelViewMatrix, phi, [1, 0, 0]); mat4.rotate(modelViewMatrix, modelViewMatrix, theta, [0, 1, 0]); const move_pos = pos.sub(camera.pos).data; + // Now move the drawing position to where we want to start drawing the square. mat4.translate( modelViewMatrix, // destination matrix diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 7d36eb4..5fa4bd7 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -114,6 +114,7 @@ export async function run(id?: string) { game.game.update(); playerController.update(); canvasGameScript.update(); + hudRender.update(0); chunkGetter.update(); canvasGameScript.renderLoop(0); }; From 38de1050fba3a5b40ba3aeba48d1d9ad9abf6d95 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 25 May 2025 17:03:34 -0700 Subject: [PATCH 29/61] Collisions are basically perfect now! --- DEVLOG.md | 2 + .../keyboardPlayerController.ts | 34 +- apps/web-client/src/runner.ts | 2 +- lib/engine/entities/player/player.ts | 395 ------------------ lib/engine/src/wrappers.ts | 2 +- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/components/size3.rs | 14 +- lib/world/src/entities/entity_action.rs | 8 +- lib/world/src/entities/player.rs | 15 +- lib/world/src/entities/player_belt_script.rs | 8 +- .../src/entities/player_gravity_script.rs | 2 +- lib/world/src/entities/player_jump_script.rs | 2 +- lib/world/src/entities/player_move_script.rs | 2 +- lib/world/src/entities/player_rot_script.rs | 2 - lib/world/src/entities/velocity_script.rs | 11 +- lib/world/src/geometry/rect3.rs | 100 ++++- lib/world/src/plane.rs | 19 +- 17 files changed, 156 insertions(+), 464 deletions(-) delete mode 100644 lib/engine/entities/player/player.ts diff --git a/DEVLOG.md b/DEVLOG.md index 1ebc731..535969f 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -12,6 +12,8 @@ Claude found a bug that let the player fall through the world and came up with a There are still times where the player can go through the world a little and I'm not sure why it happens. It is very rare. But now jumping and gravity works well. +Okay, I have fixed the movement. This is the best I have ever had it. I can run around complicated block structures and not clip through them or teleport. I had to do a better sorting system where I sorted by the amount a collision would move me, not how close one of my faces was to the collision. + # 05_21_25 I've worked on making the server runner. I'm relizing it doesn't make a lot of sense to serpatate out the sp-game-serivce and the runner. The cut between them isn't that clean. I will just make two different runners and then see what logic I need to abstract to make a good UI. diff --git a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts index 29df067..edab474 100644 --- a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts +++ b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts @@ -29,7 +29,6 @@ export class KeyboardPlayerEntityController extends PlayerController { // Pointer lock to the canvas webGlCanvas.addEventListener("mousedown", (e: MouseEvent) => { - console.log("mousedown", e.target); if (e.target !== webGlCanvas) { return; } @@ -43,8 +42,6 @@ export class KeyboardPlayerEntityController extends PlayerController { return; } - console.log("mousedown", e.button); - if (e.button === 2) { this.primaryAction(); } else if (e.button === 0) { @@ -53,19 +50,24 @@ export class KeyboardPlayerEntityController extends PlayerController { e.preventDefault(); }); - window.addEventListener("mousemove", (e: MouseEvent) => { - if (document.pointerLockElement === webGlCanvas) { - let moveX = e.movementX * CONFIG.player.mouseRotSpeed; - const moveY = e.movementY * CONFIG.player.mouseRotSpeed; - - if ( - this.canvasGScript.perspective === PlayerPerspective.ThirdPersonFront - ) { - moveX += Math.PI; - this.rotate(moveX, moveY); - } else { - this.rotate(moveX, moveY); - } + webGlCanvas.addEventListener("mousemove", async (e: MouseEvent) => { + // When you press esc, the pointer lock is released, but the mousemove event is still triggered. This is a hack to let the document.pointerLockElement be updated. + await new Promise((resolve) => setTimeout(resolve, 0)); + + if (document.pointerLockElement !== webGlCanvas) { + return; + } + + let moveX = e.movementX * CONFIG.player.mouseRotSpeed; + const moveY = e.movementY * CONFIG.player.mouseRotSpeed; + + if ( + this.canvasGScript.perspective === PlayerPerspective.ThirdPersonFront + ) { + moveX += Math.PI; + this.rotate(moveX, moveY); + } else { + this.rotate(moveX, moveY); } }); diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 5fa4bd7..6a530ee 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -93,7 +93,7 @@ export async function run(id?: string) { ); const onAction = (action: EntityActionDto) => { - console.log("ACTION", action); + // console.log("ACTION", action); game.game.handle_action_wasm(action); }; diff --git a/lib/engine/entities/player/player.ts b/lib/engine/entities/player/player.ts deleted file mode 100644 index 03c380a..0000000 --- a/lib/engine/entities/player/player.ts +++ /dev/null @@ -1,395 +0,0 @@ -import { IEntity } from "../entity.js"; -import { IDim } from "../../types.js"; -import { MovableEntity, MovableEntityDto } from "../moveableEntity.js"; -import { CONFIG } from "../../src/config.js"; -import { Direction, Vector3D } from "../../src/vector.js"; -import CubeHelpers from "../cube.js"; -import { Game } from "../../game.js"; -import { IEntityType } from "../entityType.js"; -import { BlockType } from "@craft/rust-world"; -import { Item, ThrowableItem } from "../../item.js"; -import { Projectile } from "../projectile.js"; -import { PlayerAction } from "../../src/playerActions.js"; -import { World } from "../../world/index.js"; -import { GameWrapper } from "../../modules.js"; - -export interface BeltDto { - selectedBlock: Item; -} - -class Belt { - public selectedIndex = 0; - public items: Item[] = [ - BlockType.Stone, - BlockType.Gold, - BlockType.Grass, - BlockType.Wood, - BlockType.RedFlower, - BlockType.Cloud, - BlockType.Red, - BlockType.Planks, - BlockType.Leaf, - ThrowableItem.Fireball, - ]; - - get selectedItem() { - return this.items[this.selectedIndex]; - } - - getDto(): BeltDto { - return { - selectedBlock: this.selectedItem, - }; - } - - public getItem(index: number) { - const val = this.items[index]; - if (val) { - return val; - } - return null; - } - - public moveLeft() { - this.selectedIndex = - (this.selectedIndex - 1 + this.items.length) % this.items.length; - console.log("Moved left", this.selectedIndex); - } - - public moveRight() { - this.selectedIndex = (this.selectedIndex + 1) % this.items.length; - console.log("Moved right", this.selectedIndex); - } - - public setIndex(index: number) { - this.selectedIndex = index; - console.log("Set index", this.selectedIndex); - } -} - -export interface PlayerDto extends MovableEntityDto { - type: IEntityType.Player; - moveDirections: Direction[]; - rot: IDim; - belt: BeltDto; - health: { - current: number; - max: number; - }; -} - -// A controller / PlayerHandler will append actions to Player -export class Player extends MovableEntity implements IEntity { - // abstract values - static readonly type = IEntityType.Player; - get type() { - return Player.type; - } - - // Entity overrides - pos: Vector3D = new Vector3D([0, 50, 0]); - dim: IDim = [0.8, 2, 0.8]; - rot = new Vector3D([0, 0, Math.PI / 2]); - - // Player Member Variables - thirdPerson = false; - onGround = false; - distanceMoved = 0; // used for animating the arms and legs. Reset to zero when not moving - - belt = new Belt(); - - leftHandPosition = new Vector3D([1, 1, 0]); - rightHandPosition = new Vector3D([1, 1, 1]); - - health = { - current: 100, - max: 100, - }; - - fire = { - count: 0, - holding: false, - coolDown: 10, - }; - - creative = false; - - moveDirections: Direction[] = []; - - inventoryIndex = 0; - - static create(id: string): Player { - return new Player({ - uid: id, - }); - } - - getDto(): PlayerDto { - return { - ...this.baseDto(), - type: IEntityType.Player, - health: this.health, - rot: this.rot.data as IDim, - moveDirections: this.moveDirections, - belt: this.belt.getDto(), - }; - } - - set(player: Partial) { - super.baseSet(player); - if (player.health) { - this.health = player.health; - } - if (player.moveDirections) { - this.moveDirections = player.moveDirections; - } - if (player.rot) { - this.rot = new Vector3D(player.rot); - } - } - - isJumping = false; - haveDoubleJump = false; - jumpCount = 0; - tryJump() { - if (this.onGround) { - this.isJumping = true; - return; - } - if (!this.haveDoubleJump) { - this.isJumping = true; - this.haveDoubleJump = true; - } - } - - setCreative(val: boolean) { - console.log("Setting creative to", val); - this.creative = val; - } - - hurt(amount: number) { - this.health.current -= amount; - } - - godForce(): Vector3D | null { - const baseSpeed = CONFIG.player.speed; - - const moveDirection = (direction: Direction) => { - switch (direction) { - case Direction.Forwards: - return new Vector3D([-baseSpeed, this.rot.get(1), Math.PI / 2]) - .toCartesianCoords() - .set(1, 0); - case Direction.Backwards: - return new Vector3D([baseSpeed, this.rot.get(1), Math.PI / 2]) - .toCartesianCoords() - .set(1, 0); - case Direction.Left: - return new Vector3D([ - baseSpeed, - this.rot.get(1) + Math.PI / 2, - Math.PI / 2, - ]) - .toCartesianCoords() - .set(1, 0); - case Direction.Right: - return new Vector3D([ - baseSpeed, - this.rot.get(1) - Math.PI / 2, - Math.PI / 2, - ]) - .toCartesianCoords() - .set(1, 0); - case Direction.Up: - if (this.creative) { - return new Vector3D([0, baseSpeed, 0]); - } else { - return Vector3D.zero; - } - case Direction.Down: - if (this.creative) { - return new Vector3D([0, -baseSpeed, 0]); - } else { - return Vector3D.zero; - } - } - }; - - let desiredVel = Vector3D.zero; - if (this.creative) { - desiredVel.set(1, 0); - } else { - desiredVel.set(1, this.vel.get(1)); - } - for (const dir of this.moveDirections) { - const vel = moveDirection(dir); - if (vel) { - desiredVel = desiredVel.add(vel); - } - } - const currentVel = this.vel; - - let force = desiredVel.sub(currentVel); - - if (force.magnitude() > 0.025) { - force = force.normalize().scalarMultiply(0.025); - } - - return force; - } - - jumpForce(): Vector3D | null { - if (this.creative) { - return null; - } - if (!this.isJumping) { - return null; - } - this.isJumping = false; - - const diffYVel = CONFIG.player.jumpSpeed - this.vel.get(1); - return new Vector3D([0, diffYVel, 0]); - } - - gravityForce(): Vector3D | null { - if (this.creative) { - return null; - } - if (this.onGround) { - return null; - } - return new Vector3D([0, CONFIG.gravity, 0]); - } - - update(_game: Game, world: World, delta: number) { - const jumpForce = this.jumpForce(); - const gravityForce = this.gravityForce(); - const godForce = this.godForce(); - - const totalForce = ( - [godForce, jumpForce, gravityForce].filter((f) => f) as Vector3D[] - ).reduce((acc: Vector3D, f: Vector3D) => acc.add(f), Vector3D.zero); - - this.vel = this.vel.add(totalForce); - - // We did move - if (this.vel.magnitude() > 0) { - const scaledVel = this.vel.scalarMultiply(delta / 16); - const newPos = world.tryMove(this, scaledVel); - const actualVel = newPos.sub(this.pos); - this.pos = newPos; - - const moveDist = Math.abs(actualVel.get(0)) + Math.abs(actualVel.get(2)); - if (moveDist > 0) { - this.distanceMoved += moveDist; - } else { - this.distanceMoved = 0; - } - } else { - this.distanceMoved = 0; - } - - // set terminal velocity - // if (this.vel.get(1) < -0.9) { - // this.vel.set(1, -0.9); - // } - - if (this.fire.count > 0 && !this.fire.holding) this.fire.count--; - - // Am I on the ground? (Only need to check if I have moved) - const belowPos = this.pos.add(new Vector3D([0, -0.1, 0])); - const intersectingPoss = world.getIntersectingBlocksWithEntity( - belowPos, - new Vector3D(this.dim) - ); - - if (intersectingPoss.length > 0) { - this.vel.set(1, 0); - this.onGround = true; - this.isJumping = false; - this.haveDoubleJump = false; - } else { - this.onGround = false; - } - } - - // doPrimaryAction(game: Game) { - // const item = this.belt.selectedItem; - - // console.log("Doing primary action", item); - - // if (item === ThrowableItem.Fireball) { - // this.fireball(game); - // } else { - // this.placeBlock(game, item); - // } - // } - - // doSecondaryAction(game: GameWrapper) { - // const ray = this.getRay(); - - // const lookingData = game.getPointedAtBlock(this.camera); - // if (!lookingData) return; - // const { cube } = lookingData; - // if (!cube) return; - // game.removeBlock(cube); - // } - - private actionListeners: ((action: PlayerAction) => void)[] = []; - addActionListener(listener: (action: PlayerAction) => void) { - this.actionListeners.push(listener); - } - - // Right now this just send the action, the handling happens in playerAction.ts - handleAction(action: PlayerAction) { - console.log("Handling actionin palyer", action); - for (const listener of this.actionListeners) { - console.log("Calling listener"); - listener(action); - } - } - - // Player actions - // placeBlock(game: Game, blockType: BlockType) { - // const ray = this.getRay(); - // const lookingData = game.world.lookingAt(ray); - // if (!lookingData) return; - // console.log("Looking at data", lookingData); - // const { cube } = lookingData; - // if (!cube) return; - - // const newCubePos = lookingData.cube.pos.add( - // Vector3D.fromDirection(lookingData.face) - // ); - - // const newCube = CubeHelpers.createCube(blockType, newCubePos); - - // console.log("Placed Cube", newCube); - - // game.placeBlock(newCube); - // } - - fireball(game: Game) { - if (this.fire.count > 0) return; - - const vel = this.rot.toCartesianCoords().scalarMultiply(-0.4); - vel.set(1, -vel.get(1)); - - const pos = this.pos - .add(vel.scalarMultiply(2)) - .add(new Vector3D(this.dim).scalarMultiply(0.5)); - - console.log("Firing fireball", this, pos, vel); - - const ball = new Projectile({ - uid: "fireball-" + Math.random().toString().slice(2), - pos: pos.data as IDim, - vel: vel.data as IDim, - }); - ball.vel = vel; - - game.addEntity(ball); - - this.fire.count = this.fire.coolDown; - } -} diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index a42dec2..8555f47 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -150,7 +150,7 @@ export class PlayerWrapper { constructor(player: WorldWasm.Player) { this.uid = player.id; this.pos = new Vector3D([player.pos.x, player.pos.y, player.pos.z]); - this.dim = new Vector3D([1, 1, 1]); + this.dim = new Vector3D([player.size.x, player.size.y, player.size.z]); this.rot = new Vector3D([0, player.rot.phi, player.rot.theta]); this.moving_direction = player.moving_direction; } diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index aba30dc..4725cc7 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[49,50,52,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,51,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a95f46b9a28217b3f7cbaf6f93cc340008343303964ab180eaadd7b58e67a6a","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"2ac9d42b88663e5e0b4fc064b132445d84ca23bd822e12b43b9b79362e249773","signature":"775cc59b4ae0007d83834d10a4273997b97464773ef9e02b52358de844062ce4","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"5def06d7bb8068516b5ceb307f92eac2750636fcb1392da1cc94675ec36b4e63","signature":"3c709283e60c19e1441d18062b5e1a3ebdd27e3125a9f26fd98629b916fb7827","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"dec7988a350062d4ea1cd99a2f44fc57797a7921818e3c3cf2afdedb4cc2e4c7","signature":"e490d7d77f0e379a276d3282603fe4b74bb4cba966f146cfe96dbb0473cbcc35","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[49,50,52,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,51,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a95f46b9a28217b3f7cbaf6f93cc340008343303964ab180eaadd7b58e67a6a","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"fd3d7f4253bf69343df3d6e354aa23060347e088fd317bc6b84f51f00174ccc1","signature":"775cc59b4ae0007d83834d10a4273997b97464773ef9e02b52358de844062ce4","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"5def06d7bb8068516b5ceb307f92eac2750636fcb1392da1cc94675ec36b4e63","signature":"3c709283e60c19e1441d18062b5e1a3ebdd27e3125a9f26fd98629b916fb7827","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"dec7988a350062d4ea1cd99a2f44fc57797a7921818e3c3cf2afdedb4cc2e4c7","signature":"e490d7d77f0e379a276d3282603fe4b74bb4cba966f146cfe96dbb0473cbcc35","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"semanticDiagnosticsPerFile":[[52,[{"start":3392,"length":4,"code":2339,"category":1,"messageText":"Property 'size' does not exist on type 'Player'."},{"start":3407,"length":4,"code":2339,"category":1,"messageText":"Property 'size' does not exist on type 'Player'."},{"start":3422,"length":4,"code":2339,"category":1,"messageText":"Property 'size' does not exist on type 'Player'."}]]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file diff --git a/lib/world/src/components/size3.rs b/lib/world/src/components/size3.rs index e7c8c44..167e293 100644 --- a/lib/world/src/components/size3.rs +++ b/lib/world/src/components/size3.rs @@ -1,6 +1,10 @@ +use crate::{ + entities::entity_component::impl_component, + positions::{ChunkPos, InnerChunkPos}, + vec::{impl_vector_ops, Vector3Ops}, +}; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; -use crate::{entities::entity_component::impl_component, positions::{ChunkPos, InnerChunkPos}, vec::{impl_vector_ops, Vector3Ops}}; #[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq)] #[wasm_bindgen] @@ -10,6 +14,12 @@ pub struct Size3 { pub z: f32, } +impl Size3 { + pub fn new(x: f32, y: f32, z: f32) -> Self { + Self { x, y, z } + } +} + impl_component!(Size3); -impl_vector_ops!(Size3, f32); \ No newline at end of file +impl_vector_ops!(Size3, f32); diff --git a/lib/world/src/entities/entity_action.rs b/lib/world/src/entities/entity_action.rs index 3577c68..426605d 100644 --- a/lib/world/src/entities/entity_action.rs +++ b/lib/world/src/entities/entity_action.rs @@ -104,18 +104,14 @@ impl EntityActionHolder { ) -> GameSchedule { let mut schedule = GameSchedule::empty(); for action in &self.actions { - js_log(&format!("Handling action: {:?}", action)); - js_log(&format!("Action handlers: {:?}", self.handlers.len())); + // js_log(&format!("Handling action: {:?}", action)); + // js_log(&format!("Action handlers: {:?}", self.handlers.len())); let entity = entity_holder.get_entity_by_id_mut(action.entity_id); let mut action_handled = false; if let Some(entity) = entity { for handler in &self.handlers { if handler.get_action_type() == action.name { let new_schedule = handler.handle_dto(world, entity, action); - js_log(&format!( - "New schedule blocks: {:?}", - new_schedule.new_blocks - )); schedule.combine(new_schedule); action_handled = true; } diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index 438b69d..1564707 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -10,7 +10,7 @@ use super::{ velocity_script::Forces, }; use crate::{ - components::{fine_world_pos::FineWorldPos, velocity::Velocity}, + components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}, geometry::rotation::SphericalRotation, }; @@ -28,6 +28,7 @@ pub fn make_player(uid: EntityId) -> Entity { y: 10.0, z: 0.0, }); + ent.add::(Size3::new(0.8, 1.8, 0.8)); ent.add::(Velocity::default()); ent.add::(SphericalRotation::new(0.0, 0.0)); ent.add::(None); @@ -40,7 +41,7 @@ pub fn make_player(uid: EntityId) -> Entity { pub mod wasm { use crate::{ - components::{fine_world_pos::FineWorldPos, velocity::Velocity}, + components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}, entities::{ entity::{Entity, EntityId}, player_belt_script::Belt, @@ -63,6 +64,14 @@ pub mod wasm { pub rot: SphericalRotation, pub jump_data: JumpData, pub moving_direction: MovingDirection, + #[serde(default = "Player::default_size")] + pub size: Size3, + } + + impl Player { + fn default_size() -> Size3 { + Size3::new(0.8, 1.8, 0.8) + } } impl Player { @@ -74,6 +83,7 @@ pub mod wasm { rot: entity.get::().unwrap().clone(), moving_direction: entity.get::().unwrap().to_owned(), jump_data: entity.get::().unwrap().to_owned(), + size: entity.get::().unwrap().to_owned(), } } @@ -87,6 +97,7 @@ pub mod wasm { ent.add::(Belt::default()); ent.add::(GravityData { has_gravity: true }); ent.add::(Forces::default()); + ent.add::(Size3::new(0.8, 1.8, 0.8)); ent } } diff --git a/lib/world/src/entities/player_belt_script.rs b/lib/world/src/entities/player_belt_script.rs index 2f91622..36d9fc2 100644 --- a/lib/world/src/entities/player_belt_script.rs +++ b/lib/world/src/entities/player_belt_script.rs @@ -1,7 +1,8 @@ use crate::{ block::{BlockData, BlockType}, - components::fine_world_pos::FineWorldPos, + components::{fine_world_pos::FineWorldPos, size3::Size3}, geometry::{ray::Ray, rotation::SphericalRotation}, + utils::js_log, world::world_block::WorldBlock, }; @@ -58,8 +59,10 @@ impl EntityActionHandler for UsePrimaryItemAction { let selected_item = belt.selected_item; let belt_item = belt.belt_items[selected_item]; + let eye_pos_offset = FineWorldPos::new(0.4, 1.5, 0.4); + let camera_ray = Ray { - pos: *pos, + pos: pos.add(&eye_pos_offset), rot: *rot, }; @@ -67,6 +70,7 @@ impl EntityActionHandler for UsePrimaryItemAction { if let Some(pointed_at) = pointed_at { let looking_at_pos = pointed_at.block.world_pos; + js_log(&format!("looking_at_pos: {:?}", looking_at_pos)); let new_pos = looking_at_pos.move_direction(&pointed_at.face); let block = WorldBlock { block_type: belt_item, diff --git a/lib/world/src/entities/player_gravity_script.rs b/lib/world/src/entities/player_gravity_script.rs index f903620..2f0c3f6 100644 --- a/lib/world/src/entities/player_gravity_script.rs +++ b/lib/world/src/entities/player_gravity_script.rs @@ -24,7 +24,7 @@ pub struct GravityScript { impl Default for GravityScript { fn default() -> Self { - Self { gravity: 0.05 } + Self { gravity: 0.025 } } } diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/entities/player_jump_script.rs index 6ee6f24..bcad204 100644 --- a/lib/world/src/entities/player_jump_script.rs +++ b/lib/world/src/entities/player_jump_script.rs @@ -65,7 +65,7 @@ pub struct JumpData { impl Default for JumpData { fn default() -> Self { - Self::new(0.5) + Self::new(0.25) } } diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs index 5b9712d..ffd7121 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/entities/player_move_script.rs @@ -61,7 +61,7 @@ pub struct MoveScript { impl Default for MoveScript { fn default() -> Self { - Self { max_speed: 0.5 } + Self { max_speed: 0.2 } } } diff --git a/lib/world/src/entities/player_rot_script.rs b/lib/world/src/entities/player_rot_script.rs index 667991d..0e986e2 100644 --- a/lib/world/src/entities/player_rot_script.rs +++ b/lib/world/src/entities/player_rot_script.rs @@ -37,8 +37,6 @@ impl EntityActionHandler for RotateAction { let new_rot = entity.get::().unwrap().to_owned() + data.rot_diff; - js_log(&format!("New rot: {:?}", new_rot)); - entity.set::(new_rot); GameSchedule::empty() diff --git a/lib/world/src/entities/velocity_script.rs b/lib/world/src/entities/velocity_script.rs index 1ca99b7..ad9cc11 100644 --- a/lib/world/src/entities/velocity_script.rs +++ b/lib/world/src/entities/velocity_script.rs @@ -35,6 +35,7 @@ impl GameScript for VelocityScript { let mut query = EntityQuery::new(); query.add::(); query.add::(); + query.add::(); query } @@ -46,20 +47,14 @@ impl GameScript for VelocityScript { for entity in query_results.entities { let mut vel = entity.get::().unwrap().to_owned(); let pos = entity.get::().unwrap().to_owned(); + let size = entity.get::().unwrap().to_owned(); let forces = entity.get::().unwrap().to_owned(); for force in forces.forces.iter() { vel = vel.add(force); } - let player_rect = Rect3 { - pos, - dim: Size3 { - x: 1.0, - y: 1.0, - z: 1.0, - }, - }; + let player_rect = Rect3 { pos, dim: size }; let end_pos = pos + vel; diff --git a/lib/world/src/geometry/rect3.rs b/lib/world/src/geometry/rect3.rs index d9ed2db..5657bf8 100644 --- a/lib/world/src/geometry/rect3.rs +++ b/lib/world/src/geometry/rect3.rs @@ -19,7 +19,7 @@ pub struct Rect3 { pub dim: Size3, } -static DISTANCE_EPSILON: f32 = 0.03; +static DISTANCE_EPSILON: f32 = 0.01; impl Rect3 { pub fn get_all_points(&self) -> [FineWorldPos; 8] { @@ -102,6 +102,24 @@ impl Rect3 { } impl World { + pub fn get_rect3_intersection_infos( + &self, + rect: &Rect3, + end_pos: FineWorldPos, + ) -> Vec { + let diff = end_pos.sub(&rect.pos); + + let line_segments = rect.get_all_points().map(|point| LineSegment { + start_pos: point, + end_pos: point.add(&diff), + }); + + line_segments + .iter() + .filter_map(|seg| self.get_line_segment_intersection_info(*seg)) + .collect() + } + pub fn get_moving_rect3_intersection_info( &self, rect: &Rect3, @@ -144,14 +162,18 @@ impl World { // loop 3 times to handle multiple collisions one for each axis for iteration in 0..3 { // Check for collisions from current position to target - let intersection = - self.get_moving_rect3_intersection_info(¤t_rect, current_end_pos); + let intersections = self.get_rect3_intersection_infos(¤t_rect, current_end_pos); + + if intersections.is_empty() { + break; + } - if let Some(info) = intersection { - // Only adjust the axis that was hit, leave other axes unchanged - let hit_axis = info.world_plane.direction.to_axis(); - let outward = info.world_plane.direction.is_outward(); - let hit_plane_pos = info.world_plane.get_relative_y() as f32; + // Calculate the intersection that would push the rect the least + let mut axis_diffs = Vec::new(); + for intersection in &intersections { + let hit_axis = intersection.world_plane.direction.to_axis(); + let outward = intersection.world_plane.direction.is_outward(); + let hit_plane_pos = intersection.world_plane.get_relative_y() as f32; let new_axis_pos = if outward { hit_plane_pos + DISTANCE_EPSILON @@ -160,19 +182,59 @@ impl World { hit_plane_pos - (rect_dim_dir + DISTANCE_EPSILON) }; - // Only update the hit axis, preserve movement on other axes - current_end_pos.set_component_from_axis(hit_axis, new_axis_pos); - current_rect - .pos - .set_component_from_axis(hit_axis, new_axis_pos); - - js_log(&format!( - "intersection (iteration {}): {:?}, new_pos: {:?}", - iteration, info, current_end_pos - )); - } else { + let current_end_pos_intersection_axis_val = + current_end_pos.get_component_from_axis(hit_axis); + + let diff = new_axis_pos - current_end_pos_intersection_axis_val; + + axis_diffs.push((hit_axis, diff, new_axis_pos)); + } + + let min_diff = axis_diffs + .iter() + .min_by(|a, b| a.1.abs().partial_cmp(&b.1.abs()).unwrap_or(Ordering::Equal)); + + if min_diff.is_none() { + // No valid intersection found, break out of the loop break; } + + let (hit_axis, _, new_axis_pos) = min_diff.unwrap(); + + // Push the rect! + current_end_pos.set_component_from_axis(*hit_axis, *new_axis_pos); + current_rect + .pos + .set_component_from_axis(*hit_axis, *new_axis_pos); + + let intersections_string = intersections + .iter() + .map(|info| format!("\n {:?}", info)) + .collect::>() + .join(", "); + + let axises_diff_string = axis_diffs + .iter() + .map(|(axis, diff, new_axis_pos)| { + format!( + "\n axis: {:?}, diff: {:?}, new_axis_pos: {:?}", + axis, diff, new_axis_pos + ) + }) + .collect::>() + .join(", "); + + js_log(&format!( + "({:?}) hit_axis: {:?}, \naxises_diff: {}, \nintersections: {}, \nstart_pos: {:?}, \ntrying_to_go_to: {:?}, \ncurrent_rect_pos: {:?}, \ncurrent_end_pos: {:?}", + iteration, + hit_axis, + axises_diff_string, + intersections_string, + rect.pos, + end_pos, + current_rect.pos, + current_end_pos + )); } current_end_pos diff --git a/lib/world/src/plane.rs b/lib/world/src/plane.rs index 0c2c74f..ec9ef92 100644 --- a/lib/world/src/plane.rs +++ b/lib/world/src/plane.rs @@ -1,7 +1,8 @@ -use serde::{Deserialize, Serialize}; use crate::{ - components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, direction::{Direction, DirectionVectorExtension} + components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, + direction::{Direction, DirectionVectorExtension}, }; +use serde::{Deserialize, Serialize}; #[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Copy)] pub struct WorldPlane { @@ -9,6 +10,8 @@ pub struct WorldPlane { pub direction: Direction, } +const DISTANCE_EPSILON: f32 = 0.0001; + impl WorldPlane { pub fn new(world_pos: WorldPos, direction: Direction) -> WorldPlane { WorldPlane { @@ -55,9 +58,11 @@ impl WorldPlane { // their_x, their_y, their_z // ); - let contains_y = (my_y as f32 - their_y).abs() < 0.01; - let contains_x = (my_x as f32) - 0.01 <= their_x && my_x as f32 + 1.01 >= their_x; - let contains_z = (my_z as f32) - 0.01 <= their_z && my_z as f32 + 1.01 >= their_z; + let contains_y = (my_y as f32 - their_y).abs() < DISTANCE_EPSILON; + let contains_x = (my_x as f32) - DISTANCE_EPSILON <= their_x + && my_x as f32 + 1.0 + DISTANCE_EPSILON >= their_x; + let contains_z = (my_z as f32) - DISTANCE_EPSILON <= their_z + && my_z as f32 + 1.0 + DISTANCE_EPSILON >= their_z; // println!( // "Contains x: {}, Contains y: {}, Contains z: {}", @@ -71,7 +76,9 @@ impl WorldPlane { #[cfg(test)] mod tests { use crate::{ - components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, direction::Direction, vec::Vector3Ops + components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, + direction::Direction, + vec::Vector3Ops, }; use super::WorldPlane; From de817a53c32922526a757d6ac8bec099e925259c Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Mon, 26 May 2025 11:26:42 -0700 Subject: [PATCH 30/61] Much better UI --- apps/web-client/index.html | 8 +- apps/web-client/index_real.html | 94 ----- apps/web-client/package.json | 4 +- apps/web-client/src/App.tsx | 18 +- apps/web-client/{public => src}/app.css | 14 +- .../src/components/ClientGameView.tsx | 27 ++ .../src/components/ClientHomePage.tsx | 48 +++ apps/web-client/src/components/HomePage.tsx | 68 +--- .../{GameView.tsx => ServerGameView.tsx} | 4 +- .../src/components/ServerHomePage.tsx | 71 ++++ .../keyboardPlayerController.ts | 2 +- .../playerControllers/mobileController.ts | 13 +- apps/web-client/src/index.tsx | 8 +- apps/web-client/src/runner.ts | 16 +- apps/web-client/vite.config.js | 12 +- lib/engine/src/playerActions.ts | 16 +- lib/engine/src/wrappers.ts | 5 +- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/entities/game.rs | 27 +- lib/world/src/entities/player.rs | 2 +- lib/world/src/entities/player_belt_script.rs | 57 ++- .../src/entities/player_gravity_script.rs | 2 +- lib/world/src/entities/velocity_script.rs | 14 - lib/world/src/geometry/rect3.rs | 56 +-- lib/world/src/world/world_duct.rs | 5 - yarn.lock | 383 +++++++++++++++++- 26 files changed, 695 insertions(+), 281 deletions(-) delete mode 100644 apps/web-client/index_real.html rename apps/web-client/{public => src}/app.css (97%) create mode 100644 apps/web-client/src/components/ClientGameView.tsx create mode 100644 apps/web-client/src/components/ClientHomePage.tsx rename apps/web-client/src/components/{GameView.tsx => ServerGameView.tsx} (95%) create mode 100644 apps/web-client/src/components/ServerHomePage.tsx diff --git a/apps/web-client/index.html b/apps/web-client/index.html index c547c42..8e5936b 100644 --- a/apps/web-client/index.html +++ b/apps/web-client/index.html @@ -1,16 +1,14 @@ TylerCraft - -
- - + +
@@ -53,7 +51,7 @@
- + diff --git a/apps/web-client/index_real.html b/apps/web-client/index_real.html deleted file mode 100644 index 86799f6..0000000 --- a/apps/web-client/index_real.html +++ /dev/null @@ -1,94 +0,0 @@ - - TylerCraft - - - - - - -
- -
- -

Tyler Craft

-

A 3D sandbox by Tyler Tracy

-
-
- -
- - - - - - - - -
- -
- - -
- - - -
-
-
-
- -
- 0,0,0
- Fps: -
- -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - \ No newline at end of file diff --git a/apps/web-client/package.json b/apps/web-client/package.json index 2e9aef0..0cc4462 100644 --- a/apps/web-client/package.json +++ b/apps/web-client/package.json @@ -10,10 +10,12 @@ }, "dependencies": { "@craft/engine": "1.0.0", + "@tailwindcss/vite": "^4.1.7", "gl-matrix": "2.4.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-router-dom": "^6.8.0" + "react-router-dom": "^6.8.0", + "tailwindcss": "^4.1.7" }, "devDependencies": { "@craft/eslint-config-tylercraft": "^1.0.0", diff --git a/apps/web-client/src/App.tsx b/apps/web-client/src/App.tsx index 5267225..7caef5a 100644 --- a/apps/web-client/src/App.tsx +++ b/apps/web-client/src/App.tsx @@ -1,17 +1,21 @@ import React from "react"; import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; import HomePage from "./components/HomePage"; -import GameView from "./components/GameView"; +import { ServerGameView } from "./components/ServerGameView"; +import { ServerHomePage } from "./components/ServerHomePage"; +import { ClientHomePage } from "./components/ClientHomePage"; +import { ClientGameView } from "./components/ClientGameView"; function App() { return ( -
- - } /> - } /> - -
+ + } /> + } /> + } /> + } /> + } /> +
); } diff --git a/apps/web-client/public/app.css b/apps/web-client/src/app.css similarity index 97% rename from apps/web-client/public/app.css rename to apps/web-client/src/app.css index d1fd37a..004625a 100644 --- a/apps/web-client/public/app.css +++ b/apps/web-client/src/app.css @@ -1,3 +1,6 @@ +@import "tailwindcss"; + + @keyframes lift { 0% { box-shadow: 8px 8px 10px grey; @@ -24,6 +27,7 @@ body { margin: 0px; padding: 0px; font-family: "Roboto", sans-serif; + background-color: #00ccff; } /* ======================== @@ -234,12 +238,13 @@ h1 { button { border: none; padding: 10px 100px; - margin-bottom: 30px; + margin: 30px; font-size: 3em; font-family: "Roboto", sans-serif; cursor: pointer; box-shadow: 8px 8px 10px grey; border-radius: 10px; + background-color: white; } button:hover { @@ -247,13 +252,12 @@ button:hover { animation: lift 0.1s linear; } -#backButton { +.backButton { font-size: 6em; position: absolute; - top: -30px; + top: -40px; cursor: pointer; - left: 0px; - display: none; + left: 10px; } #backButton.shown { diff --git a/apps/web-client/src/components/ClientGameView.tsx b/apps/web-client/src/components/ClientGameView.tsx new file mode 100644 index 0000000..31ecb2b --- /dev/null +++ b/apps/web-client/src/components/ClientGameView.tsx @@ -0,0 +1,27 @@ +import React, { useEffect, useState } from "react"; +import { useParams } from "react-router-dom"; +import { run } from "../runner"; + +export function ClientGameView() { + const { gameId } = useParams<{ gameId: string }>(); + const [isJoined, setIsJoined] = useState(false); + + if (!gameId) { + return
No game ID provided
; + } + + function joinGame(gameId: string) { + run(gameId); + setIsJoined(true); + } + + useEffect(() => { + joinGame(gameId); + }, [gameId]); + + if (isJoined) { + return
; + } + + return
Loading...
; +} diff --git a/apps/web-client/src/components/ClientHomePage.tsx b/apps/web-client/src/components/ClientHomePage.tsx new file mode 100644 index 0000000..26480c2 --- /dev/null +++ b/apps/web-client/src/components/ClientHomePage.tsx @@ -0,0 +1,48 @@ +import { IGameMetadata } from "@craft/engine"; +import React, { useEffect, useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { spGameService } from "../runner"; + +export function ClientHomePage() { + const [games, setGames] = useState([]); + const [loading, setLoading] = useState(true); + const navigate = useNavigate(); + + const newGame = async () => { + console.log("Starting game"); + const game = spGameService.newGame(); + navigate(`/client-game/${game.game.id}`); + }; + + useEffect(() => { + spGameService.getAllGames().then((games) => { + setGames(games); + setLoading(false); + }); + }, []); + + if (loading) { + return
Loading...
; + } + + return ( +
+
navigate("/")}> + ⬅ +
+

Local Games

+
+ {games.length > 0 && + games.map((game) => ( +
+ +
+ ))} + {games.length === 0 &&

No games available

} + +
+
+ ); +} diff --git a/apps/web-client/src/components/HomePage.tsx b/apps/web-client/src/components/HomePage.tsx index ec0328a..2b5301c 100644 --- a/apps/web-client/src/components/HomePage.tsx +++ b/apps/web-client/src/components/HomePage.tsx @@ -1,70 +1,18 @@ -import { IServerGameMetadata } from "@craft/engine"; -import React, { useEffect, useState } from "react"; +import React from "react"; import { useNavigate } from "react-router-dom"; -import { createGame, getAllGames } from "../services/mp-games-service"; function HomePage() { - const [games, setGames] = useState([]); - const [loading, setLoading] = useState(true); const navigate = useNavigate(); - const createGameWrapper = async (gameId: string) => { - console.log("Starting game", gameId); - const game = await createGame(gameId); - navigate(`/game/${game}`); - }; - - useEffect(() => { - getAllGames().then((games) => { - setGames(games); - setLoading(false); - }); - }, []); - - if (loading) { - return
Loading...
; - } - return ( -
-

TylerCraft Games

+
+

TylerCraft

+

+ A 3D sandbox by Tyler Tracy +

-

Existing Games

- {games.length > 0 ? ( -
- {games.map((game) => ( -
- {game.name} - -
- ))} -
- ) : ( -

No games available

- )} -
-
-

Create New Game

- + +
); diff --git a/apps/web-client/src/components/GameView.tsx b/apps/web-client/src/components/ServerGameView.tsx similarity index 95% rename from apps/web-client/src/components/GameView.tsx rename to apps/web-client/src/components/ServerGameView.tsx index 95d1474..c0a5ddf 100644 --- a/apps/web-client/src/components/GameView.tsx +++ b/apps/web-client/src/components/ServerGameView.tsx @@ -2,7 +2,7 @@ import React, { useState } from "react"; import { useParams, useNavigate } from "react-router-dom"; import { startGame, serverRunner } from "../services/mp-games-service"; -function GameView() { +export function ServerGameView() { const { gameId } = useParams<{ gameId: string }>(); const navigate = useNavigate(); const [isJoined, setIsJoined] = useState(false); @@ -45,5 +45,3 @@ function GameView() {
); } - -export default GameView; diff --git a/apps/web-client/src/components/ServerHomePage.tsx b/apps/web-client/src/components/ServerHomePage.tsx new file mode 100644 index 0000000..559051c --- /dev/null +++ b/apps/web-client/src/components/ServerHomePage.tsx @@ -0,0 +1,71 @@ +import { IServerGameMetadata } from "@craft/engine"; +import React, { useEffect, useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { createGame, getAllGames } from "../services/mp-games-service"; + +export function ServerHomePage() { + const [games, setGames] = useState([]); + const [loading, setLoading] = useState(true); + const navigate = useNavigate(); + + const createGameWrapper = async (gameId: string) => { + console.log("Starting game", gameId); + const game = await createGame(gameId); + navigate(`/game/${game}`); + }; + + useEffect(() => { + getAllGames().then((games) => { + setGames(games); + setLoading(false); + }); + }, []); + + if (loading) { + return
Loading...
; + } + + return ( +
+

TylerCraft Games

+
+

Existing Games

+ {games.length > 0 ? ( +
+ {games.map((game) => ( +
+ {game.name} + +
+ ))} +
+ ) : ( +

No games available

+ )} +
+
+

Create New Game

+ +
+
+ ); +} diff --git a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts index edab474..7594a5f 100644 --- a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts +++ b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts @@ -45,7 +45,7 @@ export class KeyboardPlayerEntityController extends PlayerController { if (e.button === 2) { this.primaryAction(); } else if (e.button === 0) { - this.primaryAction(); + this.secondaryAction(); } e.preventDefault(); }); diff --git a/apps/web-client/src/controllers/playerControllers/mobileController.ts b/apps/web-client/src/controllers/playerControllers/mobileController.ts index 6e45a9f..2d2f45d 100644 --- a/apps/web-client/src/controllers/playerControllers/mobileController.ts +++ b/apps/web-client/src/controllers/playerControllers/mobileController.ts @@ -1,11 +1,6 @@ -import { - MetaAction, - Vector2D, - PlayerController, - PlayerActionService, -} from "@craft/engine"; -import { GameWrapper } from "@craft/engine/modules"; +import { EntityActionDto } from "@craft/rust-world"; import { getEleOrError } from "../../utils"; +import { Vector2D, PlayerController, GameWrapper } from "@craft/engine"; export class MobileController extends PlayerController { private eForwardButton = getEleOrError("forwardButton"); @@ -16,8 +11,8 @@ export class MobileController extends PlayerController { private eUseItemButton = getEleOrError("useItemButton"); private eUseItemButton2 = getEleOrError("useItemButton2"); - constructor(game: GameWrapper, playerId: number) { - super(game.makeJumpAction, playerId); + constructor(onAction: (action: EntityActionDto) => void, playerId: number) { + super(onAction, playerId); let lastWindowTouch: Touch; const lastTouchStartPos = new Vector2D([0, 0]); diff --git a/apps/web-client/src/index.tsx b/apps/web-client/src/index.tsx index 128473f..22b6824 100644 --- a/apps/web-client/src/index.tsx +++ b/apps/web-client/src/index.tsx @@ -1,10 +1,8 @@ import React from "react"; import ReactDOM from "react-dom/client"; +import "./app.css"; + import App from "./App"; -ReactDOM.createRoot(document.getElementById("root")!).render( - - - -); +ReactDOM.createRoot(document.getElementById("root")!).render(); diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 6a530ee..c03475b 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -13,7 +13,6 @@ import { } from "@craft/rust-world"; import { ClientDbGamesService } from "./services/sp-games-service"; import { HudGScript } from "./game-scripts/hudRender"; -// import { eStartMenu } from "./elements"; class SinglePlayerTerrainChunkGetter { private chunks_to_insert: Chunk[] = []; @@ -40,15 +39,14 @@ class SinglePlayerTerrainChunkGetter { } } -const spGameService = await ClientDbGamesService.factory(); +export const spGameService = await ClientDbGamesService.factory(); export async function run(id?: string) { - // Start the game - console.log("RUNNING Starting game"); - - // hideElement(eStartMenu); + console.log("Starting game", id); const game = id ? await spGameService.getGame(id) : spGameService.newGame(); + console.log("Game", game); + (window as any).game = game; if (!game) { @@ -130,11 +128,5 @@ export async function run(id?: string) { // ); // }, 3000); - console.log("Starting"); - - console.log(canvasGameScript); - canvasGameScript.renderLoop(0); } - -run("f27fa11d-bf9e-4f82-8a3e-9e87a02c3870"); diff --git a/apps/web-client/vite.config.js b/apps/web-client/vite.config.js index fb404fe..bcd55d0 100644 --- a/apps/web-client/vite.config.js +++ b/apps/web-client/vite.config.js @@ -2,6 +2,7 @@ import { defineConfig } from "vite"; import wasm from "vite-plugin-wasm"; import topLevelAwait from "vite-plugin-top-level-await"; import react from "@vitejs/plugin-react"; +import tailwindcss from "@tailwindcss/vite"; export default defineConfig({ optimizeDeps: { @@ -19,7 +20,16 @@ export default defineConfig({ // }, // }, }, - plugins: [react(), wasm(), topLevelAwait()], + server: { + allowedHosts: [ + "localhost", + "127.0.0.1", + "0.0.0.0", + "bd99-66-54-100-22.ngrok-free.app", + ], + }, + + plugins: [tailwindcss(), react(), wasm(), topLevelAwait()], worker: { format: "es", plugins: () => [wasm(), topLevelAwait()], diff --git a/lib/engine/src/playerActions.ts b/lib/engine/src/playerActions.ts index b13e9d5..ce09edd 100644 --- a/lib/engine/src/playerActions.ts +++ b/lib/engine/src/playerActions.ts @@ -4,6 +4,7 @@ import { JumpAction, MoveAction, RotateAction, + SecondaryBeltAction, SphericalRotation, UsePrimaryItemAction, } from "@craft/rust-world"; @@ -48,23 +49,12 @@ export abstract class PlayerController { primaryAction() { const action = UsePrimaryItemAction.make_wasm(this.playerId); - console.log("primaryAction", action); this.handleAction(action); - // const action = PlayerAction.make(PlayerActionType.PlaceBlock, { - // playerUid: this.player.uid, - // playerPos: this.player.pos.data as IDim, - // playerRot: this.player.rot.data as IDim, - // }); - // this.playerActionService.performAction(action); } secondaryAction() { - // const action = PlayerAction.make(PlayerActionType.RemoveBlock, { - // playerUid: this.player.uid, - // playerPos: this.player.pos.data as IDim, - // playerRot: this.player.rot.data as IDim, - // }); - // this.playerActionService.performAction(action); + const action = SecondaryBeltAction.make_wasm(this.playerId); + this.handleAction(action); } selectBelt(pos: number) { diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index 8555f47..cc49ef3 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -238,9 +238,10 @@ export class GameWrapper { getChunkMeshFromChunkPos(chunkId: number): ChunkMeshWrapper { const id = BigInt(chunkId); - console.log("Getting chunk mesh", chunkId); + const start = performance.now(); const val = this.game.get_chunk_mesh_by_chunkid_wasm(id); - console.log("Got chunk mesh", val); + const end = performance.now(); + console.log("Time taken to get chunk mesh", end - start, " ms"); return new ChunkMeshWrapper(val); } diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 4725cc7..8c7cceb 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[49,50,52,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,51,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a95f46b9a28217b3f7cbaf6f93cc340008343303964ab180eaadd7b58e67a6a","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"fd3d7f4253bf69343df3d6e354aa23060347e088fd317bc6b84f51f00174ccc1","signature":"775cc59b4ae0007d83834d10a4273997b97464773ef9e02b52358de844062ce4","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"5def06d7bb8068516b5ceb307f92eac2750636fcb1392da1cc94675ec36b4e63","signature":"3c709283e60c19e1441d18062b5e1a3ebdd27e3125a9f26fd98629b916fb7827","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"dec7988a350062d4ea1cd99a2f44fc57797a7921818e3c3cf2afdedb4cc2e4c7","signature":"e490d7d77f0e379a276d3282603fe4b74bb4cba966f146cfe96dbb0473cbcc35","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"semanticDiagnosticsPerFile":[[52,[{"start":3392,"length":4,"code":2339,"category":1,"messageText":"Property 'size' does not exist on type 'Player'."},{"start":3407,"length":4,"code":2339,"category":1,"messageText":"Property 'size' does not exist on type 'Player'."},{"start":3422,"length":4,"code":2339,"category":1,"messageText":"Property 'size' does not exist on type 'Player'."}]]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[49,50,52,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,51,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"8bb25a84541f5e341fb338b1197221aef44d97c0d86196d67ac3c750782a8533","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"4f14d9949e48513b149f5230ed536e3bc3b40f2e5071a82b597b905673484136","signature":"775cc59b4ae0007d83834d10a4273997b97464773ef9e02b52358de844062ce4","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"82e50235c2eb99c8e42e249202ea91847e4f4ff59937f8f2c9a519a184e6a997","signature":"3c709283e60c19e1441d18062b5e1a3ebdd27e3125a9f26fd98629b916fb7827","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"dec7988a350062d4ea1cd99a2f44fc57797a7921818e3c3cf2afdedb4cc2e4c7","signature":"e490d7d77f0e379a276d3282603fe4b74bb4cba966f146cfe96dbb0473cbcc35","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index f72fc14..2c2fb5f 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -5,10 +5,11 @@ use super::{ }; use crate::{ chunk::{Chunk, ChunkId}, + components::world_pos::WorldPos, entities::{ entity_action::EntityActionDtoMaker, player::wasm::Player, - player_belt_script::UsePrimaryItemAction, + player_belt_script::{SecondaryBeltAction, UsePrimaryItemAction}, player_gravity_script::GravityScript, player_jump_script::JumpAction, player_move_script::{MoveAction, MoveScript}, @@ -45,6 +46,8 @@ impl Game { self.action_holder.add_handler(RotateAction::make_handler()); self.action_holder .add_handler(UsePrimaryItemAction::make_handler()); + self.action_holder + .add_handler(SecondaryBeltAction::make_handler()); self.update(); } @@ -127,6 +130,12 @@ impl Game { self.world.add_block(&block); } + // remove blocks from world + let removed_blocks = std::mem::take(&mut self.schedule.removed_blocks); + for block_pos in removed_blocks { + self.world.remove_block(&block_pos); + } + self.schedule.clear(); } @@ -177,7 +186,7 @@ pub struct GameSchedule { pub new_blocks: Vec, pub new_chunks: Vec, pub removed_entities: Vec, - pub removed_blocks: Vec, + pub removed_blocks: Vec, } impl GameSchedule { @@ -211,6 +220,12 @@ impl GameSchedule { updated_chunks.push(chunk_pos.to_id()); } } + for block_pos in self.removed_blocks.iter() { + let chunk_pos = block_pos.to_chunk_pos(); + if !updated_chunks.contains(&chunk_pos.to_id()) { + updated_chunks.push(chunk_pos.to_id()); + } + } for new_chunk in self.new_chunks.iter() { if !updated_chunks.contains(&new_chunk.get_id()) { updated_chunks.push(new_chunk.get_id()); @@ -239,6 +254,10 @@ impl GameSchedule { self.new_blocks.push(block); } + pub fn remove_block(&mut self, block_pos: WorldPos) { + self.removed_blocks.push(block_pos); + } + pub fn add_chunk(&mut self, chunk: Chunk) { self.new_chunks.push(chunk); } @@ -396,10 +415,6 @@ pub mod wasm { } pub fn get_chunk_mesh_by_chunkid_wasm(&self, chunk_id: ChunkId) -> Result { - web_sys::console::log_1(&JsValue::from_str(&format!( - "Rust Getting chunk mesh: {}", - chunk_id - ))); self.world.get_chunk_mesh_wasm(chunk_id) } diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index 1564707..1b14f82 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -53,7 +53,7 @@ pub mod wasm { geometry::rotation::SphericalRotation, }; use serde::{Deserialize, Serialize}; - use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; + use wasm_bindgen::prelude::wasm_bindgen; #[derive(Serialize, Deserialize, Debug, Clone)] #[wasm_bindgen] diff --git a/lib/world/src/entities/player_belt_script.rs b/lib/world/src/entities/player_belt_script.rs index 36d9fc2..54f1fe3 100644 --- a/lib/world/src/entities/player_belt_script.rs +++ b/lib/world/src/entities/player_belt_script.rs @@ -1,6 +1,6 @@ use crate::{ block::{BlockData, BlockType}, - components::{fine_world_pos::FineWorldPos, size3::Size3}, + components::fine_world_pos::FineWorldPos, geometry::{ray::Ray, rotation::SphericalRotation}, utils::js_log, world::world_block::WorldBlock, @@ -13,10 +13,9 @@ use super::{ entity::{Entity, EntityId}, entity_action::{EntityActionDto, EntityActionDtoMaker}, entity_component::impl_component, - player::Flying, }; use crate::direction::DirectionVectorExtension; -use crate::{components::velocity::Velocity, vec::Vector3Ops, world::World}; +use crate::{vec::Vector3Ops, world::World}; use wasm_bindgen::prelude::wasm_bindgen; #[wasm_bindgen] @@ -85,8 +84,60 @@ impl EntityActionHandler for UsePrimaryItemAction { } } +#[wasm_bindgen] +#[derive(Clone, Debug, Default)] pub struct SecondaryBeltAction {} +#[wasm_bindgen] +impl SecondaryBeltAction { + pub fn make_wasm(entity_id: EntityId) -> EntityActionDto { + let data = SecondaryBeltActionData {}; + SecondaryBeltAction::make_dto(entity_id, data) + } +} + +#[wasm_bindgen] +#[derive(Clone, Debug, Default)] +pub struct SecondaryBeltActionData {} + +impl EntityActionDtoMaker for SecondaryBeltAction { + fn get_action_type_static() -> &'static str { + "SecondaryBeltAction" + } +} + +impl EntityActionHandler for SecondaryBeltAction { + fn get_action_type(&self) -> &'static str { + "SecondaryBeltAction" + } + + fn handle_dto( + &self, + world: &World, + entity: &mut Entity, + _data: &EntityActionDto, + ) -> GameSchedule { + let mut schedule = GameSchedule::empty(); + let pos = entity.get::().unwrap(); + let rot = entity.get::().unwrap(); + let eye_pos_offset = FineWorldPos::new(0.4, 1.5, 0.4); + + let camera_ray = Ray { + pos: pos.add(&eye_pos_offset), + rot: *rot, + }; + + let pointed_at = world.get_pointed_at_block(camera_ray); + + if let Some(pointed_at) = pointed_at { + let looking_at_pos = pointed_at.block.world_pos; + schedule.remove_block(looking_at_pos); + } + + schedule + } +} + pub struct SelectItemAction {} #[derive(Debug, Serialize, Deserialize)] diff --git a/lib/world/src/entities/player_gravity_script.rs b/lib/world/src/entities/player_gravity_script.rs index 2f0c3f6..9cd8c53 100644 --- a/lib/world/src/entities/player_gravity_script.rs +++ b/lib/world/src/entities/player_gravity_script.rs @@ -24,7 +24,7 @@ pub struct GravityScript { impl Default for GravityScript { fn default() -> Self { - Self { gravity: 0.025 } + Self { gravity: 0.011 } } } diff --git a/lib/world/src/entities/velocity_script.rs b/lib/world/src/entities/velocity_script.rs index ad9cc11..897c0c2 100644 --- a/lib/world/src/entities/velocity_script.rs +++ b/lib/world/src/entities/velocity_script.rs @@ -3,7 +3,6 @@ use serde::{Deserialize, Serialize}; use crate::{ components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}, geometry::rect3::Rect3, - utils::js_log, vec::Vector3Ops, }; @@ -60,19 +59,6 @@ impl GameScript for VelocityScript { let new_pos = world.move_rect3(&player_rect, end_pos); - if new_pos.y < 1.0 { - let intersection_info = - world.get_moving_rect3_intersection_info(&player_rect, end_pos); - js_log(&format!( - "entity_id: {:?} \npos: {:?} \nvel: {:?} \nnew_pos: {:?} \nintersection_info: {:?} \nend_pos: {:?}", - entity.id, pos, vel, new_pos, intersection_info, end_pos, - )); - for force in forces.forces.iter() { - js_log(&format!("force: {:?}", force)); - } - panic!("player fell through the world"); - } - let pos_diff = new_pos.sub(&pos); let real_vel = Velocity { x: pos_diff.x, diff --git a/lib/world/src/geometry/rect3.rs b/lib/world/src/geometry/rect3.rs index 5657bf8..11be4bf 100644 --- a/lib/world/src/geometry/rect3.rs +++ b/lib/world/src/geometry/rect3.rs @@ -207,34 +207,34 @@ impl World { .pos .set_component_from_axis(*hit_axis, *new_axis_pos); - let intersections_string = intersections - .iter() - .map(|info| format!("\n {:?}", info)) - .collect::>() - .join(", "); - - let axises_diff_string = axis_diffs - .iter() - .map(|(axis, diff, new_axis_pos)| { - format!( - "\n axis: {:?}, diff: {:?}, new_axis_pos: {:?}", - axis, diff, new_axis_pos - ) - }) - .collect::>() - .join(", "); - - js_log(&format!( - "({:?}) hit_axis: {:?}, \naxises_diff: {}, \nintersections: {}, \nstart_pos: {:?}, \ntrying_to_go_to: {:?}, \ncurrent_rect_pos: {:?}, \ncurrent_end_pos: {:?}", - iteration, - hit_axis, - axises_diff_string, - intersections_string, - rect.pos, - end_pos, - current_rect.pos, - current_end_pos - )); + // let intersections_string = intersections + // .iter() + // .map(|info| format!("\n {:?}", info)) + // .collect::>() + // .join(", "); + + // let axises_diff_string = axis_diffs + // .iter() + // .map(|(axis, diff, new_axis_pos)| { + // format!( + // "\n axis: {:?}, diff: {:?}, new_axis_pos: {:?}", + // axis, diff, new_axis_pos + // ) + // }) + // .collect::>() + // .join(", "); + + // js_log(&format!( + // "({:?}) hit_axis: {:?}, \naxises_diff: {}, \nintersections: {}, \nstart_pos: {:?}, \ntrying_to_go_to: {:?}, \ncurrent_rect_pos: {:?}, \ncurrent_end_pos: {:?}", + // iteration, + // hit_axis, + // axises_diff_string, + // intersections_string, + // rect.pos, + // end_pos, + // current_rect.pos, + // current_end_pos + // )); } current_end_pos diff --git a/lib/world/src/world/world_duct.rs b/lib/world/src/world/world_duct.rs index 6e60a7c..007a35e 100644 --- a/lib/world/src/world/world_duct.rs +++ b/lib/world/src/world/world_duct.rs @@ -80,11 +80,6 @@ impl World { pub fn get_chunk_mesh_wasm(&self, chunk_id: ChunkId) -> Result { let chunk_pos = ChunkPos::from_id(chunk_id); - web_sys::console::log_1(&JsValue::from_str(&format!( - "Rust Getting chunk mesh: {}", - chunk_id - ))); - let mesh = self .get_chunk_mesh(&chunk_pos) .map_err(Self::convert_error)?; diff --git a/yarn.lock b/yarn.lock index b010715..ff5ae1c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,7 +5,7 @@ __metadata: version: 8 cacheKey: 10 -"@ampproject/remapping@npm:^2.2.0": +"@ampproject/remapping@npm:^2.2.0, @ampproject/remapping@npm:^2.3.0": version: 2.3.0 resolution: "@ampproject/remapping@npm:2.3.0" dependencies: @@ -800,6 +800,7 @@ __metadata: dependencies: "@craft/engine": "npm:1.0.0" "@craft/eslint-config-tylercraft": "npm:^1.0.0" + "@tailwindcss/vite": "npm:^4.1.7" "@types/gl-matrix": "npm:^2.4.5" "@types/react": "npm:^18.2.67" "@types/react-dom": "npm:^18" @@ -810,6 +811,7 @@ __metadata: react: "npm:^18.2.0" react-dom: "npm:^18.2.0" react-router-dom: "npm:^6.8.0" + tailwindcss: "npm:^4.1.7" typescript: "npm:^5.5.3" vite: "npm:^5.1.6" vite-plugin-top-level-await: "npm:^1.4.1" @@ -817,6 +819,34 @@ __metadata: languageName: unknown linkType: soft +"@emnapi/core@npm:^1.4.3": + version: 1.4.3 + resolution: "@emnapi/core@npm:1.4.3" + dependencies: + "@emnapi/wasi-threads": "npm:1.0.2" + tslib: "npm:^2.4.0" + checksum: 10/b511f66b897d2019835391544fdf11f4fa0ce06cc1181abfa17c7d4cf03aaaa4fc8a64fcd30bb3f901de488d0a6f370b53a8de2215a898f5a4ac98015265b3b7 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.4.3": + version: 1.4.3 + resolution: "@emnapi/runtime@npm:1.4.3" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/4f90852a1a5912982cc4e176b6420556971bcf6a85ee23e379e2455066d616219751367dcf43e6a6eaf41ea7e95ba9dc830665a52b5d979dfe074237d19578f8 + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.0.2, @emnapi/wasi-threads@npm:^1.0.2": + version: 1.0.2 + resolution: "@emnapi/wasi-threads@npm:1.0.2" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/e82941776665eb958c2084728191d6b15a94383449975c4621b67a1c8217e1c0ec11056a693906c76863cb96f782f8be500510ecec6874e3f5da35a8e7968cfd + languageName: node + linkType: hard + "@esbuild/aix-ppc64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/aix-ppc64@npm:0.21.5" @@ -1093,7 +1123,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": version: 1.5.0 resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" checksum: 10/4ed6123217569a1484419ac53f6ea0d9f3b57e5b57ab30d7c267bdb27792a27eb0e4b08e84a2680aa55cc2f2b411ffd6ec3db01c44fdc6dc43aca4b55f8374fd @@ -1119,6 +1149,17 @@ __metadata: languageName: node linkType: hard +"@napi-rs/wasm-runtime@npm:^0.2.9": + version: 0.2.10 + resolution: "@napi-rs/wasm-runtime@npm:0.2.10" + dependencies: + "@emnapi/core": "npm:^1.4.3" + "@emnapi/runtime": "npm:^1.4.3" + "@tybys/wasm-util": "npm:^0.9.0" + checksum: 10/1e4cf77891390825b1756eb5e302035b80c9dd21959417c4e4ed063eacfb6df9f42dfc001bf0fa9c9dbd0a7374342502feaa0a59103e7ea9aa5b318732280a49 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -1951,6 +1992,181 @@ __metadata: languageName: node linkType: hard +"@tailwindcss/node@npm:4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/node@npm:4.1.7" + dependencies: + "@ampproject/remapping": "npm:^2.3.0" + enhanced-resolve: "npm:^5.18.1" + jiti: "npm:^2.4.2" + lightningcss: "npm:1.30.1" + magic-string: "npm:^0.30.17" + source-map-js: "npm:^1.2.1" + tailwindcss: "npm:4.1.7" + checksum: 10/df645e89098c0046609e32245c94722e4af9f2790fc9c4a85c8b4405b3eb578e5e16ea6da666585f7e4af2dde40829ea88cc994ace550ec94f7133cd97b50285 + languageName: node + linkType: hard + +"@tailwindcss/oxide-android-arm64@npm:4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/oxide-android-arm64@npm:4.1.7" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-darwin-arm64@npm:4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.1.7" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-darwin-x64@npm:4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/oxide-darwin-x64@npm:4.1.7" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-freebsd-x64@npm:4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.1.7" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.1.7" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.1.7" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-arm64-musl@npm:4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.1.7" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-x64-gnu@npm:4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.1.7" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@tailwindcss/oxide-linux-x64-musl@npm:4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.1.7" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@tailwindcss/oxide-wasm32-wasi@npm:4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.1.7" + dependencies: + "@emnapi/core": "npm:^1.4.3" + "@emnapi/runtime": "npm:^1.4.3" + "@emnapi/wasi-threads": "npm:^1.0.2" + "@napi-rs/wasm-runtime": "npm:^0.2.9" + "@tybys/wasm-util": "npm:^0.9.0" + tslib: "npm:^2.8.0" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.1.7" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@tailwindcss/oxide-win32-x64-msvc@npm:4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.1.7" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@tailwindcss/oxide@npm:4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/oxide@npm:4.1.7" + dependencies: + "@tailwindcss/oxide-android-arm64": "npm:4.1.7" + "@tailwindcss/oxide-darwin-arm64": "npm:4.1.7" + "@tailwindcss/oxide-darwin-x64": "npm:4.1.7" + "@tailwindcss/oxide-freebsd-x64": "npm:4.1.7" + "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.1.7" + "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.1.7" + "@tailwindcss/oxide-linux-arm64-musl": "npm:4.1.7" + "@tailwindcss/oxide-linux-x64-gnu": "npm:4.1.7" + "@tailwindcss/oxide-linux-x64-musl": "npm:4.1.7" + "@tailwindcss/oxide-wasm32-wasi": "npm:4.1.7" + "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.1.7" + "@tailwindcss/oxide-win32-x64-msvc": "npm:4.1.7" + detect-libc: "npm:^2.0.4" + tar: "npm:^7.4.3" + dependenciesMeta: + "@tailwindcss/oxide-android-arm64": + optional: true + "@tailwindcss/oxide-darwin-arm64": + optional: true + "@tailwindcss/oxide-darwin-x64": + optional: true + "@tailwindcss/oxide-freebsd-x64": + optional: true + "@tailwindcss/oxide-linux-arm-gnueabihf": + optional: true + "@tailwindcss/oxide-linux-arm64-gnu": + optional: true + "@tailwindcss/oxide-linux-arm64-musl": + optional: true + "@tailwindcss/oxide-linux-x64-gnu": + optional: true + "@tailwindcss/oxide-linux-x64-musl": + optional: true + "@tailwindcss/oxide-wasm32-wasi": + optional: true + "@tailwindcss/oxide-win32-arm64-msvc": + optional: true + "@tailwindcss/oxide-win32-x64-msvc": + optional: true + checksum: 10/39c4c67667e30626ed123cff33ac651e0c64f7c15f759ff6b3456d1d7460728cf7d350716945af6d0ef67e12fc8f45853f9984436c9bf8594c5daad35a3cecac + languageName: node + linkType: hard + +"@tailwindcss/vite@npm:^4.1.7": + version: 4.1.7 + resolution: "@tailwindcss/vite@npm:4.1.7" + dependencies: + "@tailwindcss/node": "npm:4.1.7" + "@tailwindcss/oxide": "npm:4.1.7" + tailwindcss: "npm:4.1.7" + peerDependencies: + vite: ^5.2.0 || ^6 + checksum: 10/b70d85b312ef4fd129555f02492ceed687aa5f356d123cbc081b9444ab99f9f977e080bde18acfe212f64d49b4d65deef967ac05e88b152dadcbeafd16d0092c + languageName: node + linkType: hard + +"@tybys/wasm-util@npm:^0.9.0": + version: 0.9.0 + resolution: "@tybys/wasm-util@npm:0.9.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/aa58e64753a420ad1eefaf7bacef3dda61d74f9336925943d9244132d5b48d9242f734f1e707fd5ccfa6dd1d8ec8e6debc234b4dedb3a5b0d8486d1f373350b2 + languageName: node + linkType: hard + "@types/babel__core@npm:^7.20.5": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" @@ -3443,6 +3659,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.3, detect-libc@npm:^2.0.4": + version: 2.0.4 + resolution: "detect-libc@npm:2.0.4" + checksum: 10/136e995f8c5ffbc515955b0175d441b967defd3d5f2268e89fa695e9c7170d8bed17993e31a34b04f0fad33d844a3a598e0fd519a8e9be3cad5f67662d96fee0 + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -3553,6 +3776,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.18.1": + version: 5.18.1 + resolution: "enhanced-resolve@npm:5.18.1" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10/50e81c7fe2239fba5670ebce78a34709906ed3a79274aa416434f7307b252e0b7824d76a7dd403eca795571dc6afd9a44183fc45a68475e8f2fdfbae6e92fcc3 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -4568,7 +4801,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 @@ -5365,6 +5598,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^2.4.2": + version: 2.4.2 + resolution: "jiti@npm:2.4.2" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10/e2b07eb2e3fbb245e29ad288dddecab31804967fc84d5e01d39858997d2743b5e248946defcecf99272275a00284ecaf7ec88b8c841331324f0c946d8274414b + languageName: node + linkType: hard + "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -5496,6 +5738,116 @@ __metadata: languageName: node linkType: hard +"lightningcss-darwin-arm64@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-darwin-arm64@npm:1.30.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-x64@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-darwin-x64@npm:1.30.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-freebsd-x64@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-freebsd-x64@npm:1.30.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-linux-arm-gnueabihf@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.30.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"lightningcss-linux-arm64-gnu@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-linux-arm64-gnu@npm:1.30.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-arm64-musl@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-linux-arm64-musl@npm:1.30.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-linux-x64-gnu@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-linux-x64-gnu@npm:1.30.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-x64-musl@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-linux-x64-musl@npm:1.30.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-win32-arm64-msvc@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-win32-arm64-msvc@npm:1.30.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-win32-x64-msvc@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss-win32-x64-msvc@npm:1.30.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"lightningcss@npm:1.30.1": + version: 1.30.1 + resolution: "lightningcss@npm:1.30.1" + dependencies: + detect-libc: "npm:^2.0.3" + lightningcss-darwin-arm64: "npm:1.30.1" + lightningcss-darwin-x64: "npm:1.30.1" + lightningcss-freebsd-x64: "npm:1.30.1" + lightningcss-linux-arm-gnueabihf: "npm:1.30.1" + lightningcss-linux-arm64-gnu: "npm:1.30.1" + lightningcss-linux-arm64-musl: "npm:1.30.1" + lightningcss-linux-x64-gnu: "npm:1.30.1" + lightningcss-linux-x64-musl: "npm:1.30.1" + lightningcss-win32-arm64-msvc: "npm:1.30.1" + lightningcss-win32-x64-msvc: "npm:1.30.1" + dependenciesMeta: + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-freebsd-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-arm64-msvc: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: 10/6c921135216cc498dfcb87e35dffe8432e99306cbd58009c598b1daf20c81cc14535abbd4c1066e5d1faf4080ed44a2995e8ecc343633db4897a2d041b76fb05 + languageName: node + linkType: hard + "load-json-file@npm:^4.0.0": version: 4.0.0 resolution: "load-json-file@npm:4.0.0" @@ -5568,6 +5920,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.17": + version: 0.30.17 + resolution: "magic-string@npm:0.30.17" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + checksum: 10/2f71af2b0afd78c2e9012a29b066d2c8ba45a9cd0c8070f7fd72de982fb1c403b4e3afdb1dae00691d56885ede66b772ef6bedf765e02e3a7066208fe2fec4aa + languageName: node + linkType: hard + "make-dir@npm:^1.0.0": version: 1.3.0 resolution: "make-dir@npm:1.3.0" @@ -7733,6 +8094,20 @@ __metadata: languageName: node linkType: hard +"tailwindcss@npm:4.1.7, tailwindcss@npm:^4.1.7": + version: 4.1.7 + resolution: "tailwindcss@npm:4.1.7" + checksum: 10/c229ed1e0cfe83b431581e462e18175ee0c0d75344710cd844cbcab28df118270695a2cd545868e6013ef2e5f4c4b619fb84cd3b5e21f80b8908d3ac74f67a5d + languageName: node + linkType: hard + +"tapable@npm:^2.2.0": + version: 2.2.2 + resolution: "tapable@npm:2.2.2" + checksum: 10/065a0dc44aba1b32020faa1c27c719e8f76e5345347515d8494bf158524f36e9f22ad9eaa5b5494f9d5d67bf0640afdd5698505948c46d720b6b7e69d19349a6 + languageName: node + linkType: hard + "tar@npm:^7.4.3": version: 7.4.3 resolution: "tar@npm:7.4.3" @@ -7861,7 +8236,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.6.2": +"tslib@npm:^2.4.0, tslib@npm:^2.6.2, tslib@npm:^2.8.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 From b88cc7b899505a3f32873e3510d126d369dca8d2 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Mon, 26 May 2025 16:26:28 -0700 Subject: [PATCH 31/61] belt works again --- DEVLOG.md | 7 + .../keyboardPlayerController.ts | 9 +- apps/web-client/src/game-scripts/hudRender.ts | 141 +++++++++--------- apps/web-client/src/runner.ts | 5 +- lib/engine/src/playerActions.ts | 32 ++-- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/entities/game.rs | 13 +- lib/world/src/entities/player.rs | 5 +- lib/world/src/entities/player_belt_script.rs | 71 ++++++++- 9 files changed, 189 insertions(+), 96 deletions(-) diff --git a/DEVLOG.md b/DEVLOG.md index 535969f..da71e09 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,3 +1,10 @@ +# 05_26_25 + +I made the UI yesterday and it is coming along. I need to figure out what to do next. I think making the belt work seems good. +I also want to add back the fireball entity that breaks a block or injures a player. Then the players have health and they can get more health by eating a food item. + +I also need to test the terrain generation and make that work better.I also need to add a button for saving while in single player mode. + # 05_25_25 I've fixed up the server now and multiplayer seems to work. I can now also add blocks to the game again. I don't know what is left for things that I'm confused about, maybe I should just start cleaning everything up now. Could work on mobile development as well. diff --git a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts index 7594a5f..f9a09f8 100644 --- a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts +++ b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts @@ -1,6 +1,5 @@ import { CONFIG, PlayerController } from "@craft/engine"; -import { WebGlGScript } from "../../game-scripts/webgl-gscript"; -import { Direction, EntityActionDto } from "@craft/rust-world"; +import { Direction, EntityActionDto, Game } from "@craft/rust-world"; import { CanvasGameScript, PlayerPerspective, @@ -18,12 +17,12 @@ export class KeyboardPlayerEntityController extends PlayerController { private hasJumped = false; constructor( + game: Game, handleAction: (action: EntityActionDto) => void, playerId: number, - private canvasGScript: CanvasGameScript, - webGlGScript: WebGlGScript + private canvasGScript: CanvasGameScript ) { - super(handleAction, playerId); + super(game, handleAction, playerId); const webGlCanvas = document.getElementById("hud") as HTMLCanvasElement; diff --git a/apps/web-client/src/game-scripts/hudRender.ts b/apps/web-client/src/game-scripts/hudRender.ts index c75d698..6aa1739 100644 --- a/apps/web-client/src/game-scripts/hudRender.ts +++ b/apps/web-client/src/game-scripts/hudRender.ts @@ -5,6 +5,7 @@ import { GameMenu } from "../renders/gameMenuRender"; import React from "react"; import ReactDOM from "react-dom"; import { Game, Player } from "@craft/rust-world"; +import TextureMapper from "../textureMapper"; export class HudGScript extends GameScript { name = "hud"; @@ -91,25 +92,20 @@ export class HudGScript extends GameScript { } private lastStats = ""; - drawStats() { - const mainPlayer: Player = this.game.get_player_wasm(this.mainPlayerUid); - if (!mainPlayer) { - return; - } - + drawStats(player: Player) { const cameraPos = "X: " + - mainPlayer.pos.x.toFixed(2) + + player.pos.x.toFixed(2) + ", Y: " + - mainPlayer.pos.y.toFixed(2) + + player.pos.y.toFixed(2) + ", Z: " + - mainPlayer.pos.z.toFixed(2); + player.pos.z.toFixed(2); const cameraRot = "Theta: " + - mainPlayer.rot.theta.toFixed(2) + + player.rot.theta.toFixed(2) + ", Phi: " + - mainPlayer.rot.phi.toFixed(2); + player.rot.phi.toFixed(2); // const numChunks = this.game.world.getLoadedChunkIds().length; const statsString = ` @@ -131,74 +127,75 @@ export class HudGScript extends GameScript { } update(_delta: number): void { + const player = this.game.get_player_no_copy_wasm(this.mainPlayerUid); + this.clearScreen(); - this.drawStats(); + this.drawStats(player); - // if (this.lastSelected !== this.basicGScript.mainPlayer.belt.selectedIndex) { - // this.drawBelt(); - // this.lastSelected = this.basicGScript.mainPlayer.belt.selectedIndex; - // } + this.drawBelt(player); // this.drawHealthBar(); } - // drawBelt() { - // this.eToolbeltItems.forEach((item, index) => { - // if (index === this.basicGScript.mainPlayer.belt.selectedIndex) { - // item.classList.add("selected"); - // } else { - // item.classList.remove("selected"); - // } - // }); - - // const itemDim = this.eToolbeltItems[0].clientHeight; - - // const belt = this.basicGScript.mainPlayer.belt; - - // if (!belt) { - // return; - // } - - // // draw the icons - // for (let i = 0; i < belt.length; i++) { - // const item = belt.getItem(i); - // if (!item) { - // continue; - // } - - // const cords = TextureMapper.getBlockPreviewCords( - // item, - // this.textureImg.width, - // this.textureImg.height - // ); - // // Clip the textImage to the cords - // const img = this.textureImg; - // const croppedImg = document.createElement("canvas"); - // croppedImg.width = itemDim; - // croppedImg.height = itemDim; - // const ctx = croppedImg.getContext("2d"); - // if (!ctx) { - // throw new Error("Could not get 2d context"); - // } - // ctx.imageSmoothingEnabled = false; - // ctx.drawImage( - // img, - // cords.x1, - // cords.y1, - // cords.x2 - cords.x1, - // cords.y2 - cords.y1, - // 0, - // 0, - // croppedImg.width, - // croppedImg.height - // ); - // this.eToolbeltItems[ - // i - // ].style.backgroundImage = `url(${croppedImg.toDataURL()})`; - // this.eToolbeltItems[i].style.backgroundSize = "contain"; - // } - // } + drawBelt(player: Player) { + const belt = player.belt; + + if (belt.selected_item === this.lastSelected) { + return; + } + + this.lastSelected = belt.selected_item; + + this.eToolbeltItems.forEach((item, index) => { + if (index === belt.selected_item) { + item.classList.add("selected"); + } else { + item.classList.remove("selected"); + } + }); + + const itemDim = this.eToolbeltItems[0].clientHeight; + + // draw the icons + for (let i = 0; i < belt.get_num_items(); i++) { + const item = belt.get_item(i); + if (!item) { + continue; + } + + const cords = TextureMapper.getBlockPreviewCords( + item, + this.textureImg.width, + this.textureImg.height + ); + // Clip the textImage to the cords + const img = this.textureImg; + const croppedImg = document.createElement("canvas"); + croppedImg.width = itemDim; + croppedImg.height = itemDim; + const ctx = croppedImg.getContext("2d"); + if (!ctx) { + throw new Error("Could not get 2d context"); + } + ctx.imageSmoothingEnabled = false; + ctx.drawImage( + img, + cords.x1, + cords.y1, + cords.x2 - cords.x1, + cords.y2 - cords.y1, + 0, + 0, + croppedImg.width, + croppedImg.height + ); + this.eToolbeltItems[ + i + ].style.backgroundImage = `url(${croppedImg.toDataURL()})`; + this.eToolbeltItems[i].style.backgroundSize = "contain"; + } + } // drawHealthBar() { // if (!this.basicGScript.mainPlayer) return; diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index c03475b..4241c10 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -91,7 +91,6 @@ export async function run(id?: string) { ); const onAction = (action: EntityActionDto) => { - // console.log("ACTION", action); game.game.handle_action_wasm(action); }; @@ -100,10 +99,10 @@ export async function run(id?: string) { return new MobileController(onAction, main_player_uid); } else { return new KeyboardPlayerEntityController( + game.game, onAction, main_player_uid, - canvasGameScript, - webglGameScript + canvasGameScript ); } })(); diff --git a/lib/engine/src/playerActions.ts b/lib/engine/src/playerActions.ts index ce09edd..1d5506f 100644 --- a/lib/engine/src/playerActions.ts +++ b/lib/engine/src/playerActions.ts @@ -1,15 +1,18 @@ import { Direction, EntityActionDto, + Game, JumpAction, MoveAction, RotateAction, SecondaryBeltAction, + SelectItemAction, SphericalRotation, UsePrimaryItemAction, } from "@craft/rust-world"; export abstract class PlayerController { constructor( + protected game: Game, protected handleAction: (action: EntityActionDto) => void, protected playerId: number ) {} @@ -36,11 +39,28 @@ export abstract class PlayerController { } beltRight() { - // TO-DO + const index = this.game.get_player_no_copy_wasm(this.playerId).belt + .selected_item; + if (index === 9) { + return; + } + const action = SelectItemAction.make_wasm(this.playerId, index + 1); + this.handleAction(action); } beltLeft() { - // TO-DO + const index = this.game.get_player_no_copy_wasm(this.playerId).belt + .selected_item; + if (index === 0) { + return; + } + const action = SelectItemAction.make_wasm(this.playerId, index - 1); + this.handleAction(action); + } + + selectBelt(pos: number) { + const action = SelectItemAction.make_wasm(this.playerId, pos); + this.handleAction(action); } debugBlock() { @@ -57,14 +77,6 @@ export abstract class PlayerController { this.handleAction(action); } - selectBelt(pos: number) { - // const action = PlayerAction.make(PlayerActionType.SetBeltIndex, { - // playerUid: this.player.uid, - // index: pos, - // }); - // this.playerActionService.performAction(action); - } - toggleCreative() { // const action = PlayerAction.make(PlayerActionType.ToggleCreative, { // playerUid: this.player.uid, diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 8c7cceb..6b48179 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[49,50,52,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,51,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"8bb25a84541f5e341fb338b1197221aef44d97c0d86196d67ac3c750782a8533","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"4f14d9949e48513b149f5230ed536e3bc3b40f2e5071a82b597b905673484136","signature":"775cc59b4ae0007d83834d10a4273997b97464773ef9e02b52358de844062ce4","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"82e50235c2eb99c8e42e249202ea91847e4f4ff59937f8f2c9a519a184e6a997","signature":"3c709283e60c19e1441d18062b5e1a3ebdd27e3125a9f26fd98629b916fb7827","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"dec7988a350062d4ea1cd99a2f44fc57797a7921818e3c3cf2afdedb4cc2e4c7","signature":"e490d7d77f0e379a276d3282603fe4b74bb4cba966f146cfe96dbb0473cbcc35","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[49,50,52,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,51,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c0db74b0ff8aaa2967894e7e62e58df4ed1a7799a9ed27a8ca21faa5e7de89","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"4f14d9949e48513b149f5230ed536e3bc3b40f2e5071a82b597b905673484136","signature":"775cc59b4ae0007d83834d10a4273997b97464773ef9e02b52358de844062ce4","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"e186b96630e18b6a23d8b1ba1b2d7f4b1bd366d2b69c16597c78a241bbe48ea3","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"dec7988a350062d4ea1cd99a2f44fc57797a7921818e3c3cf2afdedb4cc2e4c7","signature":"e490d7d77f0e379a276d3282603fe4b74bb4cba966f146cfe96dbb0473cbcc35","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/playerActions.d.ts","version":"5.8.3"} \ No newline at end of file diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 2c2fb5f..65d7ec4 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -9,7 +9,7 @@ use crate::{ entities::{ entity_action::EntityActionDtoMaker, player::wasm::Player, - player_belt_script::{SecondaryBeltAction, UsePrimaryItemAction}, + player_belt_script::{SecondaryBeltAction, SelectItemAction, UsePrimaryItemAction}, player_gravity_script::GravityScript, player_jump_script::JumpAction, player_move_script::{MoveAction, MoveScript}, @@ -48,6 +48,8 @@ impl Game { .add_handler(UsePrimaryItemAction::make_handler()); self.action_holder .add_handler(SecondaryBeltAction::make_handler()); + self.action_holder + .add_handler(SelectItemAction::make_handler()); self.update(); } @@ -448,6 +450,15 @@ pub mod wasm { Ok(chunk_pos_js) } + pub fn get_player_no_copy_wasm(&self, player_id: EntityId) -> Player { + let maybe_player = self.entity_holder.get_entity_by_id(player_id); + if let Some(player) = maybe_player { + Player::make_from_entity(player) + } else { + panic!("Player {} not found", player_id) + } + } + pub fn get_player_wasm(&self, player_id: EntityId) -> Result { let maybe_player = self.entity_holder.get_entity_by_id(player_id); if let Some(player) = maybe_player { diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index 1b14f82..b4e4e1d 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -66,6 +66,8 @@ pub mod wasm { pub moving_direction: MovingDirection, #[serde(default = "Player::default_size")] pub size: Size3, + #[serde(default = "Belt::default")] + pub belt: Belt, } impl Player { @@ -84,6 +86,7 @@ pub mod wasm { moving_direction: entity.get::().unwrap().to_owned(), jump_data: entity.get::().unwrap().to_owned(), size: entity.get::().unwrap().to_owned(), + belt: entity.get::().unwrap().to_owned(), } } @@ -93,8 +96,8 @@ pub mod wasm { ent.add::(self.vel); ent.add::(self.rot); ent.add::(self.moving_direction); - ent.add::(JumpData::default()); ent.add::(Belt::default()); + ent.add::(JumpData::default()); ent.add::(GravityData { has_gravity: true }); ent.add::(Forces::default()); ent.add::(Size3::new(0.8, 1.8, 0.8)); diff --git a/lib/world/src/entities/player_belt_script.rs b/lib/world/src/entities/player_belt_script.rs index 54f1fe3..3734df0 100644 --- a/lib/world/src/entities/player_belt_script.rs +++ b/lib/world/src/entities/player_belt_script.rs @@ -138,18 +138,83 @@ impl EntityActionHandler for SecondaryBeltAction { } } +#[wasm_bindgen] +#[derive(Clone, Debug, Default)] pub struct SelectItemAction {} -#[derive(Debug, Serialize, Deserialize)] +#[wasm_bindgen] +impl SelectItemAction { + pub fn make_wasm(entity_id: EntityId, item_index: usize) -> EntityActionDto { + let data = SelectItemActionData { item_index }; + SelectItemAction::make_dto(entity_id, data) + } +} + +#[wasm_bindgen] +#[derive(Clone, Debug, Default)] +pub struct SelectItemActionData { + pub item_index: usize, +} + +impl EntityActionDtoMaker for SelectItemAction { + fn get_action_type_static() -> &'static str { + "SelectItemAction" + } +} + +impl EntityActionHandler for SelectItemAction { + fn get_action_type(&self) -> &'static str { + "SelectItemAction" + } + + fn handle_dto( + &self, + _world: &World, + entity: &mut Entity, + data: &EntityActionDto, + ) -> GameSchedule { + let mut belt = entity.get::().unwrap().to_owned(); + let data = data.get_data::().unwrap(); + belt.selected_item = data.item_index; + entity.set::(belt); + GameSchedule::empty() + } +} + +#[derive(Debug, Serialize, Deserialize, Clone, Copy)] +#[wasm_bindgen] pub struct Belt { belt_items: [BlockType; 10], - selected_item: usize, + pub selected_item: usize, +} + +#[wasm_bindgen] +impl Belt { + pub fn get_item(&self, index: usize) -> BlockType { + self.belt_items[index] + } + + pub fn get_num_items(&self) -> usize { + self.belt_items.len() + } } impl Default for Belt { fn default() -> Self { + let belt_items = [ + BlockType::Gold, + BlockType::Stone, + BlockType::Grass, + BlockType::Water, + BlockType::Planks, + BlockType::Red, + BlockType::RedFlower, + BlockType::Wood, + BlockType::Leaf, + BlockType::Cloud, + ]; Belt { - belt_items: [BlockType::Gold; 10], + belt_items, selected_item: 0, } } From 7f1c03e9910ec070e0ac43e36d5ececd8717e91d Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Mon, 26 May 2025 22:18:02 -0700 Subject: [PATCH 32/61] better entity ser and desr --- .../src/components/ClientHomePage.tsx | 9 +- .../keyboardPlayerController.ts | 4 + .../src/game-scripts/canvas-gscript.ts | 32 +- apps/web-client/src/game-scripts/hudRender.ts | 8 +- apps/web-client/src/runner.ts | 11 +- .../src/services/sp-games-service.ts | 2 +- lib/engine/entities/entity.ts | 103 ------- lib/engine/src/camera.ts | 47 +-- lib/engine/src/playerActions.ts | 14 +- lib/engine/src/socket-types.ts | 10 +- lib/engine/src/wrappers.ts | 119 +++----- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/Cargo.toml | 1 + lib/world/src/components/size3.rs | 6 +- lib/world/src/entities/entities.rs | 119 ++++++++ lib/world/src/entities/entity.rs | 268 +++++++---------- lib/world/src/entities/entity_action.rs | 13 +- lib/world/src/entities/entity_component.rs | 91 +++++- lib/world/src/entities/fireball.rs | 5 + lib/world/src/entities/game.rs | 282 ++++++------------ lib/world/src/entities/game_script.rs | 78 ++--- lib/world/src/entities/mod.rs | 2 + lib/world/src/entities/player.rs | 107 +++---- .../src/entities/player_gravity_script.rs | 10 +- lib/world/src/entities/player_jump_script.rs | 1 - lib/world/src/entities/player_move_script.rs | 24 +- lib/world/src/entities/player_rot_script.rs | 1 - lib/world/src/entities/sandbox.rs | 10 +- lib/world/src/entities/velocity_script.rs | 16 +- 29 files changed, 647 insertions(+), 748 deletions(-) delete mode 100644 lib/engine/entities/entity.ts create mode 100644 lib/world/src/entities/entities.rs create mode 100644 lib/world/src/entities/fireball.rs diff --git a/apps/web-client/src/components/ClientHomePage.tsx b/apps/web-client/src/components/ClientHomePage.tsx index 26480c2..877a21e 100644 --- a/apps/web-client/src/components/ClientHomePage.tsx +++ b/apps/web-client/src/components/ClientHomePage.tsx @@ -1,7 +1,8 @@ import { IGameMetadata } from "@craft/engine"; import React, { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; -import { spGameService } from "../runner"; +import { SinglePlayerTerrainChunkGetter, spGameService } from "../runner"; +import { SandBoxGScript, TerrainGenerator } from "@craft/rust-world"; export function ClientHomePage() { const [games, setGames] = useState([]); @@ -11,6 +12,12 @@ export function ClientHomePage() { const newGame = async () => { console.log("Starting game"); const game = spGameService.newGame(); + const chunkGetter = new SinglePlayerTerrainChunkGetter(game); + spGameService.saveGame( + game, + new TerrainGenerator(0, false, false), + new SandBoxGScript(1, chunkGetter.getWasmRequestChunk()) + ); navigate(`/client-game/${game.game.id}`); }; diff --git a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts index f9a09f8..7f6748e 100644 --- a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts +++ b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts @@ -19,6 +19,7 @@ export class KeyboardPlayerEntityController extends PlayerController { constructor( game: Game, handleAction: (action: EntityActionDto) => void, + private save: () => void, playerId: number, private canvasGScript: CanvasGameScript ) { @@ -140,6 +141,9 @@ export class KeyboardPlayerEntityController extends PlayerController { case "j": this.debugBlock(); break; + case "p": + this.save(); + break; case " ": if (this.hasJumped) { break; diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index c3c2249..e64b907 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -7,14 +7,13 @@ import { makeThirdPersonBackCamera, makeThirdPersonFrontCamera, makeXRCamera, - PlayerWrapper, Vector2D, Vector3D, } from "@craft/engine"; import { WebGlGScript } from "./webgl-gscript"; import { Renderer } from "../renders/renderer"; import { ChunkRenderer } from "../renders/chunkRender"; -import { BlockType, Game } from "@craft/rust-world"; +import { BlockType, Entity, Game, Player } from "@craft/rust-world"; import { PlayerRenderer } from "../renders/playerRender"; type Config = { @@ -69,7 +68,7 @@ export class CanvasGameScript extends GameScript { }); // Create renderers for initial entities - for (const entity of this.gameWrapper.getEntities()) { + for (const entity of this.gameWrapper.game.entities.get_all_clone()) { this.onNewEntity(entity); } @@ -108,7 +107,12 @@ export class CanvasGameScript extends GameScript { } for (const entityId of this.lastDiff.updated_entities) { - const entity = this.gameWrapper.getPlayer(entityId); + const entity = + this.gameWrapper.game.entities.get_entity_by_id_clone(entityId); + if (!entity) { + console.log("CanvasGameScript: Entity not found", entityId); + continue; + } this.onNewEntity(entity); } @@ -297,24 +301,26 @@ export class CanvasGameScript extends GameScript { this.totTime = time; } - onNewEntity(entity: PlayerWrapper): void { + onNewEntity(entity: Entity): void { console.log("CanvasGameScript: Adding entity", entity); // if (entity instanceof PlayerWrapper) { - const renderer = new PlayerRenderer( - this.game, - this.webGlGScript, - entity.uid - ); - this.entityRenderers.set(entity.uid, renderer); + if (Player.is_player(entity)) { + const renderer = new PlayerRenderer( + this.game, + this.webGlGScript, + entity.id + ); + this.entityRenderers.set(entity.id, renderer); + } // } else if (entity instanceof Projectile) { // const renderer = new SphereRenderer(this.webGlGScript, entity); // this.entityRenderers.set(entity.uid, renderer); // } } - onRemovedEntity(entity: PlayerWrapper): void { + onRemovedEntity(entity: Entity): void { console.log("CanvasGameScript: Removing entity", entity); - this.entityRenderers.delete(entity.uid); + this.entityRenderers.delete(entity.id); } onChunkUpdate(chunkId: number): void { diff --git a/apps/web-client/src/game-scripts/hudRender.ts b/apps/web-client/src/game-scripts/hudRender.ts index 6aa1739..7e734a2 100644 --- a/apps/web-client/src/game-scripts/hudRender.ts +++ b/apps/web-client/src/game-scripts/hudRender.ts @@ -1,4 +1,4 @@ -import { GameScript, GameWrapper } from "@craft/engine"; +import { GameScript } from "@craft/engine"; import { CanvasGameScript } from "../game-scripts/canvas-gscript"; import { getEleOrError, hideElement, IS_MOBILE } from "../utils"; import { GameMenu } from "../renders/gameMenuRender"; @@ -127,7 +127,11 @@ export class HudGScript extends GameScript { } update(_delta: number): void { - const player = this.game.get_player_no_copy_wasm(this.mainPlayerUid); + const player = this.game.entities.get_entity_as_player(this.mainPlayerUid); + if (!player) { + console.log("HudGScript: Player not found", this.mainPlayerUid); + return; + } this.clearScreen(); diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 4241c10..66c2c71 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -14,7 +14,7 @@ import { import { ClientDbGamesService } from "./services/sp-games-service"; import { HudGScript } from "./game-scripts/hudRender"; -class SinglePlayerTerrainChunkGetter { +export class SinglePlayerTerrainChunkGetter { private chunks_to_insert: Chunk[] = []; public terrianGen: TerrainGenerator; @@ -66,7 +66,7 @@ export async function run(id?: string) { game.makeAndAddPlayer(main_player_uid); game.game.update(); - const ents = game.getEntities(); + const ents = game.game.entities.get_all_clone(); console.log("Ents", ents); const webglGameScript = new WebGlGScript(game.game); @@ -101,6 +101,13 @@ export async function run(id?: string) { return new KeyboardPlayerEntityController( game.game, onAction, + () => { + spGameService.saveGame( + game, + chunkGetter.terrianGen, + serializedSandbox + ); + }, main_player_uid, canvasGameScript ); diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index b0d5e5f..97dd7a8 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -118,7 +118,7 @@ export class ClientDbGamesService { const serializedGame = { gameId: data.game.id, name: data.game.name, - entities: data.game.serialize_entities_wasm(), + entities: data.game.entities.to_js(), world: data.game.world.serialize_wasm(), terrainGen: terrainGen.serialize(), sandbox: sandbox, diff --git a/lib/engine/entities/entity.ts b/lib/engine/entities/entity.ts deleted file mode 100644 index 367d652..0000000 --- a/lib/engine/entities/entity.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { Game, World } from "../src/index.js"; -import { IDim } from "../types.js"; -import { Vector3D } from "../src/vector.js"; -import { Cube } from "./cube.js"; -import { IEntityType } from "./entityType.js"; - -export enum RenderType { - CUBE, - SPHERE, -} - -export interface FaceLocater { - side: number; - dir: 1 | 0; -} - -export enum MetaAction { - right, - left, - forward, - backward, - up, - down, - jump, - fireball, -} - -export interface EntityDto { - uid: string; - pos: IDim; - dim: IDim; - type: IEntityType; -} - -/** - * Should be extended by all non-abstract sub classes - * */ -export interface IEntity { - type: IEntityType; -} - -export abstract class Entity< - DTO extends EntityDto = EntityDto, - DtoNoType = Omit -> { - // Used to mark this entity as changed. - // This will then be sent to the server - dirty = false; - - /* make dirty - * TODO pass in the properties that have changed - */ - protected soil() { - this.dirty = true; - } - - public get isDirty() { - return this.dirty; - } - - pos: Vector3D = new Vector3D([0, 0, 0]); - dim: IDim = [1, 1, 1]; - uid = ""; - - constructor(dto: Partial) { - this.set(dto); - } - - // TODO make the allowable entities generic - abstract type: IEntityType; - - abstract getDto(): DTO; - - protected baseDto(): EntityDto { - return { - uid: this.uid, - pos: this.pos.data as IDim, - dim: this.dim, - type: this.type, - }; - } - - abstract set>(data: T): void; - - protected baseSet(data: Partial) { - this.soil(); - if (data.pos) { - this.pos = new Vector3D(data.pos); - } - if (data.dim) { - this.dim = data.dim; - } - if (data.uid) { - this.uid = data.uid; - } - } - - abstract update(game: Game, world: World, delta: number): void; - - setUid(uid: string) { - this.uid = uid; - } -} diff --git a/lib/engine/src/camera.ts b/lib/engine/src/camera.ts index e899e1b..0400ee3 100644 --- a/lib/engine/src/camera.ts +++ b/lib/engine/src/camera.ts @@ -1,6 +1,6 @@ import { CONFIG } from "./config.js"; -import { PlayerWrapper } from "./wrappers.js"; import { Vector3D } from "./vector.js"; +import { Player } from "@craft/rust-world"; export type Camera = { // (x, y, z) @@ -9,33 +9,34 @@ export type Camera = { rot: Vector3D; }; -const getPlayerOffset = (player: PlayerWrapper) => { - return new Vector3D([ - player.dim.get(0) / 2, - player.dim.get(1) * (9 / 10), - player.dim.get(2) / 2, - ]); +const getPlayerOffset = (player: Player) => { + const dim = player.dim; + return new Vector3D([dim.x / 2, dim.y * (9 / 10), dim.z / 2]); }; -export const makeCameraForPlayer = (player: PlayerWrapper) => { - const adjustedRot = player.rot.add(new Vector3D([0, 0, 0])); +export const makeCameraForPlayer = (player: Player) => { + const pos = new Vector3D([player.pos.x, player.pos.y, player.pos.z]); + const rot = new Vector3D([0, player.rot.phi, player.rot.theta]); + const adjustedRot = rot.add(new Vector3D([0, 0, 0])); return { - pos: player.pos.add(getPlayerOffset(player)), + pos: pos.add(getPlayerOffset(player)), rot: adjustedRot, }; }; export const makeThirdPersonBackCamera = ( - player: PlayerWrapper, + player: Player, dist = CONFIG.player.thirdPersonCamDist ) => { - const rot = player.rot; - const pos = player.rot + const rot = new Vector3D([0, player.rot.phi, player.rot.theta]); + const player_pos = new Vector3D([player.pos.x, player.pos.y, player.pos.z]); + + const pos = rot .add(new Vector3D([dist, 0, 0])) .toCartesianCoords() .multiply(new Vector3D([1, -1, 1])) .add(getPlayerOffset(player)) - .add(player.pos); + .add(player_pos); return { pos, rot, @@ -43,16 +44,19 @@ export const makeThirdPersonBackCamera = ( }; export const makeThirdPersonFrontCamera = ( - player: PlayerWrapper, + player: Player, dist = CONFIG.player.thirdPersonCamDist ) => { - const rot = player.rot.add(new Vector3D([0, Math.PI, 0])); - const pos = player.rot + const player_rot = new Vector3D([0, player.rot.phi, player.rot.theta]); + const player_pos = new Vector3D([player.pos.x, player.pos.y, player.pos.z]); + + const rot = player_rot.add(new Vector3D([0, Math.PI, 0])); + const pos = player_rot .add(new Vector3D([dist, Math.PI, 0])) .toCartesianCoords() .multiply(new Vector3D([1, -1, 1])) .add(getPlayerOffset(player)) - .add(player.pos); + .add(player_pos); return { pos, @@ -60,9 +64,10 @@ export const makeThirdPersonFrontCamera = ( }; }; -export const makeXRCamera = (player: PlayerWrapper): Camera => { - const pos = getPlayerOffset(player).add(player.pos); - const rot = player.rot; +export const makeXRCamera = (player: Player): Camera => { + const player_pos = new Vector3D([player.pos.x, player.pos.y, player.pos.z]); + const pos = getPlayerOffset(player).add(player_pos); + const rot = new Vector3D([0, player.rot.phi, player.rot.theta]); return { pos, rot, diff --git a/lib/engine/src/playerActions.ts b/lib/engine/src/playerActions.ts index 1d5506f..6ba62be 100644 --- a/lib/engine/src/playerActions.ts +++ b/lib/engine/src/playerActions.ts @@ -39,8 +39,11 @@ export abstract class PlayerController { } beltRight() { - const index = this.game.get_player_no_copy_wasm(this.playerId).belt - .selected_item; + const player = this.game.entities.get_entity_as_player(this.playerId); + if (!player) { + return; + } + const index = player.belt.selected_item; if (index === 9) { return; } @@ -49,8 +52,11 @@ export abstract class PlayerController { } beltLeft() { - const index = this.game.get_player_no_copy_wasm(this.playerId).belt - .selected_item; + const player = this.game.entities.get_entity_as_player(this.playerId); + if (!player) { + return; + } + const index = player.belt.selected_item; if (index === 0) { return; } diff --git a/lib/engine/src/socket-types.ts b/lib/engine/src/socket-types.ts index 8b12021..2db7a8d 100644 --- a/lib/engine/src/socket-types.ts +++ b/lib/engine/src/socket-types.ts @@ -1,10 +1,4 @@ -import { - EntityActionDto, - EntityActionJson, - GameDiff, - Player, - SerializedEntityHolder, -} from "@craft/rust-world"; +import { Entities, GameDiff, Player } from "@craft/rust-world"; import { ISerializedAction } from "./wrappers.js"; export interface MessageDto< @@ -46,7 +40,7 @@ export enum ISocketMessageType { export interface WelcomeMessage { uid: number; - entities: SerializedEntityHolder; + entities: Entities; } export interface SocketMessageData extends Record { diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index cc49ef3..3e0ac39 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -1,17 +1,22 @@ -import * as WorldWasm from "@craft/rust-world"; import { Vector2D, Vector3D } from "./vector.js"; -import { Camera } from "./camera.js"; import { GameScript } from "./game-script.js"; import { SandBoxGScript, TerrainGenerator, - SerializedEntityHolder, World, Game, - EntityHolder, - RotateActionData, + Entities, + Chunk, + BlockType, + Direction, + Player, + EntityActionDto, + JumpAction, + SphericalRotation, + RotateAction, + MoveAction, + WasmGameScript, } from "@craft/rust-world"; -export * as WorldModuleTypes from "@craft/rust-world"; export interface ISerializedAction { entity_id: number; @@ -29,7 +34,7 @@ export interface IServerGameMetadata { export interface ISerializedGame { gameId: string; name: string; - entities: SerializedEntityHolder; + entities: Entities; world: World; terrainGen: TerrainGenerator; sandbox: SandBoxGScript; @@ -42,7 +47,7 @@ export interface IGameMetadata { export const serializedGameToGame = (serializedGame: ISerializedGame): Game => { const world = World.deserialize_wasm(serializedGame.world); - const entityHolder = EntityHolder.deserialize_wasm(serializedGame.entities); + const entityHolder = Entities.from_js(serializedGame.entities); const game = Game.build( serializedGame.gameId, serializedGame.name, @@ -52,8 +57,8 @@ export const serializedGameToGame = (serializedGame: ISerializedGame): Game => { return game; }; -export const deserializeChunk = (chunk: ISerializedChunk): WorldWasm.Chunk => { - return WorldWasm.Chunk.deserialize(chunk); +export const deserializeChunk = (chunk: ISerializedChunk): Chunk => { + return Chunk.deserialize(chunk); }; export interface ISerializedChunk { @@ -61,7 +66,7 @@ export interface ISerializedChunk { x: number; y: number; }; - blocks: WorldWasm.BlockType[]; + blocks: BlockType[]; block_data: ("None" | { Image: string })[]; } @@ -91,12 +96,6 @@ export type GameDiff = { updated_chunks: number[]; }; -export interface ILookingAtData { - cube: Cube; - face: WorldWasm.Direction; - dist: number; -} - export type ISerializedVisibleFaces = Array<{ world_pos: RustPos; faces: [boolean, boolean, boolean, boolean, boolean, boolean]; @@ -107,64 +106,33 @@ export type GameDiffWrapper = { updated_chunks: number[]; }; -// export type GameScript = { -// onDiff: (diff: GameDiff) => void; -// }; - export type Cube = { - type: WorldWasm.BlockType; + type: BlockType; pos: Vector3D; }; -// export type ChunkMesh = { -// mesh: Array<{ block: Cube; faces: WorldWasm.Direction[] }>; -// chunkPos: { x: number; y: number }; -// }; - type RustChunkMesh = Array<[RustBlock, { data: boolean[] }]>; export class ChunkMeshWrapper { - mesh: Array<[BlockWrapper, WorldWasm.Direction[]]>; + mesh: Array<[BlockWrapper, Direction[]]>; constructor(mesh: RustChunkMesh) { this.mesh = mesh.map(([block, faces]) => [ new BlockWrapper(block), - faces.data.map((_, i) => i as WorldWasm.Direction), + faces.data.map((_, i) => i as Direction), ]); } } -export class PlayerWrapper { - speed = 0; - max_speed = 0; - gravity = 0; - uid = 0; - pos: Vector3D = new Vector3D([0, 0, 0]); - dim: Vector3D = new Vector3D([0, 0, 0]); - rot: Vector3D = new Vector3D([0, 0, 0]); - is_flying = false; - on_ground = false; - distanceMoved = 0; - moving_direction: WorldWasm.Direction | undefined; - - constructor(player: WorldWasm.Player) { - this.uid = player.id; - this.pos = new Vector3D([player.pos.x, player.pos.y, player.pos.z]); - this.dim = new Vector3D([player.size.x, player.size.y, player.size.z]); - this.rot = new Vector3D([0, player.rot.phi, player.rot.theta]); - this.moving_direction = player.moving_direction; - } -} - type RustBlock = { - block_type: WorldWasm.BlockType; + block_type: BlockType; extra_data: string; world_pos: RustPos; }; export class BlockWrapper { pos: Vector3D; - type: WorldWasm.BlockType; + type: BlockType; constructor(block: RustBlock) { this.pos = new Vector3D([ @@ -177,10 +145,10 @@ export class BlockWrapper { } export class GameWrapper { - constructor(public game: WorldWasm.Game) {} + constructor(public game: Game) {} static makeGame(): GameWrapper { - const game = new WorldWasm.Game(); + const game = new Game(); return new GameWrapper(game); } @@ -189,31 +157,31 @@ export class GameWrapper { } serializeEntities(): SerializedEntity[] { - return this.game.serialize_entities_wasm(); + return this.game.entities.to_js(); } - makeJumpAction(entityId: number): WorldWasm.EntityActionDto { - return WorldWasm.JumpAction.make_wasm(entityId); + makeJumpAction(entityId: number): EntityActionDto { + return JumpAction.make_wasm(entityId); } makeRotateAction( entityId: number, theta: number, phi: number - ): WorldWasm.EntityActionDto { - const rotDiff = WorldWasm.SphericalRotation.new_wasm(theta, phi); - return WorldWasm.RotateAction.make_wasm(entityId, rotDiff); + ): EntityActionDto { + const rotDiff = SphericalRotation.new_wasm(theta, phi); + return RotateAction.make_wasm(entityId, rotDiff); } makeMoveAction( entityId: number, - direction: WorldWasm.Direction | "None" - ): WorldWasm.EntityActionDto { + direction: Direction | "None" + ): EntityActionDto { console.log("Making move action", entityId, direction); if (direction === "None") { - return WorldWasm.MoveAction.make_wasm(entityId, undefined); + return MoveAction.make_wasm(entityId, undefined); } - return WorldWasm.MoveAction.make_wasm(entityId, direction); + return MoveAction.make_wasm(entityId, direction); } getChunkPosFromChunkId(chunkId: number): Vector2D { @@ -232,7 +200,7 @@ export class GameWrapper { } makeAndAddGameScript(script: GameScript) { - const wasmScript = new WorldWasm.WasmGameScript(script); + const wasmScript = new WasmGameScript(script); this.game.add_game_script_wasm(wasmScript); } @@ -245,9 +213,12 @@ export class GameWrapper { return new ChunkMeshWrapper(val); } - getPlayer(uid: number): PlayerWrapper { - const player: WorldWasm.Player = this.game.get_player_wasm(uid); - return new PlayerWrapper(player); + getPlayer(uid: number): Player { + const player = this.game.entities.get_entity_as_player(uid); + if (!player) { + throw new Error("Player not found"); + } + return player; } getBlock(pos: Vector3D): BlockWrapper { @@ -255,21 +226,11 @@ export class GameWrapper { return new BlockWrapper(block); } - getEntities(): PlayerWrapper[] { - const entities: WorldWasm.Player[] = this.game.get_players_wasm(); - return entities.map((entity) => this.getPlayer(entity.id)); - } - getLoadedChunkIds(): number[] { const chunkIds = this.game.get_loaded_chunk_ids_wasm(); return Array.from(chunkIds).map(Number); } - getPointedAtBlock(camera: Camera): ILookingAtData { - // todo - throw new Error("Not implemented"); - } - getWorldPosFromChunkPos(chunkPos: Vector2D): Vector3D { const world_pos = this.game.get_world_pos_from_chunk_pos_wasm( chunkPos.get(0), diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 6b48179..4694d9a 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/game-script.ts","./src/wrappers.ts","./src/camera.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[49,50,52,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,51,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c0db74b0ff8aaa2967894e7e62e58df4ed1a7799a9ed27a8ca21faa5e7de89","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"4f14d9949e48513b149f5230ed536e3bc3b40f2e5071a82b597b905673484136","signature":"775cc59b4ae0007d83834d10a4273997b97464773ef9e02b52358de844062ce4","impliedFormat":99},{"version":"dbf029bb6bdde9cec6d079cb659f6a212b3c7458cfa4ddfd8cd2b6227de8670d","signature":"86ae1bc413c199b8254753daa1c5459842794809c07d0615af4942c1433ddff2","impliedFormat":99},{"version":"e186b96630e18b6a23d8b1ba1b2d7f4b1bd366d2b69c16597c78a241bbe48ea3","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"dec7988a350062d4ea1cd99a2f44fc57797a7921818e3c3cf2afdedb4cc2e4c7","signature":"e490d7d77f0e379a276d3282603fe4b74bb4cba966f146cfe96dbb0473cbcc35","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[53,2],[49,3],[51,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/playerActions.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/camera.ts","./src/wrappers.ts","./src/game-script.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[47,49,50,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"06abb3bc5111c0366fcda2de55062501947e965c5b047435f6e67f7f7312af9a","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"2190af24cd8970497490c683989e0519fb8c15489edda3df05dc3c5e8c95bf13","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"6bd6ac836e29cdf9e234a7b13bb29148368bc3db2dad670abfbacb36288ec44f","signature":"3dad19a4fc83af787922cc0023a887f0ec4abdae44ad3e2e5c9b02125d68a50f","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"bd1fef4442cc97cad909bd08e37c0afa728c3c9ac286e39b7ff3068bd09101d0","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"322f723495a7a0a8eb726f5b130ba65257b71b21be66dfacf21bdb4bc9077a55","signature":"6382ca8397ca3146b4551e1f2dc37d871eb021c72482460422503a4d0f504a03","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[51,2],[49,3],[53,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file diff --git a/lib/world/Cargo.toml b/lib/world/Cargo.toml index f5e8c4c..857079f 100644 --- a/lib/world/Cargo.toml +++ b/lib/world/Cargo.toml @@ -48,6 +48,7 @@ console_error_panic_hook = { version = "0.1.6", optional = true } # Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now. wee_alloc = { version = "0.4.5", optional = true } watch = "0.2.3" +once_cell = "1.21.3" [dev-dependencies] wasm-bindgen-test = "0.3.34" diff --git a/lib/world/src/components/size3.rs b/lib/world/src/components/size3.rs index 167e293..9828503 100644 --- a/lib/world/src/components/size3.rs +++ b/lib/world/src/components/size3.rs @@ -1,8 +1,4 @@ -use crate::{ - entities::entity_component::impl_component, - positions::{ChunkPos, InnerChunkPos}, - vec::{impl_vector_ops, Vector3Ops}, -}; +use crate::{entities::entity_component::impl_component, vec::impl_vector_ops}; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; diff --git a/lib/world/src/entities/entities.rs b/lib/world/src/entities/entities.rs new file mode 100644 index 0000000..85973f1 --- /dev/null +++ b/lib/world/src/entities/entities.rs @@ -0,0 +1,119 @@ +use super::entity::{Entity, EntityId}; +use super::entity_component::Component; +use super::player::Player; +use serde::{Deserialize, Serialize}; +use serde_wasm_bindgen::{from_value, to_value}; +use std::{any::TypeId, fmt::Debug}; +use wasm_bindgen::prelude::*; + +#[derive(Debug)] +pub struct EntityQuery { + type_ids: Vec, +} + +impl EntityQuery { + pub fn new() -> Self { + Self { type_ids: vec![] } + } + + pub fn add(&mut self) { + self.type_ids.push(TypeId::of::()); + } +} + +// New struct to hold mutable references to filtered entities +#[derive(Debug)] +pub struct EntityQueryResults<'a> { + pub entities: Vec<&'a mut Entity>, +} + +impl<'a> EntityQueryResults<'a> { + pub fn new(entities: Vec<&'a mut Entity>) -> Self { + Self { entities } + } + + pub fn len(&self) -> usize { + self.entities.len() + } +} + +#[wasm_bindgen] +#[derive(Debug, Serialize, Deserialize)] +pub struct Entities { + entities: Vec, +} + +impl Clone for Entities { + fn clone(&self) -> Self { + Entities { + entities: self.entities.clone(), + } + } +} + +impl Entities { + pub fn new() -> Entities { + Entities { + entities: Vec::new(), + } + } + + pub fn add_entity(&mut self, entity: Entity) { + self.entities.push(entity); + } + + pub fn get_entity_by_id(&self, id: EntityId) -> Option<&Entity> { + self.entities.iter().find(|entity| entity.id == id) + } + + pub fn get_entity_by_id_mut(&mut self, id: EntityId) -> Option<&mut Entity> { + self.entities.iter_mut().find(|entity| entity.id == id) + } + + pub fn get_all(&self) -> &Vec { + &self.entities + } + + pub fn get_all_mut(&mut self) -> &mut Vec { + &mut self.entities + } + + pub fn query(&mut self, filter: &EntityQuery) -> EntityQueryResults { + let filtered_entities = self + .entities + .iter_mut() + .filter(|entity| { + filter + .type_ids + .iter() + .all(|&type_id| entity.has_typeid(type_id)) + }) + .collect(); + + EntityQueryResults::new(filtered_entities) + } +} + +#[wasm_bindgen] +impl Entities { + pub fn to_js(&self) -> JsValue { + to_value(self).unwrap() + } + + pub fn from_js(value: JsValue) -> Result { + let entity_holder: Entities = from_value(value)?; + Ok(entity_holder) + } + + pub fn get_entity_as_player(&self, id: EntityId) -> Option { + self.get_entity_by_id(id).map(|entity| entity.as_player()) + } + + pub fn get_all_clone(&self) -> Vec { + self.entities.clone() + } + + pub fn get_entity_by_id_clone(&self, id: EntityId) -> Option { + self.get_entity_by_id(id).map(|entity| entity.clone()) + } +} diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index ea7acea..4609fb9 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -1,12 +1,8 @@ -use super::{entity_component::Component, player::wasm::Player}; -use crate::{geometry::rotation::SphericalRotation, utils::js_log}; -use serde::{Deserialize, Serialize}; -use serde_wasm_bindgen::from_value; -use std::{ - any::{Any, TypeId}, - fmt::Debug, -}; -use tsify::Tsify; +use super::entity_component::{Component, COMPONENT_REGISTRY}; +use super::player::Player; +use serde::{de, ser::SerializeStruct, Deserializer}; +use serde::{Deserialize, Serialize, Serializer}; +use std::{any::TypeId, fmt::Debug}; use wasm_bindgen::prelude::*; pub type EntityId = u32; @@ -15,13 +11,76 @@ pub type EntityId = u32; #[wasm_bindgen(getter_with_clone)] pub struct Entity { pub id: EntityId, + pub name: String, components: Vec>, } +impl Serialize for Entity { + fn serialize(&self, serializer: S) -> Result { + let mut s = serializer.serialize_struct("Entity", 2)?; + s.serialize_field("id", &self.id)?; + s.serialize_field("name", &self.name)?; + + // Convert components into serializable format + let comps: Vec<_> = self + .components + .iter() + .map(|c| serde_json::to_value(&(c.type_name(), c.to_json())).unwrap()) + .collect(); + + s.serialize_field("components", &comps)?; + s.end() + } +} + +impl<'de> Deserialize<'de> for Entity { + fn deserialize>(deserializer: D) -> Result { + #[derive(Deserialize)] + struct EntityHelper { + id: EntityId, + name: String, + components: Vec, + } + + let EntityHelper { + id, + name, + components, + } = EntityHelper::deserialize(deserializer)?; + let mut entity = Entity::new(id, name); + + let registry = COMPONENT_REGISTRY.lock().unwrap(); + for item in components { + let pair: (String, serde_json::Value) = + serde_json::from_value(item).map_err(de::Error::custom)?; + let (type_name, value) = pair; + + let deser = registry + .get(type_name.as_str()) + .ok_or_else(|| de::Error::custom(format!("Unknown component: {}", type_name)))?; + + entity.components.push(deser(value)); + } + + Ok(entity) + } +} + +impl Clone for Entity { + fn clone(&self) -> Self { + Entity { + id: self.id, + name: self.name.clone(), + components: self.components.iter().map(|c| c.clone()).collect(), + } + } +} + impl Entity { - pub fn new(id: EntityId) -> Self { + pub fn new(id: EntityId, name: String) -> Self { Self { id, + name, components: Vec::new(), } } @@ -54,6 +113,14 @@ impl Entity { .any(|c| c.as_any().type_id() == type_id) } + pub fn to_json(&self) -> serde_json::Value { + serde_json::to_value(self).unwrap() + } + + pub fn from_json(value: serde_json::Value) -> Result { + serde_json::from_value(value) + } + pub fn print_components(&self) { println!("Entity ID: {:?}", self.id); for component in &self.components { @@ -63,159 +130,50 @@ impl Entity { } } -#[cfg(test)] -mod tests { - use crate::components::world_pos::WorldPos; - - use super::*; - - // #[test] - // fn test_serialize_deserialize() { - // let mut entity = Entity::new(1); - // let world_pos = WorldPos { x: 1, y: 2, z: 3 }; - // let spherical_rotation = SphericalRotation::new(0.0, 0.0); - // entity.add(world_pos); - // entity.add(spherical_rotation); - // let serialized = entity.serialize(); - // let deserialized = Entity::deserialize(serialized); - // assert_eq!(entity.id, deserialized.id); - // assert_eq!(entity.components.len(), deserialized.components.len()); - - // let deserialized_world_pos = deserialized.get::().unwrap(); - // assert_eq!(world_pos.x, deserialized_world_pos.x); - // assert_eq!(world_pos.y, deserialized_world_pos.y); - // assert_eq!(world_pos.z, deserialized_world_pos.z); - - // let deserialized_spherical_rotation = deserialized.get::().unwrap(); - // assert_eq!( - // spherical_rotation.theta, - // deserialized_spherical_rotation.theta - // ); - // assert_eq!(spherical_rotation.phi, deserialized_spherical_rotation.phi); - // } -} - -#[derive(Debug)] -pub struct EntityQuery { - type_ids: Vec, -} - -impl EntityQuery { - pub fn new() -> Self { - Self { type_ids: vec![] } - } - - pub fn add(&mut self) { - self.type_ids.push(TypeId::of::()); - } -} - -// New struct to hold mutable references to filtered entities -#[derive(Debug)] -pub struct EntityQueryResults<'a> { - pub entities: Vec<&'a mut Entity>, -} - -impl<'a> EntityQueryResults<'a> { - pub fn new(entities: Vec<&'a mut Entity>) -> Self { - Self { entities } - } - - pub fn len(&self) -> usize { - self.entities.len() - } -} - #[wasm_bindgen] -#[derive(Debug)] -pub struct EntityHolder { - entities: Vec, -} - -#[derive(Debug, Serialize, Deserialize, Tsify)] -#[wasm_bindgen(getter_with_clone)] -pub struct SerializedEntityHolder { - pub entities: Vec, -} - -impl EntityHolder { - pub fn new() -> EntityHolder { - EntityHolder { - entities: Vec::new(), - } - } - - pub fn add_entity(&mut self, entity: Entity) { - self.entities.push(entity); - } - - pub fn get_entity_by_id(&self, id: EntityId) -> Option<&Entity> { - self.entities.iter().find(|entity| entity.id == id) - } - - pub fn get_entity_by_id_mut(&mut self, id: EntityId) -> Option<&mut Entity> { - self.entities.iter_mut().find(|entity| entity.id == id) - } - - pub fn get_all(&self) -> &Vec { - &self.entities - } - - pub fn get_all_mut(&mut self) -> &mut Vec { - &mut self.entities +impl Entity { + pub fn as_player(&self) -> Player { + Player::new(self.clone()) } - pub fn query(&mut self, filter: &EntityQuery) -> EntityQueryResults { - let filtered_entities = self - .entities - .iter_mut() - .filter(|entity| { - filter - .type_ids - .iter() - .all(|&type_id| entity.has_typeid(type_id)) - }) - .collect(); - - EntityQueryResults::new(filtered_entities) + pub fn to_js(&self) -> JsValue { + serde_wasm_bindgen::to_value(self).unwrap() } - pub fn serialize(&self) -> SerializedEntityHolder { - SerializedEntityHolder { - entities: self - .entities - .iter() - .map(|entity| Player::make_from_entity(entity)) - .collect(), - } + pub fn from_js(value: JsValue) -> Result { + serde_wasm_bindgen::from_value(value) } +} - pub fn deserialize(serialized_entities: SerializedEntityHolder) -> EntityHolder { - let mut entity_holder = EntityHolder::new(); - entity_holder.entities = serialized_entities - .entities - .iter() - .map(|serialized| Player::make_entity(serialized)) - .collect(); - entity_holder - } +#[cfg(test)] +mod tests { + use crate::{components::world_pos::WorldPos, geometry::rotation::SphericalRotation}; - pub fn deserialize_entity(&mut self, entity: JsValue) { - let player: Player = from_value(entity).unwrap(); - let entity = Player::make_entity(&player); - // add or update entity - if let Some(existing_entity) = self.get_entity_by_id_mut(entity.id) { - existing_entity.components = entity.components; - } else { - self.add_entity(entity); - } - } -} + use super::*; -#[wasm_bindgen] -impl EntityHolder { - pub fn deserialize_wasm(value: JsValue) -> Result { - let entity_holder: SerializedEntityHolder = from_value(value)?; - Ok(EntityHolder::deserialize(entity_holder)) + #[test] + fn test_serialize_deserialize() { + let mut entity = Entity::new(1, "test".to_string()); + let world_pos = WorldPos { x: 1, y: 2, z: 3 }; + let spherical_rotation = SphericalRotation::new(0.0, 0.0); + entity.add(world_pos); + entity.add(spherical_rotation); + let serialized = entity.to_json(); + let deserialized = Entity::from_json(serialized).unwrap(); + + assert_eq!(entity.id, deserialized.id); + assert_eq!(entity.components.len(), deserialized.components.len()); + + let deserialized_world_pos = deserialized.get::().unwrap(); + assert_eq!(world_pos.x, deserialized_world_pos.x); + assert_eq!(world_pos.y, deserialized_world_pos.y); + assert_eq!(world_pos.z, deserialized_world_pos.z); + + let deserialized_spherical_rotation = deserialized.get::().unwrap(); + assert_eq!( + spherical_rotation.theta, + deserialized_spherical_rotation.theta + ); + assert_eq!(spherical_rotation.phi, deserialized_spherical_rotation.phi); } } diff --git a/lib/world/src/entities/entity_action.rs b/lib/world/src/entities/entity_action.rs index 426605d..e8048d7 100644 --- a/lib/world/src/entities/entity_action.rs +++ b/lib/world/src/entities/entity_action.rs @@ -1,12 +1,11 @@ +use super::entities::Entities; +use super::entity::{Entity, EntityId}; +use super::game::GameSchedule; use crate::entities::player_belt_script::UsePrimaryItemActionData; use crate::entities::player_move_script::MoveActionData; use crate::entities::player_rot_script::RotateActionData; use crate::utils::js_log; use crate::world::World; - -use super::entity::{Entity, EntityHolder, EntityId}; -use super::game::GameSchedule; -use serde::Serialize; use std::any::Any; use std::fmt::Debug; use wasm_bindgen::prelude::*; @@ -97,11 +96,7 @@ impl EntityActionHolder { self.handlers.push(handler); } - pub fn handle_actions( - &mut self, - world: &World, - entity_holder: &mut EntityHolder, - ) -> GameSchedule { + pub fn handle_actions(&mut self, world: &World, entity_holder: &mut Entities) -> GameSchedule { let mut schedule = GameSchedule::empty(); for action in &self.actions { // js_log(&format!("Handling action: {:?}", action)); diff --git a/lib/world/src/entities/entity_component.rs b/lib/world/src/entities/entity_component.rs index 9f9284f..a2368ad 100644 --- a/lib/world/src/entities/entity_component.rs +++ b/lib/world/src/entities/entity_component.rs @@ -1,15 +1,31 @@ -use serde::{Deserialize, Serialize}; -use std::{any::Any, fmt::Debug}; +use lazy_static::lazy_static; +use serde_json::Value; +use std::{any::Any, collections::HashMap, fmt::Debug, sync::Mutex}; +use wasm_bindgen::JsValue; + +use crate::{ + components::{ + fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity, world_pos::WorldPos, + }, + entities::{ + player_belt_script::Belt, player_gravity_script::GravityData, player_jump_script::JumpData, + player_move_script::MovingDirection, velocity_script::Forces, + }, + geometry::rotation::SphericalRotation, +}; -#[typetag::serde(tag = "type")] pub trait Component: Any + Debug { fn as_any(&self) -> &dyn Any; fn as_any_mut(&mut self) -> &mut dyn Any; + fn get_name(&self) -> &str; + fn clone_box(&self) -> Box; + fn type_name(&self) -> &'static str; + fn to_js(&self) -> JsValue; + fn to_json(&self) -> serde_json::Value; } macro_rules! impl_component { ($type:ty) => { - #[typetag::serde] impl $crate::entities::entity_component::Component for $type { fn as_any(&self) -> &dyn std::any::Any { self @@ -17,7 +33,74 @@ macro_rules! impl_component { fn as_any_mut(&mut self) -> &mut dyn std::any::Any { self } + fn get_name(&self) -> &str { + stringify!($type) + } + fn clone_box(&self) -> Box { + Box::new(self.clone()) + } + fn type_name(&self) -> &'static str { + std::any::type_name::<$type>() + } + fn to_js(&self) -> wasm_bindgen::prelude::JsValue { + serde_wasm_bindgen::to_value(self).expect("Component must be serializable") + } + fn to_json(&self) -> serde_json::Value { + serde_json::to_value(self).expect("Component must be serializable") + } } }; } pub(crate) use impl_component; + +impl Clone for Box { + fn clone(&self) -> Box { + self.clone_box() + } +} + +type ComponentDeserializer = fn(Value) -> Box; + +lazy_static! { + pub static ref COMPONENT_REGISTRY: Mutex> = { + let mut map = HashMap::new(); + + fn register( + map: &mut HashMap<&'static str, ComponentDeserializer>, + ) { + fn deser( + v: Value, + ) -> Box { + Box::new(serde_json::from_value::(v).unwrap()) + } + + map.insert(std::any::type_name::(), deser::); + } + + // Register all the components! + register::(&mut map); + register::(&mut map); + register::(&mut map); + register::(&mut map); + register::(&mut map); + register::(&mut map); + register::(&mut map); + register::(&mut map); + register::(&mut map); + register::(&mut map); + + Mutex::new(map) + }; +} + +fn deserialize_component(type_name: &str, data: &Value) -> Box { + let registry = COMPONENT_REGISTRY + .lock() + .expect("Failed to lock component registry"); + + let deser = registry.get(type_name).unwrap_or_else(|| { + panic!("Component type '{}' not found in registry", type_name); + }); + + deser(data.clone()) +} diff --git a/lib/world/src/entities/fireball.rs b/lib/world/src/entities/fireball.rs new file mode 100644 index 0000000..bf08f75 --- /dev/null +++ b/lib/world/src/entities/fireball.rs @@ -0,0 +1,5 @@ +use crate::components::fine_world_pos::FineWorldPos; + +struct Fireball { + pos: FineWorldPos, +} diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 65d7ec4..13b532f 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -1,14 +1,15 @@ use super::{ - entity::{Entity, EntityHolder, EntityId, SerializedEntityHolder}, - entity_action::EntityActionHolder, - game_script::{EntityScriptHolder, GameScript}, + entities::Entities, + entity::{Entity, EntityId}, + entity_action::{EntityActionDto, EntityActionHolder}, + game_script::{EntityScriptHolder, GameScript, WasmGameScript}, }; use crate::{ chunk::{Chunk, ChunkId}, components::world_pos::WorldPos, entities::{ entity_action::EntityActionDtoMaker, - player::wasm::Player, + player::make_player, player_belt_script::{SecondaryBeltAction, SelectItemAction, UsePrimaryItemAction}, player_gravity_script::GravityScript, player_jump_script::JumpAction, @@ -16,6 +17,7 @@ use crate::{ player_rot_script::RotateAction, velocity_script::VelocityScript, }, + positions::ChunkPos, world::{world_block::WorldBlock, World}, }; use serde::{Deserialize, Serialize}; @@ -28,7 +30,7 @@ pub struct Game { pub name: String, pub id: String, pub world: World, - entity_holder: EntityHolder, + pub entities: Entities, scripts: EntityScriptHolder, schedule: GameSchedule, action_holder: EntityActionHolder, @@ -61,7 +63,7 @@ impl Game { name: "".to_string(), id: Uuid::new_v4().to_string(), world: World::default(), - entity_holder: EntityHolder::new(), + entities: Entities::new(), scripts: EntityScriptHolder::default(), schedule: GameSchedule::empty(), action_holder: EntityActionHolder::default(), @@ -70,12 +72,12 @@ impl Game { g } - pub fn build(id: String, name: String, world: World, entity_holder: EntityHolder) -> Game { + pub fn build(id: String, name: String, world: World, entities: Entities) -> Game { let mut g = Game { id, name, world, - entity_holder, + entities, scripts: EntityScriptHolder::default(), schedule: GameSchedule::empty(), action_holder: EntityActionHolder::default(), @@ -90,12 +92,12 @@ impl Game { let schedule = self .action_holder - .handle_actions(&self.world, &mut self.entity_holder); + .handle_actions(&self.world, &mut self.entities); self.schedule.combine(schedule); for script in self.scripts.get_scripts_mut() { let query = script.get_query(); - let query_results = self.entity_holder.query(&query); + let query_results = self.entities.query(&query); let diff = script.update(world, query_results); if let Some(diff) = diff { self.schedule.combine(diff); @@ -111,11 +113,11 @@ impl Game { // Apply diff to game // Add all new entities let new_ents = std::mem::take(&mut self.schedule.new_entities); - self.entity_holder.get_all_mut().extend(new_ents); + self.entities.get_all_mut().extend(new_ents); // Remove entities for entity_id in self.schedule.removed_entities.clone() { - self.entity_holder + self.entities .get_all_mut() .retain(|entity| entity.id != entity_id); } @@ -129,13 +131,13 @@ impl Game { // add blocks to world let new_blocks = std::mem::take(&mut self.schedule.new_blocks); for block in new_blocks { - self.world.add_block(&block); + self.world.add_block(&block).unwrap(); } // remove blocks from world let removed_blocks = std::mem::take(&mut self.schedule.removed_blocks); for block_pos in removed_blocks { - self.world.remove_block(&block_pos); + self.world.remove_block(&block_pos).unwrap(); } self.schedule.clear(); @@ -149,24 +151,77 @@ impl Game { self.schedule.new_entities.push(entity); } - pub fn serialize_entities_wasm(&self) -> Result { - let serialized_entities = self.entity_holder.serialize(); - let serialized_entities_js = serde_wasm_bindgen::to_value(&serialized_entities).unwrap(); - Ok(serialized_entities_js) + pub fn make_and_add_player_wasm(&mut self, uid: EntityId) -> () { + // skip if player already exists + if self.entities.get_entity_by_id(uid).is_some() { + return; + } + let player = make_player(uid); + self.schedule_entity_insert(player); + self.update(); + } + + pub fn handle_action_wasm(&mut self, action: EntityActionDto) { + self.action_holder.add(action); + } + + pub fn schedule_chunk_insert_wasm(&mut self, chunk: Chunk) { + self.schedule_chunk_insert(chunk); + } + + pub fn add_game_script_wasm(&mut self, script: WasmGameScript) { + self.add_script(Box::new(script)); + } + + pub fn get_chunk_mesh_by_chunkid_wasm(&self, chunk_id: ChunkId) -> Result { + self.world.get_chunk_mesh_wasm(chunk_id) } - pub fn deserialize_entities_wasm(&mut self, entities: JsValue) { - let serialized_entities: SerializedEntityHolder = - serde_wasm_bindgen::from_value(entities).unwrap(); + pub fn get_chunk_pos_from_id_wasm(&self, chunk_id: ChunkId) -> Result { + let chunk_pos = ChunkPos::from_id(chunk_id); + let chunk_pos_js = serde_wasm_bindgen::to_value(&chunk_pos).unwrap(); + Ok(chunk_pos_js) + } - let entity_holder = EntityHolder::deserialize(serialized_entities); - self.entity_holder = entity_holder; + pub fn get_chunk_id_from_chunk_pos_wasm(&self, value: JsValue) -> ChunkId { + let chunk_pos: ChunkPos = from_value(value).unwrap(); + chunk_pos.to_id() } - pub fn deserialize_entity_wasm(&mut self, entity: JsValue) { - let player: Player = from_value(entity).unwrap(); - let entity = Player::make_entity(&player); - self.schedule_entity_insert(entity); + pub fn get_world_pos_from_chunk_pos_wasm(&self, x: i16, y: i16) -> Result { + let chunk_pos = ChunkPos { x, y }; + let world_pos: WorldPos = chunk_pos.to_world_pos(); + let world_pos_js = serde_wasm_bindgen::to_value(&world_pos).unwrap(); + Ok(world_pos_js) + } + + pub fn get_chunk_pos_from_world_pos_wasm( + &self, + x: i32, + y: i32, + z: i32, + ) -> Result { + let world_pos = WorldPos { x, y, z }; + let chunk_pos: ChunkPos = world_pos.to_chunk_pos(); + let chunk_pos_js = serde_wasm_bindgen::to_value(&chunk_pos).unwrap(); + Ok(chunk_pos_js) + } + + pub fn get_loaded_chunk_ids_wasm(&self) -> Vec { + return self.world.get_loaded_chunk_ids(); + } + + pub fn get_block_wasm(&self, x: i32, y: i32, z: i32) -> Result { + let world_pos = WorldPos { x, y, z }; + let block = self.world.get_block(&world_pos); + let block_js = serde_wasm_bindgen::to_value(&block).unwrap(); + Ok(block_js) + } + + pub fn get_chunk_wasm(&self, chunk_pos: ChunkPos) -> Result { + let chunk = self.world.get_chunk(&chunk_pos); + let chunk_js = serde_wasm_bindgen::to_value(&chunk); + chunk_js } } @@ -279,7 +334,6 @@ mod tests { player::make_player, player_jump_script::{JumpAction, JumpActionData}, player_move_script::{MoveAction, MoveActionData, MoveScript}, - sandbox::SandBoxGScript, velocity_script::{self, VelocityScript}, }, }; @@ -292,7 +346,7 @@ mod tests { game.update(); // expect game to have a player in it - game.entity_holder.get_all_mut().iter().for_each(|ent| { + game.entities.get_all_mut().iter().for_each(|ent| { assert_eq!(ent.id, 1); }); } @@ -308,7 +362,7 @@ mod tests { let jump_action = JumpAction::make_dto(1, JumpActionData {}); game.action_holder.add(jump_action); game.update(); - let player = game.entity_holder.get_entity_by_id(1).unwrap(); + let player = game.entities.get_entity_by_id(1).unwrap(); let player_vel = player.get::().unwrap(); assert!(player_vel.y > 0.0); } @@ -341,7 +395,7 @@ mod tests { game.action_holder.add(move_action); game.update(); - let player = game.entity_holder.get_entity_by_id(1).unwrap(); + let player = game.entities.get_entity_by_id(1).unwrap(); let player_pos = player.get::().unwrap(); assert!(player_pos.z > 0.0); } @@ -367,169 +421,3 @@ mod tests { // assert_eq!(chunk_count, 2); // } } - -pub mod wasm { - use std::{cell::RefCell, rc::Rc}; - - use super::{Game, GameDiff, GameSchedule, GameScript}; - use crate::{ - chunk::{chunk_mesh::ChunkMesh, Chunk, ChunkId}, - components::world_pos::WorldPos, - entities::{ - entity::{Entity, EntityId, EntityQueryResults}, - entity_action::{EntityActionDto, EntityActionDtoMaker}, - player::{make_player, wasm::Player}, - player_jump_script::JumpAction, - player_move_script::{MoveAction, MoveScript}, - player_rot_script::RotateAction, - sandbox::{self, SandBoxGScript}, - velocity_script::VelocityScript, - }, - positions::ChunkPos, - utils::js_log, - world::World, - }; - use serde_wasm_bindgen::{from_value, Error}; - use wasm_bindgen::prelude::*; - - #[wasm_bindgen] - impl Game { - pub fn make_and_add_player_wasm(&mut self, uid: EntityId) -> () { - // skip if player already exists - if self.entity_holder.get_entity_by_id(uid).is_some() { - return; - } - let player = make_player(uid); - self.schedule_entity_insert(player); - self.update(); - } - - pub fn handle_action_wasm(&mut self, action: EntityActionDto) { - self.action_holder.add(action); - } - - pub fn schedule_chunk_insert_wasm(&mut self, chunk: Chunk) { - self.schedule_chunk_insert(chunk); - } - - pub fn add_game_script_wasm(&mut self, script: WasmGameScript) { - self.add_script(Box::new(script)); - } - - pub fn get_chunk_mesh_by_chunkid_wasm(&self, chunk_id: ChunkId) -> Result { - self.world.get_chunk_mesh_wasm(chunk_id) - } - - pub fn get_chunk_pos_from_id_wasm(&self, chunk_id: ChunkId) -> Result { - let chunk_pos = ChunkPos::from_id(chunk_id); - let chunk_pos_js = serde_wasm_bindgen::to_value(&chunk_pos).unwrap(); - Ok(chunk_pos_js) - } - - pub fn get_chunk_id_from_chunk_pos_wasm(&self, value: JsValue) -> ChunkId { - let chunk_pos: ChunkPos = from_value(value).unwrap(); - chunk_pos.to_id() - } - - pub fn get_world_pos_from_chunk_pos_wasm(&self, x: i16, y: i16) -> Result { - let chunk_pos = ChunkPos { x, y }; - let world_pos: WorldPos = chunk_pos.to_world_pos(); - let world_pos_js = serde_wasm_bindgen::to_value(&world_pos).unwrap(); - Ok(world_pos_js) - } - - pub fn get_chunk_pos_from_world_pos_wasm( - &self, - x: i32, - y: i32, - z: i32, - ) -> Result { - let world_pos = WorldPos { x, y, z }; - let chunk_pos: ChunkPos = world_pos.to_chunk_pos(); - let chunk_pos_js = serde_wasm_bindgen::to_value(&chunk_pos).unwrap(); - Ok(chunk_pos_js) - } - - pub fn get_player_no_copy_wasm(&self, player_id: EntityId) -> Player { - let maybe_player = self.entity_holder.get_entity_by_id(player_id); - if let Some(player) = maybe_player { - Player::make_from_entity(player) - } else { - panic!("Player {} not found", player_id) - } - } - - pub fn get_player_wasm(&self, player_id: EntityId) -> Result { - let maybe_player = self.entity_holder.get_entity_by_id(player_id); - if let Some(player) = maybe_player { - let wasm_player = Player::make_from_entity(player); - let player_js = serde_wasm_bindgen::to_value(&wasm_player).unwrap(); - Ok(player_js) - } else { - Err(Error::new(format!("Player {} not found", player_id))) - } - } - - pub fn get_players_wasm(&self) -> Result { - let players = self.entity_holder.get_all(); - let players_wasm: Vec = players - .iter() - .map(|player| Player::make_from_entity(player)) - .collect(); - let players_js = serde_wasm_bindgen::to_value(&players_wasm).unwrap(); - Ok(players_js) - } - - pub fn get_loaded_chunk_ids_wasm(&self) -> Vec { - return self.world.get_loaded_chunk_ids(); - } - - pub fn get_block_wasm(&self, x: i32, y: i32, z: i32) -> Result { - let world_pos = WorldPos { x, y, z }; - let block = self.world.get_block(&world_pos); - let block_js = serde_wasm_bindgen::to_value(&block).unwrap(); - Ok(block_js) - } - - pub fn get_chunk_wasm(&self, chunk_pos: ChunkPos) -> Result { - let chunk = self.world.get_chunk(&chunk_pos); - let chunk_js = serde_wasm_bindgen::to_value(&chunk); - chunk_js - } - } - - #[wasm_bindgen] - #[derive(Debug)] - pub struct WasmGameScript { - context: JsValue, - on_diff_jsfn: js_sys::Function, - } - - #[wasm_bindgen] - impl WasmGameScript { - #[wasm_bindgen(constructor)] - pub fn make(val: JsValue) -> WasmGameScript { - let on_diff_jsfn = js_sys::Reflect::get(&val, &JsValue::from("onDiff")).unwrap(); - WasmGameScript { - on_diff_jsfn: on_diff_jsfn.into(), - context: val, - } - } - } - - impl GameScript for WasmGameScript { - fn update( - &mut self, - _world: &World, - _query_results: EntityQueryResults, - ) -> Option { - None - } - - fn on_diff(&self, diff: GameDiff) -> () { - // console log diff - let val = serde_wasm_bindgen::to_value(&diff).unwrap(); - self.on_diff_jsfn.call1(&self.context, &val).unwrap(); - } - } -} diff --git a/lib/world/src/entities/game_script.rs b/lib/world/src/entities/game_script.rs index 544cd95..6ab60b5 100644 --- a/lib/world/src/entities/game_script.rs +++ b/lib/world/src/entities/game_script.rs @@ -1,11 +1,18 @@ -use super::entity::{EntityId, EntityQuery, EntityQueryResults}; +use super::entities::{EntityQuery, EntityQueryResults}; +use super::entity::EntityId; use super::game::{GameDiff, GameSchedule}; use crate::world::World; use std::any::Any; use std::fmt::Debug; +use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::JsValue; pub trait GameScript: Any + Debug { - fn update(&mut self, world: &World, query_results: EntityQueryResults) -> Option { + fn update( + &mut self, + _world: &World, + _query_results: EntityQueryResults, + ) -> Option { None } @@ -13,26 +20,11 @@ pub trait GameScript: Any + Debug { EntityQuery::new() } - fn on_diff(&self, diff: GameDiff) { + fn on_diff(&self, _diff: GameDiff) { // Default implementation does nothing } } -macro_rules! impl_script { - ($type:ty) => { - impl Component for $type { - fn as_any(&self) -> &dyn std::any::Any { - self - } - fn as_any_mut(&mut self) -> &mut dyn std::any::Any { - self - } - } - }; -} -pub(crate) use impl_script; -use wasm_bindgen::prelude::wasm_bindgen; - impl std::error::Error for ScriptNotFoundError {} #[derive(Debug)] @@ -69,27 +61,39 @@ impl EntityScriptHolder { pub fn iter_mut(&mut self) -> std::slice::IterMut> { self.scripts.iter_mut() } +} - // pub fn get_script(&self, entity_id: EntityId) -> Option<&T> - // where - // T: EntityScript + Any, - // { - // let ent_scripts = self.get_scripts_for_entity(entity_id); +#[wasm_bindgen] +#[derive(Debug)] +pub struct WasmGameScript { + context: JsValue, + on_diff_jsfn: js_sys::Function, +} - // let script = ent_scripts - // .iter() - // .find_map(|script| script.as_any().downcast_ref::()); +#[wasm_bindgen] +impl WasmGameScript { + #[wasm_bindgen(constructor)] + pub fn make(val: JsValue) -> WasmGameScript { + let on_diff_jsfn = js_sys::Reflect::get(&val, &JsValue::from("onDiff")).unwrap(); + WasmGameScript { + on_diff_jsfn: on_diff_jsfn.into(), + context: val, + } + } +} - // script - // } +impl GameScript for WasmGameScript { + fn update( + &mut self, + _world: &World, + _query_results: EntityQueryResults, + ) -> Option { + None + } - // pub fn copy(&self) -> EntityScriptHolder { - // EntityScriptHolder { - // scripts: self - // .scripts - // .into_iter() - // .map(|(id, script)| (id, script.clone())) - // .collect(), - // } - // } + fn on_diff(&self, diff: GameDiff) -> () { + // console log diff + let val = serde_wasm_bindgen::to_value(&diff).unwrap(); + self.on_diff_jsfn.call1(&self.context, &val).unwrap(); + } } diff --git a/lib/world/src/entities/mod.rs b/lib/world/src/entities/mod.rs index 7f61eb4..4b2b4fd 100644 --- a/lib/world/src/entities/mod.rs +++ b/lib/world/src/entities/mod.rs @@ -1,6 +1,8 @@ +pub mod entities; pub mod entity; pub mod entity_action; pub mod entity_component; +pub mod fireball; pub mod game; pub mod game_script; pub mod player; diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index b4e4e1d..4ae2d04 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -1,8 +1,7 @@ -use serde::{Deserialize, Serialize}; +use wasm_bindgen::prelude::wasm_bindgen; use super::{ entity::{Entity, EntityId}, - entity_component::impl_component, player_belt_script::Belt, player_gravity_script::GravityData, player_jump_script::JumpData, @@ -14,15 +13,8 @@ use crate::{ geometry::rotation::SphericalRotation, }; -#[derive(Debug, Serialize, Deserialize)] -pub struct Flying { - pub is_flying: bool, - pub on_ground: bool, -} -impl_component!(Flying); - pub fn make_player(uid: EntityId) -> Entity { - let mut ent = Entity::new(uid); + let mut ent = Entity::new(uid, "player".to_string()); ent.add::(FineWorldPos { x: 0.0, y: 10.0, @@ -39,69 +31,48 @@ pub fn make_player(uid: EntityId) -> Entity { ent } -pub mod wasm { - use crate::{ - components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}, - entities::{ - entity::{Entity, EntityId}, - player_belt_script::Belt, - player_gravity_script::GravityData, - player_jump_script::JumpData, - player_move_script::MovingDirection, - velocity_script::Forces, - }, - geometry::rotation::SphericalRotation, - }; - use serde::{Deserialize, Serialize}; - use wasm_bindgen::prelude::wasm_bindgen; +#[wasm_bindgen] +pub struct Player { + entity: Entity, +} + +#[wasm_bindgen] +impl Player { + pub fn new(entity: Entity) -> Player { + Player { entity } + } + + pub fn is_player(entity: &Entity) -> bool { + entity.name == "player" + } + + #[wasm_bindgen(getter)] + pub fn dim(&self) -> Size3 { + self.entity.get::().unwrap().clone() + } - #[derive(Serialize, Deserialize, Debug, Clone)] - #[wasm_bindgen] - pub struct Player { - pub id: EntityId, - pub pos: FineWorldPos, - pub vel: Velocity, - pub rot: SphericalRotation, - pub jump_data: JumpData, - pub moving_direction: MovingDirection, - #[serde(default = "Player::default_size")] - pub size: Size3, - #[serde(default = "Belt::default")] - pub belt: Belt, + #[wasm_bindgen(getter)] + pub fn pos(&self) -> FineWorldPos { + self.entity.get::().unwrap().clone() } - impl Player { - fn default_size() -> Size3 { - Size3::new(0.8, 1.8, 0.8) - } + #[wasm_bindgen(getter)] + pub fn vel(&self) -> Velocity { + self.entity.get::().unwrap().clone() } - impl Player { - pub fn make_from_entity(entity: &Entity) -> Player { - Player { - id: entity.id, - pos: entity.get::().unwrap().clone(), - vel: entity.get::().unwrap().clone(), - rot: entity.get::().unwrap().clone(), - moving_direction: entity.get::().unwrap().to_owned(), - jump_data: entity.get::().unwrap().to_owned(), - size: entity.get::().unwrap().to_owned(), - belt: entity.get::().unwrap().to_owned(), - } - } + #[wasm_bindgen(getter)] + pub fn rot(&self) -> SphericalRotation { + self.entity.get::().unwrap().clone() + } + + #[wasm_bindgen(getter)] + pub fn belt(&self) -> Belt { + self.entity.get::().unwrap().clone() + } - pub fn make_entity(&self) -> Entity { - let mut ent = Entity::new(self.id); - ent.add::(self.pos); - ent.add::(self.vel); - ent.add::(self.rot); - ent.add::(self.moving_direction); - ent.add::(Belt::default()); - ent.add::(JumpData::default()); - ent.add::(GravityData { has_gravity: true }); - ent.add::(Forces::default()); - ent.add::(Size3::new(0.8, 1.8, 0.8)); - ent - } + #[wasm_bindgen(getter)] + pub fn moving_direction(&self) -> MovingDirection { + self.entity.get::().unwrap().clone() } } diff --git a/lib/world/src/entities/player_gravity_script.rs b/lib/world/src/entities/player_gravity_script.rs index 9cd8c53..f3e223f 100644 --- a/lib/world/src/entities/player_gravity_script.rs +++ b/lib/world/src/entities/player_gravity_script.rs @@ -1,16 +1,14 @@ -use serde::{Deserialize, Serialize}; - -use crate::{components::velocity::Velocity, utils::js_log, vec::Vector3Ops, world::World}; - use super::{ - entity::{EntityQuery, EntityQueryResults}, + entities::{EntityQuery, EntityQueryResults}, entity_component::impl_component, game::GameSchedule, game_script::GameScript, velocity_script::Forces, }; +use crate::{components::velocity::Velocity, world::World}; +use serde::{Deserialize, Serialize}; -#[derive(Debug, Serialize, Deserialize, Default)] +#[derive(Debug, Serialize, Deserialize, Default, Clone)] pub struct GravityData { pub has_gravity: bool, } diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/entities/player_jump_script.rs index bcad204..9b5aa56 100644 --- a/lib/world/src/entities/player_jump_script.rs +++ b/lib/world/src/entities/player_jump_script.rs @@ -5,7 +5,6 @@ use super::{ entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}, entity_component::impl_component, game::GameSchedule, - player::Flying, }; use crate::{ components::velocity::Velocity, entities::velocity_script::Forces, utils::js_log, world::World, diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs index ffd7121..964bb53 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/entities/player_move_script.rs @@ -1,24 +1,18 @@ -use std::cmp::min; - -use crate::{ - components::{fine_world_pos::FineWorldPos, velocity::Velocity}, - direction::Direction, - geometry::rotation::SphericalRotation, - utils::js_log, - vec::Vector3Ops, - world::World, -}; -use serde::{Deserialize, Serialize}; -use wasm_bindgen::prelude::*; - use super::{ - entity::{Entity, EntityQuery, EntityQueryResults}, - entity_action::{ActionData, EntityActionDto, EntityActionDtoMaker, EntityActionHandler}, + entities::{EntityQuery, EntityQueryResults}, + entity::Entity, + entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}, entity_component::impl_component, game::GameSchedule, game_script::GameScript, velocity_script::Forces, }; +use crate::{ + components::velocity::Velocity, direction::Direction, geometry::rotation::SphericalRotation, + vec::Vector3Ops, world::World, +}; +use serde::{Deserialize, Serialize}; +use wasm_bindgen::prelude::*; #[wasm_bindgen] #[derive(Clone, Debug, Serialize, Deserialize)] diff --git a/lib/world/src/entities/player_rot_script.rs b/lib/world/src/entities/player_rot_script.rs index 0e986e2..a133e06 100644 --- a/lib/world/src/entities/player_rot_script.rs +++ b/lib/world/src/entities/player_rot_script.rs @@ -2,7 +2,6 @@ use super::entity::{Entity, EntityId}; use super::entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}; use super::game::GameSchedule; use crate::geometry::rotation::SphericalRotation; -use crate::utils::js_log; use crate::world::World; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::wasm_bindgen; diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index 6518d70..fe781e1 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -1,13 +1,11 @@ -use serde::Serialize; -use wasm_bindgen::prelude::wasm_bindgen; - use super::{ - entity::{EntityQuery, EntityQueryResults}, - game::{Game, GameDiff, GameSchedule}, + entities::{EntityQuery, EntityQueryResults}, + game::{Game, GameSchedule}, game_script::GameScript, - terrain_gen::TerrainGenerator, }; use crate::{components::fine_world_pos::FineWorldPos, positions::ChunkPos, world::World}; +use serde::Serialize; +use wasm_bindgen::prelude::wasm_bindgen; pub trait RequestChunk: std::fmt::Debug { fn request_chunk(&self, chunk_pos: ChunkPos); diff --git a/lib/world/src/entities/velocity_script.rs b/lib/world/src/entities/velocity_script.rs index 897c0c2..a836fca 100644 --- a/lib/world/src/entities/velocity_script.rs +++ b/lib/world/src/entities/velocity_script.rs @@ -1,17 +1,15 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}, - geometry::rect3::Rect3, - vec::Vector3Ops, -}; - use super::{ - entity::{EntityQuery, EntityQueryResults}, + entities::{EntityQuery, EntityQueryResults}, entity_component::impl_component, game::GameSchedule, game_script::GameScript, }; +use crate::{ + components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}, + geometry::rect3::Rect3, + vec::Vector3Ops, +}; +use serde::{Deserialize, Serialize}; #[derive(Debug, Default, Serialize, Deserialize, Clone)] pub struct Forces { From 7f08c3b8ce8d9a5028c61d5e10925ecd774377b9 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Mon, 26 May 2025 22:57:33 -0700 Subject: [PATCH 33/61] basics of fireballs --- .../src/game-scripts/canvas-gscript.ts | 17 ++-- apps/web-client/src/game-scripts/hudRender.ts | 4 +- apps/web-client/src/renders/sphereRender.ts | 28 +++++- apps/web-client/src/textureMapper.ts | 21 +++-- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/entities/entities.rs | 5 ++ lib/world/src/entities/entity.rs | 5 ++ lib/world/src/entities/fireball.rs | 48 ++++++++++- lib/world/src/entities/player_belt_script.rs | 86 ++++++++++++------- 9 files changed, 163 insertions(+), 53 deletions(-) diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index e64b907..0b60a7c 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -13,8 +13,9 @@ import { import { WebGlGScript } from "./webgl-gscript"; import { Renderer } from "../renders/renderer"; import { ChunkRenderer } from "../renders/chunkRender"; -import { BlockType, Entity, Game, Player } from "@craft/rust-world"; +import { BlockType, Entity, Fireball, Game, Player } from "@craft/rust-world"; import { PlayerRenderer } from "../renders/playerRender"; +import { SphereRenderer } from "../renders/sphereRender"; type Config = { renderDistance: number; @@ -107,6 +108,7 @@ export class CanvasGameScript extends GameScript { } for (const entityId of this.lastDiff.updated_entities) { + console.log("CanvasGameScript: Updating entity", entityId); const entity = this.gameWrapper.game.entities.get_entity_by_id_clone(entityId); if (!entity) { @@ -305,17 +307,22 @@ export class CanvasGameScript extends GameScript { console.log("CanvasGameScript: Adding entity", entity); // if (entity instanceof PlayerWrapper) { if (Player.is_player(entity)) { + console.log("CanvasGameScript: Adding player"); const renderer = new PlayerRenderer( this.game, this.webGlGScript, entity.id ); this.entityRenderers.set(entity.id, renderer); + } else if (Fireball.is_fireball(entity)) { + console.log("CanvasGameScript: Adding fireball"); + const renderer = new SphereRenderer( + this.game, + this.webGlGScript, + entity.id + ); + this.entityRenderers.set(entity.id, renderer); } - // } else if (entity instanceof Projectile) { - // const renderer = new SphereRenderer(this.webGlGScript, entity); - // this.entityRenderers.set(entity.uid, renderer); - // } } onRemovedEntity(entity: Entity): void { diff --git a/apps/web-client/src/game-scripts/hudRender.ts b/apps/web-client/src/game-scripts/hudRender.ts index 7e734a2..0875190 100644 --- a/apps/web-client/src/game-scripts/hudRender.ts +++ b/apps/web-client/src/game-scripts/hudRender.ts @@ -4,7 +4,7 @@ import { getEleOrError, hideElement, IS_MOBILE } from "../utils"; import { GameMenu } from "../renders/gameMenuRender"; import React from "react"; import ReactDOM from "react-dom"; -import { Game, Player } from "@craft/rust-world"; +import { Game, Item, Player } from "@craft/rust-world"; import TextureMapper from "../textureMapper"; export class HudGScript extends GameScript { @@ -163,7 +163,7 @@ export class HudGScript extends GameScript { // draw the icons for (let i = 0; i < belt.get_num_items(); i++) { - const item = belt.get_item(i); + const item: Item = belt.get_item_js(i); if (!item) { continue; } diff --git a/apps/web-client/src/renders/sphereRender.ts b/apps/web-client/src/renders/sphereRender.ts index 4786ffc..b095fa2 100644 --- a/apps/web-client/src/renders/sphereRender.ts +++ b/apps/web-client/src/renders/sphereRender.ts @@ -1,20 +1,40 @@ import { WebGlGScript } from "../game-scripts/webgl-gscript"; import { RenderData, Renderer } from "./renderer"; -import { Camera, Entity, IDim } from "@craft/engine"; +import { Camera, IDim, Vector3D } from "@craft/engine"; +import { Entity, Game } from "@craft/rust-world"; export class SphereRenderer extends Renderer { radius = 1; - constructor(webGlGScript: WebGlGScript, public entity: Entity) { + constructor( + public game: Game, + webGlGScript: WebGlGScript, + public entityId: number + ) { super(webGlGScript); - this.radius = entity.dim[0]; + const fireball = game.entities.get_entity_as_fireball(entityId); + if (!fireball) { + throw new Error("Fireball not found"); + } + + this.radius = fireball.dim.x; this.setup(); } render(camera: Camera) { - this.renderObject(this.entity.pos.data as IDim, camera); + const fireball = this.game.entities.get_entity_as_fireball(this.entityId); + if (!fireball) { + throw new Error("Fireball not found"); + } + + console.log("SphereRenderer: Rendering fireball", fireball); + + this.renderObject( + new Vector3D([fireball.pos.x, fireball.pos.y, fireball.pos.z]), + camera + ); } setup() { diff --git a/apps/web-client/src/textureMapper.ts b/apps/web-client/src/textureMapper.ts index eae31e0..bb84485 100644 --- a/apps/web-client/src/textureMapper.ts +++ b/apps/web-client/src/textureMapper.ts @@ -1,5 +1,4 @@ -import { Item, ThrowableItem } from "@craft/engine/item"; -import { BlockType } from "@craft/rust-world"; +import { BlockType, Item } from "@craft/rust-world"; const TEXTURE_ATLAS_WIDTH = 4; const TEXTURE_ATLAS_HEIGHT = 4; @@ -7,8 +6,10 @@ const TEXTURE_ATLAS_HEIGHT = 4; const xStepVal = 1 / TEXTURE_ATLAS_WIDTH; const yStepVal = 1 / TEXTURE_ATLAS_HEIGHT; +type ItemKey = BlockType | "Fireball"; + const textureData = new Map< - Item, + ItemKey, { offsetX: number; offsetY: number } | null >(); textureData.set(BlockType.Grass, { offsetX: 0, offsetY: 0 }); @@ -21,7 +22,7 @@ textureData.set(BlockType.RedFlower, { offsetX: 0, offsetY: 2 }); textureData.set(BlockType.Water, { offsetX: 2, offsetY: 2 }); textureData.set(BlockType.Planks, { offsetX: 3, offsetY: 0 }); textureData.set(BlockType.Red, { offsetX: 3, offsetY: 2 }); -textureData.set(ThrowableItem.Fireball, { offsetX: 3, offsetY: 1 }); +textureData.set("Fireball", { offsetX: 3, offsetY: 1 }); class Textures { private getTextureData(type: BlockType) { @@ -68,7 +69,17 @@ class Textures { } public getBlockPreviewCords(type: Item, width: number, height: number) { - const { offsetX, offsetY } = textureData.get(type)!; + const itemKey = + typeof type === "object" && "Block" in type ? type.Block : type; + const data = textureData.get(itemKey); + if (!data) { + console.log(textureData); + throw new Error( + `Texture data for texture ${JSON.stringify(type)} was not found` + ); + } + + const { offsetX, offsetY } = data; return { x1: offsetX * xStepVal * width, diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 4694d9a..1e4a953 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/camera.ts","./src/wrappers.ts","./src/game-script.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[47,49,50,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"06abb3bc5111c0366fcda2de55062501947e965c5b047435f6e67f7f7312af9a","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"2190af24cd8970497490c683989e0519fb8c15489edda3df05dc3c5e8c95bf13","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"6bd6ac836e29cdf9e234a7b13bb29148368bc3db2dad670abfbacb36288ec44f","signature":"3dad19a4fc83af787922cc0023a887f0ec4abdae44ad3e2e5c9b02125d68a50f","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"bd1fef4442cc97cad909bd08e37c0afa728c3c9ac286e39b7ff3068bd09101d0","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"322f723495a7a0a8eb726f5b130ba65257b71b21be66dfacf21bdb4bc9077a55","signature":"6382ca8397ca3146b4551e1f2dc37d871eb021c72482460422503a4d0f504a03","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[51,2],[49,3],[53,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/camera.ts","./src/wrappers.ts","./src/game-script.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[47,49,50,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e7a99c371bbebabfa45d460fc56a2f78947f67175aa44e2d928ff45c1bce8e5","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"2190af24cd8970497490c683989e0519fb8c15489edda3df05dc3c5e8c95bf13","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"6bd6ac836e29cdf9e234a7b13bb29148368bc3db2dad670abfbacb36288ec44f","signature":"3dad19a4fc83af787922cc0023a887f0ec4abdae44ad3e2e5c9b02125d68a50f","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"bd1fef4442cc97cad909bd08e37c0afa728c3c9ac286e39b7ff3068bd09101d0","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"322f723495a7a0a8eb726f5b130ba65257b71b21be66dfacf21bdb4bc9077a55","signature":"6382ca8397ca3146b4551e1f2dc37d871eb021c72482460422503a4d0f504a03","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[51,2],[49,3],[53,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file diff --git a/lib/world/src/entities/entities.rs b/lib/world/src/entities/entities.rs index 85973f1..f95d2f0 100644 --- a/lib/world/src/entities/entities.rs +++ b/lib/world/src/entities/entities.rs @@ -1,5 +1,6 @@ use super::entity::{Entity, EntityId}; use super::entity_component::Component; +use super::fireball::Fireball; use super::player::Player; use serde::{Deserialize, Serialize}; use serde_wasm_bindgen::{from_value, to_value}; @@ -109,6 +110,10 @@ impl Entities { self.get_entity_by_id(id).map(|entity| entity.as_player()) } + pub fn get_entity_as_fireball(&self, id: EntityId) -> Option { + self.get_entity_by_id(id).map(|entity| entity.as_fireball()) + } + pub fn get_all_clone(&self) -> Vec { self.entities.clone() } diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index 4609fb9..89f14cf 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -1,4 +1,5 @@ use super::entity_component::{Component, COMPONENT_REGISTRY}; +use super::fireball::Fireball; use super::player::Player; use serde::{de, ser::SerializeStruct, Deserializer}; use serde::{Deserialize, Serialize, Serializer}; @@ -136,6 +137,10 @@ impl Entity { Player::new(self.clone()) } + pub fn as_fireball(&self) -> Fireball { + Fireball::from_entity(self.clone()) + } + pub fn to_js(&self) -> JsValue { serde_wasm_bindgen::to_value(self).unwrap() } diff --git a/lib/world/src/entities/fireball.rs b/lib/world/src/entities/fireball.rs index bf08f75..bd79516 100644 --- a/lib/world/src/entities/fireball.rs +++ b/lib/world/src/entities/fireball.rs @@ -1,5 +1,47 @@ -use crate::components::fine_world_pos::FineWorldPos; +use wasm_bindgen::prelude::wasm_bindgen; -struct Fireball { - pos: FineWorldPos, +use crate::components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}; + +use super::{ + entity::{Entity, EntityId}, + velocity_script::Forces, +}; + +pub fn make_fireball(uid: EntityId, vel: Velocity) -> Entity { + let mut ent = Entity::new(uid, "fireball".to_string()); + ent.add::(FineWorldPos { + x: 5.0, + y: 5.0, + z: 5.0, + }); + ent.add::(vel); + ent.add::(Size3 { + x: 1.0, + y: 1.0, + z: 1.0, + }); + ent.add::(Forces { forces: vec![] }); + ent +} + +#[wasm_bindgen] +pub struct Fireball { + pub pos: FineWorldPos, + pub vel: Velocity, + pub dim: Size3, +} + +#[wasm_bindgen] +impl Fireball { + pub fn from_entity(entity: Entity) -> Fireball { + Fireball { + pos: entity.get::().unwrap().clone(), + vel: entity.get::().unwrap().clone(), + dim: entity.get::().unwrap().clone(), + } + } + + pub fn is_fireball(entity: &Entity) -> bool { + entity.name == "fireball" + } } diff --git a/lib/world/src/entities/player_belt_script.rs b/lib/world/src/entities/player_belt_script.rs index 3734df0..118f91d 100644 --- a/lib/world/src/entities/player_belt_script.rs +++ b/lib/world/src/entities/player_belt_script.rs @@ -1,13 +1,14 @@ use crate::{ block::{BlockData, BlockType}, - components::fine_world_pos::FineWorldPos, + components::{fine_world_pos::FineWorldPos, velocity::Velocity}, geometry::{ray::Ray, rotation::SphericalRotation}, utils::js_log, world::world_block::WorldBlock, }; -use super::{entity_action::EntityActionHandler, game::GameSchedule}; +use super::{entity_action::EntityActionHandler, fireball::make_fireball, game::GameSchedule}; use serde::{Deserialize, Serialize}; +use tsify::Tsify; use super::{ entity::{Entity, EntityId}, @@ -16,8 +17,9 @@ use super::{ }; use crate::direction::DirectionVectorExtension; use crate::{vec::Vector3Ops, world::World}; -use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; +// ================== Primary Action ================== #[wasm_bindgen] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct UsePrimaryItemActionData {} @@ -58,32 +60,38 @@ impl EntityActionHandler for UsePrimaryItemAction { let selected_item = belt.selected_item; let belt_item = belt.belt_items[selected_item]; - let eye_pos_offset = FineWorldPos::new(0.4, 1.5, 0.4); + if let Item::Fireball = belt_item { + let fireball = make_fireball(entity.id, Velocity::new(0.0, 0.0, 0.0)); + schedule.add_entity(fireball); + } else if let Item::Block(block_type) = belt_item { + let eye_pos_offset = FineWorldPos::new(0.4, 1.5, 0.4); - let camera_ray = Ray { - pos: pos.add(&eye_pos_offset), - rot: *rot, - }; + let camera_ray = Ray { + pos: pos.add(&eye_pos_offset), + rot: *rot, + }; - let pointed_at = world.get_pointed_at_block(camera_ray); + let pointed_at = world.get_pointed_at_block(camera_ray); - if let Some(pointed_at) = pointed_at { - let looking_at_pos = pointed_at.block.world_pos; - js_log(&format!("looking_at_pos: {:?}", looking_at_pos)); - let new_pos = looking_at_pos.move_direction(&pointed_at.face); - let block = WorldBlock { - block_type: belt_item, - extra_data: BlockData::None, - world_pos: new_pos, - }; + if let Some(pointed_at) = pointed_at { + let looking_at_pos = pointed_at.block.world_pos; + js_log(&format!("looking_at_pos: {:?}", looking_at_pos)); + let new_pos = looking_at_pos.move_direction(&pointed_at.face); + let block = WorldBlock { + block_type, + extra_data: BlockData::None, + world_pos: new_pos, + }; - schedule.add_block(block); + schedule.add_block(block); + } } schedule } } +// ================== Secondary Action ================== #[wasm_bindgen] #[derive(Clone, Debug, Default)] pub struct SecondaryBeltAction {} @@ -138,6 +146,8 @@ impl EntityActionHandler for SecondaryBeltAction { } } +// ================== Select Item Action ================== + #[wasm_bindgen] #[derive(Clone, Debug, Default)] pub struct SelectItemAction {} @@ -181,17 +191,27 @@ impl EntityActionHandler for SelectItemAction { } } -#[derive(Debug, Serialize, Deserialize, Clone, Copy)] +// ================== Items ================== + +#[derive(Clone, Debug, Serialize, Deserialize, Tsify, Copy)] +pub enum Item { + Fireball, + Block(BlockType), +} + +// ================== Belt ================== + +#[derive(Debug, Serialize, Deserialize, Clone)] #[wasm_bindgen] pub struct Belt { - belt_items: [BlockType; 10], + belt_items: [Item; 10], pub selected_item: usize, } #[wasm_bindgen] impl Belt { - pub fn get_item(&self, index: usize) -> BlockType { - self.belt_items[index] + pub fn get_item_js(&self, index: usize) -> JsValue { + serde_wasm_bindgen::to_value(&self.belt_items[index]).unwrap() } pub fn get_num_items(&self) -> usize { @@ -202,16 +222,16 @@ impl Belt { impl Default for Belt { fn default() -> Self { let belt_items = [ - BlockType::Gold, - BlockType::Stone, - BlockType::Grass, - BlockType::Water, - BlockType::Planks, - BlockType::Red, - BlockType::RedFlower, - BlockType::Wood, - BlockType::Leaf, - BlockType::Cloud, + Item::Block(BlockType::Gold), + Item::Block(BlockType::Stone), + Item::Block(BlockType::Grass), + Item::Block(BlockType::Water), + Item::Block(BlockType::Planks), + Item::Block(BlockType::Red), + Item::Block(BlockType::RedFlower), + Item::Block(BlockType::Wood), + Item::Block(BlockType::Leaf), + Item::Fireball, ]; Belt { belt_items, From 13ee641e6ed8e8330844a7af8ed4d7ab30c13a64 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Tue, 27 May 2025 08:48:51 -0700 Subject: [PATCH 34/61] Fireballs now show up --- apps/web-client/src/renders/sphereRender.ts | 6 ++---- lib/world/src/entities/entity.rs | 5 +++++ lib/world/src/entities/fireball.rs | 11 +++++------ lib/world/src/entities/game.rs | 1 + lib/world/src/entities/player_belt_script.rs | 2 +- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/apps/web-client/src/renders/sphereRender.ts b/apps/web-client/src/renders/sphereRender.ts index b095fa2..44367c1 100644 --- a/apps/web-client/src/renders/sphereRender.ts +++ b/apps/web-client/src/renders/sphereRender.ts @@ -1,7 +1,7 @@ import { WebGlGScript } from "../game-scripts/webgl-gscript"; import { RenderData, Renderer } from "./renderer"; -import { Camera, IDim, Vector3D } from "@craft/engine"; -import { Entity, Game } from "@craft/rust-world"; +import { Camera, Vector3D } from "@craft/engine"; +import { Game } from "@craft/rust-world"; export class SphereRenderer extends Renderer { radius = 1; @@ -29,8 +29,6 @@ export class SphereRenderer extends Renderer { throw new Error("Fireball not found"); } - console.log("SphereRenderer: Rendering fireball", fireball); - this.renderObject( new Vector3D([fireball.pos.x, fireball.pos.y, fireball.pos.z]), camera diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index 89f14cf..d89223b 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -1,6 +1,7 @@ use super::entity_component::{Component, COMPONENT_REGISTRY}; use super::fireball::Fireball; use super::player::Player; +use rand::Rng; use serde::{de, ser::SerializeStruct, Deserializer}; use serde::{Deserialize, Serialize, Serializer}; use std::{any::TypeId, fmt::Debug}; @@ -8,6 +9,10 @@ use wasm_bindgen::prelude::*; pub type EntityId = u32; +pub fn make_entity_id() -> EntityId { + rand::thread_rng().gen_range(0..=u32::MAX) +} + #[derive(Debug)] #[wasm_bindgen(getter_with_clone)] pub struct Entity { diff --git a/lib/world/src/entities/fireball.rs b/lib/world/src/entities/fireball.rs index bd79516..40345cd 100644 --- a/lib/world/src/entities/fireball.rs +++ b/lib/world/src/entities/fireball.rs @@ -1,13 +1,12 @@ -use wasm_bindgen::prelude::wasm_bindgen; - -use crate::components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}; - use super::{ - entity::{Entity, EntityId}, + entity::{make_entity_id, Entity}, velocity_script::Forces, }; +use crate::components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}; +use wasm_bindgen::prelude::wasm_bindgen; -pub fn make_fireball(uid: EntityId, vel: Velocity) -> Entity { +pub fn make_fireball(vel: Velocity) -> Entity { + let uid = make_entity_id(); let mut ent = Entity::new(uid, "fireball".to_string()); ent.add::(FineWorldPos { x: 5.0, diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 13b532f..c11c186 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -18,6 +18,7 @@ use crate::{ velocity_script::VelocityScript, }, positions::ChunkPos, + utils::js_log, world::{world_block::WorldBlock, World}, }; use serde::{Deserialize, Serialize}; diff --git a/lib/world/src/entities/player_belt_script.rs b/lib/world/src/entities/player_belt_script.rs index 118f91d..88f32b9 100644 --- a/lib/world/src/entities/player_belt_script.rs +++ b/lib/world/src/entities/player_belt_script.rs @@ -61,7 +61,7 @@ impl EntityActionHandler for UsePrimaryItemAction { let belt_item = belt.belt_items[selected_item]; if let Item::Fireball = belt_item { - let fireball = make_fireball(entity.id, Velocity::new(0.0, 0.0, 0.0)); + let fireball = make_fireball(Velocity::new(0.1, 0.0, 0.0)); schedule.add_entity(fireball); } else if let Item::Block(block_type) = belt_item { let eye_pos_offset = FineWorldPos::new(0.4, 1.5, 0.4); From 6187117c5b001d1f1977f3c585b603f92c629233 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Tue, 27 May 2025 22:01:09 -0700 Subject: [PATCH 35/61] Fireballs remove blocks and hurt players. --- DEVLOG.md | 6 + .../src/game-scripts/canvas-gscript.ts | 7 +- apps/web-client/src/game-scripts/hudRender.ts | 13 +- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/entities/fireball.rs | 120 +++++++++++++++++- lib/world/src/entities/game.rs | 11 +- lib/world/src/entities/player.rs | 20 +++ lib/world/src/entities/player_belt_script.rs | 10 +- lib/world/src/geometry/rect3.rs | 25 ++++ 9 files changed, 190 insertions(+), 24 deletions(-) diff --git a/DEVLOG.md b/DEVLOG.md index da71e09..59eff76 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,3 +1,9 @@ +# 05_27_25 + +I reworked the entity serialiaztion yesterday and I'm so happy with it now. Now I'm working on adding the fireballs back. They are working but they don't destory anything yet, I need to make them destroy blocks and hurt players. + +What happens if you die? Maybe you just teleport back to the spawn. + # 05_26_25 I made the UI yesterday and it is coming along. I need to figure out what to do next. I think making the belt work seems good. diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index 0b60a7c..8e0f436 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -113,6 +113,7 @@ export class CanvasGameScript extends GameScript { this.gameWrapper.game.entities.get_entity_by_id_clone(entityId); if (!entity) { console.log("CanvasGameScript: Entity not found", entityId); + this.onRemovedEntity(entityId); continue; } this.onNewEntity(entity); @@ -325,9 +326,9 @@ export class CanvasGameScript extends GameScript { } } - onRemovedEntity(entity: Entity): void { - console.log("CanvasGameScript: Removing entity", entity); - this.entityRenderers.delete(entity.id); + onRemovedEntity(entityId: number): void { + console.log("CanvasGameScript: Removing entity", entityId); + this.entityRenderers.delete(entityId); } onChunkUpdate(chunkId: number): void { diff --git a/apps/web-client/src/game-scripts/hudRender.ts b/apps/web-client/src/game-scripts/hudRender.ts index 0875190..d8f955d 100644 --- a/apps/web-client/src/game-scripts/hudRender.ts +++ b/apps/web-client/src/game-scripts/hudRender.ts @@ -139,7 +139,7 @@ export class HudGScript extends GameScript { this.drawBelt(player); - // this.drawHealthBar(); + this.drawHealthBar(player); } drawBelt(player: Player) { @@ -201,12 +201,11 @@ export class HudGScript extends GameScript { } } - // drawHealthBar() { - // if (!this.basicGScript.mainPlayer) return; - // const { current, max } = this.basicGScript.mainPlayer.health; - // const healthPercent = current / max; - // this.eHealthBar.style.width = `${healthPercent * 100}%`; - // } + drawHealthBar(player: Player) { + const { health, max_health } = player.health; + const healthPercent = health / max_health; + this.eHealthBar.style.width = `${healthPercent * 100}%`; + } hideControls() { hideElement(this.eForwardButton); diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 1e4a953..a214ad1 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/camera.ts","./src/wrappers.ts","./src/game-script.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[47,49,50,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"5e7a99c371bbebabfa45d460fc56a2f78947f67175aa44e2d928ff45c1bce8e5","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"2190af24cd8970497490c683989e0519fb8c15489edda3df05dc3c5e8c95bf13","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"6bd6ac836e29cdf9e234a7b13bb29148368bc3db2dad670abfbacb36288ec44f","signature":"3dad19a4fc83af787922cc0023a887f0ec4abdae44ad3e2e5c9b02125d68a50f","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"bd1fef4442cc97cad909bd08e37c0afa728c3c9ac286e39b7ff3068bd09101d0","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"322f723495a7a0a8eb726f5b130ba65257b71b21be66dfacf21bdb4bc9077a55","signature":"6382ca8397ca3146b4551e1f2dc37d871eb021c72482460422503a4d0f504a03","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[51,2],[49,3],[53,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/camera.ts","./src/wrappers.ts","./src/game-script.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[47,49,50,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"9a0ff1d6f6abddb3ad1e02a9fc2e592b6945481897644100b6ffeeb36ca0fd3b","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"2190af24cd8970497490c683989e0519fb8c15489edda3df05dc3c5e8c95bf13","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"6bd6ac836e29cdf9e234a7b13bb29148368bc3db2dad670abfbacb36288ec44f","signature":"3dad19a4fc83af787922cc0023a887f0ec4abdae44ad3e2e5c9b02125d68a50f","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"bd1fef4442cc97cad909bd08e37c0afa728c3c9ac286e39b7ff3068bd09101d0","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"322f723495a7a0a8eb726f5b130ba65257b71b21be66dfacf21bdb4bc9077a55","signature":"6382ca8397ca3146b4551e1f2dc37d871eb021c72482460422503a4d0f504a03","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[51,2],[49,3],[53,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file diff --git a/lib/world/src/entities/fireball.rs b/lib/world/src/entities/fireball.rs index 40345cd..60b71b7 100644 --- a/lib/world/src/entities/fireball.rs +++ b/lib/world/src/entities/fireball.rs @@ -1,18 +1,22 @@ use super::{ + entities::{EntityQuery, EntityQueryResults}, entity::{make_entity_id, Entity}, + game::GameSchedule, + game_script::GameScript, + player::Health, velocity_script::Forces, }; -use crate::components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}; +use crate::{ + components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}, + geometry::rect3::Rect3, + utils::js_log, +}; use wasm_bindgen::prelude::wasm_bindgen; -pub fn make_fireball(vel: Velocity) -> Entity { +pub fn make_fireball(pos: FineWorldPos, vel: Velocity) -> Entity { let uid = make_entity_id(); let mut ent = Entity::new(uid, "fireball".to_string()); - ent.add::(FineWorldPos { - x: 5.0, - y: 5.0, - z: 5.0, - }); + ent.add::(pos); ent.add::(vel); ent.add::(Size3 { x: 1.0, @@ -44,3 +48,105 @@ impl Fireball { entity.name == "fireball" } } + +// Make a gamescript that checks for collisions between fireballs and other entities. + +#[derive(Debug, Default)] +pub struct FireballScript {} + +impl GameScript for FireballScript { + fn get_query(&self) -> EntityQuery { + let mut query = EntityQuery::new(); + query.add::(); + query.add::(); + query + } + + fn update( + &mut self, + world: &crate::world::World, + mut query_results: EntityQueryResults, + ) -> Option { + let mut game_schedule = GameSchedule::empty(); + + // First, collect all the fireball data and other entity data to avoid borrow conflicts + let mut fireball_data = Vec::new(); + let mut other_entity_data = Vec::new(); + + for entity in &query_results.entities { + if Fireball::is_fireball(entity) { + if let (Some(vel), Some(pos), Some(dim)) = ( + entity.get::(), + entity.get::(), + entity.get::(), + ) { + fireball_data.push((entity.id, vel.clone(), pos.clone(), dim.clone())); + } + } else { + if let (Some(pos), Some(dim)) = + (entity.get::(), entity.get::()) + { + other_entity_data.push((entity.id, pos.clone(), dim.clone())); + } + } + } + + // Process fireball collisions with blocks + for (fireball_id, vel, pos, dim) in &fireball_data { + let fireball_rect = Rect3 { + pos: *pos, + dim: *dim, + }; + let fireball_end_pos = *pos + *vel; + + let intersection_info = + world.get_moving_rect3_intersection_info(&fireball_rect, fireball_end_pos); + + if let Some(intersection_info) = intersection_info { + let intersecting_block_pos = intersection_info.world_plane.world_pos; + game_schedule.remove_block(intersecting_block_pos); + game_schedule.remove_entity(*fireball_id); + } + } + + // Process fireball collisions with other entities + for (fireball_id, _vel, fireball_pos, fireball_dim) in &fireball_data { + let fireball_rect = Rect3 { + pos: *fireball_pos, + dim: *fireball_dim, + }; + + for (other_entity_id, other_pos, other_dim) in &other_entity_data { + if fireball_id == other_entity_id { + continue; + } + + let entity2_rect = Rect3 { + pos: *other_pos, + dim: *other_dim, + }; + + if entity2_rect.does_intersect(&fireball_rect) { + js_log(format!("fireball hit entity: {:?}", other_entity_id).as_str()); + game_schedule.remove_entity(*fireball_id); + + // Find the entity to update its health + for entity in &mut query_results.entities { + if entity.id == *other_entity_id { + if let Some(health) = entity.get::() { + let new_health = health.health - 10; + entity.set::(Health { + health: new_health, + max_health: health.max_health, + }); + } + break; + } + } + } + } + } + + Some(game_schedule) + } +} diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index c11c186..1bf39b5 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -9,6 +9,7 @@ use crate::{ components::world_pos::WorldPos, entities::{ entity_action::EntityActionDtoMaker, + fireball::FireballScript, player::make_player, player_belt_script::{SecondaryBeltAction, SelectItemAction, UsePrimaryItemAction}, player_gravity_script::GravityScript, @@ -18,7 +19,6 @@ use crate::{ velocity_script::VelocityScript, }, positions::ChunkPos, - utils::js_log, world::{world_block::WorldBlock, World}, }; use serde::{Deserialize, Serialize}; @@ -43,6 +43,7 @@ impl Game { self.add_script(Box::new(MoveScript::default())); self.add_script(Box::new(VelocityScript::default())); self.add_script(Box::new(GravityScript::default())); + self.add_script(Box::new(FireballScript::default())); self.action_holder.add_handler(MoveAction::make_handler()); self.action_holder.add_handler(JumpAction::make_handler()); @@ -107,10 +108,6 @@ impl Game { let game_diff = self.schedule.to_game_diff(); - self.scripts.iter_mut().for_each(|script| { - script.on_diff(game_diff.clone()); - }); - // Apply diff to game // Add all new entities let new_ents = std::mem::take(&mut self.schedule.new_entities); @@ -141,6 +138,10 @@ impl Game { self.world.remove_block(&block_pos).unwrap(); } + self.scripts.iter_mut().for_each(|script| { + script.on_diff(game_diff.clone()); + }); + self.schedule.clear(); } diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index 4ae2d04..d12b2dc 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -1,7 +1,9 @@ +use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::wasm_bindgen; use super::{ entity::{Entity, EntityId}, + entity_component::impl_component, player_belt_script::Belt, player_gravity_script::GravityData, player_jump_script::JumpData, @@ -13,6 +15,15 @@ use crate::{ geometry::rotation::SphericalRotation, }; +#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Copy)] +#[wasm_bindgen] +pub struct Health { + pub health: u32, + pub max_health: u32, +} + +impl_component!(Health); + pub fn make_player(uid: EntityId) -> Entity { let mut ent = Entity::new(uid, "player".to_string()); ent.add::(FineWorldPos { @@ -28,6 +39,10 @@ pub fn make_player(uid: EntityId) -> Entity { ent.add::(Belt::default()); ent.add::(GravityData { has_gravity: true }); ent.add::(Forces::default()); + ent.add::(Health { + health: 100, + max_health: 100, + }); ent } @@ -75,4 +90,9 @@ impl Player { pub fn moving_direction(&self) -> MovingDirection { self.entity.get::().unwrap().clone() } + + #[wasm_bindgen(getter)] + pub fn health(&self) -> Health { + self.entity.get::().unwrap().clone() + } } diff --git a/lib/world/src/entities/player_belt_script.rs b/lib/world/src/entities/player_belt_script.rs index 88f32b9..2b26d2b 100644 --- a/lib/world/src/entities/player_belt_script.rs +++ b/lib/world/src/entities/player_belt_script.rs @@ -61,7 +61,15 @@ impl EntityActionHandler for UsePrimaryItemAction { let belt_item = belt.belt_items[selected_item]; if let Item::Fireball = belt_item { - let fireball = make_fireball(Velocity::new(0.1, 0.0, 0.0)); + let eye_pos_offset = FineWorldPos::new(0.4, 1.5, 0.4); + let mut fireball_vel: Velocity = (*rot).into(); + fireball_vel = fireball_vel.set_mag(0.1); + + let pos_offset = pos + .add(&eye_pos_offset) + .add(&fireball_vel.scalar_mult(10.0)); + + let fireball = make_fireball(pos_offset, fireball_vel); schedule.add_entity(fireball); } else if let Item::Block(block_type) = belt_item { let eye_pos_offset = FineWorldPos::new(0.4, 1.5, 0.4); diff --git a/lib/world/src/geometry/rect3.rs b/lib/world/src/geometry/rect3.rs index 11be4bf..3f2e54f 100644 --- a/lib/world/src/geometry/rect3.rs +++ b/lib/world/src/geometry/rect3.rs @@ -22,6 +22,31 @@ pub struct Rect3 { static DISTANCE_EPSILON: f32 = 0.01; impl Rect3 { + pub fn does_intersect(&self, other: &Rect3) -> bool { + // Axis-Aligned Bounding Box (AABB) intersection test + let self_min_x = self.pos.x; + let self_max_x = self.pos.x + self.dim.x; + let self_min_y = self.pos.y; + let self_max_y = self.pos.y + self.dim.y; + let self_min_z = self.pos.z; + let self_max_z = self.pos.z + self.dim.z; + + let other_min_x = other.pos.x; + let other_max_x = other.pos.x + other.dim.x; + let other_min_y = other.pos.y; + let other_max_y = other.pos.y + other.dim.y; + let other_min_z = other.pos.z; + let other_max_z = other.pos.z + other.dim.z; + + // Check for separation along each axis + !(self_max_x <= other_min_x + || self_min_x >= other_max_x + || self_max_y <= other_min_y + || self_min_y >= other_max_y + || self_max_z <= other_min_z + || self_min_z >= other_max_z) + } + pub fn get_all_points(&self) -> [FineWorldPos; 8] { let x = self.pos.x; let y = self.pos.y; From 7474b4971a6a1504f96085d372151d00ed41a294 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Tue, 27 May 2025 22:29:31 -0700 Subject: [PATCH 36/61] Some server fixes --- DEVLOG.md | 2 ++ apps/server/db.ts | 3 +- apps/server/server-game-manager.ts | 32 ++++++++++--------- .../src/components/ServerHomePage.tsx | 2 +- apps/web-client/src/renders/playerRender.ts | 12 ++++--- .../src/services/mp-games-service.ts | 17 ++++++---- lib/world/src/entities/entities.rs | 12 ++++--- 7 files changed, 47 insertions(+), 33 deletions(-) diff --git a/DEVLOG.md b/DEVLOG.md index 59eff76..fab8656 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -4,6 +4,8 @@ I reworked the entity serialiaztion yesterday and I'm so happy with it now. Now What happens if you die? Maybe you just teleport back to the spawn. +Okay, now I'm testing the server again. I've found a couple errors and a lot fo files that didn't build. Now I'm getting an issue with the entity serialization, the components are not being serialized when being saved to the db. Idk what is going on. + # 05_26_25 I made the UI yesterday and it is coming along. I need to figure out what to do next. I think making the belt work seems good. diff --git a/apps/server/db.ts b/apps/server/db.ts index d858839..f6149ee 100644 --- a/apps/server/db.ts +++ b/apps/server/db.ts @@ -63,11 +63,12 @@ export class GameDb { const serializedGame = { gameId: game.id, name: game.name, - entities: game.serialize_entities_wasm(), + entities: game.entities.to_js(), world: game.world.serialize_wasm(), // terrainGen: game.terrainGen.serialize(), // sandbox: game.sandbox, }; + console.log("Saving game", JSON.stringify(serializedGame, null, 2)); await this.gameCollection.updateOne( { gameId: game.id }, { $set: serializedGame }, diff --git a/apps/server/server-game-manager.ts b/apps/server/server-game-manager.ts index 2e32db7..9313d52 100644 --- a/apps/server/server-game-manager.ts +++ b/apps/server/server-game-manager.ts @@ -16,10 +16,10 @@ import { GameDb } from "./db"; type ClientId = number; -interface ScriptDiff { - scriptName: string; - diff: GameDiff; -} +// interface ScriptDiff { +// scriptName: string; +// diff: GameDiff; +// } class TerrainChunkGetter { private chunks_to_insert: Chunk[] = []; @@ -84,22 +84,29 @@ export class ServerGameManager { this.game.make_and_add_player_wasm(myUid); + const entities = this.game.entities.to_js(); + + console.log("Entities", JSON.stringify(entities, null, 2)); + // send welcome message this.socketInterface.send( ws, new SocketMessage(ISocketMessageType.welcome, { uid: myUid, - entities: this.game.serialize_entities_wasm(), + entities: entities, }) ); + const entity = this.game.entities.get_entity(myUid); + if (!entity) { + console.error("Player not found in join request", myUid); + return; + } + this.clients.forEach((client, _) => { this.socketInterface.send( client, - new SocketMessage( - ISocketMessageType.newPlayer, - this.game.get_player_wasm(myUid) - ) + new SocketMessage(ISocketMessageType.newPlayer, entity.to_js()) ); }); @@ -193,11 +200,6 @@ export class ServerGameManager { } save() { - const serializedGame = { - gameId: this.game.id, - name: this.game.name, - entities: this.game.serialize_entities_wasm(), - world: this.game.world.serialize_wasm(), - }; + this.gameDb.saveGame(this.game); } } diff --git a/apps/web-client/src/components/ServerHomePage.tsx b/apps/web-client/src/components/ServerHomePage.tsx index 559051c..9f5dfb4 100644 --- a/apps/web-client/src/components/ServerHomePage.tsx +++ b/apps/web-client/src/components/ServerHomePage.tsx @@ -11,7 +11,7 @@ export function ServerHomePage() { const createGameWrapper = async (gameId: string) => { console.log("Starting game", gameId); const game = await createGame(gameId); - navigate(`/game/${game}`); + navigate(`/server-game/${game}`); }; useEffect(() => { diff --git a/apps/web-client/src/renders/playerRender.ts b/apps/web-client/src/renders/playerRender.ts index 3ce5b7b..a8cb6cb 100644 --- a/apps/web-client/src/renders/playerRender.ts +++ b/apps/web-client/src/renders/playerRender.ts @@ -1,4 +1,4 @@ -import { Camera, Vector3D, PlayerWrapper } from "@craft/engine"; +import { Camera, Vector3D } from "@craft/engine"; import { RenderData, Renderer } from "./renderer"; import ShapeBuilder from "../services/shape-builder"; import TextureMapper from "../textureMapper"; @@ -38,10 +38,12 @@ export class PlayerRenderer extends Renderer { } render(camera: Camera) { - const player = new PlayerRenderWrapper( - this.game.get_player_wasm(this.entityId) - ); - this.calculateBuffers(player); + const player = this.game.entities.get_entity_as_player(this.entityId); + if (!player) { + throw new Error("Player not found"); + } + const player_render_wrapper = new PlayerRenderWrapper(player); + this.calculateBuffers(player_render_wrapper); this.renderObject( new Vector3D([player.pos.x, player.pos.y, player.pos.z]), camera diff --git a/apps/web-client/src/services/mp-games-service.ts b/apps/web-client/src/services/mp-games-service.ts index eaf45c9..4ff9d32 100644 --- a/apps/web-client/src/services/mp-games-service.ts +++ b/apps/web-client/src/services/mp-games-service.ts @@ -9,6 +9,8 @@ import { import { SocketHandler, SocketListener } from "../socket"; import { AppConfig } from "../appConfig"; import { + Entities, + Entity, EntityActionDto, EntityActionJson, Game, @@ -97,9 +99,9 @@ export async function serverRunner(gameId: string) { const game = new Game(); (window as any).game = game; - game.deserialize_entities_wasm(welcomeMessage.entities); + game.entities = Entities.from_js(welcomeMessage.entities); - console.log(game.serialize_entities_wasm()); + console.log(game.entities.to_js()); const webglGameScript = new WebGlGScript(game); @@ -136,15 +138,18 @@ export async function serverRunner(gameId: string) { } if (message.isType(ISocketMessageType.newPlayer)) { const player = message.data; - game.deserialize_entity_wasm(player); + game.entities.add_entity(Entity.from_js(player)); } }); const playerController = new KeyboardPlayerEntityController( + game, onAction, + () => { + // NO-OP + }, myUid, - canvasGameScript, - webglGameScript + canvasGameScript ); const getChunk = async (chunkPos: { x: number; y: number }) => { @@ -162,8 +167,6 @@ export async function serverRunner(gameId: string) { const sandbox = new SandBoxGScript(1, chunkRequester); game.add_sandbox_wasm(sandbox); - console.log(game.serialize_entities_wasm()); - const gameLoop = async () => { const chunkToInsert = chunksToInsert.pop(); if (chunkToInsert) { diff --git a/lib/world/src/entities/entities.rs b/lib/world/src/entities/entities.rs index f95d2f0..6be01a8 100644 --- a/lib/world/src/entities/entities.rs +++ b/lib/world/src/entities/entities.rs @@ -59,10 +59,6 @@ impl Entities { } } - pub fn add_entity(&mut self, entity: Entity) { - self.entities.push(entity); - } - pub fn get_entity_by_id(&self, id: EntityId) -> Option<&Entity> { self.entities.iter().find(|entity| entity.id == id) } @@ -97,6 +93,14 @@ impl Entities { #[wasm_bindgen] impl Entities { + pub fn add_entity(&mut self, entity: Entity) { + self.entities.push(entity); + } + + pub fn get_entity(&self, id: EntityId) -> Option { + self.entities.iter().find(|entity| entity.id == id).cloned() + } + pub fn to_js(&self) -> JsValue { to_value(self).unwrap() } From e1d2d5bbc2e4cacc4c1d89266b28ae0e0a8f53bc Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Mon, 2 Jun 2025 20:31:23 -0700 Subject: [PATCH 37/61] Server games work again --- apps/server/db.ts | 7 +- apps/server/server-game-manager.ts | 9 +- .../src/services/mp-games-service.ts | 66 +++++--- .../src/services/sp-games-service.ts | 1 + lib/engine/src/wrappers.ts | 17 ++ lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/entities/entity.rs | 24 ++- lib/world/src/entities/entity_action.rs | 154 +++++++++++------- lib/world/src/entities/entity_component.rs | 18 +- lib/world/src/entities/player_belt_script.rs | 4 +- lib/world/src/entities/player_jump_script.rs | 2 +- lib/world/src/entities/sandbox.rs | 3 +- 12 files changed, 192 insertions(+), 115 deletions(-) diff --git a/apps/server/db.ts b/apps/server/db.ts index f6149ee..34d6319 100644 --- a/apps/server/db.ts +++ b/apps/server/db.ts @@ -68,10 +68,13 @@ export class GameDb { // terrainGen: game.terrainGen.serialize(), // sandbox: game.sandbox, }; - console.log("Saving game", JSON.stringify(serializedGame, null, 2)); + const json = JSON.stringify(serializedGame, null, 2); + const parsedGame = JSON.parse(json); + console.log("Saving game parsed", parsedGame); + console.log("Saving game json", json); await this.gameCollection.updateOne( { gameId: game.id }, - { $set: serializedGame }, + { $set: parsedGame }, { upsert: true } ); } diff --git a/apps/server/server-game-manager.ts b/apps/server/server-game-manager.ts index 9313d52..a4855c2 100644 --- a/apps/server/server-game-manager.ts +++ b/apps/server/server-game-manager.ts @@ -1,7 +1,7 @@ import { Chunk, ChunkNotLoadedError, - EntityActionJson, + EntityActionDto, Game, GameDiff, SandBoxGScript, @@ -123,12 +123,9 @@ export class ServerGameManager { return; } const action = message.data; + console.log("Received Action", JSON.stringify(action, null, 2)); - const actionDto = EntityActionJson.deserialize_wasm( - action.entity_id, - action.name, - action.data - ); + const actionDto = EntityActionDto.from_js(action); this.game.handle_action_wasm(actionDto); diff --git a/apps/web-client/src/services/mp-games-service.ts b/apps/web-client/src/services/mp-games-service.ts index 4ff9d32..7fcadcf 100644 --- a/apps/web-client/src/services/mp-games-service.ts +++ b/apps/web-client/src/services/mp-games-service.ts @@ -12,7 +12,6 @@ import { Entities, Entity, EntityActionDto, - EntityActionJson, Game, SandBoxGScript, WasmGameScript, @@ -22,6 +21,7 @@ import { CanvasGameScript } from "../game-scripts/canvas-gscript"; import { WebGlGScript } from "../game-scripts/webgl-gscript"; import { getMyUid } from "../utils"; import { KeyboardPlayerEntityController } from "../controllers/playerControllers/keyboardPlayerController"; +import { HudGScript } from "../game-scripts/hudRender"; export const SocketInterface = new SocketHandler(); @@ -99,41 +99,28 @@ export async function serverRunner(gameId: string) { const game = new Game(); (window as any).game = game; - game.entities = Entities.from_js(welcomeMessage.entities); - - console.log(game.entities.to_js()); + const entities = Entities.from_js(welcomeMessage.entities); const webglGameScript = new WebGlGScript(game); const canvasGameScript = new CanvasGameScript(game, webglGameScript, myUid); const wasmCanvasGameScript = new WasmGameScript(canvasGameScript); + const hudRender = new HudGScript(game, canvasGameScript, myUid); game.add_game_script_wasm(wasmCanvasGameScript); const chunksToInsert: ISerializedChunk[] = []; const onAction = (action: EntityActionDto) => { console.log("Player Action", action); - const entityId = action.entity_id; - const name = action.get_name(); - const data = EntityActionJson.from_entity_action_dto(action); + const data = action.to_js(); game.handle_action_wasm(action); - SocketInterface.send( - SocketMessage.make(ISocketMessageType.actions, { - entity_id: entityId, - name, - data, - }) - ); + SocketInterface.send(SocketMessage.make(ISocketMessageType.actions, data)); }; SocketInterface.addListener((message) => { console.log("Got actions message from server", message); if (message.isType(ISocketMessageType.actions)) { const action = message.data; - const actionDto = EntityActionJson.deserialize_wasm( - action.entity_id, - action.name, - action.data - ); + const actionDto = EntityActionDto.from_js(action); game.handle_action_wasm(actionDto); } if (message.isType(ISocketMessageType.newPlayer)) { @@ -152,12 +139,18 @@ export async function serverRunner(gameId: string) { canvasGameScript ); + const fetchingChunk = new Set(); const getChunk = async (chunkPos: { x: number; y: number }) => { + if (fetchingChunk.has(chunkPos.x + "," + chunkPos.y)) { + return; + } console.log("Getting chunk", chunkPos); + fetchingChunk.add(chunkPos.x + "," + chunkPos.y); fetch(`${baseUrl}/game/${gameId}/chunk/${chunkPos.x}/${chunkPos.y}`) .then((data) => data.json()) .then((chunk) => { chunksToInsert.push(chunk.Ok); + fetchingChunk.delete(chunkPos.x + "," + chunkPos.y); }); }; @@ -165,6 +158,40 @@ export async function serverRunner(gameId: string) { // add sandbox const sandbox = new SandBoxGScript(1, chunkRequester); + + // Load initial chunks + const chunksAroundPlayer = sandbox.get_chunks_around_player( + entities.get_entity_by_id_clone(myUid)!.as_player().pos + ); + console.log("Chunks around player", chunksAroundPlayer); + for (const chunkPos of chunksAroundPlayer) { + getChunk(chunkPos); + } + + // load all the first chunks + while (fetchingChunk.size > 0 || chunksToInsert.length > 0) { + const chunkToInsert = chunksToInsert.pop(); + if (chunkToInsert) { + console.log("Inserting initial chunk", chunkToInsert); + const chunk = deserializeChunk(chunkToInsert); + game.schedule_chunk_insert_wasm(chunk); + } + await new Promise((resolve) => setTimeout(resolve, 100)); + } + + console.log("Initial chunks loaded"); + + game.update(); + canvasGameScript.update(); + + console.log("Game Updated"); + + console.log("Setting game entities"); + + game.entities = entities; + + console.log("Game entities", game.entities.to_js()); + game.add_sandbox_wasm(sandbox); const gameLoop = async () => { @@ -177,6 +204,7 @@ export async function serverRunner(gameId: string) { game.update(); playerController.update(); canvasGameScript.update(); + hudRender.update(0); canvasGameScript.renderLoop(0); }; diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index 97dd7a8..fb30ffc 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -115,6 +115,7 @@ export class ClientDbGamesService { [ClientDbGamesService.WORLDS_OBS], "readwrite" ); + console.log("Entities", data.game.entities.to_js()); const serializedGame = { gameId: data.game.id, name: data.game.name, diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index 3e0ac39..dfc0730 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -57,6 +57,23 @@ export const serializedGameToGame = (serializedGame: ISerializedGame): Game => { return game; }; +export const getEntities = (game: Game) => { + const entities = game.entities.to_js(); + // convert all the maps to objects + const newEntities = entities.entities.map((entity: any) => { + const components = entity.components.map((component: any) => { + const componentKey = component[0]; + let componentValue = component[1]; + if (componentValue instanceof Map) { + componentValue = Object.fromEntries(componentValue); + } + return [componentKey, componentValue]; + }); + return { ...entity, components }; + }); + return { entities: newEntities }; +}; + export const deserializeChunk = (chunk: ISerializedChunk): Chunk => { return Chunk.deserialize(chunk); }; diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index a214ad1..b6d2a9f 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/camera.ts","./src/wrappers.ts","./src/game-script.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[47,49,50,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"9a0ff1d6f6abddb3ad1e02a9fc2e592b6945481897644100b6ffeeb36ca0fd3b","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"2190af24cd8970497490c683989e0519fb8c15489edda3df05dc3c5e8c95bf13","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"6bd6ac836e29cdf9e234a7b13bb29148368bc3db2dad670abfbacb36288ec44f","signature":"3dad19a4fc83af787922cc0023a887f0ec4abdae44ad3e2e5c9b02125d68a50f","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"bd1fef4442cc97cad909bd08e37c0afa728c3c9ac286e39b7ff3068bd09101d0","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"322f723495a7a0a8eb726f5b130ba65257b71b21be66dfacf21bdb4bc9077a55","signature":"6382ca8397ca3146b4551e1f2dc37d871eb021c72482460422503a4d0f504a03","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[51,2],[49,3],[53,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/socket-types.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/camera.ts","./src/wrappers.ts","./src/game-script.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[47,49,50,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc4c38b7c60b1398b3c2f497cdf85e273ea3edc0b6158e54adef045c26530f82","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"2190af24cd8970497490c683989e0519fb8c15489edda3df05dc3c5e8c95bf13","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"d9f7fd5df2102e70ba80021fc57b2092f4af0e13003346655d30ca80cf6296f1","signature":"89986a49089b9d6f4a5fb98b88e586e64d53ef20869471e1d530332ff39d778f","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"bd1fef4442cc97cad909bd08e37c0afa728c3c9ac286e39b7ff3068bd09101d0","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"322f723495a7a0a8eb726f5b130ba65257b71b21be66dfacf21bdb4bc9077a55","signature":"6382ca8397ca3146b4551e1f2dc37d871eb021c72482460422503a4d0f504a03","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[51,2],[49,3],[53,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/wrappers.d.ts","version":"5.8.3"} \ No newline at end of file diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index d89223b..c641202 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -1,9 +1,10 @@ +use crate::utils::js_log; + use super::entity_component::{Component, COMPONENT_REGISTRY}; use super::fireball::Fireball; use super::player::Player; use rand::Rng; -use serde::{de, ser::SerializeStruct, Deserializer}; -use serde::{Deserialize, Serialize, Serializer}; +use serde::{de, ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer}; use std::{any::TypeId, fmt::Debug}; use wasm_bindgen::prelude::*; @@ -31,9 +32,16 @@ impl Serialize for Entity { let comps: Vec<_> = self .components .iter() - .map(|c| serde_json::to_value(&(c.type_name(), c.to_json())).unwrap()) + .map(|c| { + let type_name = c.type_name(); + let value = c.to_json().to_string(); + + return (type_name, value); + }) .collect(); + js_log(&format!("Components: {:?}", comps)); + s.serialize_field("components", &comps)?; s.end() } @@ -45,7 +53,7 @@ impl<'de> Deserialize<'de> for Entity { struct EntityHelper { id: EntityId, name: String, - components: Vec, + components: Vec<(String, String)>, } let EntityHelper { @@ -57,15 +65,15 @@ impl<'de> Deserialize<'de> for Entity { let registry = COMPONENT_REGISTRY.lock().unwrap(); for item in components { - let pair: (String, serde_json::Value) = - serde_json::from_value(item).map_err(de::Error::custom)?; - let (type_name, value) = pair; + let (type_name, value) = item; + + let parsed_value = serde_json::from_str(&value).map_err(de::Error::custom)?; let deser = registry .get(type_name.as_str()) .ok_or_else(|| de::Error::custom(format!("Unknown component: {}", type_name)))?; - entity.components.push(deser(value)); + entity.components.push(deser(parsed_value)); } Ok(entity) diff --git a/lib/world/src/entities/entity_action.rs b/lib/world/src/entities/entity_action.rs index e8048d7..49e86f7 100644 --- a/lib/world/src/entities/entity_action.rs +++ b/lib/world/src/entities/entity_action.rs @@ -1,13 +1,19 @@ use super::entities::Entities; use super::entity::{Entity, EntityId}; use super::game::GameSchedule; -use crate::entities::player_belt_script::UsePrimaryItemActionData; +use crate::entities::player_belt_script::{ + SecondaryBeltActionData, SelectItemActionData, UsePrimaryItemActionData, +}; +use crate::entities::player_jump_script::JumpActionData; use crate::entities::player_move_script::MoveActionData; use crate::entities::player_rot_script::RotateActionData; use crate::utils::js_log; use crate::world::World; +use lazy_static::lazy_static; use std::any::Any; +use std::collections::HashMap; use std::fmt::Debug; +use std::sync::Mutex; use wasm_bindgen::prelude::*; pub trait ActionData: Any + Debug { @@ -29,6 +35,54 @@ where } } +type ActionSerializer = Box JsValue + Send + Sync>; +type ActionDeserializer = Box EntityActionDto + Send + Sync>; + +lazy_static! { + pub static ref ACTION_REGISTRY: Mutex> = { + let mut map = HashMap::new(); + + fn register_action( + map: &mut HashMap<&'static str, (ActionSerializer, ActionDeserializer)>, + action_name: &'static str, + ) { + let serialize = Box::new(|dto: &EntityActionDto| -> JsValue { + let action_data = dto.get_data::().unwrap(); + let serialized_data = serde_wasm_bindgen::to_value(action_data).unwrap(); + + // Create a JS object with entity_id, name, and data + let obj = js_sys::Object::new(); + js_sys::Reflect::set(&obj, &"entity_id".into(), &dto.entity_id.into()).unwrap(); + js_sys::Reflect::set(&obj, &"name".into(), &dto.name.into()).unwrap(); + js_sys::Reflect::set(&obj, &"data".into(), &serialized_data).unwrap(); + obj.into() + }); + + let deserialize = Box::new(move |entity_id: EntityId, value: JsValue| -> EntityActionDto { + js_log(&format!("Deserializing action id: {:?} data: {:?}", entity_id, value)); + let typed_action: T = serde_wasm_bindgen::from_value(value).unwrap(); + EntityActionDto { + entity_id, + name: action_name, + data: Box::new(typed_action), + } + }); + + map.insert(action_name, (serialize, deserialize)); + } + + // Register all actions in one place! + register_action::(&mut map, "Player-Rotate"); + register_action::(&mut map, "Move"); + register_action::(&mut map, "UseItemAction"); + register_action::(&mut map, "SecondaryBeltAction"); + register_action::(&mut map, "SelectItemAction"); + register_action::(&mut map, "Jump-Action"); + + Mutex::new(map) + }; +} + #[wasm_bindgen(getter_with_clone)] #[derive(Debug)] pub struct EntityActionDto { @@ -50,6 +104,44 @@ impl EntityActionDto { pub fn get_name(&self) -> String { self.name.to_string() } + + pub fn to_js(&self) -> JsValue { + let registry = ACTION_REGISTRY + .lock() + .expect("Failed to lock action registry"); + let (serializer, _) = registry.get(self.name).unwrap_or_else(|| { + panic!("Action type '{}' not found in registry", self.name); + }); + serializer(self) + } + + pub fn from_js(js_value: JsValue) -> EntityActionDto { + let obj = js_sys::Object::from(js_value); + + // Extract fields from the JS object + let entity_id: EntityId = js_sys::Reflect::get(&obj, &"entity_id".into()) + .unwrap() + .as_f64() + .unwrap() as u32; + + let name: String = js_sys::Reflect::get(&obj, &"name".into()) + .unwrap() + .as_string() + .unwrap(); + + let data = js_sys::Reflect::get(&obj, &"data".into()).unwrap(); + + js_log(&format!("Deserializing action: {:?}", name)); + + let registry = ACTION_REGISTRY + .lock() + .expect("Failed to lock action registry"); + let (_, deserializer) = registry.get(name.as_str()).unwrap_or_else(|| { + panic!("Action type '{}' not found in registry", name); + }); + + deserializer(entity_id, data) + } } pub trait EntityActionHandler { @@ -123,63 +215,3 @@ impl EntityActionHolder { schedule } } - -#[wasm_bindgen] -struct EntityActionJson { - entity_id: EntityId, - name: String, - data: JsValue, -} - -#[wasm_bindgen] -impl EntityActionJson { - pub fn from_entity_action_dto(dto: &EntityActionDto) -> JsValue { - match dto.name { - "Player-Rotate" => { - let data = dto.get_data::().unwrap(); - serde_wasm_bindgen::to_value(&data).unwrap() - } - "Move" => { - let data = dto.get_data::().unwrap(); - serde_wasm_bindgen::to_value(&data).unwrap() - } - "UseItemAction" => { - let data = dto.get_data::().unwrap(); - serde_wasm_bindgen::to_value(&data).unwrap() - } - _ => JsValue::null(), - } - } - - pub fn deserialize_wasm(entity_id: EntityId, name: String, data: JsValue) -> EntityActionDto { - js_log(&format!("Deserializing action: {:?}", name)); - match name.as_str() { - "Player-Rotate" => { - let data = serde_wasm_bindgen::from_value::(data).unwrap(); - EntityActionDto { - entity_id, - name: "Player-Rotate", - data: Box::new(data), - } - } - "Move" => { - let data = serde_wasm_bindgen::from_value::(data).unwrap(); - EntityActionDto { - entity_id, - name: "Move", - data: Box::new(data), - } - } - "UseItemAction" => { - let data = - serde_wasm_bindgen::from_value::(data).unwrap(); - EntityActionDto { - entity_id, - name: "UseItemAction", - data: Box::new(data), - } - } - _ => panic!("Unknown action: {}", name), - } - } -} diff --git a/lib/world/src/entities/entity_component.rs b/lib/world/src/entities/entity_component.rs index a2368ad..6a59ede 100644 --- a/lib/world/src/entities/entity_component.rs +++ b/lib/world/src/entities/entity_component.rs @@ -1,4 +1,5 @@ use lazy_static::lazy_static; +use serde::Serializer; use serde_json::Value; use std::{any::Any, collections::HashMap, fmt::Debug, sync::Mutex}; use wasm_bindgen::JsValue; @@ -8,8 +9,8 @@ use crate::{ fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity, world_pos::WorldPos, }, entities::{ - player_belt_script::Belt, player_gravity_script::GravityData, player_jump_script::JumpData, - player_move_script::MovingDirection, velocity_script::Forces, + player::Health, player_belt_script::Belt, player_gravity_script::GravityData, + player_jump_script::JumpData, player_move_script::MovingDirection, velocity_script::Forces, }, geometry::rotation::SphericalRotation, }; @@ -88,19 +89,8 @@ lazy_static! { register::(&mut map); register::(&mut map); register::(&mut map); + register::(&mut map); Mutex::new(map) }; } - -fn deserialize_component(type_name: &str, data: &Value) -> Box { - let registry = COMPONENT_REGISTRY - .lock() - .expect("Failed to lock component registry"); - - let deser = registry.get(type_name).unwrap_or_else(|| { - panic!("Component type '{}' not found in registry", type_name); - }); - - deser(data.clone()) -} diff --git a/lib/world/src/entities/player_belt_script.rs b/lib/world/src/entities/player_belt_script.rs index 2b26d2b..ed30c61 100644 --- a/lib/world/src/entities/player_belt_script.rs +++ b/lib/world/src/entities/player_belt_script.rs @@ -113,7 +113,7 @@ impl SecondaryBeltAction { } #[wasm_bindgen] -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Default, Serialize, Deserialize)] pub struct SecondaryBeltActionData {} impl EntityActionDtoMaker for SecondaryBeltAction { @@ -169,7 +169,7 @@ impl SelectItemAction { } #[wasm_bindgen] -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Default, Serialize, Deserialize)] pub struct SelectItemActionData { pub item_index: usize, } diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/entities/player_jump_script.rs index 9b5aa56..be7e2b0 100644 --- a/lib/world/src/entities/player_jump_script.rs +++ b/lib/world/src/entities/player_jump_script.rs @@ -11,7 +11,7 @@ use crate::{ }; use wasm_bindgen::prelude::wasm_bindgen; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize, Deserialize)] pub struct JumpActionData {} #[derive(Clone, Debug, Default)] diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index fe781e1..36a3417 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -20,8 +20,9 @@ pub struct SandBoxGScript { // pub terrain_gen: TerrainGenerator, } +#[wasm_bindgen] impl SandBoxGScript { - fn get_chunks_around_player(&self, pos: &FineWorldPos) -> Vec { + pub fn get_chunks_around_player(&self, pos: &FineWorldPos) -> Vec { let mut poses = vec![]; let player_chunk_pos: ChunkPos = pos.to_world_pos().to_chunk_pos(); From 70647122327ab418b8c9d39bff784b813a0f6b36 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Wed, 4 Jun 2025 00:39:45 -0700 Subject: [PATCH 38/61] faster chunk insertion --- DEVLOG.md | 14 + .../src/game-scripts/canvas-gscript.ts | 41 +- apps/web-client/src/runner.ts | 68 ++- lib/engine/src/wrappers.ts | 5 - lib/world/Cargo.toml | 3 +- lib/world/examples/profile_test.rs | 23 + lib/world/flamegraph.svg | 491 ++++++++++++++++++ lib/world/src/block.rs | 259 +++++---- lib/world/src/chunk.rs | 18 + lib/world/src/entities/game.rs | 75 ++- lib/world/src/entities/game_script.rs | 34 +- lib/world/src/entities/sandbox.rs | 4 +- lib/world/src/world/mod.rs | 30 +- lib/world/src/world/world_block.rs | 38 +- lib/world/src/world/world_chunk.rs | 45 +- lib/world/src/world/world_mesh.rs | 44 +- 16 files changed, 953 insertions(+), 239 deletions(-) create mode 100644 lib/world/examples/profile_test.rs create mode 100644 lib/world/flamegraph.svg diff --git a/DEVLOG.md b/DEVLOG.md index fab8656..3872ece 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,3 +1,17 @@ +# 06_03_25 + +I've worked more on optimizing the chunk insertion code. The release build of the app is much faster now and I'm happy with it. + +I broke up the game updating code into a bunch of functions that I can run seperately and that is nice. + +# 06_02_25 + +I got the server working again. I want to fix chunk loading now, the chunks around me load in such a strange way, I can walk up to chunks and not have them load and I don't know why. + +I've been profiling the code that inserts chunks, it isn't as optimal as it coudl be, but when I build in release mode it is pretty fast still on my computer when I have a full world generation. I think I shoudl maybe optimize the chunk insertion code a little bit still. + +Okay, I brought the chunk insertion time down from around 30ms to 12ms. The biggest thing was removing hash maps and using arrays instead. I hate how slow rust hashmaps are. + # 05_27_25 I reworked the entity serialiaztion yesterday and I'm so happy with it now. Now I'm working on adding the fireballs back. They are working but they don't destory anything yet, I need to make them destroy blocks and hurt players. diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index 8e0f436..ea9913b 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -1,6 +1,5 @@ import { Camera, - GameDiffWrapper, GameScript, GameWrapper, makeCameraForPlayer, @@ -54,6 +53,9 @@ export class CanvasGameScript extends GameScript { gameWrapper: GameWrapper = new GameWrapper(this.game); + updatedChunks: Set = new Set(); + updatedEntities: Set = new Set(); + constructor( game: Game, private webGlGScript: WebGlGScript, @@ -75,12 +77,24 @@ export class CanvasGameScript extends GameScript { // Create renderers for initial chunks for (const chunkId of this.gameWrapper.getLoadedChunkIds()) { - this.onChunkUpdate(chunkId); + this.createChunkRender(chunkId); } this.isSpectating = false; } + // This is called by the rust side when a chunk is updated + onChunkUpdate(chunkId: number): void { + console.log("CanvasGameScript: onChunkUpdate", chunkId); + this.updatedChunks.add(chunkId); + } + + // This is called by the rust side when an entity is updated + onEntityUpdate(entityId: number): void { + console.log("CanvasGameScript: onEntityUpdate", entityId); + this.updatedEntities.add(entityId); + } + getCamera(): Camera { const player = this.gameWrapper.getPlayer(this.mainPlayerId); if (this.webGlGScript.isXr) { @@ -96,18 +110,8 @@ export class CanvasGameScript extends GameScript { } } - private lastDiff: GameDiffWrapper | null = null; - - onDiff(diff: GameDiffWrapper) { - this.lastDiff = diff; - } - update() { - if (!this.lastDiff) { - return; - } - - for (const entityId of this.lastDiff.updated_entities) { + for (const entityId of this.updatedEntities) { console.log("CanvasGameScript: Updating entity", entityId); const entity = this.gameWrapper.game.entities.get_entity_by_id_clone(entityId); @@ -119,11 +123,12 @@ export class CanvasGameScript extends GameScript { this.onNewEntity(entity); } - for (const chunkId of this.lastDiff.updated_chunks) { - this.onChunkUpdate(chunkId); + for (const chunkId of this.updatedChunks) { + this.createChunkRender(chunkId); } - this.lastDiff = null; + this.updatedChunks.clear(); + this.updatedEntities.clear(); } getFilter(camera: Camera): Vector3D { @@ -331,8 +336,8 @@ export class CanvasGameScript extends GameScript { this.entityRenderers.delete(entityId); } - onChunkUpdate(chunkId: number): void { - console.log("CanvasGameScript: Updating chunk", chunkId); + createChunkRender(chunkId: number): void { + console.log("CanvasGameScript: Creating chunk render", chunkId); const chunkPos = this.gameWrapper.getChunkPosFromChunkId(chunkId); const chunkMesh = this.gameWrapper.getChunkMeshFromChunkPos(chunkId); const chunkRenderer = new ChunkRenderer( diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 66c2c71..41ee2c2 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -15,21 +15,35 @@ import { ClientDbGamesService } from "./services/sp-games-service"; import { HudGScript } from "./game-scripts/hudRender"; export class SinglePlayerTerrainChunkGetter { - private chunks_to_insert: Chunk[] = []; public terrianGen: TerrainGenerator; + private chunks_to_insert: [{ x: number; y: number }, Chunk][] = []; + private fetched_chunks: [{ x: number; y: number }][] = []; constructor(private game: GameWrapper) { - this.terrianGen = new TerrainGenerator(0, true, false); + this.terrianGen = new TerrainGenerator(0, false, false); } getChunk(chunkPos: { x: number; y: number }) { + const existingChunk = this.chunks_to_insert.find( + (c) => c[0].x === chunkPos.x && c[0].y === chunkPos.y + ); + const existingFetchedChunk = this.fetched_chunks.find( + (c) => c[0].x === chunkPos.x && c[0].y === chunkPos.y + ); + if (existingChunk || existingFetchedChunk) { + console.log("Chunk already exists in chunks_to_insert or fetched_chunks"); + return; + } + console.log("Getting chunk", chunkPos); const chunk = this.terrianGen.get_chunk(chunkPos.x, chunkPos.y); - this.chunks_to_insert.push(chunk); + this.chunks_to_insert.push([chunkPos, chunk]); + return chunk; } update() { for (const chunk of this.chunks_to_insert) { - this.game.game.schedule_chunk_insert_wasm(chunk); + this.game.game.schedule_chunk_insert_wasm(chunk[1]); + this.fetched_chunks.push([chunk[0]]); } this.chunks_to_insert = []; } @@ -40,6 +54,16 @@ export class SinglePlayerTerrainChunkGetter { } export const spGameService = await ClientDbGamesService.factory(); + +export const DEFAULT_CONFIG = { + loadDistance: 2, + renderDistance: 10, + fovFactor: 0.5, + chunkSize: 16, + seed: 0, + flatWorld: true, +}; + export async function run(id?: string) { console.log("Starting game", id); @@ -57,7 +81,7 @@ export async function run(id?: string) { const chunkGetter = new SinglePlayerTerrainChunkGetter(game); // add sandbox - const sandbox = new SandBoxGScript(1, chunkGetter.getWasmRequestChunk()); + const sandbox = new SandBoxGScript(2, chunkGetter.getWasmRequestChunk()); const serializedSandbox = sandbox.serialize(); game.game.add_sandbox_wasm(sandbox); @@ -114,16 +138,42 @@ export async function run(id?: string) { } })(); - const update = () => { - game.game.update(); + async function task() { + await new Promise((resolve) => setTimeout(resolve, 0)); + } + + const update = async () => { + const start = performance.now(); + game.game.handle_actions(); + game.game.run_scripts(); + await task(); + game.game.add_new_entities(); + await task(); + game.game.remove_entities(); + await task(); + game.game.add_single_chunk(); + await task(); + game.game.add_blocks(); + await task(); + game.game.remove_blocks(); + await task(); + chunkGetter.update(); + await task(); playerController.update(); + await task(); canvasGameScript.update(); + await task(); hudRender.update(0); - chunkGetter.update(); + await task(); canvasGameScript.renderLoop(0); + const end = performance.now(); + if (end - start > 50) { + console.log("Large update happened. Time: ", end - start); + } + requestAnimationFrame(update); }; - setInterval(update, 1000 / 60); + requestAnimationFrame(update); // setInterval(async () => { // console.log("Saving game"); diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index dfc0730..d06dc57 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -118,11 +118,6 @@ export type ISerializedVisibleFaces = Array<{ faces: [boolean, boolean, boolean, boolean, boolean, boolean]; }>; -export type GameDiffWrapper = { - updated_entities: number[]; - updated_chunks: number[]; -}; - export type Cube = { type: BlockType; pos: Vector3D; diff --git a/lib/world/Cargo.toml b/lib/world/Cargo.toml index 857079f..ec81656 100644 --- a/lib/world/Cargo.toml +++ b/lib/world/Cargo.toml @@ -31,8 +31,9 @@ noise = "0.8.2" rand = { version = "0.8.5" } rand_distr = "0.4.3" getrandom = { version = "0.2", features = ["js"] } -typetag = "0.2" uuid = { version = "1.16.0", features = ["v4", "js"] } +rustc-hash = { version = "2.1"} + # The `console_error_panic_hook` crate provides better debugging of panics by diff --git a/lib/world/examples/profile_test.rs b/lib/world/examples/profile_test.rs new file mode 100644 index 0000000..1638aaf --- /dev/null +++ b/lib/world/examples/profile_test.rs @@ -0,0 +1,23 @@ +use std::time::{Duration, Instant}; +use world::{entities::terrain_gen::TerrainGenerator, positions::ChunkPos, world::World}; + +fn main() { + // This reproduces the profile_chunk_insertion test as a standalone example + let terrain_gen = TerrainGenerator::new(0, false, false); + + let mut times = Vec::new(); + for _i in 0..500 { + let start_time = Instant::now(); + let mut world = World::default(); + let chunk_pos = ChunkPos::new(0, 0); + let chunk = terrain_gen.get_chunk(chunk_pos.x, chunk_pos.y); + world.insert_chunk(chunk); + times.push(start_time.elapsed()); + } + + println!( + "Average time: {:?}", + times.iter().sum::() / times.len() as u32 + ); + println!("Max time: {:?}", times.iter().max().unwrap()); +} diff --git a/lib/world/flamegraph.svg b/lib/world/flamegraph.svg new file mode 100644 index 0000000..5b61cac --- /dev/null +++ b/lib/world/flamegraph.svg @@ -0,0 +1,491 @@ +Flame Graph Reset ZoomSearch <usize as core::slice::index::SliceIndex<[T]>>::get_unchecked::precondition_check (1,328,969 samples, 10.59%)<usize as core:..[unknown] (501,504 samples, 4.00%)[unk..profile_test::main (2,342,934 samples, 18.67%)profile_test::mainworld::entities::terrain_gen::TerrainGenerator::get_chunk (2,342,934 samples, 18.67%)world::entities::terrain_gen:..world::entities::terrain_gen::BasicChunkGetter::get_chunk (2,342,934 samples, 18.67%)world::entities::terrain_gen:..world::entities::terrain_gen::TreeRandomSpreadGenerator::get_trees (1,149,336 samples, 9.16%)world::entiti..world::entities::terrain_gen::TreeRandomSpreadGenerator::get_tree_locations (1,149,336 samples, 9.16%)world::entiti..world::entities::terrain_gen::TreeRandomSpreadGenerator::get_potential_tree_locations (1,149,336 samples, 9.16%)world::entiti..rand_core::SeedableRng::seed_from_u64 (647,832 samples, 5.16%)rand_c..<rand::rngs::std::StdRng as rand_core::SeedableRng>::from_seed (647,832 samples, 5.16%)<rand:..<rand_chacha::chacha::ChaCha12Rng as rand_core::SeedableRng>::from_seed (647,832 samples, 5.16%)<rand_..<rand_chacha::chacha::ChaCha12Core as rand_core::SeedableRng>::from_seed (647,832 samples, 5.16%)<rand_..rand_chacha::guts::ChaCha::new (647,832 samples, 5.16%)rand_c..rand_chacha::guts::init_chacha (647,832 samples, 5.16%)rand_c..rand_chacha::guts::init_chacha::impl_avx (647,832 samples, 5.16%)rand_c..rand_chacha::guts::init_chacha::fn_impl (647,832 samples, 5.16%)rand_c..core::slice::index::<impl core::ops::index::Index<I> for [T]>::index (647,832 samples, 5.16%)core::..<core::ops::range::Range<usize> as core::slice::index::SliceIndex<[T]>>::index (647,832 samples, 5.16%)<core:..<core::ops::range::Range<usize> as core::slice::index::SliceIndex<[T]>>::get_unchecked (647,832 samples, 5.16%)<core:..world::entities::terrain_gen::BasicChunkGetter::get_chunk (934,706 samples, 7.45%)world::ent..world::entities::terrain_gen::TreeRandomSpreadGenerator::get_trees (934,706 samples, 7.45%)world::ent..world::entities::terrain_gen::TreeRandomSpreadGenerator::get_tree_locations (934,706 samples, 7.45%)world::ent..world::entities::terrain_gen::TreeRandomSpreadGenerator::get_potential_tree_locations (934,706 samples, 7.45%)world::ent..core::iter::traits::iterator::Iterator::collect (934,706 samples, 7.45%)core::iter..<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (934,706 samples, 7.45%)<alloc::ve..<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (934,706 samples, 7.45%)<alloc::ve..<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (934,706 samples, 7.45%)<alloc::ve..<core::iter::adapters::take::Take<I> as core::iter::traits::iterator::Iterator>::next (934,706 samples, 7.45%)<core::ite..<rand::distributions::distribution::DistIter<D,R,T> as core::iter::traits::iterator::Iterator>::next (934,706 samples, 7.45%)<rand::dis..<rand::distributions::uniform::Uniform<X> as rand::distributions::distribution::Distribution<X>>::sample (934,706 samples, 7.45%)<rand::dis..<rand::distributions::uniform::UniformInt<u16> as rand::distributions::uniform::UniformSampler>::sample (934,706 samples, 7.45%)<rand::dis..rand::rng::Rng::gen (934,706 samples, 7.45%)rand::rng:..rand::distributions::integer::<impl rand::distributions::distribution::Distribution<u32> for rand::distributions::Standard>::sample (934,706 samples, 7.45%)rand::dist..<&mut R as rand_core::RngCore>::next_u32 (934,706 samples, 7.45%)<&mut R as..<rand::rngs::std::StdRng as rand_core::RngCore>::next_u32 (934,706 samples, 7.45%)<rand::rng..<rand_chacha::chacha::ChaCha12Rng as rand_core::RngCore>::next_u32 (934,706 samples, 7.45%)<rand_chac..<rand_core::block::BlockRng<R> as rand_core::RngCore>::next_u32 (934,706 samples, 7.45%)<rand_core..rand_core::block::BlockRng<R>::generate_and_set (934,706 samples, 7.45%)rand_core:..<rand_chacha::chacha::ChaCha12Core as rand_core::block::BlockRngCore>::generate (934,706 samples, 7.45%)<rand_chac..rand_chacha::guts::ChaCha::refill4 (934,706 samples, 7.45%)rand_chach..rand_chacha::guts::refill_wide (934,706 samples, 7.45%)rand_chach..rand_chacha::guts::refill_wide::impl_avx2 (934,706 samples, 7.45%)rand_chach..rand_chacha::guts::refill_wide::fn_impl (934,706 samples, 7.45%)rand_chach..rand_chacha::guts::refill_wide_impl (934,706 samples, 7.45%)rand_chach..rand_chacha::guts::round (934,706 samples, 7.45%)rand_chach..<ppv_lite86::soft::x2<W,G> as ppv_lite86::types::RotateEachWord32>::rotate_each_word_right16 (934,706 samples, 7.45%)<ppv_lite8..<ppv_lite86::x86_64::sse2::avx2::u32x4x2_avx2<NI> as ppv_lite86::types::RotateEachWord32>::rotate_each_word_right16 (934,706 samples, 7.45%)<ppv_lite8..core::core_arch::x86::avx2::_mm256_shuffle_epi8 (934,706 samples, 7.45%)core::core..core::ptr::drop_in_place<alloc::vec::into_iter::IntoIter<world::direction::Direction>> (501,504 samples, 4.00%)core..<alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop (501,504 samples, 4.00%)<all..alloc::vec::into_iter::IntoIter<T,A>::as_raw_mut_slice (501,504 samples, 4.00%)allo..<&mut I as core::iter::traits::exact_size::ExactSizeIterator>::len (501,504 samples, 4.00%)<&mu..core::iter::traits::exact_size::ExactSizeIterator::len (501,504 samples, 4.00%)core..<alloc::vec::into_iter::IntoIter<T,A> as core::iter::traits::iterator::Iterator>::size_hint (501,504 samples, 4.00%)<all..world::chunk::Chunk::get_all_world_blocks_and_dirty (1,596,300 samples, 12.72%)world::chunk::Chunk..world::chunk::Chunk::get_all_world_blocks (1,596,300 samples, 12.72%)world::chunk::Chunk..core::iter::traits::iterator::Iterator::collect (1,596,300 samples, 12.72%)core::iter::traits:..<alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter (1,596,300 samples, 12.72%)<alloc::vec::Vec<T>..<alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1,596,300 samples, 12.72%)<alloc::vec::Vec<T>..<alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter (1,596,300 samples, 12.72%)<alloc::vec::Vec<T>..<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1,596,300 samples, 12.72%)<alloc::vec::Vec<T,..alloc::vec::Vec<T,A>::extend_desugared (1,596,300 samples, 12.72%)alloc::vec::Vec<T,A..<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1,596,300 samples, 12.72%)<core::iter::adapte..<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (1,596,300 samples, 12.72%)<core::iter::adapte..core::iter::traits::iterator::Iterator::find (1,596,300 samples, 12.72%)core::iter::traits:..<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::try_fold (1,596,300 samples, 12.72%)<core::iter::adapte..core::iter::traits::iterator::Iterator::try_fold (1,596,300 samples, 12.72%)core::iter::traits:..<core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::try_fold::enumerate::_{{closure}} (1,596,300 samples, 12.72%)<core::iter::adapte..core::iter::traits::iterator::Iterator::find::check::_{{closure}} (1,596,300 samples, 12.72%)core::iter::traits:..core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (1,596,300 samples, 12.72%)core::ops::function..world::chunk::Chunk::get_all_world_blocks::_{{closure}} (1,596,300 samples, 12.72%)world::chunk::Chunk..<std::hash::random::DefaultHasher as core::hash::Hasher>::finish (623,223 samples, 4.97%)<std::..<core::hash::sip::SipHasher13 as core::hash::Hasher>::finish (623,223 samples, 4.97%)<core:..<core::hash::sip::Hasher<S> as core::hash::Hasher>::finish (623,223 samples, 4.97%)<core:..<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (623,223 samples, 4.97%)<core:..core::num::<impl u64>::rotate_left (623,223 samples, 4.97%)core::..world::chunk::chunk_mesh::ChunkMesh::insert (1,611,330 samples, 12.84%)world::chunk::chunk..std::collections::hash::map::HashMap<K,V,S>::insert (1,611,330 samples, 12.84%)std::collections::h..hashbrown::map::HashMap<K,V,S,A>::insert (1,611,330 samples, 12.84%)hashbrown::map::Has..hashbrown::map::make_hash (1,611,330 samples, 12.84%)hashbrown::map::mak..core::hash::BuildHasher::hash_one (1,611,330 samples, 12.84%)core::hash::BuildHa..core::hash::impls::<impl core::hash::Hash for &T>::hash (988,107 samples, 7.88%)core::hash:..core::hash::impls::<impl core::hash::Hash for usize>::hash (988,107 samples, 7.88%)core::hash:..core::hash::Hasher::write_usize (988,107 samples, 7.88%)core::hash:..<std::hash::random::DefaultHasher as core::hash::Hasher>::write (988,107 samples, 7.88%)<std::hash:..<core::hash::sip::SipHasher13 as core::hash::Hasher>::write (988,107 samples, 7.88%)<core::hash..<core::hash::sip::Hasher<S> as core::hash::Hasher>::write (988,107 samples, 7.88%)<core::hash..<core::hash::sip::Sip13Rounds as core::hash::sip::Sip>::c_rounds (988,107 samples, 7.88%)<core::hash..world::components::world_pos::WorldPos::to_inner_chunk_pos (1,502,184 samples, 11.97%)world::components:..world::direction::DirectionVectorExtension::move_direction (478,570 samples, 3.81%)worl..world::vec::Vector3Ops::copy (478,570 samples, 3.81%)worl..all (12,546,611 samples, 100%)profile_test (12,546,611 samples, 100.00%)profile_testworld::world::world_chunk::<impl world::world::World>::insert_chunk (7,438,498 samples, 59.29%)world::world::world_chunk::<impl world::world::World>::insert_chunkworld::world::world_mesh::<impl world::world::World>::update_chunk_mesh (7,438,498 samples, 59.29%)world::world::world_mesh::<impl world::world::World>::update_chunk_meshworld::world::world_block::WorldBlock::get_visible_faces (1,247,106 samples, 9.94%)world::world::..core::iter::traits::iterator::Iterator::collect (1,247,106 samples, 9.94%)core::iter::tr..<world::direction::Directions as core::iter::traits::collect::FromIterator<world::direction::Direction>>::from_iter (1,247,106 samples, 9.94%)<world::direct..<core::iter::adapters::filter::Filter<I,P> as core::iter::traits::iterator::Iterator>::next (1,247,106 samples, 9.94%)<core::iter::a..core::iter::traits::iterator::Iterator::find (1,247,106 samples, 9.94%)core::iter::tr..core::iter::traits::iterator::Iterator::try_fold (1,247,106 samples, 9.94%)core::iter::tr..core::iter::traits::iterator::Iterator::find::check::_{{closure}} (501,504 samples, 4.00%)core..core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut (501,504 samples, 4.00%)core..world::world::world_block::WorldBlock::get_visible_faces::_{{closure}} (501,504 samples, 4.00%)worl..world::world::AdjacentBlocks::get_for_direction (501,504 samples, 4.00%)worl.. \ No newline at end of file diff --git a/lib/world/src/block.rs b/lib/world/src/block.rs index b914a10..568290d 100644 --- a/lib/world/src/block.rs +++ b/lib/world/src/block.rs @@ -3,10 +3,8 @@ use crate::{ positions::{ChunkPos, InnerChunkPos}, world::world_block::WorldBlock, }; -use lazy_static::lazy_static; use serde::{Deserialize, Serialize}; use serde_repr::{Deserialize_repr, Serialize_repr}; -use std::collections::HashMap; use wasm_bindgen::prelude::*; #[wasm_bindgen] @@ -102,153 +100,130 @@ impl Default for &BlockMetaData { impl BlockMetaData { pub fn get_for_type(block_type: BlockType) -> &'static BlockMetaData { - BLOCK_DATA.get(&block_type).unwrap_or_default() + let index = block_type as usize; + if index < BLOCK_DATA.len() { + &BLOCK_DATA[index] + } else { + &DEFAULT_BLOCK_DATA + } } } #[wasm_bindgen] impl BlockMetaData { pub fn get_for_type_wasm(block_type: BlockType) -> Option { - BLOCK_DATA.get(&block_type).copied() + let index = block_type as usize; + if index < BLOCK_DATA.len() { + Some(BLOCK_DATA[index]) + } else { + None + } } } -lazy_static! { - static ref BLOCK_DATA: HashMap = { - let mut map: HashMap = HashMap::new(); - map.insert( - BlockType::Void, - BlockMetaData { - gravitable: false, - intangible: true, - shape: BlockShape::Cube, - transparent: true, - fluid: false, - }, - ); - map.insert( - BlockType::Stone, - BlockMetaData { - gravitable: false, - intangible: false, - shape: BlockShape::Cube, - transparent: false, - fluid: false, - }, - ); - map.insert( - BlockType::Image, - BlockMetaData { - gravitable: false, - intangible: false, - shape: BlockShape::Flat, - transparent: true, - fluid: false, - }, - ); - map.insert( - BlockType::Grass, - BlockMetaData { - gravitable: false, - intangible: false, - shape: BlockShape::Cube, - transparent: false, - fluid: false, - }, - ); - map.insert( - BlockType::Wood, - BlockMetaData { - gravitable: false, - intangible: false, - shape: BlockShape::Cube, - fluid: false, - transparent: false, - }, - ); - map.insert( - BlockType::Leaf, - BlockMetaData { - gravitable: false, - intangible: false, - fluid: false, - shape: BlockShape::Cube, - transparent: true, - }, - ); - map.insert( - BlockType::Cloud, - BlockMetaData { - gravitable: false, - intangible: false, - fluid: false, - shape: BlockShape::Cube, - transparent: false, - }, - ); - map.insert( - BlockType::Gold, - BlockMetaData { - gravitable: false, - intangible: false, - fluid: false, - shape: BlockShape::Cube, - transparent: false, - }, - ); - map.insert( - BlockType::RedFlower, - BlockMetaData { - gravitable: false, - intangible: false, - fluid: false, - shape: BlockShape::X, - transparent: true, - }, - ); - map.insert( - BlockType::Water, - BlockMetaData { - gravitable: false, - intangible: true, - fluid: true, - shape: BlockShape::Cube, - transparent: false, - }, - ); - map.insert( - BlockType::RedFlower, - BlockMetaData { - gravitable: false, - intangible: false, - fluid: false, - shape: BlockShape::X, - transparent: true, - }, - ); - - map.insert( - BlockType::Planks, - BlockMetaData { - gravitable: false, - intangible: false, - fluid: false, - shape: BlockShape::Cube, - transparent: false, - }, - ); - - map.insert( - BlockType::Red, - BlockMetaData { - gravitable: false, - intangible: false, - fluid: false, - shape: BlockShape::Cube, - transparent: false, - }, - ); +const DEFAULT_BLOCK_DATA: BlockMetaData = BlockMetaData { + gravitable: false, + intangible: false, + fluid: false, + shape: BlockShape::Cube, + transparent: false, +}; - map - }; -} +const BLOCK_DATA: [BlockMetaData; 12] = [ + // BlockType::Void = 0 + BlockMetaData { + gravitable: false, + intangible: true, + shape: BlockShape::Cube, + transparent: true, + fluid: false, + }, + // BlockType::Stone = 1 + BlockMetaData { + gravitable: false, + intangible: false, + shape: BlockShape::Cube, + transparent: false, + fluid: false, + }, + // BlockType::Wood = 2 + BlockMetaData { + gravitable: false, + intangible: false, + shape: BlockShape::Cube, + fluid: false, + transparent: false, + }, + // BlockType::Leaf = 3 + BlockMetaData { + gravitable: false, + intangible: false, + fluid: false, + shape: BlockShape::Cube, + transparent: true, + }, + // BlockType::Cloud = 4 + BlockMetaData { + gravitable: false, + intangible: false, + fluid: false, + shape: BlockShape::Cube, + transparent: false, + }, + // BlockType::Gold = 5 + BlockMetaData { + gravitable: false, + intangible: false, + fluid: false, + shape: BlockShape::Cube, + transparent: false, + }, + // BlockType::RedFlower = 6 + BlockMetaData { + gravitable: false, + intangible: false, + fluid: false, + shape: BlockShape::X, + transparent: true, + }, + // BlockType::Water = 7 + BlockMetaData { + gravitable: false, + intangible: true, + fluid: true, + shape: BlockShape::Cube, + transparent: false, + }, + // BlockType::Grass = 8 + BlockMetaData { + gravitable: false, + intangible: false, + shape: BlockShape::Cube, + transparent: false, + fluid: false, + }, + // BlockType::Image = 9 + BlockMetaData { + gravitable: false, + intangible: false, + shape: BlockShape::Flat, + transparent: true, + fluid: false, + }, + // BlockType::Planks = 10 + BlockMetaData { + gravitable: false, + intangible: false, + fluid: false, + shape: BlockShape::Cube, + transparent: false, + }, + // BlockType::Red = 11 + BlockMetaData { + gravitable: false, + intangible: false, + fluid: false, + shape: BlockShape::Cube, + transparent: false, + }, +]; diff --git a/lib/world/src/chunk.rs b/lib/world/src/chunk.rs index 1e8bbc9..24a0577 100644 --- a/lib/world/src/chunk.rs +++ b/lib/world/src/chunk.rs @@ -22,6 +22,7 @@ interface ITextStyle { pub type ChunkId = u64; pub const CHUNK_WIDTH: i16 = 16; + pub const CHUNK_HEIGHT: i16 = 64; const CHUNK_MEM_SIZE: usize = (CHUNK_HEIGHT * CHUNK_WIDTH * CHUNK_WIDTH) as usize; @@ -88,6 +89,15 @@ impl Chunk { .collect() } + pub fn get_all_world_blocks(&self) -> Vec { + self.blocks + .iter() + .enumerate() + .filter(|(_i, &b)| b != BlockType::Void) + .map(|(index, _block_type)| self.get_world_block_from_index(index)) + .collect() + } + /** * Returns dirty blocks plus all the visible blocks */ @@ -99,6 +109,14 @@ impl Chunk { .collect() } + pub fn get_all_world_blocks_and_dirty(&self) -> Vec { + self.dirty_blocks + .iter() + .map(|pos| self.get_world_block(pos)) + .chain(self.get_all_world_blocks().into_iter()) + .collect() + } + pub fn get_uuid(&self) -> u64 { self.position.to_id() } diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 1bf39b5..2785f20 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -88,15 +88,15 @@ impl Game { g } - pub fn update(&mut self) { - let world = &self.world; - // apply actions - + pub fn handle_actions(&mut self) { let schedule = self .action_holder .handle_actions(&self.world, &mut self.entities); self.schedule.combine(schedule); + } + pub fn run_scripts(&mut self) { + let world = &self.world; for script in self.scripts.get_scripts_mut() { let query = script.get_query(); let query_results = self.entities.query(&query); @@ -105,44 +105,77 @@ impl Game { self.schedule.combine(diff); } } + } - let game_diff = self.schedule.to_game_diff(); - - // Apply diff to game - // Add all new entities + pub fn add_new_entities(&mut self) { let new_ents = std::mem::take(&mut self.schedule.new_entities); + + // Tell the scripts about the new entities + self.scripts.iter_mut().for_each(|script| { + for entity in new_ents.iter() { + script.on_entity_update(entity.id); + } + }); + self.entities.get_all_mut().extend(new_ents); + self.schedule.new_entities.clear(); + } - // Remove entities + pub fn remove_entities(&mut self) { for entity_id in self.schedule.removed_entities.clone() { self.entities .get_all_mut() .retain(|entity| entity.id != entity_id); + + self.scripts.iter_mut().for_each(|script| { + script.on_entity_update(entity_id); + }); } + self.schedule.removed_entities.clear(); + } - // add chunks to world - let new_chunks = std::mem::take(&mut self.schedule.new_chunks); - for chunk in new_chunks { + pub fn add_single_chunk(&mut self) { + if let Some(chunk) = self.schedule.consume_single_chunk() { + let chunk_id = chunk.get_id(); self.world.insert_chunk(chunk); + self.scripts.iter_mut().for_each(|script| { + script.on_chunk_update(chunk_id); + }); } + } - // add blocks to world + pub fn add_blocks(&mut self) { let new_blocks = std::mem::take(&mut self.schedule.new_blocks); for block in new_blocks { self.world.add_block(&block).unwrap(); + self.scripts.iter_mut().for_each(|script| { + let chunk_id = block.world_pos.to_chunk_pos().to_id(); + script.on_chunk_update(chunk_id); + }); } + self.schedule.new_blocks.clear(); + } - // remove blocks from world + pub fn remove_blocks(&mut self) { let removed_blocks = std::mem::take(&mut self.schedule.removed_blocks); for block_pos in removed_blocks { self.world.remove_block(&block_pos).unwrap(); + self.scripts.iter_mut().for_each(|script| { + let chunk_id = block_pos.to_chunk_pos().to_id(); + script.on_chunk_update(chunk_id); + }); } + self.schedule.removed_blocks.clear(); + } - self.scripts.iter_mut().for_each(|script| { - script.on_diff(game_diff.clone()); - }); - - self.schedule.clear(); + pub fn update(&mut self) { + self.handle_actions(); + self.run_scripts(); + self.add_new_entities(); + self.remove_entities(); + self.add_single_chunk(); + self.add_blocks(); + self.remove_blocks(); } pub fn schedule_chunk_insert(&mut self, chunk: Chunk) { @@ -267,6 +300,10 @@ impl GameSchedule { self.removed_blocks.clear(); } + pub fn consume_single_chunk(&mut self) -> Option { + self.new_chunks.pop() + } + pub fn to_game_diff(&self) -> GameDiff { let mut updated_entities: Vec = self.new_entities.iter().map(|entity| entity.id).collect(); diff --git a/lib/world/src/entities/game_script.rs b/lib/world/src/entities/game_script.rs index 6ab60b5..d4be158 100644 --- a/lib/world/src/entities/game_script.rs +++ b/lib/world/src/entities/game_script.rs @@ -1,6 +1,7 @@ use super::entities::{EntityQuery, EntityQueryResults}; use super::entity::EntityId; use super::game::{GameDiff, GameSchedule}; +use crate::chunk::ChunkId; use crate::world::World; use std::any::Any; use std::fmt::Debug; @@ -20,7 +21,11 @@ pub trait GameScript: Any + Debug { EntityQuery::new() } - fn on_diff(&self, _diff: GameDiff) { + fn on_chunk_update(&self, _chunk_id: ChunkId) { + // Default implementation does nothing + } + + fn on_entity_update(&self, _entity_id: EntityId) { // Default implementation does nothing } } @@ -67,16 +72,21 @@ impl EntityScriptHolder { #[derive(Debug)] pub struct WasmGameScript { context: JsValue, - on_diff_jsfn: js_sys::Function, + on_chunk_update_jsfn: js_sys::Function, + on_entity_update_jsfn: js_sys::Function, } #[wasm_bindgen] impl WasmGameScript { #[wasm_bindgen(constructor)] pub fn make(val: JsValue) -> WasmGameScript { - let on_diff_jsfn = js_sys::Reflect::get(&val, &JsValue::from("onDiff")).unwrap(); + let on_chunk_update_jsfn = + js_sys::Reflect::get(&val, &JsValue::from("onChunkUpdate")).unwrap(); + let on_entity_update_jsfn = + js_sys::Reflect::get(&val, &JsValue::from("onEntityUpdate")).unwrap(); WasmGameScript { - on_diff_jsfn: on_diff_jsfn.into(), + on_chunk_update_jsfn: on_chunk_update_jsfn.into(), + on_entity_update_jsfn: on_entity_update_jsfn.into(), context: val, } } @@ -91,9 +101,17 @@ impl GameScript for WasmGameScript { None } - fn on_diff(&self, diff: GameDiff) -> () { - // console log diff - let val = serde_wasm_bindgen::to_value(&diff).unwrap(); - self.on_diff_jsfn.call1(&self.context, &val).unwrap(); + fn on_chunk_update(&self, chunk_id: ChunkId) { + let val = serde_wasm_bindgen::to_value(&chunk_id).unwrap(); + self.on_chunk_update_jsfn + .call1(&self.context, &val) + .unwrap(); + } + + fn on_entity_update(&self, entity_id: EntityId) { + let val = serde_wasm_bindgen::to_value(&entity_id).unwrap(); + self.on_entity_update_jsfn + .call1(&self.context, &val) + .unwrap(); } } diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index 36a3417..15c1351 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -27,8 +27,8 @@ impl SandBoxGScript { let player_chunk_pos: ChunkPos = pos.to_world_pos().to_chunk_pos(); - for i in -(self.load_distance as i16)..self.load_distance as i16 { - for j in -(self.load_distance as i16)..self.load_distance as i16 { + for i in -(self.load_distance as i16)..=self.load_distance as i16 { + for j in -(self.load_distance as i16)..=self.load_distance as i16 { let chunk_pos = player_chunk_pos + ChunkPos { x: i, y: j }; poses.push(chunk_pos); } diff --git a/lib/world/src/world/mod.rs b/lib/world/src/world/mod.rs index aef0b26..a31a290 100644 --- a/lib/world/src/world/mod.rs +++ b/lib/world/src/world/mod.rs @@ -4,6 +4,7 @@ use crate::chunk::Chunk; use crate::components::world_pos::WorldPos; use crate::direction::{Direction, DirectionVectorExtension, Directions}; use crate::positions::ChunkPos; +use rustc_hash::FxHashMap; use serde::{Deserialize, Serialize}; use std::collections::{HashMap, HashSet}; use std::{self, fmt}; @@ -45,6 +46,22 @@ impl fmt::Display for ChunkIndexOutOfBoundsError { } } +pub struct AdjacentBlocks { + pub data: [WorldBlock; 6], +} + +impl AdjacentBlocks { + pub fn new() -> Self { + Self { + data: [WorldBlock::empty(WorldPos { x: 0, y: 0, z: 0 }); 6], + } + } + + pub fn get_for_direction(&self, direction: Direction) -> &WorldBlock { + &self.data[direction.to_index()] + } +} + #[derive(Serialize, Deserialize)] pub struct WorldStateDiff { /** A list of chunk ids that were changed */ @@ -54,9 +71,9 @@ pub struct WorldStateDiff { #[derive(Default, Tsify, Serialize, Deserialize, Clone)] #[wasm_bindgen] pub struct World { - chunks: HashMap, + chunks: FxHashMap, // #[serde(skip)] - chunk_meshes: HashMap, + chunk_meshes: FxHashMap, } impl World { @@ -78,7 +95,6 @@ impl World { } /** Returns void block when the chunk isn't loaded */ - /** ERROR, this isn't consistent. Idk if this is still relevant */ pub fn get_block(&self, world_pos: &WorldPos) -> WorldBlock { let chunk = self.get_chunk(&world_pos.to_chunk_pos()); @@ -91,15 +107,15 @@ impl World { * Always return all directions. * The directions that point to no block will just default to void * */ - fn get_adjacent_blocks(&self, world_pos: &WorldPos) -> HashMap { - let mut adjacent_blocks = HashMap::new(); + fn get_adjacent_blocks(&self, world_pos: &WorldPos) -> AdjacentBlocks { + let mut adjacent_blocks = AdjacentBlocks::new(); for direction in Directions::all() { let adjacent_pos = world_pos.move_direction(&direction); if !adjacent_pos.is_valid() { continue; } let block = self.get_block(&adjacent_pos); - adjacent_blocks.insert(direction, block); + adjacent_blocks.data[direction.to_index()] = block; } adjacent_blocks } @@ -147,6 +163,6 @@ mod tests { let adjacent_blocks = world.get_adjacent_blocks(&world_pos); // Five because there is no block below me - assert_eq!(adjacent_blocks.len(), 5); + assert_eq!(adjacent_blocks.data.len(), 6); } } diff --git a/lib/world/src/world/world_block.rs b/lib/world/src/world/world_block.rs index 2c0975d..7c910c7 100644 --- a/lib/world/src/world/world_block.rs +++ b/lib/world/src/world/world_block.rs @@ -1,5 +1,8 @@ use crate::{ - block::{BlockData, BlockMetaData, BlockShape, BlockType, ChunkBlock}, components::world_pos::WorldPos, direction::{Direction, Directions} + block::{BlockData, BlockMetaData, BlockShape, BlockType, ChunkBlock}, + components::world_pos::WorldPos, + direction::{Direction, Directions}, + world::AdjacentBlocks, }; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -55,16 +58,15 @@ impl WorldBlock { return false; } - pub fn get_visible_faces(&self, adjacent_blocks: HashMap) -> Directions { + pub fn get_visible_faces(&self, adjacent_blocks: &AdjacentBlocks) -> Directions { if self.block_type == BlockType::Void { return Directions::empty(); } self.get_faces() .into_iter() - .filter(|direction| match adjacent_blocks.get(direction) { - Some(adjacent_block) => self.is_block_face_visible(adjacent_block), - None => true, + .filter(|direction| { + self.is_block_face_visible(adjacent_blocks.get_for_direction(*direction)) }) .collect::() } @@ -88,7 +90,10 @@ impl WorldBlock { #[cfg(test)] mod tests { use crate::{ - block::{BlockData, BlockType}, components::world_pos::WorldPos, direction::Direction, world::world_block::WorldBlock + block::{BlockData, BlockType}, + components::world_pos::WorldPos, + direction::Direction, + world::{world_block::WorldBlock, AdjacentBlocks}, }; use std::collections::HashMap; @@ -129,24 +134,21 @@ mod tests { world_pos: WorldPos { x: 0, y: 0, z: 0 }, }; - let adjacent_blocks = HashMap::new(); + let adjacent_blocks = AdjacentBlocks::new(); - let faces = world_block.get_visible_faces(adjacent_blocks); + let faces = world_block.get_visible_faces(&adjacent_blocks); assert_eq!(faces.into_iter().len(), 6); - let mut adjacent_blocks: HashMap = HashMap::new(); + let mut adjacent_blocks = AdjacentBlocks::new(); - adjacent_blocks.insert( - Direction::East, - WorldBlock { - block_type: BlockType::Cloud, - extra_data: BlockData::None, - world_pos: WorldPos { x: 0, y: 0, z: 0 }, - }, - ); + adjacent_blocks.data[Direction::East.to_index()] = WorldBlock { + block_type: BlockType::Cloud, + extra_data: BlockData::None, + world_pos: WorldPos { x: 0, y: 0, z: 0 }, + }; - let faces = world_block.get_visible_faces(adjacent_blocks); + let faces = world_block.get_visible_faces(&adjacent_blocks); assert_eq!(faces.into_iter().len(), 5); assert_eq!(faces.has_direction(Direction::East), false); diff --git a/lib/world/src/world/world_chunk.rs b/lib/world/src/world/world_chunk.rs index 735f677..67d8d1a 100644 --- a/lib/world/src/world/world_chunk.rs +++ b/lib/world/src/world/world_chunk.rs @@ -1,9 +1,10 @@ -use std::collections::HashSet; use super::{ChunkNotLoadedError, World, WorldStateDiff}; use crate::{ - chunk::{chunk_mesh::ChunkMesh, Chunk}, components::world_pos::WorldPos, positions::ChunkPos + chunk::{chunk_mesh::ChunkMesh, Chunk}, + components::world_pos::WorldPos, + positions::ChunkPos, }; -use crate::vec::Vector3Ops; +use std::collections::HashSet; impl World { pub fn get_chunk(&self, chunk_pos: &ChunkPos) -> Result<&Chunk, ChunkNotLoadedError> { @@ -77,8 +78,16 @@ impl World { #[cfg(test)] mod tests { + use std::time::{Duration, Instant}; + use crate::{ - block::{BlockData, BlockType, ChunkBlock}, chunk::Chunk, components::world_pos::WorldPos, positions::{ChunkPos, InnerChunkPos}, vec::Vector3Ops, world::{world_block::WorldBlock, World} + block::{BlockData, BlockType, ChunkBlock}, + chunk::Chunk, + components::world_pos::WorldPos, + entities::terrain_gen::TerrainGenerator, + positions::{ChunkPos, InnerChunkPos}, + vec::Vector3Ops, + world::{world_block::WorldBlock, World}, }; #[test] @@ -150,4 +159,32 @@ mod tests { assert_eq!(block.block_type, BlockType::Gold); assert_eq!(block.extra_data, BlockData::None); } + + #[test] + fn profile_chunk_insertion() { + // Average time: 32.633088ms + // Max time: 50.154277ms + + // New + // Average time: 20.878063ms + // Max time: 31.049449ms + + let terrain_gen = TerrainGenerator::new(0, false, false); + + let mut times = Vec::new(); + for i in 0..500 { + let start_time = Instant::now(); + let mut world = World::default(); + let chunk_pos = ChunkPos::new(0, 0); + let chunk = terrain_gen.get_chunk(chunk_pos.x, chunk_pos.y); + world.insert_chunk(chunk); + times.push(start_time.elapsed()); + } + + println!( + "Average time: {:?}", + times.iter().sum::() / times.len() as u32 + ); + println!("Max time: {:?}", times.iter().max().unwrap()); + } } diff --git a/lib/world/src/world/world_mesh.rs b/lib/world/src/world/world_mesh.rs index 220f4bc..7c2805e 100644 --- a/lib/world/src/world/world_mesh.rs +++ b/lib/world/src/world/world_mesh.rs @@ -2,7 +2,12 @@ use std::collections::HashSet; use super::{ChunkNotLoadedError, World, WorldStateDiff}; use crate::{ - chunk::chunk_mesh::{BlockMesh, ChunkMesh}, components::world_pos::WorldPos, positions::ChunkPos, vec::Vector3Ops + chunk::chunk_mesh::{BlockMesh, ChunkMesh}, + components::world_pos::WorldPos, + direction::{DirectionVectorExtension, Directions}, + positions::ChunkPos, + vec::Vector3Ops, + world::{world_block::WorldBlock, AdjacentBlocks}, }; impl World { @@ -11,7 +16,7 @@ impl World { let adj_blocks = self.get_adjacent_blocks(&world_pos); - let faces = world_block.get_visible_faces(adj_blocks); + let faces = world_block.get_visible_faces(&adj_blocks); let chunk_mesh = self.get_chunk_mesh_mut(&world_pos.to_chunk_pos())?; @@ -41,11 +46,32 @@ impl World { } pub fn update_chunk_mesh(&mut self, chunk_pos: &ChunkPos) -> Result<(), ChunkNotLoadedError> { + let mut new_chunk_mesh = ChunkMesh::new(*chunk_pos); let chunk = self.get_chunk(chunk_pos)?; - for block in chunk.get_all_blocks_and_dirty() { - self.update_mesh_at_pos(block.pos.to_world_pos(chunk_pos)) - .ok(); + let all_world_blocks = chunk.get_all_world_blocks_and_dirty(); + + for world_block in all_world_blocks.iter() { + let world_pos = world_block.world_pos; + let mut adjacent_blocks = AdjacentBlocks::new(); + for direction in Directions::all() { + let adjacent_pos = world_pos.move_direction(&direction); + if !adjacent_pos.is_valid() { + continue; + } + + let adjacent_block = if adjacent_pos.to_chunk_pos() == *chunk_pos { + chunk.get_world_block(&adjacent_pos.to_inner_chunk_pos()) + } else { + self.get_block(&adjacent_pos) + }; + + adjacent_blocks.data[direction.to_index()] = adjacent_block; + } + let faces = world_block.get_visible_faces(&adjacent_blocks); + new_chunk_mesh.insert(world_pos, faces); } + self.chunk_meshes + .insert(chunk_pos.to_world_index(), new_chunk_mesh); Ok(()) } @@ -81,7 +107,13 @@ impl World { #[cfg(test)] mod tests { use crate::{ - block::{BlockData, BlockType}, chunk::{chunk_mesh::BlockMesh, Chunk}, components::world_pos::WorldPos, direction::{Direction, Directions}, positions::ChunkPos, vec::Vector3Ops, world::{world_block::WorldBlock, World} + block::{BlockData, BlockType}, + chunk::{chunk_mesh::BlockMesh, Chunk}, + components::world_pos::WorldPos, + direction::{Direction, Directions}, + positions::ChunkPos, + vec::Vector3Ops, + world::{world_block::WorldBlock, World}, }; #[test] From 4afc4d6dcc5f3f64c121072b674e7298fcd7e9b3 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Thu, 5 Jun 2025 23:56:28 -0700 Subject: [PATCH 39/61] claude made basic form of game config. Needs work --- DEVLOG.md | 4 + .../src/components/ClientGameView.tsx | 133 +++++++- .../src/components/ClientHomePage.tsx | 11 +- .../src/components/GameConfigMenu.tsx | 309 ++++++++++++++++++ .../src/game-scripts/agent-gscript.ts | 13 + .../src/game-scripts/canvas-gscript.ts | 5 + apps/web-client/src/game-scripts/hudRender.ts | 15 +- .../src/game-scripts/webgl-gscript.ts | 10 + apps/web-client/src/runner.ts | 36 +- lib/world/src/entities/fireball.rs | 20 ++ lib/world/src/entities/game.rs | 29 +- lib/world/src/entities/game_script.rs | 41 ++- .../src/entities/player_gravity_script.rs | 26 ++ lib/world/src/entities/player_move_script.rs | 25 ++ lib/world/src/entities/sandbox.rs | 26 ++ lib/world/src/entities/velocity_script.rs | 20 ++ 16 files changed, 681 insertions(+), 42 deletions(-) create mode 100644 apps/web-client/src/components/GameConfigMenu.tsx diff --git a/DEVLOG.md b/DEVLOG.md index 3872ece..3a0c2e4 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -4,6 +4,10 @@ I've worked more on optimizing the chunk insertion code. The release build of th I broke up the game updating code into a bunch of functions that I can run seperately and that is nice. +Next I want to work on setting the options for the game when you start it. + +I think I can make it so options can be changed at run time. + # 06_02_25 I got the server working again. I want to fix chunk loading now, the chunks around me load in such a strange way, I can walk up to chunks and not have them load and I don't know why. diff --git a/apps/web-client/src/components/ClientGameView.tsx b/apps/web-client/src/components/ClientGameView.tsx index 31ecb2b..5635f57 100644 --- a/apps/web-client/src/components/ClientGameView.tsx +++ b/apps/web-client/src/components/ClientGameView.tsx @@ -1,27 +1,138 @@ import React, { useEffect, useState } from "react"; import { useParams } from "react-router-dom"; -import { run } from "../runner"; +import { DEFAULT_CONFIG, GameConfig, run, spGameService } from "../runner"; +import { GameConfigMenu } from "./GameConfigMenu"; export function ClientGameView() { const { gameId } = useParams<{ gameId: string }>(); - const [isJoined, setIsJoined] = useState(false); + const [isLoading, setIsLoading] = useState(true); + const [gameExists, setGameExists] = useState(null); + const [showConfigMenu, setShowConfigMenu] = useState(false); + const [gameInstance, setGameInstance] = useState(null); if (!gameId) { return
No game ID provided
; } - function joinGame(gameId: string) { - run(gameId); - setIsJoined(true); - } - useEffect(() => { - joinGame(gameId); + // Check if game exists when component mounts + spGameService.getGame(gameId).then((game) => { + setIsLoading(false); + if (game) { + setGameExists(true); + // Auto-join existing game + run(gameId).then(() => { + // Access the global game instance + setGameInstance((window as any).game?.game); + }); + } else { + setGameExists(false); + } + }); }, [gameId]); - if (isJoined) { - return
; + useEffect(() => { + // Add keyboard shortcut for config menu (ESC key) + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === "Escape" && gameExists) { + setShowConfigMenu(!showConfigMenu); + } + }; + + document.addEventListener("keydown", handleKeyDown); + return () => { + document.removeEventListener("keydown", handleKeyDown); + }; + }, [showConfigMenu, gameExists]); + + const handleConfigSubmit = (config: GameConfig) => { + // Create and join new game with config + run(gameId, config).then(() => { + // Access the global game instance + setGameInstance((window as any).game?.game); + setGameExists(true); + }); + }; + + if (isLoading) { + return
Loading...
; + } + + if (gameExists === false) { + return ; } - return
Loading...
; + return ( +
+
+ +
+ +
Game Started
+ + {gameInstance && ( + setShowConfigMenu(false)} + /> + )} +
+ ); +} + +interface ConfigSelectorProps { + onConfigChange: (config: GameConfig) => void; +} + +function ConfigSelector({ onConfigChange }: ConfigSelectorProps) { + const [config, setConfig] = useState(DEFAULT_CONFIG); + + return ( +
+
+ + + setConfig({ ...config, renderDistance: parseInt(e.target.value) }) + } + /> +
+
+ + + setConfig({ ...config, fovFactor: parseFloat(e.target.value) }) + } + /> +
+ +
+ ); } diff --git a/apps/web-client/src/components/ClientHomePage.tsx b/apps/web-client/src/components/ClientHomePage.tsx index 877a21e..850836d 100644 --- a/apps/web-client/src/components/ClientHomePage.tsx +++ b/apps/web-client/src/components/ClientHomePage.tsx @@ -1,7 +1,11 @@ import { IGameMetadata } from "@craft/engine"; import React, { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; -import { SinglePlayerTerrainChunkGetter, spGameService } from "../runner"; +import { + DEFAULT_CONFIG, + SinglePlayerTerrainChunkGetter, + spGameService, +} from "../runner"; import { SandBoxGScript, TerrainGenerator } from "@craft/rust-world"; export function ClientHomePage() { @@ -12,7 +16,10 @@ export function ClientHomePage() { const newGame = async () => { console.log("Starting game"); const game = spGameService.newGame(); - const chunkGetter = new SinglePlayerTerrainChunkGetter(game); + const chunkGetter = new SinglePlayerTerrainChunkGetter( + game, + DEFAULT_CONFIG + ); spGameService.saveGame( game, new TerrainGenerator(0, false, false), diff --git a/apps/web-client/src/components/GameConfigMenu.tsx b/apps/web-client/src/components/GameConfigMenu.tsx new file mode 100644 index 0000000..9b66222 --- /dev/null +++ b/apps/web-client/src/components/GameConfigMenu.tsx @@ -0,0 +1,309 @@ +import React, { useEffect, useState } from "react"; +import { Game } from "@craft/rust-world"; + +interface GameConfigMenuProps { + game: Game; + isOpen: boolean; + onClose: () => void; +} + +interface ScriptConfig { + [key: string]: any; +} + +export function GameConfigMenu({ game, isOpen, onClose }: GameConfigMenuProps) { + const [scriptNames, setScriptNames] = useState([]); + const [scriptConfigs, setScriptConfigs] = useState<{ + [scriptName: string]: ScriptConfig; + }>({}); + const [activeTab, setActiveTab] = useState(""); + + useEffect(() => { + if (isOpen && game) { + // Get all script names + const names = game.get_all_script_names_wasm(); + setScriptNames(names); + + // Get configs for all scripts + const configs: { [scriptName: string]: ScriptConfig } = {}; + names.forEach((name) => { + try { + const config: Map = game.get_script_config_wasm(name); + console.log("Config", name, config); + if (config) { + configs[name] = Object.fromEntries(config); + } + } catch (error) { + console.warn(`Failed to get config for script ${name}:`, error); + configs[name] = {}; + } + }); + setScriptConfigs(configs); + + // Set first script as active tab + if (names.length > 0 && !activeTab) { + setActiveTab(names[0]); + } + } + }, [isOpen, game, activeTab]); + + const handleConfigChange = (scriptName: string, key: string, value: any) => { + const updatedConfigs = { + ...scriptConfigs, + [scriptName]: { + ...scriptConfigs[scriptName], + [key]: value, + }, + }; + setScriptConfigs(updatedConfigs); + + // Update the game script config + try { + game.set_script_config_wasm(scriptName, updatedConfigs[scriptName]); + } catch (error) { + console.error(`Failed to update config for script ${scriptName}:`, error); + } + }; + + const renderConfigValue = (scriptName: string, key: string, value: any) => { + console.log("RenderConfigValue", scriptName, key, value); + const handleChange = (newValue: any) => { + handleConfigChange(scriptName, key, newValue); + }; + + if (typeof value === "boolean") { + return ( +
+ {key}: + handleChange(e.target.checked)} + /> +
+ ); + } else if (typeof value === "number") { + return ( +
+ {key}: + handleChange(parseFloat(e.target.value) || 0)} + style={{ + background: "#333", + border: "1px solid #555", + color: "white", + padding: "6px 12px", + borderRadius: "4px", + maxWidth: "200px", + }} + /> +
+ ); + } else if (typeof value === "string") { + return ( +
+ {key}: + handleChange(e.target.value)} + style={{ + background: "#333", + border: "1px solid #555", + color: "white", + padding: "6px 12px", + borderRadius: "4px", + maxWidth: "200px", + }} + /> +
+ ); + } else { + return ( +
+ {key}: + + {JSON.stringify(value)} + +
+ ); + } + }; + + if (!isOpen) return null; + + const activeConfig = scriptConfigs[activeTab]; + + console.log("ActiveConfig", activeConfig, scriptConfigs, activeTab); + + return ( +
+
+
+

+ Game Script Configuration +

+ +
+ +
+ {scriptNames.length === 0 ? ( +
+ No game scripts found +
+ ) : ( + <> +
+ {scriptNames.map((name) => ( + + ))} +
+ +
+ {activeTab && scriptConfigs[activeTab] && ( +
+

+ {activeTab} Configuration +

+ {Object.entries(scriptConfigs[activeTab]).map( + ([key, value]) => ( +
+ {renderConfigValue(activeTab, key, value)} +
+ ) + )} + {Object.keys(scriptConfigs[activeTab]).length === 0 && ( +
+ No configuration options available +
+ )} +
+ )} +
+ + )} +
+
+
+ ); +} diff --git a/apps/web-client/src/game-scripts/agent-gscript.ts b/apps/web-client/src/game-scripts/agent-gscript.ts index 33b00c2..c71668b 100644 --- a/apps/web-client/src/game-scripts/agent-gscript.ts +++ b/apps/web-client/src/game-scripts/agent-gscript.ts @@ -17,6 +17,14 @@ export class AiAgentController extends PlayerController { export class AgentGScript extends GameScript { name = "agent"; + + public config = { + enabled: true, + maxAgents: 10, + agentSpeed: 0.1, + spawnRadius: 50, + }; + private controllers: AiAgentController[] = []; private playerActionService = new PlayerActionService(this.game); @@ -24,6 +32,11 @@ export class AgentGScript extends GameScript { "make-ai-agent": () => this.makeAiAgent(), }; + setConfig(config: typeof this.config): void { + this.config = { ...this.config, ...config }; + console.log("AgentGScript config updated:", this.config); + } + private makeAiAgent() { const player = this.game.addPlayer("ai"); const controller = new AiAgentController( diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index ea9913b..2726ea4 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -83,6 +83,11 @@ export class CanvasGameScript extends GameScript { this.isSpectating = false; } + setConfig(config: Config): void { + this.config = { ...this.config, ...config }; + console.log("CanvasGameScript config updated:", this.config); + } + // This is called by the rust side when a chunk is updated onChunkUpdate(chunkId: number): void { console.log("CanvasGameScript: onChunkUpdate", chunkId); diff --git a/apps/web-client/src/game-scripts/hudRender.ts b/apps/web-client/src/game-scripts/hudRender.ts index d8f955d..e5f72b0 100644 --- a/apps/web-client/src/game-scripts/hudRender.ts +++ b/apps/web-client/src/game-scripts/hudRender.ts @@ -8,7 +8,15 @@ import { Game, Item, Player } from "@craft/rust-world"; import TextureMapper from "../textureMapper"; export class HudGScript extends GameScript { - name = "hud"; + name = "hud-renderer"; + + public config = { + enabled: true, + showStats: true, + showBelt: true, + showHealthBar: true, + opacity: 1.0, + }; textureImg: HTMLImageElement; private eHealthBar = getEleOrError("healthBar"); @@ -213,4 +221,9 @@ export class HudGScript extends GameScript { hideElement(this.eUseItemButton); hideElement(this.eUseItemButton2); } + + setConfig(config: typeof this.config): void { + this.config = { ...this.config, ...config }; + console.log("HudGScript config updated:", this.config); + } } diff --git a/apps/web-client/src/game-scripts/webgl-gscript.ts b/apps/web-client/src/game-scripts/webgl-gscript.ts index 6e4d5e2..c77930c 100644 --- a/apps/web-client/src/game-scripts/webgl-gscript.ts +++ b/apps/web-client/src/game-scripts/webgl-gscript.ts @@ -366,4 +366,14 @@ export class WebGlGScript extends GameScript { return shader; } + + setConfig(config: Conifg): void { + this.config = { ...this.config, ...config }; + console.log("WebGlGScript config updated:", this.config); + + // Recreate projection matrix if FOV changed + if (config.glFov && this.program) { + this.createProjectionMatrix(); + } + } } diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 41ee2c2..cce361e 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -19,8 +19,12 @@ export class SinglePlayerTerrainChunkGetter { private chunks_to_insert: [{ x: number; y: number }, Chunk][] = []; private fetched_chunks: [{ x: number; y: number }][] = []; - constructor(private game: GameWrapper) { - this.terrianGen = new TerrainGenerator(0, false, false); + constructor(private game: GameWrapper, config: GameConfig) { + this.terrianGen = new TerrainGenerator( + config.seed, + config.flatWorld, + false + ); } getChunk(chunkPos: { x: number; y: number }) { @@ -64,8 +68,10 @@ export const DEFAULT_CONFIG = { flatWorld: true, }; -export async function run(id?: string) { - console.log("Starting game", id); +export type GameConfig = typeof DEFAULT_CONFIG; + +export async function run(id?: string, config: GameConfig = DEFAULT_CONFIG) { + console.log("Starting game", id, config); const game = id ? await spGameService.getGame(id) : spGameService.newGame(); @@ -78,10 +84,13 @@ export async function run(id?: string) { return; } - const chunkGetter = new SinglePlayerTerrainChunkGetter(game); + const chunkGetter = new SinglePlayerTerrainChunkGetter(game, config); // add sandbox - const sandbox = new SandBoxGScript(2, chunkGetter.getWasmRequestChunk()); + const sandbox = new SandBoxGScript( + config.loadDistance, + chunkGetter.getWasmRequestChunk() + ); const serializedSandbox = sandbox.serialize(); game.game.add_sandbox_wasm(sandbox); @@ -100,9 +109,9 @@ export async function run(id?: string) { webglGameScript, main_player_uid, { - renderDistance: 10, - fovFactor: 0.5, - chunkSize: 16, + renderDistance: config.renderDistance, + fovFactor: config.fovFactor, + chunkSize: config.chunkSize, } ); @@ -175,14 +184,5 @@ export async function run(id?: string) { requestAnimationFrame(update); - // setInterval(async () => { - // console.log("Saving game"); - // await spGameService.saveGame( - // game, - // chunkGetter.terrianGen, - // serializedSandbox - // ); - // }, 3000); - canvasGameScript.renderLoop(0); } diff --git a/lib/world/src/entities/fireball.rs b/lib/world/src/entities/fireball.rs index 60b71b7..7ec7af3 100644 --- a/lib/world/src/entities/fireball.rs +++ b/lib/world/src/entities/fireball.rs @@ -11,7 +11,10 @@ use crate::{ geometry::rect3::Rect3, utils::js_log, }; +use serde_json; +use serde_wasm_bindgen; use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::JsValue; pub fn make_fireball(pos: FineWorldPos, vel: Velocity) -> Entity { let uid = make_entity_id(); @@ -55,6 +58,23 @@ impl Fireball { pub struct FireballScript {} impl GameScript for FireballScript { + fn get_name(&self) -> String { + "fireball".to_string() + } + + fn get_config(&self) -> JsValue { + let config = serde_json::json!({ + "enabled": true, + "damage": 10 + }); + serde_wasm_bindgen::to_value(&config).unwrap() + } + + fn set_config(&mut self, config: JsValue) { + // For now, just log the config. In the future, this could update script behavior + web_sys::console::log_1(&format!("FireballScript config updated: {:?}", config).into()); + } + fn get_query(&self) -> EntityQuery { let mut query = EntityQuery::new(); query.add::(); diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 2785f20..0ca298a 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -2,7 +2,7 @@ use super::{ entities::Entities, entity::{Entity, EntityId}, entity_action::{EntityActionDto, EntityActionHolder}, - game_script::{EntityScriptHolder, GameScript, WasmGameScript}, + game_script::{GameScript, GameScripts, WasmGameScript}, }; use crate::{ chunk::{Chunk, ChunkId}, @@ -32,7 +32,7 @@ pub struct Game { pub id: String, pub world: World, pub entities: Entities, - scripts: EntityScriptHolder, + scripts: GameScripts, schedule: GameSchedule, action_holder: EntityActionHolder, } @@ -66,7 +66,7 @@ impl Game { id: Uuid::new_v4().to_string(), world: World::default(), entities: Entities::new(), - scripts: EntityScriptHolder::default(), + scripts: GameScripts::default(), schedule: GameSchedule::empty(), action_holder: EntityActionHolder::default(), }; @@ -80,7 +80,7 @@ impl Game { name, world, entities, - scripts: EntityScriptHolder::default(), + scripts: GameScripts::default(), schedule: GameSchedule::empty(), action_holder: EntityActionHolder::default(), }; @@ -204,10 +204,6 @@ impl Game { self.schedule_chunk_insert(chunk); } - pub fn add_game_script_wasm(&mut self, script: WasmGameScript) { - self.add_script(Box::new(script)); - } - pub fn get_chunk_mesh_by_chunkid_wasm(&self, chunk_id: ChunkId) -> Result { self.world.get_chunk_mesh_wasm(chunk_id) } @@ -258,6 +254,23 @@ impl Game { let chunk_js = serde_wasm_bindgen::to_value(&chunk); chunk_js } + + // Scripts + pub fn add_game_script_wasm(&mut self, script: WasmGameScript) { + self.add_script(Box::new(script)); + } + + pub fn get_all_script_names_wasm(&self) -> Vec { + self.scripts.get_all_script_names() + } + + pub fn get_script_config_wasm(&self, script_name: String) -> JsValue { + self.scripts.get_script_config(script_name) + } + + pub fn set_script_config_wasm(&mut self, script_name: String, config: JsValue) { + self.scripts.set_script_config(script_name, config); + } } impl Game { diff --git a/lib/world/src/entities/game_script.rs b/lib/world/src/entities/game_script.rs index d4be158..486f44d 100644 --- a/lib/world/src/entities/game_script.rs +++ b/lib/world/src/entities/game_script.rs @@ -17,6 +17,18 @@ pub trait GameScript: Any + Debug { None } + fn get_name(&self) -> String { + "".to_string() + } + + fn get_config(&self) -> JsValue { + JsValue::null() + } + + fn set_config(&mut self, _config: JsValue) { + // Default implementation does nothing + } + fn get_query(&self) -> EntityQuery { EntityQuery::new() } @@ -50,11 +62,11 @@ impl std::fmt::Display for ScriptNotFoundError { #[derive(Debug, Default)] #[wasm_bindgen] -pub struct EntityScriptHolder { +pub struct GameScripts { scripts: Vec>, } -impl EntityScriptHolder { +impl GameScripts { pub fn add_script(&mut self, script: Box) { self.scripts.push(script); } @@ -66,6 +78,31 @@ impl EntityScriptHolder { pub fn iter_mut(&mut self) -> std::slice::IterMut> { self.scripts.iter_mut() } + + pub fn get_all_script_names(&self) -> Vec { + self.scripts + .iter() + .map(|script| script.get_name()) + .collect() + } + + pub fn get_script_config(&self, script_name: String) -> JsValue { + for script in self.scripts.iter() { + if script.get_name() == script_name { + return script.get_config(); + } + } + JsValue::null() + } + + pub fn set_script_config(&mut self, script_name: String, config: JsValue) { + for script in self.scripts.iter_mut() { + if script.get_name() == script_name { + script.set_config(config); + break; + } + } + } } #[wasm_bindgen] diff --git a/lib/world/src/entities/player_gravity_script.rs b/lib/world/src/entities/player_gravity_script.rs index f3e223f..854957d 100644 --- a/lib/world/src/entities/player_gravity_script.rs +++ b/lib/world/src/entities/player_gravity_script.rs @@ -7,6 +7,9 @@ use super::{ }; use crate::{components::velocity::Velocity, world::World}; use serde::{Deserialize, Serialize}; +use serde_json; +use serde_wasm_bindgen; +use wasm_bindgen::JsValue; #[derive(Debug, Serialize, Deserialize, Default, Clone)] pub struct GravityData { @@ -27,6 +30,29 @@ impl Default for GravityScript { } impl GameScript for GravityScript { + fn get_name(&self) -> String { + "gravity".to_string() + } + + fn get_config(&self) -> JsValue { + let config = serde_json::json!({ + "gravity_strength": self.gravity, + "enabled": true, + "terminal_velocity": 20.0 + }); + serde_wasm_bindgen::to_value(&config).unwrap() + } + + fn set_config(&mut self, config: JsValue) { + if let Ok(config_obj) = serde_wasm_bindgen::from_value::(config.clone()) + { + if let Some(gravity) = config_obj.get("gravity_strength").and_then(|v| v.as_f64()) { + self.gravity = gravity as f32; + } + } + web_sys::console::log_1(&format!("GravityScript config updated: {:?}", config).into()); + } + fn get_query(&self) -> EntityQuery { let mut query = EntityQuery::new(); query.add::(); diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs index 964bb53..bc4e393 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/entities/player_move_script.rs @@ -12,6 +12,8 @@ use crate::{ vec::Vector3Ops, world::World, }; use serde::{Deserialize, Serialize}; +use serde_json; +use serde_wasm_bindgen; use wasm_bindgen::prelude::*; #[wasm_bindgen] @@ -60,6 +62,29 @@ impl Default for MoveScript { } impl GameScript for MoveScript { + fn get_name(&self) -> String { + "move".to_string() + } + + fn get_config(&self) -> JsValue { + let config = serde_json::json!({ + "max_speed": self.max_speed, + "slow_force_magnitude": 0.1, + "enabled": true + }); + serde_wasm_bindgen::to_value(&config).unwrap() + } + + fn set_config(&mut self, config: JsValue) { + if let Ok(config_obj) = serde_wasm_bindgen::from_value::(config.clone()) + { + if let Some(max_speed) = config_obj.get("max_speed").and_then(|v| v.as_f64()) { + self.max_speed = max_speed as f32; + } + } + web_sys::console::log_1(&format!("MoveScript config updated: {:?}", config).into()); + } + fn get_query(&self) -> EntityQuery { let mut query = EntityQuery::new(); query.add::(); diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index 15c1351..e0d2aa7 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -5,7 +5,10 @@ use super::{ }; use crate::{components::fine_world_pos::FineWorldPos, positions::ChunkPos, world::World}; use serde::Serialize; +use serde_json; +use serde_wasm_bindgen; use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::JsValue; pub trait RequestChunk: std::fmt::Debug { fn request_chunk(&self, chunk_pos: ChunkPos); @@ -39,6 +42,29 @@ impl SandBoxGScript { } impl GameScript for SandBoxGScript { + fn get_name(&self) -> String { + "sandbox".to_string() + } + + fn get_config(&self) -> JsValue { + let config = serde_json::json!({ + "load_distance": self.load_distance, + "enabled": true, + "auto_load_chunks": true + }); + serde_wasm_bindgen::to_value(&config).unwrap() + } + + fn set_config(&mut self, config: JsValue) { + if let Ok(config_obj) = serde_wasm_bindgen::from_value::(config.clone()) + { + if let Some(load_distance) = config_obj.get("load_distance").and_then(|v| v.as_u64()) { + self.load_distance = load_distance as u8; + } + } + web_sys::console::log_1(&format!("SandBoxGScript config updated: {:?}", config).into()); + } + fn get_query(&self) -> EntityQuery { let mut query = EntityQuery::new(); query.add::(); diff --git a/lib/world/src/entities/velocity_script.rs b/lib/world/src/entities/velocity_script.rs index a836fca..71a54a5 100644 --- a/lib/world/src/entities/velocity_script.rs +++ b/lib/world/src/entities/velocity_script.rs @@ -10,6 +10,9 @@ use crate::{ vec::Vector3Ops, }; use serde::{Deserialize, Serialize}; +use serde_json; +use serde_wasm_bindgen; +use wasm_bindgen::JsValue; #[derive(Debug, Default, Serialize, Deserialize, Clone)] pub struct Forces { @@ -28,6 +31,23 @@ impl_component!(Forces); pub struct VelocityScript {} impl GameScript for VelocityScript { + fn get_name(&self) -> String { + "velocity".to_string() + } + + fn get_config(&self) -> JsValue { + let config = serde_json::json!({ + "enabled": true, + "max_velocity": 10.0, + "damping_factor": 0.98 + }); + serde_wasm_bindgen::to_value(&config).unwrap() + } + + fn set_config(&mut self, config: JsValue) { + web_sys::console::log_1(&format!("VelocityScript config updated: {:?}", config).into()); + } + fn get_query(&self) -> EntityQuery { let mut query = EntityQuery::new(); query.add::(); From 723eec6eb6047245d6529146240647248760209c Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Wed, 11 Jun 2025 22:21:29 -0700 Subject: [PATCH 40/61] Game scripts config. Chunk Getting is in rust now --- apps/web-client/src/app.css | 21 +- .../src/components/ClientGameView.tsx | 57 +-- .../src/components/ClientHomePage.tsx | 17 +- .../src/components/GameConfigMenu.tsx | 328 ++++++++++-------- apps/web-client/src/components/HomePage.tsx | 12 +- .../src/game-scripts/canvas-gscript.ts | 22 +- apps/web-client/src/game-scripts/hudRender.ts | 9 - .../src/game-scripts/webgl-gscript.ts | 39 ++- apps/web-client/src/runner.ts | 102 +----- .../src/services/mp-games-service.ts | 1 - .../src/services/sp-games-service.ts | 11 +- lib/world/src/chunk.rs | 1 + lib/world/src/chunk/chunk_fetcher.rs | 123 +++++++ lib/world/src/entities/fireball.rs | 7 +- lib/world/src/entities/game.rs | 14 +- lib/world/src/entities/game_script.rs | 25 +- .../src/entities/player_gravity_script.rs | 5 +- lib/world/src/entities/player_move_script.rs | 7 +- lib/world/src/entities/sandbox.rs | 61 ++-- lib/world/src/entities/terrain_gen.rs | 29 ++ lib/world/src/entities/velocity_script.rs | 8 +- 21 files changed, 486 insertions(+), 413 deletions(-) create mode 100644 lib/world/src/chunk/chunk_fetcher.rs diff --git a/apps/web-client/src/app.css b/apps/web-client/src/app.css index 004625a..916f918 100644 --- a/apps/web-client/src/app.css +++ b/apps/web-client/src/app.css @@ -235,10 +235,10 @@ h1 { margin-top: -40px; } -button { +.title-button { border: none; padding: 10px 100px; - margin: 30px; + margin: 20px; font-size: 3em; font-family: "Roboto", sans-serif; cursor: pointer; @@ -247,7 +247,22 @@ button { background-color: white; } -button:hover { +.title-button:hover { + box-shadow: 15px 15px 10px grey; + animation: lift 0.1s linear; +} + +.menu-button { + border: none; + background-color: white; + padding: 10px 20px; + margin: 5px; + font-size: 1em; + font-family: "Roboto", sans-serif; + border-radius: 10px; +} + +.menu-button:hover { box-shadow: 15px 15px 10px grey; animation: lift 0.1s linear; } diff --git a/apps/web-client/src/components/ClientGameView.tsx b/apps/web-client/src/components/ClientGameView.tsx index 5635f57..4216ea5 100644 --- a/apps/web-client/src/components/ClientGameView.tsx +++ b/apps/web-client/src/components/ClientGameView.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from "react"; import { useParams } from "react-router-dom"; -import { DEFAULT_CONFIG, GameConfig, run, spGameService } from "../runner"; +import { run, spGameService } from "../runner"; import { GameConfigMenu } from "./GameConfigMenu"; export function ClientGameView() { @@ -45,9 +45,9 @@ export function ClientGameView() { }; }, [showConfigMenu, gameExists]); - const handleConfigSubmit = (config: GameConfig) => { + const handleConfigSubmit = () => { // Create and join new game with config - run(gameId, config).then(() => { + run(gameId).then(() => { // Access the global game instance setGameInstance((window as any).game?.game); setGameExists(true); @@ -59,7 +59,7 @@ export function ClientGameView() { } if (gameExists === false) { - return ; + return
Game does not exist
; } return ( @@ -74,24 +74,11 @@ export function ClientGameView() { gap: "10px", }} > - -
Game Started
- {gameInstance && ( ); } - -interface ConfigSelectorProps { - onConfigChange: (config: GameConfig) => void; -} - -function ConfigSelector({ onConfigChange }: ConfigSelectorProps) { - const [config, setConfig] = useState(DEFAULT_CONFIG); - - return ( -
-
- - - setConfig({ ...config, renderDistance: parseInt(e.target.value) }) - } - /> -
-
- - - setConfig({ ...config, fovFactor: parseFloat(e.target.value) }) - } - /> -
- -
- ); -} diff --git a/apps/web-client/src/components/ClientHomePage.tsx b/apps/web-client/src/components/ClientHomePage.tsx index 850836d..cab825e 100644 --- a/apps/web-client/src/components/ClientHomePage.tsx +++ b/apps/web-client/src/components/ClientHomePage.tsx @@ -1,12 +1,7 @@ import { IGameMetadata } from "@craft/engine"; import React, { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; -import { - DEFAULT_CONFIG, - SinglePlayerTerrainChunkGetter, - spGameService, -} from "../runner"; -import { SandBoxGScript, TerrainGenerator } from "@craft/rust-world"; +import { spGameService } from "../runner"; export function ClientHomePage() { const [games, setGames] = useState([]); @@ -16,15 +11,7 @@ export function ClientHomePage() { const newGame = async () => { console.log("Starting game"); const game = spGameService.newGame(); - const chunkGetter = new SinglePlayerTerrainChunkGetter( - game, - DEFAULT_CONFIG - ); - spGameService.saveGame( - game, - new TerrainGenerator(0, false, false), - new SandBoxGScript(1, chunkGetter.getWasmRequestChunk()) - ); + spGameService.saveGame(game); navigate(`/client-game/${game.game.id}`); }; diff --git a/apps/web-client/src/components/GameConfigMenu.tsx b/apps/web-client/src/components/GameConfigMenu.tsx index 9b66222..a433e4a 100644 --- a/apps/web-client/src/components/GameConfigMenu.tsx +++ b/apps/web-client/src/components/GameConfigMenu.tsx @@ -11,11 +11,20 @@ interface ScriptConfig { [key: string]: any; } +interface ChunkFetcherConfig { + type: string; + json: { + [key: string]: any; + }; +} + export function GameConfigMenu({ game, isOpen, onClose }: GameConfigMenuProps) { const [scriptNames, setScriptNames] = useState([]); const [scriptConfigs, setScriptConfigs] = useState<{ [scriptName: string]: ScriptConfig; }>({}); + const [chunkFetcherConfig, setChunkFetcherConfig] = + useState({}); const [activeTab, setActiveTab] = useState(""); useEffect(() => { @@ -31,18 +40,44 @@ export function GameConfigMenu({ game, isOpen, onClose }: GameConfigMenuProps) { const config: Map = game.get_script_config_wasm(name); console.log("Config", name, config); if (config) { - configs[name] = Object.fromEntries(config); + if (config instanceof Map) { + configs[name] = Object.fromEntries(config); + } else { + configs[name] = config; + } } } catch (error) { console.warn(`Failed to get config for script ${name}:`, error); configs[name] = {}; } }); + + console.log("Configs", configs); + setScriptConfigs(configs); - // Set first script as active tab - if (names.length > 0 && !activeTab) { - setActiveTab(names[0]); + // Get chunk fetcher config + try { + const chunkConfig: ChunkFetcherConfig = game.chunk_fetcher.get_config(); + console.log("Chunk Fetcher Config", chunkConfig); + if (chunkConfig) { + if (chunkConfig.json instanceof Map) { + chunkConfig.json = Object.fromEntries(chunkConfig.json); + } + setChunkFetcherConfig(chunkConfig); + } + } catch (error) { + console.warn("Failed to get chunk fetcher config:", error); + setChunkFetcherConfig({ type: "", json: {} }); + } + + // Set first available tab as active + if (!activeTab) { + if (names.length > 0) { + setActiveTab(names[0]); + } else { + setActiveTab("Chunk Fetcher"); + } } } }, [isOpen, game, activeTab]); @@ -65,6 +100,24 @@ export function GameConfigMenu({ game, isOpen, onClose }: GameConfigMenuProps) { } }; + const handleChunkFetcherConfigChange = (key: string, value: any) => { + const updatedConfig = { + ...chunkFetcherConfig, + json: { + ...chunkFetcherConfig.json, + [key]: value, + }, + }; + setChunkFetcherConfig(updatedConfig); + + // Update the game chunk fetcher config + try { + game.chunk_fetcher.set_config(updatedConfig); + } catch (error) { + console.error("Failed to update chunk fetcher config:", error); + } + }; + const renderConfigValue = (scriptName: string, key: string, value: any) => { console.log("RenderConfigValue", scriptName, key, value); const handleChange = (newValue: any) => { @@ -73,87 +126,101 @@ export function GameConfigMenu({ game, isOpen, onClose }: GameConfigMenuProps) { if (typeof value === "boolean") { return ( -
- {key}: +
+ {key}: handleChange(e.target.checked)} + className="w-4 h-4" />
); } else if (typeof value === "number") { return ( -
- {key}: +
+ {key}: handleChange(parseFloat(e.target.value) || 0)} - style={{ - background: "#333", - border: "1px solid #555", - color: "white", - padding: "6px 12px", - borderRadius: "4px", - maxWidth: "200px", - }} + className="bg-gray-700 border border-gray-600 text-white px-3 py-1.5 rounded max-w-[200px] focus:outline-none focus:border-green-500" />
); } else if (typeof value === "string") { return ( -
- {key}: +
+ {key}: handleChange(e.target.value)} - style={{ - background: "#333", - border: "1px solid #555", - color: "white", - padding: "6px 12px", - borderRadius: "4px", - maxWidth: "200px", - }} + className="bg-gray-700 border border-gray-600 text-white px-3 py-1.5 rounded max-w-[200px] focus:outline-none focus:border-green-500" />
); } else { return ( -
- {key}: - +
+ {key}: + + {JSON.stringify(value)} + +
+ ); + } + }; + + const renderChunkFetcherConfigValue = (key: string, value: any) => { + console.log("RenderChunkFetcherConfigValue", key, value); + const handleChange = (newValue: any) => { + handleChunkFetcherConfigChange(key, newValue); + }; + + if (typeof value === "boolean") { + return ( +
+ {key}: + handleChange(e.target.checked)} + className="w-4 h-4" + /> +
+ ); + } else if (typeof value === "number") { + return ( +
+ {key}: + handleChange(parseFloat(e.target.value) || 0)} + className="bg-gray-700 border border-gray-600 text-white px-3 py-1.5 rounded max-w-[200px] focus:outline-none focus:border-green-500" + /> +
+ ); + } else if (typeof value === "string") { + return ( +
+ {key}: + handleChange(e.target.value)} + className="bg-gray-700 border border-gray-600 text-white px-3 py-1.5 rounded max-w-[200px] focus:outline-none focus:border-green-500" + /> +
+ ); + } else { + return ( +
+ {key}: + {JSON.stringify(value)}
@@ -168,115 +235,78 @@ export function GameConfigMenu({ game, isOpen, onClose }: GameConfigMenuProps) { console.log("ActiveConfig", activeConfig, scriptConfigs, activeTab); return ( -
-
-
-

- Game Script Configuration +
+
+
+

+ Game Configuration

-
- {scriptNames.length === 0 ? ( -
- No game scripts found +
+ {scriptNames.length === 0 && + chunkFetcherConfig.json && + Object.keys(chunkFetcherConfig.json).length === 0 ? ( +
+ No configuration options found
) : ( <> -
+
+ {/* Chunk Fetcher Tab */} + + + {/* Script Tabs */} {scriptNames.map((name) => ( ))}
-
- {activeTab && scriptConfigs[activeTab] && ( +
+ {activeTab === "Chunk Fetcher" ? ( +
+

+ Chunk Fetcher Configuration +

+ {Object.entries(chunkFetcherConfig.json).map( + ([key, value]) => ( +
+ {renderChunkFetcherConfigValue(key, value)} +
+ ) + )} + {Object.keys(chunkFetcherConfig).length === 0 && ( +
+ No configuration options available +
+ )} +
+ ) : activeTab && scriptConfigs[activeTab] ? (
-

+

{activeTab} Configuration

{Object.entries(scriptConfigs[activeTab]).map( @@ -287,18 +317,12 @@ export function GameConfigMenu({ game, isOpen, onClose }: GameConfigMenuProps) { ) )} {Object.keys(scriptConfigs[activeTab]).length === 0 && ( -
+
No configuration options available
)}
- )} + ) : null}
)} diff --git a/apps/web-client/src/components/HomePage.tsx b/apps/web-client/src/components/HomePage.tsx index 2b5301c..7d916e8 100644 --- a/apps/web-client/src/components/HomePage.tsx +++ b/apps/web-client/src/components/HomePage.tsx @@ -8,11 +8,15 @@ function HomePage() {

TylerCraft

- A 3D sandbox by Tyler Tracy + A 3D sandbox game by Tyler Tracy

-
- - +
+ +
); diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index 2726ea4..4a9f5e0 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -19,7 +19,6 @@ import { SphereRenderer } from "../renders/sphereRender"; type Config = { renderDistance: number; fovFactor: number; - chunkSize: number; }; export enum PlayerPerspective { @@ -28,15 +27,19 @@ export enum PlayerPerspective { ThirdPersonFront, } +const CHUNK_SIZE = 16; + const DEFAULT_CONFIG: Config = { renderDistance: 5, fovFactor: 0.5, - chunkSize: 16, }; // This class should only read game and not write. export class CanvasGameScript extends GameScript { - name = "world-renderer"; + // This is called by the rust side + public name = "World Renderer"; + + public config: Config = DEFAULT_CONFIG; private renderers: Renderer[] = []; private entityRenderers: Map = new Map(); @@ -59,8 +62,7 @@ export class CanvasGameScript extends GameScript { constructor( game: Game, private webGlGScript: WebGlGScript, - private mainPlayerId: number, - public config: Config = DEFAULT_CONFIG + private mainPlayerId: number ) { super(game); @@ -83,6 +85,13 @@ export class CanvasGameScript extends GameScript { this.isSpectating = false; } + // This is called by the rust side + getConfig(): Config { + console.log("CanvasGameScript: getConfig", this.config); + return this.config; + } + + // This is called by the rust side setConfig(config: Config): void { this.config = { ...this.config, ...config }; console.log("CanvasGameScript config updated:", this.config); @@ -212,8 +221,7 @@ export class CanvasGameScript extends GameScript { // loop through all of the chunks that I would be able to see. const cameraXYPos = new Vector2D([camera.pos.get(0), camera.pos.get(2)]); - const realRenderDistance = - this.config.chunkSize * this.config.renderDistance; + const realRenderDistance = CHUNK_SIZE * this.config.renderDistance; const cameraChunkPos = this.gameWrapper.getChunkPosFromWorldPos(camera.pos); // const cameraRotNorm = camera.rot.toCartesianCoords().normalize(); diff --git a/apps/web-client/src/game-scripts/hudRender.ts b/apps/web-client/src/game-scripts/hudRender.ts index e5f72b0..e280ec6 100644 --- a/apps/web-client/src/game-scripts/hudRender.ts +++ b/apps/web-client/src/game-scripts/hudRender.ts @@ -1,9 +1,6 @@ import { GameScript } from "@craft/engine"; import { CanvasGameScript } from "../game-scripts/canvas-gscript"; import { getEleOrError, hideElement, IS_MOBILE } from "../utils"; -import { GameMenu } from "../renders/gameMenuRender"; -import React from "react"; -import ReactDOM from "react-dom"; import { Game, Item, Player } from "@craft/rust-world"; import TextureMapper from "../textureMapper"; @@ -43,12 +40,6 @@ export class HudGScript extends GameScript { ) { super(game); - // Show the things! - ReactDOM.render( - React.createElement(GameMenu, { game: game }), - this.eMenuContainer - ); - this.eHud.style.visibility = "visible"; this.textureImg = document.createElement("img"); diff --git a/apps/web-client/src/game-scripts/webgl-gscript.ts b/apps/web-client/src/game-scripts/webgl-gscript.ts index c77930c..04aa10d 100644 --- a/apps/web-client/src/game-scripts/webgl-gscript.ts +++ b/apps/web-client/src/game-scripts/webgl-gscript.ts @@ -13,13 +13,13 @@ import { Game } from "@craft/rust-world"; const WebGlLayer = (window as any).XRWebGLLayer as typeof XRWebGLLayer; -type Conifg = { +type Config = { transparency: boolean; glFov: number; }; -export class WebGlGScript extends GameScript { - name = "canvas"; +export class WebGlGScript extends GameScript { + public name = "WebGL Renderer"; public eCanvas = document.getElementById("glCanvas") as HTMLCanvasElement; public eWebxrButton = document.getElementById( @@ -44,6 +44,29 @@ export class WebGlGScript extends GameScript { glFov: (45 * Math.PI) / 180, }; + // This is called by the rust side + getConfig(): Config { + return this.config; + } + + setConfig(config: Config): void { + this.config = { ...this.config, ...config }; + console.log("WebGlGScript config updated:", this.config); + + // Recreate projection matrix if FOV changed + if (config.glFov && this.program) { + this.createProjectionMatrix(); + } + } + + onChunkUpdate(chunkId: number): void { + // no-op + } + + onEntityUpdate(entityId: number): void { + // no-op + } + constructor(game: Game) { super(game); @@ -366,14 +389,4 @@ export class WebGlGScript extends GameScript { return shader; } - - setConfig(config: Conifg): void { - this.config = { ...this.config, ...config }; - console.log("WebGlGScript config updated:", this.config); - - // Recreate projection matrix if FOV changed - if (config.glFov && this.program) { - this.createProjectionMatrix(); - } - } } diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index cce361e..0e3f274 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -1,77 +1,16 @@ -import { GameWrapper } from "@craft/engine"; import { CanvasGameScript } from "./game-scripts/canvas-gscript"; import { WebGlGScript } from "./game-scripts/webgl-gscript"; import { MobileController } from "./controllers/playerControllers/mobileController"; import { KeyboardPlayerEntityController } from "./controllers/playerControllers/keyboardPlayerController"; import { getMyUid, IS_MOBILE } from "./utils"; -import { - Chunk, - EntityActionDto, - SandBoxGScript, - TerrainGenerator, - WasmRequestChunk, -} from "@craft/rust-world"; +import { EntityActionDto, SandBoxGScript } from "@craft/rust-world"; import { ClientDbGamesService } from "./services/sp-games-service"; import { HudGScript } from "./game-scripts/hudRender"; -export class SinglePlayerTerrainChunkGetter { - public terrianGen: TerrainGenerator; - private chunks_to_insert: [{ x: number; y: number }, Chunk][] = []; - private fetched_chunks: [{ x: number; y: number }][] = []; - - constructor(private game: GameWrapper, config: GameConfig) { - this.terrianGen = new TerrainGenerator( - config.seed, - config.flatWorld, - false - ); - } - - getChunk(chunkPos: { x: number; y: number }) { - const existingChunk = this.chunks_to_insert.find( - (c) => c[0].x === chunkPos.x && c[0].y === chunkPos.y - ); - const existingFetchedChunk = this.fetched_chunks.find( - (c) => c[0].x === chunkPos.x && c[0].y === chunkPos.y - ); - if (existingChunk || existingFetchedChunk) { - console.log("Chunk already exists in chunks_to_insert or fetched_chunks"); - return; - } - console.log("Getting chunk", chunkPos); - const chunk = this.terrianGen.get_chunk(chunkPos.x, chunkPos.y); - this.chunks_to_insert.push([chunkPos, chunk]); - return chunk; - } - - update() { - for (const chunk of this.chunks_to_insert) { - this.game.game.schedule_chunk_insert_wasm(chunk[1]); - this.fetched_chunks.push([chunk[0]]); - } - this.chunks_to_insert = []; - } - - getWasmRequestChunk() { - return new WasmRequestChunk(this.getChunk.bind(this)); - } -} - export const spGameService = await ClientDbGamesService.factory(); -export const DEFAULT_CONFIG = { - loadDistance: 2, - renderDistance: 10, - fovFactor: 0.5, - chunkSize: 16, - seed: 0, - flatWorld: true, -}; - -export type GameConfig = typeof DEFAULT_CONFIG; - -export async function run(id?: string, config: GameConfig = DEFAULT_CONFIG) { - console.log("Starting game", id, config); +export async function run(id?: string) { + console.log("Starting game", id); const game = id ? await spGameService.getGame(id) : spGameService.newGame(); @@ -84,16 +23,6 @@ export async function run(id?: string, config: GameConfig = DEFAULT_CONFIG) { return; } - const chunkGetter = new SinglePlayerTerrainChunkGetter(game, config); - - // add sandbox - const sandbox = new SandBoxGScript( - config.loadDistance, - chunkGetter.getWasmRequestChunk() - ); - const serializedSandbox = sandbox.serialize(); - game.game.add_sandbox_wasm(sandbox); - const main_player_uid = getMyUid(); game.makeAndAddPlayer(main_player_uid); @@ -102,19 +31,20 @@ export async function run(id?: string, config: GameConfig = DEFAULT_CONFIG) { const ents = game.game.entities.get_all_clone(); console.log("Ents", ents); + // ===== Game Scripts ===== + + // add sandbox + const sandbox = new SandBoxGScript(); + game.game.add_sandbox_wasm(sandbox); + const webglGameScript = new WebGlGScript(game.game); + game.makeAndAddGameScript(webglGameScript); const canvasGameScript = new CanvasGameScript( game.game, webglGameScript, - main_player_uid, - { - renderDistance: config.renderDistance, - fovFactor: config.fovFactor, - chunkSize: config.chunkSize, - } + main_player_uid ); - game.makeAndAddGameScript(canvasGameScript); const hudRender = new HudGScript( @@ -135,11 +65,7 @@ export async function run(id?: string, config: GameConfig = DEFAULT_CONFIG) { game.game, onAction, () => { - spGameService.saveGame( - game, - chunkGetter.terrianGen, - serializedSandbox - ); + spGameService.saveGame(game); }, main_player_uid, canvasGameScript @@ -166,8 +92,6 @@ export async function run(id?: string, config: GameConfig = DEFAULT_CONFIG) { await task(); game.game.remove_blocks(); await task(); - chunkGetter.update(); - await task(); playerController.update(); await task(); canvasGameScript.update(); @@ -177,7 +101,7 @@ export async function run(id?: string, config: GameConfig = DEFAULT_CONFIG) { canvasGameScript.renderLoop(0); const end = performance.now(); if (end - start > 50) { - console.log("Large update happened. Time: ", end - start); + console.warn("Large update happened. Time: ", end - start); } requestAnimationFrame(update); }; diff --git a/apps/web-client/src/services/mp-games-service.ts b/apps/web-client/src/services/mp-games-service.ts index 7fcadcf..1ec3052 100644 --- a/apps/web-client/src/services/mp-games-service.ts +++ b/apps/web-client/src/services/mp-games-service.ts @@ -15,7 +15,6 @@ import { Game, SandBoxGScript, WasmGameScript, - WasmRequestChunk, } from "@craft/rust-world"; import { CanvasGameScript } from "../game-scripts/canvas-gscript"; import { WebGlGScript } from "../game-scripts/webgl-gscript"; diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index fb30ffc..a978a89 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -105,24 +105,21 @@ export class ClientDbGamesService { return this.createGame(foundGame); } - async saveGame( - data: GameWrapper, - terrainGen: TerrainGenerator, - sandbox: any - ) { + async saveGame(data: GameWrapper) { return new Promise((resolve, reject) => { const transaction = this.db.transaction( [ClientDbGamesService.WORLDS_OBS], "readwrite" ); console.log("Entities", data.game.entities.to_js()); + const serializedGame = { gameId: data.game.id, name: data.game.name, entities: data.game.entities.to_js(), world: data.game.world.serialize_wasm(), - terrainGen: terrainGen.serialize(), - sandbox: sandbox, + chunkFetcher: data.game.chunk_fetcher.get_config(), + scripts: data.game.scripts.to_js(), }; console.log("Saving game", serializedGame); diff --git a/lib/world/src/chunk.rs b/lib/world/src/chunk.rs index 24a0577..1678730 100644 --- a/lib/world/src/chunk.rs +++ b/lib/world/src/chunk.rs @@ -6,6 +6,7 @@ use serde_big_array::BigArray; use wasm_bindgen::prelude::*; mod chunk_duct; +pub mod chunk_fetcher; pub mod chunk_mesh; #[cfg(test)] mod chunk_unit_tests; diff --git a/lib/world/src/chunk/chunk_fetcher.rs b/lib/world/src/chunk/chunk_fetcher.rs new file mode 100644 index 0000000..cf9e026 --- /dev/null +++ b/lib/world/src/chunk/chunk_fetcher.rs @@ -0,0 +1,123 @@ +use crate::chunk::Chunk; +use crate::entities::terrain_gen::TerrainGenerator; +use crate::positions::ChunkPos; +use crate::utils::js_log; +use lazy_static::lazy_static; +use serde::{ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer}; +use serde_json::Value; +use std::collections::HashMap; +use std::sync::Mutex; +use wasm_bindgen::prelude::*; + +#[derive(Clone, Serialize, Deserialize)] +#[wasm_bindgen(getter_with_clone)] +pub struct ChunkFetcher { + loaded_chunks: Vec<(ChunkPos, Chunk)>, + chunk_loader: Box, +} + +impl ChunkFetcher { + pub fn new(chunk_loader: Box) -> Self { + Self { + loaded_chunks: Vec::new(), + chunk_loader, + } + } + + pub fn request_chunk(&mut self, chunk_pos: ChunkPos) { + if self.loaded_chunks.iter().any(|(pos, _)| pos == &chunk_pos) { + return; + } + + let chunk = self.chunk_loader.load_chunk(chunk_pos); + self.loaded_chunks.push((chunk_pos, chunk)); + } + + pub fn consume_single_chunk(&mut self) -> Option { + self.loaded_chunks.pop().map(|(_, chunk)| chunk) + } +} + +#[wasm_bindgen] +impl ChunkFetcher { + #[wasm_bindgen(constructor)] + pub fn new_wasm(gen: TerrainGenerator) -> Self { + Self::new(Box::new(gen)) + } + + pub fn get_config(&self) -> JsValue { + serde_wasm_bindgen::to_value(&self.chunk_loader).unwrap() + } + + pub fn set_config(&mut self, config: JsValue) { + js_log(&format!("Setting chunk loader config: {:?}", config)); + self.chunk_loader = serde_wasm_bindgen::from_value(config).unwrap(); + } +} + +pub trait ChunkLoader { + fn load_chunk(&self, chunk_pos: ChunkPos) -> Chunk; + fn clone_box(&self) -> Box; + fn type_name(&self) -> &'static str { + std::any::type_name::() + } + fn to_json(&self) -> serde_json::Value; + fn to_js(&self) -> JsValue; +} + +impl Clone for Box { + fn clone(&self) -> Self { + self.clone_box() + } +} + +impl Serialize for Box { + fn serialize(&self, serializer: S) -> Result { + let mut s = serializer.serialize_struct("ChunkLoader", 2)?; + s.serialize_field("type", &self.type_name())?; + s.serialize_field("json", &self.to_json())?; + s.end() + } +} + +#[derive(Deserialize)] +struct ChunkLoaderHelper { + #[serde(rename = "type")] + type_name: String, + json: Value, +} + +impl<'de> Deserialize<'de> for Box { + fn deserialize>(deserializer: D) -> Result { + let helper = ChunkLoaderHelper::deserialize(deserializer)?; + let registry = CHUNK_LOADER_REGISTRY.lock().unwrap(); + let deserializer_fn = registry.get(helper.type_name.as_str()).ok_or_else(|| { + serde::de::Error::custom(format!("Unknown ChunkLoader type: {}", helper.type_name)) + })?; + Ok(deserializer_fn(helper.json)) + } +} + +type ChunkLoaderDeserializer = fn(Value) -> Box; + +lazy_static! { + static ref CHUNK_LOADER_REGISTRY: Mutex> = { + let mut map = HashMap::new(); + + fn register( + map: &mut HashMap<&'static str, ChunkLoaderDeserializer>, + ) { + fn deser( + v: Value, + ) -> Box { + Box::new(serde_json::from_value::(v).unwrap()) + } + + map.insert(std::any::type_name::(), deser::); + } + + register::(&mut map); + + Mutex::new(map) + }; +} diff --git a/lib/world/src/entities/fireball.rs b/lib/world/src/entities/fireball.rs index 7ec7af3..7d043b4 100644 --- a/lib/world/src/entities/fireball.rs +++ b/lib/world/src/entities/fireball.rs @@ -7,6 +7,7 @@ use super::{ velocity_script::Forces, }; use crate::{ + chunk::chunk_fetcher::ChunkFetcher, components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}, geometry::rect3::Rect3, utils::js_log, @@ -63,10 +64,7 @@ impl GameScript for FireballScript { } fn get_config(&self) -> JsValue { - let config = serde_json::json!({ - "enabled": true, - "damage": 10 - }); + let config = serde_json::json!({}); serde_wasm_bindgen::to_value(&config).unwrap() } @@ -86,6 +84,7 @@ impl GameScript for FireballScript { &mut self, world: &crate::world::World, mut query_results: EntityQueryResults, + _chunk_fetcher: &mut ChunkFetcher, ) -> Option { let mut game_schedule = GameSchedule::empty(); diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 0ca298a..3ff7b62 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -5,7 +5,10 @@ use super::{ game_script::{GameScript, GameScripts, WasmGameScript}, }; use crate::{ - chunk::{Chunk, ChunkId}, + chunk::{ + chunk_fetcher::{ChunkFetcher, ChunkLoader}, + Chunk, ChunkId, + }, components::world_pos::WorldPos, entities::{ entity_action::EntityActionDtoMaker, @@ -16,6 +19,7 @@ use crate::{ player_jump_script::JumpAction, player_move_script::{MoveAction, MoveScript}, player_rot_script::RotateAction, + terrain_gen::TerrainGenerator, velocity_script::VelocityScript, }, positions::ChunkPos, @@ -32,6 +36,7 @@ pub struct Game { pub id: String, pub world: World, pub entities: Entities, + pub chunk_fetcher: ChunkFetcher, scripts: GameScripts, schedule: GameSchedule, action_holder: EntityActionHolder, @@ -66,6 +71,7 @@ impl Game { id: Uuid::new_v4().to_string(), world: World::default(), entities: Entities::new(), + chunk_fetcher: ChunkFetcher::new_wasm(TerrainGenerator::default()), scripts: GameScripts::default(), schedule: GameSchedule::empty(), action_holder: EntityActionHolder::default(), @@ -80,6 +86,7 @@ impl Game { name, world, entities, + chunk_fetcher: ChunkFetcher::new_wasm(TerrainGenerator::default()), scripts: GameScripts::default(), schedule: GameSchedule::empty(), action_holder: EntityActionHolder::default(), @@ -100,7 +107,7 @@ impl Game { for script in self.scripts.get_scripts_mut() { let query = script.get_query(); let query_results = self.entities.query(&query); - let diff = script.update(world, query_results); + let diff = script.update(world, query_results, &mut self.chunk_fetcher); if let Some(diff) = diff { self.schedule.combine(diff); } @@ -135,7 +142,8 @@ impl Game { } pub fn add_single_chunk(&mut self) { - if let Some(chunk) = self.schedule.consume_single_chunk() { + let chunk = self.chunk_fetcher.consume_single_chunk(); + if let Some(chunk) = chunk { let chunk_id = chunk.get_id(); self.world.insert_chunk(chunk); self.scripts.iter_mut().for_each(|script| { diff --git a/lib/world/src/entities/game_script.rs b/lib/world/src/entities/game_script.rs index 486f44d..4fe62dc 100644 --- a/lib/world/src/entities/game_script.rs +++ b/lib/world/src/entities/game_script.rs @@ -1,7 +1,7 @@ use super::entities::{EntityQuery, EntityQueryResults}; use super::entity::EntityId; use super::game::{GameDiff, GameSchedule}; -use crate::chunk::ChunkId; +use crate::chunk::{chunk_fetcher::ChunkFetcher, ChunkId}; use crate::world::World; use std::any::Any; use std::fmt::Debug; @@ -13,6 +13,7 @@ pub trait GameScript: Any + Debug { &mut self, _world: &World, _query_results: EntityQueryResults, + _chunk_fetcher: &mut ChunkFetcher, ) -> Option { None } @@ -108,7 +109,10 @@ impl GameScripts { #[wasm_bindgen] #[derive(Debug)] pub struct WasmGameScript { + name: String, context: JsValue, + get_config_jsfn: js_sys::Function, + set_config_jsfn: js_sys::Function, on_chunk_update_jsfn: js_sys::Function, on_entity_update_jsfn: js_sys::Function, } @@ -121,9 +125,15 @@ impl WasmGameScript { js_sys::Reflect::get(&val, &JsValue::from("onChunkUpdate")).unwrap(); let on_entity_update_jsfn = js_sys::Reflect::get(&val, &JsValue::from("onEntityUpdate")).unwrap(); + let name = js_sys::Reflect::get(&val, &JsValue::from("name")).unwrap(); + let get_config_jsfn = js_sys::Reflect::get(&val, &JsValue::from("getConfig")).unwrap(); + let set_config_jsfn = js_sys::Reflect::get(&val, &JsValue::from("setConfig")).unwrap(); WasmGameScript { + name: name.as_string().unwrap(), on_chunk_update_jsfn: on_chunk_update_jsfn.into(), on_entity_update_jsfn: on_entity_update_jsfn.into(), + get_config_jsfn: get_config_jsfn.into(), + set_config_jsfn: set_config_jsfn.into(), context: val, } } @@ -134,10 +144,23 @@ impl GameScript for WasmGameScript { &mut self, _world: &World, _query_results: EntityQueryResults, + _chunk_fetcher: &mut ChunkFetcher, ) -> Option { None } + fn get_name(&self) -> String { + self.name.clone() + } + + fn get_config(&self) -> JsValue { + self.get_config_jsfn.call0(&self.context).unwrap() + } + + fn set_config(&mut self, config: JsValue) { + self.set_config_jsfn.call1(&self.context, &config).unwrap(); + } + fn on_chunk_update(&self, chunk_id: ChunkId) { let val = serde_wasm_bindgen::to_value(&chunk_id).unwrap(); self.on_chunk_update_jsfn diff --git a/lib/world/src/entities/player_gravity_script.rs b/lib/world/src/entities/player_gravity_script.rs index 854957d..2dc0a1c 100644 --- a/lib/world/src/entities/player_gravity_script.rs +++ b/lib/world/src/entities/player_gravity_script.rs @@ -5,7 +5,7 @@ use super::{ game_script::GameScript, velocity_script::Forces, }; -use crate::{components::velocity::Velocity, world::World}; +use crate::{chunk::chunk_fetcher::ChunkFetcher, components::velocity::Velocity, world::World}; use serde::{Deserialize, Serialize}; use serde_json; use serde_wasm_bindgen; @@ -37,8 +37,6 @@ impl GameScript for GravityScript { fn get_config(&self) -> JsValue { let config = serde_json::json!({ "gravity_strength": self.gravity, - "enabled": true, - "terminal_velocity": 20.0 }); serde_wasm_bindgen::to_value(&config).unwrap() } @@ -65,6 +63,7 @@ impl GameScript for GravityScript { &mut self, _world: &World, query_results: EntityQueryResults, + _chunk_fetcher: &mut ChunkFetcher, ) -> Option { for entity in query_results.entities { let data = entity.get::().unwrap(); diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs index bc4e393..b74344a 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/entities/player_move_script.rs @@ -8,8 +8,8 @@ use super::{ velocity_script::Forces, }; use crate::{ - components::velocity::Velocity, direction::Direction, geometry::rotation::SphericalRotation, - vec::Vector3Ops, world::World, + chunk::chunk_fetcher::ChunkFetcher, components::velocity::Velocity, direction::Direction, + geometry::rotation::SphericalRotation, vec::Vector3Ops, world::World, }; use serde::{Deserialize, Serialize}; use serde_json; @@ -69,8 +69,6 @@ impl GameScript for MoveScript { fn get_config(&self) -> JsValue { let config = serde_json::json!({ "max_speed": self.max_speed, - "slow_force_magnitude": 0.1, - "enabled": true }); serde_wasm_bindgen::to_value(&config).unwrap() } @@ -98,6 +96,7 @@ impl GameScript for MoveScript { &mut self, _world: &crate::world::World, query_results: EntityQueryResults, + _chunk_fetcher: &mut ChunkFetcher, ) -> Option { for entity in query_results.entities { let rot = entity.get::().unwrap().to_owned(); diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index e0d2aa7..b620e84 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -3,7 +3,10 @@ use super::{ game::{Game, GameSchedule}, game_script::GameScript, }; -use crate::{components::fine_world_pos::FineWorldPos, positions::ChunkPos, world::World}; +use crate::{ + chunk::chunk_fetcher::ChunkFetcher, components::fine_world_pos::FineWorldPos, + positions::ChunkPos, world::World, +}; use serde::Serialize; use serde_json; use serde_wasm_bindgen; @@ -18,9 +21,12 @@ pub trait RequestChunk: std::fmt::Debug { #[wasm_bindgen] pub struct SandBoxGScript { pub load_distance: u8, - #[serde(skip)] - request_chunk: Box, - // pub terrain_gen: TerrainGenerator, +} + +impl Default for SandBoxGScript { + fn default() -> Self { + Self { load_distance: 2 } + } } #[wasm_bindgen] @@ -49,8 +55,6 @@ impl GameScript for SandBoxGScript { fn get_config(&self) -> JsValue { let config = serde_json::json!({ "load_distance": self.load_distance, - "enabled": true, - "auto_load_chunks": true }); serde_wasm_bindgen::to_value(&config).unwrap() } @@ -71,7 +75,12 @@ impl GameScript for SandBoxGScript { query } - fn update(&mut self, world: &World, query_results: EntityQueryResults) -> Option { + fn update( + &mut self, + world: &World, + query_results: EntityQueryResults, + chunk_fetcher: &mut ChunkFetcher, + ) -> Option { let entity_poses: Vec = query_results .entities .iter() @@ -84,13 +93,8 @@ impl GameScript for SandBoxGScript { .filter(|pos| !world.has_chunk(pos)) .collect(); - // only load the first chunk - let chunk_pos = nearby_unloaded_chunks.first(); - - // let mut gdiff = GameSchedule::empty(); - - if let Some(chunk_pos) = chunk_pos { - self.request_chunk.request_chunk(*chunk_pos); + for chunk_pos in nearby_unloaded_chunks { + chunk_fetcher.request_chunk(chunk_pos); } None @@ -102,36 +106,11 @@ pub mod wasm { use super::*; - #[wasm_bindgen] - #[derive(Debug)] - pub struct WasmRequestChunk { - request_chunk: js_sys::Function, - } - - #[wasm_bindgen] - impl WasmRequestChunk { - #[wasm_bindgen(constructor)] - pub fn new(request_chunk: js_sys::Function) -> WasmRequestChunk { - WasmRequestChunk { request_chunk } - } - } - - impl RequestChunk for WasmRequestChunk { - fn request_chunk(&self, chunk_pos: ChunkPos) { - let val = serde_wasm_bindgen::to_value(&chunk_pos).unwrap(); - let context = JsValue::NULL; - self.request_chunk.call1(&context, &val).unwrap(); - } - } - #[wasm_bindgen] impl SandBoxGScript { #[wasm_bindgen(constructor)] - pub fn new_wasm(load_distance: u8, wasm_request_chunk: WasmRequestChunk) -> SandBoxGScript { - SandBoxGScript { - load_distance, - request_chunk: Box::new(wasm_request_chunk), - } + pub fn new_wasm() -> SandBoxGScript { + SandBoxGScript::default() } pub fn serialize(&self) -> Result { diff --git a/lib/world/src/entities/terrain_gen.rs b/lib/world/src/entities/terrain_gen.rs index d688737..3e5e998 100644 --- a/lib/world/src/entities/terrain_gen.rs +++ b/lib/world/src/entities/terrain_gen.rs @@ -1,3 +1,4 @@ +use crate::chunk::chunk_fetcher::ChunkLoader; use crate::direction::DirectionVectorExtension2; use crate::{ block::{BlockData, BlockType, ChunkBlock}, @@ -525,6 +526,16 @@ pub struct TerrainGenerator { pub debug_world: bool, } +impl Default for TerrainGenerator { + fn default() -> Self { + Self { + seed: 0, + flat_world: true, + debug_world: false, + } + } +} + #[wasm_bindgen] impl TerrainGenerator { #[wasm_bindgen(constructor)] @@ -561,3 +572,21 @@ impl TerrainGenerator { chunk_getter.get_chunk(&chunk_pos) } } + +impl ChunkLoader for TerrainGenerator { + fn load_chunk(&self, chunk_pos: ChunkPos) -> Chunk { + self.get_chunk(chunk_pos.x, chunk_pos.y) + } + + fn clone_box(&self) -> Box { + Box::new(self.clone()) + } + + fn to_json(&self) -> serde_json::Value { + serde_json::to_value(self).expect("TerrainGenerator must be serializable") + } + + fn to_js(&self) -> JsValue { + serde_wasm_bindgen::to_value(self).unwrap() + } +} diff --git a/lib/world/src/entities/velocity_script.rs b/lib/world/src/entities/velocity_script.rs index 71a54a5..aaa0861 100644 --- a/lib/world/src/entities/velocity_script.rs +++ b/lib/world/src/entities/velocity_script.rs @@ -5,6 +5,7 @@ use super::{ game_script::GameScript, }; use crate::{ + chunk::chunk_fetcher::ChunkFetcher, components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}, geometry::rect3::Rect3, vec::Vector3Ops, @@ -36,11 +37,7 @@ impl GameScript for VelocityScript { } fn get_config(&self) -> JsValue { - let config = serde_json::json!({ - "enabled": true, - "max_velocity": 10.0, - "damping_factor": 0.98 - }); + let config = serde_json::json!({}); serde_wasm_bindgen::to_value(&config).unwrap() } @@ -60,6 +57,7 @@ impl GameScript for VelocityScript { &mut self, world: &crate::world::World, query_results: EntityQueryResults, + _chunk_fetcher: &mut ChunkFetcher, ) -> Option { for entity in query_results.entities { let mut vel = entity.get::().unwrap().to_owned(); From aefe97955a21567abe153c03fab0a423fb70d9fc Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 31 Aug 2025 02:56:36 +0000 Subject: [PATCH 41/61] Working on game script serialization --- DEVLOG.md | 9 + .../keyboardPlayerController.ts | 6 +- .../src/game-scripts/canvas-gscript.ts | 525 +++++++++++++++--- apps/web-client/src/game-scripts/hudRender.ts | 6 +- apps/web-client/src/renders/chunkRender.ts | 10 +- apps/web-client/src/renders/cubeRender.ts | 6 +- apps/web-client/src/renders/imageRender.ts | 2 +- apps/web-client/src/renders/playerRender.ts | 8 +- apps/web-client/src/renders/renderer.ts | 22 +- apps/web-client/src/renders/sphereRender.ts | 6 +- apps/web-client/src/runner.ts | 45 +- .../src/services/mp-games-service.ts | 1 - .../src/services/sp-games-service.ts | 1 - lib/engine/src/game-script.ts | 1 - lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/entities/game.rs | 42 +- lib/world/src/entities/game_script.rs | 246 +++++++- .../src/entities/player_gravity_script.rs | 2 +- lib/world/src/entities/player_move_script.rs | 7 +- lib/world/src/entities/sandbox.rs | 7 - 20 files changed, 757 insertions(+), 197 deletions(-) diff --git a/DEVLOG.md b/DEVLOG.md index 3a0c2e4..b4ca88f 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,3 +1,12 @@ +# 08_30_25 + +It's been a bit but I'm back. I've mostly been working on getting scripts to be serialzied. It is hard to get the wasm scripts to live in rust. + +I'm currently trying to load the scripts and everything is moving forward. + +I probably want to move to a similar structure as the Entities soon where a GameScript is a struct instead of a trait + + # 06_03_25 I've worked more on optimizing the chunk insertion code. The release build of the app is much faster now and I'm happy with it. diff --git a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts index 7f6748e..0e1f292 100644 --- a/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts +++ b/apps/web-client/src/controllers/playerControllers/keyboardPlayerController.ts @@ -1,7 +1,7 @@ import { CONFIG, PlayerController } from "@craft/engine"; import { Direction, EntityActionDto, Game } from "@craft/rust-world"; import { - CanvasGameScript, + GameRenderer, PlayerPerspective, } from "../../game-scripts/canvas-gscript"; @@ -21,7 +21,7 @@ export class KeyboardPlayerEntityController extends PlayerController { handleAction: (action: EntityActionDto) => void, private save: () => void, playerId: number, - private canvasGScript: CanvasGameScript + private gameRenderer: GameRenderer ) { super(game, handleAction, playerId); @@ -62,7 +62,7 @@ export class KeyboardPlayerEntityController extends PlayerController { const moveY = e.movementY * CONFIG.player.mouseRotSpeed; if ( - this.canvasGScript.perspective === PlayerPerspective.ThirdPersonFront + this.gameRenderer.perspective === PlayerPerspective.ThirdPersonFront ) { moveX += Math.PI; this.rotate(moveX, moveY); diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index 4a9f5e0..6b1ef8f 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -1,6 +1,5 @@ import { Camera, - GameScript, GameWrapper, makeCameraForPlayer, makeThirdPersonBackCamera, @@ -9,16 +8,36 @@ import { Vector2D, Vector3D, } from "@craft/engine"; -import { WebGlGScript } from "./webgl-gscript"; import { Renderer } from "../renders/renderer"; import { ChunkRenderer } from "../renders/chunkRender"; -import { BlockType, Entity, Fireball, Game, Player } from "@craft/rust-world"; +import { + add_script_to_registry, + BlockType, + Entity, + Fireball, + Player, +} from "@craft/rust-world"; import { PlayerRenderer } from "../renders/playerRender"; import { SphereRenderer } from "../renders/sphereRender"; +import type { + Navigator, + XRSession, + XRFrame, + XRReferenceSpace, + XRWebGLLayer, +} from "webxr"; +import { mat4 } from "gl-matrix"; +import VertexShader from "../../shaders/vertex.glsl?raw"; +import FragmentShader from "../../shaders/fragment.glsl?raw"; +import { getEleOrError } from "../utils"; + +const WebGlLayer = (window as any).XRWebGLLayer as typeof XRWebGLLayer; type Config = { renderDistance: number; fovFactor: number; + glFov: number; + transparency: boolean; }; export enum PlayerPerspective { @@ -32,40 +51,198 @@ const CHUNK_SIZE = 16; const DEFAULT_CONFIG: Config = { renderDistance: 5, fovFactor: 0.5, + glFov: (45 * Math.PI) / 180, + transparency: true, }; -// This class should only read game and not write. -export class CanvasGameScript extends GameScript { +export class GameRendererGameScript { + public static name = "World Renderer"; + public static defaultConfig = DEFAULT_CONFIG; + updatedChunks: Set = new Set(); + updatedEntities: Set = new Set(); + + constructor(public config: Config = DEFAULT_CONFIG) {} + + static register() { + add_script_to_registry(GameRendererGameScript); + } + + // This is called by the rust side when a chunk is updated + onChunkUpdate(chunkId: number): void { + console.log("CanvasGameScript: onChunkUpdate", chunkId); + this.updatedChunks.add(chunkId); + } + + // This is called by the rust side when an entity is updated + onEntityUpdate(entityId: number): void { + console.log("CanvasGameScript: onEntityUpdate", entityId); + this.updatedEntities.add(entityId); + } + // This is called by the rust side - public name = "World Renderer"; + getConfig(): Config { + console.log("CanvasGameScript: getConfig", this.config); + return this.config; + } + + // This is called by the rust side + setConfig(config: Config): void { + this.config = { ...this.config, ...config }; + console.log("CanvasGameScript config updated:", this.config); + } +} - public config: Config = DEFAULT_CONFIG; +GameRendererGameScript.register(); +export class GameRenderer { private renderers: Renderer[] = []; private entityRenderers: Map = new Map(); private chunkRenderers: Map = new Map(); - public perspective: PlayerPerspective = PlayerPerspective.FirstPerson; - shouldRenderMainPlayer = false; + public eCanvas = getEleOrError("glCanvas"); + public eWebxrButton = getEleOrError("webxrButton"); + public gl: WebGLRenderingContext; + public program: { + program: WebGLProgram; + attribLocations: { [name: string]: number }; + uniformLocations: { [name: string]: WebGLUniformLocation }; + }; + public navigator = window.navigator as any as Navigator; + public webXrSession: XRSession | null = null; + public xrRefSpace: XRReferenceSpace | null = null; + public currentXRFrame: XRFrame | null = null; + public textureAtlas: WebGLTexture; + private galleryImagesPaths: string[] = ["./img/tree.jpg"]; + private galleryImages: WebGLTexture[] = []; + + public shouldRenderMainPlayer = false; + + public isSpectating = false; + public totTime = 0; + public pastDeltas: number[] = []; + + private getGameScript(): GameRendererGameScript { + return this.game.game.scripts.get_script_state( + GameRendererGameScript.name + ) as GameRendererGameScript; + } - isSpectating = false; - numOfBlocks = 10; - totTime = 0; - pastDeltas: number[] = []; + private getConfig(): Config { + const gameScript = this.getGameScript(); + return gameScript.getConfig(); + } - gameWrapper: GameWrapper = new GameWrapper(this.game); + constructor(private game: GameWrapper, private mainPlayerId: number) { + this.eCanvas.style.display = "block"; - updatedChunks: Set = new Set(); - updatedEntities: Set = new Set(); + // init gl eCanvas + const gl = this.eCanvas.getContext("webgl2", { + // premultipliedAlpha: false, + // alpha: false, + }); + if (gl === null) throw new Error("WebGL failed to load"); // Only continue if WebGL is available and working + + this.textureAtlas = this.loadTextureFromUrl("/img/texture_map.png", gl); - constructor( - game: Game, - private webGlGScript: WebGlGScript, - private mainPlayerId: number - ) { - super(game); + this.galleryImagesPaths.forEach((path) => { + const img = new Image(); + img.src = path; + const texture = this.loadTextureFromUrl(path, gl); + this.galleryImages.push(texture); + }); + + this.gl = gl; + + const getCanvasDimensions = () => { + this.eCanvas.height = window.innerHeight; + this.eCanvas.width = window.innerWidth; + this.gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); + if (this.program) this.createProjectionMatrix(); + }; + + window.addEventListener("resize", getCanvasDimensions); + getCanvasDimensions(); + + gl.enable(gl.DEPTH_TEST); // Enable depth testing + gl.depthFunc(gl.LEQUAL); // Near things obscure far things + gl.activeTexture(gl.TEXTURE0); // Tell WebGL we want to affect texture unit 0 + // for transparent images + if (this.getConfig().transparency) { + // this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA); + // gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA); + gl.blendFuncSeparate( + gl.SRC_ALPHA, + gl.ONE_MINUS_SRC_ALPHA, + gl.ONE, + gl.ONE_MINUS_SRC_ALPHA + ); + + this.gl.enable(this.gl.BLEND); + } + this.clearCanvas(); + + const vertexShader = this.loadShader(gl, gl.VERTEX_SHADER, VertexShader); + const fragmentShader = this.loadShader( + gl, + gl.FRAGMENT_SHADER, + FragmentShader + ); + + const shaderProgram = gl.createProgram(); + + if (!shaderProgram) { + throw new Error("Error loading shader program"); + } + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + console.log( + "Unable to initialize the shader program: " + + gl.getProgramInfoLog(shaderProgram) + ); + throw new Error("Unable to init shader program"); + } + + this.program = { + program: shaderProgram, + attribLocations: { + vertexPosition: gl.getAttribLocation(shaderProgram, "aVertexPosition"), + textureCord: gl.getAttribLocation(shaderProgram, "aTextureCord"), + }, + uniformLocations: { + projectionMatrix: gl.getUniformLocation( + shaderProgram, + "uProjectionMatrix" + )!, + modelViewMatrix: gl.getUniformLocation( + shaderProgram, + "uModelViewMatrix" + )!, + uSampler: gl.getUniformLocation(shaderProgram, "uSampler")!, + uFilter: gl.getUniformLocation(shaderProgram, "uFilter")!, + }, + }; + + gl.useProgram(this.program.program); + + gl.enableVertexAttribArray(this.program.attribLocations.vertexPosition); + gl.enableVertexAttribArray(this.program.attribLocations.textureCord); + + // Tell the shader we bound the texture to texture unit 0 + gl.uniform1i(this.program.uniformLocations.uSampler, 0); + + // set the color filter + this.setColorFilter(new Vector3D([0, 0, 0])); + this.createProjectionMatrix(); + + this.initWebXR().then(() => { + console.log("WebXR initialized"); + }); console.log("Canvas Render Usecase", this); window.addEventListener("keydown", (e) => { @@ -73,45 +250,21 @@ export class CanvasGameScript extends GameScript { }); // Create renderers for initial entities - for (const entity of this.gameWrapper.game.entities.get_all_clone()) { + for (const entity of this.game.game.entities.get_all_clone()) { this.onNewEntity(entity); } // Create renderers for initial chunks - for (const chunkId of this.gameWrapper.getLoadedChunkIds()) { + for (const chunkId of this.game.getLoadedChunkIds()) { this.createChunkRender(chunkId); } this.isSpectating = false; } - // This is called by the rust side - getConfig(): Config { - console.log("CanvasGameScript: getConfig", this.config); - return this.config; - } - - // This is called by the rust side - setConfig(config: Config): void { - this.config = { ...this.config, ...config }; - console.log("CanvasGameScript config updated:", this.config); - } - - // This is called by the rust side when a chunk is updated - onChunkUpdate(chunkId: number): void { - console.log("CanvasGameScript: onChunkUpdate", chunkId); - this.updatedChunks.add(chunkId); - } - - // This is called by the rust side when an entity is updated - onEntityUpdate(entityId: number): void { - console.log("CanvasGameScript: onEntityUpdate", entityId); - this.updatedEntities.add(entityId); - } - getCamera(): Camera { - const player = this.gameWrapper.getPlayer(this.mainPlayerId); - if (this.webGlGScript.isXr) { + const player = this.game.getPlayer(this.mainPlayerId); + if (this.isXr) { return makeXRCamera(player); } else { if (this.perspective === PlayerPerspective.FirstPerson) { @@ -125,10 +278,9 @@ export class CanvasGameScript extends GameScript { } update() { - for (const entityId of this.updatedEntities) { + for (const entityId of this.getGameScript().updatedEntities) { console.log("CanvasGameScript: Updating entity", entityId); - const entity = - this.gameWrapper.game.entities.get_entity_by_id_clone(entityId); + const entity = this.game.game.entities.get_entity_by_id_clone(entityId); if (!entity) { console.log("CanvasGameScript: Entity not found", entityId); this.onRemovedEntity(entityId); @@ -137,17 +289,24 @@ export class CanvasGameScript extends GameScript { this.onNewEntity(entity); } - for (const chunkId of this.updatedChunks) { + for (const chunkId of this.getGameScript().updatedChunks) { this.createChunkRender(chunkId); } - this.updatedChunks.clear(); - this.updatedEntities.clear(); + let gameScript = this.getGameScript(); + + gameScript.updatedChunks.clear(); + gameScript.updatedEntities.clear(); + + this.game.game.scripts.set_script_config( + GameRendererGameScript.name, + gameScript + ); } getFilter(camera: Camera): Vector3D { const shiftedDown = camera.pos.sub(new Vector3D([0, 0.5, 0])); - const block = this.gameWrapper.getBlock(shiftedDown); + const block = this.game.getBlock(shiftedDown); if (block?.type === BlockType.Water) { return new Vector3D([0, 0.3, 1]); @@ -157,7 +316,7 @@ export class CanvasGameScript extends GameScript { } setup(): void | Promise { - this.webGlGScript.loop(this.renderLoop.bind(this)); + this.loop(this.renderLoop.bind(this)); } private handleKeyDown(key: string) { @@ -195,7 +354,7 @@ export class CanvasGameScript extends GameScript { const filter = this.getFilter(camera); if (filter) { - this.webGlGScript.setColorFilter(filter); + this.setColorFilter(filter); } const renderedChunks = new Set(); @@ -221,13 +380,13 @@ export class CanvasGameScript extends GameScript { // loop through all of the chunks that I would be able to see. const cameraXYPos = new Vector2D([camera.pos.get(0), camera.pos.get(2)]); - const realRenderDistance = CHUNK_SIZE * this.config.renderDistance; - const cameraChunkPos = this.gameWrapper.getChunkPosFromWorldPos(camera.pos); + const realRenderDistance = CHUNK_SIZE * this.getConfig().renderDistance; + const cameraChunkPos = this.game.getChunkPosFromWorldPos(camera.pos); // const cameraRotNorm = camera.rot.toCartesianCoords().normalize(); const renderChunk = (chunkPos: Vector2D) => { - const chunkId = this.gameWrapper.getChunkIdFromChunkPos(chunkPos); + const chunkId = this.game.getChunkIdFromChunkPos(chunkPos); const chunkRenderer = this.chunkRenderers.get(chunkId); if (!chunkRenderer) { return; @@ -239,19 +398,18 @@ export class CanvasGameScript extends GameScript { const skippedChunkPos = new Set(); for ( - let i = -this.config.renderDistance; - i <= this.config.renderDistance; + let i = -this.getConfig().renderDistance; + i <= this.getConfig().renderDistance; i++ ) { for ( - let j = -this.config.renderDistance; - j <= this.config.renderDistance; + let j = -this.getConfig().renderDistance; + j <= this.getConfig().renderDistance; j++ ) { const indexVec = new Vector2D([i, j]); const chunkPos = cameraChunkPos.add(indexVec); - const chunkWorldPos = - this.gameWrapper.getWorldPosFromChunkPos(chunkPos); + const chunkWorldPos = this.game.getWorldPosFromChunkPos(chunkPos); const chunkXYPos = new Vector2D([ chunkWorldPos.get(0), chunkWorldPos.get(2), @@ -327,19 +485,11 @@ export class CanvasGameScript extends GameScript { // if (entity instanceof PlayerWrapper) { if (Player.is_player(entity)) { console.log("CanvasGameScript: Adding player"); - const renderer = new PlayerRenderer( - this.game, - this.webGlGScript, - entity.id - ); + const renderer = new PlayerRenderer(this.game.game, this, entity.id); this.entityRenderers.set(entity.id, renderer); } else if (Fireball.is_fireball(entity)) { console.log("CanvasGameScript: Adding fireball"); - const renderer = new SphereRenderer( - this.game, - this.webGlGScript, - entity.id - ); + const renderer = new SphereRenderer(this.game.game, this, entity.id); this.entityRenderers.set(entity.id, renderer); } } @@ -351,14 +501,219 @@ export class CanvasGameScript extends GameScript { createChunkRender(chunkId: number): void { console.log("CanvasGameScript: Creating chunk render", chunkId); - const chunkPos = this.gameWrapper.getChunkPosFromChunkId(chunkId); - const chunkMesh = this.gameWrapper.getChunkMeshFromChunkPos(chunkId); - const chunkRenderer = new ChunkRenderer( - this.webGlGScript, - chunkPos, - chunkMesh - ); + const chunkPos = this.game.getChunkPosFromChunkId(chunkId); + const chunkMesh = this.game.getChunkMeshFromChunkPos(chunkId); + const chunkRenderer = new ChunkRenderer(this, chunkPos, chunkMesh); chunkRenderer.getBufferData(); this.chunkRenderers.set(chunkId, chunkRenderer); } + + public loadTextureFromUrl(url: string, gl: WebGLRenderingContext) { + const isPowerOf2 = (x: number) => (x & (x - 1)) === 0; + + const texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + + // Because images have to be download over the internet + // they might take a moment until they are ready. + // Until then put a single pixel in the texture so we can + // use it immediately. When the image has finished downloading + // we'll update the texture with the contents of the image. + const level = 0; + const internalFormat = gl.RGBA; + const width = 1; + const height = 1; + const border = 0; + const srcFormat = gl.RGBA; + const srcType = gl.UNSIGNED_BYTE; + const pixel = new Uint8Array([0, 0, 255, 255]); // opaque blue + gl.texImage2D( + gl.TEXTURE_2D, + level, + internalFormat, + width, + height, + border, + srcFormat, + srcType, + pixel + ); + + const image = new Image(); + image.onload = function () { + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.texImage2D( + gl.TEXTURE_2D, + level, + internalFormat, + srcFormat, + srcType, + image + ); + + // WebGL1 has different requirements for power of 2 images + // vs non power of 2 images so check if the image is a + // power of 2 in both dimensions. + if (isPowerOf2(image.width) && isPowerOf2(image.height)) { + // Yes, it's a power of 2. Generate mips. + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.generateMipmap(gl.TEXTURE_2D); + } else { + // No, it's not a power of 2. Turn off mips and set + // wrapping to clamp to edge + 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); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + } + }; + image.src = url; + + if (!texture) { + throw new Error("Error loading texture file"); + } + + return texture; + } + + // Returns one of the images that I have loaded locally on my + getGalleryTexture(index: number): WebGLTexture { + // Make sure we never get an image out of bounds + index = index % this.galleryImagesPaths.length; + + return this.galleryImages[index]; + } + + private createProjectionMatrix() { + // Create a perspective matrix, a special matrix that is + // used to simulate the distortion of perspective in a camera. + // Our field of view is 45 degrees, with a width/height + // ratio that matches the display size of the eCanvas + // and we only want to see objects between 0.1 units + // and 100 units away from the camera. + const fieldOfView = this.getConfig().glFov; + const eCanvasElement = this.gl.canvas as HTMLCanvasElement; + const aspect = eCanvasElement.clientWidth / eCanvasElement.clientHeight; + const zNear = 0.1; + const zFar = 100.0; + const projectionMatrix = mat4.create(); + mat4.perspective(projectionMatrix, fieldOfView, aspect, zNear, zFar); + + this.gl.uniformMatrix4fv( + this.program.uniformLocations.projectionMatrix, + false, + projectionMatrix + ); + } + + get isXr() { + return this.webXrSession !== null; + } + + private async initWebXR() { + if (!this.navigator.xr) { + console.log("WebXR not supported"); + return; + } + + const supported = await this.navigator.xr.isSessionSupported( + "immersive-vr" + ); + if (!supported) { + console.log("Immersive VR not supported"); + return; + } + + this.webXrSession = await this.navigator.xr.requestSession("immersive-vr", { + requiredFeatures: ["local-floor"], + }); + + console.log("XR session", this.webXrSession); + this.webXrSession.addEventListener("end", () => { + this.eWebxrButton.style.display = "none"; + }); + + this.webXrSession.addEventListener("inputsourceschange", () => { + console.log("inputsourceschange"); + }); + + this.webXrSession.updateRenderState({ + baseLayer: new WebGlLayer(this.webXrSession, this.gl), + depthFar: 1000, + depthNear: 0.1, + }); + this.xrRefSpace = await this.webXrSession.requestReferenceSpace( + "local-floor" + ); + console.log("Ref space", this.xrRefSpace); + } + + loop(loopFunc: (delta: number) => void) { + const wrappedXRLoopFunc = (t: number, frame: XRFrame) => { + this.clearCanvas(); + this.currentXRFrame = frame; + loopFunc(t); + this.webXrSession?.requestAnimationFrame(wrappedXRLoopFunc); + }; + const wrappedLoopFunc = (t: number) => { + this.clearCanvas(); + loopFunc(t); + window.requestAnimationFrame(wrappedLoopFunc); + }; + + if (this.webXrSession) { + console.log("xr loop"); + this.webXrSession.requestAnimationFrame(wrappedXRLoopFunc); + } else { + console.log("Normal loop"); + window.requestAnimationFrame(wrappedLoopFunc); + } + } + + clearCanvas() { + this.gl.clearColor(0.0, 0.8, 1.0, 1.0); + this.gl.clearDepth(1.0); // Clear everything + this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT); + } + + setColorFilter(color: Vector3D) { + this.gl.uniform4f( + this.program.uniformLocations.uFilter, + color.get(0), + color.get(1), + color.get(2), + 0 + ); + } + + // + // creates a shader of the given type, uploads the source and + // compiles it. + // + loadShader( + gl: WebGLRenderingContext, + type: number, + source: string + ): WebGLShader { + const shader = gl.createShader(type); + + if (!shader) { + throw new Error("Error loading shader"); + } + + // Send the source to the shader object + gl.shaderSource(shader, source); + + // Compile the shader program + gl.compileShader(shader); + + // See if it compiled successfully + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + console.log(gl.getShaderInfoLog(shader)); + gl.deleteShader(shader); + throw new Error("Error loading shader"); + } + + return shader; + } } diff --git a/apps/web-client/src/game-scripts/hudRender.ts b/apps/web-client/src/game-scripts/hudRender.ts index e280ec6..cdf464b 100644 --- a/apps/web-client/src/game-scripts/hudRender.ts +++ b/apps/web-client/src/game-scripts/hudRender.ts @@ -1,5 +1,5 @@ import { GameScript } from "@craft/engine"; -import { CanvasGameScript } from "../game-scripts/canvas-gscript"; +import { GameRenderer } from "../game-scripts/canvas-gscript"; import { getEleOrError, hideElement, IS_MOBILE } from "../utils"; import { Game, Item, Player } from "@craft/rust-world"; import TextureMapper from "../textureMapper"; @@ -35,7 +35,7 @@ export class HudGScript extends GameScript { constructor( game: Game, - private canvasGScript: CanvasGameScript, + private gameRenderer: GameRenderer, private mainPlayerUid: number ) { super(game); @@ -110,7 +110,7 @@ export class HudGScript extends GameScript { const statsString = ` playerPos: ${cameraPos}
playerRot: ${cameraRot}
- fps: ${this.canvasGScript.frameRate.toFixed(0)}
+ fps: ${this.gameRenderer.frameRate.toFixed(0)}
`; if (this.lastStats !== statsString) { diff --git a/apps/web-client/src/renders/chunkRender.ts b/apps/web-client/src/renders/chunkRender.ts index 4cbb1e5..c0ef809 100644 --- a/apps/web-client/src/renders/chunkRender.ts +++ b/apps/web-client/src/renders/chunkRender.ts @@ -9,19 +9,19 @@ import { import TextureMapper from "../textureMapper"; import { BlockShape, BlockType } from "@craft/rust-world"; import ShapeBuilder from "../services/shape-builder"; -import { WebGlGScript } from "../game-scripts/webgl-gscript"; +import { GameRenderer } from "../game-scripts/canvas-gscript"; export class ChunkRenderer extends Renderer { private otherRenders: Renderer[] = []; constructor( - public webGlGScript: WebGlGScript, + public gameRenderer: GameRenderer, public chunkPos: Vector2D, public chunkMesh: ChunkMeshWrapper ) { - super(webGlGScript); + super(gameRenderer); - this.setActiveTexture(webGlGScript.textureAtlas); + this.setActiveTexture(gameRenderer.textureAtlas); this.getBufferData(); } @@ -31,7 +31,7 @@ export class ChunkRenderer extends Renderer { render(camera: Camera, trans?: boolean): void { // if (!this.isLoaded) return; - this.setActiveTexture(this.webGlGScript.textureAtlas); + this.setActiveTexture(this.gameRenderer.textureAtlas); this.renderObject(this.worldPos, camera, trans); diff --git a/apps/web-client/src/renders/cubeRender.ts b/apps/web-client/src/renders/cubeRender.ts index 3f086da..fc5107e 100644 --- a/apps/web-client/src/renders/cubeRender.ts +++ b/apps/web-client/src/renders/cubeRender.ts @@ -5,9 +5,9 @@ import ShapeBuilder from "../services/shape-builder"; import { WebGlGScript } from "../game-scripts/webgl-gscript"; export class CubeRenderer extends Renderer { - constructor(public webGlGScript: WebGlGScript, public entity: Entity) { - super(webGlGScript); - this.setActiveTexture(this.webGlGScript.textureAtlas); + constructor(public gameRenderer: WebGlGScript, public entity: Entity) { + super(gameRenderer); + this.setActiveTexture(this.gameRenderer.textureAtlas); this.setup(); } diff --git a/apps/web-client/src/renders/imageRender.ts b/apps/web-client/src/renders/imageRender.ts index d4fec7a..9d56528 100644 --- a/apps/web-client/src/renders/imageRender.ts +++ b/apps/web-client/src/renders/imageRender.ts @@ -29,7 +29,7 @@ export class ImageReneCanvasderer extends Renderer { render(camera: Camera): void { this.setActiveTexture( - this.webGlGScript.getGalleryTexture(this.galleryIndex) + this.gameRenderer.getGalleryTexture(this.galleryIndex) ); this.renderObject(this.pos.data as IDim, camera); } diff --git a/apps/web-client/src/renders/playerRender.ts b/apps/web-client/src/renders/playerRender.ts index a8cb6cb..f9d91fa 100644 --- a/apps/web-client/src/renders/playerRender.ts +++ b/apps/web-client/src/renders/playerRender.ts @@ -2,8 +2,8 @@ import { Camera, Vector3D } from "@craft/engine"; import { RenderData, Renderer } from "./renderer"; import ShapeBuilder from "../services/shape-builder"; import TextureMapper from "../textureMapper"; -import { WebGlGScript } from "../game-scripts/webgl-gscript"; import { Game, Player } from "@craft/rust-world"; +import { GameRenderer } from "../game-scripts/canvas-gscript"; class PlayerRenderWrapper { constructor(private player: Player) {} @@ -30,11 +30,11 @@ export class PlayerRenderer extends Renderer { constructor( private game: Game, - webGlGScript: WebGlGScript, + protected gameRenderer: GameRenderer, public entityId: number ) { - super(webGlGScript); - this.setActiveTexture(this.webGlGScript.textureAtlas); + super(gameRenderer); + this.setActiveTexture(this.gameRenderer.textureAtlas); } render(camera: Camera) { diff --git a/apps/web-client/src/renders/renderer.ts b/apps/web-client/src/renders/renderer.ts index 4bc571a..b3a0b11 100644 --- a/apps/web-client/src/renders/renderer.ts +++ b/apps/web-client/src/renders/renderer.ts @@ -1,6 +1,6 @@ import { Camera, Vector3D } from "@craft/engine"; import { mat4, vec3 } from "gl-matrix"; -import { WebGlGScript } from "../game-scripts/webgl-gscript"; +import { GameRenderer } from "../game-scripts/canvas-gscript"; interface IRenderData { positions: number[]; @@ -50,10 +50,10 @@ export abstract class Renderer { amount = 0; transAmount = 0; - constructor(protected webGlGScript: WebGlGScript) {} + constructor(protected gameRenderer: GameRenderer) {} protected setBuffers(renData: IRenderData, transRenData?: IRenderData) { - const gl = this.webGlGScript.gl; + const gl = this.gameRenderer.gl; this.amount = renData.indices.length; @@ -120,8 +120,8 @@ export abstract class Renderer { // Tell WebGL how to pull out the positions from the position // buffer into the vertexPosition attribute. private bindCube(trans: boolean) { - const programInfo = this.webGlGScript.program; - const gl = this.webGlGScript.gl; + const programInfo = this.gameRenderer.program; + const gl = this.gameRenderer.gl; const posBuffer = trans ? this.transPosBuffer : this.posBuffer; const indexBuffer = trans ? this.transIndexBuffer : this.indexBuffer; @@ -146,8 +146,8 @@ export abstract class Renderer { // tell webgl how to pull out the texture coordinates from buffer private bindTexture(trans: boolean) { - const programInfo = this.webGlGScript.program; - const gl = this.webGlGScript.gl; + const programInfo = this.gameRenderer.program; + const gl = this.gameRenderer.gl; const textureBuffer = trans ? this.transTextureBuffer : this.textureBuffer; @@ -171,7 +171,7 @@ export abstract class Renderer { renderXrObject(pos: Vector3D, camera: Camera, trans?: boolean) { const { currentXRFrame, xrRefSpace, gl, program, webXrSession } = - this.webGlGScript; + this.gameRenderer; if (!currentXRFrame || !xrRefSpace || !webXrSession) { return; } @@ -238,11 +238,11 @@ export abstract class Renderer { } renderObject(pos: Vector3D, camera: Camera, trans?: boolean) { - if (this.webGlGScript.currentXRFrame) { + if (this.gameRenderer.currentXRFrame) { return this.renderXrObject(pos, camera, trans); } - const gl = this.webGlGScript.gl; - const programInfo = this.webGlGScript.program; + const gl = this.gameRenderer.gl; + const programInfo = this.gameRenderer.program; // Set the drawing position to the "identity" point, which is // the center of the scene. diff --git a/apps/web-client/src/renders/sphereRender.ts b/apps/web-client/src/renders/sphereRender.ts index 44367c1..ef3ea5d 100644 --- a/apps/web-client/src/renders/sphereRender.ts +++ b/apps/web-client/src/renders/sphereRender.ts @@ -1,4 +1,4 @@ -import { WebGlGScript } from "../game-scripts/webgl-gscript"; +import { GameRenderer } from "../game-scripts/canvas-gscript"; import { RenderData, Renderer } from "./renderer"; import { Camera, Vector3D } from "@craft/engine"; import { Game } from "@craft/rust-world"; @@ -8,10 +8,10 @@ export class SphereRenderer extends Renderer { constructor( public game: Game, - webGlGScript: WebGlGScript, + protected gameRenderer: GameRenderer, public entityId: number ) { - super(webGlGScript); + super(gameRenderer); const fireball = game.entities.get_entity_as_fireball(entityId); if (!fireball) { diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 0e3f274..a2a4114 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -1,4 +1,3 @@ -import { CanvasGameScript } from "./game-scripts/canvas-gscript"; import { WebGlGScript } from "./game-scripts/webgl-gscript"; import { MobileController } from "./controllers/playerControllers/mobileController"; import { KeyboardPlayerEntityController } from "./controllers/playerControllers/keyboardPlayerController"; @@ -6,6 +5,10 @@ import { getMyUid, IS_MOBILE } from "./utils"; import { EntityActionDto, SandBoxGScript } from "@craft/rust-world"; import { ClientDbGamesService } from "./services/sp-games-service"; import { HudGScript } from "./game-scripts/hudRender"; +import { + GameRenderer, + GameRendererGameScript, +} from "./game-scripts/canvas-gscript"; export const spGameService = await ClientDbGamesService.factory(); @@ -23,35 +26,25 @@ export async function run(id?: string) { return; } - const main_player_uid = getMyUid(); + const mainPlayerUid = getMyUid(); - game.makeAndAddPlayer(main_player_uid); + game.makeAndAddPlayer(mainPlayerUid); game.game.update(); const ents = game.game.entities.get_all_clone(); console.log("Ents", ents); // ===== Game Scripts ===== + game.game.scripts.ensure_script("sandbox"); + game.game.scripts.ensure_script("game-renderer"); - // add sandbox - const sandbox = new SandBoxGScript(); - game.game.add_sandbox_wasm(sandbox); - - const webglGameScript = new WebGlGScript(game.game); - game.makeAndAddGameScript(webglGameScript); - - const canvasGameScript = new CanvasGameScript( - game.game, - webglGameScript, - main_player_uid + const gameRenderer = new GameRenderer( + game, + mainPlayerUid, + gameRenderGameScript ); - game.makeAndAddGameScript(canvasGameScript); - const hudRender = new HudGScript( - game.game, - canvasGameScript, - main_player_uid - ); + const hudRender = new HudGScript(game.game, gameRenderer, mainPlayerUid); const onAction = (action: EntityActionDto) => { game.game.handle_action_wasm(action); @@ -59,7 +52,7 @@ export async function run(id?: string) { const playerController = (() => { if (IS_MOBILE) { - return new MobileController(onAction, main_player_uid); + return new MobileController(onAction, mainPlayerUid); } else { return new KeyboardPlayerEntityController( game.game, @@ -67,8 +60,8 @@ export async function run(id?: string) { () => { spGameService.saveGame(game); }, - main_player_uid, - canvasGameScript + mainPlayerUid, + gameRenderer ); } })(); @@ -94,11 +87,11 @@ export async function run(id?: string) { await task(); playerController.update(); await task(); - canvasGameScript.update(); + gameRenderer.update(); await task(); hudRender.update(0); await task(); - canvasGameScript.renderLoop(0); + gameRenderer.renderLoop(0); const end = performance.now(); if (end - start > 50) { console.warn("Large update happened. Time: ", end - start); @@ -108,5 +101,5 @@ export async function run(id?: string) { requestAnimationFrame(update); - canvasGameScript.renderLoop(0); + gameRenderer.renderLoop(0); } diff --git a/apps/web-client/src/services/mp-games-service.ts b/apps/web-client/src/services/mp-games-service.ts index 1ec3052..c66802b 100644 --- a/apps/web-client/src/services/mp-games-service.ts +++ b/apps/web-client/src/services/mp-games-service.ts @@ -16,7 +16,6 @@ import { SandBoxGScript, WasmGameScript, } from "@craft/rust-world"; -import { CanvasGameScript } from "../game-scripts/canvas-gscript"; import { WebGlGScript } from "../game-scripts/webgl-gscript"; import { getMyUid } from "../utils"; import { KeyboardPlayerEntityController } from "../controllers/playerControllers/keyboardPlayerController"; diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index a978a89..ecb7242 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -4,7 +4,6 @@ import { ISerializedGame, serializedGameToGame, } from "@craft/engine/src/wrappers"; -import { TerrainGenerator } from "@craft/rust-world"; export class ClientDbGamesService { private static WORLDS_OBS = "worlds"; diff --git a/lib/engine/src/game-script.ts b/lib/engine/src/game-script.ts index 0322b42..60e9b00 100644 --- a/lib/engine/src/game-script.ts +++ b/lib/engine/src/game-script.ts @@ -1,5 +1,4 @@ import { Game } from "@craft/rust-world"; -import { GameWrapper } from "./wrappers.js"; export type GameScriptConfig = Record | undefined; diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index b6d2a9f..474f91d 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/camera.ts","./src/wrappers.ts","./src/game-script.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,69,112],[47,49,50,69,112],[69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc4c38b7c60b1398b3c2f497cdf85e273ea3edc0b6158e54adef045c26530f82","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"2190af24cd8970497490c683989e0519fb8c15489edda3df05dc3c5e8c95bf13","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"d9f7fd5df2102e70ba80021fc57b2092f4af0e13003346655d30ca80cf6296f1","signature":"89986a49089b9d6f4a5fb98b88e586e64d53ef20869471e1d530332ff39d778f","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"bd1fef4442cc97cad909bd08e37c0afa728c3c9ac286e39b7ff3068bd09101d0","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"322f723495a7a0a8eb726f5b130ba65257b71b21be66dfacf21bdb4bc9077a55","signature":"6382ca8397ca3146b4551e1f2dc37d871eb021c72482460422503a4d0f504a03","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[51,2],[49,3],[53,4],[57,5],[54,1],[56,4],[55,3],[50,3],[52,6],[47,3],[60,7],[58,3],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,3],[171,12],[174,13],[175,14],[172,3],[176,3],[177,15],[167,3],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,3],[67,22],[65,3],[66,3],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,3],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,3],[143,3],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,3],[169,3],[170,3],[182,68],[179,3],[181,69],[183,70],[184,3],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,3],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,3],[226,3],[227,3],[228,80],[70,3],[180,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,3],[84,96],[71,3],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,3],[101,108]],"latestChangedDtsFile":"./dist/wrappers.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es5.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2016.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2018.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2019.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.dom.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.decorators.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/camera.ts","./src/wrappers.ts","./src/game-script.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[69,112],[47,69,112],[47,49,50,69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"c2c9424cd007942600a77cdbee3801234ddb1723466e20eda1f7b0dd3be1f0b1","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"2190af24cd8970497490c683989e0519fb8c15489edda3df05dc3c5e8c95bf13","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"70ec1338c3ebd2316eff58a06865162cdbf132386ea8159780728214f0ec0112","signature":"2dadc62b955c38b0f4ec751e796f78a86a7f47cc3b0cbb267e36c129b92859c8","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"bd1fef4442cc97cad909bd08e37c0afa728c3c9ac286e39b7ff3068bd09101d0","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"322f723495a7a0a8eb726f5b130ba65257b71b21be66dfacf21bdb4bc9077a55","signature":"6382ca8397ca3146b4551e1f2dc37d871eb021c72482460422503a4d0f504a03","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[45,1],[46,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[19,1],[20,1],[4,1],[21,1],[25,1],[22,1],[23,1],[24,1],[26,1],[27,1],[28,1],[5,1],[29,1],[30,1],[31,1],[32,1],[6,1],[36,1],[33,1],[34,1],[35,1],[37,1],[7,1],[38,1],[43,1],[44,1],[39,1],[40,1],[41,1],[42,1],[1,1],[48,2],[51,3],[49,1],[53,4],[57,5],[54,2],[56,4],[55,1],[50,1],[52,6],[47,1],[60,7],[58,1],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,1],[171,12],[174,13],[175,14],[172,1],[176,1],[177,15],[167,1],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,1],[67,22],[65,1],[66,1],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,1],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,1],[143,1],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,1],[169,1],[170,1],[182,68],[179,1],[181,69],[183,70],[184,1],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,1],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,1],[226,1],[227,1],[228,80],[70,1],[180,1],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,1],[84,96],[71,1],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,1],[101,108]],"latestChangedDtsFile":"./dist/index.d.ts","version":"5.9.2"} \ No newline at end of file diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index 3ff7b62..cd71322 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -5,10 +5,7 @@ use super::{ game_script::{GameScript, GameScripts, WasmGameScript}, }; use crate::{ - chunk::{ - chunk_fetcher::{ChunkFetcher, ChunkLoader}, - Chunk, ChunkId, - }, + chunk::{chunk_fetcher::ChunkFetcher, Chunk, ChunkId}, components::world_pos::WorldPos, entities::{ entity_action::EntityActionDtoMaker, @@ -37,7 +34,7 @@ pub struct Game { pub world: World, pub entities: Entities, pub chunk_fetcher: ChunkFetcher, - scripts: GameScripts, + pub scripts: GameScripts, schedule: GameSchedule, action_holder: EntityActionHolder, } @@ -45,10 +42,10 @@ pub struct Game { #[wasm_bindgen] impl Game { fn add_default_scripts(&mut self) { - self.add_script(Box::new(MoveScript::default())); - self.add_script(Box::new(VelocityScript::default())); - self.add_script(Box::new(GravityScript::default())); - self.add_script(Box::new(FireballScript::default())); + self.scripts.add_script(Box::new(MoveScript::default())); + self.scripts.add_script(Box::new(VelocityScript::default())); + self.scripts.add_script(Box::new(GravityScript::default())); + self.scripts.add_script(Box::new(FireballScript::default())); self.action_holder.add_handler(MoveAction::make_handler()); self.action_holder.add_handler(JumpAction::make_handler()); @@ -262,29 +259,6 @@ impl Game { let chunk_js = serde_wasm_bindgen::to_value(&chunk); chunk_js } - - // Scripts - pub fn add_game_script_wasm(&mut self, script: WasmGameScript) { - self.add_script(Box::new(script)); - } - - pub fn get_all_script_names_wasm(&self) -> Vec { - self.scripts.get_all_script_names() - } - - pub fn get_script_config_wasm(&self, script_name: String) -> JsValue { - self.scripts.get_script_config(script_name) - } - - pub fn set_script_config_wasm(&mut self, script_name: String, config: JsValue) { - self.scripts.set_script_config(script_name, config); - } -} - -impl Game { - pub fn add_script(&mut self, script: Box) { - self.scripts.add_script(script); - } } #[derive(Clone, Serialize, Deserialize)] @@ -437,11 +411,11 @@ mod tests { game.update(); let move_script = Box::new(MoveScript::default()); - game.add_script(move_script); + game.scripts.add_script(move_script); game.update(); let velocity_script = Box::new(VelocityScript::default()); - game.add_script(velocity_script); + game.scripts.add_script(velocity_script); game.update(); game.action_holder.add_handler(MoveAction::make_handler()); diff --git a/lib/world/src/entities/game_script.rs b/lib/world/src/entities/game_script.rs index 4fe62dc..9b57b9e 100644 --- a/lib/world/src/entities/game_script.rs +++ b/lib/world/src/entities/game_script.rs @@ -1,12 +1,26 @@ use super::entities::{EntityQuery, EntityQueryResults}; use super::entity::EntityId; -use super::game::{GameDiff, GameSchedule}; +use super::game::GameSchedule; use crate::chunk::{chunk_fetcher::ChunkFetcher, ChunkId}; +use crate::entities::fireball::FireballScript; +use crate::entities::player_gravity_script::GravityScript; +use crate::entities::player_move_script::MoveScript; +use crate::entities::sandbox::SandBoxGScript; +use crate::entities::velocity_script::VelocityScript; +use crate::utils::js_log; use crate::world::World; +use js_sys::JSON; +use lazy_static::lazy_static; +use serde::ser::SerializeStruct; +use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; +use serde_json::{from_value, to_value, Value}; use std::any::Any; +use std::cell::RefCell; +use std::collections::HashMap; use std::fmt::Debug; +use std::sync::Mutex; use wasm_bindgen::prelude::wasm_bindgen; -use wasm_bindgen::JsValue; +use wasm_bindgen::{JsCast, JsValue}; pub trait GameScript: Any + Debug { fn update( @@ -41,6 +55,14 @@ pub trait GameScript: Any + Debug { fn on_entity_update(&self, _entity_id: EntityId) { // Default implementation does nothing } + + fn get_state_wasm(&self) -> JsValue { + JsValue::null() + } + + fn set_state_wasm(&mut self, _val: JsValue) { + // no-op + } } impl std::error::Error for ScriptNotFoundError {} @@ -67,11 +89,108 @@ pub struct GameScripts { scripts: Vec>, } +impl Clone for GameScripts { + fn clone(&self) -> Self { + let serial = to_value(self).unwrap(); + + from_value(serial).unwrap() + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct GameScriptSerial { + name: String, + config: String, +} + +impl Serialize for GameScripts { + fn serialize(&self, serializer: S) -> Result { + let mut s = serializer.serialize_struct("GameScripts", 1)?; + + let scripts: Vec<_> = self + .scripts + .iter() + .map(|s| { + let name = s.get_name(); + let js_config = s.get_config(); + let config: String = JSON::stringify(&js_config).unwrap().into(); + js_log(&format!( + "Serialize script: {:?} {:?} {:?}", + name, js_config, config + )); + + return GameScriptSerial { name, config }; + }) + .collect(); + + s.serialize_field("scripts", &scripts); + s.end() + } +} + +impl<'de> Deserialize<'de> for GameScripts { + fn deserialize>(deserializer: D) -> Result { + #[derive(Deserialize)] + struct GameScriptHelper { + scripts: Vec, + } + + let GameScriptHelper { scripts } = GameScriptHelper::deserialize(deserializer)?; + + js_log(&format!("All Scripts: {:?}", scripts)); + + let mut game_scripts = GameScripts { scripts: vec![] }; + + let registry = SCRIPT_REGISTRY.lock().unwrap(); + for key in registry.keys() { + js_log(&format!("regkey: {:?}", key)); + } + for item in scripts { + let js_config: JsValue = JSON::parse(&item.config).unwrap(); + + js_log(&format!("value: {:?}", js_config)); + + let deser = registry + .get(item.name.as_str()) + .ok_or_else(|| de::Error::custom(format!("Unknown game script: {}", item.name)))?; + + let mut val = deser(); + + val.set_config(js_config); + + game_scripts.scripts.push(val); + } + + Ok(game_scripts) + } +} + impl GameScripts { pub fn add_script(&mut self, script: Box) { self.scripts.push(script); } + pub fn get_script_by_name(&self, script_name: String) -> Option<&Box> { + for script in self.scripts.iter() { + if script.get_name() == script_name { + return Some(script); + } + } + None + } + + pub fn get_script_by_name_mut( + &mut self, + script_name: String, + ) -> Option<&mut Box> { + for script in self.scripts.iter_mut() { + if script.get_name() == script_name { + return Some(script); + } + } + None + } + pub fn get_scripts_mut(&mut self) -> &mut Vec> { &mut self.scripts } @@ -79,6 +198,51 @@ impl GameScripts { pub fn iter_mut(&mut self) -> std::slice::IterMut> { self.scripts.iter_mut() } +} + +#[wasm_bindgen] +impl GameScripts { + pub fn ensure_script(&mut self, script_name: String) -> () { + let existing = self.get_script_by_name(script_name.clone()); + if existing.is_some() { + () + } + let registry = SCRIPT_REGISTRY.lock().unwrap(); + + let builder = registry.get(&script_name); + if let Some(builder_found) = builder { + let game_script = builder_found(); + js_log("Found rust script"); + self.add_script(game_script); + return; + } + + let binding = WASM_SCRIPT_REGISTERY.take(); + for key in binding.keys() { + js_log(&format!("Keys {:?}", key)); + } + let wasm_builder = binding.get(&script_name); + if let Some(wasm_found) = wasm_builder { + js_log("Found js script"); + let script = wasm_found(); + self.add_script(script); + return; + } + + panic!("Script {:?} not found in registry", script_name); + } + + pub fn get_script_state(&mut self, script_name: String) -> JsValue { + let script = self.get_script_by_name_mut(script_name.clone()).unwrap(); + + script.get_state_wasm() + } + + pub fn set_script_state(&mut self, script_name: String, state: JsValue) { + let script = self.get_script_by_name_mut(script_name.clone()).unwrap(); + + script.set_state_wasm(state); + } pub fn get_all_script_names(&self) -> Vec { self.scripts @@ -106,6 +270,13 @@ impl GameScripts { } } +#[wasm_bindgen] +impl GameScripts { + pub fn to_js(&self) -> Result { + serde_wasm_bindgen::to_value(self) + } +} + #[wasm_bindgen] #[derive(Debug)] pub struct WasmGameScript { @@ -174,4 +345,75 @@ impl GameScript for WasmGameScript { .call1(&self.context, &val) .unwrap(); } + + fn get_state_wasm(&self) -> JsValue { + self.context.clone() + } + + fn set_state_wasm(&mut self, val: JsValue) { + self.context = val; + } +} + +type ScriptDeserializer = fn() -> Box; + +lazy_static! { + pub static ref SCRIPT_REGISTRY: Mutex> = { + let mut map = HashMap::new(); + fn register( map: &mut HashMap, ) { + fn deser() -> Box { + Box::new(T::default()) + } + let key = T::default().get_name(); + map.insert(key, deser::); + } + // Register all the scripts! + register::(&mut map); + register::(&mut map); + register::(&mut map); + register::(&mut map); + register::(&mut map); + Mutex::new(map) + }; +} + +thread_local! { + static WASM_SCRIPT_REGISTERY: RefCell> = + RefCell::new(HashMap::new()); +} + +thread_local! { + static WASM_SCRIPT_DEFAULT_CONFIG_REGISTERY: RefCell> = + RefCell::new(HashMap::new()); +} + +type WasmScriptDeserializer = Box Box>; + +#[wasm_bindgen] +pub fn add_script_to_registry(game_script_class: JsValue) { + let name = js_sys::Reflect::get(&game_script_class, &JsValue::from("name")) + .unwrap() + .as_string() + .unwrap(); + + let factory: js_sys::Function = game_script_class + .dyn_into() + .expect("argument must be a class/constructor Function"); + + let des: WasmScriptDeserializer = Box::new(move || -> Box { + let args = { + let a = js_sys::Array::new(); + a + }; + + let js_obj = + js_sys::Reflect::construct(&factory, &args).expect("constructing script failed"); + + let js_game_script = WasmGameScript::make(js_obj); + Box::new(js_game_script) + }); + + WASM_SCRIPT_REGISTERY.with(|reg| { + reg.borrow_mut().insert(name.clone(), des); + }); } diff --git a/lib/world/src/entities/player_gravity_script.rs b/lib/world/src/entities/player_gravity_script.rs index 2dc0a1c..0ff9930 100644 --- a/lib/world/src/entities/player_gravity_script.rs +++ b/lib/world/src/entities/player_gravity_script.rs @@ -18,7 +18,7 @@ pub struct GravityData { impl_component!(GravityData); -#[derive(Debug)] +#[derive(Debug, Serialize, Deserialize)] pub struct GravityScript { gravity: f32, } diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs index b74344a..043b7b9 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/entities/player_move_script.rs @@ -50,7 +50,7 @@ impl EntityActionHandler for MoveAction { pub type MovingDirection = Option; impl_component!(MovingDirection); -#[derive(Debug)] +#[derive(Debug, Serialize, Deserialize)] pub struct MoveScript { pub max_speed: f32, } @@ -67,10 +67,7 @@ impl GameScript for MoveScript { } fn get_config(&self) -> JsValue { - let config = serde_json::json!({ - "max_speed": self.max_speed, - }); - serde_wasm_bindgen::to_value(&config).unwrap() + serde_wasm_bindgen::to_value(&self).unwrap() } fn set_config(&mut self, config: JsValue) { diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index b620e84..b8e8ffc 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -118,11 +118,4 @@ pub mod wasm { Ok(serialized) } } - - #[wasm_bindgen] - impl Game { - pub fn add_sandbox_wasm(&mut self, sandbox_game_script: SandBoxGScript) { - self.add_script(Box::new(sandbox_game_script)); - } - } } From d7c947d52a00573263eca0875d7e40ccfa552702 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Mon, 8 Sep 2025 00:10:56 +0000 Subject: [PATCH 42/61] The scripts serialize and deserialize well now --- .../src/components/ClientGameView.tsx | 13 +- .../src/components/GameConfigMenu.tsx | 22 +- .../src/game-scripts/canvas-gscript.ts | 14 +- apps/web-client/src/runner.ts | 16 +- .../src/services/sp-games-service.ts | 23 +- apps/web-client/src/utils.ts | 8 + lib/engine/src/wrappers.ts | 13 +- lib/world/src/entities/fireball.rs | 6 + lib/world/src/entities/game.rs | 27 ++- lib/world/src/entities/game_script.rs | 215 +++++++++++------- .../src/entities/player_gravity_script.rs | 6 + lib/world/src/entities/player_move_script.rs | 6 + lib/world/src/entities/sandbox.rs | 9 +- lib/world/src/entities/velocity_script.rs | 6 + 14 files changed, 259 insertions(+), 125 deletions(-) diff --git a/apps/web-client/src/components/ClientGameView.tsx b/apps/web-client/src/components/ClientGameView.tsx index 4216ea5..63ca734 100644 --- a/apps/web-client/src/components/ClientGameView.tsx +++ b/apps/web-client/src/components/ClientGameView.tsx @@ -2,6 +2,9 @@ import React, { useEffect, useState } from "react"; import { useParams } from "react-router-dom"; import { run, spGameService } from "../runner"; import { GameConfigMenu } from "./GameConfigMenu"; +import { GameRendererGameScript } from "../game-scripts/canvas-gscript"; + +GameRendererGameScript.register(); export function ClientGameView() { const { gameId } = useParams<{ gameId: string }>(); @@ -15,18 +18,14 @@ export function ClientGameView() { } useEffect(() => { - // Check if game exists when component mounts - spGameService.getGame(gameId).then((game) => { + spGameService.hasGame(gameId).then((gameExists) => { setIsLoading(false); - if (game) { - setGameExists(true); - // Auto-join existing game + setGameExists(gameExists); + if (gameExists) { run(gameId).then(() => { // Access the global game instance setGameInstance((window as any).game?.game); }); - } else { - setGameExists(false); } }); }, [gameId]); diff --git a/apps/web-client/src/components/GameConfigMenu.tsx b/apps/web-client/src/components/GameConfigMenu.tsx index a433e4a..a8e52c6 100644 --- a/apps/web-client/src/components/GameConfigMenu.tsx +++ b/apps/web-client/src/components/GameConfigMenu.tsx @@ -24,20 +24,20 @@ export function GameConfigMenu({ game, isOpen, onClose }: GameConfigMenuProps) { [scriptName: string]: ScriptConfig; }>({}); const [chunkFetcherConfig, setChunkFetcherConfig] = - useState({}); + useState(game.chunk_fetcher.get_config()); const [activeTab, setActiveTab] = useState(""); useEffect(() => { if (isOpen && game) { // Get all script names - const names = game.get_all_script_names_wasm(); + const names = game.getScriptNames(); setScriptNames(names); // Get configs for all scripts const configs: { [scriptName: string]: ScriptConfig } = {}; names.forEach((name) => { try { - const config: Map = game.get_script_config_wasm(name); + const config: Map = game.getScriptConfig(name); console.log("Config", name, config); if (config) { if (config instanceof Map) { @@ -94,7 +94,7 @@ export function GameConfigMenu({ game, isOpen, onClose }: GameConfigMenuProps) { // Update the game script config try { - game.set_script_config_wasm(scriptName, updatedConfigs[scriptName]); + game.setScriptConfig(scriptName, updatedConfigs[scriptName]); } catch (error) { console.error(`Failed to update config for script ${scriptName}:`, error); } @@ -251,8 +251,8 @@ export function GameConfigMenu({ game, isOpen, onClose }: GameConfigMenuProps) {
{scriptNames.length === 0 && - chunkFetcherConfig.json && - Object.keys(chunkFetcherConfig.json).length === 0 ? ( + chunkFetcherConfig.json && + Object.keys(chunkFetcherConfig.json).length === 0 ? (
No configuration options found
@@ -262,10 +262,11 @@ export function GameConfigMenu({ game, isOpen, onClose }: GameConfigMenuProps) { {/* Chunk Fetcher Tab */} @@ -275,10 +276,11 @@ export function GameConfigMenu({ game, isOpen, onClose }: GameConfigMenuProps) { diff --git a/apps/web-client/src/game-scripts/canvas-gscript.ts b/apps/web-client/src/game-scripts/canvas-gscript.ts index 6b1ef8f..d65a4d0 100644 --- a/apps/web-client/src/game-scripts/canvas-gscript.ts +++ b/apps/web-client/src/game-scripts/canvas-gscript.ts @@ -29,7 +29,7 @@ import type { import { mat4 } from "gl-matrix"; import VertexShader from "../../shaders/vertex.glsl?raw"; import FragmentShader from "../../shaders/fragment.glsl?raw"; -import { getEleOrError } from "../utils"; +import { getEle, getEleOrError } from "../utils"; const WebGlLayer = (window as any).XRWebGLLayer as typeof XRWebGLLayer; @@ -81,7 +81,6 @@ export class GameRendererGameScript { // This is called by the rust side getConfig(): Config { - console.log("CanvasGameScript: getConfig", this.config); return this.config; } @@ -101,7 +100,7 @@ export class GameRenderer { public perspective: PlayerPerspective = PlayerPerspective.FirstPerson; public eCanvas = getEleOrError("glCanvas"); - public eWebxrButton = getEleOrError("webxrButton"); + public eWebxrButton = getEle("webxrButton"); public gl: WebGLRenderingContext; public program: { program: WebGLProgram; @@ -123,7 +122,7 @@ export class GameRenderer { public pastDeltas: number[] = []; private getGameScript(): GameRendererGameScript { - return this.game.game.scripts.get_script_state( + return this.game.game.getScriptState( GameRendererGameScript.name ) as GameRendererGameScript; } @@ -298,10 +297,7 @@ export class GameRenderer { gameScript.updatedChunks.clear(); gameScript.updatedEntities.clear(); - this.game.game.scripts.set_script_config( - GameRendererGameScript.name, - gameScript - ); + this.game.game.setScriptState(GameRendererGameScript.name, gameScript); } getFilter(camera: Camera): Vector3D { @@ -630,7 +626,7 @@ export class GameRenderer { console.log("XR session", this.webXrSession); this.webXrSession.addEventListener("end", () => { - this.eWebxrButton.style.display = "none"; + this.eWebxrButton!.style.display = "none"; }); this.webXrSession.addEventListener("inputsourceschange", () => { diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index a2a4114..4baae26 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -17,7 +17,7 @@ export async function run(id?: string) { const game = id ? await spGameService.getGame(id) : spGameService.newGame(); - console.log("Game", game); + console.log("Game Created", game); (window as any).game = game; @@ -35,15 +35,13 @@ export async function run(id?: string) { console.log("Ents", ents); // ===== Game Scripts ===== - game.game.scripts.ensure_script("sandbox"); - game.game.scripts.ensure_script("game-renderer"); - - const gameRenderer = new GameRenderer( - game, - mainPlayerUid, - gameRenderGameScript - ); + console.log("Ensuring scripts"); + game.game.ensureScript(SandBoxGScript.name()); + console.log("Sandbox done"); + game.game.ensureScript(GameRendererGameScript.name); + console.log("Game Renderer done"); + const gameRenderer = new GameRenderer(game, mainPlayerUid); const hudRender = new HudGScript(game.game, gameRenderer, mainPlayerUid); const onAction = (action: EntityActionDto) => { diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index ecb7242..97394d6 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -78,6 +78,27 @@ export class ClientDbGamesService { }); } + async hasGame(gameId: string): Promise { + return new Promise((resolve, reject) => { + const transaction = this.db.transaction( + [ClientDbGamesService.WORLDS_OBS], + "readonly" + ); + const objectStore = transaction.objectStore( + ClientDbGamesService.WORLDS_OBS + ); + + // `getKey` is supported in modern browsers, lighter than `get` + const request = objectStore.getKey(gameId); + + request.onsuccess = (event: any) => { + resolve(event.target.result !== undefined); // key exists if result is not undefined + }; + + request.onerror = () => reject(request.error); + }); + } + async getGame(gameId: string): Promise { const foundGame: ISerializedGame | null = await new Promise((resolve) => { const transaction = this.db.transaction([ @@ -118,7 +139,7 @@ export class ClientDbGamesService { entities: data.game.entities.to_js(), world: data.game.world.serialize_wasm(), chunkFetcher: data.game.chunk_fetcher.get_config(), - scripts: data.game.scripts.to_js(), + scripts: data.game.getScriptsJs(), }; console.log("Saving game", serializedGame); diff --git a/apps/web-client/src/utils.ts b/apps/web-client/src/utils.ts index 884a624..f2b7e21 100644 --- a/apps/web-client/src/utils.ts +++ b/apps/web-client/src/utils.ts @@ -4,6 +4,14 @@ export function getEleOrError(id: string): T { return ele as T; } +export function getEle(id: string): T | undefined { + const ele = document.getElementById(id); + if (!ele) { + return undefined; + } + return ele as T; +} + // export function hideElement(e: HTMLElement) { // e.style.display = "none"; // } diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts index d06dc57..e5b3302 100644 --- a/lib/engine/src/wrappers.ts +++ b/lib/engine/src/wrappers.ts @@ -16,6 +16,7 @@ import { RotateAction, MoveAction, WasmGameScript, + GameScripts, } from "@craft/rust-world"; export interface ISerializedAction { @@ -38,6 +39,7 @@ export interface ISerializedGame { world: World; terrainGen: TerrainGenerator; sandbox: SandBoxGScript; + scripts: ISerializedScript; } export interface IGameMetadata { @@ -45,14 +47,23 @@ export interface IGameMetadata { name: string; } +export interface ISerializedScript { + scripts: Array<{ + config: string; + name: string; + }>; +} + export const serializedGameToGame = (serializedGame: ISerializedGame): Game => { const world = World.deserialize_wasm(serializedGame.world); const entityHolder = Entities.from_js(serializedGame.entities); + const scripts = GameScripts.fromJs(serializedGame.scripts); const game = Game.build( serializedGame.gameId, serializedGame.name, world, - entityHolder + entityHolder, + scripts ); return game; }; diff --git a/lib/world/src/entities/fireball.rs b/lib/world/src/entities/fireball.rs index 7d043b4..9b64c98 100644 --- a/lib/world/src/entities/fireball.rs +++ b/lib/world/src/entities/fireball.rs @@ -58,6 +58,12 @@ impl Fireball { #[derive(Debug, Default)] pub struct FireballScript {} +impl FireballScript { + pub fn name() -> String { + "fireball".to_string() + } +} + impl GameScript for FireballScript { fn get_name(&self) -> String { "fireball".to_string() diff --git a/lib/world/src/entities/game.rs b/lib/world/src/entities/game.rs index cd71322..5f8a6c2 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/entities/game.rs @@ -20,6 +20,7 @@ use crate::{ velocity_script::VelocityScript, }, positions::ChunkPos, + utils::js_log, world::{world_block::WorldBlock, World}, }; use serde::{Deserialize, Serialize}; @@ -34,6 +35,7 @@ pub struct Game { pub world: World, pub entities: Entities, pub chunk_fetcher: ChunkFetcher, + #[wasm_bindgen(skip)] pub scripts: GameScripts, schedule: GameSchedule, action_holder: EntityActionHolder, @@ -42,10 +44,11 @@ pub struct Game { #[wasm_bindgen] impl Game { fn add_default_scripts(&mut self) { - self.scripts.add_script(Box::new(MoveScript::default())); - self.scripts.add_script(Box::new(VelocityScript::default())); - self.scripts.add_script(Box::new(GravityScript::default())); - self.scripts.add_script(Box::new(FireballScript::default())); + js_log("Adding Default Scripts"); + self.scripts.ensure_script(MoveScript::name()); + self.scripts.ensure_script(VelocityScript::name()); + self.scripts.ensure_script(GravityScript::name()); + self.scripts.ensure_script(FireballScript::name()); self.action_holder.add_handler(MoveAction::make_handler()); self.action_holder.add_handler(JumpAction::make_handler()); @@ -77,17 +80,29 @@ impl Game { g } - pub fn build(id: String, name: String, world: World, entities: Entities) -> Game { + pub fn build( + id: String, + name: String, + world: World, + entities: Entities, + scripts: GameScripts, + ) -> Game { + console_error_panic_hook::set_once(); + js_log("Building the game"); let mut g = Game { id, name, world, entities, + scripts, chunk_fetcher: ChunkFetcher::new_wasm(TerrainGenerator::default()), - scripts: GameScripts::default(), schedule: GameSchedule::empty(), action_holder: EntityActionHolder::default(), }; + js_log(&format!( + "Here is the game scripts: {:?}", + g.scripts.get_all_script_names() + )); g.add_default_scripts(); g } diff --git a/lib/world/src/entities/game_script.rs b/lib/world/src/entities/game_script.rs index 9b57b9e..f30ec99 100644 --- a/lib/world/src/entities/game_script.rs +++ b/lib/world/src/entities/game_script.rs @@ -3,6 +3,7 @@ use super::entity::EntityId; use super::game::GameSchedule; use crate::chunk::{chunk_fetcher::ChunkFetcher, ChunkId}; use crate::entities::fireball::FireballScript; +use crate::entities::game::Game; use crate::entities::player_gravity_script::GravityScript; use crate::entities::player_move_script::MoveScript; use crate::entities::sandbox::SandBoxGScript; @@ -13,7 +14,7 @@ use js_sys::JSON; use lazy_static::lazy_static; use serde::ser::SerializeStruct; use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; -use serde_json::{from_value, to_value, Value}; +use serde_json::{from_value, to_value}; use std::any::Any; use std::cell::RefCell; use std::collections::HashMap; @@ -91,6 +92,7 @@ pub struct GameScripts { impl Clone for GameScripts { fn clone(&self) -> Self { + js_log("cloning"); let serial = to_value(self).unwrap(); from_value(serial).unwrap() @@ -137,28 +139,19 @@ impl<'de> Deserialize<'de> for GameScripts { let GameScriptHelper { scripts } = GameScriptHelper::deserialize(deserializer)?; - js_log(&format!("All Scripts: {:?}", scripts)); - let mut game_scripts = GameScripts { scripts: vec![] }; - let registry = SCRIPT_REGISTRY.lock().unwrap(); - for key in registry.keys() { - js_log(&format!("regkey: {:?}", key)); - } for item in scripts { let js_config: JsValue = JSON::parse(&item.config).unwrap(); - js_log(&format!("value: {:?}", js_config)); - - let deser = registry - .get(item.name.as_str()) - .ok_or_else(|| de::Error::custom(format!("Unknown game script: {}", item.name)))?; - - let mut val = deser(); + js_log(&format!( + "Deserializing script {:?} with config {:?}", + item.name, js_config + )); - val.set_config(js_config); - - game_scripts.scripts.push(val); + let mut game_script = GameScripts::build_script_from_registry(item.name); + game_script.set_config(js_config); + game_scripts.add_script(game_script); } Ok(game_scripts) @@ -166,8 +159,30 @@ impl<'de> Deserialize<'de> for GameScripts { } impl GameScripts { + fn build_script_from_registry(script_name: String) -> Box { + if let Some(builder) = SCRIPT_REGISTRY.lock().unwrap().get(&script_name) { + return builder(); + } + + WASM_SCRIPT_REGISTERY.with(|reg| { + let map = reg.borrow(); + if let Some(builder) = map.get(&script_name) { + return (builder)(); + } + panic!("Script {:?} not found in registry", script_name); + }) + } + pub fn add_script(&mut self, script: Box) { - self.scripts.push(script); + js_log(&format!("Adding script {}", script.get_name())); + let name = script.get_name(); + if let Some(idx) = self.scripts.iter().position(|s| s.get_name() == name) { + js_log("Replacing exisiting"); + let _ = std::mem::replace(&mut self.scripts[idx], script); + } else { + js_log("Inserting new"); + self.scripts.push(script); + } } pub fn get_script_by_name(&self, script_name: String) -> Option<&Box> { @@ -198,48 +213,30 @@ impl GameScripts { pub fn iter_mut(&mut self) -> std::slice::IterMut> { self.scripts.iter_mut() } -} -#[wasm_bindgen] -impl GameScripts { pub fn ensure_script(&mut self, script_name: String) -> () { + js_log(&format!("Ensuring Script: {}", script_name)); let existing = self.get_script_by_name(script_name.clone()); if existing.is_some() { - () - } - let registry = SCRIPT_REGISTRY.lock().unwrap(); - - let builder = registry.get(&script_name); - if let Some(builder_found) = builder { - let game_script = builder_found(); - js_log("Found rust script"); - self.add_script(game_script); - return; + return (); } + let game_script = GameScripts::build_script_from_registry(script_name); - let binding = WASM_SCRIPT_REGISTERY.take(); - for key in binding.keys() { - js_log(&format!("Keys {:?}", key)); - } - let wasm_builder = binding.get(&script_name); - if let Some(wasm_found) = wasm_builder { - js_log("Found js script"); - let script = wasm_found(); - self.add_script(script); - return; - } - - panic!("Script {:?} not found in registry", script_name); + self.add_script(game_script); } - pub fn get_script_state(&mut self, script_name: String) -> JsValue { - let script = self.get_script_by_name_mut(script_name.clone()).unwrap(); + pub fn get_script_state(&self, script_name: String) -> JsValue { + let script = self + .get_script_by_name(script_name.clone()) + .expect(&format!("Can't find script {:?}", script_name)); script.get_state_wasm() } pub fn set_script_state(&mut self, script_name: String, state: JsValue) { - let script = self.get_script_by_name_mut(script_name.clone()).unwrap(); + let script = self + .get_script_by_name_mut(script_name.clone()) + .expect(&format!("Can't find script {:?}", script_name)); script.set_state_wasm(state); } @@ -268,12 +265,56 @@ impl GameScripts { } } } + + pub fn to_js(&self) -> Result { + serde_wasm_bindgen::to_value(self) + } } #[wasm_bindgen] impl GameScripts { - pub fn to_js(&self) -> Result { - serde_wasm_bindgen::to_value(self) + #[wasm_bindgen(js_name = "fromJs")] + pub fn from_js(value: JsValue) -> Result { + let entity_holder: GameScripts = serde_wasm_bindgen::from_value(value)?; + Ok(entity_holder) + } +} + +#[wasm_bindgen] +impl Game { + #[wasm_bindgen(js_name = "ensureScript")] + pub fn ensure_script(&mut self, script_name: String) { + self.scripts.ensure_script(script_name); + } + + #[wasm_bindgen(js_name = "getScriptsJs")] + pub fn get_scripts_js(&self) -> Result { + self.scripts.to_js() + } + + #[wasm_bindgen(js_name = "getScriptState")] + pub fn get_script_state(&self, script_name: String) -> JsValue { + self.scripts.get_script_state(script_name) + } + + #[wasm_bindgen(js_name = "setScriptState")] + pub fn set_script_state(&mut self, script_name: String, state: JsValue) { + self.scripts.set_script_state(script_name, state); + } + + #[wasm_bindgen(js_name = "getScriptConfig")] + pub fn get_script_config(&self, script_name: String) -> JsValue { + self.scripts.get_script_config(script_name) + } + + #[wasm_bindgen(js_name = "getScriptNames")] + pub fn get_all_script_names(&self) -> Vec { + self.scripts.get_all_script_names() + } + + #[wasm_bindgen(js_name = "setScriptConfig")] + pub fn set_script_config(&mut self, script_name: String, val: JsValue) { + self.scripts.set_script_config(script_name, val); } } @@ -290,22 +331,50 @@ pub struct WasmGameScript { #[wasm_bindgen] impl WasmGameScript { + pub fn get_name_from_class(js_class: &JsValue) -> String { + js_sys::Reflect::get(&js_class, &JsValue::from("name")) + .expect("Class should have a static name property") + .as_string() + .expect("Name should be a string") + } + #[wasm_bindgen(constructor)] - pub fn make(val: JsValue) -> WasmGameScript { - let on_chunk_update_jsfn = - js_sys::Reflect::get(&val, &JsValue::from("onChunkUpdate")).unwrap(); - let on_entity_update_jsfn = - js_sys::Reflect::get(&val, &JsValue::from("onEntityUpdate")).unwrap(); - let name = js_sys::Reflect::get(&val, &JsValue::from("name")).unwrap(); - let get_config_jsfn = js_sys::Reflect::get(&val, &JsValue::from("getConfig")).unwrap(); - let set_config_jsfn = js_sys::Reflect::get(&val, &JsValue::from("setConfig")).unwrap(); + pub fn make_from_class(js_class: &JsValue) -> WasmGameScript { + use js_sys::Reflect::{construct, get}; + use js_sys::{Array, Function}; + + let name = WasmGameScript::get_name_from_class(js_class); + + let factory: Function = js_class + .clone() + .dyn_into() + .expect("argument must be a class/constructor Function"); + + let args = Array::new(); + + let js_class_instance = construct(&factory, &args).expect("constructing script failed"); + + js_log(&format!( + "Making wasm game script from value {:?}", + js_class_instance + )); + + let on_chunk_update_jsfn = get(&js_class_instance, &JsValue::from("onChunkUpdate")) + .expect("Can't find method onChunkUpdate"); + let on_entity_update_jsfn = get(&js_class_instance, &JsValue::from("onEntityUpdate")) + .expect("can't find onEntityUpdate"); + let get_config_jsfn = + get(&js_class_instance, &JsValue::from("getConfig")).expect("can't find getConfig"); + let set_config_jsfn = + get(&js_class_instance, &JsValue::from("setConfig")).expect("can't find setConfig"); + WasmGameScript { - name: name.as_string().unwrap(), + name, on_chunk_update_jsfn: on_chunk_update_jsfn.into(), on_entity_update_jsfn: on_entity_update_jsfn.into(), get_config_jsfn: get_config_jsfn.into(), set_config_jsfn: set_config_jsfn.into(), - context: val, + context: js_class_instance, } } } @@ -382,34 +451,18 @@ thread_local! { RefCell::new(HashMap::new()); } -thread_local! { - static WASM_SCRIPT_DEFAULT_CONFIG_REGISTERY: RefCell> = - RefCell::new(HashMap::new()); -} - type WasmScriptDeserializer = Box Box>; #[wasm_bindgen] pub fn add_script_to_registry(game_script_class: JsValue) { - let name = js_sys::Reflect::get(&game_script_class, &JsValue::from("name")) - .unwrap() - .as_string() - .unwrap(); - - let factory: js_sys::Function = game_script_class - .dyn_into() - .expect("argument must be a class/constructor Function"); + js_log(&format!( + "Adding WASM script to registry{:?}", + game_script_class + )); + let name = WasmGameScript::get_name_from_class(&game_script_class); let des: WasmScriptDeserializer = Box::new(move || -> Box { - let args = { - let a = js_sys::Array::new(); - a - }; - - let js_obj = - js_sys::Reflect::construct(&factory, &args).expect("constructing script failed"); - - let js_game_script = WasmGameScript::make(js_obj); + let js_game_script = WasmGameScript::make_from_class(&game_script_class); Box::new(js_game_script) }); diff --git a/lib/world/src/entities/player_gravity_script.rs b/lib/world/src/entities/player_gravity_script.rs index 0ff9930..525b07f 100644 --- a/lib/world/src/entities/player_gravity_script.rs +++ b/lib/world/src/entities/player_gravity_script.rs @@ -29,6 +29,12 @@ impl Default for GravityScript { } } +impl GravityScript { + pub fn name() -> String { + "gravity".to_string() + } +} + impl GameScript for GravityScript { fn get_name(&self) -> String { "gravity".to_string() diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/entities/player_move_script.rs index 043b7b9..bf7b459 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/entities/player_move_script.rs @@ -55,6 +55,12 @@ pub struct MoveScript { pub max_speed: f32, } +impl MoveScript { + pub fn name() -> String { + "move".to_string() + } +} + impl Default for MoveScript { fn default() -> Self { Self { max_speed: 0.2 } diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/entities/sandbox.rs index b8e8ffc..ccb7e4f 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/entities/sandbox.rs @@ -17,6 +17,8 @@ pub trait RequestChunk: std::fmt::Debug { fn request_chunk(&self, chunk_pos: ChunkPos); } +static NAME: &'static str = "sandbox"; + #[derive(Debug, Serialize)] #[wasm_bindgen] pub struct SandBoxGScript { @@ -31,6 +33,11 @@ impl Default for SandBoxGScript { #[wasm_bindgen] impl SandBoxGScript { + #[wasm_bindgen(js_name = "name")] + pub fn get_name_wasm() -> String { + return NAME.to_string(); + } + pub fn get_chunks_around_player(&self, pos: &FineWorldPos) -> Vec { let mut poses = vec![]; @@ -49,7 +56,7 @@ impl SandBoxGScript { impl GameScript for SandBoxGScript { fn get_name(&self) -> String { - "sandbox".to_string() + NAME.to_string() } fn get_config(&self) -> JsValue { diff --git a/lib/world/src/entities/velocity_script.rs b/lib/world/src/entities/velocity_script.rs index aaa0861..cff308b 100644 --- a/lib/world/src/entities/velocity_script.rs +++ b/lib/world/src/entities/velocity_script.rs @@ -31,6 +31,12 @@ impl_component!(Forces); #[derive(Debug, Default)] pub struct VelocityScript {} +impl VelocityScript { + pub fn name() -> String { + "velocity".to_string() + } +} + impl GameScript for VelocityScript { fn get_name(&self) -> String { "velocity".to_string() From 1235d0320470f8625fad58ce7c2599526e6b68d8 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Mon, 8 Sep 2025 00:44:14 +0000 Subject: [PATCH 43/61] Updating ui --- apps/web-client/src/app.css | 20 ++++++++++ .../src/components/ClientGameView.tsx | 39 ++++++++++++------- .../src/components/ClientHomePage.tsx | 18 +++++---- .../src/components/GameConfigMenu.tsx | 2 +- .../src/renders/gameMenu.module.css | 3 +- .../web-client/src/renders/gameMenuRender.tsx | 2 + apps/web-client/src/runner.ts | 1 + 7 files changed, 61 insertions(+), 24 deletions(-) diff --git a/apps/web-client/src/app.css b/apps/web-client/src/app.css index 916f918..c6e08f4 100644 --- a/apps/web-client/src/app.css +++ b/apps/web-client/src/app.css @@ -252,6 +252,24 @@ h1 { animation: lift 0.1s linear; } +.option-button { + border: none; + width: 100%; + margin-bottom: 5px; + padding: 5px 10px; + font-size: 2em; + font-family: "Roboto", sans-serif; + cursor: pointer; + box-shadow: 8px 8px 10px grey; + border-radius: 10px; + background-color: white; +} + +.option-button:hover { + box-shadow: 15px 15px 10px grey; + animation: lift 0.1s linear; +} + .menu-button { border: none; background-color: white; @@ -347,3 +365,5 @@ h1 { font-weight: 550; font-family: "Roboto"; } + +/* Removed ClientGameView overlay and exit button styles; consolidated into in-game menu */ diff --git a/apps/web-client/src/components/ClientGameView.tsx b/apps/web-client/src/components/ClientGameView.tsx index 63ca734..99567a7 100644 --- a/apps/web-client/src/components/ClientGameView.tsx +++ b/apps/web-client/src/components/ClientGameView.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from "react"; -import { useParams } from "react-router-dom"; +import { useNavigate, useParams } from "react-router-dom"; import { run, spGameService } from "../runner"; import { GameConfigMenu } from "./GameConfigMenu"; import { GameRendererGameScript } from "../game-scripts/canvas-gscript"; @@ -12,6 +12,8 @@ export function ClientGameView() { const [gameExists, setGameExists] = useState(null); const [showConfigMenu, setShowConfigMenu] = useState(false); const [gameInstance, setGameInstance] = useState(null); + const [error, setError] = useState(null); + const navigate = useNavigate(); if (!gameId) { return
No game ID provided
; @@ -22,10 +24,15 @@ export function ClientGameView() { setIsLoading(false); setGameExists(gameExists); if (gameExists) { - run(gameId).then(() => { - // Access the global game instance - setGameInstance((window as any).game?.game); - }); + run(gameId) + .then(() => { + // Access the global game instance + setGameInstance((window as any).game?.game); + }) + .catch((err) => { + console.error(err); + setError(err); + }); } }); }, [gameId]); @@ -44,15 +51,6 @@ export function ClientGameView() { }; }, [showConfigMenu, gameExists]); - const handleConfigSubmit = () => { - // Create and join new game with config - run(gameId).then(() => { - // Access the global game instance - setGameInstance((window as any).game?.game); - setGameExists(true); - }); - }; - if (isLoading) { return
Loading...
; } @@ -61,6 +59,19 @@ export function ClientGameView() { return
Game does not exist
; } + if (error) { + return ( +
+ {" "} + There was an error, Check the console for more details:{" "} + {JSON.stringify(error)}
+ +
+ ); + } + return (

Local Games

-
+
{games.length > 0 && games.map((game) => ( -
- -
+ ))} {games.length === 0 &&

No games available

} - +
); diff --git a/apps/web-client/src/components/GameConfigMenu.tsx b/apps/web-client/src/components/GameConfigMenu.tsx index a8e52c6..daeffc6 100644 --- a/apps/web-client/src/components/GameConfigMenu.tsx +++ b/apps/web-client/src/components/GameConfigMenu.tsx @@ -236,7 +236,7 @@ export function GameConfigMenu({ game, isOpen, onClose }: GameConfigMenuProps) { return (
-
+

Game Configuration diff --git a/apps/web-client/src/renders/gameMenu.module.css b/apps/web-client/src/renders/gameMenu.module.css index 6eda754..4db521e 100644 --- a/apps/web-client/src/renders/gameMenu.module.css +++ b/apps/web-client/src/renders/gameMenu.module.css @@ -21,7 +21,7 @@ border: 2px solid black; .container { padding: 30px; - flex: 1; + flex: 1; width: 100%; height: 100%; } @@ -43,4 +43,3 @@ border-radius: 0px; box-shadow: none; background-color: darkred; } - diff --git a/apps/web-client/src/renders/gameMenuRender.tsx b/apps/web-client/src/renders/gameMenuRender.tsx index a158228..eea9f27 100644 --- a/apps/web-client/src/renders/gameMenuRender.tsx +++ b/apps/web-client/src/renders/gameMenuRender.tsx @@ -66,6 +66,8 @@ export const GameMenu = (props: { game: Game }) => { ); + + // const gameScriptSections = game // .getScriptActions() // .map((s: any, i: number) => { diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts index 4baae26..0476619 100644 --- a/apps/web-client/src/runner.ts +++ b/apps/web-client/src/runner.ts @@ -44,6 +44,7 @@ export async function run(id?: string) { const gameRenderer = new GameRenderer(game, mainPlayerUid); const hudRender = new HudGScript(game.game, gameRenderer, mainPlayerUid); + const onAction = (action: EntityActionDto) => { game.game.handle_action_wasm(action); }; From 1fffc27fd4aa58e661d9014692d6435bbe620386 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sat, 13 Sep 2025 16:05:19 +0000 Subject: [PATCH 44/61] Better menu UI --- DEVLOG.md | 12 + apps/web-client/index.html | 59 +-- apps/web-client/src/app.css | 368 +----------------- .../src/components/ClientGameView.tsx | 23 +- .../src/components/ClientHomePage.tsx | 19 +- .../src/components/GameConfigMenu.tsx | 156 +++++--- apps/web-client/src/components/HomePage.tsx | 15 +- apps/web-client/src/components/ui/Buttons.tsx | 36 ++ apps/web-client/src/components/ui/Inputs.tsx | 57 +++ .../keyboardPlayerController.ts | 5 +- .../src/game-scripts/basic-gscript.ts | 4 +- apps/web-client/src/renders/chunkRender.ts | 2 +- .../game-renderer.ts} | 10 +- .../src/renders/gameMenu.module.css | 45 --- .../web-client/src/renders/gameMenuRender.tsx | 150 ------- .../hudRender.ts => renders/hud-renderer.ts} | 2 +- apps/web-client/src/renders/playerRender.ts | 2 +- apps/web-client/src/renders/renderer.ts | 2 +- apps/web-client/src/renders/sphereRender.ts | 2 +- apps/web-client/src/runner.ts | 18 +- .../src/services/mp-games-service.ts | 2 +- 21 files changed, 281 insertions(+), 708 deletions(-) create mode 100644 apps/web-client/src/components/ui/Buttons.tsx create mode 100644 apps/web-client/src/components/ui/Inputs.tsx rename apps/web-client/src/{game-scripts/canvas-gscript.ts => renders/game-renderer.ts} (98%) delete mode 100644 apps/web-client/src/renders/gameMenu.module.css delete mode 100644 apps/web-client/src/renders/gameMenuRender.tsx rename apps/web-client/src/{game-scripts/hudRender.ts => renders/hud-renderer.ts} (98%) diff --git a/DEVLOG.md b/DEVLOG.md index b4ca88f..6cc2411 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,3 +1,15 @@ +# 09_13_25 + +I need to get the PR out, here are the remaining things to do +- Ensure the game scripts thing works +- Get mobile working +- Battle Test the server +- Add a single new fun game script: Falling blocks, the world blocks start falling and you have to jump to stay as high as possilbe + +Then deploy this! + + + # 08_30_25 It's been a bit but I'm back. I've mostly been working on getting scripts to be serialzied. It is hard to get the wasm scripts to live in rust. diff --git a/apps/web-client/index.html b/apps/web-client/index.html index 8e5936b..769dcb2 100644 --- a/apps/web-client/index.html +++ b/apps/web-client/index.html @@ -4,50 +4,55 @@ - +
+ -
+ +

- navigate("/client")}>Play Local - navigate("/server")}>Play Online + navigate("/client")}> + Play Local + + navigate("/server")}> + Play Online +
); diff --git a/apps/web-client/src/elements.ts b/apps/web-client/src/elements.ts deleted file mode 100644 index a4877be..0000000 --- a/apps/web-client/src/elements.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { getEleOrError } from "./utils"; - -// export const ePlayLocalButton = getEleOrError("playLocalButton"); -// export const ePlayOnlineButton = getEleOrError("playOnlineButton"); -// export const eStartMenu = getEleOrError("startMenu"); -// export const eGameTypeScreen = getEleOrError("pickGameTypeScreen"); -// export const ePickWorldScreen = getEleOrError("pickWorldScreen"); -// export const eBackButton = getEleOrError("backButton"); -// export const eWorldOptionsScreen = getEleOrError("worldOptionsScreen"); -// export const eConfigForm = getEleOrError("configForm"); -// export const eConfigFormExtra = getEleOrError("configFormExtra"); -// export const eConfigFormStartButton = getEleOrError( -// "configFormStartButton" -// ); -// export const eLoadingScreen = getEleOrError("loadingScreen"); -// export const eLoadingScreenMsg = getEleOrError("loadingScreenMsg"); diff --git a/apps/web-client/src/renders/chunkRender.ts b/apps/web-client/src/renders/chunk-render.ts similarity index 83% rename from apps/web-client/src/renders/chunkRender.ts rename to apps/web-client/src/renders/chunk-render.ts index 4f9130f..c4dc853 100644 --- a/apps/web-client/src/renders/chunkRender.ts +++ b/apps/web-client/src/renders/chunk-render.ts @@ -1,7 +1,14 @@ import { Renderer, RenderData } from "./renderer"; -import { Camera, GameWrapper, getBlockData, Vector3D } from "@craft/engine"; -import TextureMapper from "../textureMapper"; -import { BlockShape, BlockType, ChunkPos, WorldPos } from "@craft/rust-world"; +import { Camera, getBlockData, Vector3D } from "@craft/engine"; +import TextureMapper from "../services/texture-mapping-service"; +import { + BlockShape, + BlockType, + ChunkPos, + Game, + InnerChunkPos, + WorldPos, +} from "@craft/rust-world"; import ShapeBuilder from "../services/shape-builder"; import { GameRenderer } from "./game-renderer"; @@ -10,8 +17,8 @@ export class ChunkRenderer extends Renderer { constructor( public gameRenderer: GameRenderer, - public chunkId: number, - public game: GameWrapper + public chunkId: bigint, + public game: Game ) { super(gameRenderer); this.setActiveTexture(gameRenderer.textureAtlas); @@ -19,11 +26,11 @@ export class ChunkRenderer extends Renderer { } get worldPos(): WorldPos { - return this.game.game.chunkIdToWorldPos(BigInt(this.chunkId)); + return this.chunkPos.to_world_pos(); } get chunkPos(): ChunkPos { - return this.game.game.chunkIdToChunkPos(BigInt(this.chunkId)); + return ChunkPos.from_id(this.chunkId); } render(camera: Camera, trans?: boolean): void { @@ -49,7 +56,7 @@ export class ChunkRenderer extends Renderer { // console.log("Getting Buffer Data"); const start = performance.now(); - const chunkMeshEntries = this.game.game.getChunkMeshByChunkId( + const chunkMeshEntries = this.game.getChunkMeshByChunkId( BigInt(this.chunkId) ); const end = performance.now(); @@ -69,12 +76,11 @@ export class ChunkRenderer extends Renderer { const start2 = performance.now(); chunkMeshEntries.forEach(({ index, directions }) => { - const cubeWorldPos = this.game.game.chunkIndexToWorldPos( - index, - this.chunkPos - ); + const cubeWorldPos = InnerChunkPos.make_from_chunk_index( + index + ).to_world_pos(this.chunkPos); - const blockType = this.game.game.getBlockType(cubeWorldPos); + const blockType = this.game.getBlockType(cubeWorldPos); const faces = directions.to_array(); if (blockType === BlockType.Void) return; diff --git a/apps/web-client/src/renders/cubeRender.ts b/apps/web-client/src/renders/cube-render.ts similarity index 92% rename from apps/web-client/src/renders/cubeRender.ts rename to apps/web-client/src/renders/cube-render.ts index fc5107e..5ab93de 100644 --- a/apps/web-client/src/renders/cubeRender.ts +++ b/apps/web-client/src/renders/cube-render.ts @@ -1,6 +1,6 @@ import { RenderData, Renderer } from "./renderer"; import { Camera, Entity, IDim } from "@craft/engine"; -import TextureMapper from "../textureMapper"; +import TextureMapper from "../services/texture-mapping-service"; import ShapeBuilder from "../services/shape-builder"; import { WebGlGScript } from "../game-scripts/webgl-gscript"; diff --git a/apps/web-client/src/renders/game-renderer.ts b/apps/web-client/src/renders/game-renderer.ts index 0bde0da..20d373e 100644 --- a/apps/web-client/src/renders/game-renderer.ts +++ b/apps/web-client/src/renders/game-renderer.ts @@ -1,6 +1,5 @@ import { Camera, - GameWrapper, makeCameraForPlayer, makeThirdPersonBackCamera, makeThirdPersonFrontCamera, @@ -9,17 +8,19 @@ import { Vector3D, } from "@craft/engine"; import { Renderer } from "./renderer"; -import { ChunkRenderer } from "./chunkRender"; +import { ChunkRenderer } from "./chunk-render"; import { add_script_to_registry, BlockType, + ChunkPos, Entity, Fireball, + Game, Player, WorldPos, } from "@craft/rust-world"; -import { PlayerRenderer } from "./playerRender"; -import { SphereRenderer } from "./sphereRender"; +import { PlayerRenderer } from "./player-render"; +import { SphereRenderer } from "./sphere-render"; import type { Navigator, XRSession, @@ -97,7 +98,7 @@ GameRendererGameScript.register(); export class GameRenderer { private renderers: Renderer[] = []; private entityRenderers: Map = new Map(); - private chunkRenderers: Map = new Map(); + private chunkRenderers: Map = new Map(); public perspective: PlayerPerspective = PlayerPerspective.FirstPerson; public eCanvas = getEleOrError("glCanvas"); @@ -123,7 +124,7 @@ export class GameRenderer { public pastDeltas: number[] = []; private getGameScript(): GameRendererGameScript { - return this.game.game.getScriptState( + return this.game.getScriptState( GameRendererGameScript.name ) as GameRendererGameScript; } @@ -133,7 +134,7 @@ export class GameRenderer { return gameScript.getConfig(); } - constructor(private game: GameWrapper, private mainPlayerId: number) { + constructor(private game: Game, private mainPlayerId: number) { this.eCanvas.style.display = "block"; // init gl eCanvas @@ -236,12 +237,12 @@ export class GameRenderer { console.log("Canvas Render Usecase", this); // Create renderers for initial entities - for (const entity of this.game.game.entities.get_all_clone()) { + for (const entity of this.game.getAllEntities()) { this.onNewEntity(entity); } // Create renderers for initial chunks - for (const chunkId of this.game.getLoadedChunkIds()) { + for (const chunkId of this.game.get_loaded_chunk_ids_wasm()) { this.createChunkRender(chunkId); } @@ -260,7 +261,10 @@ export class GameRenderer { } getCamera(): Camera { - const player = this.game.getPlayer(this.mainPlayerId); + const player = this.game.getEntityAsPlayer(this.mainPlayerId); + if (!player) { + throw new Error("Player not found"); + } if (this.isXr) { return makeXRCamera(player); } else { @@ -277,7 +281,7 @@ export class GameRenderer { update() { for (const entityId of this.getGameScript().updatedEntities) { console.log("CanvasGameScript: Updating entity", entityId); - const entity = this.game.game.entities.get_entity_by_id_clone(entityId); + const entity = this.game.getEntityById(entityId); if (!entity) { console.log("CanvasGameScript: Entity not found", entityId); this.onRemovedEntity(entityId); @@ -287,7 +291,7 @@ export class GameRenderer { } for (const chunkId of this.getGameScript().updatedChunks) { - this.createChunkRender(chunkId); + this.createChunkRender(BigInt(chunkId)); } const gameScript = this.getGameScript(); @@ -295,7 +299,7 @@ export class GameRenderer { gameScript.updatedChunks.clear(); gameScript.updatedEntities.clear(); - this.game.game.setScriptState(GameRendererGameScript.name, gameScript); + this.game.setScriptState(GameRendererGameScript.name, gameScript); } getFilter(camera: Camera): Vector3D { @@ -305,7 +309,7 @@ export class GameRenderer { shiftedDown.get(1), shiftedDown.get(2) ); - const blockType = this.game.game.getBlockType(worldPos); + const blockType = this.game.getBlockType(worldPos); if (blockType === BlockType.Water) { return new Vector3D([0, 0.3, 1]); @@ -368,7 +372,7 @@ export class GameRenderer { const renderedChunks = new Set(); // this will hold the coords of ever chunk that was rendered. - const renderedSet = new Set(); + const renderedSet = new Set(); for (const renderer of this.renderers) { renderer.render(camera); @@ -390,12 +394,17 @@ export class GameRenderer { const cameraXYPos = new Vector2D([camera.pos.get(0), camera.pos.get(2)]); const realRenderDistance = CHUNK_SIZE * this.getConfig().renderDistance; - const cameraChunkPos = this.game.getChunkPosFromWorldPos(camera.pos); + const cameraWorldPos = new WorldPos( + camera.pos.get(0), + camera.pos.get(1), + camera.pos.get(2) + ); + const cameraChunkPos = cameraWorldPos.to_chunk_pos(); // const cameraRotNorm = camera.rot.toCartesianCoords().normalize(); - const renderChunk = (chunkPos: Vector2D) => { - const chunkId = this.game.getChunkIdFromChunkPos(chunkPos); + const renderChunk = (chunkPos: ChunkPos) => { + const chunkId = chunkPos.to_id(); const chunkRenderer = this.chunkRenderers.get(chunkId); if (!chunkRenderer) { return; @@ -404,8 +413,6 @@ export class GameRenderer { chunkRenderer.render(camera); }; - const skippedChunkPos = new Set(); - for ( let i = -this.getConfig().renderDistance; i <= this.getConfig().renderDistance; @@ -416,13 +423,10 @@ export class GameRenderer { j <= this.getConfig().renderDistance; j++ ) { - const indexVec = new Vector2D([i, j]); - const chunkPos = cameraChunkPos.add(indexVec); - const chunkWorldPos = this.game.getWorldPosFromChunkPos(chunkPos); - const chunkXYPos = new Vector2D([ - chunkWorldPos.get(0), - chunkWorldPos.get(2), - ]); + const chunkPosOffset = new ChunkPos(i, j); + const chunkPos = cameraChunkPos.add(chunkPosOffset); + const chunkWorldPos = chunkPos.to_world_pos(); + const chunkXYPos = new Vector2D([chunkWorldPos.x, chunkWorldPos.z]); const distAway = cameraXYPos.distFrom(chunkXYPos); if (distAway > realRenderDistance) { @@ -441,29 +445,8 @@ export class GameRenderer { // continue; // } - renderedSet.add(chunkPos.toIndex()); - - renderChunk(chunkPos); - } - } - - for (const chunkPos of skippedChunkPos.values()) { - // check to see if any of the neighboring chunks were rendered - // this is slightly inefficient but it makes sure the user sees all chunks. - // since we are checking to see if the user can see the middle of the chunk we miss some chunks - // that the user sees the edge of. This fixes that - let stillShouldntRender = true; - for (let k = -1; k <= 1; k += 1) { - for (let l = -1; l <= 1; l += 1) { - const indexVec = new Vector2D([k, l]); - const chunkPosToCheck = chunkPos.add(indexVec); - if (renderedSet.has(chunkPosToCheck.toIndex())) { - stillShouldntRender = false; - } - } - } + renderedSet.add(chunkPos.to_id()); - if (!stillShouldntRender) { renderChunk(chunkPos); } } @@ -473,9 +456,9 @@ export class GameRenderer { // see the chunk. Thus this renders the 9 chunks below you. for (let k = -1; k <= 1; k += 1) { for (let l = -1; l <= 1; l += 1) { - const indexVec = new Vector2D([k, l]); + const indexVec = new ChunkPos(k, l); const chunkPos = cameraChunkPos.add(indexVec); - if (!renderedSet.has(chunkPos.toIndex())) renderChunk(chunkPos); + if (!renderedSet.has(chunkPos.to_id())) renderChunk(chunkPos); } } @@ -494,11 +477,11 @@ export class GameRenderer { // if (entity instanceof PlayerWrapper) { if (Player.is_player(entity)) { console.log("CanvasGameScript: Adding player"); - const renderer = new PlayerRenderer(this.game.game, this, entity.id); + const renderer = new PlayerRenderer(this.game, this, entity.id); this.entityRenderers.set(entity.id, renderer); } else if (Fireball.is_fireball(entity)) { console.log("CanvasGameScript: Adding fireball"); - const renderer = new SphereRenderer(this.game.game, this, entity.id); + const renderer = new SphereRenderer(this.game, this, entity.id); this.entityRenderers.set(entity.id, renderer); } } @@ -508,7 +491,7 @@ export class GameRenderer { this.entityRenderers.delete(entityId); } - createChunkRender(chunkId: number): void { + createChunkRender(chunkId: bigint): void { console.log("CanvasGameScript: Creating chunk render", chunkId); const chunkRenderer = new ChunkRenderer(this, chunkId, this.game); chunkRenderer.getBufferData(); diff --git a/apps/web-client/src/renders/hud-renderer.ts b/apps/web-client/src/renders/hud-renderer.ts index 28475cb..25b8e62 100644 --- a/apps/web-client/src/renders/hud-renderer.ts +++ b/apps/web-client/src/renders/hud-renderer.ts @@ -2,7 +2,7 @@ import { GameScript } from "@craft/engine"; import { GameRenderer } from "./game-renderer"; import { getEleOrError, hideElement, IS_MOBILE } from "../utils"; import { Game, Item, Player } from "@craft/rust-world"; -import TextureMapper from "../textureMapper"; +import TextureMapper from "../services/texture-mapping-service"; export class HudGScript extends GameScript { name = "hud-renderer"; @@ -134,7 +134,7 @@ export class HudGScript extends GameScript { } update(_delta: number): void { - const player = this.game.entities.get_entity_as_player(this.mainPlayerUid); + const player = this.game.getEntityAsPlayer(this.mainPlayerUid); if (!player) { console.log("HudGScript: Player not found", this.mainPlayerUid); return; diff --git a/apps/web-client/src/renders/imageRender.ts b/apps/web-client/src/renders/image-render.ts similarity index 100% rename from apps/web-client/src/renders/imageRender.ts rename to apps/web-client/src/renders/image-render.ts diff --git a/apps/web-client/src/renders/playerRender.ts b/apps/web-client/src/renders/player-render.ts similarity index 98% rename from apps/web-client/src/renders/playerRender.ts rename to apps/web-client/src/renders/player-render.ts index 8f4f6c7..767d9d3 100644 --- a/apps/web-client/src/renders/playerRender.ts +++ b/apps/web-client/src/renders/player-render.ts @@ -1,7 +1,7 @@ import { Camera, Vector3D } from "@craft/engine"; import { RenderData, Renderer } from "./renderer"; import ShapeBuilder from "../services/shape-builder"; -import TextureMapper from "../textureMapper"; +import TextureMapper from "../services/texture-mapping-service"; import { Game, Player } from "@craft/rust-world"; import { GameRenderer } from "./game-renderer"; diff --git a/apps/web-client/src/renders/sphereRender.ts b/apps/web-client/src/renders/sphere-render.ts similarity index 100% rename from apps/web-client/src/renders/sphereRender.ts rename to apps/web-client/src/renders/sphere-render.ts diff --git a/apps/web-client/src/runner.ts b/apps/web-client/src/runner.ts deleted file mode 100644 index 8e4603d..0000000 --- a/apps/web-client/src/runner.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { MobileController } from "./controllers/playerControllers/mobileController"; -import { KeyboardPlayerEntityController } from "./controllers/playerControllers/keyboardPlayerController"; -import { getMyUid, IS_MOBILE } from "./utils"; -import { EntityActionDto, SandBoxGScript } from "@craft/rust-world"; -import { ClientDbGamesService } from "./services/sp-games-service"; -import { HudGScript } from "./renders/hud-renderer"; -import { GameRenderer, GameRendererGameScript } from "./renders/game-renderer"; -import { GameWrapper } from "@craft/engine"; - -export const spGameService = await ClientDbGamesService.factory(); - -export interface RunningGame { - game: GameWrapper; - save: () => void; - cleanup: () => void; -} - -interface RunGameError { - error: string; -} - -export async function run(id?: string): Promise { - console.log("Starting game", id); - - const game = id ? await spGameService.getGame(id) : spGameService.newGame(); - - console.log("Game Created", game); - - (window as any).game = game; - - if (!game) { - console.error("Game not found"); - return { - error: "Game not found", - }; - } - - const mainPlayerUid = getMyUid(); - - game.makeAndAddPlayer(mainPlayerUid); - game.game.update(); - - const ents = game.game.entities.get_all_clone(); - console.log("Ents", ents); - - // ===== Game Scripts ===== - console.log("Ensuring scripts"); - game.game.ensureScript(SandBoxGScript.name()); - console.log("Sandbox done"); - game.game.ensureScript(GameRendererGameScript.name); - console.log("Game Renderer done"); - - const gameRenderer = new GameRenderer(game, mainPlayerUid); - const hudRender = new HudGScript(game.game, gameRenderer, mainPlayerUid); - - const onAction = (action: EntityActionDto) => { - game.game.handle_action_wasm(action); - }; - - const playerController = (() => { - if (IS_MOBILE) { - return new MobileController(onAction, mainPlayerUid); - } else { - return new KeyboardPlayerEntityController( - game.game, - onAction, - () => { - spGameService.saveGame(game); - }, - mainPlayerUid, - gameRenderer - ); - } - })(); - - async function task() { - await new Promise((resolve) => setTimeout(resolve, 0)); - } - - let running = true; - - const update = async () => { - const start = performance.now(); - game.game.handle_actions(); - game.game.run_scripts(); - await task(); - game.game.add_new_entities(); - await task(); - game.game.remove_entities(); - await task(); - game.game.add_single_chunk(); - await task(); - game.game.add_blocks(); - await task(); - game.game.remove_blocks(); - await task(); - playerController.update(); - await task(); - gameRenderer.update(); - await task(); - hudRender.update(0); - await task(); - gameRenderer.renderLoop(0); - const end = performance.now(); - if (end - start > 50) { - console.warn("Large update happened. Time: ", end - start); - } - if (running) { - requestAnimationFrame(update); - } - }; - - requestAnimationFrame(update); - - gameRenderer.renderLoop(0); - - return { - game, - save: () => { - spGameService.saveGame(game); - }, - cleanup: () => { - running = false; - gameRenderer.cleanup(); - hudRender.cleanup(); - }, - }; -} diff --git a/apps/web-client/src/services/mp-games-service.ts b/apps/web-client/src/services/mp-games-service.ts index 5675b86..e75555a 100644 --- a/apps/web-client/src/services/mp-games-service.ts +++ b/apps/web-client/src/services/mp-games-service.ts @@ -1,12 +1,11 @@ import { - deserializeChunk, ISerializedChunk, IServerGameMetadata, ISocketMessageType, SocketMessage, WelcomeMessage, } from "@craft/engine"; -import { SocketHandler, SocketListener } from "../socket"; +import { SocketHandler, SocketListener } from "./socket-service"; import { AppConfig } from "../appConfig"; import { Entities, diff --git a/apps/web-client/src/socket.ts b/apps/web-client/src/services/socket-service.ts similarity index 97% rename from apps/web-client/src/socket.ts rename to apps/web-client/src/services/socket-service.ts index 3301e64..0d1f5f3 100644 --- a/apps/web-client/src/socket.ts +++ b/apps/web-client/src/services/socket-service.ts @@ -1,5 +1,5 @@ import { ISocketMessageType, SocketMessage } from "@craft/engine"; -import { AppConfig } from "./appConfig"; +import { AppConfig } from "../appConfig"; export type SocketListener = (message: SocketMessage) => void; diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index 97394d6..2408d97 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -1,9 +1,134 @@ import { - GameWrapper, IGameMetadata, ISerializedGame, - serializedGameToGame, -} from "@craft/engine/src/wrappers"; + deserializeGame, + serializeGame, +} from "@craft/engine"; +import { Game } from "@craft/rust-world"; +import { MobileController } from "../controllers/playerControllers/mobileController"; +import { KeyboardPlayerEntityController } from "../controllers/playerControllers/keyboardPlayerController"; +import { getMyUid, IS_MOBILE } from "../utils"; +import { EntityActionDto, SandBoxGScript } from "@craft/rust-world"; +import { HudGScript } from "../renders/hud-renderer"; +import { GameRenderer, GameRendererGameScript } from "../renders/game-renderer"; + +export interface RunningGame { + game: Game; + save: () => void; + cleanup: () => void; +} + +interface RunGameError { + error: string; +} + +export async function run(id?: string): Promise { + console.log("Starting game", id); + + const game = id ? await spGameService.getGame(id) : spGameService.newGame(); + + console.log("Game Created", game); + + (window as any).game = game; + + if (!game) { + console.error("Game not found"); + return { + error: "Game not found", + }; + } + + const mainPlayerUid = getMyUid(); + + game.make_and_add_player_wasm(mainPlayerUid); + game.update(); + + const ents = game.getAllEntities(); + console.log("Ents", ents); + + // ===== Game Scripts ===== + console.log("Ensuring scripts"); + game.ensureScript(SandBoxGScript.name()); + console.log("Sandbox done"); + game.ensureScript(GameRendererGameScript.name); + console.log("Game Renderer done"); + + const gameRenderer = new GameRenderer(game, mainPlayerUid); + const hudRender = new HudGScript(game, gameRenderer, mainPlayerUid); + + const onAction = (action: EntityActionDto) => { + game.handle_action_wasm(action); + }; + + const playerController = (() => { + if (IS_MOBILE) { + return new MobileController(onAction, mainPlayerUid); + } else { + return new KeyboardPlayerEntityController( + game, + onAction, + () => { + spGameService.saveGame(game); + }, + mainPlayerUid, + gameRenderer + ); + } + })(); + + async function task() { + await new Promise((resolve) => setTimeout(resolve, 0)); + } + + let running = true; + + const update = async () => { + const start = performance.now(); + game.handle_actions(); + game.run_scripts(); + await task(); + game.add_new_entities(); + await task(); + game.remove_entities(); + await task(); + game.add_single_chunk(); + await task(); + game.add_blocks(); + await task(); + game.remove_blocks(); + await task(); + playerController.update(); + await task(); + gameRenderer.update(); + await task(); + hudRender.update(0); + await task(); + gameRenderer.renderLoop(0); + const end = performance.now(); + if (end - start > 50) { + console.warn("Large update happened. Time: ", end - start); + } + if (running) { + requestAnimationFrame(update); + } + }; + + requestAnimationFrame(update); + + gameRenderer.renderLoop(0); + + return { + game, + save: () => { + spGameService.saveGame(game); + }, + cleanup: () => { + running = false; + gameRenderer.cleanup(); + hudRender.cleanup(); + }, + }; +} export class ClientDbGamesService { private static WORLDS_OBS = "worlds"; @@ -43,13 +168,13 @@ export class ClientDbGamesService { private constructor(private db: IDBDatabase) {} - newGame(): GameWrapper { - return GameWrapper.makeGame(); + newGame(): Game { + return new Game(); } - createGame(createGameOptions: ISerializedGame): GameWrapper { - const game = serializedGameToGame(createGameOptions); - return new GameWrapper(game); + createGame(createGameOptions: ISerializedGame): Game { + const game = deserializeGame(createGameOptions); + return game; } getAllGames(): Promise { @@ -99,7 +224,7 @@ export class ClientDbGamesService { }); } - async getGame(gameId: string): Promise { + async getGame(gameId: string): Promise { const foundGame: ISerializedGame | null = await new Promise((resolve) => { const transaction = this.db.transaction([ ClientDbGamesService.WORLDS_OBS, @@ -125,22 +250,13 @@ export class ClientDbGamesService { return this.createGame(foundGame); } - async saveGame(data: GameWrapper) { + async saveGame(data: Game) { return new Promise((resolve, reject) => { const transaction = this.db.transaction( [ClientDbGamesService.WORLDS_OBS], "readwrite" ); - console.log("Entities", data.game.entities.to_js()); - - const serializedGame = { - gameId: data.game.id, - name: data.game.name, - entities: data.game.entities.to_js(), - world: data.game.world.serialize_wasm(), - chunkFetcher: data.game.chunk_fetcher.get_config(), - scripts: data.game.getScriptsJs(), - }; + const serializedGame = serializeGame(data); console.log("Saving game", serializedGame); @@ -175,3 +291,5 @@ export class ClientDbGamesService { objStore.delete(gameId); } } + +export const spGameService = await ClientDbGamesService.factory(); diff --git a/apps/web-client/src/textureMapper.ts b/apps/web-client/src/services/texture-mapping-service.ts similarity index 100% rename from apps/web-client/src/textureMapper.ts rename to apps/web-client/src/services/texture-mapping-service.ts diff --git a/apps/web-client/src/world-picker.tsx b/apps/web-client/src/world-picker.tsx deleted file mode 100644 index 991f35f..0000000 --- a/apps/web-client/src/world-picker.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React from "react"; -import { IGameMetadata } from "@craft/engine"; - -interface Props { - games: IGameMetadata[]; - onGameSelect: (game: IGameMetadata) => void; - onNewGame: () => void; -} - -export const renderWorldPicker = (props: Props) => { - return ( -
- {props.games.map((game) => ( - - ))} - -
- ); -}; diff --git a/apps/web-client/tsconfig.json b/apps/web-client/tsconfig.json index 9135dfe..c2c2b8c 100644 --- a/apps/web-client/tsconfig.json +++ b/apps/web-client/tsconfig.json @@ -2,7 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "outDir": "./build", - "lib": ["es2019", "dom", "WebWorker"], + "lib": ["es2020", "dom", "WebWorker"], "skipLibCheck": true, "isolatedModules": true, "module": "ESNext", diff --git a/lib/engine/world/biome.ts b/lib/engine/STUFF_TO_RUST/biome.ts similarity index 100% rename from lib/engine/world/biome.ts rename to lib/engine/STUFF_TO_RUST/biome.ts diff --git a/lib/engine/world/terrainGenerator.ts b/lib/engine/STUFF_TO_RUST/terrainGenerator.ts similarity index 99% rename from lib/engine/world/terrainGenerator.ts rename to lib/engine/STUFF_TO_RUST/terrainGenerator.ts index 5e96145..30c3585 100644 --- a/lib/engine/world/terrainGenerator.ts +++ b/lib/engine/STUFF_TO_RUST/terrainGenerator.ts @@ -2,11 +2,11 @@ import { Vector2D, Vector3D } from "../src/vector.js"; import { CONFIG } from "../src/config.js"; import { Random } from "../utils/random.js"; import CubeHelpers, { Cube } from "../entities/cube.js"; -import { World } from "./world.js"; +import { World } from "../world/world.js"; import { BiomeGenerator, Biome } from "./biome.js"; import { WorldModule } from "../modules.js"; import { BlockType } from "@craft/rust-world"; -import { ISerializedChunk } from "./index.js"; +import { ISerializedChunk } from "../world/index.js"; // export interface ISerializedTerrainGenerator { // blocksToRender: Array<{ diff --git a/lib/engine/controllers/controller.ts b/lib/engine/controllers/controller.ts deleted file mode 100644 index 923a3a7..0000000 --- a/lib/engine/controllers/controller.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Game } from "../game.js"; - -export abstract class GameController { - protected game: Game; - - constructor(game: Game) { - this.game = game; - } - - abstract update(delta: number): void; -} diff --git a/lib/engine/controllers/emptyController.ts b/lib/engine/controllers/emptyController.ts deleted file mode 100644 index fe657e5..0000000 --- a/lib/engine/controllers/emptyController.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { GameController } from "./controller.js"; - -export class EmptyController extends GameController { - update(_delta: number): void { - // NO-OP - } -} diff --git a/lib/engine/entities/cube.ts b/lib/engine/entities/cube.ts deleted file mode 100644 index c702c2a..0000000 --- a/lib/engine/entities/cube.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { getBlockData } from "../src/blockdata.js"; -import { Direction, Vector3D } from "../src/vector.js"; -import { IDim } from "../types.js"; -import { Entity, FaceLocater } from "./entity.js"; -import { BlockShape, BlockType } from "@craft/rust-world"; - -export type CubeDto = { - type: BlockType; - pos: IDim; -}; - -export type ISerializedCube = { - block_type: BlockType; - extra_data: "None"; - world_pos: { x: number; y: number; z: number }; -}; - -export type WasmCube = { - block_type: BlockType; - world_pos: { x: number; y: number; z: number }; - extraData?: { Image: Direction } | "None"; -}; - -export type Box = { - pos: Vector3D; - dim?: IDim; -}; - -export type HitBox = Box & { - dim: IDim; - hit?: (entity: Entity, where: FaceLocater) => void; -}; - -export const CUBE_DIM: IDim = [1, 1, 1]; - -class CubeHelpersClass { - fromWasmCube(cube: WasmCube): Cube { - try { - return { - pos: new Vector3D([ - cube.world_pos.x, - cube.world_pos.y, - cube.world_pos.z, - ]), - type: cube.block_type, - }; - } catch (err) { - console.log("Could not create cube from wasm cube", cube, err); - throw err; - } - } - - createCube(type: BlockType, pos: Vector3D) { - return { - type, - pos, - }; - } - - deserialize(cubeDto: CubeDto): Cube { - return { - type: cubeDto.type, - pos: new Vector3D(cubeDto.pos), - }; - } - - serialize(cube: Cube): CubeDto { - return { - type: cube.type, - pos: cube.pos.data as IDim, - }; - } - - isPointInsideOfCube(cube: Cube, point: Vector3D) { - return cube.pos.data.every((ord, index) => { - return ( - point.data[index] >= ord && point.data[index] <= ord + CUBE_DIM[index] - ); - }); - } -} - -const CubeHelpers = new CubeHelpersClass(); -export default CubeHelpers; diff --git a/lib/engine/entities/entityController.ts b/lib/engine/entities/entityController.ts deleted file mode 100644 index 8da5c2c..0000000 --- a/lib/engine/entities/entityController.ts +++ /dev/null @@ -1,5 +0,0 @@ -export abstract class EntityController { - abstract update(): void; - - abstract cleanup(): void; -} diff --git a/lib/engine/entities/entityHolder.ts b/lib/engine/entities/entityHolder.ts deleted file mode 100644 index e77d9c8..0000000 --- a/lib/engine/entities/entityHolder.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { Game } from "../game.js"; -import { GameStateDiff } from "../gameStateDiff.js"; -import { World } from "../world/world.js"; -import { Entity, EntityDto } from "./entity.js"; -import { IEntityType } from "./entityType.js"; -import { Player } from "./player/player.js"; -import { Projectile } from "./projectile.js"; - -// Types that need to be updated -export const GameEntityClassMap = { - [IEntityType.Player]: Player, - [IEntityType.Projectile]: Projectile, -}; - -// Helper Types -type ValueOfClass = C extends new ( - ...args: any[] -) => infer T - ? T - : never; -type Distribute = U extends GameEntityTypeOfClass ? ValueOfClass : never; - -export type GameEntityDtoMap = { - [key in keyof typeof GameEntityClassMap]: ValueOfClass< - (typeof GameEntityClassMap)[key] - > extends Entity - ? DTO - : never; -}; -export type GameEntityDto = GameEntityDtoMap[keyof GameEntityDtoMap]; -export type GameEntityTypeOfClass = - (typeof GameEntityClassMap)[keyof typeof GameEntityClassMap]; -export type GameEntity = Distribute; -type GameEntityClassTypeLookup = ValueOfClass< - (typeof GameEntityClassMap)[T] ->; - -export interface ISerializedEntities { - entities: GameEntityDto[]; -} - -export class EntityHolder { - private entities: Map = new Map(); // this includes players - private players: Map = new Map(); - - constructor(data?: ISerializedEntities) { - if (data) { - const entityMapData: [uid: string, entity: Entity][] = data.entities.map( - (e) => [e.uid, this.createEntity(e)] - ); - this.entities = new Map(entityMapData); - - const playersMapData: [uid: string, player: Player][] = Array.from( - this.entities.values() - ) - .filter((ent) => ent instanceof Player) - .map((player) => [player.uid, player as Player]); - this.players = new Map(playersMapData); - } - } - - //======================= - // Getters - //======================== - tryGet(uid: string): T | undefined { - return this.entities.get(uid) as T | undefined; - } - - get(id: string): T { - const ent = this.tryGet(id); - if (!ent) { - throw new Error(`Entity ${id} not found`); - } - return ent; - } - getActivePlayers() { - return Array.from(this.players.values()); - } - - //======================= - // Create - //======================= - - createEntity< - T extends EntityDto, - S extends GameEntityClassTypeLookup - >(entity: T): S { - console.log("Creating entity of type: ", entity.type); - const entClass = GameEntityClassMap[entity.type]; - return new entClass(entity) as S; - } - - //======================= - // Update - //======================== - - update(game: Game, world: World, delta: number) { - const entityArray = Array.from(this.entities.values()); - entityArray.forEach((entity) => entity.update(game, world, delta)); - } - - updateEntity(entityDto: Partial & { uid: string }) { - const entity = this.entities.get(entityDto.uid); - if (!entity) return; - entity.set(entityDto as any); - } - - setEntity(stateDiff: GameStateDiff, entityDto: EntityDto) { - const entity = this.createEntity(entityDto); - this.entities.set(entity.uid, entity); - stateDiff.updateEntity(entity.uid); - } - - serialize(): ISerializedEntities { - return { - entities: Array.from(this.players.values()).map((p) => p.getDto()), - }; - } - - add(entity: Entity) { - console.log("Adding entity: ", entity.uid); - if (this.entities.has(entity.uid)) { - throw new Error(`Entity ${entity.uid} already exists`); - } - if (!entity.uid) throw new Error("Must have uid"); - this.entities.set(entity.uid, entity); - } - - createPlayer(uid: string) { - console.log("Creating player: ", uid); - if (this.players.has(uid)) { - throw new Error(`Player ${uid} already exists`); - } - const player = Player.create(uid); - this.players.set(player.uid, player); - this.add(player); - return player; - } - - createOrGetPlayer(uid: string): Player { - // looking to see if we have already loaded this player, if so then return it - const player = this.players.get(uid); - if (player) { - return player; - } - - return this.createPlayer(uid); - } - - remove(uid: string) { - const entity = this.entities.get(uid); - if (!entity) { - console.log("Can't find entity with that uid"); - return; - } - // if (entity instanceof Player) - this.entities.delete(entity.uid); - } - - removePlayer(uid: string) { - const player = this.players.get(uid); - if (!player) { - console.log("Can't find player with that uid"); - return; - } - this.players.delete(player.uid); - this.entities.delete(player.uid); - } - - removeAllPlayers() { - this.players.clear(); - this.entities.forEach((entity) => { - if (entity instanceof Player) { - this.entities.delete(entity.uid); - } - }); - } - - iterable() { - return this.entities.values(); - } -} diff --git a/lib/engine/entities/entityType.ts b/lib/engine/entities/entityType.ts deleted file mode 100644 index 1743b69..0000000 --- a/lib/engine/entities/entityType.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const enum IEntityType { - Player = 0, - Projectile = 1, -} diff --git a/lib/engine/entities/moveableEntity.ts b/lib/engine/entities/moveableEntity.ts deleted file mode 100644 index 4ce8c3b..0000000 --- a/lib/engine/entities/moveableEntity.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { IDim } from "../types.js"; -import { bindValue } from "../src/utils.js"; -import { Vector3D } from "../src/vector.js"; -import { Entity, EntityDto, MetaAction } from "./entity.js"; - -export interface MovableEntityDto extends EntityDto { - vel: IDim; -} - -export abstract class MovableEntity< - T extends MovableEntityDto = MovableEntityDto -> extends Entity { - vel = Vector3D.zero; - /** - * (radius (1), theta: [0, 2pi], phi: [0, pi]) - */ - rot = Vector3D.zero; - - onGround = false; - jumpCount = 0; - - metaActions = new Set(); - - protected baseDto(): MovableEntityDto { - return { - ...super.baseDto(), - vel: this.vel.data as IDim, - }; - } - - protected baseSet(data: Partial) { - console.log("baseSet ent", this, data); - super.baseSet(data); - if (data.vel) { - this.vel = new Vector3D(data.vel); - } - } - - rotate(r: Vector3D) { - this.rot = this.rot.add(r); - - // bound the rot to ([0, pi], [0, 2 * pi]) - this.rot.set(0, 1); - this.rot.set(1, bindValue(this.rot.get(1), 0, 2 * Math.PI, true)); - this.rot.set(2, bindValue(this.rot.get(2), 0, Math.PI)); - } -} diff --git a/lib/engine/entities/projectile.ts b/lib/engine/entities/projectile.ts deleted file mode 100644 index cb44124..0000000 --- a/lib/engine/entities/projectile.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Game, Vector3D } from "../src/index.js"; -import { World } from "../world/index.js"; -import { IEntity } from "./entity.js"; -import { IEntityType } from "./entityType.js"; -import { MovableEntity, MovableEntityDto } from "./moveableEntity.js"; - -export interface ProjectileDto extends MovableEntityDto { - type: IEntityType.Projectile; -} - -export class Projectile - extends MovableEntity - implements IEntity -{ - // abstract values - static readonly type = IEntityType.Projectile; - get type() { - return Projectile.type; - } - - gravitable = true; - - getDto(): ProjectileDto { - return { - ...this.baseDto(), - type: Projectile.type, - }; - } - - set(data: Partial): void { - this.baseSet(data); - } - - private life = 1000; - - update(game: Game, world: World, delta: number) { - this.life -= delta; - if (this.life < 0) { - game.removeEntity(this); - return; - } - - const scaledVel = this.vel.scalarMultiply(delta / 16); - const expectedPos = this.pos.add(scaledVel); - const newPos = world.tryMove(this, scaledVel); - this.pos = newPos; - - if (!newPos.equals(expectedPos)) { - const intersectingPoss = world.getIntersectingBlocksWithEntity( - expectedPos, - new Vector3D(this.dim) - ); - if (intersectingPoss.length > 0) { - for (const intersectingPos of intersectingPoss) { - const block = world.getBlockFromWorldPoint(intersectingPos); - if (block) { - game.removeBlock(block); - } - } - game.removeEntity(this); - } - } - } -} diff --git a/lib/engine/entities/spectator.ts b/lib/engine/entities/spectator.ts deleted file mode 100644 index d46b900..0000000 --- a/lib/engine/entities/spectator.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Entity, FaceLocater } from "./entity.js"; -import { IDim } from "../types.js"; -import { Vector3D } from "../utils/vector.js"; - -export class Spectator { - // Entity overrides - pos = new Vector3D([0, 5, 0]); - dim: IDim = [1, 2, 1]; - gravitable = false; - intangible = true; - - constructor() { - // super(); - // this.uid = Random.randomString() - } - - // getActions(): IAction[] { - // const actions: IAction[] = []; - - // const wasdVel = this.getWasdVel(); - // const vertVel = this.getVerticalVel(); - - // const totVel = wasdVel.add(vertVel); - - // if (!totVel.equals(this.vel)) { - // actions.push({ - // type: IActionType.setEntVel, - // setEntVel: { - // vel: totVel.data as IDim, - // uid: this.uid, - // } - // }) - // } - - // return actions; - // } - - update(delta: number) { - // this.baseUpdate(delta) - } - - hit(_entity: Entity, _where: FaceLocater) { - /* NO-OP */ - } -} diff --git a/lib/engine/game-scripts/parkor-gscript.ts b/lib/engine/game-scripts/parkor-gscript.ts deleted file mode 100644 index 464140d..0000000 --- a/lib/engine/game-scripts/parkor-gscript.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { MovableEntity } from "../entities/moveableEntity.js"; -import { GameScript } from "../src/game-script.js"; -import { TerrainGenModule } from "../modules.js"; -import { Vector2D, Vector3D } from "../src/vector.js"; -import { World } from "../world/world.js"; - -type Config = { - seed: string; - loadDistance: number; -}; - -export class ParkorGScript extends GameScript { - name = "parkor"; - - public config = { - seed: "", - loadDistance: 3, - }; - - private terrainGenerator: ReturnType< - typeof TerrainGenModule.getParkorTerrainGenerator - > | null = null; - - async setup(): Promise { - console.log("Setting up sandbox game script"); - // Load the entire world? - - this.config = { - seed: this.game.config.seed, - loadDistance: this.game.config.loadDistance, - }; - - this.terrainGenerator = TerrainGenModule.getParkorTerrainGenerator( - Number(this.config.seed) - ); - } - - setConfig(config: Config): void { - this.config = config; - - // TODO: Update the terrain generator's config - } - - loadChunk(chunkPos: Vector2D): void { - const hasChunk = this.game.world.hasChunk(chunkPos); - if (hasChunk) { - return; - } - } - - getChunkPosAroundPoint(pos: Vector3D): Vector2D[] { - const centerChunkPos = World.worldPosToChunkPos(pos); - - const chunkIds = []; - const loadDistance = this.config.loadDistance; - - for (let i = -loadDistance; i < loadDistance; i++) { - for (let j = -loadDistance; j < loadDistance; j++) { - const chunkPos = new Vector2D([ - centerChunkPos.get(0) + i, - centerChunkPos.get(1) + j, - ]); - chunkIds.push(chunkPos); - } - } - - return chunkIds; - } - - update(_delta: number): void { - for (const entity of this.game.entities.iterable()) { - // Prevent from falling out of the world - if (entity.pos.get(1) < -10) { - entity.pos.set(1, 30); - if (entity instanceof MovableEntity) { - entity.vel.set(1, -0.1); - } - } - - const chunkIds = this.getChunkPosAroundPoint(entity.pos); - // console.log("Chunk ids", chunkIds); - chunk: for (const chunkId of chunkIds) { - const isChunkLoaded = this.game.world.hasChunk(chunkId); - if (isChunkLoaded) { - continue chunk; - } - - console.log("Generating chunk around player"); - - const chunk = this.terrainGenerator?.getChunk(chunkId); - - if (!chunk) { - console.log("Failed generating chunk", chunkId); - break; - } - - this.game.upsertChunk(chunk); - - // Only load a single chunk per frame - return; - } - } - } -} diff --git a/lib/engine/game-scripts/sandbox-gscript.ts b/lib/engine/game-scripts/sandbox-gscript.ts deleted file mode 100644 index ead4a29..0000000 --- a/lib/engine/game-scripts/sandbox-gscript.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { MovableEntity } from "../entities/moveableEntity.js"; -import { GameScript } from "../src/game-script.js"; -import { TerrainGenModule } from "../modules.js"; -import { Vector2D, Vector3D } from "../utils/vector.js"; -import { World } from "../world/world.js"; - -interface Config { - seed: string; - flatWorld: boolean; - infinite: boolean; - loadDistance: number; -} - -// await WorldModule.load(); -// const game = WorldModule.createGame(); -// const player = WorldModule.createPlayer(Number(1)); -// game.addPlayer(player); - -// init the terrian gen module and load all chunks around palyer -export class SandboxGScript extends GameScript { - name = "sandbox"; - - public config = { - seed: "", - flatWorld: false, - infinite: false, - loadDistance: 3, - }; - - private terrainGenerator: ReturnType< - typeof TerrainGenModule.getTerrainGenerator - > | null = null; - - async setup(): Promise { - console.log("Setting up sandbox game script"); - // Load the entire world? - await TerrainGenModule.load(); - - this.config = { - seed: this.game.config.seed, - flatWorld: this.game.config.terrain.flatWorld, - infinite: this.game.config.terrain.infiniteGen, - loadDistance: this.game.config.loadDistance, - }; - - this.terrainGenerator = TerrainGenModule.getParkorTerrainGenerator( - Number(this.config.seed) - ); - - // Load the chunks around the player - } - - setConfig(config: Config): void { - this.config = config; - - // TODO: Update the terrain generator's config - } - - getChunkPosAroundPoint(pos: Vector3D): Vector2D[] { - const centerChunkPos = World.worldPosToChunkPos(pos); - - const chunkIds = []; - const loadDistance = this.config.loadDistance; - - for (let i = -loadDistance; i < loadDistance; i++) { - for (let j = -loadDistance; j < loadDistance; j++) { - const chunkPos = new Vector2D([ - centerChunkPos.get(0) + i, - centerChunkPos.get(1) + j, - ]); - chunkIds.push(chunkPos); - } - } - - return chunkIds; - } - - update(_delta: number): void { - for (const entity of this.game.entities.iterable()) { - // Prevent from falling out of the world - if (entity.pos.get(1) < -10) { - entity.pos.set(1, 30); - if (entity instanceof MovableEntity) { - entity.vel.set(1, -0.1); - } - } - - if (this.config.infinite) { - const chunkIds = this.getChunkPosAroundPoint(entity.pos); - // console.log("Chunk ids", chunkIds); - chunk: for (const chunkId of chunkIds) { - const isChunkLoaded = this.game.world.hasChunk(chunkId); - if (isChunkLoaded) { - continue chunk; - } - - console.log("Generating chunk around player"); - - const chunk = this.terrainGenerator?.getChunk(chunkId); - - if (!chunk) { - console.log("Failed generating chunk", chunkId); - break; - } - - this.game.upsertChunk(chunk); - - // Only load a single chunk per frame - return; - } - } - } - } -} diff --git a/lib/engine/gameActions.ts b/lib/engine/gameActions.ts deleted file mode 100644 index 323d38d..0000000 --- a/lib/engine/gameActions.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Game } from "./game.js"; -import { MessageDto, MessageHolder } from "./messageHelpers.js"; - -export enum GameActionType { - Save = "save", - ChangeName = "changeName", -} - -export interface GameActionData extends Record { - [GameActionType.ChangeName]: { - name: string; - }; - [GameActionType.Save]: undefined; -} - -export type GameActionDto = MessageDto; - -export class GameAction extends MessageHolder { - static create(type: T, data: GameActionData[T]) { - return new GameAction(type, data); - } -} - -export class GameActionHandler { - constructor(private game: Game) {} - - handle(action: GameAction) { - if (action.isType(GameActionType.Save)) { - this.game.save(); - } - } -} diff --git a/lib/engine/gameStateDiff.ts b/lib/engine/gameStateDiff.ts deleted file mode 100644 index cc2373e..0000000 --- a/lib/engine/gameStateDiff.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { EntityDto } from "./entities/entity.js"; -import { Game } from "./game.js"; -import { Vector2D } from "./src/vector.js"; -import { getChunkId, ISerializedChunk } from "./world/chunk.js"; - -export interface GameDiffDto { - entities: { - add?: EntityDto[]; - update?: EntityDto[]; - remove?: string[]; - }; - chunks: { - update?: ISerializedChunk[]; - }; -} - -export interface IGameStateDiffData { - addEntitiesIds: string[]; - updateEntitiesIds: string[]; - removeEntitiesIds: string[]; - updateChunkIds: string[]; -} - -// Stores information about which entities or chunks are dirty -export class GameStateDiff { - constructor(private game: Game, data?: IGameStateDiffData) { - if (!data) { - return; - } - this.addEntitiesIds = data.addEntitiesIds; - this.updateEntitiesIds = data.updateEntitiesIds; - this.removeEntitiesIds = data.removeEntitiesIds; - this.updateChunkIds = data.updateChunkIds; - } - - private addEntitiesIds: string[] = []; - private updateEntitiesIds: string[] = []; - private removeEntitiesIds: string[] = []; - private updateChunkIds: string[] = []; - - public hasData(): boolean { - return ( - this.addEntitiesIds.length > 0 || - this.updateEntitiesIds.length > 0 || - this.removeEntitiesIds.length > 0 || - this.updateChunkIds.length > 0 - ); - } - - public addEntity(entityId: string) { - this.addEntitiesIds.push(entityId); - } - - public removeEntity(entityId: string) { - this.removeEntitiesIds.push(entityId); - } - - public updateEntity(entityId: string) { - this.updateEntitiesIds.push(entityId); - } - - public updateChunk(chunkId: string) { - this.updateChunkIds.push(chunkId); - } - - public getDirtyChunks(): ReadonlyArray { - return this.updateChunkIds; - } - - public getNewEntities(): ReadonlyArray { - return this.addEntitiesIds; - } - - public getUpdatedEntities(): ReadonlyArray { - return this.updateEntitiesIds; - } - - public getRemovedEntities(): ReadonlyArray { - return this.removeEntitiesIds; - } - - public clear() { - this.addEntitiesIds = []; - this.updateEntitiesIds = []; - this.removeEntitiesIds = []; - this.updateChunkIds = []; - } - - public get(): GameDiffDto { - const diff: GameDiffDto = { - entities: {}, - chunks: {}, - }; - - if (this.addEntitiesIds.length > 0) { - diff.entities.add = this.addEntitiesIds - .map((id) => this.game.entities.get(id)) - .map((entity) => entity.getDto()); - } - - if (this.removeEntitiesIds.length > 0) { - diff.entities.remove = this.removeEntitiesIds; - } - - if (this.updateEntitiesIds.length > 0) { - diff.entities.update = this.updateEntitiesIds - .map((id) => this.game.entities.get(id)) - .map((entity) => entity.getDto()); - } - - if (this.updateChunkIds.length > 0) { - diff.chunks.update = this.updateChunkIds.map((id) => - this.game.world.getChunkFromPos(Vector2D.fromIndex(id)) - ); - } - - return diff; - } - - private serialize(): IGameStateDiffData { - return { - addEntitiesIds: this.addEntitiesIds, - updateEntitiesIds: this.updateEntitiesIds, - removeEntitiesIds: this.removeEntitiesIds, - updateChunkIds: this.updateChunkIds, - }; - } - - public copy(): GameStateDiff { - return new GameStateDiff(this.game, this.serialize()); - } - - public append(diff: GameStateDiff) { - this.addEntitiesIds = this.addEntitiesIds.concat(diff.getNewEntities()); - this.updateEntitiesIds = this.updateEntitiesIds.concat( - diff.getUpdatedEntities() - ); - this.removeEntitiesIds = this.removeEntitiesIds.concat( - diff.getRemovedEntities() - ); - this.updateChunkIds = this.updateChunkIds.concat(diff.getDirtyChunks()); - } - - public appendDto(dto: GameDiffDto) { - this.addEntitiesIds.push(...(dto.entities.add?.map((e) => e.uid) || [])); - this.updateChunkIds.push( - ...(dto.chunks.update?.map((c) => getChunkId(c)) || []) - ); - this.removeEntitiesIds.push(...(dto.entities.remove || [])); - this.updateEntitiesIds.push( - ...(dto.entities.update?.map((e) => e.uid) || []) - ); - } -} diff --git a/lib/engine/item.ts b/lib/engine/item.ts deleted file mode 100644 index 24b5df0..0000000 --- a/lib/engine/item.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { BlockType } from "@craft/rust-world"; - -export enum ThrowableItem { - Fireball = "fireball", -} - -export type Item = BlockType | ThrowableItem; diff --git a/lib/engine/modules.ts b/lib/engine/modules.ts deleted file mode 100644 index e69de29..0000000 diff --git a/lib/engine/src/index.ts b/lib/engine/src/index.ts index d08de8f..69e4d57 100644 --- a/lib/engine/src/index.ts +++ b/lib/engine/src/index.ts @@ -1,7 +1,7 @@ export * from "./camera.js"; export * from "./config.js"; export * from "./vector.js"; -export * from "./wrappers.js"; +export * from "./serialize.js"; export * from "./playerActions.js"; export * from "./utils.js"; export * from "./blockdata.js"; diff --git a/lib/engine/messageHelpers.ts b/lib/engine/src/messageHelpers.ts similarity index 100% rename from lib/engine/messageHelpers.ts rename to lib/engine/src/messageHelpers.ts diff --git a/lib/engine/src/playerActions.ts b/lib/engine/src/playerActions.ts index 6ba62be..b645225 100644 --- a/lib/engine/src/playerActions.ts +++ b/lib/engine/src/playerActions.ts @@ -39,7 +39,7 @@ export abstract class PlayerController { } beltRight() { - const player = this.game.entities.get_entity_as_player(this.playerId); + const player = this.game.getEntityAsPlayer(this.playerId); if (!player) { return; } @@ -52,7 +52,7 @@ export abstract class PlayerController { } beltLeft() { - const player = this.game.entities.get_entity_as_player(this.playerId); + const player = this.game.getEntityAsPlayer(this.playerId); if (!player) { return; } diff --git a/lib/engine/src/serialize.ts b/lib/engine/src/serialize.ts new file mode 100644 index 0000000..aad9d03 --- /dev/null +++ b/lib/engine/src/serialize.ts @@ -0,0 +1,98 @@ +import { + World, + Game, + Entities, + BlockType, + GameScripts, + ChunkFetcher, +} from "@craft/rust-world"; + +export interface ISerializedAction { + entity_id: number; + name: string; + data: any; +} + +export interface IServerGameMetadata { + gameId: string; + name: string; + isRunning: boolean; + onlinePlayers: number; +} + +export interface ISerializedChunkFetcher { + type: string; + json: any; +} + +export interface IGameMetadata { + gameId: string; + name: string; +} + +export interface ISerializedScript { + scripts: Array<{ + config: string; + name: string; + }>; +} + +export interface ISerializedChunk { + position: { + x: number; + y: number; + }; + blocks: BlockType[]; + block_data: ("None" | { Image: string })[]; +} + +type ISerializedChunkHolder = ISerializedChunk[]; + +export interface ISerializedWorld { + chunks: ISerializedChunkHolder; +} + +export interface SerializedEntity { + id: number; + components: string[]; +} + +export interface SerializedEntities { + entities: SerializedEntity[]; +} + +export interface ISerializedGame { + gameId: string; + name: string; + entities: Entities; + world: World; + scripts: ISerializedScript; + chunkFetcher: ISerializedChunkFetcher; +} + +export const deserializeGame = (serializedGame: ISerializedGame): Game => { + const world = World.deserialize_wasm(serializedGame.world); + const entityHolder = Game.deserializeEntities(serializedGame.entities); + const scripts = GameScripts.fromJs(serializedGame.scripts); + const chunkFetcher = ChunkFetcher.fromJs(serializedGame.chunkFetcher); + const game = Game.build( + serializedGame.gameId, + serializedGame.name, + world, + entityHolder, + scripts, + chunkFetcher + ); + return game; +}; + +export const serializeGame = (game: Game): ISerializedGame => { + return { + gameId: game.id, + name: game.name, + entities: game.serializeEntities(), + world: game.world.serialize_wasm(), + chunkFetcher: game.chunk_fetcher.get_config(), + scripts: game.getScriptsJs(), + }; +}; diff --git a/lib/engine/src/socket-types.ts b/lib/engine/src/socket-types.ts index 2db7a8d..03d8071 100644 --- a/lib/engine/src/socket-types.ts +++ b/lib/engine/src/socket-types.ts @@ -1,5 +1,5 @@ -import { Entities, GameDiff, Player } from "@craft/rust-world"; -import { ISerializedAction } from "./wrappers.js"; +import { Entity, GameDiff, Player } from "@craft/rust-world"; +import { ISerializedAction } from "./serialize.js"; export interface MessageDto< MESSAGE extends string, @@ -40,7 +40,7 @@ export enum ISocketMessageType { export interface WelcomeMessage { uid: number; - entities: Entities; + entities: Entity[]; } export interface SocketMessageData extends Record { diff --git a/lib/engine/src/wrappers.ts b/lib/engine/src/wrappers.ts deleted file mode 100644 index 37c0933..0000000 --- a/lib/engine/src/wrappers.ts +++ /dev/null @@ -1,230 +0,0 @@ -import { Vector2D, Vector3D } from "./vector.js"; -import { - SandBoxGScript, - TerrainGenerator, - World, - Game, - Entities, - Chunk, - BlockType, - Direction, - Player, - EntityActionDto, - JumpAction, - SphericalRotation, - RotateAction, - MoveAction, - GameScripts, - ChunkFetcher, -} from "@craft/rust-world"; - -export interface ISerializedAction { - entity_id: number; - name: string; - data: any; -} - -export interface IServerGameMetadata { - gameId: string; - name: string; - isRunning: boolean; - onlinePlayers: number; -} - -export interface ISerializedChunkFetcher { - type: string; - json: any; -} - -export interface ISerializedGame { - gameId: string; - name: string; - entities: Entities; - world: World; - terrainGen: TerrainGenerator; - sandbox: SandBoxGScript; - scripts: ISerializedScript; - chunkFetcher: ISerializedChunkFetcher; -} - -export interface IGameMetadata { - gameId: string; - name: string; -} - -export interface ISerializedScript { - scripts: Array<{ - config: string; - name: string; - }>; -} - -export const serializedGameToGame = (serializedGame: ISerializedGame): Game => { - const world = World.deserialize_wasm(serializedGame.world); - const entityHolder = Entities.from_js(serializedGame.entities); - const scripts = GameScripts.fromJs(serializedGame.scripts); - const chunkFetcher = ChunkFetcher.fromJs(serializedGame.chunkFetcher); - const game = Game.build( - serializedGame.gameId, - serializedGame.name, - world, - entityHolder, - scripts, - chunkFetcher - ); - return game; -}; - -export const getEntities = (game: Game) => { - const entities = game.entities.to_js(); - // convert all the maps to objects - const newEntities = entities.entities.map((entity: any) => { - const components = entity.components.map((component: any) => { - const componentKey = component[0]; - let componentValue = component[1]; - if (componentValue instanceof Map) { - componentValue = Object.fromEntries(componentValue); - } - return [componentKey, componentValue]; - }); - return { ...entity, components }; - }); - return { entities: newEntities }; -}; - -export const deserializeChunk = (chunk: ISerializedChunk): Chunk => { - return Chunk.deserialize(chunk); -}; - -export interface ISerializedChunk { - position: { - x: number; - y: number; - }; - blocks: BlockType[]; - block_data: ("None" | { Image: string })[]; -} - -type RustPos = { - x: number; - y: number; - z: number; -}; - -type ISerializedChunkHolder = ISerializedChunk[]; - -export interface ISerializedWorld { - chunks: ISerializedChunkHolder; -} - -export interface SerializedEntity { - id: number; - components: string[]; -} - -export interface SerializedEntities { - entities: SerializedEntity[]; -} - -export type GameDiff = { - updated_entities: number[]; - updated_chunks: number[]; -}; - -export type ISerializedVisibleFaces = Array<{ - world_pos: RustPos; - faces: [boolean, boolean, boolean, boolean, boolean, boolean]; -}>; - -export type Cube = { - type: BlockType; - pos: Vector3D; -}; - -export class GameWrapper { - constructor(public game: Game) {} - - static makeGame(): GameWrapper { - const game = new Game(); - return new GameWrapper(game); - } - - makeAndAddPlayer(uid: number) { - this.game.make_and_add_player_wasm(uid); - } - - serializeEntities(): SerializedEntity[] { - return this.game.entities.to_js(); - } - - makeJumpAction(entityId: number): EntityActionDto { - return JumpAction.make_wasm(entityId); - } - - makeRotateAction( - entityId: number, - theta: number, - phi: number - ): EntityActionDto { - const rotDiff = SphericalRotation.new_wasm(theta, phi); - return RotateAction.make_wasm(entityId, rotDiff); - } - - makeMoveAction( - entityId: number, - direction: Direction | "None" - ): EntityActionDto { - console.log("Making move action", entityId, direction); - if (direction === "None") { - return MoveAction.make_wasm(entityId, undefined); - } - return MoveAction.make_wasm(entityId, direction); - } - - getChunkPosFromChunkId(chunkId: number): Vector2D { - const data: { x: number; y: number } = this.game.get_chunk_pos_from_id_wasm( - BigInt(chunkId) - ); - return new Vector2D([data.x, data.y]); - } - - getChunkIdFromChunkPos(chunkPos: Vector2D): number { - const data = { - x: chunkPos.get(0), - y: chunkPos.get(1), - }; - return Number(this.game.get_chunk_id_from_chunk_pos_wasm(data)); - } - - getPlayer(uid: number): Player { - const player = this.game.entities.get_entity_as_player(uid); - if (!player) { - throw new Error("Player not found"); - } - return player; - } - - getLoadedChunkIds(): number[] { - const chunkIds = this.game.get_loaded_chunk_ids_wasm(); - return Array.from(chunkIds).map(Number); - } - - getWorldPosFromChunkPos(chunkPos: Vector2D): Vector3D { - const world_pos = this.game.get_world_pos_from_chunk_pos_wasm( - chunkPos.get(0), - chunkPos.get(1) - ); - - return new Vector3D([world_pos.x, world_pos.y, world_pos.z]); - } - - getChunkPosFromWorldPos(worldPos: Vector3D): Vector2D { - const chunk_pos = this.game.get_chunk_pos_from_world_pos_wasm( - worldPos.get(0), - worldPos.get(1), - worldPos.get(2) - ); - - return new Vector2D([chunk_pos.x, chunk_pos.y]); - } -} diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 474f91d..495f9b0 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es5.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2016.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2018.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2019.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.dom.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.decorators.d.ts","../../../../.local/share/bun/install/global/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/camera.ts","./src/wrappers.ts","./src/game-script.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[69,112],[47,69,112],[47,49,50,69,112],[47,52,69,112],[48,49,50,51,52,53,54,55,56,69,112],[47,50,53,69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"c2c9424cd007942600a77cdbee3801234ddb1723466e20eda1f7b0dd3be1f0b1","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"2190af24cd8970497490c683989e0519fb8c15489edda3df05dc3c5e8c95bf13","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"70ec1338c3ebd2316eff58a06865162cdbf132386ea8159780728214f0ec0112","signature":"2dadc62b955c38b0f4ec751e796f78a86a7f47cc3b0cbb267e36c129b92859c8","impliedFormat":99},{"version":"e7fe5f13fe35fe16380d993214b1a2a5263d293abdb2beb96b5e3da1d8c9f417","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"bd1fef4442cc97cad909bd08e37c0afa728c3c9ac286e39b7ff3068bd09101d0","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"322f723495a7a0a8eb726f5b130ba65257b71b21be66dfacf21bdb4bc9077a55","signature":"6382ca8397ca3146b4551e1f2dc37d871eb021c72482460422503a4d0f504a03","impliedFormat":99},{"version":"da78a9d31ac06ec11ccd6bb89d4ec9933c0ea8d95cac6e30c5d11230b3baf4e5","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[45,1],[46,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[19,1],[20,1],[4,1],[21,1],[25,1],[22,1],[23,1],[24,1],[26,1],[27,1],[28,1],[5,1],[29,1],[30,1],[31,1],[32,1],[6,1],[36,1],[33,1],[34,1],[35,1],[37,1],[7,1],[38,1],[43,1],[44,1],[39,1],[40,1],[41,1],[42,1],[1,1],[48,2],[51,3],[49,1],[53,4],[57,5],[54,2],[56,4],[55,1],[50,1],[52,6],[47,1],[60,7],[58,1],[63,8],[59,7],[61,9],[62,7],[164,10],[163,11],[165,11],[166,1],[171,12],[174,13],[175,14],[172,1],[176,1],[177,15],[167,1],[109,16],[110,16],[111,17],[69,18],[112,19],[113,20],[114,21],[64,1],[67,22],[65,1],[66,1],[115,23],[116,24],[117,25],[118,26],[119,27],[120,28],[121,28],[123,29],[122,30],[124,31],[125,32],[126,33],[108,34],[68,1],[127,35],[128,36],[129,37],[162,38],[130,39],[131,40],[132,41],[133,42],[134,43],[135,44],[136,45],[137,46],[138,47],[139,48],[140,48],[141,49],[142,1],[143,1],[144,50],[146,51],[145,52],[147,53],[148,54],[149,55],[150,56],[151,57],[152,58],[153,59],[154,60],[155,61],[156,62],[157,63],[158,64],[159,65],[160,66],[161,67],[178,1],[169,1],[170,1],[182,68],[179,1],[181,69],[183,70],[184,1],[209,71],[210,72],[185,73],[188,73],[207,71],[208,71],[198,71],[197,74],[195,71],[190,71],[203,71],[201,71],[205,71],[189,71],[202,71],[206,71],[191,71],[192,71],[204,71],[186,71],[193,71],[194,71],[196,71],[200,71],[211,75],[199,71],[187,71],[224,76],[223,1],[218,75],[220,77],[219,75],[212,75],[213,75],[215,75],[217,75],[221,77],[222,77],[214,77],[216,77],[168,78],[173,79],[225,1],[226,1],[227,1],[228,80],[70,1],[180,1],[86,81],[96,82],[85,81],[106,83],[77,84],[76,85],[105,86],[99,87],[104,88],[79,89],[93,90],[78,91],[102,92],[74,93],[73,86],[103,94],[75,95],[80,96],[81,1],[84,96],[71,1],[107,97],[97,98],[88,99],[89,100],[91,101],[87,102],[90,103],[100,86],[82,104],[83,105],[92,106],[72,107],[95,98],[94,96],[98,1],[101,108]],"latestChangedDtsFile":"./dist/index.d.ts","version":"5.9.2"} \ No newline at end of file +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/camera.ts","./src/game-script.ts","./src/serialize.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","./src/messageHelpers.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,70,113],[47,49,50,70,113],[70,113],[48,49,50,51,52,53,54,55,56,70,113],[47,53,70,113],[59,70,113],[59,60,61,62,63,70,113],[59,61,70,113],[70,113,128,163,164],[70,113,128,163],[70,113,125,128,163,169,170,171],[70,113,165,170,172,174],[70,113,176],[70,113,125,163],[70,110,113],[70,112,113],[113],[70,113,118,148],[70,113,114,119,125,126,133,145,156],[70,113,114,115,125,133],[65,66,67,70,113],[70,113,116,157],[70,113,117,118,126,134],[70,113,118,145,153],[70,113,119,121,125,133],[70,112,113,120],[70,113,121,122],[70,113,125],[70,113,123,125],[70,112,113,125],[70,113,125,126,127,145,156],[70,113,125,126,127,140,145,148],[70,108,113,161],[70,108,113,121,125,128,133,145,156],[70,113,125,126,128,129,133,145,153,156],[70,113,128,130,145,153,156],[68,69,70,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162],[70,113,125,131],[70,113,132,156],[70,113,121,125,133,145],[70,113,134],[70,113,135],[70,112,113,136],[70,110,111,112,113,114,115,116,117,118,119,120,121,122,123,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162],[70,113,138],[70,113,139],[70,113,125,140,141],[70,113,140,142,157,159],[70,113,125,145,146,148],[70,113,147,148],[70,113,145,146],[70,113,148],[70,113,149],[70,110,113,145],[70,113,125,151,152],[70,113,151,152],[70,113,118,133,145,153],[70,113,154],[70,113,133,155],[70,113,128,139,156],[70,113,118,157],[70,113,145,158],[70,113,132,159],[70,113,160],[70,113,118,125,127,136,145,156,159,161],[70,113,145,162],[70,113,182],[70,113,179,180,181],[70,113,128,145,163],[70,113,186,225],[70,113,186,210,225],[70,113,225],[70,113,186],[70,113,186,211,225],[70,113,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224],[70,113,211,225],[70,113,126,145,163,168],[70,113,128,163,169,173],[70,113,125,128,130,133,145,153,156,162,163],[70,80,84,113,156],[70,80,113,145,156],[70,75,113],[70,77,80,113,153,156],[70,113,133,153],[70,113,163],[70,75,113,163],[70,77,80,113,133,156],[70,72,73,76,79,113,125,145,156],[70,80,87,113],[70,72,78,113],[70,80,101,102,113],[70,76,80,113,148,156,163],[70,101,113,163],[70,74,75,113,163],[70,80,113],[70,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,102,103,104,105,106,107,113],[70,80,95,113],[70,80,87,88,113],[70,78,80,88,89,113],[70,79,113],[70,72,75,80,113],[70,80,84,88,89,113],[70,84,113],[70,78,80,83,113,156],[70,72,77,80,87,113],[70,113,145],[70,75,80,101,113,161,163]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b4b2e3cc05955ee272308e4edb8f5c505d62094df7e0e3c4e88172d0d901ab9","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"2190af24cd8970497490c683989e0519fb8c15489edda3df05dc3c5e8c95bf13","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"1e20cfe580515334f0b432b26673699222b566ab627585b1197fd0f19dd696ef","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"b5af7a70692132b11dd67537b2d329bf11fd91134eb059c3260a586f8d25129d","signature":"2453b54c36a150578fe9b40af1fc1d7468476ae8e9f7c16a1882037e13ea7194","impliedFormat":99},{"version":"c072992f5050052cd71af7ed891c172c21ea18afaa2303aecd871502cf97ed79","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"637faa90ef9fab63d1ec947535eb42bd94883ac62cf851d55fd735b08a4542b5","signature":"5e5ef417b2eb6cbe0656f81d95a84bc3a632b21b0f033b72757b24db0e5f20a9","impliedFormat":99},{"version":"2910afd0b4d1ea52cded30c6e252900275a892cf18dca8b0bd20e5ecfefcd5c1","impliedFormat":99},{"version":"c377b02fff54ab51cd49d83cd77dedd57146f5a0dbb31ecde57694fd1ee1e48a","signature":"7d5fb2c9812ddb34bd3bcf2c4cbf3a61807603aa4b6a47d88fb7d747ae571253","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,58]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[51,2],[49,3],[52,1],[57,4],[58,3],[54,1],[53,1],[56,5],[55,3],[50,3],[47,3],[61,6],[59,3],[64,7],[60,6],[62,8],[63,6],[165,9],[164,10],[166,10],[167,3],[172,11],[175,12],[176,13],[173,3],[177,3],[178,14],[168,3],[110,15],[111,15],[112,16],[70,17],[113,18],[114,19],[115,20],[65,3],[68,21],[66,3],[67,3],[116,22],[117,23],[118,24],[119,25],[120,26],[121,27],[122,27],[124,28],[123,29],[125,30],[126,31],[127,32],[109,33],[69,3],[128,34],[129,35],[130,36],[163,37],[131,38],[132,39],[133,40],[134,41],[135,42],[136,43],[137,44],[138,45],[139,46],[140,47],[141,47],[142,48],[143,3],[144,3],[145,49],[147,50],[146,51],[148,52],[149,53],[150,54],[151,55],[152,56],[153,57],[154,58],[155,59],[156,60],[157,61],[158,62],[159,63],[160,64],[161,65],[162,66],[179,3],[170,3],[171,3],[183,67],[180,3],[182,68],[184,69],[185,3],[210,70],[211,71],[186,72],[189,72],[208,70],[209,70],[199,70],[198,73],[196,70],[191,70],[204,70],[202,70],[206,70],[190,70],[203,70],[207,70],[192,70],[193,70],[205,70],[187,70],[194,70],[195,70],[197,70],[201,70],[212,74],[200,70],[188,70],[225,75],[224,3],[219,74],[221,76],[220,74],[213,74],[214,74],[216,74],[218,74],[222,76],[223,76],[215,76],[217,76],[169,77],[174,78],[226,3],[227,3],[228,3],[229,79],[71,3],[181,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[87,80],[97,81],[86,80],[107,82],[78,83],[77,84],[106,85],[100,86],[105,87],[80,88],[94,89],[79,90],[103,91],[75,92],[74,85],[104,93],[76,94],[81,95],[82,3],[85,95],[72,3],[108,96],[98,97],[89,98],[90,99],[92,100],[88,101],[91,102],[101,85],[83,103],[84,104],[93,105],[73,106],[96,97],[95,95],[99,3],[102,107]],"latestChangedDtsFile":"./dist/types.d.ts","version":"5.8.3"} \ No newline at end of file diff --git a/lib/engine/types.ts b/lib/engine/types.ts deleted file mode 100644 index 01ee3e4..0000000 --- a/lib/engine/types.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { IConfig } from "./src/config.js"; -import { EntityDto } from "./entities/entity.js"; -import { PlayerActionDto } from "./src/playerActions.js"; -import { - Game, - IContructGameOptions, - IGameMetadata, - ISerializedGame, -} from "./game.js"; -import { GameActionDto } from "./gameActions.js"; -import { GameDiffDto } from "./gameStateDiff.js"; -import { MessageDto, MessageHolder } from "./messageHelpers.js"; -import { ISerializedChunk } from "./world/chunk.js"; - -// Defs -// There are actions and state changes -// Actions are sent to the server to be converted to state changes that are then sent to the clients -// Servers can only just send state changes to the clients without any actions (An entity spawned, a timer went off) - -export enum StateUpdateType { - AddEntity, - UpdateEntity, - RemoveEntity, - UpdateChunk, -} - -export interface IAddEntityStateUpdate { - action: StateUpdateType.AddEntity; - ent: EntityDto; -} - -export interface IUpdateEntityStateUpdate { - action: StateUpdateType.UpdateEntity; - ent: Partial; -} - -export interface IEntityRemoveStateUpdate { - action: StateUpdateType.RemoveEntity; - uid: string; -} - -export interface IChunkUpdateStateUpdate { - action: StateUpdateType.UpdateChunk; - chunk: ISerializedChunk; -} - -export type StateUpdate = - | IAddEntityStateUpdate - | IUpdateEntityStateUpdate - | IEntityRemoveStateUpdate - | IChunkUpdateStateUpdate; - -export interface IGamesService { - createGame(options: IContructGameOptions): Promise; - getGame(gameId: string): Promise; - getAllGames(): Promise; - saveGame(game: Game): Promise; - deleteGame(gameId: string): Promise; -} - -export enum ISocketMessageType { - // from client - getChunk = "getChunk", // server sends setChunk - newWorld = "newWorld", // server sends welcome - saveWorld = "saveWorld", - // this could be for joining an existing world or starting up an old one - joinWorld = "joinWorld", // server sends welcome or worldNotFound - // from server - welcome = "welcome", - worldNotFound = "worldNotFound", - gameDiff = "gameDiff", - setChunk = "setChunk", - newPlayer = "newPlayer", - playerLeave = "playerLeave", - // both - actions = "actions", - playerActions = "playerActions", -} - -export interface SocketMessageData extends Record { - [ISocketMessageType.joinWorld]: { - myUid: string; - worldId: string; - }; - [ISocketMessageType.newWorld]: { - myUid: string; - config: IConfig; - name: string; - }; - [ISocketMessageType.saveWorld]: { - worldId: string; - }; - [ISocketMessageType.getChunk]: { - pos: string; - }; - [ISocketMessageType.welcome]: ISocketWelcomePayload; - [ISocketMessageType.worldNotFound]: {}; - [ISocketMessageType.setChunk]: { - pos: string; - data: ISerializedChunk; - }; - [ISocketMessageType.newPlayer]: { - uid: string; - }; - [ISocketMessageType.playerLeave]: { - uid: string; - }; - [ISocketMessageType.gameDiff]: GameDiffDto; - [ISocketMessageType.actions]: GameActionDto; - [ISocketMessageType.playerActions]: PlayerActionDto; -} - -export type SocketMessageDto = MessageDto< - ISocketMessageType, - SocketMessageData ->; - -export class SocketMessage extends MessageHolder< - ISocketMessageType, - SocketMessageData -> { - static make( - type: T, - data: SocketMessageData[T] - ) { - return new SocketMessage(type, data); - } -} diff --git a/lib/engine/utils/face.ts b/lib/engine/utils/face.ts deleted file mode 100644 index 332a292..0000000 --- a/lib/engine/utils/face.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Vector3D } from "./vector.js"; - -export function getOppositeCubeFace(face: number) { - return face % 2 === 0 ? face + 1 : face - 1; -} - -export function faceVectorToFaceNumber(vector: Vector3D): number { - const index = (Vector3D.unitVectors - .map((val, index) => [val, index] as [Vector3D, number]) - .find(([val, _index]) => val.equals(vector)) ?? [-1, -1])[1]; - - if (index === -1) { - throw new Error("Couldn't find face vector"); - } - - return index; -} - -export function faceNumberToFaceVector(faceIndex: number): Vector3D { - return Vector3D.unitVectors[faceIndex]; -} diff --git a/lib/engine/utils/random.ts b/lib/engine/utils/random.ts deleted file mode 100644 index af35809..0000000 --- a/lib/engine/utils/random.ts +++ /dev/null @@ -1,48 +0,0 @@ -import seedrandom from "seedrandom"; -import random from "random"; -import { CONFIG } from "../src/config.js"; -import simplexNoise from "simplex-noise"; - -class RandomClass { - private _rndNoise: simplexNoise = new simplexNoise(); - private jagFactor = CONFIG.terrain.jagFactor; - - setSeed(seed: string) { - console.log("Setting random seed", seed); - random.use(seedrandom(seed)); - this._rndNoise = new simplexNoise(seed); - } - - // returns random number from [0,1] - noise(x: number, y: number) { - return this.customNoise(x, y, this.jagFactor); - } - - customNoise(x: number, y: number, jagFactor: number) { - const num = this._rndNoise.noise2D(x / jagFactor, y / jagFactor); - return (num + 1) / 2; - } - - randomNum() { - return random.float(0, 1); - } - - randomInt(min: number, max: number) { - return random.int(min, max); - } - - randomFloat(min: number, max: number) { - return random.float(min, max); - } - - randomString() { - return random.float(0, 1).toString(); - } - - randomElement(data: T[]) { - const rndIndex = this.randomInt(0, data.length - 1); - return data[rndIndex]; - } -} - -export const Random = new RandomClass(); diff --git a/lib/engine/world/index.ts b/lib/engine/world/index.ts deleted file mode 100644 index 942f3ff..0000000 --- a/lib/engine/world/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from "./biome.js"; -export * from "./chunk.js"; -export * from "./terrainGenerator.js"; -export * from "./world.js"; -export * from "./chunkMesh.js"; diff --git a/lib/engine/world/world.ts b/lib/engine/world/world.ts deleted file mode 100644 index 649f194..0000000 --- a/lib/engine/world/world.ts +++ /dev/null @@ -1,225 +0,0 @@ -import CubeHelpers, { - Cube, - ISerializedCube, - WasmCube, -} from "../entities/cube.js"; -import { ILookingAtData, ISerializedChunk } from "./chunk.js"; -import { Entity } from "../entities/entity.js"; -import { CONFIG } from "../src/config.js"; -import { Vector3D, Vector2D, Direction } from "../src/vector.js"; -import { WorldModule, WorldModuleTypes } from "../modules.js"; -import { ChunkMesh } from "./chunkMesh.js"; -import { CameraRay } from "../src/index.js"; - -export class World { - static make(data?: ISerializedWorld): World { - return WorldModule.createWorld(data); - } - - constructor( - public wasmWorld: WorldModuleTypes.World, - data?: ISerializedWorld - ) { - if (data) { - console.log("World: Loading world from data", data); - for (const chunkData of data.chunks) { - this.updateChunk(chunkData); - } - } - } - - serialize(): ISerializedWorld { - const ser = this.wasmWorld.serialize_wasm() as { - chunks: Map; - }; - console.log("Serializing world", ser); - return { - chunks: Array.from(ser.chunks.values()), - }; - } - - static worldPosToChunkPos(pos: Vector3D): Vector2D { - return new Vector2D([ - Math.floor(pos.get(0) / CONFIG.terrain.chunkSize), - Math.floor(pos.get(2) / CONFIG.terrain.chunkSize), - ]); - } - - static chunkPosToWorldPos(pos: Vector2D, center = false): Vector3D { - return new Vector3D([ - pos.get(0) * CONFIG.terrain.chunkSize + - (center ? CONFIG.terrain.chunkSize / 2 : 0), - 0, - pos.get(1) * CONFIG.terrain.chunkSize + - (center ? CONFIG.terrain.chunkSize / 2 : 0), - ]); - } - - static chunkIdToChunkPos(chunkId: string): Vector2D { - const [x, y] = chunkId.split(",").map((s) => parseInt(s)); - return new Vector2D([x, y]); - } - - getChunkFromPos(chunkPos: Vector2D): ISerializedChunk { - console.log("Getting chunk from pos", chunkPos); - const chunk = this.wasmWorld.get_chunk_from_chunk_pos_wasm({ - x: chunkPos.get(0), - y: chunkPos.get(1), - }); - return chunk; - } - - getChunkMesh(chunkPos: Vector2D): ChunkMesh { - const wasmMesh: Array<[WasmCube, { data: Array }]> = - this.wasmWorld.get_chunk_mesh_wasm(chunkPos.toCartIntObj()); - - const betterMesh = wasmMesh.map(([cube, { data }]) => { - const block = CubeHelpers.fromWasmCube(cube); - const faces = data - .map((b, i) => (b ? i : -1)) - .filter((i) => i !== -1) as Direction[]; - return { - block, - faces, - }; - }); - - return new ChunkMesh(betterMesh, chunkPos.toCartIntObj()); - } - - getBlockFromWorldPoint(pos: Vector3D): Cube | null { - const wasmBlock: ISerializedCube = this.wasmWorld.get_block_wasm( - pos.toCartIntObj() - ); - return CubeHelpers.fromWasmCube(wasmBlock); - } - - updateChunk(chunkData: ISerializedChunk) { - const time = performance.now(); - this.wasmWorld.insert_chunk_wasm(chunkData); - const time2 = performance.now(); - console.log(`Upserting chunk took (${time2 - time}ms)`); - } - - hasChunk(chunkPos: Vector2D): boolean { - try { - return this.wasmWorld.is_chunk_loaded_wasm({ - x: chunkPos.get(0), - y: chunkPos.get(1), - }); - } catch (e) { - console.error("Error in hasChunk", chunkPos, e); - throw e; - } - } - - getLoadedChunkIds(): string[] { - const loaded_pos = this.wasmWorld.get_loaded_chunk_pos() as { - x: number; - y: number; - }[]; - - return loaded_pos - .map((p: { x: number; y: number }) => { - return new Vector2D([p.x, p.y]); - }) - .map((p) => p.toIndex()); - } - - tryMove(entity: Entity, vel: Vector3D): Vector3D { - const endPos = { - x: entity.pos.get(0) + vel.get(0), - y: entity.pos.get(1) + vel.get(1), - z: entity.pos.get(2) + vel.get(2), - }; - const ent = { - pos: { - x: entity.pos.get(0), - y: entity.pos.get(1), - z: entity.pos.get(2), - }, - dim: { - x: entity.dim[0], - y: entity.dim[1], - z: entity.dim[2], - }, - }; - const newPos = this.wasmWorld.move_rect3_wasm(ent, endPos); - return new Vector3D([newPos.x, newPos.y, newPos.z]); - } - - getIntersectingBlocksWithEntity(pos: Vector3D, dim: Vector3D): Vector3D[] { - const worldPosList = this.wasmWorld.get_rect3_intersecting_blocks_wasm({ - pos: { - x: pos.get(0), - y: pos.get(1), - z: pos.get(2), - }, - dim: { - x: dim.get(0), - y: dim.get(1), - z: dim.get(2), - }, - }); - - const vecs: Vector3D[] = worldPosList.map( - (pos: { x: number; y: number; z: number }) => - new Vector3D([pos.x, pos.y, pos.z]) - ); - return vecs; - } - - /** - * @returns array of chunk ids that were affected - * */ - addBlock(cube: Cube): string[] { - // console.log("World: Adding block", cube); - const hasChunk = this.hasChunk(World.worldPosToChunkPos(cube.pos)); - if (!hasChunk) { - throw new Error("Trying to place block in unloaded chunk"); - } - const diff: { chunk_ids: string[] } = this.wasmWorld.add_block_wasm({ - block_type: cube.type, - extra_data: "None", - world_pos: { - x: cube.pos.get(0), - y: cube.pos.get(1), - z: cube.pos.get(2), - }, - }); - // console.log("Chunks to updated after adding block: ", diff); - return diff.chunk_ids; - } - - /** - * @returns array of chunk ids that were affected - * */ - removeBlock(cubePos: Vector3D): string[] { - // console.log("Removing block", cubePos); - const diff: { chunk_ids: string[] } = this.wasmWorld.remove_block_wasm( - cubePos.get(0), - cubePos.get(1), - cubePos.get(2) - ); - // console.log("Chunks to updated after removing block: ", diff); - return diff.chunk_ids; - } - - // lookingAt(camera: CameraRay): ILookingAtData | null { - // const lookingData: { - // block: ISerializedCube; - // face: string; - // distance: number; - // } | null = this.wasmWorld.get_pointed_at_block_wasm(camera); - - // console.log("Cam looking at ", lookingData, camera); - - // if (!lookingData) return null; - - // return { - // cube: CubeHelpers.fromWasmCube(lookingData.block), - // face: getDirectionFromString(lookingData.face), - // dist: lookingData.distance, - // }; - // } -} diff --git a/lib/world/src/block.rs b/lib/world/src/block.rs index 568290d..b094633 100644 --- a/lib/world/src/block.rs +++ b/lib/world/src/block.rs @@ -1,6 +1,6 @@ use crate::{ - direction::Direction, - positions::{ChunkPos, InnerChunkPos}, + chunk::{chunk_pos::ChunkPos, inner_chunk_pos::InnerChunkPos}, + geometry::direction::Direction, world::world_block::WorldBlock, }; use serde::{Deserialize, Serialize}; @@ -59,7 +59,7 @@ pub enum BlockData { pub mod wasm { use wasm_bindgen::prelude::wasm_bindgen; - use crate::direction::Direction; + use crate::geometry::direction::Direction; #[wasm_bindgen] pub struct ImageData { diff --git a/lib/world/src/chunk.rs b/lib/world/src/chunk/chunk.rs similarity index 95% rename from lib/world/src/chunk.rs rename to lib/world/src/chunk/chunk.rs index 1678730..8371051 100644 --- a/lib/world/src/chunk.rs +++ b/lib/world/src/chunk/chunk.rs @@ -1,16 +1,11 @@ use crate::block::{BlockData, BlockType, ChunkBlock}; -use crate::positions::{ChunkPos, InnerChunkPos}; +use crate::chunk::chunk_pos::ChunkPos; +use crate::chunk::inner_chunk_pos::InnerChunkPos; use crate::world::world_block::WorldBlock; use serde::{Deserialize, Serialize}; use serde_big_array::BigArray; use wasm_bindgen::prelude::*; -mod chunk_duct; -pub mod chunk_fetcher; -pub mod chunk_mesh; -#[cfg(test)] -mod chunk_unit_tests; - #[wasm_bindgen(typescript_custom_section)] const ITEXT_STYLE: &'static str = r#" interface ITextStyle { @@ -59,7 +54,7 @@ impl Default for Chunk { Chunk { blocks: [BlockType::Void; CHUNK_MEM_SIZE], block_data: [BlockData::None; CHUNK_MEM_SIZE], - position: ChunkPos { x: 0, y: 0 }, + position: ChunkPos::new(0, 0), dirty_blocks: Vec::new(), } } @@ -155,7 +150,7 @@ impl Chunk { } } - fn get_block_type(&self, pos: &InnerChunkPos) -> BlockType { + pub fn get_block_type(&self, pos: &InnerChunkPos) -> BlockType { self.get_block_type_at_index(pos.to_chunk_index()) } diff --git a/lib/world/src/chunk/chunk_duct.rs b/lib/world/src/chunk/chunk_duct.rs index 6c94e44..ac511c4 100644 --- a/lib/world/src/chunk/chunk_duct.rs +++ b/lib/world/src/chunk/chunk_duct.rs @@ -1,6 +1,5 @@ use crate::{ - chunk::{Chunk, InnerChunkPos}, - positions::ChunkPos, + chunk::{chunk::Chunk, chunk_pos::ChunkPos, inner_chunk_pos::InnerChunkPos}, world::world_block::WorldBlock, }; use serde_wasm_bindgen::{from_value, to_value, Error}; diff --git a/lib/world/src/chunk/chunk_fetcher.rs b/lib/world/src/chunk/chunk_fetcher.rs index b02c935..ad6c972 100644 --- a/lib/world/src/chunk/chunk_fetcher.rs +++ b/lib/world/src/chunk/chunk_fetcher.rs @@ -1,7 +1,7 @@ -use crate::chunk::Chunk; -use crate::entities::game::Game; -use crate::entities::terrain_gen::TerrainGenerator; -use crate::positions::ChunkPos; +use crate::chunk::chunk::Chunk; +use crate::chunk::chunk_pos::ChunkPos; +use crate::game::Game; +use crate::terrain_gen::TerrainGenerator; use lazy_static::lazy_static; use serde::{ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer}; use serde_json::Value; diff --git a/lib/world/src/chunk/chunk_mesh.rs b/lib/world/src/chunk/chunk_mesh.rs index f180c7a..721d6d3 100644 --- a/lib/world/src/chunk/chunk_mesh.rs +++ b/lib/world/src/chunk/chunk_mesh.rs @@ -1,8 +1,8 @@ use crate::{ + chunk::{chunk_pos::ChunkPos, inner_chunk_pos::InnerChunkPos}, components::world_pos::WorldPos, - direction::Directions, - plane::WorldPlane, - positions::{ChunkPos, InnerChunkPos}, + geometry::direction::Directions, + geometry::plane::WorldPlane, }; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -84,10 +84,10 @@ impl IntoIterator for &ChunkMesh { mod tests { use crate::{ chunk::chunk_mesh::{BlockMesh, ChunkMesh}, + chunk::chunk_pos::ChunkPos, components::world_pos::WorldPos, - direction::Directions, - positions::ChunkPos, - vec::Vector3Ops, + geometry::direction::Directions, + geometry::vec::Vector3Ops, }; #[test] diff --git a/lib/world/src/chunk/chunk_pos.rs b/lib/world/src/chunk/chunk_pos.rs new file mode 100644 index 0000000..06bde7a --- /dev/null +++ b/lib/world/src/chunk/chunk_pos.rs @@ -0,0 +1,121 @@ +use serde::{Deserialize, Serialize}; +use wasm_bindgen::prelude::wasm_bindgen; + +use crate::{ + chunk::chunk::CHUNK_WIDTH, components::world_pos::WorldPos, + entities::entity_component::impl_component, geometry::vec2::impl_vec2_ops, +}; + +use super::chunk::ChunkId; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[wasm_bindgen] +pub struct ChunkPos { + pub x: i16, + pub y: i16, +} + +impl_component!(ChunkPos); +impl_vec2_ops!(ChunkPos, i16); + +#[wasm_bindgen] +impl ChunkPos { + pub fn to_world_index(&self) -> i32 { + let x = self.x as i32; + let y = self.y as i32; + x + (y << 16) + } + + pub fn to_id(&self) -> u64 { + let a = if self.x >= 0 { + (2 * self.x as i64) as u64 + } else { + (-2 * self.x as i64 - 1) as u64 + }; + + let b = if self.y >= 0 { + (2 * self.y as i64) as u64 + } else { + (2 * -self.y as i64 - 1) as u64 + }; + + ((a + b) * (a + b + 1)) / 2 + a + } + + pub fn from_id(z: ChunkId) -> ChunkPos { + let w = (((8 * z + 1) as f64).sqrt() - 1.0) / 2.0; + let w = w.floor() as u64; + let t = (w * w + w) / 2; + let a = (z - t) as i32; + let b = (w as i32) - a; + + let x = if a % 2 == 0 { + (a / 2) as i16 + } else { + (-(a + 1) / 2) as i16 + }; + + let y = if b % 2 == 0 { + (b / 2) as i16 + } else { + (-(b + 1) / 2) as i16 + }; + + ChunkPos { x, y } + } + + pub fn to_world_pos(&self) -> WorldPos { + WorldPos { + x: self.x as i32 * CHUNK_WIDTH as i32 + CHUNK_WIDTH as i32 / 2, + y: 0, + z: self.y as i32 * CHUNK_WIDTH as i32 + CHUNK_WIDTH as i32 / 2, + } + } + + #[wasm_bindgen(constructor)] + pub fn new(x: i16, y: i16) -> Self { + ChunkPos { x, y } + } + + pub fn add(&self, vec: &ChunkPos) -> Self { + ChunkPos { + x: self.x + vec.x, + y: self.y + vec.y, + } + } + + pub fn scalar_mul(&self, val: i16) -> Self { + ChunkPos { + x: self.x * val, + y: self.y * val, + } + } + + pub fn move_to_3d(&self, y_val: i16) -> WorldPos { + WorldPos { + x: self.x as i32, + y: y_val as i32, + z: self.y as i32, + } + } + + pub fn get_adjacent_vecs(&self) -> Vec { + let mut vecs = Vec::new(); + vecs.push(self.clone()); + vecs.push(self.add(&ChunkPos::new(0, 1))); + vecs.push(self.add(&ChunkPos::new(1, 0))); + vecs.push(self.add(&ChunkPos::new(-1, 0))); + vecs.push(self.add(&ChunkPos::new(0, -1))); + vecs + } +} + +impl std::ops::Add for ChunkPos { + type Output = ChunkPos; + fn add(self, other: ChunkPos) -> ChunkPos { + ChunkPos { + x: self.x + other.x, + y: self.y + other.y, + } + } +} diff --git a/lib/world/src/chunk/chunk_unit_tests.rs b/lib/world/src/chunk/chunk_unit_tests.rs index c048281..3fdb731 100644 --- a/lib/world/src/chunk/chunk_unit_tests.rs +++ b/lib/world/src/chunk/chunk_unit_tests.rs @@ -1,6 +1,9 @@ -use super::{Chunk, ChunkPos, InnerChunkPos}; +use super::{chunk::Chunk, chunk_pos::ChunkPos, inner_chunk_pos::InnerChunkPos}; use crate::{ - block::{BlockData, BlockType}, chunk::ChunkBlock, vec::Vector3Ops, world::World + block::{BlockData, BlockType, ChunkBlock}, + components::world_pos::WorldPos, + geometry::vec::Vector3Ops, + world::World, }; #[test] @@ -128,3 +131,129 @@ fn deletes_blocks() { assert_eq!(block, BlockType::Void) } + +#[test] +fn index_conversion() { + fn do_test(index: usize, inner_chunk_pos: InnerChunkPos) -> () { + assert_eq!(inner_chunk_pos.to_chunk_index(), index); + assert_eq!(InnerChunkPos::make_from_chunk_index(index), inner_chunk_pos); + } + + do_test(1024 + 32 + 3, InnerChunkPos::new(1, 2, 3)); + do_test(0, InnerChunkPos::new(0, 0, 0)); +} + +#[test] +fn inner_chunk_pos_to_chunk_index() { + fn do_test(inner_chunk_pos: InnerChunkPos) { + let index = inner_chunk_pos.to_chunk_index(); + let inner_chunk_pos2 = InnerChunkPos::make_from_chunk_index(index); + assert_eq!(inner_chunk_pos, inner_chunk_pos2); + } + + do_test(InnerChunkPos::new(0, 0, 0)); + do_test(InnerChunkPos::new(15, 15, 15)); +} + +#[test] +fn inner_chunk_pos_to_world_pos() { + fn do_test(inner_chunk_pos: InnerChunkPos, chunk_pos: ChunkPos, world_pos: WorldPos) { + assert_eq!(inner_chunk_pos.to_world_pos(&chunk_pos), world_pos); + } + + do_test( + InnerChunkPos::new(1, 2, 3), + ChunkPos { x: 0, y: 0 }, + WorldPos { x: 1, y: 2, z: 3 }, + ); + + do_test( + InnerChunkPos::new(1, 2, 3), + ChunkPos { x: 1, y: 1 }, + WorldPos { x: 17, y: 2, z: 19 }, + ); + + do_test( + InnerChunkPos::new(1, 2, 3), + ChunkPos { x: -1, y: -1 }, + WorldPos { + x: -15, + y: 2, + z: -13, + }, + ); + + do_test( + InnerChunkPos::new(15, 0, 15), + ChunkPos { x: -2, y: -3 }, + WorldPos { + x: -17, + y: 0, + z: -33, + }, + ); +} + +#[test] +fn world_pos_to_chunk_pos() { + assert_eq!( + WorldPos { x: 1, y: 2, z: 3 }.to_chunk_pos(), + ChunkPos { x: 0, y: 0 } + ); + assert_eq!( + WorldPos { x: 0, y: 0, z: 0 }.to_chunk_pos(), + ChunkPos { x: 0, y: 0 } + ); + assert_eq!( + WorldPos { x: -1, y: 0, z: -1 }.to_chunk_pos(), + ChunkPos { x: -1, y: -1 } + ); + + assert_eq!( + WorldPos { + x: -16, + y: 0, + z: -16, + } + .to_chunk_pos(), + ChunkPos { x: -1, y: -1 } + ); + + assert_eq!( + WorldPos { x: 16, y: 0, z: 0 }.to_chunk_pos(), + ChunkPos { x: 1, y: 0 } + ); + + assert_eq!( + WorldPos { x: 0, y: 0, z: -1 }.to_chunk_pos(), + ChunkPos { x: 0, y: -1 } + ); +} + +#[test] +fn world_pos_to_inner_chunk_pos() { + assert_eq!( + WorldPos { x: 1, y: 2, z: 3 }.to_inner_chunk_pos(), + InnerChunkPos::new(1, 2, 3) + ); + + assert_eq!( + WorldPos { x: -1, y: 0, z: 1 }.to_inner_chunk_pos(), + InnerChunkPos::new(15, 0, 1) + ); + + assert_eq!( + WorldPos { x: -1, y: 0, z: -1 }.to_inner_chunk_pos(), + InnerChunkPos::new(15, 0, 15) + ); + + assert_eq!( + WorldPos { + x: -32, + y: 20, + z: 0, + } + .to_inner_chunk_pos(), + InnerChunkPos::new(0, 20, 0) + ); +} diff --git a/lib/world/src/chunk/inner_chunk_pos.rs b/lib/world/src/chunk/inner_chunk_pos.rs new file mode 100644 index 0000000..16cd498 --- /dev/null +++ b/lib/world/src/chunk/inner_chunk_pos.rs @@ -0,0 +1,42 @@ +use serde::{Deserialize, Serialize}; +use wasm_bindgen::prelude::wasm_bindgen; + +use crate::{ + chunk::{chunk_pos::ChunkPos, CHUNK_WIDTH}, + components::world_pos::WorldPos, + entities::entity_component::impl_component, + geometry::vec::{impl_vector_ops, Vector3Ops}, +}; + +#[wasm_bindgen] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct InnerChunkPos { + x: i8, + y: i8, + z: i8, +} + +impl_component!(InnerChunkPos); +impl_vector_ops!(InnerChunkPos, i8); + +#[wasm_bindgen] +impl InnerChunkPos { + pub fn to_chunk_index(&self) -> usize { + let x_part = (self.x as usize) << (4 + 6); + let y_part = (self.y as usize) << 4; + let z_part = self.z as usize; + x_part + y_part + z_part + } + + pub fn make_from_chunk_index(index: usize) -> InnerChunkPos { + let x_part = (index >> (4 + 6)) as i8; + let y_part = ((index & 0b1111110000) >> 4) as i8; + let z_part = (index & 0b1111) as i8; + InnerChunkPos::new(x_part, y_part, z_part) + } + + pub fn to_world_pos(&self, chunk_pos: &ChunkPos) -> WorldPos { + let pos = chunk_pos.scalar_mul(CHUNK_WIDTH).move_to_3d(0).add(self); + WorldPos::new(pos.x() as i32, pos.y() as i32, pos.z() as i32) + } +} diff --git a/lib/world/src/chunk/mod.rs b/lib/world/src/chunk/mod.rs new file mode 100644 index 0000000..4cd8c64 --- /dev/null +++ b/lib/world/src/chunk/mod.rs @@ -0,0 +1,8 @@ +pub mod chunk; +pub mod chunk_duct; +pub mod chunk_fetcher; +pub mod chunk_mesh; +pub mod chunk_pos; +pub mod chunk_unit_tests; +pub mod inner_chunk_pos; +pub use chunk::{Chunk, CHUNK_HEIGHT, CHUNK_WIDTH}; diff --git a/lib/world/src/components/fine_world_pos.rs b/lib/world/src/components/fine_world_pos.rs index 93d204c..70dca04 100644 --- a/lib/world/src/components/fine_world_pos.rs +++ b/lib/world/src/components/fine_world_pos.rs @@ -1,8 +1,11 @@ -use std::ops::Add; use crate::components::world_pos::WorldPos; -use crate::{entities::entity_component::impl_component, vec::{impl_vector_ops, Vec3f32, Vector3Ops}}; -use wasm_bindgen::prelude::*; +use crate::{ + entities::entity_component::impl_component, + geometry::vec::{impl_vector_ops, Vector3Ops}, +}; use serde::{Deserialize, Serialize}; +use std::ops::Add; +use wasm_bindgen::prelude::*; use super::velocity::Velocity; @@ -21,19 +24,10 @@ impl_component!(FineWorldPos); impl_vector_ops!(FineWorldPos, f32); impl FineWorldPos { - pub fn from_vec3(vec: Vec3f32) -> Self { - Self { - x: vec.x(), - y: vec.y(), - z: vec.z(), - } - } - pub fn new(x: f32, y: f32, z: f32) -> Self { Self { x, y, z } } - pub fn to_world_pos(&self) -> WorldPos { WorldPos { x: self.x as i32, @@ -55,7 +49,6 @@ impl FineWorldPos { } } - impl Add for FineWorldPos { type Output = Self; @@ -66,4 +59,36 @@ impl Add for FineWorldPos { z: self.z + other.z, } } -} \ No newline at end of file +} + +#[cfg(test)] +pub mod tests { + use crate::{components::fine_world_pos::FineWorldPos, geometry::vec::Vector3Ops}; + + #[test] + fn test_distance_to() { + let vec1 = FineWorldPos { + x: 0 as f32, + y: 0 as f32, + z: 0 as f32, + }; + let vec2 = FineWorldPos { + x: 1 as f32, + y: 1 as f32, + z: 1 as f32, + }; + assert_eq!(vec1.distance_to(&vec2), 1.7320508); + + let vec1 = FineWorldPos { + x: 0 as f32, + y: 0 as f32, + z: 0 as f32, + }; + let vec2 = FineWorldPos { + x: 1 as f32, + y: 0 as f32, + z: 0 as f32, + }; + assert_eq!(vec1.distance_to(&vec2), 1.0); + } +} diff --git a/lib/world/src/components/size3.rs b/lib/world/src/components/size3.rs index 9828503..43f3aa9 100644 --- a/lib/world/src/components/size3.rs +++ b/lib/world/src/components/size3.rs @@ -1,4 +1,4 @@ -use crate::{entities::entity_component::impl_component, vec::impl_vector_ops}; +use crate::{entities::entity_component::impl_component, geometry::vec::impl_vector_ops}; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; diff --git a/lib/world/src/components/velocity.rs b/lib/world/src/components/velocity.rs index 374768c..14be886 100644 --- a/lib/world/src/components/velocity.rs +++ b/lib/world/src/components/velocity.rs @@ -1,4 +1,4 @@ -use crate::{entities::entity_component::impl_component, vec::impl_vector_ops}; +use crate::{entities::entity_component::impl_component, geometry::vec::impl_vector_ops}; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; diff --git a/lib/world/src/components/world_pos.rs b/lib/world/src/components/world_pos.rs index 4f59889..992f419 100644 --- a/lib/world/src/components/world_pos.rs +++ b/lib/world/src/components/world_pos.rs @@ -2,10 +2,9 @@ use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; use crate::{ - chunk::{CHUNK_HEIGHT, CHUNK_WIDTH}, + chunk::{chunk_pos::ChunkPos, inner_chunk_pos::InnerChunkPos, CHUNK_HEIGHT, CHUNK_WIDTH}, entities::entity_component::impl_component, - positions::{ChunkPos, InnerChunkPos}, - vec::{impl_vector_ops, Vector3Ops}, + geometry::vec::{impl_vector_ops, Vector3Ops}, }; use super::fine_world_pos::FineWorldPos; diff --git a/lib/world/src/entities/entities.rs b/lib/world/src/entities/entities.rs index 6be01a8..2d908f6 100644 --- a/lib/world/src/entities/entities.rs +++ b/lib/world/src/entities/entities.rs @@ -1,3 +1,5 @@ +use crate::game::Game; + use super::entity::{Entity, EntityId}; use super::entity_component::Component; use super::fireball::Fireball; @@ -91,7 +93,6 @@ impl Entities { } } -#[wasm_bindgen] impl Entities { pub fn add_entity(&mut self, entity: Entity) { self.entities.push(entity); @@ -105,11 +106,6 @@ impl Entities { to_value(self).unwrap() } - pub fn from_js(value: JsValue) -> Result { - let entity_holder: Entities = from_value(value)?; - Ok(entity_holder) - } - pub fn get_entity_as_player(&self, id: EntityId) -> Option { self.get_entity_by_id(id).map(|entity| entity.as_player()) } @@ -126,3 +122,32 @@ impl Entities { self.get_entity_by_id(id).map(|entity| entity.clone()) } } + +#[wasm_bindgen] +impl Game { + #[wasm_bindgen(js_name = "getEntityAsPlayer")] + pub fn get_entity_as_player(&self, id: EntityId) -> Option { + self.entities.get_entity_as_player(id) + } + + #[wasm_bindgen(js_name = "getEntityById")] + pub fn get_entity_by_id(&self, id: EntityId) -> Option { + self.entities.get_entity_by_id_clone(id) + } + + #[wasm_bindgen(js_name = "getAllEntities")] + pub fn get_all_entities(&self) -> Vec { + self.entities.get_all_clone() + } + + #[wasm_bindgen(js_name = "deserializeEntities")] + pub fn deserialize_entities(value: JsValue) -> Result { + let entity_holder: Entities = from_value(value)?; + Ok(entity_holder) + } + + #[wasm_bindgen(js_name = "serializeEntities")] + pub fn serialize_entities(&self) -> JsValue { + to_value(&self.entities).unwrap() + } +} diff --git a/lib/world/src/entities/entity.rs b/lib/world/src/entities/entity.rs index c641202..41c4cde 100644 --- a/lib/world/src/entities/entity.rs +++ b/lib/world/src/entities/entity.rs @@ -69,9 +69,14 @@ impl<'de> Deserialize<'de> for Entity { let parsed_value = serde_json::from_str(&value).map_err(de::Error::custom)?; - let deser = registry - .get(type_name.as_str()) - .ok_or_else(|| de::Error::custom(format!("Unknown component: {}", type_name)))?; + let all_type_names = registry.keys().cloned().collect::>(); + + let deser = registry.get(type_name.as_str()).ok_or_else(|| { + de::Error::custom(format!( + "Unknown component: {} all_type_names: {:?}", + type_name, all_type_names + )) + })?; entity.components.push(deser(parsed_value)); } diff --git a/lib/world/src/entities/entity_action.rs b/lib/world/src/entities/entity_action.rs index 49e86f7..56b1c79 100644 --- a/lib/world/src/entities/entity_action.rs +++ b/lib/world/src/entities/entity_action.rs @@ -1,12 +1,12 @@ use super::entities::Entities; use super::entity::{Entity, EntityId}; -use super::game::GameSchedule; -use crate::entities::player_belt_script::{ +use crate::game::GameSchedule; +use crate::scripts::player_belt_script::{ SecondaryBeltActionData, SelectItemActionData, UsePrimaryItemActionData, }; -use crate::entities::player_jump_script::JumpActionData; -use crate::entities::player_move_script::MoveActionData; -use crate::entities::player_rot_script::RotateActionData; +use crate::scripts::player_jump_script::JumpActionData; +use crate::scripts::player_move_script::MoveActionData; +use crate::scripts::player_rot_script::RotateActionData; use crate::utils::js_log; use crate::world::World; use lazy_static::lazy_static; diff --git a/lib/world/src/entities/entity_component.rs b/lib/world/src/entities/entity_component.rs index b24b1f7..32bd2d2 100644 --- a/lib/world/src/entities/entity_component.rs +++ b/lib/world/src/entities/entity_component.rs @@ -7,11 +7,12 @@ use crate::{ components::{ fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity, world_pos::WorldPos, }, - entities::{ - player::Health, player_belt_script::Belt, player_gravity_script::GravityData, - player_jump_script::JumpData, player_move_script::MovingDirection, velocity_script::Forces, - }, + entities::player::Health, geometry::rotation::SphericalRotation, + scripts::{ + player_belt_script::Belt, player_gravity_script::GravityData, player_jump_script::JumpData, + player_move_script::MovingDirection, velocity_script::Forces, + }, }; pub trait Component: Any + Debug { diff --git a/lib/world/src/entities/fireball.rs b/lib/world/src/entities/fireball.rs index 9b64c98..e38fee2 100644 --- a/lib/world/src/entities/fireball.rs +++ b/lib/world/src/entities/fireball.rs @@ -1,11 +1,11 @@ use super::{ entities::{EntityQuery, EntityQueryResults}, entity::{make_entity_id, Entity}, - game::GameSchedule, - game_script::GameScript, player::Health, - velocity_script::Forces, }; +use crate::game::GameSchedule; +use crate::scripts::game_script::GameScript; +use crate::scripts::velocity_script::Forces; use crate::{ chunk::chunk_fetcher::ChunkFetcher, components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}, diff --git a/lib/world/src/entities/items.rs b/lib/world/src/entities/items.rs deleted file mode 100644 index 0e37741..0000000 --- a/lib/world/src/entities/items.rs +++ /dev/null @@ -1,108 +0,0 @@ -// #[derive(Serialize, Deserialize)] -// enum EntityAction { -// Jump, -// PrimaryAction, -// SecondaryAction, -// Move(Vec), -// ToggleFly, -// Rotate(SphericalRotation), -// TP(FineWorldPos), -// } -// -// -// #[repr(u8)] -// #[derive(Serialize, Deserialize)] -// pub enum GameAction { -// Entity(EntityId, EntityAction), -// } - -// trait Item { -// fn use_item(&self, ent: &impl Entity) -> GameDiff; -// } -// -// struct FireballItem { -// current_cooldown: u8, -// cooldown: u8, -// } -// -// impl Item for FireballItem { -// fn use_item(&self, ent: &impl Entity) -> GameDiff { -// let mut diff = GameDiff::empty(); -// -// if self.current_cooldown > 0 { -// return diff; -// } - -// Do math -// const vel = this.rot.toCartesianCoords().scalarMultiply(-0.4); -// vel.set(1, -vel.get(1)); -// -// const pos = this.pos -// .add(vel.scalarMultiply(2)) -// .add(new Vector3D(this.dim).scalarMultiply(0.5)); -// -// -// let fireball_entity = FireballEntity { -// pos: FineWorldPos {}, -// vel: Velocity, -// life: 100, -// }; -// -// let firebox = Box::new(fireball_entity); -// diff.new_entities.push(firebox); - -// diff -// } -// } -// -// struct BlockItem { -// block_type: BlockType, -// } -// -// impl Item for BlockItem { -// fn use_item(&self, ent: &impl Entity) -> GameDiff { -// let mut diff = GameDiff::empty(); -// Do math -// const vel = this.rot.toCartesianCoords().scalarMultiply(-0.4); -// vel.set(1, -vel.get(1)); -// -// const pos = this.pos -// .add(vel.scalarMultiply(2)) -// .add(new Vector3D(this.dim).scalarMultiply(0.5)); -// -// -// let block_entity = WorldBlock { -// pos: FineWorldPos {}, -// block_type: self.block_type, -// }; -// diff.new_blocks.push(block_entity); -// diff -// const ray = this.getRay(); -// const lookingData = game.world.lookingAt(ray); -// if (!lookingData) return; -// console.log("Looking at data", lookingData); -// const { cube } = lookingData; -// if (!cube) return; -// -// const newCubePos = lookingData.cube.pos.add( -// Vector3D.fromDirection(lookingData.face) -// ); -// -// const newCube = CubeHelpers.createCube(blockType, newCubePos); -// -// console.log("Placed Cube", newCube); -// -// game.placeBlock(newCube); -// } -// } - -// enum Item { -// Block(BlockType), -// Fireball, -// } - -// #[wasm_bindgen] -// struct Belt { -// selected_index: u8, -// items: Vec, -// } diff --git a/lib/world/src/entities/mod.rs b/lib/world/src/entities/mod.rs index 4b2b4fd..c6337b9 100644 --- a/lib/world/src/entities/mod.rs +++ b/lib/world/src/entities/mod.rs @@ -3,14 +3,4 @@ pub mod entity; pub mod entity_action; pub mod entity_component; pub mod fireball; -pub mod game; -pub mod game_script; pub mod player; -pub mod player_belt_script; -pub mod player_gravity_script; -pub mod player_jump_script; -pub mod player_move_script; -pub mod player_rot_script; -pub mod sandbox; -pub mod terrain_gen; -pub mod velocity_script; diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index d12b2dc..f6f2db1 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -4,12 +4,12 @@ use wasm_bindgen::prelude::wasm_bindgen; use super::{ entity::{Entity, EntityId}, entity_component::impl_component, - player_belt_script::Belt, - player_gravity_script::GravityData, - player_jump_script::JumpData, - player_move_script::MovingDirection, - velocity_script::Forces, }; +use crate::scripts::player_belt_script::Belt; +use crate::scripts::player_gravity_script::GravityData; +use crate::scripts::player_jump_script::JumpData; +use crate::scripts::player_move_script::MovingDirection; +use crate::scripts::velocity_script::Forces; use crate::{ components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}, geometry::rotation::SphericalRotation, diff --git a/lib/world/src/entities/test.rs b/lib/world/src/entities/test.rs deleted file mode 100644 index e69de29..0000000 diff --git a/lib/world/src/entities/game.rs b/lib/world/src/game.rs similarity index 94% rename from lib/world/src/entities/game.rs rename to lib/world/src/game.rs index 2e740d0..897f620 100644 --- a/lib/world/src/entities/game.rs +++ b/lib/world/src/game.rs @@ -1,25 +1,27 @@ -use super::{ - entities::Entities, - entity::{Entity, EntityId}, - entity_action::{EntityActionDto, EntityActionHolder}, - game_script::{GameScript, GameScripts}, -}; use crate::{ - chunk::{chunk_fetcher::ChunkFetcher, Chunk, ChunkId}, + chunk::{ + chunk::{Chunk, ChunkId}, + chunk_fetcher::ChunkFetcher, + chunk_pos::ChunkPos, + }, components::world_pos::WorldPos, entities::{ - entity_action::EntityActionDtoMaker, + entities::Entities, + entity::{Entity, EntityId}, + entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHolder}, fireball::FireballScript, player::make_player, + }, + scripts::{ + game_script::GameScripts, player_belt_script::{SecondaryBeltAction, SelectItemAction, UsePrimaryItemAction}, player_gravity_script::GravityScript, player_jump_script::JumpAction, player_move_script::{MoveAction, MoveScript}, player_rot_script::RotateAction, - terrain_gen::TerrainGenerator, velocity_script::VelocityScript, }, - positions::ChunkPos, + terrain_gen::TerrainGenerator, utils::js_log, world::{world_block::WorldBlock, World}, }; @@ -375,7 +377,17 @@ impl GameSchedule { } mod tests { - + use crate::{ + components::{fine_world_pos::FineWorldPos, velocity::Velocity}, + entities::{entity_action::EntityActionDtoMaker, player::make_player}, + game::Game, + geometry::direction::Direction, + scripts::{ + player_jump_script::{JumpAction, JumpActionData}, + player_move_script::{MoveAction, MoveActionData, MoveScript}, + velocity_script::VelocityScript, + }, + }; #[test] pub fn add_player() { diff --git a/lib/world/src/direction.rs b/lib/world/src/geometry/direction.rs similarity index 98% rename from lib/world/src/direction.rs rename to lib/world/src/geometry/direction.rs index 760a57d..320ab50 100644 --- a/lib/world/src/direction.rs +++ b/lib/world/src/geometry/direction.rs @@ -1,7 +1,5 @@ -use crate::{ - geometry::{rotation::SphericalRotation, vec2::Vec2Ops}, - vec::Vector3Ops, -}; +use crate::geometry::vec::Vector3Ops; +use crate::geometry::{rotation::SphericalRotation, vec2::Vec2Ops}; use num::One; use serde::{Deserialize, Serialize}; use std::{ diff --git a/lib/world/src/geometry/line_segment.rs b/lib/world/src/geometry/line_segment.rs index 02628ff..1a88ec7 100644 --- a/lib/world/src/geometry/line_segment.rs +++ b/lib/world/src/geometry/line_segment.rs @@ -1,6 +1,7 @@ use crate::{ chunk::chunk_mesh::BlockMesh, components::fine_world_pos::FineWorldPos, - direction::DirectionVectorExtension, plane::WorldPlane, vec::Vector3Ops, world::World, + geometry::direction::DirectionVectorExtension, geometry::plane::WorldPlane, + geometry::vec::Vector3Ops, world::World, }; use serde::{Deserialize, Serialize}; use std::cmp::Ordering; @@ -186,11 +187,13 @@ impl World { #[cfg(test)] pub mod tests { use crate::{ - chunk::{chunk_mesh::BlockMesh, Chunk}, + chunk::chunk_mesh::BlockMesh, components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, - direction::{Direction, Directions}, - plane::WorldPlane, - vec::Vector3Ops, + geometry::{ + direction::{Direction, Directions}, + plane::WorldPlane, + vec::Vector3Ops, + }, }; use super::{LineSegment, LineSegmentIntersectionInfo}; diff --git a/lib/world/src/geometry/mod.rs b/lib/world/src/geometry/mod.rs index 9789aaf..6f680e2 100644 --- a/lib/world/src/geometry/mod.rs +++ b/lib/world/src/geometry/mod.rs @@ -1,5 +1,8 @@ +pub mod direction; pub mod line_segment; +pub mod plane; pub mod ray; pub mod rect3; pub mod rotation; +pub mod vec; pub mod vec2; diff --git a/lib/world/src/plane.rs b/lib/world/src/geometry/plane.rs similarity index 95% rename from lib/world/src/plane.rs rename to lib/world/src/geometry/plane.rs index ec9ef92..877a776 100644 --- a/lib/world/src/plane.rs +++ b/lib/world/src/geometry/plane.rs @@ -1,7 +1,5 @@ -use crate::{ - components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, - direction::{Direction, DirectionVectorExtension}, -}; +use crate::components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}; +use crate::geometry::direction::{Direction, DirectionVectorExtension}; use serde::{Deserialize, Serialize}; #[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Copy)] @@ -77,8 +75,7 @@ impl WorldPlane { mod tests { use crate::{ components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, - direction::Direction, - vec::Vector3Ops, + geometry::{direction::Direction, vec::Vector3Ops}, }; use super::WorldPlane; diff --git a/lib/world/src/geometry/ray.rs b/lib/world/src/geometry/ray.rs index e00a861..48b10be 100644 --- a/lib/world/src/geometry/ray.rs +++ b/lib/world/src/geometry/ray.rs @@ -2,9 +2,9 @@ use super::{line_segment::LineSegment, rotation::SphericalRotation}; use crate::{ chunk::chunk_mesh::BlockMesh, components::fine_world_pos::FineWorldPos, - direction::{Direction, DirectionVectorExtension}, - plane::WorldPlane, - vec::Vector3Ops, + geometry::direction::{Direction, DirectionVectorExtension}, + geometry::plane::WorldPlane, + geometry::vec::Vector3Ops, world::{world_block::WorldBlock, World}, }; use serde::{Deserialize, Serialize}; @@ -38,8 +38,8 @@ pub struct LookingAt { impl Ray { pub fn move_forward_mut(&mut self, amount: f32) { - let rot_vec = self.rot.get_unit_vector(); - self.pos = FineWorldPos::from_vec3(rot_vec.scalar_mult(amount)); + let rot_vec = self.rot.get_unit_vector().scalar_mult(amount); + self.pos = FineWorldPos::new(rot_vec.x(), rot_vec.y(), rot_vec.z()); } pub fn move_forward(&self, amount: f32) -> Ray { @@ -107,12 +107,12 @@ mod tests { use super::{LookingAt, Ray}; use crate::{ block::{BlockData, BlockType}, - chunk::{chunk_mesh::BlockMesh, Chunk}, + chunk::{chunk::Chunk, chunk_mesh::BlockMesh}, components::{fine_world_pos::FineWorldPos, world_pos::WorldPos}, - direction::{Direction, Directions}, + geometry::direction::{Direction, Directions}, + geometry::plane::WorldPlane, geometry::rotation::SphericalRotation, - plane::WorldPlane, - vec::Vector3Ops, + geometry::vec::Vector3Ops, world::{world_block::WorldBlock, World}, }; diff --git a/lib/world/src/geometry/rect3.rs b/lib/world/src/geometry/rect3.rs index 435d42b..0043d3c 100644 --- a/lib/world/src/geometry/rect3.rs +++ b/lib/world/src/geometry/rect3.rs @@ -1,8 +1,8 @@ use crate::components::fine_world_pos::FineWorldPos; use crate::components::size3::Size3; use crate::components::world_pos::WorldPos; -use crate::direction::DirectionVectorExtension; -use crate::vec::Vector3Ops; +use crate::geometry::direction::DirectionVectorExtension; +use crate::geometry::vec::Vector3Ops; use crate::world::World; use super::line_segment::{LineSegment, LineSegmentIntersectionInfo}; @@ -312,7 +312,7 @@ pub mod tests { chunk::Chunk, components::{fine_world_pos::FineWorldPos, size3::Size3, world_pos::WorldPos}, geometry::rect3::Rect3, - vec::Vector3Ops, + geometry::vec::Vector3Ops, world::{world_block::WorldBlock, World}, }; diff --git a/lib/world/src/geometry/rotation.rs b/lib/world/src/geometry/rotation.rs index 64994bc..b3174b9 100644 --- a/lib/world/src/geometry/rotation.rs +++ b/lib/world/src/geometry/rotation.rs @@ -1,8 +1,6 @@ -use crate::vec::Vector3Ops; use crate::{ components::{fine_world_pos::FineWorldPos, velocity::Velocity}, entities::entity_component::impl_component, - vec::Vec3f32, }; use serde::{Deserialize, Serialize}; use std::{f32::consts::PI, ops::Add}; @@ -32,11 +30,11 @@ impl SphericalRotation { SphericalRotation { theta, phi } } - pub fn get_unit_vector(&self) -> Vec3f32 { + pub fn get_unit_vector(&self) -> Velocity { let phi_offset = (PI / 2.0) - self.phi; let theta_offset = self.theta + (PI / 2.0); - Vec3f32::new( + Velocity::new( -(theta_offset.cos() * phi_offset.sin()), -phi_offset.cos(), theta_offset.sin() * phi_offset.sin(), @@ -103,7 +101,7 @@ impl Into for SphericalRotation { #[cfg(test)] mod tests { use super::*; - use crate::direction::Direction; + use crate::geometry::direction::Direction; impl Velocity { fn assert_eq(&self, other: Velocity) { diff --git a/lib/world/src/geometry/vec.rs b/lib/world/src/geometry/vec.rs new file mode 100644 index 0000000..7c3f26f --- /dev/null +++ b/lib/world/src/geometry/vec.rs @@ -0,0 +1,224 @@ +use crate::geometry::direction::{DirectionVectorExtension, Directions}; +use num::{integer::Roots, traits::real::Real, One, Zero}; +use std::{ + fmt::Display, + ops::{Div, Neg, Sub}, +}; + +pub trait AsF32 { + fn as_f32(self) -> f32; +} + +// Note: this might cut off the precision of bigger numbers +impl AsF32 for i32 { + fn as_f32(self) -> f32 { + self as f32 + } +} + +impl AsF32 for f32 { + fn as_f32(self) -> f32 { + self + } +} + +impl AsF32 for i16 { + fn as_f32(self) -> f32 { + self as f32 + } +} + +impl AsF32 for u8 { + fn as_f32(self) -> f32 { + self as f32 + } +} + +impl AsF32 for i8 { + fn as_f32(self) -> f32 { + self as f32 + } +} + +pub trait Vector3Ops: Sized { + type Scalar: Copy + + std::ops::Add + + std::ops::Sub + + std::ops::Mul + + std::ops::Div + + Display + + One + + Neg + + Zero + + AsF32 + + Copy; + + fn new(x: Self::Scalar, y: Self::Scalar, z: Self::Scalar) -> Self; + fn x(&self) -> Self::Scalar; + fn y(&self) -> Self::Scalar; + fn z(&self) -> Self::Scalar; + + fn set_x(&mut self, val: Self::Scalar); + fn set_y(&mut self, val: Self::Scalar); + fn set_z(&mut self, val: Self::Scalar); + + fn copy(&self) -> Self { + Self::new(self.x(), self.y(), self.z()) + } + + fn add(&self, other: &V) -> Self + where + V: Vector3Ops, + V::Scalar: Into, + Self::Scalar: std::ops::Add, + { + Self::new( + self.x() + other.x().into(), + self.y() + other.y().into(), + self.z() + other.z().into(), + ) + } + + fn sub>(&self, other: &V) -> Self { + Self::new( + self.x() - other.x(), + self.y() - other.y(), + self.z() - other.z(), + ) + } + + fn scalar_mult(&self, val: Self::Scalar) -> Self { + Self::new(self.x() * val, self.y() * val, self.z() * val) + } + + fn sqr(&self) -> Self { + Self::new( + self.x() * self.x(), + self.y() * self.y(), + self.z() * self.z(), + ) + } + + fn dot>(&self, other: &V) -> Self::Scalar { + self.x() * other.x() + self.y() * other.y() + self.z() * other.z() + } + + fn magnitude_squared(&self) -> Self::Scalar { + self.x() * self.x() + self.y() * self.y() + self.z() * self.z() + } + + fn get_mag(&self) -> f32 { + let x = self.x().as_f32(); + let y = self.y().as_f32(); + let z = self.z().as_f32(); + + (x * x + y * y + z * z).sqrt() + } + + fn sum(&self) -> Self::Scalar { + self.x() + self.y() + self.z() + } + + fn set_mag(&self, mag: Self::Scalar) -> Self + where + Self::Scalar: Into + From + Div, + { + let current_mag = self.get_mag(); + let scale: Self::Scalar = mag / current_mag; + self.scalar_mult(scale) + } + + fn distance_to(&self, vec: &U) -> f32 + where + U: Vector3Ops, + { + self.sub(vec).sqr().sum().as_f32().sqrt() + } + + fn map(&self, f: F) -> Self + where + F: Fn(Self::Scalar) -> Self::Scalar, + { + Self::new(f(self.x()), f(self.y()), f(self.z())) + } + + fn get_adjacent_vecs(&self) -> Vec { + let mut vecs = Vec::new(); + for direction in Directions::all() { + vecs.push(self.move_direction(&direction)); + } + vecs + } + + /** + * Like get_adjacent_vecs, but also returns the original vector + */ + fn get_cross_vecs(&self) -> Vec { + let mut vecs: Vec = Vec::new(); + vecs.push(self.copy()); + for direction in Directions::all() { + vecs.push(self.move_direction(&direction)); + } + vecs + } + + /** + * Returns all blocks in a cube around the vector + * I am not proud of this + */ + fn get_cube_vecs(&self) -> Vec { + let mut vecs: Vec = Vec::new(); + vecs.push(self.copy()); + let one = Self::Scalar::one(); + let zero = Self::Scalar::zero(); + for x in [-one, one, zero].iter().cloned() { + for y in [-one, one, zero].iter().cloned() { + for z in [-one, one, zero].iter().cloned() { + vecs.push(Self::new(self.x() + x, self.y() + y, self.z() + z)); + } + } + } + + vecs + } + + fn to_index(&self) -> String { + format!("{},{},{}", self.x(), self.y(), self.z()) + .as_str() + .to_owned() + } +} + +// Macro to implement common operations +macro_rules! impl_vector_ops { + ($vector_type:ident, $scalar_type:ty) => { + impl $crate::geometry::vec::Vector3Ops for $vector_type { + type Scalar = $scalar_type; + + fn new(x: Self::Scalar, y: Self::Scalar, z: Self::Scalar) -> Self { + Self { x, y, z } + } + + fn x(&self) -> Self::Scalar { + self.x + } + fn y(&self) -> Self::Scalar { + self.y + } + fn z(&self) -> Self::Scalar { + self.z + } + + fn set_x(&mut self, val: Self::Scalar) { + self.x = val + } + fn set_y(&mut self, val: Self::Scalar) { + self.y = val + } + fn set_z(&mut self, val: Self::Scalar) { + self.z = val + } + } + }; +} +pub(crate) use impl_vector_ops; diff --git a/lib/world/src/geometry/vec2.rs b/lib/world/src/geometry/vec2.rs index 224a9f9..2e1a52f 100644 --- a/lib/world/src/geometry/vec2.rs +++ b/lib/world/src/geometry/vec2.rs @@ -1,11 +1,9 @@ -use crate::vec::{AsF32, Vec3i16}; +use crate::geometry::vec::AsF32; use num::{integer::Roots, traits::real::Real, One, Zero}; -use serde::{Deserialize, Serialize}; use std::{ fmt::Display, ops::{Add, Div, Mul, Neg, Sub}, }; -use wasm_bindgen::prelude::wasm_bindgen; pub trait Vec2Ops: Sized { type Scalar: Copy @@ -93,65 +91,3 @@ macro_rules! impl_vec2_ops { }; } pub(crate) use impl_vec2_ops; - -pub struct Vec2f32 { - x: f32, - y: f32, -} - -impl_vec2_ops!(Vec2f32, f32); - -#[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Deserialize)] -#[wasm_bindgen] -pub struct Vec2i16 { - pub x: i16, - pub y: i16, -} - -#[wasm_bindgen] -impl Vec2i16 { - #[wasm_bindgen(constructor)] - pub fn new_wasm(x: i16, y: i16) -> Self { - Vec2i16 { x, y } - } -} - -impl_vec2_ops!(Vec2i16, i16); - -impl Vec2i16 { - pub fn new(x: i16, y: i16) -> Self { - Vec2i16 { x, y } - } - - pub fn add(&self, vec: Vec2i16) -> Self { - Vec2i16 { - x: self.x + vec.x, - y: self.y + vec.y, - } - } - - pub fn scalar_mul(&self, val: i16) -> Self { - Vec2i16 { - x: self.x * val, - y: self.y * val, - } - } - - pub fn move_to_3d(&self, y_val: i16) -> Vec3i16 { - Vec3i16 { - x: self.x, - y: y_val, - z: self.y, - } - } - - pub fn get_adjacent_vecs(&self) -> Vec { - let mut vecs = Vec::new(); - vecs.push(self.clone()); - vecs.push(self.add(Vec2i16 { x: 0, y: 1 })); - vecs.push(self.add(Vec2i16 { x: 1, y: 0 })); - vecs.push(self.add(Vec2i16 { x: -1, y: 0 })); - vecs.push(self.add(Vec2i16 { x: 0, y: -1 })); - vecs - } -} diff --git a/lib/world/src/lib.rs b/lib/world/src/lib.rs index 3c1b880..96a3ae6 100644 --- a/lib/world/src/lib.rs +++ b/lib/world/src/lib.rs @@ -1,14 +1,13 @@ pub mod block; pub mod chunk; -pub mod direction; +pub mod components; pub mod entities; +pub mod game; pub mod geometry; -pub mod plane; -pub mod positions; +pub mod scripts; +pub mod terrain_gen; pub mod utils; -pub mod vec; pub mod world; -pub mod components; use wasm_bindgen::prelude::*; diff --git a/lib/world/src/positions.rs b/lib/world/src/positions.rs deleted file mode 100644 index 3e2f1e8..0000000 --- a/lib/world/src/positions.rs +++ /dev/null @@ -1,156 +0,0 @@ -use tsify::declare; -use wasm_bindgen::prelude::wasm_bindgen; - -use crate::{ - chunk::{ChunkId, CHUNK_WIDTH}, - components::world_pos::WorldPos, - entities::{entity_component::impl_component, game::Game}, - geometry::vec2::Vec2i16, - vec::{Vec3u8, Vector3Ops}, -}; - -#[cfg(test)] -mod unit_tests; - -pub type InnerChunkPos = Vec3u8; -#[declare] -pub type ChunkPos = Vec2i16; - -impl_component!(ChunkPos); -impl_component!(InnerChunkPos); - -impl InnerChunkPos { - pub fn to_chunk_index(&self) -> usize { - let x_part = (self.x as usize) << (4 + 6); - let y_part = (self.y as usize) << 4; - let z_part = self.z as usize; - x_part + y_part + z_part - } - - pub fn make_from_chunk_index(index: usize) -> InnerChunkPos { - let x_part = (index >> (4 + 6)) as i8; - let y_part = ((index & 0b1111110000) >> 4) as i8; - let z_part = (index & 0b1111) as i8; - InnerChunkPos::new(x_part, y_part, z_part) - } - - pub fn to_world_pos(&self, chunk_pos: &ChunkPos) -> WorldPos { - let pos = chunk_pos.scalar_mul(CHUNK_WIDTH).move_to_3d(0).add(self); - WorldPos::new(pos.x() as i32, pos.y() as i32, pos.z() as i32) - } -} - -#[wasm_bindgen] -impl Game { - #[wasm_bindgen(js_name = "chunkIndexToWorldPos")] - pub fn chunk_index_to_world_pos(&self, index: usize, chunk_pos: &ChunkPos) -> WorldPos { - InnerChunkPos::make_from_chunk_index(index).to_world_pos(chunk_pos) - } - - #[wasm_bindgen(js_name = "chunkIdToWorldPos")] - pub fn chunk_id_to_world_pos(&self, chunk_id: ChunkId) -> WorldPos { - ChunkPos::from_id(chunk_id).to_world_pos() - } - - #[wasm_bindgen(js_name = "chunkIdToChunkPos")] - pub fn chunk_id_to_chunk_pos(&self, chunk_id: ChunkId) -> ChunkPos { - ChunkPos::from_id(chunk_id) - } -} - -// impl WorldPos { - -// pub fn is_valid(&self) -> bool { -// self.y >= 0 && self.y < 256 -// } - -// pub fn to_inner_chunk_pos(&self) -> InnerChunkPos { -// let x = (((self.x as i8 % 16) + 16) % 16) as u8; -// let y = self.y as u8; -// let z = (((self.z as i8 % 16) + 16) % 16) as u8; -// InnerChunkPos::new(x, y, z) -// } - -// pub fn to_chunk_pos(&self) -> ChunkPos { -// let x = if self.x < 0 { -// ((self.x + 1) / CHUNK_WIDTH as i32) - 1 -// } else { -// self.x / CHUNK_WIDTH as i32 -// }; - -// let y = if self.z < 0 { -// ((self.z + 1) / CHUNK_WIDTH as i32) - 1 -// } else { -// self.z / CHUNK_WIDTH as i32 -// }; - -// ChunkPos { -// x: x as i16, -// y: y as i16, -// } -// } -// } - -impl ChunkPos { - pub fn to_world_index(&self) -> i32 { - let x = self.x as i32; - let y = self.y as i32; - x + (y << 16) - } - - pub fn to_id(&self) -> u64 { - let a = if self.x >= 0 { - (2 * self.x as i64) as u64 - } else { - (-2 * self.x as i64 - 1) as u64 - }; - - let b = if self.y >= 0 { - (2 * self.y as i64) as u64 - } else { - (2 * -self.y as i64 - 1) as u64 - }; - - ((a + b) * (a + b + 1)) / 2 + a - } - - pub fn from_id(z: ChunkId) -> ChunkPos { - let w = (((8 * z + 1) as f64).sqrt() - 1.0) / 2.0; - let w = w.floor() as u64; - let t = (w * w + w) / 2; - let a = (z - t) as i32; - let b = (w as i32) - a; - - let x = if a % 2 == 0 { - (a / 2) as i16 - } else { - (-(a + 1) / 2) as i16 - }; - - let y = if b % 2 == 0 { - (b / 2) as i16 - } else { - (-(b + 1) / 2) as i16 - }; - - ChunkPos { x, y } - } - - pub fn to_world_pos(&self) -> WorldPos { - WorldPos { - x: self.x as i32 * CHUNK_WIDTH as i32 + CHUNK_WIDTH as i32 / 2, - y: 0, - z: self.y as i32 * CHUNK_WIDTH as i32 + CHUNK_WIDTH as i32 / 2, - } - } -} - -impl std::ops::Add for ChunkPos { - type Output = ChunkPos; - fn add(self, other: ChunkPos) -> ChunkPos { - ChunkPos { - x: self.x + other.x, - y: self.y + other.y, - } - } -} diff --git a/lib/world/src/positions/unit_tests.rs b/lib/world/src/positions/unit_tests.rs deleted file mode 100644 index 08684a3..0000000 --- a/lib/world/src/positions/unit_tests.rs +++ /dev/null @@ -1,127 +0,0 @@ -use crate::{positions::{ChunkPos, InnerChunkPos, WorldPos}, vec::Vector3Ops}; - -#[test] -fn index_conversion() { - fn do_test(index: usize, inner_chunk_pos: InnerChunkPos) -> () { - assert_eq!(inner_chunk_pos.to_chunk_index(), index); - assert_eq!(InnerChunkPos::make_from_chunk_index(index), inner_chunk_pos); - } - - do_test(1024 + 32 + 3, InnerChunkPos::new(1, 2, 3)); - do_test(0, InnerChunkPos::new(0, 0, 0)); -} - -#[test] -fn inner_chunk_pos_to_chunk_index() { - fn do_test(inner_chunk_pos: InnerChunkPos) { - let index = inner_chunk_pos.to_chunk_index(); - let inner_chunk_pos2 = InnerChunkPos::make_from_chunk_index(index); - assert_eq!(inner_chunk_pos, inner_chunk_pos2); - } - - do_test(InnerChunkPos::new(0, 0, 0)); - do_test(InnerChunkPos::new(15, 15, 15)); -} - -#[test] -fn inner_chunk_pos_to_world_pos() { - fn do_test(inner_chunk_pos: InnerChunkPos, chunk_pos: ChunkPos, world_pos: WorldPos) { - assert_eq!(inner_chunk_pos.to_world_pos(&chunk_pos), world_pos); - } - - do_test( - InnerChunkPos::new(1, 2, 3), - ChunkPos { x: 0, y: 0 }, - WorldPos { x: 1, y: 2, z: 3 }, - ); - - do_test( - InnerChunkPos::new(1, 2, 3), - ChunkPos { x: 1, y: 1 }, - WorldPos { x: 17, y: 2, z: 19 }, - ); - - do_test( - InnerChunkPos::new(1, 2, 3), - ChunkPos { x: -1, y: -1 }, - WorldPos { - x: -15, - y: 2, - z: -13, - }, - ); - - do_test( - InnerChunkPos::new(15, 0, 15), - ChunkPos { x: -2, y: -3 }, - WorldPos { - x: -17, - y: 0, - z: -33, - }, - ); -} - -#[test] -fn world_pos_to_chunk_pos() { - assert_eq!( - WorldPos { x: 1, y: 2, z: 3 }.to_chunk_pos(), - ChunkPos { x: 0, y: 0 } - ); - assert_eq!( - WorldPos { x: 0, y: 0, z: 0 }.to_chunk_pos(), - ChunkPos { x: 0, y: 0 } - ); - assert_eq!( - WorldPos { x: -1, y: 0, z: -1 }.to_chunk_pos(), - ChunkPos { x: -1, y: -1 } - ); - - assert_eq!( - WorldPos { - x: -16, - y: 0, - z: -16, - } - .to_chunk_pos(), - ChunkPos { x: -1, y: -1 } - ); - - assert_eq!( - WorldPos { x: 16, y: 0, z: 0 }.to_chunk_pos(), - ChunkPos { x: 1, y: 0 } - ); - - assert_eq!( - WorldPos { x: 0, y: 0, z: -1 }.to_chunk_pos(), - ChunkPos { x: 0, y: -1 } - ); -} - -#[test] -fn world_pos_to_inner_chunk_pos() { - assert_eq!( - WorldPos { x: 1, y: 2, z: 3 }.to_inner_chunk_pos(), - InnerChunkPos { x: 1, y: 2, z: 3 } - ); - - assert_eq!( - WorldPos { x: -1, y: 0, z: 1 }.to_inner_chunk_pos(), - InnerChunkPos { x: 15, y: 0, z: 1 } - ); - - assert_eq!( - WorldPos { x: -1, y: 0, z: -1 }.to_inner_chunk_pos(), - InnerChunkPos { x: 15, y: 0, z: 15 } - ); - - assert_eq!( - WorldPos { - x: -32, - y: 20, - z: 0, - } - .to_inner_chunk_pos(), - InnerChunkPos { x: 0, y: 20, z: 0 } - ); -} diff --git a/lib/world/src/entities/game_script.rs b/lib/world/src/scripts/game_script.rs similarity index 96% rename from lib/world/src/entities/game_script.rs rename to lib/world/src/scripts/game_script.rs index e168c49..945a8c7 100644 --- a/lib/world/src/entities/game_script.rs +++ b/lib/world/src/scripts/game_script.rs @@ -1,13 +1,14 @@ -use super::entities::{EntityQuery, EntityQueryResults}; -use super::entity::EntityId; -use super::game::GameSchedule; -use crate::chunk::{chunk_fetcher::ChunkFetcher, ChunkId}; +use crate::chunk::chunk::ChunkId; +use crate::chunk::chunk_fetcher::ChunkFetcher; +use crate::entities::entities::{EntityQuery, EntityQueryResults}; +use crate::entities::entity::EntityId; use crate::entities::fireball::FireballScript; -use crate::entities::game::Game; -use crate::entities::player_gravity_script::GravityScript; -use crate::entities::player_move_script::MoveScript; -use crate::entities::sandbox::SandBoxGScript; -use crate::entities::velocity_script::VelocityScript; +use crate::game::Game; +use crate::game::GameSchedule; +use crate::scripts::player_gravity_script::GravityScript; +use crate::scripts::player_move_script::MoveScript; +use crate::scripts::sandbox::SandBoxGScript; +use crate::scripts::velocity_script::VelocityScript; use crate::utils::js_log; use crate::world::World; use js_sys::JSON; diff --git a/lib/world/src/scripts/mod.rs b/lib/world/src/scripts/mod.rs new file mode 100644 index 0000000..0c6b0ff --- /dev/null +++ b/lib/world/src/scripts/mod.rs @@ -0,0 +1,9 @@ +pub mod game_script; +pub mod player_belt_script; +pub mod player_gravity_script; +pub mod player_jump_script; +pub mod player_move_script; +pub mod player_rot_script; +pub mod sandbox; +pub mod script_map; +pub mod velocity_script; diff --git a/lib/world/src/entities/player_belt_script.rs b/lib/world/src/scripts/player_belt_script.rs similarity index 96% rename from lib/world/src/entities/player_belt_script.rs rename to lib/world/src/scripts/player_belt_script.rs index 976219d..2c911d8 100644 --- a/lib/world/src/entities/player_belt_script.rs +++ b/lib/world/src/scripts/player_belt_script.rs @@ -6,17 +6,18 @@ use crate::{ world::world_block::WorldBlock, }; -use super::{entity_action::EntityActionHandler, fireball::make_fireball, game::GameSchedule}; +use crate::entities::{entity_action::EntityActionHandler, fireball::make_fireball}; +use crate::game::GameSchedule; use serde::{Deserialize, Serialize}; use tsify::Tsify; -use super::{ +use crate::entities::{ entity::{Entity, EntityId}, entity_action::{EntityActionDto, EntityActionDtoMaker}, entity_component::impl_component, }; -use crate::direction::DirectionVectorExtension; -use crate::{vec::Vector3Ops, world::World}; +use crate::geometry::direction::DirectionVectorExtension; +use crate::{geometry::vec::Vector3Ops, world::World}; use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; // ================== Primary Action ================== diff --git a/lib/world/src/entities/player_gravity_script.rs b/lib/world/src/scripts/player_gravity_script.rs similarity index 90% rename from lib/world/src/entities/player_gravity_script.rs rename to lib/world/src/scripts/player_gravity_script.rs index 525b07f..cfb7f57 100644 --- a/lib/world/src/entities/player_gravity_script.rs +++ b/lib/world/src/scripts/player_gravity_script.rs @@ -1,10 +1,8 @@ -use super::{ - entities::{EntityQuery, EntityQueryResults}, - entity_component::impl_component, - game::GameSchedule, - game_script::GameScript, - velocity_script::Forces, -}; +use crate::entities::entities::{EntityQuery, EntityQueryResults}; +use crate::entities::entity_component::impl_component; +use crate::game::GameSchedule; +use crate::scripts::game_script::GameScript; +use crate::scripts::velocity_script::Forces; use crate::{chunk::chunk_fetcher::ChunkFetcher, components::velocity::Velocity, world::World}; use serde::{Deserialize, Serialize}; use serde_json; diff --git a/lib/world/src/entities/player_jump_script.rs b/lib/world/src/scripts/player_jump_script.rs similarity index 85% rename from lib/world/src/entities/player_jump_script.rs rename to lib/world/src/scripts/player_jump_script.rs index be7e2b0..f9db7d1 100644 --- a/lib/world/src/entities/player_jump_script.rs +++ b/lib/world/src/scripts/player_jump_script.rs @@ -1,13 +1,11 @@ use serde::{Deserialize, Serialize}; -use super::{ - entity::{Entity, EntityId}, - entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}, - entity_component::impl_component, - game::GameSchedule, -}; +use crate::entities::entity::{Entity, EntityId}; +use crate::entities::entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}; +use crate::entities::entity_component::impl_component; +use crate::game::GameSchedule; use crate::{ - components::velocity::Velocity, entities::velocity_script::Forces, utils::js_log, world::World, + components::velocity::Velocity, scripts::velocity_script::Forces, utils::js_log, world::World, }; use wasm_bindgen::prelude::wasm_bindgen; diff --git a/lib/world/src/entities/player_move_script.rs b/lib/world/src/scripts/player_move_script.rs similarity index 90% rename from lib/world/src/entities/player_move_script.rs rename to lib/world/src/scripts/player_move_script.rs index bf7b459..b1a1e44 100644 --- a/lib/world/src/entities/player_move_script.rs +++ b/lib/world/src/scripts/player_move_script.rs @@ -1,15 +1,14 @@ -use super::{ - entities::{EntityQuery, EntityQueryResults}, - entity::Entity, - entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}, - entity_component::impl_component, - game::GameSchedule, - game_script::GameScript, - velocity_script::Forces, -}; +use crate::entities::entities::{EntityQuery, EntityQueryResults}; +use crate::entities::entity::Entity; +use crate::entities::entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}; +use crate::entities::entity_component::impl_component; +use crate::game::GameSchedule; +use crate::scripts::game_script::GameScript; +use crate::scripts::velocity_script::Forces; use crate::{ - chunk::chunk_fetcher::ChunkFetcher, components::velocity::Velocity, direction::Direction, - geometry::rotation::SphericalRotation, vec::Vector3Ops, world::World, + chunk::chunk_fetcher::ChunkFetcher, components::velocity::Velocity, + geometry::direction::Direction, geometry::rotation::SphericalRotation, + geometry::vec::Vector3Ops, world::World, }; use serde::{Deserialize, Serialize}; use serde_json; diff --git a/lib/world/src/entities/player_rot_script.rs b/lib/world/src/scripts/player_rot_script.rs similarity index 89% rename from lib/world/src/entities/player_rot_script.rs rename to lib/world/src/scripts/player_rot_script.rs index a133e06..4ee5990 100644 --- a/lib/world/src/entities/player_rot_script.rs +++ b/lib/world/src/scripts/player_rot_script.rs @@ -1,6 +1,6 @@ -use super::entity::{Entity, EntityId}; -use super::entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}; -use super::game::GameSchedule; +use crate::entities::entity::{Entity, EntityId}; +use crate::entities::entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}; +use crate::game::GameSchedule; use crate::geometry::rotation::SphericalRotation; use crate::world::World; use serde::{Deserialize, Serialize}; diff --git a/lib/world/src/entities/sandbox.rs b/lib/world/src/scripts/sandbox.rs similarity index 93% rename from lib/world/src/entities/sandbox.rs rename to lib/world/src/scripts/sandbox.rs index 6de1d97..541b648 100644 --- a/lib/world/src/entities/sandbox.rs +++ b/lib/world/src/scripts/sandbox.rs @@ -1,11 +1,9 @@ -use super::{ - entities::{EntityQuery, EntityQueryResults}, - game::GameSchedule, - game_script::GameScript, -}; +use crate::chunk::chunk_pos::ChunkPos; +use crate::entities::entities::{EntityQuery, EntityQueryResults}; +use crate::game::GameSchedule; +use crate::scripts::game_script::GameScript; use crate::{ - chunk::chunk_fetcher::ChunkFetcher, components::fine_world_pos::FineWorldPos, - positions::ChunkPos, world::World, + chunk::chunk_fetcher::ChunkFetcher, components::fine_world_pos::FineWorldPos, world::World, }; use serde::Serialize; use serde_json; diff --git a/lib/world/src/entities/script_map.rs b/lib/world/src/scripts/script_map.rs similarity index 100% rename from lib/world/src/entities/script_map.rs rename to lib/world/src/scripts/script_map.rs diff --git a/lib/world/src/entities/velocity_script.rs b/lib/world/src/scripts/velocity_script.rs similarity index 91% rename from lib/world/src/entities/velocity_script.rs rename to lib/world/src/scripts/velocity_script.rs index cff308b..e1cb41b 100644 --- a/lib/world/src/entities/velocity_script.rs +++ b/lib/world/src/scripts/velocity_script.rs @@ -1,14 +1,12 @@ -use super::{ - entities::{EntityQuery, EntityQueryResults}, - entity_component::impl_component, - game::GameSchedule, - game_script::GameScript, -}; +use crate::entities::entities::{EntityQuery, EntityQueryResults}; +use crate::entities::entity_component::impl_component; +use crate::game::GameSchedule; +use crate::scripts::game_script::GameScript; use crate::{ chunk::chunk_fetcher::ChunkFetcher, components::{fine_world_pos::FineWorldPos, size3::Size3, velocity::Velocity}, geometry::rect3::Rect3, - vec::Vector3Ops, + geometry::vec::Vector3Ops, }; use serde::{Deserialize, Serialize}; use serde_json; diff --git a/lib/world/src/entities/terrain_gen.rs b/lib/world/src/terrain_gen.rs similarity index 98% rename from lib/world/src/entities/terrain_gen.rs rename to lib/world/src/terrain_gen.rs index d382892..407019d 100644 --- a/lib/world/src/entities/terrain_gen.rs +++ b/lib/world/src/terrain_gen.rs @@ -1,13 +1,13 @@ use crate::chunk::chunk_fetcher::ChunkLoader; -use crate::direction::DirectionVectorExtension2; +use crate::geometry::direction::DirectionVectorExtension2; use crate::{ block::{BlockData, BlockType, ChunkBlock}, - chunk::{Chunk, CHUNK_WIDTH}, + chunk::{chunk::Chunk, chunk::CHUNK_WIDTH}, + chunk::{chunk_pos::ChunkPos, inner_chunk_pos::InnerChunkPos}, components::world_pos::WorldPos, - direction::{Direction, DirectionVectorExtension, Directions, EVERY_FLAT_DIRECTION}, + geometry::direction::{Direction, DirectionVectorExtension, Directions, EVERY_FLAT_DIRECTION}, + geometry::vec::Vector3Ops, geometry::vec2::Vec2Ops, - positions::{ChunkPos, InnerChunkPos}, - vec::Vector3Ops, world::world_block::WorldBlock, }; use noise::{NoiseFn, Perlin}; diff --git a/lib/world/src/vec.rs b/lib/world/src/vec.rs deleted file mode 100644 index 78602cb..0000000 --- a/lib/world/src/vec.rs +++ /dev/null @@ -1,497 +0,0 @@ -use crate::direction::DirectionVectorExtension; -use crate::direction::Directions; -use num::{integer::Roots, traits::real::Real, One, Zero}; -use serde::{Deserialize, Serialize}; -use std::{ - fmt::Display, - ops::{Div, Neg, Sub}, -}; -use wasm_bindgen::prelude::wasm_bindgen; - -pub trait AsF32 { - fn as_f32(self) -> f32; -} - -// Note: this might cut off the precision of bigger numbers -impl AsF32 for i32 { - fn as_f32(self) -> f32 { - self as f32 - } -} - -impl AsF32 for f32 { - fn as_f32(self) -> f32 { - self - } -} - -impl AsF32 for i16 { - fn as_f32(self) -> f32 { - self as f32 - } -} - -impl AsF32 for u8 { - fn as_f32(self) -> f32 { - self as f32 - } -} - -impl AsF32 for i8 { - fn as_f32(self) -> f32 { - self as f32 - } -} - -pub trait Vector3Ops: Sized { - type Scalar: Copy - + std::ops::Add - + std::ops::Sub - + std::ops::Mul - + std::ops::Div - + Display - + One - + Neg - + Zero - + AsF32 - + Copy; - - fn new(x: Self::Scalar, y: Self::Scalar, z: Self::Scalar) -> Self; - fn x(&self) -> Self::Scalar; - fn y(&self) -> Self::Scalar; - fn z(&self) -> Self::Scalar; - - fn set_x(&mut self, val: Self::Scalar); - fn set_y(&mut self, val: Self::Scalar); - fn set_z(&mut self, val: Self::Scalar); - - fn copy(&self) -> Self { - Self::new(self.x(), self.y(), self.z()) - } - - fn add(&self, other: &V) -> Self - where - V: Vector3Ops, - V::Scalar: Into, - Self::Scalar: std::ops::Add, - { - Self::new( - self.x() + other.x().into(), - self.y() + other.y().into(), - self.z() + other.z().into(), - ) - } - - fn sub>(&self, other: &V) -> Self { - Self::new( - self.x() - other.x(), - self.y() - other.y(), - self.z() - other.z(), - ) - } - - fn scalar_mult(&self, val: Self::Scalar) -> Self { - Self::new(self.x() * val, self.y() * val, self.z() * val) - } - - fn sqr(&self) -> Self { - Self::new( - self.x() * self.x(), - self.y() * self.y(), - self.z() * self.z(), - ) - } - - fn dot>(&self, other: &V) -> Self::Scalar { - self.x() * other.x() + self.y() * other.y() + self.z() * other.z() - } - - fn magnitude_squared(&self) -> Self::Scalar { - self.x() * self.x() + self.y() * self.y() + self.z() * self.z() - } - - fn get_mag(&self) -> f32 { - let x = self.x().as_f32(); - let y = self.y().as_f32(); - let z = self.z().as_f32(); - - (x * x + y * y + z * z).sqrt() - } - - fn sum(&self) -> Self::Scalar { - self.x() + self.y() + self.z() - } - - fn set_mag(&self, mag: Self::Scalar) -> Self - where - Self::Scalar: Into + From + Div, - { - let current_mag = self.get_mag(); - let scale: Self::Scalar = mag / current_mag; - self.scalar_mult(scale) - } - - fn distance_to(&self, vec: &U) -> f32 - where - U: Vector3Ops, - { - self.sub(vec).sqr().sum().as_f32().sqrt() - } - - fn map(&self, f: F) -> Self - where - F: Fn(Self::Scalar) -> Self::Scalar, - { - Self::new(f(self.x()), f(self.y()), f(self.z())) - } - - fn get_adjacent_vecs(&self) -> Vec { - let mut vecs = Vec::new(); - for direction in Directions::all() { - vecs.push(self.move_direction(&direction)); - } - vecs - } - - /** - * Like get_adjacent_vecs, but also returns the original vector - */ - fn get_cross_vecs(&self) -> Vec { - let mut vecs: Vec = Vec::new(); - vecs.push(self.copy()); - for direction in Directions::all() { - vecs.push(self.move_direction(&direction)); - } - vecs - } - - /** - * Returns all blocks in a cube around the vector - * I am not proud of this - */ - fn get_cube_vecs(&self) -> Vec { - let mut vecs: Vec = Vec::new(); - vecs.push(self.copy()); - let one = Self::Scalar::one(); - let zero = Self::Scalar::zero(); - for x in [-one, one, zero].iter().cloned() { - for y in [-one, one, zero].iter().cloned() { - for z in [-one, one, zero].iter().cloned() { - vecs.push(Self::new(self.x() + x, self.y() + y, self.z() + z)); - } - } - } - - vecs - } - - fn to_index(&self) -> String { - format!("{},{},{}", self.x(), self.y(), self.z()) - .as_str() - .to_owned() - } -} - -// Macro to implement common operations -macro_rules! impl_vector_ops { - ($vector_type:ident, $scalar_type:ty) => { - impl $crate::vec::Vector3Ops for $vector_type { - type Scalar = $scalar_type; - - fn new(x: Self::Scalar, y: Self::Scalar, z: Self::Scalar) -> Self { - Self { x, y, z } - } - - fn x(&self) -> Self::Scalar { - self.x - } - fn y(&self) -> Self::Scalar { - self.y - } - fn z(&self) -> Self::Scalar { - self.z - } - - fn set_x(&mut self, val: Self::Scalar) { - self.x = val - } - fn set_y(&mut self, val: Self::Scalar) { - self.y = val - } - fn set_z(&mut self, val: Self::Scalar) { - self.z = val - } - } - }; -} -pub(crate) use impl_vector_ops; - -pub struct Vec3f32 { - x: f32, - y: f32, - z: f32, -} - -impl_vector_ops!(Vec3f32, f32); - -pub struct Vec3i16 { - pub x: i16, - pub y: i16, - pub z: i16, -} - -impl_vector_ops!(Vec3i16, i16); - -#[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Deserialize)] -#[wasm_bindgen] -pub struct Vec3u8 { - pub x: i8, - pub y: i8, - pub z: i8, -} - -impl_vector_ops!(Vec3u8, i8); - -// #[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Deserialize)] -// pub struct Vec2 { -// pub x: T, -// pub y: T, -// } - -// impl Sub> for Vec2 -// where -// T: Sub + Copy, -// { -// type Output = Vec2; - -// fn sub(self, rhs: Vec2) -> Self::Output { -// Vec2 { -// x: self.x - rhs.x, -// y: self.y - rhs.y, -// } -// } -// } - -// impl Mul> for Vec2 -// where -// T: Mul + Copy, -// U: Copy, -// { -// type Output = Vec2; - -// fn mul(self, rhs: Vec2) -> Self::Output { -// Vec2 { -// x: self.x * rhs.x, -// y: self.y * rhs.y, -// } -// } -// } - -// impl + Clone + Copy + PartialOrd + Into> Vec2 { -// pub fn new(x: T, y: T) -> Vec2 { -// Vec2 { x, y } -// } - -// pub fn to_index(&self) -> String -// where -// T: Display, -// { -// format!("{},{}", self.x, self.y).as_str().to_owned() -// } - -// pub fn scalar_mul(&self, val: T) -> Vec2 -// where -// T: Mul + Copy, -// { -// Vec2 { -// x: self.x * val, -// y: self.y * val, -// } -// } - -// pub fn add_vec(&self, vec: Vec2) -> Vec2 -// where -// T: Mul + Copy, -// { -// Vec2 { -// x: self.x * vec.x, -// y: self.y * vec.y, -// } -// } - -// pub fn sum(&self) -> T { -// self.x + self.y -// } - -// /** Returns a list of adjacent vectors that lie in a flat plane -// * I.e no vectors that have a different y direction. -// */ -// pub fn get_adjacent_vecs(&self) -> Vec> -// where -// T: Copy + Add + AddAssign + One + SubAssign, -// { -// let mut adj_vecs: Vec> = Vec::new(); -// for direction in EVERY_FLAT_DIRECTION { -// let adj_vec = self.move_in_flat_direction(&direction); -// adj_vecs.push(adj_vec); -// } -// adj_vecs -// } - -// // disclaimer, this is weird. -// pub fn move_to_3d(&self, y_val: T) -> Vec3 -// where -// T: Copy, -// { -// Vec3 { -// x: self.x, -// y: y_val, -// z: self.y, -// } -// } - -// pub fn distance_to(&self, vec: Vec2) -> f32 -// where -// U: Sub + Copy + Mul + Add, -// T: Sub + Copy + Mul + Add, -// f32: From, -// { -// let diff = *self - vec; -// let diff_squared = diff * diff; -// let sum = diff_squared.sum(); -// // take the sqrt of sum -// let sum_f32: f32 = sum.into() as f32; -// sum_f32.sqrt() -// } - -// pub fn move_in_flat_direction(&self, direction: &FlatDirection) -> Vec2 -// where -// T: Copy + Add + AddAssign + One + SubAssign, -// { -// let mut new_vec = *self; -// match direction { -// FlatDirection::North => new_vec.y += T::one(), -// FlatDirection::South => new_vec.y -= T::one(), -// FlatDirection::East => new_vec.x += T::one(), -// FlatDirection::West => new_vec.x -= T::one(), -// } -// new_vec -// } -// } - -// #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] -// #[repr(C)] -// pub struct Vec3 { -// pub x: T, -// pub y: T, -// pub z: T, -// } - -// impl Add> for Vec3 -// where -// T: Add + Copy, -// { -// type Output = Vec3; -// fn add(self, rhs: Vec3) -> Self::Output { -// Vec3 { -// x: self.x + rhs.x, -// y: self.y + rhs.y, -// z: self.z + rhs.z, -// } -// } -// } - -// impl Sub> for Vec3 -// where -// T: Sub + Copy, -// { -// type Output = Vec3; - -// fn sub(self, rhs: Vec3) -> Self::Output { -// Vec3 { -// x: self.x - rhs.x, -// y: self.y - rhs.y, -// z: self.z - rhs.z, -// } -// } -// } - -// impl Mul> for Vec3 -// where -// T: Mul + Copy, -// U: Copy, -// { -// type Output = Vec3; - -// fn mul(self, rhs: Vec3) -> Self::Output { -// Vec3 { -// x: self.x * rhs.x, -// y: self.y * rhs.y, -// z: self.z * rhs.z, -// } -// } -// } - -// impl Mul for Vec3 -// where -// T: Mul + Copy, -// U: Copy + Num, -// { -// type Output = Vec3; - -// fn mul(self, val: U) -> Self::Output { -// Vec3 { -// x: self.x * val, -// y: self.y * val, -// z: self.z * val, -// } -// } -// } - -// impl< -// T: Add -// + Sub -// + Mul -// + Display -// + Copy -// + AddAssign -// + One -// + SubAssign, -// > Vec3 -// { -// pub fn new(x: T, y: T, z: T) -> Vec3 { -// Vec3 { x, y, z } -// } -// } - -#[cfg(test)] -pub mod tests { - use crate::vec::{Vec3f32, Vector3Ops}; - - #[test] - fn test_distance_to() { - let vec1 = Vec3f32 { - x: 0 as f32, - y: 0 as f32, - z: 0 as f32, - }; - let vec2 = Vec3f32 { - x: 1 as f32, - y: 1 as f32, - z: 1 as f32, - }; - assert_eq!(vec1.distance_to(&vec2), 1.7320508); - - let vec1 = Vec3f32 { - x: 0 as f32, - y: 0 as f32, - z: 0 as f32, - }; - let vec2 = Vec3f32 { - x: 1 as f32, - y: 0 as f32, - z: 0 as f32, - }; - assert_eq!(vec1.distance_to(&vec2), 1.0); - } -} diff --git a/lib/world/src/world/mod.rs b/lib/world/src/world/mod.rs index 961cc7f..23136e6 100644 --- a/lib/world/src/world/mod.rs +++ b/lib/world/src/world/mod.rs @@ -1,11 +1,10 @@ use self::world_block::WorldBlock; use crate::block::BlockType; +use crate::chunk::chunk::Chunk; use crate::chunk::chunk_mesh::ChunkMesh; -use crate::chunk::Chunk; use crate::components::world_pos::WorldPos; -use crate::direction::{Direction, DirectionVectorExtension, Directions}; -use crate::entities::game::Game; -use crate::positions::ChunkPos; +use crate::game::Game; +use crate::geometry::direction::{Direction, DirectionVectorExtension, Directions}; use rustc_hash::FxHashMap; use serde::{Deserialize, Serialize}; use std::collections::HashSet; @@ -159,7 +158,8 @@ mod tests { use super::*; use crate::{ block::{BlockData, BlockType}, - vec::Vector3Ops, + chunk::{chunk::Chunk, chunk_pos::ChunkPos}, + geometry::vec::Vector3Ops, }; #[test] diff --git a/lib/world/src/world/world_block.rs b/lib/world/src/world/world_block.rs index 87e185b..487c933 100644 --- a/lib/world/src/world/world_block.rs +++ b/lib/world/src/world/world_block.rs @@ -1,7 +1,7 @@ use crate::{ block::{BlockData, BlockMetaData, BlockShape, BlockType, ChunkBlock}, components::world_pos::WorldPos, - direction::Directions, + geometry::direction::Directions, world::AdjacentBlocks, }; use serde::{Deserialize, Serialize}; @@ -93,7 +93,7 @@ mod tests { use crate::{ block::{BlockData, BlockType}, components::world_pos::WorldPos, - direction::Direction, + geometry::direction::Direction, world::{world_block::WorldBlock, AdjacentBlocks}, }; use std::collections::HashMap; diff --git a/lib/world/src/world/world_chunk.rs b/lib/world/src/world/world_chunk.rs index 67d8d1a..0126339 100644 --- a/lib/world/src/world/world_chunk.rs +++ b/lib/world/src/world/world_chunk.rs @@ -1,8 +1,8 @@ use super::{ChunkNotLoadedError, World, WorldStateDiff}; use crate::{ - chunk::{chunk_mesh::ChunkMesh, Chunk}, + chunk::chunk_pos::ChunkPos, + chunk::{chunk::Chunk, chunk_mesh::ChunkMesh}, components::world_pos::WorldPos, - positions::ChunkPos, }; use std::collections::HashSet; @@ -82,11 +82,10 @@ mod tests { use crate::{ block::{BlockData, BlockType, ChunkBlock}, - chunk::Chunk, + chunk::{chunk::Chunk, chunk_pos::ChunkPos, inner_chunk_pos::InnerChunkPos}, components::world_pos::WorldPos, - entities::terrain_gen::TerrainGenerator, - positions::{ChunkPos, InnerChunkPos}, - vec::Vector3Ops, + geometry::vec::Vector3Ops, + terrain_gen::TerrainGenerator, world::{world_block::WorldBlock, World}, }; @@ -122,7 +121,7 @@ mod tests { let block_pos = WorldPos::new(0, 0, 0); - let chunk = Chunk::new(ChunkPos { x: 0, y: 0 }); + let chunk = Chunk::new(ChunkPos::new(0, 0)); // In the first chunk world.insert_chunk(chunk); @@ -141,7 +140,7 @@ mod tests { assert_eq!(block.extra_data, BlockData::None); // In a different chunk - let chunk2 = Chunk::new(ChunkPos { x: 1, y: 0 }); + let chunk2 = Chunk::new(ChunkPos::new(1, 0)); let block_pos = WorldPos::new(16, 0, 0); let world_block = WorldBlock { @@ -169,7 +168,7 @@ mod tests { // Average time: 20.878063ms // Max time: 31.049449ms - let terrain_gen = TerrainGenerator::new(0, false, false); + let terrain_gen = TerrainGenerator::default(); let mut times = Vec::new(); for i in 0..500 { diff --git a/lib/world/src/world/world_duct.rs b/lib/world/src/world/world_duct.rs index 007a35e..7dd86a0 100644 --- a/lib/world/src/world/world_duct.rs +++ b/lib/world/src/world/world_duct.rs @@ -1,9 +1,8 @@ use super::World; use crate::{ - chunk::{Chunk, ChunkId}, - direction::Directions, - geometry::ray::Ray, - world::{world_block::WorldBlock, ChunkPos, WorldPos}, + chunk::{chunk::Chunk, chunk::ChunkId, chunk_pos::ChunkPos}, + geometry::{direction::Directions, ray::Ray}, + world::{world_block::WorldBlock, WorldPos}, }; use serde_wasm_bindgen::{from_value, to_value, Error}; use wasm_bindgen::prelude::*; diff --git a/lib/world/src/world/world_mesh.rs b/lib/world/src/world/world_mesh.rs index a8960b1..d88a81c 100644 --- a/lib/world/src/world/world_mesh.rs +++ b/lib/world/src/world/world_mesh.rs @@ -4,15 +4,15 @@ use wasm_bindgen::prelude::wasm_bindgen; use super::{ChunkNotLoadedError, World, WorldStateDiff}; use crate::{ + chunk::chunk_pos::ChunkPos, chunk::{ + chunk::ChunkId, chunk_mesh::{BlockMesh, ChunkMesh}, - ChunkId, }, components::world_pos::WorldPos, - direction::{DirectionVectorExtension, Directions}, - entities::game::Game, - positions::ChunkPos, - vec::Vector3Ops, + game::Game, + geometry::direction::{DirectionVectorExtension, Directions}, + geometry::vec::Vector3Ops, world::AdjacentBlocks, }; @@ -142,11 +142,11 @@ impl Game { mod tests { use crate::{ block::{BlockData, BlockType}, - chunk::{chunk_mesh::BlockMesh, Chunk}, + chunk::chunk_pos::ChunkPos, + chunk::{chunk::Chunk, chunk_mesh::BlockMesh}, components::world_pos::WorldPos, - direction::{Direction, Directions}, - positions::ChunkPos, - vec::Vector3Ops, + geometry::direction::{Direction, Directions}, + geometry::vec::Vector3Ops, world::{world_block::WorldBlock, World}, }; From ee322840441476516ecc7553b4fc7c6b71019290 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 14 Sep 2025 19:48:00 +0000 Subject: [PATCH 50/61] better inital loading --- DEVLOG.md | 10 ++ .../src/components/ClientGameView.tsx | 70 ++++---- .../src/components/ClientHomePage.tsx | 5 +- .../src/components/GameConfigMenu.tsx | 4 +- apps/web-client/src/renders/chunk-render.ts | 12 +- apps/web-client/src/renders/game-renderer.ts | 60 ++++--- .../src/services/mp-games-service.ts | 52 +++--- .../src/services/sp-games-service.ts | 109 +++++++----- lib/engine/src/serialize.ts | 6 +- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/Cargo.toml | 7 +- lib/world/examples/profile_test.rs | 5 +- lib/world/src/chunk/chunk_fetcher.rs | 161 ++++++++++-------- lib/world/src/chunk/chunk_unit_tests.rs | 2 +- lib/world/src/chunk/mod.rs | 1 + lib/world/src/components/fine_world_pos.rs | 5 +- lib/world/src/entities/entities.rs | 19 ++- lib/world/src/entities/entity_action.rs | 10 +- lib/world/src/game.rs | 131 ++++---------- lib/world/src/geometry/rect3.rs | 2 +- lib/world/src/geometry/vec.rs | 4 +- lib/world/src/geometry/vec2.rs | 2 +- lib/world/src/scripts/game_script.rs | 2 +- lib/world/src/terrain_gen.rs | 18 -- lib/world/src/world/world_block.rs | 1 - lib/world/src/world/world_chunk.rs | 25 ++- lib/world/src/world/world_duct.rs | 9 - lib/world/src/world/world_mesh.rs | 6 +- 28 files changed, 376 insertions(+), 364 deletions(-) diff --git a/DEVLOG.md b/DEVLOG.md index 6cc2411..396c2d6 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,3 +1,13 @@ +# 09_14_25 + +Yesterday I got the menu and saving stuff working much better. I'm pretty happy with how everything works now. I also restructred a lot of things and made chunk mesh rendering much quicker. I might want to move to some sort of shared memory thing for inserting chunks. I'm not sure why it is so slow still. + +Goals for today +- Get multiplayer working again. +- Add an options screen for launching new games +- Speed up chunk loading again + + # 09_13_25 I need to get the PR out, here are the remaining things to do diff --git a/apps/web-client/src/components/ClientGameView.tsx b/apps/web-client/src/components/ClientGameView.tsx index f5c51da..679dad0 100644 --- a/apps/web-client/src/components/ClientGameView.tsx +++ b/apps/web-client/src/components/ClientGameView.tsx @@ -1,6 +1,6 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect, useRef, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; -import { run, RunningGame, spGameService } from "../services/sp-games-service"; +import { run, RunningGame } from "../services/sp-games-service"; import { GameConfigMenu } from "./GameConfigMenu"; import { GameRendererGameScript } from "../renders/game-renderer"; import { MenuButton } from "./ui/Buttons"; @@ -10,42 +10,45 @@ GameRendererGameScript.register(); export function ClientGameView() { const { gameId } = useParams<{ gameId: string }>(); const [isLoading, setIsLoading] = useState(true); - const [gameExists, setGameExists] = useState(null); const [showConfigMenu, setShowConfigMenu] = useState(false); const [gameInstance, setGameInstance] = useState(null); const [error, setError] = useState(null); const navigate = useNavigate(); + const loadingMessageRef = useRef(null); - if (!gameId) { - return
No game ID provided
; + async function startGame(gameId?: string) { + const updateLoadingMessage = (message: string) => { + console.log("Updating loading message", message); + if (loadingMessageRef.current) { + console.log("Updating loading message", message); + loadingMessageRef.current.innerHTML = message; + } + }; + + try { + const runningGame = await run(updateLoadingMessage, gameId); + if ("game" in runningGame) { + setGameInstance(runningGame); + } else { + setError(runningGame.error); + } + } catch (err) { + setError(err as string); + } + setIsLoading(false); } useEffect(() => { - spGameService.hasGame(gameId).then((gameExists) => { - setIsLoading(false); - setGameExists(gameExists); - if (gameExists) { - run(gameId) - .then((runningGame) => { - if ("game" in runningGame) { - // Access the global game instance - setGameInstance(runningGame); - } else { - setError(runningGame.error); - } - }) - .catch((err) => { - console.error(err); - setError(err); - }); - } - }); + startGame(gameId); }, [gameId]); useEffect(() => { - // Add keyboard shortcut for config menu (ESC key) + if (!gameInstance) { + return; + } + const handleKeyDown = (event: KeyboardEvent) => { - if (event.key === "Escape" && gameExists) { + if (event.key === "Escape") { setShowConfigMenu(!showConfigMenu); } }; @@ -54,14 +57,17 @@ export function ClientGameView() { return () => { document.removeEventListener("keydown", handleKeyDown); }; - }, [showConfigMenu, gameExists]); + }, [showConfigMenu, gameInstance]); if (isLoading) { - return
Loading...
; - } - - if (gameExists === false) { - return
Game does not exist
; + return ( +
+ Loading +
+ {" "} +
+
+ ); } if (error) { diff --git a/apps/web-client/src/components/ClientHomePage.tsx b/apps/web-client/src/components/ClientHomePage.tsx index 39bb4c7..600946f 100644 --- a/apps/web-client/src/components/ClientHomePage.tsx +++ b/apps/web-client/src/components/ClientHomePage.tsx @@ -10,10 +10,7 @@ export function ClientHomePage() { const navigate = useNavigate(); const newGame = async () => { - console.log("Starting game"); - const game = spGameService.newGame(); - spGameService.saveGame(game); - navigate(`/client-game/${game.id}`); + navigate("/client-game"); }; useEffect(() => { diff --git a/apps/web-client/src/components/GameConfigMenu.tsx b/apps/web-client/src/components/GameConfigMenu.tsx index 07e8aa8..0ac2645 100644 --- a/apps/web-client/src/components/GameConfigMenu.tsx +++ b/apps/web-client/src/components/GameConfigMenu.tsx @@ -37,7 +37,7 @@ export function GameConfigMenu({ [scriptName: string]: ScriptConfig; }>({}); const [chunkFetcherConfig, setChunkFetcherConfig] = - useState(game.chunk_fetcher.get_config()); + useState(game.serializeChunkFetcher()); const [activeTab, setActiveTab] = useState("Game Config"); const [gameName, setGameName] = useState(game.name); const navigate = useNavigate(); @@ -73,7 +73,7 @@ export function GameConfigMenu({ // Get chunk fetcher config try { - const chunkConfig: ChunkFetcherConfig = game.chunk_fetcher.get_config(); + const chunkConfig: ChunkFetcherConfig = game.serializeChunkFetcher(); console.log("Chunk Fetcher Config", chunkConfig); if (chunkConfig) { if (chunkConfig.json instanceof Map) { diff --git a/apps/web-client/src/renders/chunk-render.ts b/apps/web-client/src/renders/chunk-render.ts index c4dc853..10bcfad 100644 --- a/apps/web-client/src/renders/chunk-render.ts +++ b/apps/web-client/src/renders/chunk-render.ts @@ -61,11 +61,9 @@ export class ChunkRenderer extends Renderer { ); const end = performance.now(); console.log( - "Time taken to get chunk mesh", + `Time taken to get chunk mesh (${this.chunkPos.x}, ${this.chunkPos.y})`, end - start, - " ms", - this.chunkPos, - chunkMeshEntries + "ms" ); this.otherRenders = []; @@ -132,7 +130,11 @@ export class ChunkRenderer extends Renderer { }); const end2 = performance.now(); - console.log("Time taken to render chunk", end2 - start2, " ms"); + console.log( + `Time taken to render chunk (${this.chunkPos.x}, ${this.chunkPos.y})`, + end2 - start2, + "ms" + ); this.setBuffers(renData, transRenData); } diff --git a/apps/web-client/src/renders/game-renderer.ts b/apps/web-client/src/renders/game-renderer.ts index 20d373e..4bfc645 100644 --- a/apps/web-client/src/renders/game-renderer.ts +++ b/apps/web-client/src/renders/game-renderer.ts @@ -33,6 +33,10 @@ import VertexShader from "../../shaders/vertex.glsl?raw"; import FragmentShader from "../../shaders/fragment.glsl?raw"; import { getEle, getEleOrError } from "../utils"; +const log = (...message: any[]) => { + console.log("GameRenderer: ", ...message); +}; + const WebGlLayer = (window as any).XRWebGLLayer as typeof XRWebGLLayer; type Config = { @@ -71,13 +75,13 @@ export class GameRendererGameScript { // This is called by the rust side when a chunk is updated onChunkUpdate(chunkId: number): void { - console.log("CanvasGameScript: onChunkUpdate", chunkId); + log("GameScript onChunkUpdate", chunkId); this.updatedChunks.add(chunkId); } // This is called by the rust side when an entity is updated onEntityUpdate(entityId: number): void { - console.log("CanvasGameScript: onEntityUpdate", entityId); + log("GameScript onEntityUpdate", entityId); this.updatedEntities.add(entityId); } @@ -89,7 +93,7 @@ export class GameRendererGameScript { // This is called by the rust side setConfig(config: Config): void { this.config = { ...this.config, ...config }; - console.log("CanvasGameScript config updated:", this.config); + log("GameScript config updated:", this.config); } } @@ -199,6 +203,14 @@ export class GameRenderer { throw new Error("Unable to init shader program"); } + const getUniformLocation = (name: string) => { + const location = gl.getUniformLocation(shaderProgram, name); + if (!location) { + throw new Error(`Uniform location for ${name} not found`); + } + return location; + }; + this.program = { program: shaderProgram, attribLocations: { @@ -206,16 +218,10 @@ export class GameRenderer { textureCord: gl.getAttribLocation(shaderProgram, "aTextureCord"), }, uniformLocations: { - projectionMatrix: gl.getUniformLocation( - shaderProgram, - "uProjectionMatrix" - )!, - modelViewMatrix: gl.getUniformLocation( - shaderProgram, - "uModelViewMatrix" - )!, - uSampler: gl.getUniformLocation(shaderProgram, "uSampler")!, - uFilter: gl.getUniformLocation(shaderProgram, "uFilter")!, + projectionMatrix: getUniformLocation("uProjectionMatrix"), + modelViewMatrix: getUniformLocation("uModelViewMatrix"), + uSampler: getUniformLocation("uSampler"), + uFilter: getUniformLocation("uFilter"), }, }; @@ -242,9 +248,13 @@ export class GameRenderer { } // Create renderers for initial chunks - for (const chunkId of this.game.get_loaded_chunk_ids_wasm()) { - this.createChunkRender(chunkId); - } + // console.log( + // "CanvasGameScript: Creating chunk renders", + // this.game.getLoadedChunkids() + // ); + // for (const chunkId of this.game.getLoadedChunkids()) { + // this.createChunkRender(chunkId); + // } this.isSpectating = false; @@ -280,10 +290,10 @@ export class GameRenderer { update() { for (const entityId of this.getGameScript().updatedEntities) { - console.log("CanvasGameScript: Updating entity", entityId); + log("Updating entity", entityId); const entity = this.game.getEntityById(entityId); if (!entity) { - console.log("CanvasGameScript: Entity not found", entityId); + log("GameScript Entity not found", entityId); this.onRemovedEntity(entityId); continue; } @@ -291,6 +301,8 @@ export class GameRenderer { } for (const chunkId of this.getGameScript().updatedChunks) { + const chunkPos = ChunkPos.from_id(BigInt(chunkId)); + log(`GameScript Updating chunk (${chunkPos.x}, ${chunkPos.y})`); this.createChunkRender(BigInt(chunkId)); } @@ -473,28 +485,28 @@ export class GameRenderer { } onNewEntity(entity: Entity): void { - console.log("CanvasGameScript: Adding entity", entity); + log("Adding entity", entity); // if (entity instanceof PlayerWrapper) { if (Player.is_player(entity)) { - console.log("CanvasGameScript: Adding player"); + log("Adding player"); const renderer = new PlayerRenderer(this.game, this, entity.id); this.entityRenderers.set(entity.id, renderer); } else if (Fireball.is_fireball(entity)) { - console.log("CanvasGameScript: Adding fireball"); + log("Adding fireball"); const renderer = new SphereRenderer(this.game, this, entity.id); this.entityRenderers.set(entity.id, renderer); } } onRemovedEntity(entityId: number): void { - console.log("CanvasGameScript: Removing entity", entityId); + log("Removing entity", entityId); this.entityRenderers.delete(entityId); } createChunkRender(chunkId: bigint): void { - console.log("CanvasGameScript: Creating chunk render", chunkId); + const chunkPos = ChunkPos.from_id(chunkId); + log(`Creating chunk render (${chunkPos.x}, ${chunkPos.y})`); const chunkRenderer = new ChunkRenderer(this, chunkId, this.game); - chunkRenderer.getBufferData(); this.chunkRenderers.set(chunkId, chunkRenderer); } diff --git a/apps/web-client/src/services/mp-games-service.ts b/apps/web-client/src/services/mp-games-service.ts index e75555a..627fcc4 100644 --- a/apps/web-client/src/services/mp-games-service.ts +++ b/apps/web-client/src/services/mp-games-service.ts @@ -12,13 +12,13 @@ import { Entity, EntityActionDto, Game, + MakeGameOptions, SandBoxGScript, - WasmGameScript, } from "@craft/rust-world"; -import { WebGlGScript } from "../game-scripts/webgl-gscript"; import { getMyUid } from "../utils"; import { KeyboardPlayerEntityController } from "../controllers/playerControllers/keyboardPlayerController"; import { HudGScript } from "../renders/hud-renderer"; +import { GameRenderer, GameRendererGameScript } from "../renders/game-renderer"; export const SocketInterface = new SocketHandler(); @@ -93,17 +93,32 @@ export async function serverRunner(gameId: string) { console.log("My UID", myUid); - const game = new Game(); + const entities = Entities.deserialize(welcomeMessage.entities); + + const fetchingChunk = new Set(); + const getChunk = async (chunkPos: { x: number; y: number }) => { + if (fetchingChunk.has(chunkPos.x + "," + chunkPos.y)) { + return; + } + console.log("Getting chunk", chunkPos); + fetchingChunk.add(chunkPos.x + "," + chunkPos.y); + fetch(`${baseUrl}/game/${gameId}/chunk/${chunkPos.x}/${chunkPos.y}`) + .then((data) => data.json()) + .then((chunk) => { + chunksToInsert.push(chunk.Ok); + fetchingChunk.delete(chunkPos.x + "," + chunkPos.y); + }); + }; + + const game = Game.build(gameId, null, null, entities, null, getChunk); (window as any).game = game; - const entities = Entities.from_js(welcomeMessage.entities); + game.ensureScript(GameRendererGameScript.name); + game.ensureScript(SandBoxGScript.name()); - const webglGameScript = new WebGlGScript(game); + const gameRenderer = new GameRenderer(game, myUid); + const hudRender = new HudGScript(game, gameRenderer, myUid); - const canvasGameScript = new CanvasGameScript(game, webglGameScript, myUid); - const wasmCanvasGameScript = new WasmGameScript(canvasGameScript); - const hudRender = new HudGScript(game, canvasGameScript, myUid); - game.add_game_script_wasm(wasmCanvasGameScript); const chunksToInsert: ISerializedChunk[] = []; const onAction = (action: EntityActionDto) => { @@ -122,7 +137,7 @@ export async function serverRunner(gameId: string) { } if (message.isType(ISocketMessageType.newPlayer)) { const player = message.data; - game.entities.add_entity(Entity.from_js(player)); + game.addEntity(Entity.from_js(player)); } }); @@ -133,24 +148,9 @@ export async function serverRunner(gameId: string) { // NO-OP }, myUid, - canvasGameScript + gameRenderer ); - const fetchingChunk = new Set(); - const getChunk = async (chunkPos: { x: number; y: number }) => { - if (fetchingChunk.has(chunkPos.x + "," + chunkPos.y)) { - return; - } - console.log("Getting chunk", chunkPos); - fetchingChunk.add(chunkPos.x + "," + chunkPos.y); - fetch(`${baseUrl}/game/${gameId}/chunk/${chunkPos.x}/${chunkPos.y}`) - .then((data) => data.json()) - .then((chunk) => { - chunksToInsert.push(chunk.Ok); - fetchingChunk.delete(chunkPos.x + "," + chunkPos.y); - }); - }; - const chunkRequester = new WasmRequestChunk(getChunk); // add sandbox diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index 2408d97..4317544 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -12,6 +12,10 @@ import { EntityActionDto, SandBoxGScript } from "@craft/rust-world"; import { HudGScript } from "../renders/hud-renderer"; import { GameRenderer, GameRendererGameScript } from "../renders/game-renderer"; +const log = (...message: any[]) => { + console.log("sp-games-service.ts: ", ...message); +}; + export interface RunningGame { game: Game; save: () => void; @@ -22,42 +26,78 @@ interface RunGameError { error: string; } -export async function run(id?: string): Promise { - console.log("Starting game", id); - - const game = id ? await spGameService.getGame(id) : spGameService.newGame(); +export async function run( + uiMessage: (message: string) => void, + id?: string +): Promise { + log("Starting game", id); - console.log("Game Created", game); + let game: Game | null = null; + uiMessage("Checking records..."); - (window as any).game = game; + if (id) { + const serializedGame = await spGameService.getGame(id); + if (!serializedGame) { + return { + error: "Game with id " + id + " not found", + }; + } - if (!game) { - console.error("Game not found"); - return { - error: "Game not found", - }; + const start = performance.now(); + game = deserializeGame(serializedGame); + const end = performance.now(); + log("Deserialized game in", end - start, "ms"); + } else { + log("Creating new game"); + const start = performance.now(); + game = new Game(); + const end = performance.now(); + log("Created new game in", end - start, "ms"); } + log("The Game", game); + + (window as any).game = game; + const mainPlayerUid = getMyUid(); game.make_and_add_player_wasm(mainPlayerUid); game.update(); - const ents = game.getAllEntities(); - console.log("Ents", ents); - // ===== Game Scripts ===== - console.log("Ensuring scripts"); + log("Ensuring scripts"); game.ensureScript(SandBoxGScript.name()); - console.log("Sandbox done"); game.ensureScript(GameRendererGameScript.name); - console.log("Game Renderer done"); + + async function task() { + await new Promise((resolve) => setTimeout(resolve, 0)); + } + + let running = true; + + log("Running scripts"); + + game.run_scripts(); + + let pendingChunkCount = game.getPendingChunkCount(); + const initialChunkCount = pendingChunkCount; + // Load the initial chunks + while (pendingChunkCount > 0) { + log("Pending chunk count", pendingChunkCount); + uiMessage( + `Loading chunks... ${ + initialChunkCount - pendingChunkCount + } / ${initialChunkCount}` + ); + await task(); + await game.add_single_chunk(); + pendingChunkCount = game.getPendingChunkCount(); + } const gameRenderer = new GameRenderer(game, mainPlayerUid); - const hudRender = new HudGScript(game, gameRenderer, mainPlayerUid); const onAction = (action: EntityActionDto) => { - game.handle_action_wasm(action); + game.handleAction(action); }; const playerController = (() => { @@ -76,11 +116,12 @@ export async function run(id?: string): Promise { } })(); - async function task() { - await new Promise((resolve) => setTimeout(resolve, 0)); - } + // Inital Render + uiMessage("Painting the world..."); + await task(); + gameRenderer.update(); - let running = true; + const hudRender = new HudGScript(game, gameRenderer, mainPlayerUid); const update = async () => { const start = performance.now(); @@ -90,9 +131,7 @@ export async function run(id?: string): Promise { game.add_new_entities(); await task(); game.remove_entities(); - await task(); - game.add_single_chunk(); - await task(); + await game.add_single_chunk(); game.add_blocks(); await task(); game.remove_blocks(); @@ -168,15 +207,6 @@ export class ClientDbGamesService { private constructor(private db: IDBDatabase) {} - newGame(): Game { - return new Game(); - } - - createGame(createGameOptions: ISerializedGame): Game { - const game = deserializeGame(createGameOptions); - return game; - } - getAllGames(): Promise { return new Promise((resolve) => { const transaction = this.db.transaction([ @@ -224,7 +254,7 @@ export class ClientDbGamesService { }); } - async getGame(gameId: string): Promise { + async getGame(gameId: string): Promise { const foundGame: ISerializedGame | null = await new Promise((resolve) => { const transaction = this.db.transaction([ ClientDbGamesService.WORLDS_OBS, @@ -247,10 +277,11 @@ export class ClientDbGamesService { if (!foundGame) return null; - return this.createGame(foundGame); + return foundGame; } async saveGame(data: Game) { + log("Saving game", data); return new Promise((resolve, reject) => { const transaction = this.db.transaction( [ClientDbGamesService.WORLDS_OBS], @@ -258,10 +289,8 @@ export class ClientDbGamesService { ); const serializedGame = serializeGame(data); - console.log("Saving game", serializedGame); - transaction.oncomplete = async () => { - console.log("Saving game complete"); + log("Saving game complete"); resolve(); }; transaction.onerror = () => { diff --git a/lib/engine/src/serialize.ts b/lib/engine/src/serialize.ts index aad9d03..ed50b13 100644 --- a/lib/engine/src/serialize.ts +++ b/lib/engine/src/serialize.ts @@ -72,9 +72,9 @@ export interface ISerializedGame { export const deserializeGame = (serializedGame: ISerializedGame): Game => { const world = World.deserialize_wasm(serializedGame.world); - const entityHolder = Game.deserializeEntities(serializedGame.entities); + const entityHolder = Entities.deserialize(serializedGame.entities); const scripts = GameScripts.fromJs(serializedGame.scripts); - const chunkFetcher = ChunkFetcher.fromJs(serializedGame.chunkFetcher); + const chunkFetcher = ChunkFetcher.deserialize(serializedGame.chunkFetcher); const game = Game.build( serializedGame.gameId, serializedGame.name, @@ -92,7 +92,7 @@ export const serializeGame = (game: Game): ISerializedGame => { name: game.name, entities: game.serializeEntities(), world: game.world.serialize_wasm(), - chunkFetcher: game.chunk_fetcher.get_config(), + chunkFetcher: game.serializeChunkFetcher(), scripts: game.getScriptsJs(), }; }; diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 495f9b0..b0c78c7 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/camera.ts","./src/game-script.ts","./src/serialize.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","./src/messageHelpers.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,70,113],[47,49,50,70,113],[70,113],[48,49,50,51,52,53,54,55,56,70,113],[47,53,70,113],[59,70,113],[59,60,61,62,63,70,113],[59,61,70,113],[70,113,128,163,164],[70,113,128,163],[70,113,125,128,163,169,170,171],[70,113,165,170,172,174],[70,113,176],[70,113,125,163],[70,110,113],[70,112,113],[113],[70,113,118,148],[70,113,114,119,125,126,133,145,156],[70,113,114,115,125,133],[65,66,67,70,113],[70,113,116,157],[70,113,117,118,126,134],[70,113,118,145,153],[70,113,119,121,125,133],[70,112,113,120],[70,113,121,122],[70,113,125],[70,113,123,125],[70,112,113,125],[70,113,125,126,127,145,156],[70,113,125,126,127,140,145,148],[70,108,113,161],[70,108,113,121,125,128,133,145,156],[70,113,125,126,128,129,133,145,153,156],[70,113,128,130,145,153,156],[68,69,70,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162],[70,113,125,131],[70,113,132,156],[70,113,121,125,133,145],[70,113,134],[70,113,135],[70,112,113,136],[70,110,111,112,113,114,115,116,117,118,119,120,121,122,123,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162],[70,113,138],[70,113,139],[70,113,125,140,141],[70,113,140,142,157,159],[70,113,125,145,146,148],[70,113,147,148],[70,113,145,146],[70,113,148],[70,113,149],[70,110,113,145],[70,113,125,151,152],[70,113,151,152],[70,113,118,133,145,153],[70,113,154],[70,113,133,155],[70,113,128,139,156],[70,113,118,157],[70,113,145,158],[70,113,132,159],[70,113,160],[70,113,118,125,127,136,145,156,159,161],[70,113,145,162],[70,113,182],[70,113,179,180,181],[70,113,128,145,163],[70,113,186,225],[70,113,186,210,225],[70,113,225],[70,113,186],[70,113,186,211,225],[70,113,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224],[70,113,211,225],[70,113,126,145,163,168],[70,113,128,163,169,173],[70,113,125,128,130,133,145,153,156,162,163],[70,80,84,113,156],[70,80,113,145,156],[70,75,113],[70,77,80,113,153,156],[70,113,133,153],[70,113,163],[70,75,113,163],[70,77,80,113,133,156],[70,72,73,76,79,113,125,145,156],[70,80,87,113],[70,72,78,113],[70,80,101,102,113],[70,76,80,113,148,156,163],[70,101,113,163],[70,74,75,113,163],[70,80,113],[70,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,102,103,104,105,106,107,113],[70,80,95,113],[70,80,87,88,113],[70,78,80,88,89,113],[70,79,113],[70,72,75,80,113],[70,80,84,88,89,113],[70,84,113],[70,78,80,83,113,156],[70,72,77,80,87,113],[70,113,145],[70,75,80,101,113,161,163]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"5b4b2e3cc05955ee272308e4edb8f5c505d62094df7e0e3c4e88172d0d901ab9","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"2190af24cd8970497490c683989e0519fb8c15489edda3df05dc3c5e8c95bf13","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"1e20cfe580515334f0b432b26673699222b566ab627585b1197fd0f19dd696ef","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"b5af7a70692132b11dd67537b2d329bf11fd91134eb059c3260a586f8d25129d","signature":"2453b54c36a150578fe9b40af1fc1d7468476ae8e9f7c16a1882037e13ea7194","impliedFormat":99},{"version":"c072992f5050052cd71af7ed891c172c21ea18afaa2303aecd871502cf97ed79","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"637faa90ef9fab63d1ec947535eb42bd94883ac62cf851d55fd735b08a4542b5","signature":"5e5ef417b2eb6cbe0656f81d95a84bc3a632b21b0f033b72757b24db0e5f20a9","impliedFormat":99},{"version":"2910afd0b4d1ea52cded30c6e252900275a892cf18dca8b0bd20e5ecfefcd5c1","impliedFormat":99},{"version":"c377b02fff54ab51cd49d83cd77dedd57146f5a0dbb31ecde57694fd1ee1e48a","signature":"7d5fb2c9812ddb34bd3bcf2c4cbf3a61807603aa4b6a47d88fb7d747ae571253","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,58]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[51,2],[49,3],[52,1],[57,4],[58,3],[54,1],[53,1],[56,5],[55,3],[50,3],[47,3],[61,6],[59,3],[64,7],[60,6],[62,8],[63,6],[165,9],[164,10],[166,10],[167,3],[172,11],[175,12],[176,13],[173,3],[177,3],[178,14],[168,3],[110,15],[111,15],[112,16],[70,17],[113,18],[114,19],[115,20],[65,3],[68,21],[66,3],[67,3],[116,22],[117,23],[118,24],[119,25],[120,26],[121,27],[122,27],[124,28],[123,29],[125,30],[126,31],[127,32],[109,33],[69,3],[128,34],[129,35],[130,36],[163,37],[131,38],[132,39],[133,40],[134,41],[135,42],[136,43],[137,44],[138,45],[139,46],[140,47],[141,47],[142,48],[143,3],[144,3],[145,49],[147,50],[146,51],[148,52],[149,53],[150,54],[151,55],[152,56],[153,57],[154,58],[155,59],[156,60],[157,61],[158,62],[159,63],[160,64],[161,65],[162,66],[179,3],[170,3],[171,3],[183,67],[180,3],[182,68],[184,69],[185,3],[210,70],[211,71],[186,72],[189,72],[208,70],[209,70],[199,70],[198,73],[196,70],[191,70],[204,70],[202,70],[206,70],[190,70],[203,70],[207,70],[192,70],[193,70],[205,70],[187,70],[194,70],[195,70],[197,70],[201,70],[212,74],[200,70],[188,70],[225,75],[224,3],[219,74],[221,76],[220,74],[213,74],[214,74],[216,74],[218,74],[222,76],[223,76],[215,76],[217,76],[169,77],[174,78],[226,3],[227,3],[228,3],[229,79],[71,3],[181,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[87,80],[97,81],[86,80],[107,82],[78,83],[77,84],[106,85],[100,86],[105,87],[80,88],[94,89],[79,90],[103,91],[75,92],[74,85],[104,93],[76,94],[81,95],[82,3],[85,95],[72,3],[108,96],[98,97],[89,98],[90,99],[92,100],[88,101],[91,102],[101,85],[83,103],[84,104],[93,105],[73,106],[96,97],[95,95],[99,3],[102,107]],"latestChangedDtsFile":"./dist/types.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/camera.ts","./src/game-script.ts","./src/serialize.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","./src/messageHelpers.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,70,113],[47,49,50,70,113],[70,113],[48,49,50,51,52,53,54,55,56,70,113],[47,53,70,113],[59,70,113],[59,60,61,62,63,70,113],[59,61,70,113],[70,113,128,163,164],[70,113,128,163],[70,113,125,128,163,169,170,171],[70,113,165,170,172,174],[70,113,176],[70,113,125,163],[70,110,113],[70,112,113],[113],[70,113,118,148],[70,113,114,119,125,126,133,145,156],[70,113,114,115,125,133],[65,66,67,70,113],[70,113,116,157],[70,113,117,118,126,134],[70,113,118,145,153],[70,113,119,121,125,133],[70,112,113,120],[70,113,121,122],[70,113,125],[70,113,123,125],[70,112,113,125],[70,113,125,126,127,145,156],[70,113,125,126,127,140,145,148],[70,108,113,161],[70,108,113,121,125,128,133,145,156],[70,113,125,126,128,129,133,145,153,156],[70,113,128,130,145,153,156],[68,69,70,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162],[70,113,125,131],[70,113,132,156],[70,113,121,125,133,145],[70,113,134],[70,113,135],[70,112,113,136],[70,110,111,112,113,114,115,116,117,118,119,120,121,122,123,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162],[70,113,138],[70,113,139],[70,113,125,140,141],[70,113,140,142,157,159],[70,113,125,145,146,148],[70,113,147,148],[70,113,145,146],[70,113,148],[70,113,149],[70,110,113,145],[70,113,125,151,152],[70,113,151,152],[70,113,118,133,145,153],[70,113,154],[70,113,133,155],[70,113,128,139,156],[70,113,118,157],[70,113,145,158],[70,113,132,159],[70,113,160],[70,113,118,125,127,136,145,156,159,161],[70,113,145,162],[70,113,182],[70,113,179,180,181],[70,113,128,145,163],[70,113,186,225],[70,113,186,210,225],[70,113,225],[70,113,186],[70,113,186,211,225],[70,113,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224],[70,113,211,225],[70,113,126,145,163,168],[70,113,128,163,169,173],[70,113,125,128,130,133,145,153,156,162,163],[70,80,84,113,156],[70,80,113,145,156],[70,75,113],[70,77,80,113,153,156],[70,113,133,153],[70,113,163],[70,75,113,163],[70,77,80,113,133,156],[70,72,73,76,79,113,125,145,156],[70,80,87,113],[70,72,78,113],[70,80,101,102,113],[70,76,80,113,148,156,163],[70,101,113,163],[70,74,75,113,163],[70,80,113],[70,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,102,103,104,105,106,107,113],[70,80,95,113],[70,80,87,88,113],[70,78,80,88,89,113],[70,79,113],[70,72,75,80,113],[70,80,84,88,89,113],[70,84,113],[70,78,80,83,113,156],[70,72,77,80,87,113],[70,113,145],[70,75,80,101,113,161,163]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"517d14b36722e4812d303eaeb5292402309ff2e0fb4890c1f8142311fd52b973","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"2190af24cd8970497490c683989e0519fb8c15489edda3df05dc3c5e8c95bf13","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"1e20cfe580515334f0b432b26673699222b566ab627585b1197fd0f19dd696ef","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"1832e4be1f71594a467493188daffcbea4a468cdf1a328ed05ed25bc5ebfb448","signature":"2453b54c36a150578fe9b40af1fc1d7468476ae8e9f7c16a1882037e13ea7194","impliedFormat":99},{"version":"c072992f5050052cd71af7ed891c172c21ea18afaa2303aecd871502cf97ed79","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"637faa90ef9fab63d1ec947535eb42bd94883ac62cf851d55fd735b08a4542b5","signature":"5e5ef417b2eb6cbe0656f81d95a84bc3a632b21b0f033b72757b24db0e5f20a9","impliedFormat":99},{"version":"2910afd0b4d1ea52cded30c6e252900275a892cf18dca8b0bd20e5ecfefcd5c1","impliedFormat":99},{"version":"c377b02fff54ab51cd49d83cd77dedd57146f5a0dbb31ecde57694fd1ee1e48a","signature":"7d5fb2c9812ddb34bd3bcf2c4cbf3a61807603aa4b6a47d88fb7d747ae571253","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,58]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[51,2],[49,3],[52,1],[57,4],[58,3],[54,1],[53,1],[56,5],[55,3],[50,3],[47,3],[61,6],[59,3],[64,7],[60,6],[62,8],[63,6],[165,9],[164,10],[166,10],[167,3],[172,11],[175,12],[176,13],[173,3],[177,3],[178,14],[168,3],[110,15],[111,15],[112,16],[70,17],[113,18],[114,19],[115,20],[65,3],[68,21],[66,3],[67,3],[116,22],[117,23],[118,24],[119,25],[120,26],[121,27],[122,27],[124,28],[123,29],[125,30],[126,31],[127,32],[109,33],[69,3],[128,34],[129,35],[130,36],[163,37],[131,38],[132,39],[133,40],[134,41],[135,42],[136,43],[137,44],[138,45],[139,46],[140,47],[141,47],[142,48],[143,3],[144,3],[145,49],[147,50],[146,51],[148,52],[149,53],[150,54],[151,55],[152,56],[153,57],[154,58],[155,59],[156,60],[157,61],[158,62],[159,63],[160,64],[161,65],[162,66],[179,3],[170,3],[171,3],[183,67],[180,3],[182,68],[184,69],[185,3],[210,70],[211,71],[186,72],[189,72],[208,70],[209,70],[199,70],[198,73],[196,70],[191,70],[204,70],[202,70],[206,70],[190,70],[203,70],[207,70],[192,70],[193,70],[205,70],[187,70],[194,70],[195,70],[197,70],[201,70],[212,74],[200,70],[188,70],[225,75],[224,3],[219,74],[221,76],[220,74],[213,74],[214,74],[216,74],[218,74],[222,76],[223,76],[215,76],[217,76],[169,77],[174,78],[226,3],[227,3],[228,3],[229,79],[71,3],[181,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[87,80],[97,81],[86,80],[107,82],[78,83],[77,84],[106,85],[100,86],[105,87],[80,88],[94,89],[79,90],[103,91],[75,92],[74,85],[104,93],[76,94],[81,95],[82,3],[85,95],[72,3],[108,96],[98,97],[89,98],[90,99],[92,100],[88,101],[91,102],[101,85],[83,103],[84,104],[93,105],[73,106],[96,97],[95,95],[99,3],[102,107]],"latestChangedDtsFile":"./dist/types.d.ts","version":"5.8.3"} \ No newline at end of file diff --git a/lib/world/Cargo.toml b/lib/world/Cargo.toml index ec81656..dd74f77 100644 --- a/lib/world/Cargo.toml +++ b/lib/world/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Tyler Tracy "] edition = "2018" description = "Logic for a world" -repository = "https://www.github.com" +repository = "https://www.github.com/tylerthecoder/TylerCraft" license = "GPL2" [lib] @@ -26,7 +26,7 @@ serde_json = "1.0.140" tsify = { version = "0.5.5", features = ["js"] } float-cmp = "0.9.0" phf = { version = "0.11", default-features = false, features = ["macros"] } -web-sys = { version = "0.3.60", features = ["console"] } +web-sys = { version = "0.3.60", features = ["console", "Headers", "Request", "RequestInit", "RequestMode", "Response", "Window"] } noise = "0.8.2" rand = { version = "0.8.5" } rand_distr = "0.4.3" @@ -34,8 +34,6 @@ getrandom = { version = "0.2", features = ["js"] } uuid = { version = "1.16.0", features = ["v4", "js"] } rustc-hash = { version = "2.1"} - - # The `console_error_panic_hook` crate provides better debugging of panics by # logging them with `console.error`. This is great for development, but requires # all the `std::fmt` and `std::panicking` infrastructure, so isn't great for @@ -50,6 +48,7 @@ console_error_panic_hook = { version = "0.1.6", optional = true } wee_alloc = { version = "0.4.5", optional = true } watch = "0.2.3" once_cell = "1.21.3" +wasm-bindgen-futures = "0.4.51" [dev-dependencies] wasm-bindgen-test = "0.3.34" diff --git a/lib/world/examples/profile_test.rs b/lib/world/examples/profile_test.rs index 1638aaf..b977090 100644 --- a/lib/world/examples/profile_test.rs +++ b/lib/world/examples/profile_test.rs @@ -1,9 +1,10 @@ use std::time::{Duration, Instant}; -use world::{entities::terrain_gen::TerrainGenerator, positions::ChunkPos, world::World}; + +use world::{chunk::chunk_pos::ChunkPos, terrain_gen::TerrainGenerator, world::World}; fn main() { // This reproduces the profile_chunk_insertion test as a standalone example - let terrain_gen = TerrainGenerator::new(0, false, false); + let terrain_gen = TerrainGenerator::default(); let mut times = Vec::new(); for _i in 0..500 { diff --git a/lib/world/src/chunk/chunk_fetcher.rs b/lib/world/src/chunk/chunk_fetcher.rs index ad6c972..d3c631d 100644 --- a/lib/world/src/chunk/chunk_fetcher.rs +++ b/lib/world/src/chunk/chunk_fetcher.rs @@ -1,57 +1,79 @@ -use crate::chunk::chunk::Chunk; use crate::chunk::chunk_pos::ChunkPos; use crate::game::Game; use crate::terrain_gen::TerrainGenerator; -use lazy_static::lazy_static; -use serde::{ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer}; -use serde_json::Value; -use std::collections::HashMap; -use std::sync::Mutex; +use crate::{chunk::chunk::Chunk, utils::js_log}; +use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::JsFuture; +use web_sys::{Request, RequestInit, RequestMode, Response}; #[derive(Clone, Serialize, Deserialize)] #[wasm_bindgen(getter_with_clone)] pub struct ChunkFetcher { - loaded_chunks: Vec<(ChunkPos, Chunk)>, - chunk_loader: Box, + chunks_to_load: Vec, + chunk_loader: ChunkLoader, +} + +#[derive(Clone, Serialize, Deserialize)] +pub enum ChunkLoader { + TerrainGenerator(TerrainGenerator), + Server(ServerChunkLoader), } impl ChunkFetcher { - pub fn new(chunk_loader: Box) -> Self { + pub fn new(chunk_loader: ChunkLoader) -> Self { Self { - loaded_chunks: Vec::new(), + chunks_to_load: Vec::new(), chunk_loader, } } pub fn request_chunk(&mut self, chunk_pos: ChunkPos) { - if self.loaded_chunks.iter().any(|(pos, _)| pos == &chunk_pos) { + js_log(&format!( + "chunk_fetcher.rs: Requesting chunk: {:?}", + chunk_pos + )); + if self.chunks_to_load.iter().any(|pos| pos == &chunk_pos) { return; } + self.chunks_to_load.push(chunk_pos); + } - let chunk = self.chunk_loader.load_chunk(chunk_pos); - self.loaded_chunks.push((chunk_pos, chunk)); + pub async fn consume_single_chunk(&mut self) -> Option { + let chunk_pos = self.chunks_to_load.pop()?; + match &self.chunk_loader { + ChunkLoader::TerrainGenerator(loader) => { + let chunk = loader.get_chunk(chunk_pos.x, chunk_pos.y); + Some(chunk) + } + ChunkLoader::Server(loader) => { + let chunk = loader.load_chunk(chunk_pos).await.unwrap(); + Some(chunk) + } + } } - pub fn consume_single_chunk(&mut self) -> Option { - self.loaded_chunks.pop().map(|(_, chunk)| chunk) + pub fn get_chunk_to_load_count(&self) -> usize { + self.chunks_to_load.len() } } #[wasm_bindgen] impl ChunkFetcher { - #[wasm_bindgen(constructor)] - pub fn new_wasm(gen: TerrainGenerator) -> Self { - Self::new(Box::new(gen)) + #[wasm_bindgen(js_name = "makeFromTerrainGenerator")] + pub fn make_from_terrain_generator(loader: TerrainGenerator) -> Self { + Self::new(ChunkLoader::TerrainGenerator(loader)) } - pub fn get_config(&self) -> JsValue { - serde_wasm_bindgen::to_value(&self.chunk_loader).unwrap() + #[wasm_bindgen(js_name = "makeFromServerChunkLoader")] + pub fn make_from_server_chunk_loader(loader: ServerChunkLoader) -> Self { + Self::new(ChunkLoader::Server(loader)) } - #[wasm_bindgen(js_name = "fromJs")] - pub fn from_js(value: JsValue) -> Self { - Self::new(serde_wasm_bindgen::from_value(value).unwrap()) + #[wasm_bindgen(js_name = "deserialize")] + pub fn deserialize(js_value: JsValue) -> Result { + serde_wasm_bindgen::from_value(js_value) + .map_err(|e| JsValue::from_str(&format!("Failed to deserialize ChunkFetcher: {}", e))) } } @@ -61,71 +83,60 @@ impl Game { pub fn set_chunk_fetcher_config(&mut self, config: JsValue) { self.chunk_fetcher.chunk_loader = serde_wasm_bindgen::from_value(config).unwrap(); } -} -pub trait ChunkLoader { - fn load_chunk(&self, chunk_pos: ChunkPos) -> Chunk; - fn clone_box(&self) -> Box; - fn type_name(&self) -> &'static str { - std::any::type_name::() + #[wasm_bindgen(js_name = "serializeChunkFetcher")] + pub fn serialize(&self) -> Result { + serde_wasm_bindgen::to_value(&self.chunk_fetcher) + .map_err(|_| JsValue::from_str("Failed to serialize ChunkFetcher")) } - fn to_json(&self) -> serde_json::Value; - fn to_js(&self) -> JsValue; -} -impl Clone for Box { - fn clone(&self) -> Self { - self.clone_box() + #[wasm_bindgen(js_name = "getPendingChunkCount")] + pub fn get_pending_chunk_count(&self) -> usize { + self.chunk_fetcher.chunks_to_load.len() } } -impl Serialize for Box { - fn serialize(&self, serializer: S) -> Result { - let mut s = serializer.serialize_struct("ChunkLoader", 2)?; - s.serialize_field("type", &self.type_name())?; - s.serialize_field("json", &self.to_json())?; - s.end() - } -} - -#[derive(Deserialize)] -struct ChunkLoaderHelper { - #[serde(rename = "type")] - type_name: String, - json: Value, +#[derive(Clone, Serialize, Deserialize)] +#[wasm_bindgen] +pub struct ServerChunkLoader { + base_url: String, + game_id: String, } -impl<'de> Deserialize<'de> for Box { - fn deserialize>(deserializer: D) -> Result { - let helper = ChunkLoaderHelper::deserialize(deserializer)?; - let registry = CHUNK_LOADER_REGISTRY.lock().unwrap(); - let deserializer_fn = registry.get(helper.type_name.as_str()).ok_or_else(|| { - serde::de::Error::custom(format!("Unknown ChunkLoader type: {}", helper.type_name)) - })?; - Ok(deserializer_fn(helper.json)) +impl ServerChunkLoader { + pub fn new(base_url: String, game_id: String) -> Self { + Self { base_url, game_id } } -} -type ChunkLoaderDeserializer = fn(Value) -> Box; + pub async fn load_chunk(&self, chunk_pos: ChunkPos) -> Result { + let url = format!( + "{}/game/{}/chunk/{}/{}", + self.base_url, self.game_id, chunk_pos.x, chunk_pos.y + ); -lazy_static! { - static ref CHUNK_LOADER_REGISTRY: Mutex> = { - let mut map = HashMap::new(); + let opts = RequestInit::new(); + opts.set_method("GET"); + opts.set_mode(RequestMode::Cors); - fn register( - map: &mut HashMap<&'static str, ChunkLoaderDeserializer>, - ) { - fn deser( - v: Value, - ) -> Box { - Box::new(serde_json::from_value::(v).unwrap()) - } + let request = Request::new_with_str_and_init(&url, &opts)?; - map.insert(std::any::type_name::(), deser::); - } + request + .headers() + .set("Accept", "application/vnd.github.v3+json")?; + + let window = web_sys::window().unwrap(); + let resp_value = JsFuture::from(window.fetch_with_request(&request)).await?; + + // `resp_value` is a `Response` object. + assert!(resp_value.is_instance_of::()); + let resp: Response = resp_value.dyn_into().unwrap(); - register::(&mut map); + // Convert this other `Promise` into a rust `Future`. + let json = JsFuture::from(resp.json()?).await?; - Mutex::new(map) - }; + let chunk = Chunk::deserialize(json)?; + + // Send the JSON response back to JS. + Ok(chunk) + } } diff --git a/lib/world/src/chunk/chunk_unit_tests.rs b/lib/world/src/chunk/chunk_unit_tests.rs index 3fdb731..cb2250c 100644 --- a/lib/world/src/chunk/chunk_unit_tests.rs +++ b/lib/world/src/chunk/chunk_unit_tests.rs @@ -1,6 +1,6 @@ -use super::{chunk::Chunk, chunk_pos::ChunkPos, inner_chunk_pos::InnerChunkPos}; use crate::{ block::{BlockData, BlockType, ChunkBlock}, + chunk::{chunk::Chunk, chunk_pos::ChunkPos, inner_chunk_pos::InnerChunkPos}, components::world_pos::WorldPos, geometry::vec::Vector3Ops, world::World, diff --git a/lib/world/src/chunk/mod.rs b/lib/world/src/chunk/mod.rs index 4cd8c64..bdd2657 100644 --- a/lib/world/src/chunk/mod.rs +++ b/lib/world/src/chunk/mod.rs @@ -3,6 +3,7 @@ pub mod chunk_duct; pub mod chunk_fetcher; pub mod chunk_mesh; pub mod chunk_pos; +#[cfg(test)] pub mod chunk_unit_tests; pub mod inner_chunk_pos; pub use chunk::{Chunk, CHUNK_HEIGHT, CHUNK_WIDTH}; diff --git a/lib/world/src/components/fine_world_pos.rs b/lib/world/src/components/fine_world_pos.rs index 70dca04..d360ff2 100644 --- a/lib/world/src/components/fine_world_pos.rs +++ b/lib/world/src/components/fine_world_pos.rs @@ -1,8 +1,5 @@ use crate::components::world_pos::WorldPos; -use crate::{ - entities::entity_component::impl_component, - geometry::vec::{impl_vector_ops, Vector3Ops}, -}; +use crate::{entities::entity_component::impl_component, geometry::vec::impl_vector_ops}; use serde::{Deserialize, Serialize}; use std::ops::Add; use wasm_bindgen::prelude::*; diff --git a/lib/world/src/entities/entities.rs b/lib/world/src/entities/entities.rs index 2d908f6..24b8f64 100644 --- a/lib/world/src/entities/entities.rs +++ b/lib/world/src/entities/entities.rs @@ -140,14 +140,21 @@ impl Game { self.entities.get_all_clone() } - #[wasm_bindgen(js_name = "deserializeEntities")] - pub fn deserialize_entities(value: JsValue) -> Result { - let entity_holder: Entities = from_value(value)?; - Ok(entity_holder) - } - #[wasm_bindgen(js_name = "serializeEntities")] pub fn serialize_entities(&self) -> JsValue { to_value(&self.entities).unwrap() } + + #[wasm_bindgen(js_name = "addEntity")] + pub fn add_entity(&mut self, entity: Entity) { + self.entities.add_entity(entity); + } +} + +#[wasm_bindgen] +impl Entities { + #[wasm_bindgen(js_name = "deserialize")] + pub fn from_js(value: JsValue) -> Result { + from_value(value) + } } diff --git a/lib/world/src/entities/entity_action.rs b/lib/world/src/entities/entity_action.rs index 56b1c79..1af8553 100644 --- a/lib/world/src/entities/entity_action.rs +++ b/lib/world/src/entities/entity_action.rs @@ -1,6 +1,6 @@ use super::entities::Entities; use super::entity::{Entity, EntityId}; -use crate::game::GameSchedule; +use crate::game::{Game, GameSchedule}; use crate::scripts::player_belt_script::{ SecondaryBeltActionData, SelectItemActionData, UsePrimaryItemActionData, }; @@ -215,3 +215,11 @@ impl EntityActionHolder { schedule } } + +#[wasm_bindgen] +impl Game { + #[wasm_bindgen(js_name = "handleAction")] + pub fn handle_action_wasm(&mut self, action: EntityActionDto) { + self.action_holder.add(action); + } +} diff --git a/lib/world/src/game.rs b/lib/world/src/game.rs index 897f620..8423b28 100644 --- a/lib/world/src/game.rs +++ b/lib/world/src/game.rs @@ -2,7 +2,6 @@ use crate::{ chunk::{ chunk::{Chunk, ChunkId}, chunk_fetcher::ChunkFetcher, - chunk_pos::ChunkPos, }, components::world_pos::WorldPos, entities::{ @@ -26,9 +25,8 @@ use crate::{ world::{world_block::WorldBlock, World}, }; use serde::{Deserialize, Serialize}; -use serde_wasm_bindgen::{from_value, Error}; use uuid::Uuid; -use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; +use wasm_bindgen::prelude::wasm_bindgen; #[wasm_bindgen(getter_with_clone)] pub struct Game { @@ -40,7 +38,8 @@ pub struct Game { #[wasm_bindgen(skip)] pub scripts: GameScripts, schedule: GameSchedule, - action_holder: EntityActionHolder, + #[wasm_bindgen(skip)] + pub action_holder: EntityActionHolder, } #[wasm_bindgen] @@ -73,7 +72,7 @@ impl Game { id: Uuid::new_v4().to_string(), world: World::default(), entities: Entities::new(), - chunk_fetcher: ChunkFetcher::new_wasm(TerrainGenerator::default()), + chunk_fetcher: ChunkFetcher::make_from_terrain_generator(TerrainGenerator::default()), scripts: GameScripts::default(), schedule: GameSchedule::empty(), action_holder: EntityActionHolder::default(), @@ -83,31 +82,36 @@ impl Game { } pub fn build( - id: String, - name: String, - world: World, - entities: Entities, - scripts: GameScripts, - chunk_fetcher: ChunkFetcher, + id: Option, + name: Option, + world: Option, + entities: Option, + scripts: Option, + chunk_fetcher: Option, ) -> Game { console_error_panic_hook::set_once(); js_log("Building the game"); - let mut g = Game { - id, - name, - world, - entities, - scripts, - chunk_fetcher, - schedule: GameSchedule::empty(), - action_holder: EntityActionHolder::default(), - }; - js_log(&format!( - "Here is the game scripts: {:?}", - g.scripts.get_all_script_names() - )); - g.add_default_scripts(); - g + let mut game = Game::new(); + if let Some(id) = id { + game.id = id; + } + if let Some(name) = name { + game.name = name; + } + if let Some(world) = world { + game.world = world; + } + if let Some(entities) = entities { + game.entities = entities; + } + if let Some(scripts) = scripts { + game.scripts = scripts; + } + if let Some(chunk_fetcher) = chunk_fetcher { + game.chunk_fetcher = chunk_fetcher; + } + game.add_default_scripts(); + game } pub fn handle_actions(&mut self) { @@ -156,8 +160,8 @@ impl Game { self.schedule.removed_entities.clear(); } - pub fn add_single_chunk(&mut self) { - let chunk = self.chunk_fetcher.consume_single_chunk(); + pub async fn add_single_chunk(&mut self) { + let chunk = self.chunk_fetcher.consume_single_chunk().await; if let Some(chunk) = chunk { let chunk_id = chunk.get_id(); self.world.insert_chunk(chunk); @@ -218,65 +222,6 @@ impl Game { self.schedule_entity_insert(player); self.update(); } - - pub fn handle_action_wasm(&mut self, action: EntityActionDto) { - self.action_holder.add(action); - } - - pub fn schedule_chunk_insert_wasm(&mut self, chunk: Chunk) { - self.schedule_chunk_insert(chunk); - } - - pub fn get_chunk_mesh_by_chunkid_wasm(&self, chunk_id: ChunkId) -> Result { - self.world.get_chunk_mesh_wasm(chunk_id) - } - - pub fn get_chunk_pos_from_id_wasm(&self, chunk_id: ChunkId) -> Result { - let chunk_pos = ChunkPos::from_id(chunk_id); - let chunk_pos_js = serde_wasm_bindgen::to_value(&chunk_pos).unwrap(); - Ok(chunk_pos_js) - } - - pub fn get_chunk_id_from_chunk_pos_wasm(&self, value: JsValue) -> ChunkId { - let chunk_pos: ChunkPos = from_value(value).unwrap(); - chunk_pos.to_id() - } - - pub fn get_world_pos_from_chunk_pos_wasm(&self, x: i16, y: i16) -> Result { - let chunk_pos = ChunkPos { x, y }; - let world_pos: WorldPos = chunk_pos.to_world_pos(); - let world_pos_js = serde_wasm_bindgen::to_value(&world_pos).unwrap(); - Ok(world_pos_js) - } - - pub fn get_chunk_pos_from_world_pos_wasm( - &self, - x: i32, - y: i32, - z: i32, - ) -> Result { - let world_pos = WorldPos { x, y, z }; - let chunk_pos: ChunkPos = world_pos.to_chunk_pos(); - let chunk_pos_js = serde_wasm_bindgen::to_value(&chunk_pos).unwrap(); - Ok(chunk_pos_js) - } - - pub fn get_loaded_chunk_ids_wasm(&self) -> Vec { - return self.world.get_loaded_chunk_ids(); - } - - pub fn get_block_wasm(&self, x: i32, y: i32, z: i32) -> Result { - let world_pos = WorldPos { x, y, z }; - let block = self.world.get_block(&world_pos); - let block_js = serde_wasm_bindgen::to_value(&block).unwrap(); - Ok(block_js) - } - - pub fn get_chunk_wasm(&self, chunk_pos: ChunkPos) -> Result { - let chunk = self.world.get_chunk(&chunk_pos); - let chunk_js = serde_wasm_bindgen::to_value(&chunk); - chunk_js - } } #[derive(Clone, Serialize, Deserialize)] @@ -376,19 +321,15 @@ impl GameSchedule { } } +#[cfg(test)] mod tests { use crate::{ components::{fine_world_pos::FineWorldPos, velocity::Velocity}, - entities::{entity_action::EntityActionDtoMaker, player::make_player}, - game::Game, geometry::direction::Direction, - scripts::{ - player_jump_script::{JumpAction, JumpActionData}, - player_move_script::{MoveAction, MoveActionData, MoveScript}, - velocity_script::VelocityScript, - }, + scripts::{player_jump_script::JumpActionData, player_move_script::MoveActionData}, }; + use super::*; #[test] pub fn add_player() { let mut game = Game::new(); diff --git a/lib/world/src/geometry/rect3.rs b/lib/world/src/geometry/rect3.rs index 0043d3c..68b0192 100644 --- a/lib/world/src/geometry/rect3.rs +++ b/lib/world/src/geometry/rect3.rs @@ -184,7 +184,7 @@ impl World { let mut current_rect = *rect; // loop 3 times to handle multiple collisions one for each axis - for iteration in 0..3 { + for _ in 0..3 { // Check for collisions from current position to target let intersections = self.get_rect3_intersection_infos(¤t_rect, current_end_pos); diff --git a/lib/world/src/geometry/vec.rs b/lib/world/src/geometry/vec.rs index 7c3f26f..346f184 100644 --- a/lib/world/src/geometry/vec.rs +++ b/lib/world/src/geometry/vec.rs @@ -1,8 +1,8 @@ use crate::geometry::direction::{DirectionVectorExtension, Directions}; -use num::{integer::Roots, traits::real::Real, One, Zero}; +use num::{One, Zero}; use std::{ fmt::Display, - ops::{Div, Neg, Sub}, + ops::{Div, Neg}, }; pub trait AsF32 { diff --git a/lib/world/src/geometry/vec2.rs b/lib/world/src/geometry/vec2.rs index 2e1a52f..3b88c0a 100644 --- a/lib/world/src/geometry/vec2.rs +++ b/lib/world/src/geometry/vec2.rs @@ -1,5 +1,5 @@ use crate::geometry::vec::AsF32; -use num::{integer::Roots, traits::real::Real, One, Zero}; +use num::{One, Zero}; use std::{ fmt::Display, ops::{Add, Div, Mul, Neg, Sub}, diff --git a/lib/world/src/scripts/game_script.rs b/lib/world/src/scripts/game_script.rs index 945a8c7..5c35f13 100644 --- a/lib/world/src/scripts/game_script.rs +++ b/lib/world/src/scripts/game_script.rs @@ -126,7 +126,7 @@ impl Serialize for GameScripts { }) .collect(); - s.serialize_field("scripts", &scripts); + s.serialize_field("scripts", &scripts)?; s.end() } } diff --git a/lib/world/src/terrain_gen.rs b/lib/world/src/terrain_gen.rs index 407019d..8fe652f 100644 --- a/lib/world/src/terrain_gen.rs +++ b/lib/world/src/terrain_gen.rs @@ -587,21 +587,3 @@ impl TerrainGenerator { chunk_getter.get_chunk(&chunk_pos) } } - -impl ChunkLoader for TerrainGenerator { - fn load_chunk(&self, chunk_pos: ChunkPos) -> Chunk { - self.get_chunk(chunk_pos.x, chunk_pos.y) - } - - fn clone_box(&self) -> Box { - Box::new(self.clone()) - } - - fn to_json(&self) -> serde_json::Value { - serde_json::to_value(self).expect("TerrainGenerator must be serializable") - } - - fn to_js(&self) -> JsValue { - serde_wasm_bindgen::to_value(self).unwrap() - } -} diff --git a/lib/world/src/world/world_block.rs b/lib/world/src/world/world_block.rs index 487c933..42787bc 100644 --- a/lib/world/src/world/world_block.rs +++ b/lib/world/src/world/world_block.rs @@ -96,7 +96,6 @@ mod tests { geometry::direction::Direction, world::{world_block::WorldBlock, AdjacentBlocks}, }; - use std::collections::HashMap; #[test] fn is_block_face_visible() { diff --git a/lib/world/src/world/world_chunk.rs b/lib/world/src/world/world_chunk.rs index 0126339..df34ee3 100644 --- a/lib/world/src/world/world_chunk.rs +++ b/lib/world/src/world/world_chunk.rs @@ -1,8 +1,10 @@ +use wasm_bindgen::prelude::wasm_bindgen; + use super::{ChunkNotLoadedError, World, WorldStateDiff}; use crate::{ - chunk::chunk_pos::ChunkPos, - chunk::{chunk::Chunk, chunk_mesh::ChunkMesh}, + chunk::{chunk::Chunk, chunk_mesh::ChunkMesh, chunk_pos::ChunkPos}, components::world_pos::WorldPos, + game::Game, }; use std::collections::HashSet; @@ -74,6 +76,23 @@ impl World { self.chunks.insert(index.to_owned(), chunk); self.chunks.get_mut(&index.to_owned()).unwrap() } + + pub fn get_loaded_chunk_ids(&self) -> Vec { + let keys = self + .chunks + .values() + .map(|c| c.position.to_id()) + .collect::>(); + keys + } +} + +#[wasm_bindgen] +impl Game { + #[wasm_bindgen(js_name = "getLoadedChunkids")] + pub fn get_loaded_chunkids_wasm(&self) -> Vec { + self.world.get_loaded_chunk_ids() + } } #[cfg(test)] @@ -171,7 +190,7 @@ mod tests { let terrain_gen = TerrainGenerator::default(); let mut times = Vec::new(); - for i in 0..500 { + for _ in 0..500 { let start_time = Instant::now(); let mut world = World::default(); let chunk_pos = ChunkPos::new(0, 0); diff --git a/lib/world/src/world/world_duct.rs b/lib/world/src/world/world_duct.rs index 7dd86a0..4767b0f 100644 --- a/lib/world/src/world/world_duct.rs +++ b/lib/world/src/world/world_duct.rs @@ -41,15 +41,6 @@ impl World { return to_value(&keys); } - pub fn get_loaded_chunk_ids(&self) -> Vec { - let keys = self - .chunks - .values() - .map(|c| c.position.to_id()) - .collect::>(); - keys - } - pub fn is_chunk_loaded_wasm(&self, val: JsValue) -> Result { from_value(val).map(|pos: ChunkPos| self.get_chunk(&pos).is_ok()) } diff --git a/lib/world/src/world/world_mesh.rs b/lib/world/src/world/world_mesh.rs index d88a81c..8a13342 100644 --- a/lib/world/src/world/world_mesh.rs +++ b/lib/world/src/world/world_mesh.rs @@ -153,7 +153,7 @@ mod tests { #[test] fn calculate_chunk_mesh() { let mut world = World::default(); - let mut chunk = Chunk::new(ChunkPos { x: 0, y: 0 }); + let chunk = Chunk::new(ChunkPos { x: 0, y: 0 }); let world_pos = WorldPos::new(0, 0, 0); @@ -182,7 +182,7 @@ mod tests { #[test] fn calculate_chunk_mesh_with_adjacent_block() { let mut world = World::default(); - let mut chunk = Chunk::new(ChunkPos { x: 0, y: 0 }); + let chunk = Chunk::new(ChunkPos { x: 0, y: 0 }); let world_pos = WorldPos::new(0, 0, 0); let adjacent_world_pos = WorldPos::new(0, 0, 1); @@ -221,7 +221,7 @@ mod tests { #[test] fn calculate_chunk_mesh_with_adjacent_block_south() { let mut world = World::default(); - let mut chunk = Chunk::new(ChunkPos { x: 0, y: 0 }); + let chunk = Chunk::new(ChunkPos { x: 0, y: 0 }); let world_pos = WorldPos::new(0, 0, 1); let adjacent_world_pos = WorldPos::new(0, 0, 0); From 782bfc4a3722f07e019daa6228e093d31d7b3c26 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 11 Jan 2026 18:32:20 +0000 Subject: [PATCH 51/61] Refactor game management and serialization logic; streamline game loading and player handling. Removed unused player controller files and improved chunk fetching. Updated game initialization to ensure proper player creation and action handling. --- apps/server/src/db.ts | 12 +- apps/server/src/server-game-manager.ts | 60 +----- apps/server/src/server.ts | 36 +++- apps/web-client/src/App.tsx | 2 + .../src/components/ClientGameView.tsx | 104 +---------- .../src/components/RunningGameView.tsx | 110 +++++++++++ .../src/components/ServerGameView.tsx | 48 +---- .../src/components/ServerHomePage.tsx | 10 +- .../src/controllers/get-player-controller.ts | 4 + .../keyboardPlayerController.ts | 2 +- .../mobileController.ts | 2 +- .../quest2Controller.ts | 2 +- .../src/game-scripts/basic-gscript.ts | 4 +- apps/web-client/src/renders/game-renderer.ts | 13 +- .../src/services/mp-games-service.ts | 156 +++++++--------- apps/web-client/src/services/running-game.ts | 173 ++++++++++++++++++ .../src/services/sp-games-service.ts | 148 ++++----------- apps/web-client/src/utils.ts | 4 + lib/engine/src/serialize.ts | 7 + lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/chunk/chunk_fetcher.rs | 4 + lib/world/src/entities/player.rs | 60 +++--- lib/world/src/game.rs | 20 +- lib/world/src/world/world_chunk.rs | 6 + 24 files changed, 512 insertions(+), 477 deletions(-) create mode 100644 apps/web-client/src/components/RunningGameView.tsx create mode 100644 apps/web-client/src/controllers/get-player-controller.ts rename apps/web-client/src/controllers/{playerControllers => }/keyboardPlayerController.ts (98%) rename apps/web-client/src/controllers/{playerControllers => }/mobileController.ts (99%) rename apps/web-client/src/controllers/{playerControllers => }/quest2Controller.ts (97%) create mode 100644 apps/web-client/src/services/running-game.ts diff --git a/apps/server/src/db.ts b/apps/server/src/db.ts index cab9e8a..5296961 100644 --- a/apps/server/src/db.ts +++ b/apps/server/src/db.ts @@ -1,9 +1,4 @@ -import { - IGameMetadata, - ISerializedGame, - deserializeGame, - serializeGame, -} from "@craft/engine"; +import { IGameMetadata, ISerializedGame, serializeGame } from "@craft/engine"; import { Game } from "@craft/rust-world"; import { Collection, Document, MongoClient } from "mongodb"; @@ -39,14 +34,13 @@ export class GameDb { .toArray(); } - async getGame(gameId: string): Promise { + async getGame(gameId: string): Promise { const data: ISerializedGame | null = await this.gameCollection.findOne({ gameId }); if (!data) { return null; } - const game = deserializeGame(data); - return game; + return data; } async getSerializedGame(gameId: string): Promise { diff --git a/apps/server/src/server-game-manager.ts b/apps/server/src/server-game-manager.ts index 0a52c10..1ee3051 100644 --- a/apps/server/src/server-game-manager.ts +++ b/apps/server/src/server-game-manager.ts @@ -1,12 +1,10 @@ import { Chunk, - ChunkNotLoadedError, + ChunkPos, EntityActionDto, Game, GameDiff, SandBoxGScript, - TerrainGenerator, - Vec2i16, } from "@craft/rust-world"; import SocketServer from "./socket"; import WebSocket from "ws"; @@ -15,50 +13,19 @@ import { GameDb } from "./db"; type ClientId = number; -class TerrainChunkGetter { - private chunks_to_insert: Chunk[] = []; - public terrianGen: TerrainGenerator; - - constructor(private game: Game) { - this.terrianGen = new TerrainGenerator(0, true, false); - } - - getChunk(chunkPos: { x: number; y: number }) { - console.log("Getting chunk", chunkPos); - const chunk = this.terrianGen.get_chunk(chunkPos.x, chunkPos.y); - this.chunks_to_insert.push(chunk); - } - - update() { - for (const chunk of this.chunks_to_insert) { - this.game.schedule_chunk_insert_wasm(chunk); - } - this.chunks_to_insert = []; - } - - getWasmRequestChunk() { - return new WasmRequestChunk(this.getChunk.bind(this)); - } -} - export class ServerGameManager { is_running = false; clients: Map = new Map(); scriptsToSendToClients: string[] = []; timer: NodeJS.Timeout | null = null; - chunkGetter: TerrainChunkGetter; constructor( private game: Game, private socketInterface: SocketServer, private gameDb: GameDb ) { - this.chunkGetter = new TerrainChunkGetter(game); - const sandbox = new SandBoxGScript( - 1, - this.chunkGetter.getWasmRequestChunk() - ); - game.add_sandbox_wasm(sandbox); + console.log("ServerGameManager constructor", game.id); + game.ensureScript(SandBoxGScript.name()); this.socketInterface.listenForConnection((ws) => { this.listenForJoinRequests(ws); @@ -76,7 +43,7 @@ export class ServerGameManager { return; } - this.game.make_and_add_player_wasm(myUid); + this.game.makeAndAddPlayer(myUid); const entities = this.game.getAllEntities(); @@ -91,7 +58,7 @@ export class ServerGameManager { }) ); - const entity = this.game.entities.get_entity(myUid); + const entity = this.game.getEntityById(myUid); if (!entity) { console.error("Player not found in join request", myUid); return; @@ -121,7 +88,7 @@ export class ServerGameManager { const actionDto = EntityActionDto.from_js(action); - this.game.handle_action_wasm(actionDto); + this.game.handleAction(actionDto); // send action to all clients (except the one that sent it) this.clients.forEach((client, uid) => { @@ -148,12 +115,6 @@ export class ServerGameManager { update() { this.game.update(); - this.chunkGetter.update(); - - // const scriptDiffs: ScriptDiff[] = this.game.update(); - // for (const scriptDiff of scriptDiffs) { - // this.onGameUpdate(scriptDiff.diff, scriptDiff.scriptName); - // } } start() { @@ -178,12 +139,9 @@ export class ServerGameManager { } } - getChunk(chunkPos: { x: number; y: number }): { - Ok: Chunk; - Err: ChunkNotLoadedError; - } { - const chunkPosWasm = new Vec2i16(chunkPos.x, chunkPos.y); - return this.game.get_chunk_wasm(chunkPosWasm); + getChunk(x: number, y: number): Chunk { + const chunkPos = new ChunkPos(x, y); + return this.game.getChunk(chunkPos); } getOnlinePlayers(): number { diff --git a/apps/server/src/server.ts b/apps/server/src/server.ts index 57964af..89c0064 100644 --- a/apps/server/src/server.ts +++ b/apps/server/src/server.ts @@ -5,7 +5,8 @@ import cors from "cors"; import SocketServer from "./socket.js"; import { ServerGameManager } from "./server-game-manager.js"; import { GameDb } from "./db.js"; -import { IGameMetadata } from "@craft/engine"; +import { deserializeGame, IGameMetadata } from "@craft/engine"; +import { Game } from "@craft/rust-world"; const PORT = process.env.PORT ?? 3000; const webClientPath = new URL("../../web-client/dist", import.meta.url) @@ -13,6 +14,10 @@ const webClientPath = new URL("../../web-client/dist", import.meta.url) console.log("Config", { PORT, webClientPath }); +const log = (...args: any[]) => { + console.log(`[${new Date().toISOString()}]`, ...args); +}; + const app = express(); const games: Map = new Map(); const gameDb = await GameDb.makeClient(); @@ -55,16 +60,28 @@ app.post("/game", async (req: Request, res: Response) => { app.post("/game/:id/start", async (req: Request, res: Response) => { const { id } = req.params; + log("Starting game", id); const localGame = games.get(id); if (localGame && localGame.is_running) { res.status(404).send("Game already running"); return; } - const game = await gameDb.getGame(id); - if (!game) { + log("Getting game", id); + const gameDto = await gameDb.getGame(id); + if (!gameDto) { res.status(404).send("Game not found"); return; } + + let game: Game | null = null; + try { + game = deserializeGame(gameDto); + } catch (error) { + log("Error deserializing game", error); + res.status(500).send("Error deserializing game"); + return; + } + const gameManager = new ServerGameManager(game, socketService, gameDb); games.set(id, gameManager); gameManager.start(); @@ -78,8 +95,17 @@ app.get("/game/:id/chunk/:x/:y", async (req: Request, res: Response) => { res.status(404).send("Game not found"); return; } - const chunkPos = { x: parseInt(x), y: parseInt(y) }; - const chunk = game.getChunk(chunkPos); + const xInt = parseInt(x); + if (isNaN(xInt)) { + res.status(400).send("Invalid x"); + return; + } + const yInt = parseInt(y); + if (isNaN(yInt)) { + res.status(400).send("Invalid y"); + return; + } + const chunk = game.getChunk(xInt, yInt); res.send(chunk); }); diff --git a/apps/web-client/src/App.tsx b/apps/web-client/src/App.tsx index 7caef5a..a36fe4a 100644 --- a/apps/web-client/src/App.tsx +++ b/apps/web-client/src/App.tsx @@ -15,6 +15,8 @@ function App() { } /> } /> } /> + } /> + } /> ); diff --git a/apps/web-client/src/components/ClientGameView.tsx b/apps/web-client/src/components/ClientGameView.tsx index 679dad0..85088f7 100644 --- a/apps/web-client/src/components/ClientGameView.tsx +++ b/apps/web-client/src/components/ClientGameView.tsx @@ -1,103 +1,7 @@ -import React, { useEffect, useRef, useState } from "react"; -import { useNavigate, useParams } from "react-router-dom"; -import { run, RunningGame } from "../services/sp-games-service"; -import { GameConfigMenu } from "./GameConfigMenu"; -import { GameRendererGameScript } from "../renders/game-renderer"; -import { MenuButton } from "./ui/Buttons"; - -GameRendererGameScript.register(); +import React from "react"; +import { run } from "../services/sp-games-service"; +import { RunningGameView } from "./RunningGameView"; export function ClientGameView() { - const { gameId } = useParams<{ gameId: string }>(); - const [isLoading, setIsLoading] = useState(true); - const [showConfigMenu, setShowConfigMenu] = useState(false); - const [gameInstance, setGameInstance] = useState(null); - const [error, setError] = useState(null); - const navigate = useNavigate(); - const loadingMessageRef = useRef(null); - - async function startGame(gameId?: string) { - const updateLoadingMessage = (message: string) => { - console.log("Updating loading message", message); - if (loadingMessageRef.current) { - console.log("Updating loading message", message); - loadingMessageRef.current.innerHTML = message; - } - }; - - try { - const runningGame = await run(updateLoadingMessage, gameId); - if ("game" in runningGame) { - setGameInstance(runningGame); - } else { - setError(runningGame.error); - } - } catch (err) { - setError(err as string); - } - setIsLoading(false); - } - - useEffect(() => { - startGame(gameId); - }, [gameId]); - - useEffect(() => { - if (!gameInstance) { - return; - } - - const handleKeyDown = (event: KeyboardEvent) => { - if (event.key === "Escape") { - setShowConfigMenu(!showConfigMenu); - } - }; - - document.addEventListener("keydown", handleKeyDown); - return () => { - document.removeEventListener("keydown", handleKeyDown); - }; - }, [showConfigMenu, gameInstance]); - - if (isLoading) { - return ( -
- Loading -
- {" "} -
-
- ); - } - - if (error) { - return ( -
- {" "} - There was an error, Check the console for more details:{" "} - {JSON.stringify(error)}
- navigate("/client")}> - Back To Client Games - -
- ); - } - - return ( -
-
- setShowConfigMenu(true)}> - Game Config (ESC) - -
- - {gameInstance && ( - setShowConfigMenu(false)} - /> - )} -
- ); + return ; } diff --git a/apps/web-client/src/components/RunningGameView.tsx b/apps/web-client/src/components/RunningGameView.tsx new file mode 100644 index 0000000..e4430e4 --- /dev/null +++ b/apps/web-client/src/components/RunningGameView.tsx @@ -0,0 +1,110 @@ +import React, { useEffect, useRef, useState } from "react"; +import { useNavigate, useParams } from "react-router-dom"; +import { RunGameError, RunningGame } from "../services/running-game"; +import { GameConfigMenu } from "./GameConfigMenu"; +import { GameRendererGameScript } from "../renders/game-renderer"; +import { MenuButton } from "./ui/Buttons"; + +GameRendererGameScript.register(); + +export function RunningGameView(props: { + runFn: ( + uiMessage: (message: string) => void, + gameId?: string + ) => Promise; + backUrl: string; +}) { + const { runFn, backUrl } = props; + const { gameId } = useParams<{ gameId: string }>(); + const [isLoading, setIsLoading] = useState(true); + const [showConfigMenu, setShowConfigMenu] = useState(false); + const [gameInstance, setGameInstance] = useState(null); + const [error, setError] = useState(null); + const navigate = useNavigate(); + const loadingMessageRef = useRef(null); + + async function startGame(gameId?: string) { + const updateLoadingMessage = (message: string) => { + console.log("Updating loading message", message); + if (loadingMessageRef.current) { + console.log("Updating loading message", message); + loadingMessageRef.current.innerHTML = message; + } + }; + + try { + const runningGame = await runFn(updateLoadingMessage, gameId); + if ("game" in runningGame) { + setGameInstance(runningGame); + } else { + setError(runningGame.error); + } + } catch (err) { + setError(err as string); + } + setIsLoading(false); + } + + useEffect(() => { + startGame(gameId); + }, [gameId]); + + useEffect(() => { + if (!gameInstance) { + return; + } + + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === "Escape") { + setShowConfigMenu(!showConfigMenu); + } + }; + + document.addEventListener("keydown", handleKeyDown); + return () => { + document.removeEventListener("keydown", handleKeyDown); + }; + }, [showConfigMenu, gameInstance]); + + if (isLoading) { + return ( +
+ Loading +
+ {" "} +
+
+ ); + } + + if (error) { + return ( +
+ {" "} + There was an error, Check the console for more details:{" "} + {JSON.stringify(error)}
+ navigate(backUrl)}> + Back To Client Games + +
+ ); + } + + return ( +
+
+ setShowConfigMenu(true)}> + Game Config (ESC) + +
+ + {gameInstance && ( + setShowConfigMenu(false)} + /> + )} +
+ ); +} diff --git a/apps/web-client/src/components/ServerGameView.tsx b/apps/web-client/src/components/ServerGameView.tsx index c0a5ddf..c0fdd84 100644 --- a/apps/web-client/src/components/ServerGameView.tsx +++ b/apps/web-client/src/components/ServerGameView.tsx @@ -1,47 +1,7 @@ -import React, { useState } from "react"; -import { useParams, useNavigate } from "react-router-dom"; -import { startGame, serverRunner } from "../services/mp-games-service"; +import React from "react"; +import { serverRunner } from "../services/mp-games-service"; +import { RunningGameView } from "./RunningGameView"; export function ServerGameView() { - const { gameId } = useParams<{ gameId: string }>(); - const navigate = useNavigate(); - const [isJoined, setIsJoined] = useState(false); - - if (!gameId) { - return
No game ID provided
; - } - - function joinGame(gameId: string) { - serverRunner(gameId); - setIsJoined(true); - } - - if (isJoined) { - return
; - } - - return ( -
- -

Game {gameId}

-
- - -
-
- ); + return ; } diff --git a/apps/web-client/src/components/ServerHomePage.tsx b/apps/web-client/src/components/ServerHomePage.tsx index 9f5dfb4..86d8a87 100644 --- a/apps/web-client/src/components/ServerHomePage.tsx +++ b/apps/web-client/src/components/ServerHomePage.tsx @@ -1,17 +1,15 @@ import { IServerGameMetadata } from "@craft/engine"; import React, { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; -import { createGame, getAllGames } from "../services/mp-games-service"; +import { getAllGames } from "../services/mp-games-service"; export function ServerHomePage() { const [games, setGames] = useState([]); const [loading, setLoading] = useState(true); const navigate = useNavigate(); - const createGameWrapper = async (gameId: string) => { - console.log("Starting game", gameId); - const game = await createGame(gameId); - navigate(`/server-game/${game}`); + const createGameWrapper = async () => { + navigate("/server-game"); }; useEffect(() => { @@ -60,7 +58,7 @@ export function ServerHomePage() {

Create New Game

+
+ ); + } + + return ; } diff --git a/apps/web-client/src/components/RunningGameView.tsx b/apps/web-client/src/components/RunningGameView.tsx index e4430e4..7de7403 100644 --- a/apps/web-client/src/components/RunningGameView.tsx +++ b/apps/web-client/src/components/RunningGameView.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useRef, useState } from "react"; -import { useNavigate, useParams } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; import { RunGameError, RunningGame } from "../services/running-game"; import { GameConfigMenu } from "./GameConfigMenu"; import { GameRendererGameScript } from "../renders/game-renderer"; @@ -10,12 +10,12 @@ GameRendererGameScript.register(); export function RunningGameView(props: { runFn: ( uiMessage: (message: string) => void, - gameId?: string + gameId: string ) => Promise; backUrl: string; + gameId: string; }) { - const { runFn, backUrl } = props; - const { gameId } = useParams<{ gameId: string }>(); + const { runFn, backUrl, gameId } = props; const [isLoading, setIsLoading] = useState(true); const [showConfigMenu, setShowConfigMenu] = useState(false); const [gameInstance, setGameInstance] = useState(null); @@ -23,7 +23,8 @@ export function RunningGameView(props: { const navigate = useNavigate(); const loadingMessageRef = useRef(null); - async function startGame(gameId?: string) { + async function startGame(gameId: string) { + console.log("Starting game", gameId); const updateLoadingMessage = (message: string) => { console.log("Updating loading message", message); if (loadingMessageRef.current) { @@ -40,6 +41,7 @@ export function RunningGameView(props: { setError(runningGame.error); } } catch (err) { + console.error("Error starting game", err); setError(err as string); } setIsLoading(false); @@ -47,7 +49,7 @@ export function RunningGameView(props: { useEffect(() => { startGame(gameId); - }, [gameId]); + }, []); useEffect(() => { if (!gameInstance) { diff --git a/apps/web-client/src/components/ServerGameView.tsx b/apps/web-client/src/components/ServerGameView.tsx index c0fdd84..22519bc 100644 --- a/apps/web-client/src/components/ServerGameView.tsx +++ b/apps/web-client/src/components/ServerGameView.tsx @@ -1,7 +1,31 @@ -import React from "react"; -import { serverRunner } from "../services/mp-games-service"; +import React, { useState } from "react"; +import { run, create } from "../services/mp-games-service"; import { RunningGameView } from "./RunningGameView"; +import { useNavigate, useParams } from "react-router-dom"; export function ServerGameView() { - return ; + const { gameId } = useParams<{ gameId: string }>(); + const navigate = useNavigate(); + const [gameName, setGameName] = useState(""); + + async function createGame() { + const id = await create(gameName); + navigate(`/server-game/${id}`); + } + + if (!gameId) { + return ( +
+ setGameName(e.target.value)} + /> + +
+ ); + } + + return ; } diff --git a/apps/web-client/src/components/ServerHomePage.tsx b/apps/web-client/src/components/ServerHomePage.tsx index 86d8a87..c112b2e 100644 --- a/apps/web-client/src/components/ServerHomePage.tsx +++ b/apps/web-client/src/components/ServerHomePage.tsx @@ -2,6 +2,7 @@ import { IServerGameMetadata } from "@craft/engine"; import React, { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { getAllGames } from "../services/mp-games-service"; +import { OptionButton } from "./ui/Buttons"; export function ServerHomePage() { const [games, setGames] = useState([]); @@ -23,47 +24,47 @@ export function ServerHomePage() { return
Loading...
; } + console.log(games); + return ( -
-

TylerCraft Games

+
+ navigate("/")} + > + ⬅ + +

+ Server Games +

+
+ { + createGameWrapper(); + }} + > + Create Game + +
-

Existing Games

+

+ Existing Games +

{games.length > 0 ? (
{games.map((game) => ( -
navigate(`/server-game/${game.gameId}`)} > - {game.name} - -
+ {game.name || game.gameId} + ))}
) : (

No games available

)}
-
-

Create New Game

- -
); } diff --git a/apps/web-client/src/renders/game-renderer.ts b/apps/web-client/src/renders/game-renderer.ts index 199a860..a3519ae 100644 --- a/apps/web-client/src/renders/game-renderer.ts +++ b/apps/web-client/src/renders/game-renderer.ts @@ -247,6 +247,11 @@ export class GameRenderer { // this.onNewEntity(entity); // } + // Create renderers for initial chunks + for (const chunkId of this.game.getLoadedChunkids()) { + this.createChunkRender(BigInt(chunkId)); + } + this.isSpectating = false; window.addEventListener("keydown", this.handleKeyDownBound); diff --git a/apps/web-client/src/services/mp-games-service.ts b/apps/web-client/src/services/mp-games-service.ts index e2abc22..bc656c3 100644 --- a/apps/web-client/src/services/mp-games-service.ts +++ b/apps/web-client/src/services/mp-games-service.ts @@ -16,9 +16,7 @@ import { ServerChunkLoader, } from "@craft/rust-world"; import { getMyUid } from "../utils"; -import { KeyboardPlayerEntityController } from "../controllers/keyboardPlayerController"; -import { HudGScript } from "../renders/hud-renderer"; -import { GameRenderer, GameRendererGameScript } from "../renders/game-renderer"; +import { GameRendererGameScript } from "../renders/game-renderer"; import { addGameRenderer, addHudRenderer, @@ -41,7 +39,7 @@ export async function getAllGames(): Promise { return await response.json(); } -export async function createGame(name: string): Promise { +export async function create(name: string): Promise { const response = await fetch(`${baseUrl}/game`, { method: "POST", body: JSON.stringify({ name }), @@ -49,21 +47,16 @@ export async function createGame(name: string): Promise { return await response.text(); } -export async function startGame(gameId: string): Promise { +export async function start(gameId: string): Promise { await fetch(`${baseUrl}/game/${gameId}/start`, { method: "POST", }); } -export async function serverRunner( +export async function run( uiMessage: (message: string) => void, - gameId?: string + gameId: string ): Promise { - // ===== Create Game if not exists ===== - if (!gameId) { - gameId = await createGame("test"); - } - // ===== Join Game ===== async function joinGame(gameId: string): Promise { SocketInterface.send( @@ -102,10 +95,18 @@ export async function serverRunner( return welcomeMessage; } + uiMessage("Connecting to game server..."); + await SocketInterface.connect(() => { console.error("Socket disconnected"); }); + uiMessage("Starting game..."); + + await start(gameId); + + uiMessage("Joining game..."); + const welcomeMessage = await joinGame(gameId); console.log("Joined game", welcomeMessage); diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index 6b9dbcb..925e965 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -21,9 +21,24 @@ const log = (...message: any[]) => { console.log("sp-games-service.ts: ", ...message); }; +export async function create(gameName: string): Promise { + log("Creating new game"); + const startCreation = performance.now(); + const game = new Game(); + game.name = gameName; + const endCreation = performance.now(); + log("Created new game in", endCreation - startCreation, "ms"); + log("Saving game"); + const startSaving = performance.now(); + await spGameService.saveGame(game); + const endSaving = performance.now(); + log("Saved game in", endSaving - startSaving, "ms"); + return game.id; +} + export async function run( uiMessage: (message: string) => void, - id?: string + id: string ): Promise { log("Starting game", id); @@ -31,25 +46,20 @@ export async function run( let game: Game | null = null; uiMessage("Checking records..."); - if (id) { - const serializedGame = await spGameService.getGame(id); - if (!serializedGame) { - return { - error: "Game with id " + id + " not found", - }; - } - - const start = performance.now(); - game = deserializeGame(serializedGame); - const end = performance.now(); - log("Deserialized game in", end - start, "ms"); - } else { - log("Creating new game"); - const start = performance.now(); - game = new Game(); - const end = performance.now(); - log("Created new game in", end - start, "ms"); + const serializedGame = await spGameService.getGame(id); + if (!serializedGame) { + return { + error: "Game with id " + id + " not found", + }; } + + uiMessage("Loading game"); + + const start = performance.now(); + game = deserializeGame(serializedGame); + const end = performance.now(); + log("Deserialized game in", end - start, "ms"); + log("The Game", game); (window as any).game = game; From 417ac81834e70924ce02f66ad437b9933261e309 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sat, 24 Jan 2026 20:19:14 +0000 Subject: [PATCH 53/61] Some updates to server chunk loading and connections --- apps/server/src/server-game-manager.ts | 194 +++++++++++++++--- apps/server/src/server.ts | 22 +- apps/server/src/socket.ts | 3 + .../src/services/mp-games-service.ts | 11 +- apps/web-client/src/services/running-game.ts | 26 ++- bun.lockb | Bin 0 -> 341680 bytes lib/world/src/chunk/chunk_fetcher.rs | 131 +++++++++--- lib/world/src/game.rs | 35 +++- 8 files changed, 344 insertions(+), 78 deletions(-) create mode 100755 bun.lockb diff --git a/apps/server/src/server-game-manager.ts b/apps/server/src/server-game-manager.ts index cf26f83..68af483 100644 --- a/apps/server/src/server-game-manager.ts +++ b/apps/server/src/server-game-manager.ts @@ -8,40 +8,118 @@ import { } from "@craft/rust-world"; import SocketServer from "./socket"; import WebSocket from "ws"; -import { ISocketMessageType, SocketMessage } from "@craft/engine"; +import { + deserializeGame, + ISerializedChunk, + ISerializedGame, + ISocketMessageType, + SocketMessage, +} from "@craft/engine"; import { GameDb } from "./db"; import { makeLogger } from "./logger.js"; +import { add_script_to_registry } from "@craft/rust-world"; type ClientId = number; -const log = makeLogger("ServerGameManager"); +const AUTO_SAVE_GAME = false; +const AUTO_SAVE_GAME_INTERVAL = 5000; + +const makeGameLogger = (gameId: string) => { + return makeLogger(`ServerGameManager:${gameId}`); +}; + +class ServerGameManagerGameScript { + static name = "ServerGameManagerGameScript"; + + private updatedChunks: Set = new Set(); + + static register() { + add_script_to_registry(ServerGameManagerGameScript); + } + + onChunkUpdate(chunkId: number): void { + console.log("ServerGameManagerGameScript onChunkUpdate", chunkId); + this.updatedChunks.add(chunkId); + } + + onEntityUpdate(entityId: number): void { + console.log("ServerGameManagerGameScript onEntityUpdate", entityId); + } + + getUpdatedChunks(): number[] { + const chunks = Array.from(this.updatedChunks); + this.updatedChunks.clear(); + return chunks; + } +} + +ServerGameManagerGameScript.register(); export class ServerGameManager { - is_running = false; clients: Map = new Map(); scriptsToSendToClients: string[] = []; timer: NodeJS.Timeout | null = null; + autoSaveTimer: NodeJS.Timeout | null = null; + is_running = false; + log: (...args: any[]) => void; + + static async create( + gameDto: ISerializedGame, + socketService: SocketServer, + gameDb: GameDb + ): Promise { + const game = deserializeGame(gameDto); + const log = makeGameLogger(game.id); + game.ensureScript(SandBoxGScript.name()); + + game.run_scripts(); + + async function task() { + await new Promise((resolve) => setTimeout(resolve, 0)); + } + + let pendingChunkCount = game.getPendingChunkCount(); + + log("Loading chunks", pendingChunkCount); + + while (pendingChunkCount > 0) { + log("Loading chunk", pendingChunkCount); + await task(); + game.add_single_chunk(); + pendingChunkCount = game.getPendingChunkCount(); + } + + return new ServerGameManager(game, socketService, gameDb); + } constructor( private game: Game, private socketInterface: SocketServer, private gameDb: GameDb ) { - console.log("ServerGameManager constructor", game.id); - game.ensureScript(SandBoxGScript.name()); + this.log = makeGameLogger(game.id); + this.log("Creating game"); this.socketInterface.listenForConnection((ws) => { this.listenForJoinRequests(ws); }); + + game.ensureScript(ServerGameManagerGameScript.name); + } + + private getGameManagerGameScript(): ServerGameManagerGameScript { + return this.game.getScriptState( + ServerGameManagerGameScript.name + ) as ServerGameManagerGameScript; } listenForJoinRequests(ws: WebSocket) { - this.socketInterface.listenTo(ws, (message) => { - log("Socket message from client", message); + this.socketInterface.listenTo(ws, async (message) => { + this.log("Socket message from client", message); if (!message.isType(ISocketMessageType.joinWorld)) { return; } - log("Joining game", message.data); + this.log("Joining game", message.data); const { gameId, myUid } = message.data; if (gameId !== this.game.id) { return; @@ -51,7 +129,25 @@ export class ServerGameManager { const entities = this.game.serializeEntities(); - log("Entities", JSON.stringify(entities, null, 2)); + this.log("Entities", JSON.stringify(entities, null, 2)); + + // load chunks around the player + this.game.run_scripts(); + + async function task() { + await new Promise((resolve) => setTimeout(resolve, 0)); + } + + let pendingChunkCount = this.game.getPendingChunkCount(); + + this.log("Loading chunks", pendingChunkCount); + + while (pendingChunkCount > 0) { + this.log("Loading chunk", pendingChunkCount); + await task(); + this.game.add_single_chunk(); + pendingChunkCount = this.game.getPendingChunkCount(); + } // send welcome message this.socketInterface.send( @@ -83,12 +179,12 @@ export class ServerGameManager { listenForPlayerActions(ws: WebSocket, clientId: ClientId) { this.socketInterface.listenTo(ws, (message) => { - log("Socket message from client", JSON.stringify(message)); + this.log("Socket message from client", JSON.stringify(message)); if (!message.isType(ISocketMessageType.actions)) { return; } const action = message.data; - log("Received Action", JSON.stringify(action, null, 2)); + this.log("Received Action", JSON.stringify(action, null, 2)); const actionDto = EntityActionDto.from_js(action); @@ -104,25 +200,54 @@ export class ServerGameManager { }); } - onGameUpdate(diff: GameDiff, scriptName: string): void { - console.log("ServerGameScript: onGameUpdate", diff, scriptName); + // onGameUpdate(diff: GameDiff, scriptName: string): void { + // this.log("onGameUpdate", diff, scriptName); + + // if (this.scriptsToSendToClients.includes(scriptName)) { + // for (const client of this.clients.values()) { + // this.socketInterface.send( + // client, + // new SocketMessage(ISocketMessageType.gameDiff, diff) + // ); + // } + // } + // } + + // onChunkUpdate(chunkId: number): void { + // this.log("onChunkUpdate", chunkId); + // const diff = new GameDiff(); + // diff.add_chunk(BigInt(chunkId)); + // for (const client of this.clients.values()) { + // this.socketInterface.send( + // client, + // new SocketMessage(ISocketMessageType.gameDiff, diff) + // ); + // } + // } + + update() { + this.game.update(); + // send game diff to clients + const updatedChunks = this.getGameManagerGameScript().getUpdatedChunks(); + if (updatedChunks.length > 0) { + const diff = new GameDiff(); + for (const chunkId of updatedChunks) { + diff.add_chunk(BigInt(chunkId)); + } + const diffJs = diff.to_js(); + console.log("Sending game diff", diffJs); - if (this.scriptsToSendToClients.includes(scriptName)) { for (const client of this.clients.values()) { this.socketInterface.send( client, - new SocketMessage(ISocketMessageType.gameDiff, diff) + new SocketMessage(ISocketMessageType.gameDiff, diffJs) ); } } } - update() { - this.game.update(); - } - start() { - console.log("Starting game", this.game.id); + this.log("Starting game"); if (this.timer) { clearInterval(this.timer); } @@ -130,10 +255,15 @@ export class ServerGameManager { this.update(); }, 1000 / 60); - setInterval(() => { - console.log("Saving game", this.game.id); - this.save(); - }, 5000); + if (AUTO_SAVE_GAME) { + if (this.autoSaveTimer) { + clearInterval(this.autoSaveTimer); + } + this.autoSaveTimer = setInterval(() => { + this.log("Saving game"); + this.save(); + }, AUTO_SAVE_GAME_INTERVAL); + } } stop() { @@ -141,11 +271,23 @@ export class ServerGameManager { clearInterval(this.timer); this.timer = null; } + if (this.autoSaveTimer) { + clearInterval(this.autoSaveTimer); + this.autoSaveTimer = null; + } } - getChunk(x: number, y: number): Chunk { + getOrRequestChunk(x: number, y: number): ISerializedChunk | null { const chunkPos = new ChunkPos(x, y); - return this.game.getChunk(chunkPos); + try { + const chunk = this.game.getChunk(chunkPos); + const serializedChunk = chunk.serialize(); + return serializedChunk; + } catch (error) { + this.game.request_chunk(chunkPos); + this.log("Requested chunk", chunkPos); + return null; + } } getOnlinePlayers(): number { diff --git a/apps/server/src/server.ts b/apps/server/src/server.ts index eb3a57b..f404f58 100644 --- a/apps/server/src/server.ts +++ b/apps/server/src/server.ts @@ -5,8 +5,7 @@ import cors from "cors"; import SocketServer from "./socket.js"; import { ServerGameManager } from "./server-game-manager.js"; import { GameDb } from "./db.js"; -import { deserializeGame, IGameMetadata } from "@craft/engine"; -import { Game } from "@craft/rust-world"; +import { IGameMetadata } from "@craft/engine"; import { makeLogger } from "./logger.js"; const PORT = process.env.PORT ?? 3000; @@ -74,18 +73,17 @@ app.post("/game/:id/start", async (req: Request, res: Response) => { return; } - let game: Game | null = null; + let game: ServerGameManager | null = null; try { - game = deserializeGame(gameDto); + game = await ServerGameManager.create(gameDto, socketService, gameDb); } catch (error) { - log("Error deserializing game", error); - res.status(500).send("Error deserializing game"); + log("Error creating game", error); + res.status(500).send("Error creating game"); return; } - const gameManager = new ServerGameManager(game, socketService, gameDb); - games.set(id, gameManager); - gameManager.start(); + games.set(id, game); + game.start(); res.send("Game started"); }); @@ -106,7 +104,11 @@ app.get("/game/:id/chunk/:x/:y", async (req: Request, res: Response) => { res.status(400).send("Invalid y"); return; } - const chunk = game.getChunk(xInt, yInt); + const chunk = game.getOrRequestChunk(xInt, yInt); + if (!chunk) { + res.status(404).send({ message: "Chunk requested" }); + return; + } res.send(chunk); }); diff --git a/apps/server/src/socket.ts b/apps/server/src/socket.ts index a93e676..886c4a9 100644 --- a/apps/server/src/socket.ts +++ b/apps/server/src/socket.ts @@ -15,6 +15,9 @@ export default class SocketServer { listenForConnection(listener: ConnectionListener): void { this.connectionListeners.push(listener); + for (const ws of this.server.clients) { + listener(ws); + } } newConnection(ws: WebSocket, request: IncomingMessage): void { diff --git a/apps/web-client/src/services/mp-games-service.ts b/apps/web-client/src/services/mp-games-service.ts index bc656c3..0ba889b 100644 --- a/apps/web-client/src/services/mp-games-service.ts +++ b/apps/web-client/src/services/mp-games-service.ts @@ -8,6 +8,7 @@ import { SocketHandler, SocketListener } from "./socket-service"; import { AppConfig } from "../appConfig"; import { ChunkFetcher, + ChunkPos, Entities, Entity, EntityActionDto, @@ -26,10 +27,6 @@ import { RunningGame, } from "./running-game"; -const log = (...message: any[]) => { - console.log("mp-games-service.ts: ", ...message); -}; - export const SocketInterface = new SocketHandler(); const baseUrl = AppConfig.api.baseUrl; @@ -163,6 +160,12 @@ export async function run( const player = message.data; game.addEntity(Entity.from_js(player)); } + // if (message.isType(ISocketMessageType.gameDiff)) { + // const diff = message.data; + // for (const chunkId of diff.updated_chunks) { + // game.request_chunk(ChunkPos.from_id(BigInt(chunkId))); + // } + // } }); // ===== Add Player Controller ===== diff --git a/apps/web-client/src/services/running-game.ts b/apps/web-client/src/services/running-game.ts index 1b47c11..d9f3ff8 100644 --- a/apps/web-client/src/services/running-game.ts +++ b/apps/web-client/src/services/running-game.ts @@ -26,6 +26,7 @@ function makeListenerGroup(listenerGroupName: string) { export class RunningGame { private running = true; + private pendingActions: unknown[] = []; constructor(public game: Game, public playerId: number) {} @@ -54,13 +55,19 @@ export class RunningGame { public updateListeners = makeListenerGroup<[]>("update"); public async update() { const start = performance.now(); + // Drain pending actions from JS queue into Rust queue + // This must happen in a synchronous block before any awaits + for (const actionData of this.pendingActions) { + this.game.handleAction(EntityActionDto.from_js(actionData)); + } + this.pendingActions = []; this.game.handle_actions(); this.game.run_scripts(); await task(); this.game.add_new_entities(); await task(); this.game.remove_entities(); - await this.game.add_single_chunk(); + this.game.add_single_chunk(); this.game.add_blocks(); await task(); this.game.remove_blocks(); @@ -74,8 +81,19 @@ export class RunningGame { public onActionListeners = makeListenerGroup<[EntityActionDto]>("onAction"); public onAction(action: EntityActionDto) { console.log("On Action", action); - this.game.handleAction(action); - this.onActionListeners.callAll(action); + const serializedAction = action.to_js(); + // Queue in JS to avoid borrow conflicts during async update loop + this.pendingActions.push(serializedAction); + // Notify listeners with a copy + this.onActionListeners.callAll(EntityActionDto.from_js(serializedAction)); + } + + /** + * Queue an action from external sources (e.g., socket messages). + * The action data should already be serialized JS object. + */ + public queueAction(actionData: unknown) { + this.pendingActions.push(actionData); } public saveListeners = makeListenerGroup<[]>("save"); @@ -167,7 +185,7 @@ export async function loadInitialChunks( } / ${initialChunkCount}` ); await task(); - await game.add_single_chunk(); + game.add_single_chunk(); pendingChunkCount = game.getPendingChunkCount(); } } diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..45fa1e730423f4e233731009a35187f59c9b486b GIT binary patch literal 341680 zcmeFaWq4G{*Tvg`Ai>=o!eGIjKtc!>Ah>H30x=@E1P`tQ1b26LcNyH>Jvajla@WeK zJ!yC$IVb(UAMSmo9=cbT{A%yoRi}=019@{73k?n`=I-NP%*(%9F85IXBzW2R26%Mw z_VM+y^9~5|a|^NSRy;{Olgaedes{C@F_y50zF8qVh>hrm(;8DK&JWmC2M8ItZEy+6!s}4f1mH z2tk`+a3dM=8PEaC`yo#)2_>Ij)pu1~2Pn(C`Gk1Un0K&OH!uH?;J|?35Rc$s(@Hp; z9QE^|^uyoHKfuS+Wbz7j5B2f&GzDS^8ByK}ngQypw5ZZdO5;P*qyA+glPMkan$p8c z*DIZ^bfnVmNl0ra}GNgqq$_dP?a|r9lC{zM+98Q)V>Ih4$YO zge=gz(CpAd&}`5Zs(h>}4_4)^pqWu`56uD14$TSuj!9wuCNwv67nJ?aRQbLt-yX_# z_Rzf0EYLjAe^P4wTvxga%69Xh^k7XlU|%11te51-!*rMxl#{m2NVz0N)% zJ{Ts)6cyhOMKpa5;q}^U)+(wUx2;NQ@!bWby*1DjP){%S(2lU>7mPQgy5KpkGEn-T8_Ie3 zhJF~wi={Q*+t)25#LLqZLR6-8=$<{9)IvbClbr>6Nwl9tLHc_P`JN7aHVa*BLPl4E68n z5#Z@{N|mpJra=87DE*tJG{2)3*X&U4vtv=t_zhO-6Koe1;ucl4c0E=3b>wNUgp)SD zK(~-ib_iS}A@e_5N zfZ;xa*$N5q@e1ngqMb*I)X~;)1eAVysq(r|uJi46O{RR%%JnpU5b`|!L)18Ae+u^U z>*f`tt#fy*-%j;4f7(OY?=vX>cwzpRAkXqhXbPxfL#^J=E2yIvjzO7U zPoJQu3ASsb)d%~!1#|wU!=GH>iojoLug2PbPv8p!6dYni1MoZd&qb8;I5@0y8=1LgYY=cb)6+91z;taGqeum}2IfjsABG?eS-6biY& z`y!tk`T$Yl{PuM7_4Nr3F=o1vE}5G9Y3*u5IevR6`|a$n?VoL+EO%Av1ZDr_p`1@Y zA3rZUPj{1h&k!ziQ!&Nog|gkzKuv=fWF*;_t76mUaqQ>gkK;c$1QJ!h3GLIOd{mHD zp9%f2T{kyu3P=TEgm!Z({rS9=7Ui`2vtKFD4>|0g-GhBirVgRnd}3Ghz>+X!>ZaLE z3Qdl7-%-zg-YR_zr5`t;?B@cM>mk73D+D1h!JdzYowvVRP}Fw&@BZZ;(8CL%GUbN% z?5_tj1=J79{(jzvGpO=pP}&i$VsC972p1pqv@iRioUcCj(8^yc#d(ck`}aI0=O>@O z+IRy{$MJSY+?f0V{5u9V^aB0S&n3`5pjReqevUz&_5)OXD=6bu zWvaGM{BAxR6?Y**>vtQJW*|>Lu1(kM9f5Kld!U^0YYt@`(yMl5pp4f$ zjFaW(p}C-op?1(-DlZz@Pm6>59BurYp~=wh49XeDfVo;+_d~fZQzy`lr%v;RVJkAQ$KK3*mh zF6*O4ba12Qp9|I-?JwM<`CVkQmQTG+v*QP)zj$tAhesxz#%$5*)1V#w4ce|97Y$LK z3Hfu#Gd@dEp8UYty=#$Zv}aE^y+aO{jlG{s80pW0_Av9 ztM;?O)8AL%7|&6AG&_GonV+*)gZ+1svWeQdRy5<6%7SL+Q^crMsc*XACqev>P-NG-8w1?-(e@ zFZXS7fA;hJn_U0OeVo6KhnHPQP)|AE|9t<0=XIWTfn7Q-I;;6v?3{L<+YF_DcIP#} zazHt*igI1p0V}@CI7$>v9*<*2T~FcmB9X#x;m(*i~)5dO+!)`!#JGa^HLu zdB(8`lzvUSF8cx&F;eFn+WZ`WrbT@#DCeavlg%5`9D*NuPN*Zh|2Te+T0#dVEv1(tcPt%G&Ybm(URl>JRsD)$Q`kWYqk*}vp|{AQ%a`vfE0ULGN( zUTX7l8p`8%8S=E|lyR90<#B^^bkw*L zz18~1bD$n9Scg2h#Zb1N2<3R(LbT^*U*Bl_&vwOs@!Q=^GqB`?)_#^!o`-z=O(tnS z8s*#v2SRDD%tvh;gQ3iK;q#dQZ&R92+IUZ*oZ~A3<^1+g{WkrqwJ!u^xy11@@*Hn& zRqmqNl~Vb{U$pqxBhPUQFPzwy=OL-lj>qY#uNrpqrzbC%0@#rM$`%!$WsO!;CZrt!NBp@{EhEVQPaopp3ACswSKW#jvptNJFG+RO| zQ!eC}LeoNLL218IB26O`SVhIbM%8~tIoI#sD5p+ItofY<{gDf-KViW3^A)>1A6w-6 z#36?=x_mt9o8aaACY3e~vAg#wFm>-tl|K6nYvMib(dC<&#~qjy?^4&WDOF1re!OHv z%8M5h1~$64sLLex)y+Pqd7d@RrZkRiCN>Lu+P>}Oyjzc?7`XV$XS<4N%Z$mrrEdXi zpHww%KKIx%ZeYeCk>NMnxcznPdELYV3SXEXbf(L?Ho?PdecP}wU!V5%bLPvl@8ZZ* zc`H}zp6Ko7GjmgAKTzOFeculAzF!=_wd(R3K5c^>{+N+Gqw|wltGXR-RONKxY}r#U zo|U!uwsTKBS{?Zimb1@-rV}StdY-rQ=xO2Z8NS%0%$e>(p)>_bS&h6m_u3%u8YL!Q z-Mh~eSu_8Wc#fGqe=gDJSXr+li5g6)@z`%);?z|NZ?T$mBHVgKr}n8U_L#S{U+2ig zwr7hwO>4h7Vaj-A>z>#&cfy8VdmoHnk~U+_zaLEwc{A7H!*-vo_Df19^m};o=I)ux zOYW@D!1r3MlnbklciNS2e!h98nI9_WZDsrPai8#@>3`e^ubn*Q-7_VMd^!GQV4c}r zo-IvMH+!%8RuB4I2pd?v_L&E}_LXu-)X+O9{HSM>o4e-@dp97<@p6rqJRFgvS;Wzs zoBPe)?PBXaxZR*@FAtadV`cf0|D3LIXJ&BTjpyd9NHsQJWT#P8<2|fuoA`Y-=K~+x zMf58@* zoE91BIOoi_jo+WYNs{H5?e=sT(zG2LF|bOzcstI&OnfV{>Am!+rl#Cq+IL6EvQ zIa;Z2hvK2b8b7Ik-&i&; z*vTkx$- z;rw5wIHpgt^lpVoi+aA^c=?*cj((p~dv*C%`ea0h+8#;s3~zdMdiu>zvkckMrPIp| zFB_E(DR|^l>7lptak&G3_uCR0e5Cw^lD&dE)U~eJU|DYM<##!I$M-?pll$Nmf9ex{=d3lB*ecFMNj z@Ll)sZ~54BW@U1imAFRg@<^#Z*3CRdv&TMADd;VbtdQQ^+zj~sM93NfLkkqcQjqTDqhOhk5=^@-~4XZ zzbm^2_RKzHpM90^hVwqP_wAE2-raT$BO?P_?v6|_qa(Albgh2y_|uL3+Sl!x;L)FD z{im)ZryT8GJ!Lkm`MA6_m+g0|^Xt=-;htpC(>Bd^|V zdg9-30xyXs9`{H{yoN#R}3T|ex$FZaQkQ!~FWmNKz>&hhJ?&KkPC z+LEs+7Ih!&{jg~L&@xG8-nlwB(Y;a)`uXm-zIOcz$Mm2?&A3+M@7aO5 zy1A?gO6Rht$JY1d5>%|cyi{V_dbR7e9#MX>-K5<6(;QuYwEqOBjw@{Uq9(Q$1wc+rky!MHP^c*(yecJ}3z6KvFRBUmTJr9St_q|x^{o~~8 z3wWKnH=uak3~eq~-|yjZ@{hMc6R&sLmb}HaW3I*a&C7gje>(TB`6@dmO^tB%}OFkjry)lrnT+UbF$cew6W@*r_==jb1 z_xt225uV7kclW@8kxoaRlwJ|K=H~NR-FDddoJ|n)^LqNY`E{3OwL9hRx4iiJGU4A` z->*4ZwNk9a=Gt$o@y$MH$+Gdj3mPhNdUnHE1u(}h=_hEK^m zVadtYwO!jTOXe_WX@x%n8)beo`(~MjJ=S_Semj z_F>%u;kEWYY|txyy`~YHZ4WML{72T#)>%IKy;xc&&j_dbP3zYiJ#kmcYBjEN1sW$lyfN8?>P=D)zFc$B_*8obn)>uP(EVf5Wywnx4Bx)!Y^LsKieyP| zn|eUr#wT`;dRHUe%btfSdbw^|$e>P6`Wf$+@jICO`MMm71w5j3HhsBTfn-I7@@ttmKI%WI5 zqxsn@xvv##_eZV_}Q<3HT62q>iw-io>vR6IZwKBx5wl8lX8B0TdHr%mf1VJo0u)I>8Tcv zng{h?IC<9d1i3m??bf_x_R)P@j~!3^B)^O6u@k!*`RtGP?cBHmuW!B#&iHEcMb{dO zpN+j!x_QOr?MJ7!nzFjBbKay=W<0e!|M{icrN${_|H^*v&XXi3g2sIHwOSLH$N6f@ zLuDI1b@}xCxo4}UH|+N~|GW<;xcX0ZzcnYJ4(7Ska7x2Ga-Nd&Q|qjUH}xpka zk1w{hiF8k7UAym=G4{tVB+7O_@zT2kB3q8xwBhlF=~se0YS{kW@O0{kdYSSB%&4Ad z#Ih+bgPzYjJK$!I8wGnb^XzzU<>H0Q-Y;EGIV@1EZi zndq?3j4#c%mU^;uQT40S>%Tgfa__P+D|3Es@4B_$8aM8CTv7 zn3g7gmiVZE&()zF|Pv&QaCYCMj{H@&;4Th0F)tKQ%d;DtU*zRkL+{_~F35w02M1BnT|| zXXPTD@;)p#ApC9clgX>So=hrL^;jwI2}QsEZa#t{j#im7VSWCw>s`kEd22@2g(siX zI5A~vg{7_+zSni!-az7&KkLG>ysB3D zS|Me%8PiXH4Nbmhc)OH|M?X3Ax_I4%9_=pw6_&&1QjNaP;!S=y{p8wmsh^Emk}->W zI`4>jU8g*@7Tw;o_}RkUQyd7`xZwPvx_94i8SlHdq4yJ)IyMO^r|4L#`@DQl#+53S zwNCzh39ODix>Ia?u~wt=Z>(IwCcysC(}vTwr_OwEN~Y80FD@u_b7W}kf-V)k?_7@9 zIJnxD;FB4$bZ`8$%5B%eb+&yTmMTT$+_f`PH_Vx4PlclU4jesL+j&%hUVFz5ZW{Wn zQBLQN%^S@yeS7)&n4Qa^>RpQlk2wuAbNxK7GT6C3kzJEVt@iP^#UV-+XE_uI$Oj6&J61 z{8jeV^3}cOxyR4gI@Q>o!$!4z(WzdZ7lO?jdlXc&_!CkCgmmagm zX-9eAz%l;g|2oj~UYURPq#1UwL%>Y$yhAU&NI4+h_Kul7j$3Ul)VX!BRy)sG=Nr@V zSwxQlcGI(VcsqV@>kJK=-H9x{vPRKAiyXV~eC6r1)sL>Ovdy!JeXdW*^K4A-IOkQ5 z(rx;MZMGd4-2O}UaUa90y0=_BV9mp^<$vDyGxiwd?Kku7$>bS6wt6+{cHbw-J@N)! z>F_20$Dr`q30o$t-qUH?_Py1UKVMyWZn}+43*=7zdfumm*{4pAIF_ZW-WWS z;BY-{rrEtCMlWenaCiS>gW!t|vzbBFNqfc8V$$4brxdr!2G=7mFW0oBkY^o2k zYBc=fsvIp`lJqKC>GS>6>mNln$hWiYp{{jC9_g3#(#f0uv{=#RO>W;t=No&ZxL9~b zyUnINPlk-#b$W8rEARenu_w_Qw&!}| z4F?tkL=1ksAjh6N+j~51c)7+`hgZomcJ6fcbG`IqdgT6g<>bvd5lPDC+&b!I@A>sz z+*Y0Fw7JIo8ApngaY=W6RJC1;j=zZCwEKvMle2wDdbiTkIupkyf9kd>LFJG|7fco2 zb(>dnWbXuNLblAAUSpc+bb|w5Yu>we#Ci9r&10*$o?A4xNrO^Tj(%%9w)wNOH7?CL z)-lzKZPx8~ba=dbSiGAy^ILAN{^)AEEopD|-F?oZLYgZXrxZ;S=6(O~L`S=I*tnua zr)QpH2UdUJQgmwWf={dFDVnXufNqa3$IIFK?>BaP+b{C|(`sdW+q*3vw{yMS_({V8 zRfE1Q|9tW8DBD^GDrayFa&4YB-L9FlFP(Y5>_UrWheoa$I$**6G*_)h+h@=Awg32K zkB+9RTE;1K->GZoo_4={FH8N^neso%eRJHjyn&8=mhb6bDaDdEJ%+W2$i2DQqK)G! zB>Zzz;YM3$H^|?swts<_3vYkCS@)Lz{prQ?-YC?=uJE%yg|a-(+rLJ^x6gB>Ta)yv zUymW1&ehq}e%Q6n?RS-}+pBQV*)NM`8ge9JSBs_ht~W2gVvOC^8>#A^Xl5T&V7TA3 z9l6K5?b=uJ`=;!!2}W#7X+7(1`;ythUU=Sr@*%u;-4u?KpJwgdxW&~$doyMD>viAL zWuIHQ9#8LbY{{^cmlM>y@ha?igF^W~O>;i@rGmrpt|M$q-ApsP`NDKbil*ydt9Ii) za^EKRXFuP+$@QQxQNe>~sT-M1h2N#x)=Vq30Vp1m9k-z{a=Bx$QZ_LdzmuF2T~B^I8_ z`Z)COFMG;;I_}lbbI=;EQ-vzj-#Wi@x6q#7T4%34BK??T19zLYjPG;HX-@ZXrRqHV zuxU`iM4igCUsSBfi$B{0)_Cr+%HiUTClAA~7yWbU2mi?f(!6Z^WPnbuuif_%UO# zRST2b?zVS6Q_SmZ^9y%xy%{&@@75PxYV8V1Kk;km)6%D(b>CjL{j>CgJ07UNbII5$ zPio(75SjkVn%nJ$`mFrcV0-@I1**nR`la*pRVjYHew6FL*sdE_Ps&%TNv>s{a(ye; zv$F2wekMHh>Fyi-oZ88KP42FVTfLZ*V(;zu`F3aSeWK&f*ON_)wQCnx-@U!5j>D}C z3w9jnxMxJ$tPaJt$#dQ*%cdU*?)ENmShr{Ao4b_#^0d&UscVxq@6ab<+v$}@E%bLz zxn^<5=+h%SM{R26bA48%-1nAv|8#)UqVv7w`Noy>7q2BOH+MpwoKrGq&(mn+@fQhN zRL#G;?D0x9DoyFVu>QPK7hPvB{8VoH*@x~+f;SA4`-M%z=5DDT5WYzEFS#GjRlW6k z*YD#eFMn3t*(YtfWjDs8u0DMG@}qs`oVa?o-`T^b?fx8o(Rn%;3uuchO1wLBJ_&bM_X+Y|!_6prsO>um0Ic>;&nKy zaug~yWX-J`17?-FUAFh7(#c%9`*!mfa{u|ZEPHZ&J@bF;D*wgrYt=)-+HTBIXWo&B z7jkg>XzPh zwD-1iMbp3NkiSR9q&c(P+!JxP?%hAjo+y)b)9dH<<>&r&*nRe%Md=&XEpmF=)@P;d zZHC*f`!f8~(k=&!e;$?S&W$}1$MA?-hpj)I_mA{T-|twl#@8BUy|KP(&V?%{G+6R> z*^|&crd2LM*NQB8KJmqsxz}H8?IFByVqczzEWL2OPSB-nH8uwKZvH;Lf+1tHM9n!RJ+IY9xv~B(BUAuc;De|4FmE(!@x1!8J zhy8zU`d;l`-N3y~tiP>Ieq(mC51-!-9eh92%D~2byw?WLU7y4|i9DaF{c(NB>o;Xj zr&yk6Rn-|eI{NqWEx+?Yg0fY%%)eUl`|^iBKfig}bXD-c9u0#(hJG5{^x1@svc9{w z^7L}JmMXRLu*ichp-mgl{&=$At_~dv$$e_?wQVN!?|mV1{_&|jXLmm9^Ut$N4L07k z%CUR@lGaDoUAXd!m8@uxn{H{VhQm`oSl)G;O%2zoq1(1wMSUw4 z_qSRK-3{gUfQe)2s`%uT6%@Q&c=e_Z(U;H!d<>-?q1z&U>UVbL=dm>Pf_*xe5 zQ!M0fS;+r^1#5}_0T%L`E#$vj$k)V=nk*UrSnxG0nEwkF@>%htJ4@`lS;#L2?`*;N zpIOKk!;gwAu^((9zu7`Q2`)Z){=jLN=TY5B_Wuev;k#MDPXpi70{$iV))w$C`0-au z3;6lqE%E;&cuV|mj2|^x;{OWpjV&1eckpd3;M?G$qrCaOVzJ4x~sg(uxmx6C$0pB#Y_WX@&S6=uS zYm)Up3%nET6Tq#Q;pYdp!IuQj{&?)s2R%vbr^%x|{~;F_z5#e#cZS844+mdM@p^sd z_{9Iy;4PWI0(niQX0XrmAMG36fBJ#1VgdgGJnz3ap7?kfeSYJS&t$3(9%vMg!%0_? z_}vHJ2t3D5+eYn|wbh<~(0BGB{o-ScN!o>huVdyvZs&9*;g5so^Kbgix#K+QNy6vM zuRT9xo@3CPgl`Jo0rqK^Wq6#RD+xadyc2jr*vg}x;qh~9N%)K4tAc0j$xFFj-lc$c z{S#MyF?e2o#Fgh?mTzwX-yXb&1^hnnJ{ItW3u)KyaUK6C@VtMFEB^?*CF6G~Y+3x5 zg6H*fT>Vd2M7#csE8iA8_g}7i_F;7WF9%;-@d;HQu^l_C$2lu1@tloUn3ntf`B%RG z3seoo&-ixQ@z1>8y^CE4UmZNZe~`V4`=FjA`~dK!!P7S5r#H#?X93{%pTaSQOtFnc zco(#_(ZNgnLZf<*9{*l7evTXc=-$I+{7H&x&(9Krt$>%_7zlr-82(K)_%EC&x{5Ig z-x!OJ&!2=7jS)tr@Jqn+{LOfC{6_io`0~ybJl7BVkadKQF($F^0loovHclQR@nfa% zr@%J^FL|T(bCuM-|0Kt;OFuta`@cD9=L5bb?33jSkJEJ};g5jl@h6bc_*<9Ko<9pG z{YrnoQ)yQVJX{Fl+{I=7dV$9l7!`l|U^M=Vz}Hsx89VXocYaH`w0jAj*RMuwvk&2` zVDsYoDUOsc#==;yu81s7Zzd3l`e@b5OI*|5b6)%3v z`ODnauRaTZ7(C-Iyp;cnF)x#L|A1%w$?Nr<{Rm&UoW_&oIZ$sO!h3_~^^?rIjDt2} zO2RJy&-)*8EaQ1pPZItE`0C)9XCFqdUz%g`Xq?SET{|JiWzLlzKO4cf0nh&Q&OMzJ`>C<{%k{ggLDt8X zgm(ka{ZEcvs-7hLV(^@Q+K!9;Yv5)5iw{QZr^U%b_HWwPo5cT?;GNa@$r>I1Oz@6s z{G5B~mwm;Qq}>h0%k`U-$HcNu+7)-yu3zQ&i;a_d;eEmL_+jkyj-7o7zX&|0FpOnf zzwAd(68^rU#xr(IQm*BG|1RzFRE^$$*;?-ygm(vzEhLP2`p=i1B>XJ!96#reNyee& ze*Z4~Gw?N({ol9#zcs>FanjCzddDq22_FWY#~=B)jQ=cn-oHwJqGIQFD($SR{mB2W z{m zJJFfMetq!r{E>Y~d2HQCyJ_H^VV}08EH;+)()K2J#y_s}p8*dqW&P+~yXN-Yz&pXd z_@j3Yr2R_p-2ce&rFR^{KLL+ZK-Bu7Uy1pqBOz>2DL3BDzrT{>fWC+gHk9vQt}%lo zb#w3q4&%=}ZR@o!{AKV>z;oOz(|a5VUkyJVXa=7CGKp%r-@gk#54`OEahd;z;G4oe z$Bj7t8<*c()@sClrMlYrm*d7d)SZOC1->2Z$CYnWPm6zC`8D9N1;^R`2k>|V7`1-W z>mGe{oHya&lRQ650p95Re*n+>Pwqc_>0JX7|3dikg6Hp~25h70zw0CzJog{=r`LCL zel2*eU-~UC*2k8_|M%dz|H!^$^!TlahX=IJ{%BwC7{q=Ec*bAiE~?l6b>Qhg=Z?0G z+W!LH8NBQ}M)}(K@{;4HeIrT6KL|X>PrIB0qxLt0=lY@lWTjtxj4?^O_u$R1|BTu% z+ejO~te+T-npKMZK=8bN&^zzah4AyhbN`R){`Jv9eoABQ`B_};KLT&b{#h3%Px7+< zQc8egQHkFK@O*wtUXGzy(5PzRPl9(;@#oqxx_*-5-=GzIKb~ z-~YwM{yYo$f511lVEm0*YQH~;Yy9SeZ*PJ9c&#k+za@Aq;W*F#D)88X;>=sMw#p|7+kYnelq}AmKB#(fpcgF{fFSO1;%;)tGJm=j%N0a&i_OU`N!bxEwG=@J^J}kT;kseJm+8H zZ_=40{u{tMnej&B_Z>Xfzma2yE{gpU9@_Q4_;1vH0Qe3T`2P$%P9gus+Co+cCi z#F>u-ToF8v8}2=P=}8j50$x8pe>KXt178*Pxqoy08RZjsYtLWE(Wm%$=}F?hCwT7P z`zj2{1k!8?KHx+lwV=t*M#5O`ky3UBoIPvfio zev|ipv~BeHLv!$DVPEzyqvIb9zAAW*hjXWQ{o$HBD)qs8D)3tF_t(Gj{fC3vog{wO zV4u&Q`RtixdhH9}$xr+HlX};k_$mB4@XpGABYg<}0lX9Vgy@(PJEL+40IrTH}H-sew=^3Yf$(Lis#(R9O`jH`1D=1 zzrP~$msk&sHp15h&-E*Ly*^0$Y2f+%oo4kOJ8UcbW$?Uyi>v>sf=s5Oif0Usj=u_c zj$e*H@rypjl%(Ah@EpG!`$pq;LGk41yHUPWaP;4wkQm0~x73OM9^ma&{PfypAHvU8 zJj*!$M%Vu}@FiiN{gLN2tezzHlZQnA{VhG5v=P1n_^Qf2>(WSrSXB67;AQ{9d0clA zeiwL-Uygq%kF6tV_X<4ckGzp2e34M?`4#h0rl%ii>jR$mpTg^1L&DDo&++s4A#0Q` z-0jExOONktBldfOcT)cAwQbIC2k!`8*1g_7#Qr~umpuE{lcas6?%Mt%^KbO}w4$%D)6(7WQTSWn8hvK-$^%(9R#s>$T0kg>MVKIP5boWvq`aN!!uj zW&M)T>x1yS6|Z;R#4q9PdTQ%0uJIcR-WlU(ztX4Jh)JdGG4MS9ao=W{l*h!fPTD2z z75)5^v6FJWytCrDe&b?43_Sgh>+!ow*_Y$b==^^M@2Kq4f9Xf>_#5`to}cLDq+f~i zV(=Wl-s`5H`3K-DDqio{*@xKAi5pPbm-*8>4&mE^uLPd?wBno&6@Dss`mfinbS?Z@ z#mn)lHwMBd>#JSA^7v(vaxM4!cWGAER6;D3if+WCvN*{4zecY$wWf&Datwda={cY3_^9!E0%H{i>|J~_QCn*O^^3k}h( zUuFEP)04#hVDLQtuk!UtjTYIe+#UW7+VjaTQL8rCRld;;0fNz0{e@=w+7GHpTL{Z_*qTV{{2GXC9biBQQEZwFUK$K z>rKM11TXtXT==KpdH+Y#+<%OYzuu(izkkF&j2{1gg0F2s{Qm)813b^aj0sgwlK55q zGy3^0$1dfu^&#y-!Mj=D|3&a+z_Y*Pco~g<(#hKX$=Jtb{dNW)V1fUy!8ZmE^HH&* zA9|9+&v}aW``@_w9|0ae!Ho0q`w_hP`qAS%+lc?JQ?=)Bvi^+nBfvYU`PUmebNeU2 z^ZZ4B#3wyINZV`?+VxXh`Oe^JKd$3{2fmdByz4aW{L9!K#GBq2%J>(84~BhmaXEf6 zO^@Ec|I%yRY_2+jw`Bi#3!dk1nvRQo=Na1lV_f->;C(EJ-#hRg7VynyS{A=8;Jqxc zpMBPk{>!?;bi|mXT^M*v=Kl`(-WK@ZW_GmwxU8R@W_(=kKXS~8{{0QFKaHNhyMpKb zEr*_HjKN2x#D70{NANuF>a~rg|MKzYYS+K)FCi;*Cb1s|z8dWFx`|~{9$Pok?mBp$ zf93hP(eW3Xr#*kmtPJuVN>38|A>gYj`>FJRs*Ug)!Sni6?|qY)5Z-!z^zZMbPLB%T z0DN)S*BdwKTlg^WCBZY#Ih1*jcE3~MkAQas&$TaQzhlhHrETH`TKqU~R^|<2`7C^O z@Ekww(|0M41^>5QDEQLgdF+ta>x0-?2fi$Lax62-KL%e>@$|tcpJ!q8_ZJ!Bz{g*t zT|WVh+CLaaJxRvj5WI`>pPb%xDExHrwaj><>+c?TXS4Y0@ttkN{vV6A-|w=Fu{Zks z#TUGjvQOUV{H+3CRq@<^jK=RJ_$p@cGs@d7`SJG~a6wm+_;mzdUfHK@qxNTmF9DuL z)8ZxlG9OctcBjERD*G%m8vj&FwfK?c+BeF(f|v1=HOdb)vk%-be;T}_8h>2)RLi1& zKSQ2z(37NHE%4lbC9j8N8)@GIy!rlVlwSp&=Pz>HKc!#hV@lHQw(_6zmM|vZr#j(N zE!W0RJ~3WK=id>$qnbY+JJK&c#+amC7>1FAp*tc4(J^v9_%GoBSB<(tZuchp>z4Q|k%R1rLfUmCjf5WnQ>qtAcRC;f;mN!!ZcdH#~Ts9wG+ zczZMdjUGQM!Mm98vDuY+@$+wGU-F5hK`bimt8a*&KN~Pc=dZuwX-@i##dK7)wA~6` zuD@to%46$8+PyU6dHnJkNKX>pcB3|bWOxqHy9WsG2EH`rk33^9<;=&Fq}`w3<@%Mr z(+53C__N@hV4v%b@iRJq4K``Vzwkz{zjlCc2K$T~Z5#E!+~(-(FJ3zt^*_%x?fYckR(X zvEOoM^!kYlzZ-lbGy8h`5c|%%qUWEiQNAB|S^s)j^YI@5&-G81KI!d4{QqL1|7CYa zU;om!QTzSC%lVf+iC_2_W0H19z*jVzzZfC2O5x+}i9Y`I`p#~IcLZ;K{b_Xl&ja67 z`Okin@J&Y&`!;){?Xyhp7=&K~-u(VW%42gu+9lhkoxde-bpNRJ6EFSfwLcg<&;P<1 zy?)qYA^#jaub;%e(eqE9{n6L2oI9iQ*ABe-{w03sjo&`-T))B@wV&cZ^!;O8{PzU! ztk%C?+Z>zty97M<59Z@y-*hnAerz!_uNV8y;CcNewvC?uSAlP!c=l;@{eA;)zJKbC zq4;0x(2x6{QGO`+>Sp6lX&$5)K8yY1;3a-+ZXE+-UL}0)!_oV{l$p2t-Dhdr8oarE zqw!x0-hBTz%6|nf*FW^t==y1SSEO;3|F{9(Z2fh~UOMgb=U-*Q{s0L4(4M@ zVrL`xD$4)F0Q9Z_;omAgp)w{KlWo=sZ+}|*{+52n#eaYBvVTjTvDr4azX80H+5G8Y z&3V%q?f!$uJ@-DnK1jRL;CcTpd86~^t9apz?mr8_bN(57`XK$_V~k1sy$jw+#m@$W z(e;z>Z1nyoYam9$s#5HC0MGd8wJUuKzXLq?Pv-T;j(rGU=bXvZ!OXtVNygdKn z*pupk(MI?a;Jx9$-ndKm!k4@ly?$9|^!mpie03H7RN(dcA@i-e&Ex=3M#4o-6=eiudemDlbeuy0p@Z3LXk7eQq z^D!mi=Yr?`OI+jk1bkU#pM4m$pYuxe?|(UV@hc|ZStsopf^Pu(Vps1TD*RmV&fv-E zWzFqB0AJpM_}N{J{{2c?bS&ebjhK@7KNY--+4zm}cfnh-|8~Eooj>TSUfXOd{+|cW z_zNq_HZdjPGhL5f|74Bw&A`*Xk+n;|#Qq}ij^Md=nT*bAE3i{CPipWFYO z7rv6>$?0X;m++yAXBm0Dd$91U!83kw9sdi(v%k3bU-*t@Kd!uw;${CaI{t&;x&PBX z=TL7PBz`IHTDJbZz?+|c;exIt_BVp(`IE8N>pKky|3dK`JImOQo+P~OJ?;KkIMLYp z5WeM4d~BT53qKlsNj3hs_`e%GufOOw&mnq~*ne+kKfYcV?SwCW-(+%xeevCB`~tx@ zQ@jE5|JpwUp8Fr?-$)Yw<30Fs|1|1<74Y1Dq(7s4A7x*7yr=bI;$<>q+8oJMeP;)9X9?7k&}=TJWFtjU?eC z!535G&t#wj;j=%DzJD@+|Leb-;>CZ_*!mLto50sm<7e!R@>b8Z^~ZCcUY5Rz{W{Od%^SkC%z|)$*5VK*#8P%)<4UnAG4;v{3yKh^XTUX9D~v0 z_YinqKT3Z_?PqxL%U(b`c0wmjlfqnTYpJ@)BfjT;a`BSVK#qK{&V}E^U}`orMCWL+(zTy1H6+3 z@w*G2-ye%z(VzYOIWPVfeHH!vH`^HH2ZDEoeX{J+D1Qn(uOEaLznG6HNjsa@KknaB z9uvztY1aw7lLhhH3f_GE@H$RU68qnk|9ayleG6ahjduL8oNG|ZrQPpT+6@9P*Dtb$ zf5(`Y3%?gU_ixs5@04=pV@lF4^IPrtA#F1TdgCB`P4Ha*w8iTWy<-r55BTDW*K3=$ zgntFzS@E2Ey?qE@`kfYk>C-451ipc?&pxGJ_7_u>q{x{_**f_@&qXcHkL*y?#r-VrKz(7sbmSB5h();UmFw z|6^P73Hd=s65i?KkMl3(v2`Ks#)237Mq(iRb?{~3zs#MK>$RWtQ}q2i?He6`Q}A;9 zkk>l~@pHPeZ)EN`HsLRTH@|-{YQMwh=<^@@)tkirEbwyuVq^@$-vuxCFM55akHTm9 z=f~rp=O8^v_-5egzvPY1|2Xh+{Xn~V#~}9p`pLdgKHV3S$x*F;y)69{`%S<*n;rkG z)02ds3ZC&ZVw?R7e-^yG1$>IH+VQV<-eqiJ-x)mp=h`)rgzpF5lIJ(qz&o0aUvC`6 ze%5c6#lPuKy!0DeETmloc$q)FzO!%PFM#LsE0&Q@$qzb`@Ydh8f4`Y5%aZG0*+lr- z;JN?E{7ZRk-AKCu;CcR$eM9=u%WnoR@iX^JFaK8gAJ_F?7*VJHG9JDCNc%wWJpVDz zIWWqf1l0^Y$4j0sJxT26wX*v6@9#18QXX3$(yl*vbN`LnKd*S1ccXlkcveySuZ-Pj z{Mv!9g7^s^+qk7(#y;AQ{f+My46 z6W0n~JZ@y&Qt3x_yy#OdytuYbEUmWcyXL_@M4-1_5S~^+Q7zAWyf6U&oWj1 zE9G8sTGg8?$9GnhQyJe2Do2p<1WjlO*8kMNbMXj zS>>tB<8ewa{m5V-3OOP*nPrvI>_AQ7I;+pE#{WB`QB+n~zFV zezZ}VM3qzNS8`RJLY12ny?Nm9H@hPs_mr&(Yek_T%1kiF& z?k82CwCl)9rOZ32yty)7wNyEk{nUf9eSK9<<;Mm}8!BzYLL_r#QDar#MAe%s`)!7D z?o;ki+Up4AdJk0X&6VwgRJpmbC>U?#d#HMI<+G3>s{DVc>~g5;m&%XB@W!~0fzsb` z(3H^Gtc*q3ey(a~uIz6K$~o`Lp=`23W#wfmKFKgxl6+Rv@pnJf7`s+`JvUZwe<HQv}ydzE*Cvb{Hy{`jc! zF3=>%heFABQ{_FB_EP1&p^VQUl^+acKf|Exca+MHRrTYb_+y%&bP|;9B2<1ll=fyo z+0Se!_vwWyzeLq9h2oECIo|R^&p_G!Je2$eDA(O}rT3utV|su$`uhUPIJ}0k{TnFP z(LYf3^9_nWQ5m+gMj`!30%gCcq4YZglx$oLSqt0JY{4o{B8~ZQ8j8gVjM&+sO zr=n5^RZitcC%mzJ4VAC0v@Vo(U6nR~(oRDt{cEA}EtR%XBDAz?KlzzWe`VsmE@;TuwwFZ>_)KprFgFvFvZx^L?RXLUI z>#01I?dq#MmGuo&c_USBuB>mY>YJ*1bIpnR5R|iBsH)eaY}!+`|CMsyhpKui`yZzA zRK{tP%Ev`HpA!}TE9E@RMm_D$QSGSwxBzdA<04f~WxK^HPi1}ylzy&Mx(|Jp0?H%41UYyI-}Vk~;{+QZXG-{?4d+b7lECRZit` zeI3f8+juJr&49r&uGyiqpF?R*1_6o6_IaT^9tx`ZLQwi|r}9OiOjNcn31v|^ys=$H zrIn$quL`Aq)s$9OS`$h?YC)N(wCf7xan}sWb>;zOKOLd$#|O$3ld|8=Xvd}jsy&tE zfl&4n1Z7oszA2^szA8`Uc*0bkN`3&8aST`a;ZXcBjlmn+k5@VgO24N<*?u;ZcIT@4 z1xgpI@}*GxF|EQI{n!8{zXi&Ex2y8KQ2MbC%0y-TL8V8av~x`5PbxhPWq;>Y{*uzG zN^d~v=Y1&ohfpSSWzjRd(f)I#FI2mjlyxQGmHR{nm8UYF3rahA zplqL4X+EX4Q2JL8%In(Fs=N%8DJErqWmUVlDEV@Vr}ATEym6e4P}Wyvp;G3ZRCzU3 zZmz6%R^?Q#qdHKIzn&_mvYo5SQ<<-?w1LuwQ1UHQz9p1?wSls~c2Fiul;@Amsy|;S z{qR%${z_Tzuj;AvBT(h3tnaGwRQekNS<@BYDZ;$G?e@p zrDK(jgECRsZh|VGsC1I5H&^!aC(60s&Q$eO9#ZpE-iWfl`HG`5zW_>q7C{-0m8zb~ z^3^I&W&1TMPv!Bk0m^oppp5HQDBEp=GW|+<{@bs(gNi$%xTA_QSK2v=a_Sk??yS;t zP};o+r5~47`4y#CRrz(5zoGP|D!;Arcc4tvsQXwb?Y&avzf#W2N7OTJ-&H#*_ZJ%! z(ywGt#v?f!{iN(aHOlFCT2)VFK0TCN237tmWqn3fPh~!n(#%lypIvEgC=-?a=T&)g zrN8-AIhE}SK-q6WrT7>%UN-yh`=0;p_e=kM-=pt)As%Y~ecz+qM=a$5iDa%kUYA9c z{#x^+&is2GHf5g2`+wi}XmS1T`yQ?eJZr&X;(AKSx1W?nsZ=?Y$0fh#VWM(9WrDIu z&-Xm!*pBW0`@VMJz5<8`@Top zNB{f2N4pRE@B1EYpWydCyf6Ik`yOqd`0x83ZC%9lJrM8pfAu{NNtXZjeb0~I`|v#c z-}gOS9oqLmyiWV?`yTB)^xyYAQOn|o?|pc@{P%s27MK6N@6oPX{rE5e=~v4A*>Gmd$jdp{QI77Ddk>T>*0U!j)iGu()#5Z{huYXetAxjWPR^p zzjFnq9;wr$Nxm6JU++8cFy*;AG_?e6YM71q@?XSYY~-~72Q+<(e;*YRun%-%WS+km1@d)tKHTQ~W( ze~?w#rM0g0ZaA~d#Ir}wYrkpN;;Vjs5!JQz-ePm(#cMPqdy>I*PUTB-Ys>q3m+rj1 zcq7x(ejY{Fj`Oeaaod)ZX}_l4`Euj9J)yflX9(+&|BidM=8v~$?A*AS!=~Y8{;KU+ z>vu}wwf3FAxBS@U&nKG_?>-+Cn(b1#LIvXGx3-TQKj!lN_HUf>ww*9$SKl-@ceN># zBYw#`DQ-P$+a&jx(y!`ttzIa}4YPiEuOZ30`q?J^np@vESgKIoLQYBJZFe0~Ur^)uwSD#^tS8d&lkD`B$wCI91TBUw&6B z$-2S)xof_ZdVcjpqa_WW-pJjmMB8m|*ZW`lXH(eWOCM{kd{-}5@s2an&pchkrf!#W zi+ZG=?3>W$+}E!W{WrGSzx4RjlV<($yKG6;x&K;prT(*$rSA`RuGQsh=8Zx1FKtLS zvcvQiuGg36uz9rKzEkqk_1^EgQoF(3>BZ{xuT`l@`!X$DZcZuKt=#zCgl zOR{d8`GN2JwA1QToltya+EbUhj`y0;``P8~ZC5uR-adS0v044!W%#S6eMIVc`K%k< zN!MX;i&V8X9qf`aTZx-Cch?+Q+1;#Pezz^j`rWMAB^J+ExZ(7I;&*}^!e{pV^!iB6 zJ5xN~KYi1$SkBrhgM*J`?d`+L6xsAF2!1(DVk!~_+=HwG;g)%%J}(P$GLCvD;=D;*@Rm~Q$3s#aiY45!>bbo z+IKnG?$gya=j!&ndZN$qIaW>I&oJwkzqOELJ%94f152)Ldfei1rmc1Q58JuHxkl%r zJ{zYWty!>bsOjR%p=F$wI6vMQkazg2lYeAidpSpq#7XknF3+6n{L)O*{I=Fn{qk5d z|2v}AkFvz?+kbYk%~!1|Tpj2&cHvsTeL2s(+_yC~1e6wEJOI|1E%qTTEQDb%`Q=%_+z{@UAU`pbaCjn4l+q}*jtR^Qt&Y~muMK@gBm>F(|>>5%S_?v|GB zZlt?QLO@dKZs`W;<`Mb%fA{I#?(QY691TR)ahcY=skr@xZV0?=Da3;RgW^j zecl`JuYlNliajshDQ0L@}E9&_Pw zC2}{T7}5P~E5ubcB_r5MfqNg|0?(y_QW1xFzPko`R&}L9_8yKpRoKCPA-+9{GpR&7 z&*~|V5S;ZK)TuyYQ59KPm%6f7|2~4j_^$X?DPDqpOu69G^Iq*gG}v=)pZBK!DFI(bemi*pbeo1#~E+B^idi(gVDHgPqR4 zkK(_J;Eg$nKJy>&iccm&jF;jgchpalAkP~~vrm42?fDQ+hs8J`^ur46`K$-{pIOZ3 z_xRs=<7Xa(43|`#UJ(~ftYLcf{&Y=*$qj|w^@@Xwdl5Gwb3!z_w zV@4TA@B(fB3Kce|$^b_eJc=jgKiBt<_4XP3uYgP?kYtx{R4?`hE4FKNT}GgD>{#Ud zN{_&MAr(6+xt{3oUn^3+u2EX9kA)XPR%_b`jiMxlBWM+r8!(mj5IFhkg2590@t*g1 z{3{^bTG{RuyPA8a`S*fKaIa59g{rB?SXk}YlIIRP9fxf{+jNe(tp#NS^o3g z5;qQqzm3R4+5npyO<`@`iwp5we{uhzf1aS>ea>3kJy7(Oo2P9%v(vyURQG5^e^lN? z$i(^F?bHt9=$_pmiB+9LadBCxRYkp1JR=l=&LVbfq3L}wTi40IuJ7OX;`#jczXF;@ zoqEVbLOo;nQv0s#8a|&y%DU=7E_&o%I{0i`H5mS1o;O z`5~4rc{{ZlewzEc3s*dOeH5&rra*+0z~VdE4IUlA;^(tRe|}(}zwys|>i-qcyJaI5 ztczi>A39@G1U6dGP0@ppm?ePk zOdj~3x7hcONepx)jlW|mgw0{dGUi)dqX;Fz>l#yc`;9-{+Z?2U;cf*=JqRDoTDH{% z#rSF@qbruCB98aNj+aU5j&XdRej?EO>;7#X{&!CQnFncxG%$M3gnx&(>tbNCUkoD` zU$YHiN{EK|$#I^8&vcf~0yfnffes2l_M)tYu}!4hHuXa~&`6U0+Q^)LNK5x$ywCN4 z6d13;^$b$(SkcMm+`n_bI3Z#WY7k-_xhX_eBMLzuYl@de5SSs zTA91{sscNuhwA$~dd5D;ro2n>;5|`=^wj6*d=iRR@jCSktz?o?J|lAET>sIetwe&k zdWQmbee&NKR9JyO;Jbh5pC@R4ha_23cSt~7DSo$LjxKnlqT8*o;+p1WGD^@9sl(-q zb?8!;=Y+D@b%{N_U@vBA5px{rc21VIk&XWvbSc$;@jmC50_aXR;K`*|PPo?CYI{TD z?*D`ka@_ajnl8a({cJ>58Or28yR6nKa;Qwtf2TIDS%`c|D5Sodm--gwDp>qX&yM%6 z3-Pyopai;Bmp5R}A3v^(g%c;3PC*x0QJjd<{p#A=|Hiw4546YNK(L}s48P+Tln_ctN51AeDDC*Yf+%hv z8vimJo%5h8;tUxMD$TSCJ*$PQSp{vDaS(GukJ3(gIy>og{lJe^*7`vkr6A zfpX20r+Lq6@wvbQOO7?Qi?90Czt!0gU)#;7CVW7p;)GSTSxRINzw@%$TR)62WJr5H zOaA8v_PIXL0bLW+;Hgy(p$D?>`Ho{{T|~4(f!k7J+Lu=u;VyO`v(QV78I)W~^+I*t z8S{Nm>hzWfXXjBR?I3kUFJa3gm%s(M^gx$Up+$kqX*WLj7@xXfP5#dzt0`QxlVu9( z(IEob?=s?|IU-#cAAWeI_&_PTtO&FR6F_;Vc5Yf!uc~Y4NL*6?=RUXV3_zD+x+US$ zW{yp30wbxON#o(I4PRvhg-s7`9?!MS>V@9qkrqeQV44bs$4O?G<3fV@cIc*_*VB{$ zMoqO{{owOi=jS~5{xKPWEgLh7kezFx&6FKUTl)P0<5|D3JTa{4?4)6y;WV;w8| zPBlCg@a$dF#H} zlY)@WT!tZpK9vzf)BKd`@=G56_8M_?*&*ZS>Xp?9gGaW&-EXSJ}( zcaGA_Go|tl*Hw9xs?wt_m~W+}4L4FQ2@&DVs*4;C`X63P5;-{Ywf%Kp`VY_dwEQa| zrU`ru4dK}uxX6sM*H$v~0~Sl^x>r0Ht%xM%Ubb@p!~q28H{!LpEgfHt7&+DYHY7UQSHlHU z9nM~EUFi1~1>`UVQt0j&Z@+vHT_P_!{<@yr`MJg~?j;X@+cWlm=$|KO(6ymFHyCE1 zjTKJf;%usO`DV@h*3l8oisj_{{DXunX{`^W9Mca5to^PNw_D?V-PO9xg!5Nwe(#5l zzw$${0^EQ1(>(K_P@l?u*kBi)sX)IZVmamGU=br1DfaQ;F(fb+hqw;15u6Au3pUhR zy7}MCgCG4jS3;Bz&h7%fi;LYoZDz-M09;OByd&>PTX-abn-|J*FA@zXi~AuNAwv3JRwcobAM8&rxwkK22v{qvV(-lTjGPf5pHQr{a$HKJGTEy<# zQe5`hIXVAzU-~87K(~!FJB!X0Iq$mdA@^siXxjOrMsP-V z%*@&OsD7oK1m9h-~F^+DmHcFleLHw}N?m+ue{(2anjv5b+?)6v*V?a62GOJhhH zDGaT=6M`N>O92mX5AVF3LseYt*!j$)jFSYcK$gn##SNi`p!Ao3>$O17c=^1qCOwz%*=jilmDDqIFGt0QxG=K zmSnaVjKMvMqU8DPJoxk1?a%YiT}}ThAe!+I9weia-%hs-P`Ub<%XuyzYY54X`xB$T zb!{4!F_n^Is1CutBfr{YS~-iUm!;7XojG=uQlAy1%ehU$JDC6v=1-iO+lb*9en3iL)Ko()NyiX?wB4I zs4hGw-w+sqPUu4xNt5~BnhX`wD`o3i;&vcA*b9EgGkS)G`L!BGnVoWl(1q&D-bfIb z?;leL=*CoAacs>L+J94MVs){Xcn|sZy!2X;S~xYnJxfo{U()ceMKgZxbcGJae*S%&n9NqKIC-<88x zLH=fru~UfgtJPF074K#bz3*77a+bcy5&VoCNg4u6it^FUA>IAYeQwu9fG!$>@O1DS z@3)Zq=#j314E=J4NcXQlCGkKHad(ns-fnYu9z(Bu>U$;lC|n3rl$O@x`%ajFWLkMS412ifE9@6r`PQFz{do-Vn7!SEM{wRe6t>n5|-JuGhe>Q&(LwFNY?%) z+7YZ+JL)H|pc|{<;W~_TF=vov)^rdF^Pyt*U9~rgaNuD$ir2>9JiNTe;z0LJR^qVy zbZxLk*4otUeDz{TekSV8RFIiy0gTXhizRe=G~L#z_n~i62=Hru+&8tyE`Jzh(s`(! zp;im_<;)2AFTcKjObMWi&*FPz@qn-Q)%z&Tx!1;YTR)1(k9M9mLMfXDu@bFJ1S&B) zZ~C?FX9i#C5x98$(?~jv;a5-K6qp<$soW!0|GCfanlN?C8Q06Dkl~c!1tMpx9El=!X90T?k%h23x;c8V=Bvb z>Of#e1Y&_z^pm`gutfKKryN^OwVVH@^u(r}Y!~!0Z~xMtlmWWdXwE~1(QIm{-LObt zhFBBm-=!8@pAh2r()xGmDoo<_C=nQCw^^PX(_5G1PO0vSNL?Vdiv@BgA4MO|HR+1~ z=HbPa1-c!sO!5+yF(=YFF@fh_gHsn+i2HcLo$Xb6&q5;;3pujixR!;Fd6Mu#jZDD`xuxH{kW}xV~ zdLZE!#6We%VZ=NMo9R&`ewY?a43yM8!+v{ijgD+t3S&ShrZD!O`}`iu16}N&CBI;; z_RDdCcs@xKQSH2;@8r40S+(xZ6raKTmCWLT{B0YTGVUJzOB?Zd8^r0O8v<=a9WP>J zjz7{&toGBoTNrVw6*tGp9s=zbmgYq zhzY=W$7yF}FGB3djO|TLOj?Xd60-7By z;!l34eXQ&?RUXEBF8P|jd3bS^fNpk-_0^|Qo3#Yzjd+3flgyNojGM5kRsM8XcbgoT z39x|da{lD2B&9<3&g`i(2U4zIBO)G(A9CZb#=$LFI)Ljf%0M?|N0*Z1O(e5f(s1)d z7F>@owG**0Qka{h1J#7M%*kulywxyPN0uJ1gadIR7AIFRlQ}x`C`Yj*<6-exl`SMd zyedE!;`~8C(~eq9`y_)THz|Y7rs~PGfA~(G;(Big*|6(GQ*>jZ=)~yUwc3(z(3+!w ze*r92lApd|aVe)5Jus z+Q-<;o|sak^@*QJ!ur3BYhWNg&}7{X1#LpHdED1)MkL&C71O@dv%m9aYC!i5e+)i+ zvlSO!inccMqHnL-K$qm3uT3!#P1f87J&o|j1`2v1pzFTtn{RLzb+qGPqlCzZSoX#V z75u1|^HU7}xzF!~I?zRLH|uSy7W!uC;PjBEwvL;v4(hxRjI(!8IqSZ56FS077cf|w zHoeMO#J6U3xT?U`4H6^!?v0nDKoc5v)jkBsg9gw=3h+=;y89erJ5%y`eP&f#(sD@4 z6)s^JtwuZpiGv(8PSKn4e&*t^Z+lCBG4Rxt5=BEqfgdiEk5SO=7Bcl^zV9W!nn0H( z%KB+nQ_mW*R=Jy!Sar^SpI8k;?|^vj0%9MfQk>^%3fweQh<6;z=3_lX zQs45#s$Z}*ZZIk!UM-+I!u5%6n={I4&3zdIU6gY#bmut8PA7T|z*_k9%V$He< zif$9S3DuaVd>PNbAq% z7mi{m#nDIHA2WbB}qPJYwpxrFemgI+2o)S)5rC(vgV{<8TT1 zNsZbqnNtYX1oh@WtM&iid#n$1MQhw1IRkAcglt*e@@C@F(FX24m^HMKkDV8<)vhz> z_sRK_&FMmLC?e@a&7cAwlT=ER+_;tr2FrX312QmQ`qeLaFaWx3OM$-vnNaP6Y^!%l zH+uRhem8Gq;@jB`QT#0Y$>c9OwRS<2&R+Vcb)1;TZ&Bs;(GhW@ykj|}u%Fbvujdl@ zUKj%1mYIWt+nc8Jny-wnLuY9$zSM-1UlvUYH0;H@8Guo9TX6<|0DE^yHHxb5%9c<4 zD|V%g_4X}m;UQo@Zaumm0jL15bST2up!LYt>5Q{nsRf8%}W zSDOJ{H#PHKds$L+Ug8j~F%lnEv?XT@U~A;@@~**7Yoa?x6A_LbU9nyYm#g zz9^pqXpQ*T;r8JpRo9Iunrwr&xSBnVtjs2d;LkfLnW<}`x9u8(FUmi&!i{ z_5WPoKc*$n#YlNOc3nK70haudZD8 zU`(R4MsJnfRnRBQC&XK`;ad@lDG7`XDxflPR-uNOH6ldnlfWEu2)rn?Y?PqN{8wmL zyLa6!t=-mM*56*{5v_r4_8UFQezVlo+1~cGB#6a9OD+&iSeDHFJNXn7)7>aoUM~y{ zB77gL?@LD=?+KQPk+8LwBxA#0b7eS%&#}+R{*Cvg-LV0>(6g7I^~f`Kb}gcti(`aO z9*n3^A1s>Dxni&?w!V$;oun^04j|sHwGzXSu}(W17n@+G$r(Hb--Sk!4^s%%16*66 z>n@T1io_`jWJA=1@Biqbr|ww{_R|Jz;R^k!^`q0^E+5{Oa)VxvuZE#3!~<_^ zvwa_9T>@|&f$k3M!l7HZguDnkBs9Dm;iYBI;qQECD(5W|tY#AC?z?!Y=Aclmxjc(1 zT}M+{tP>p>Qt2a_uD-V1X|Fl;PT>E|3E=*pe+9(r{C~y(0Kjzt{23IfZDY#Z9csUS zu}Qm_b$F-~=sU)60ecL(vajWr@&fB#R~s#(O?iL5b2- zDEP&2Z-cQ|gfMtYP2T6E*NVNgzc25b8_EK|TtuMmG`2JP#Ym_%7|I_nfh2V0@XSO5&q+$sMF9>$wq$k(t~ZI+a%2Cp`S& zk9Fa-*ve;v<ddpPT+s-jyKS~@|<=2hW7ANcz-b^B>P*GsPo!w#1DdvZ0#0`%T!;OrNyV~ zPm=nJJY`!UVAQ`D!zP)A74G{Ucuba02n!)!)=gjPgAdSs*W$j6ZUDi<%EHLdtboB=sr*#|5{)efE4r&5i8_3+YP$H;T*^ z&Qdwqb(?gd_ZUZHbEDeLYiBW3xtKX>EySV~0NXP^pt~H9sc`t3QKvOvNg$>EfI2+2 zSne>AXwwE=*l16DG{5coUDB^Q0dp^~EF8y1yzq*6b1l$Yeh4xmqE~@|oWS?OALxo$ zF=%?Cw2SImoF+7W48;1%_dOuv2go)}>S%{UNg44dMNZ%N=T|j1q_rVEgRiA>in}e> zu;*sEky--b(~Cub{00Es9Sw)(x*?;F19O!>l?lmQB@Blv%zD93&B%BM0*`H5>2p+r z$tw@GG5Yr}X821T4hihQ_Qf+uI_f<{myDEN`l&DVArR=IHO0zlxpC0@9FlE_68Z+7 zSN8_Q`(igP{(2;q!EsKeDCsFvL^@sG@h0>Qd4S~rVU#Y(=B`Ydr@h1J8Ekr4cY1My zfUc$m;%Pw$MC7z=U>bN@(8(nz$Xhp#Z^@)34k~l0VdW{lEvUl^;b)`I@EO#}@+BY-!9Z7T{sT+K3?z@s+e#V@+yQgdJh7j2YA9@aukdWtx8^=0 zk9=xzhk}A6WY0=FLOv$YLR}Q1QI3G23Ea1w zUtU2oh*f|+c;D~Xtb~s|a&f_~7^WvGx&UehndSYVP(zm2=7XUW`=z^=BED1S#Oz-W7jhoX8q=~P4D9xWH_7<}oq`1rz zlTc>13&(TllJ18^O=evs$}2OVyH~BC$@4JWM0wOh2m#zkpv!ScNnkFuTTWzRi)V2p z(a1PLQlgxA${qgQ^t%XZBN9cYc2(SfoMgcv7DF8Wr|b&Ea4Yj^?x}lfE!Ugh;m80t z3h2h&^_qM08>lvF@r1*jk8(QW6MF1%l$sV{TK{C+9gfHT0Z&TNuQ6L0kd770yx1${ z2jx1bM*XJADL91)F7xG%@R#}!{r_{9LLS<9O2g^j^kKrb?sHe)N7+%Nrwo=(mQr&owd3CKE&$*U$)3wcpEK_b+Y?&`k;`zGty=4}Iut z4`|bFm)m%^?;;a@J@+{1r6WNkBQ|wjEHC{*xjN(M_!NaZoU#6!;IAf1f%6aIju34J zBX)p1!~)&;>Ce7V4Z;bi0@%2=Lcy|-QRXhnz0MkF%CC(h5HJMj%%n0W>+&G|{han#A=!24U2|Kl|g)XgCoPCh)_evaklw0Jj z!KM8a#pIb%sF%DVrFZ31Q)L{bDp-fNmr>*ok5rb5@RE>1fEy2Vf7QD|oja!%j>@F8 ztEI{F&ODl=<%EPyG=aJK58#$Nq~xe+wuG8=BsM_XUA^0YNeF*&y`Ah9Hn z1h@%6H(SqJ30qI2A0-xn;=~k$15=R0_;FDY>7roX3Of}Csy`bo<=W_UJnrHwarrIM zP$Gp7E77=`ac8ZD>99Ml6u?acy6xpn(B-FTF+D;bBPgh@25e6vhL7dGy$(d#j?M6= zo_A`=9lK^cs<8RV$;Cop-KXco?Vc)S!uw;efQ|w4b{^m+0bMZ(dA^L=itJ7Svb_>W%!N>T=B=A{&zWC zHQ@Q7G@$GM1>Ng`BPUh7Ry=4ci@i+o7v84h_zu7Rlc~{g7VRcAAN(gdkx|Zh0S!w^ zCVV&9q$vUBd3FZ{vdbwE1nrl7gD-hV2f7QD8Y>fM`%sb%gXl@x@cW_}v1lrezZ-rb z;TtnvW!kwXrj1LX!mWTv5Pc*?_0ajwejSh$HQg$ohwhoj*Z{|G89;aUZ1D!4I2bN! zXJwxFA!`~E=2R)6-Uuc)yQ#mTNP<-*XQ%+8ud9R;GqWg}2|N57{T7P-?x9*v;?iDH zu}CN&znMT+7H`nIZcf&31g2;*;@+J>SJlpU(GicM zWqV6M(Lt(-?t$+2s{R*y2f!UtQaWM1|i={O;ScPzP8_K zOu?QSf(F9NztU1`q3`MaZw{r zNJ8OmCx!b~|C(NuE&#&*7EMM3iQE^790L$K+YZyIz!53vYcsZatT;*`5hlHuPXWW} zhOG$`i_kkWDqwvm1iHDcDP|fZxpljkUSAN2IiK29!oV|4U<_3n~auDJ>x|5N=TG36G5!ptW?ev5%FYx?Iu zQ$qC3)19I1=uEdJS*N%XIy~K`=^0GRg=?-KDj>h*K-b4T`Z9p&lGir?vx8tt=;{M}a<_`W(hbRssy@iVIB&+ z$`@u_Gd?r{tu#A-+p}qh_?#pavBQ%-f2{w5W2*l+Ly}maZJdm-oIM*lZRz&ZekMrMCoti7(DK1 zeGmXUA?bk)m6nEN!QqCZ?Jnxe>d-3#oR_Nxx){rZU~e7=zWFAX(EVN~sG}~HqPj`I zweSh@f4p+Eg_N}fCvJue{M8lXE`Vp!~` z(%!%X_x++4*cwA*44r>OE!h?D{GP%r0rI`0Spw3vJT$F!S zamQYdJC6w9)&gC}edo!eO__dS=FNv>d}!U(x$-n2g}9-oS0Cic>?`plz8=CFjKe$6 zk7C1lpL#2fBcQ1oW}Qz`hj(XtK^qeT+&ZAk&?g|aDI&}fA-g7g!huj?W-G2OD2luY zdMc)y#*^e+S?ogk{aYu*U*x0Lt?`7hm;4>%%+)6uj&r;np`jCC|EwP9Qkf3YJKy4L zsC|7xoW8x1D>tIQg?RJok~OfWA@BaaZI`k{8S>LtTNTZ0?QtcqMp!<~!FV69>mqz} z+OWzA;JjP|&?PtiVOmD_l`|~Fjy!4c%Wz&x61Y~*12m2wsjW!>>u3xDXSk}{>Cv!w zRS3+hhLQ=y@cwJz5(y%eG0v;B-i%m@ATid(l{@5v?^iK8cN%SOM?yv&3jZz@*-ZWGY`zN=_S)VETg z_qstfNWC@x<8{FF&!q0Wj@X1$A>lO?ZDbGq-|QQgmv5_T`BI!BO;C+KCH<)sg_R)7 zU%QIHaX>TBm8?kvn?u}}oeB%-F?r;r-IQeVX2OBT`I$~pCdGtCU0$`cO%|-h?Op4Q z`gs=|^2?UQ8-c^j3Q2M7$|To=96-D+K(|>tn$z$y!|GtjB)qUU=5v$5#he3X%xZ9a zuo;2eXU2ejmNnA!>hXi-DX66ZlS42EYsHK~Bijw+$lbc(m&JS{1S$$bORehPw@&bmL`;@{0I>g93gM|fl zaT5f9`xWROA7{M5`OxQev%IQV+Sx7cZ{34g4#UuD44IR{0-J7!w_8`LJsU8@P>CZq zw;qV)SeK(Alhhc;KZtwpE{-z^aNB@xE@vjYRK^`GNi8F7P9#sI@N#LAErTR%JW0ha zlJ2^OZtM@trc(6^EDE{U?fzhxG;8#rGVe{Ug4xgGolPRU0Jk0Jf@;|1w3W0Rj+5HR zR;U^cD~NB(D8IRvVZC`1D;3`0JmXgjc}HIF|l3 z;QogWpey1jLziWop3{qmy?OzzFG7N&2ZK@I-Bx21WM96rQfBx`MO6;#x+Hf&rrF|< zn&gBaiwIGqi3pm+T&k87A2`0~1iI|U=%JmM2^rg6JDrIqgN*dqc7sx73LlM<_iHmE^Hx*g-8um>e0%_6n+;>sI< z{B{A|k~IY#<#7drOBx@=_wGDu@K|euZ!@tdc4`&VhC!26A6^f!bIVXVlR69#I6Ndu zGAX_3@ZRItddMF)W)y@2_9wf6?oOz}kwN@-Ol+1Kq>p$+Bh7ZzC5jS3h(_s{Jf?x; zMpH!wfkdtsh%g8_ybaQha<*TSAHSaSnk1S|*Jzq#0Ovh>fGz^r(N6HM;sKgNHYr29 z--VtnCCTcW#2Tsf;Yc;O247FR@A5C1Lk95>SAWu4(dp;R@&M2K ze+RlZb(c-vppEK)BZBRv{YB|Jl=y_MFQM*(Hc0B3I%<_I2i#Oir}O4~d!#6|^IunT zDsKc(KLw+#^{L4;nxjwx^4kk^b=2Z>MyxxH_adw?%|+%QtbW+4x}9aAKw2L6sZejD z;f7)K^B=>fE3As8D6dGD?ah=pYms8ywVNNo9ZwVi=au__Zo4=nU!6vtGB$1VjYxG= z0rGTm0M}N@8%<1T%BO|RJ>yuhQeDZmkwNoUrLL(;C5qpR`xlaZ52wVbX7OldwgB<= z16|Nk158pXLl>{YkYSmrn}3p@-mMT1E7Pc=+Q+cB^69g^jB@rO%}b<^uiaH+G~ax2 znzFIA)c=O~i|6fjv>R}}WdP`A`=7-Q#Q8`4sGvyIGi=Wl?Uw&~n03#NmS*#`gGMxg zN7ZFEegxs=FG_mf{);%gi7KeuiZLBIUZkJBvA5$RAl^Zs>#{h{h#p6nJrp?PK%gC7 z?=e708XuUm7@^x>`YZHW5bMysm_I#cogiX~0T+**?y7v7xFe3SGi{YYNZ-o=*zODg zU9|D4?4vI|#1HC6cA?3^vMGu`uv^vZZWrqI;O`Pdmtd$YzOs5|T05xsaDj(?rTx7z zT`o2Ffh569v#n2q5coa*0dxoGqqk^(K|S_Di@Q?Tyggi%Wi=F|WeezrexpdyuQz;F zp$f??Ao{^|o!4B|R9Wv(EW;@&1j(!|T)Qu|C>ppg^C!@a(ZVfuG8!oLih7vF*I=olj!+%o(Trcx5!2%|okG8_e?YEQl`{5{fM(nSM@^V-JObbsRMu5BeLopl(IoN6we(Ibg2b{KNMr$ju@H^!*3KKEm0c_ZDcYC zd4Tf@Lv@M3xSXnDg8A0EoQwg+E1u_#+o#oUO|(|6Pk?wwfo{m9)b19E4Z8L6s_TP^ z3)(kWh8US5IEn)8u{-XPF^NS8n;+b{e&1GCdC#ugmCqXdq83X{l|7ZR48@@cr<4Hh z7|^B7Gpxsmhl*`aTwN zH;Jb^reAM=81q1Nll$`62wFq0V(DPY~ussw1Qcm*LebXkE+u#OW(Bd;h32E9=@H1r3}G@F)$X zdTybuf;nG?MYxY9#sTgW(9JGh2>1{~J zih=N01+wBR-!W?R(c`G~twf!i2MsS=Jj=d%Q!>Dv2D&BDzHQiEH4BmWSD`iDeHmTv z+aDdLbKlyQjm958(j$DhI;2{FIPLIVXNUtCzQ@&A46;SGb7x!B z(vFA7bj+P>X1w;@37pt`lhLpMB|sCRV-$~u28eeK=!&93@b%w?9{;vUh0`B`!lN=r zpF4x^)vSNv5D8Swiy4|E+5 z+85yym&&VH8^np%vGdsp!!5&!eW5jq~s=nIUOc`OuQ3MlC7yI&vN{I~QZ&*vJw1l|iiiQ|}# z*gZm?S58r$EL;{8KJBEEFJ6O_%4YLWibn$HqZR?~|M^!yyh{KKR6pTa3|`5`!vX6& zd*ie*nhc@iqY$E9Z<%QcbtFv+#TU)v_si(r`c_q%@k*Sz0+XCB)t;9Q!i34#mvBsZ z;JV&2&^@1R?}aH~Hh4oDh;pYgT=(AZuX;dR+>iM zqRt0p#BC$W-Mb0Zy-15vDoM`o6?dHA$Y$=S9wJ+ClqZGDrcFXeIJG_{HBx zC%Sn4LE_|71hE9;H6w{B)QSaHt)FFf6J$j7v6wZ?&k*k|g2}PJaE_+d{{*nMy~dal9VVmHoloyc&uiu6!>UEXPon@;pM#3OMhn<=tiPpnjM@@_ui9G;aapN zN_iuO#_c95vs617n-m7iWwTn5Cu z2Xt|*sLv>~ZfxN4jYwqnthTxaB`lKlHe2R@7B> z?2dlMjSvL!gBr0k`+@agALt$oex(1-VqXa5!o=LU(U(i9c7-okHech>;6u0C8cl*4 z8X>|+QzBCS4FwAF==)e{NZcyIgzA=d5Qt5NdiLf1hnGAY09{^B0_Zn%<0wM>$dFlr zeCljChlN*8#8c`;jkuQgtHGkbcmlI&nQBqBM=cn;o5wo>p7M{5#OJ-AG_oHN7H%TJe zj$t3E>F6O0qX|`u(b1Iw`8@)<1JEcV46y713FrD z4z_o+%O7zs%iS4}u{T|UHU#ik>_#q3kp(nu>%tZf5t7S8?-bf{c`0*GsT%nLFzN;Y z@ty$P{kXd@zNBp;>Zu>Ne&>uIYZwkC*?kY19fLobhIY5D?FBVT@~^Gkd%8Cg*RhB_ z&g#`~`2j`d6a^t!QFIW9mR z&VVl18lfauW&yE!=R>EMUG-gpsoY^ORIr1U;q~U)$)6e4A9%+`jWupdR`9c?AG_19 z&P$m|I7QB>qphyZ={52I?m5ual$tIai&@QIp)g_QXpU<#Hkc9(^nqtTZho*Ec6*$@ zMcS*uEcqZDjT2%=6PUegxNw{ErF72L|MOS@GmHapU(f~6^<_%?T_A(F`c$7#cK+C2 zD&)od3NNWlMy+Q(-SDa?L2{yCiRl#%wBqDRur5~@4JPj=EzO@QyfaN>WM|Bs9e{W* zfv*1~YhYp8kawgcwXMzPLssjTO`ud4G*>=I$FR6IdTUmVnfT*g@B3UxU%%o z)R_zS9AOFV;5@dPOM)u9%!u4TLhy|99zIkwgdf%U>^ImseuOTlDx-J#5ll(IarX_- z?d^#!-)~oSSty26-MZ-_o3A%@WKr_6_-q~%)Zxi7Np7EY8bmUHe*2Zt^|Nx*mm0%R zDJC+f^bNPKeN9BQzUBIJ0c9W`%;#o#&m;$hT#*%5|ML{S1&CNV$K8C$2Bmix zY4cS)FnHqF3S!AkfOsE(?(CwimF_Q7peb*8uIti9y z-`C?6I1Y$t!oMbfEi_T2IuUn4+g-w{QngUK0r&Sk0^OClZOW_Zksq>?82od?4_R~H z&TY@~B-iw%s`qhA6g`U|9GM0zw-2_!%%DvCv&^CMIK?*80=PSLGa1H+1kSx60s~V>u zK9w^VVwT`a8KyQng;(YHl!ye>1fVWP=y=`fc!q!jeiAXHLF~{HlM;on!76` zKJBkvw-C_Gm8A+g8CRC&G2VPb6FvFy$A%*~&3HJ*`??uJqMKDjch>2=vVrO_w!x)t zfC~Y1f4hMdpu$&i_Pnk7t?=vH5^AL`U!40E8kU$K7q?Q~O+yl_7&Ox=H&Y)>dH;LU zZ(kPDg_wnRmpZw&<*vQPGypCn(2Y@EScxp+*9qqaTeC*nfAn~)g*&+)!Lz4qQRRL^ z8SiGSWJl zeh2Zq-}B`j3@D&mVhdf4bHm2p4bCHwOgSKkF(Xtw@C}c)5^dZ0EleJ2de{V=-?~JE zNshDx!|x!`NYGkF-EVG$`35N_DGJlHzwy4@GxEIV`>%l3R$;i^7Q9*}>v<6tV8{Yu!qMM!!b{1t;4&wZq>zCum6r|B7&ETW0M)+!T{Ym zzE5yUrQfL$TSh*Rw)cKtxEpC;3;IxLyka~$$$S%dmcm++aX(am=$`u<_UQj{c9&sM zeQ(_85r*#W?(Qz>E&(N^yAf&Wl928$>F!3lTj}mn8fiSgIsa#_v!A!;`^I-4?`zH4 zD>pNU^yJ1AC>UPjFqP%!lXZKY#U91l66(XfK#oL#hOYPnDD|pW5}L21;11_kD2uoy+yCCL{@>r#Ap+gV z@ErWKYB_-d|jWj!L0Dfl~;4*BSZQBaRdGXQGqVmUl9Wd$9&$y6Rj*~t|dI}^Lbiv zaXzZ8=cH2e*9WVg*`4C2{rA`SY7k$g|4LRVqqHjDD0hP#r+d64YnBFCo_H02%WPV&KYu=~N zP;$Z+zC-*OCatOHZU3+Pzx6NpU0_H+;Yb9p-%WV@iC!_BGJVEkSK@ZQ@;&+RwtpVA zvp83-T8!RVY~hEF^u!fMfBBMLviOHftnwqs)|d8$G5(r(0pMZ)-7m%(JNk$T(iV)l zCkUS}Zc`ElCsDNJz634&u_jyLy4;|BPj=NGc)_6?_Y&L~@|BR0?Qc)yu~=4iG<1{q z6u8eq-UkOiBana=6-u*YS>UpNJ5P!8h#~X%X$;+ae7VE*?Ap~8AY5jexhG7@hi53# zV$Uul5%T%&q-{PZ;fMm`H=}#3tmU!NMlKaL_~$OIGK($0)d}$yxGzr;^gXhW)TrN>@hPWD*2@F9*g$u(lR>q| zu8ltue(7CB*S1}C0q%}mTfVtQCwr-a)ff`0qxdcdRZz$Gdvuh143m6bX|Gc}R}rBsEqZUt*=JP~qK)n? zffJgm@6R<)s>$n@blra&{JxmOs@${7HUM4l-613(ShD#}j%1Sa@>L9Jy-`l3yishu z`0VcfVP56}xTjyVr3&|1@OUiYZ?f;pTr+HcaAgeLQ83FYS4iPZ9eYjy&r87X#y|ox zG)wu?QcoIqyWO|0^~e>x9YgNDWON=`B6O9Mg{8mAy0$E)IXIQt`<~&5qlI7pN_)t^ za;b-x+w(J?KVBtpp9LN(AOUS)f8nj5F};Rig%dnLTv+=hmVOF)bD~+UBc>(0doFT< z(WA{rvPKw2R;nki`kwoEj|z9pjdUE^{Jew+)H(H^1!-Rbpv&~=c{qFe!916ot2vU!s|>yyTu$;+taz(Iq1Jn&qD z5a`Zk{El~%CZ!E8OBAnz^TagRHBX*RU=r71(JL)hTR{JZAQK|`-TGN14fFAd{0FQkKuh6ePC~63zo$VxU_(`fi~3SXP}mVrF1S z%{`lmc!b|ZjNw;>@xn>K;ky#o@a?*EgsXCFgh(vWC*gaR=X5uMjpd;loxgn!HZ7h2 z7rYjR1mp*sdTPV7Qejs1D_Z$YU0N~0zq)tq^8reFd}L>S)ahMn%5_#k_b%R>2Ivz; ziX#zECWy>JIN$dt!$zH-l=%QIDbO`W`(|fai8!12VBG#LP8%mal|2^)1+8>sS3j20 z|0(lLFrK&vBISSIP{1h~X5f=_9Xk?ABEBT5+Mw!doiG_OP&gXzRC{3J(C60_Z+CW>GTY<5rm&_6)cMh>#xENQe)rw|<%= z_bnkZNm=-)U6EHj<)Q4H6Jac(h+H?6RJH*f8+kykV9OZSDDV~FQUcwi6I?kcnAj0B z|K_6WRVOLSrsP)-tFu25pDBtGlr}8mL_|zx1dus4n&Him)VDtte3c++AV!%=c~hUq z&-ShZ;DX=nf&}#1&+qytRG4>{5ka9n8e_5R!rwHeaNLu6e0aP}=5Gd0N%NSR+9Zh@ zxu|c8IQ(`lBYC-V^B{?8_D4a(?Qm;=OAT}fww(HEgh)Ij{#d}MT;;0WIu4O-VQGme zJee-Bw2y>F>#M3=(Xu4%f3%AI%~&V)%0tvH4do%e`DbK`IrT!oEyG&7fNP^jda;t3OEeI`g6W*yJxh?w=TNoqn&T( zc|zfU_w%$sH#K?By!!MUu8Zvuu7B>riY4gXF!3(w6Rr95bO%R|hWLyo29&L-uB_G7 zxzv<&ppG2UYT7~f!Db0+b`}gNaQ_A#gCGIXMp-m?+C~`~eI}E&p;r1skw|Zbnjy4D z>M4NBqzZG-JWzwwPv_-$FkH*jiR=8mt-3DkAOnusZ@v3fJIM%GFFnv@N_;B=#ZQg= z8qLAeK98&2zI~r=SEJ!Hd*)4G--EM1`Da-i?>+<737O2aZAtJWd1&m4Umo@NKMV4_F#uh=P&kRASn^y;K{tY|H_cxV*Cg1ewhZ}IUq?g9K#GCgCBuMeE5yR78`VBHk^7@iX$7 z*K5?uCoL+fKb;{xjs4h-+LgCKLmbb>@n>r*e82h|BcF2w%V2&YafCQPy-YxtZj$bH z!msoQW+ul>iGB1t5c3=j&y7GU^Kk7;TYz;0v*`Mqp?a2S*8=zhmpqpduk;F(~<;iUMn1$e<8)GhPw0$FZ zU@RVu7I89QjpSeydgL?Wl?bD+N45{UnlwR=`)`!+er6mQu{knwjCe3|@4`fOcR9x?dd5VGVRy?^kcjoqQey zD%~7cI@_fq|LQ)83H!DdNEf&_Jr!}#V5g1Wl__}Y96!KxO>+^2EBMEt@xHN4MjDjZA_&*`j{c2017WZ8tiAo}=o`R-1oX!t1uKQN( zQDrK!v^>woyJjQwo!ZPPd3>r~RxcvQJo+tiq08|Qz~utEN=w{Uf3L4U#gFv~2SDBT z-28)zK0|UByCZz%CLa@{AR#1r6i!3%WDLl~}h z{R>{BKmuyJG+6fRTH3-DjpDk0r9ZzF{!&B!g;WgloI>77(Ws^L=M=OajX>R+dGnpc zY(s2&@*l0lrNy60y&o9kbR5S6fTb?JPFoVwn&6l z&|b|(W0rOnx3UTAwlceqGBqk{pY6ldsy{}m$XB;&goXFQu5SZe0igT!TFZtdY)`ok z6zO9^V!e$`w)z+s^jz9Yg3B$S6M_-L+tewlM6sg_%hhUZiA#1UI=(g%g?4&He~}?t z6>tG?1%d8#{ukzj`RjP{x;@Df%j@c_xEULcg`FeBW8aUs@5Ru6MiabjGa^n(5BVIl zI!^7-UA%94)2LT{krmA{jyeEbpMmcjAOUf(=#MxeQBL?gqH6T|JIX|XdZ^!I z=J3c1FRxXDzBIIA5ZRmRPRE#P204kIWH1)YmLYo=u19la9P|R}75=|mxfYER5O1iA zkq|zn9lJ}KkmZ9N&a$dh9a{ap{2G0a5z4gBIY!@agI$G<;vu98mSjoSb{1LySXQ zs~93s=Hz{CHzFwAB4mrt=7sAr3i>ONV}AUDmfb;yR)!V=K)H<{=|KpH4-<vf3&qL%!;y3F-=+*l;YPiN~BoL{!PCs z`GwFP;7S7BTScnkZ#wCWLPl&ecp#@G=PNsAx?w1f+HY_A47GW;HEWF%4lkGjJO@MCR~qOJCn?=VmmTiq zuZce6k(<8K2%6XA>=LKSY#tLf2%sDM35uN{hWpc`AmVLb<)54 zOPdCsN67%)c+7Y!)KxYOd3g@wUY>w??l(9a5l0rm-UkOLDn0mrUPoP?LwReiy6xhc zPfXkeWV!dAm4~w!f(UQK|8m1+ZY zCCxR!l?S?UXzwM1wF{$slh)khVPuf8a^MW*9U7zI43uBz_WI|8a*saoVBqZ|_yjK5 zpE^h65R9(!;NeBa(!5kMtK;qgTm_(;JiTH|_}UUXr)zZLVpnV`Qp`4(%l`>EEIqkR z!YrsizWOv>RIBz4(pAOwFwyl7`RGV(-*zYRklf$f+#@2P02jPQfdm9{@y94X6fU692&*Ue1d-9EyCz$wih8JWEmE2&ct$+OTBF!`d z71^ijIiIC;ST0KvT?8WA9cFv5+64RAU6ezCOMD-L6_glG_jEuus^r8^nBXM@=qg{KCA&Y0rfr zherrm4no1`6+$w_*DcN}!w~*u@ZJjIssY_`_o1MI!gVNvf#&gqh@t{Q_F8lbSA--< ztw1_w6F>hzaRLE{sb-IXHCP9)-im%d_&Owb5*PW8md~}LaOmK<65^@@-5n^O>?&d3 zL)`aL;m5=RUm72I_V%LU>DU{8x$pfx?r6bWo*Nzgqm{$_Wt74ky>@tx%`-Y}@%^SF z3hUH14|vZ8aW#N0%l0M3L9EH_J}t4N#KnkqrcwV>F86fBd$HDAEcnUMAD#9XGM^ld zc26j@D>E$yxEkcK=HpMJ2!7Qeq1*L<*EkUO9nf8636L8Lj9Xu7$B(deW7J{OT5oqO3r&Ud3oY#nDZ9|NzI?4_kb&Y6ea!xe?*#Pd2A zV|d{(VAXvAxLQD$rt9T%6@Ds5a=^;eV|n|99;#DL?W^Oc>1F&1&qD<1C%7i4wc*Qs z5t@VcL{;pAw}p74v&9u-u#JMB{MzcW0j@UCt;N#XqQ-|c%ryxUHN7IKO1AzM;=>9ckBDfs4 zm6v4Qbs2a-+Qqd#k78&mLh!94RmK zH-#+@{U^Zv0CYjKnK~`&v-{{at>y+YmUH54?Kje+0$v3-dM|6G{TH@xniWRa+kDl+ zCt(`Wpc_n!F`+_AW%1Q(Ji@K67s~;z4$wXKTQ>8F&h}~ft+6MCeccjDxGWQ^N0F}6 zF=+MmY=1n*g+9+nc}UEA->mpT77f-7Cg(O(gi9f!$J&~kZXdY*)djklG@5GyDI(ta zg^8!M1(>6S>?`sF{t8L&p;QEe*%15`qdta2z~#OqI7(HObf*gJLO4c_LWSj zDqc_{JW*m{6?-9OizSTYpd&mCaRr(oFB*iFc`?2tXhilsV{rw}Lmz=Il)>rmR|9>l zXKs>k6>M5T98~KqKB~8{HbVD_wOZ}g(@jLOsC+i5QmgaMF-NJv2>3ROjzK}w_S{4X zF>qYqxgAn3xX(cXvQd?$+d*A6-bkZ|DzO`cee}-^gbFpaQva3EFJIU2W6z+)TMVrg z%N{XqQ6_|(NN?Sq+&Iy&{<82sfY9Iwyq1QzhCugu@kx#4=kWKIQ7l#aE!^`B@0wxe z)!o7is5bXa4*8efw@740xu|(QL7M%~6E>&@%w{SK?f%^D_=*y4L&U)M!Hs~f;(4`Z zCi8+I&bU6DY{J;L@^g&+4}lC+@(~wyk2w@#8T6`GU(Zx@C%2d3cgZ-ceEpEaWb2e&?+3UhKo|e08B_sV>DL}n1p8T;0eu{Ke1xo7 z8N2UiV9b-?5sN1hw3O#}va;vr9ylt6ABaL33n8B#O1h^VEup(_*?{ANDbT&zE3?QT zd6Ogobp@iBGh1sHC8sQC*8Mm+*?~o-V;a88p-F#DIe{{iM4}Q=_Sm>5e$h68uoa&q zNBd{tj&cl8uNlyVYj^UQ0j)2xSF~Ad;yPvuj7292Hb&cHN+Q*`F(gdlzcUn6TpvuX z&@MZCDQ**p#<&i3OtD07aa8jdFINJd6PN>C_&^z}@*ir}+hIx+@pX7>&Q3aC`}L>n zbEGNkkX`?fgn z&TXE^!!s1sq>yOn(k^rMv$wjlZY|+tcqRyFN#*HiY6G{#wNAcE=v#`<0fsCZ%?WdC zGo4@iz|StE|5^fFn~r~_hisw`{2JJs=z{5*@5VBIi^PjJW(A%z)#u@LQu#&ryN71E zq7jx4#$8C+;gpe{Hjo#`ju-qLc{lWD6X03_-9G2P=4wR`)P1ifSaY`<*mJi}%52tS zk;%_5P=gGcefA@bfx46*Nl7)T*_v5Xc~`DZ7vSz<40n1FjQiq<2?4G(&~2VdiTYEx z!9!incGDk6%ilAYBVCKU%an=9?fMoO-Zs@D)WhiSEh7JxNL>WaaDYC(ny(tHux{nr zJh`=VEVyq$+QA0shUihz(d?gk9X=|tk{CODflXj?MJ}PcJxur-y2YF7@7VpbE8CQz zM9-sbCH9k?|6rY)Rs-6O-xPKE7n!y#G=OUhbmQCg6euH9tlpX>#A@%NF}hZWtvn<5 zbo6~ya2O{&)S1mOekIK8G?TH`%sbf6Vb|+I2!2sv+K*>^-Q6!v1Fxka_1Xblq2j5; z43NYY;ibjG=(6LDi`n#iva2M!tr_$uuj(>cYE^~d*Re{yd-aWb4hAiaU*2Y&Gm27v zhxTa%6SiS402jRXgajn`Z}ulr*|i4+*|$x~pjFW5M(hu*7g||?-_`JL+ITN2($mxO znn;WGzKr^&W?Z%zZi2d`7sSmyw)bhuCFbA!U?swEaF zd$!7W_Fdt%63o#usGkgCwXgbmx6DPK&ZsT#L3EhByoOy>kN)&iGQKU9Ccu6M9@`)R z#r|7|)vved)9-Ss>dO7^FW&flbA%*@BD?Q(BSs0!XWY-#FX3Q^!h{Fjg+ak49?%|MchMyVeM8^)TC9^>B zn{95Y!+vM(uf^{dQ)RP}2PFs_AvXly7fzu%Fh-I~0qx)nbg8GYO_H;2J<~{W1pavl zRtszf$#1jMHm7Wdhi-?+G^igP2#<@N#iH5JFKtxN_0kb0$z(i z+V>OCWjBJc&cs(x;CqTL`!O2TkT$AjZHp%%y(8MxbDZa(SZQUgbZ%y^q56D)u3?D8 z-yo|JsOz~b@U_I895rpZ8oPL zo~;8-`0x9$AN$fL^z6wB1-9p(WTJB!RR=32-rm%FvY`zD)C=BoK>~uSnoDPL!EsOd z_8>y}&*gIkJNK~Q@r)M;`TaKB#R2Efe%QrNTu0KQj3^o2T3z^4+8GG0i`5cZ(nECU zO338^*A?g%%5h;hkX@KvtA&S=rO6AClF;n?_%Z)B!Z(npfEV#NvUt(`LbU0L+SG5R zhq10fqLyp;VMNg^U82OpGZm_`~ zM(;3`^|cy4ls|r!&z<;_()!vHn~o|*NK~DNwo2HC`We6W6yUl8-JZ%g86-1$C4`cy zkSaO@qLB$&JED>dOg;v=u(Pn=$*TXBM&OIMysuuHzQmNbZC#144SZi1wczNYIgOW|l65j02|B-Y>*|?nHIat_!l#-! zLNUgeUJgWi-JMpABOy$~RPY%Tq@Q^LT~3Cj$-!s=RI;8o$J0`rMS)IzX!WtID#Shx z-jNNbF}O&vvto#+i|D4%c;VLo7SQ`FAEEM*!Cg=+?8%=)^RrkF_1w zVd4GFYqp2xD#%6N{*MKNnBW1mdo|!Ox9@l-awep{}yTmStPhi z1rgwS1KllwM{XxX_!B7dQP_B{Uxf$Fu`r1v+9_-lIsSz;5`>4An7;HtF~`l2}pQ)$n~59HJw8(hL>Mi4J}1r zHSg?MDvHNWV>djjy-|~(kMWHSKub^zpC{85=wIk%;@}vsf#*>^K=<|I(07@rfBl=( zZ!JN)vwhhl|K6w=X&I>Z-F>T>{Y3HhR-De9U%j~a4bx1h^5KjV%!!UvSxiwko_qag zHSfQGdVPWJ&_}lss%F8-w_^Q^C|yzRnrf$~)fZdA?%06}T7S=fiYxu@*!y#XY~hGL z@V5ZoPz1x`_uVvpjO)(wc%bjKKfv_^x}xD%I6GrfYi++XXO5wdE@vqCDmcFO^Gf&W zxWPNBRqE?9AZ-@@vwC_hnHKpz)%C5PTxoFq!Z3V6TAX_J7ZJb({~wTm>WG^XQqk_H z{+MAXc9;D0CRdz{=MZ*H9QBn`JA<|s={xe)Bn+1ix#EtUKVwuKGZvw@Ir0kauZ?9@ zZ_Vlz0k{D`muFgBeEH6hcbhW(HmTJdHxF8QA5+3}A=K~<%#D@MKhAEXs`5Deo8Z=T z98M)tjg%PH3jT5@CA5@|3}M#wc7PiQbPZnUbI10Lfc0i`v4k(V$1VLF_=ry$aQ%4{|qY#^fE8A}7ga#L;4?)?K3}ZTE!=J z2JQ>PfbQ*AHd?JIkigbWQ|YQJR@d=_lB<>}kmGYL3S*95 zXd}8zeP|~5uhmsrHpR(O_fo1F;DYB+NI*EhZU$VNK3~N0kC&A-z=}`4wj1gME>-%_ z?^#Vnd^LNQ;a&R-?LC|!T>vYoqCc0}`oa~dp*gLe#$PnFH38nULFS<-pv#M3eXH83 zYzES-dNGwb)Ee|4kdRStE4Hz+=+F?Y5DE9Z{#qYWVhb9Q7rwP*he7!1?YO3@utYZ= zFCI4J3|yCh_i~Vcx|Avk9vnZgxgsj)O&q1hJ+{u|*ASX#XPgpk8r*Or&CW|%@j(Zq zi23ws=A3HJkrHY71W_LM@=WH^O%(svT>oFa(Lk41;#n@Z9Z$-Kq>v$&Zz%ZHhEJGW zRZuy7`(rBgrfAXPyXMnb@*yp~zMbGb5TqSqfbMn? zLepve(2Q2-2UE!sn2>za7WnnQM5Xe41WVsPMA#YUoBG08SAN;a#kknfa?7DTal)Ta z5Z-)wFdlKCh6V07V}b4j_GX6=!Zk@?6KU+RIrXXQ=PTBp^a~=Ij%ecH_jOOxUq)58 z^J0zLp3j#<0=(AEeLqXt;-@*G{W58oEGGniR*-t*fNmU|Xed{8GPhypWJxmdCn$$d zDQ9;8~htHbi9G?Ks*^lluDK23=T1`KGXR9yk zQhJeZ;4qa~+v*-!17b$v;ufO2zgsJ=v3j`zv;%mofCPj<^QI?({bS$Q;QOiTKDPME zQS^n@cywLSt`?Zz#CqjH1DN6-fIg z0bL@Q<-<9nabkp?UkiAi2RM=<@fjLC0Y(F*=RY?~;$UN2UWo|v@i-<0GNU*H=HJJ6 zxO4uh!FCCKzFXY+^nd-{crwtfSncMd8`TPOlQi{w((iVb{*ch>NKqSz)~5x6ZQ{5T zs@0>nr`Gd+HD7{Ca zGb)pOH=cI5gQ;*df+#!9C10sT%+!CiK=gI4GQkG1HQ%-mPMb+~v%poJEi2Ct*w0dd zZX}!yLXq#i+Qd}5?QvL^8xK#JKvd?GF?yjtRa-sU4J=G3y{3m(uvcf}z`s+@A6>e5 z3TnxN`&>j3Da&L7t3P6OYe`%4Vv7b5=vJ|H! zYPZM6=w0QvBb5U92~g@X_6Uyx27Ov%kVA-iPQhoskk2h0=oXzO`^myXo41YD*Xa(Q zT30WCuy5#3_I%}tNfH#L!YkI_;_yO?nT0w$KPF7r=A{IA34bs@-*4dg!Qo7k3hWOV zK$kj{GJRm_Bhgxm%4t6j{(S6C8RBPcxY$AKzL;aZr!(nv+b&~cyW!$hqB2LqNu$|M z)CJWEz0&fdX4sAD{UUVuIq})cz5kDmQ|VTV-U(PKj_GYg^7oKbmMVneD{~0I|uHh z)TEKlKq`sx_-sZWcs`i}bW1Zn8?&{>m)uO@04TY&AQ29mSJEJg6w{WRbQj_KH3%U#_lq_li9b4f~8 z0$X)Y6f0j_=+3*?-q%#%gP2SleY&{XMb&;>fW&Y%*Q=p?N*b~9&C6&^)y4`3xSq@d zy2kRysYRok`I=0|uklz4x>2X3`|O!n-)*GZ25Q>#|NANX%MFYv@oX<$(esoJ1^Yl; z65h0;h+va{Y$vyq^~ZpE^MP)35Gj0fM+}bU54yYa(ciJmqhGZOo_GyfbE+%*|NBJ@ z%ov5QR_9LKCO3cF!{Lo{DzT93V^PVTqwzddaRYWS;`EN z%!F27AEcuU^T&ONJzckfo^)vC$|;S?`hI4uI5O52O7w!>IbpBg2Wu=t_}m8 zI4Z<6ToaZ$mc>ZtA~R`0+Rg_Z1gc3TKa89U>_v4g#=!5CK-?mr`#JB4@~yq)<_e!{ zFUi2>{l3W~`RHd{oWPqkij)+Yvxbn<;(7lvp6}^RxgEX@C3~^H1{w|-ZHr9*xJW)R z1MiQ)V=*Kkt->E9bEJ*|vdd@%g)0O^ajOw&m_M9}`EV%MJ z_F$>{pjmgJqLZUq*fehZ<7EA$5m0Xl(Cshi^Eus73897^S7l`3Izoq~lIHpyP!puL zjAt0wA87drRd?5c{M{VoU=g9^h{hKg$%+VeH0mA0hUGWs48YF~e3k|Y=*70OhMvRI zB-d#bYob>Gse{dqVH7{l(Ub5y(+6TNRolh>{6V7g&N54X)IZ;akq#I?ExRFhM}6ilwO=qDO3aoT0sW@}3^%q{*DX(3*_7K1hFpUyfhacW&xtI;E(8N+lM;IkKqTLE+j zvmEmR3k9S zovMX0eyCCWD}fRCZWrQK0$u4p)ZSrfP^7l71V$g28o!Uc$(L-|4n!RM=<;np&5}A& zsH&bb2PIp3!kiYy+uM5LOU|n5>&>faGOyd@q23I@tpd9IOQn+}nLQvrcYm3JO>^p+ zi@%R7D+%!ws5!qb!!+{ z8&jmYARCy#3*;S*n)LwO8lamOB|!553SEeBcG_*9oZs-OnN0tEdzMO_8$w$q*-9(T zpC4Z)h0F)bQ^S2J?-)%s^{Rqm|6CDyHb!REjtzj%z9H>f3v@lUIV)7}`&sc%k>|qD z_tKLc;!FKj$0yqJs@kI0MwdibWmRd2^`Rpqze}1X)-!_}??-UMHho%)w zqduPsgRT0XpIEg2Fw!!cqIbZ13W!?|bTvCADC_6Ee?|{>W%6@gp}|OP1cl{&JxK5# zc<&9;3`|m-ZnQnZ5r}v}2@O;K6QVL8<36C3WADp^{qyE%6?k6K0CWY%Gl!$&YA2E# zW>6JPY-Am<9*HycbdE(@r=sRzs~73D(oVIKuBEc=`Q_Szzjj6q5S|?fZwj%nSrf3g z5dz0E@E8OM=m?G7)%vNlPy^pEiL$?w40D&!p`)3Y(`2Ok;K!LZA*nMajevaG#V&dW zy^>J~ykfmA!ROJ58|PlF6Z>Wb;JDrdbWizYldj8in^vD3mEU~I{FP?hmDfhbXLe-& zdurb49z4_>Q?R< zUG0j^{{(PbfNpBlB>vhD=SJ0v=W<5ZsHT3hFVwl&G_*bgMHBk|%w0#6dCw@8ak?AJ zo1rfR_mQQqb`A_aTV9^_$4V{&3E*cJQg18JrF!GFH)~1jPkL)xbTdhhmColCc81>D zdOj(`AG?W%g8h;3`AB%*JTqR0Rdh>IL^XNI=~|1ee(HC0IRJZ)i-u59Y{*w~^q2}N?EoC$JGx!KV*(t}tR5r-_MBPbYA>tnUnirz2AW#-cLos)j(V+el$ZYR*q>-cSb zjSYLWmte9T{USOjKy$7eQ^E9aS51WpN1j~`!M~PL`<8_c*M8Vvs5PaWcZ2W8GM=ru zXwv(=Jl1UBc}W-0rLl%hErAc7ZN~Z1no21@WukJCj|E3#cO8z5>`a!!3fH1Lmbp`> zQ|lO7Gb=iHNzVZHksgIRfGa_gV<_?&I3I)0#32E_kn<(GOsD56*hnO3%vHf2;MOy4+Qk@SY? z)Eqcp;N3pPfZG((A9{f9HX+W962ftYMAw;7-5xE$JRZYPlXSz({PJ!#64}o-1D|he zwU!SdZ0~0TJ369U80}a3^o|{Qd#jv7eypub0^DApD>q<}+k16x8u{s9i;ej?8XhCw z8<}G}>_=w!;sa0WDSf$AgOrx*e_zOpjQcH#7?$%GFQ$q^_E5fe+y1OCaS!130bPpJ z_pps?oM^!?@}ztO{_sfSaXfxdylqTfdX`q6iOwVVB@LX0m`ig|>7pXN&>o|bohwUn zdd5FgU4HZ>qEGev|iV@!CXE97~Ti2BuvsyoL z^@-iToASpBdam2SX*>ywr+@Uq{>a(iE~i5P?f}qz<1zWFQQAbq(UCvttc37}NjTnO zdCwiM>$+HeF1S`PXzQRdRLI9x>%dMt^bbcfyBfc|{)5bnUzy5$gDxR>jRX1I27zuk z@~?vB##LREO^+bg#S4nffB4=1D4_Zkr+lJzVXRL=t8|tN7kX?BP?_t_s)$oq+GQ4~ z7SG@osyTPPW7F^eE_ja!2?%GN30hDQ%2=3SQZSJPbhpykM?EZ>Q87i-((7t$S2&BF z$CJqOy!ZD8hVP9whei?8*f`T8_j=lK+Z?Q(I|$$o16|{u4O4{1jv8SYR#NDiW1Oq% zNTGd30TyfWUvKy>k){VHQzyb55&YBt`^vY2bjOK^P}oatr^gevb$;&7_Q_p7Zxk1pr!d|Cj0 zUsIme`&2zaCq3LsFl)Tti{1-w9P4ITmdLb&@84D& z`z~C@m9i)PaZ=PzndMx(>T^N+d4FMxrnwWzIEf%ukQ9kR!&{k^OO?p?7C2u_0bRj` zQJ62UhMH3K&D=aUT75rg&ro=49%io$nePf=CMl#e2SW-69+6cOe!!*54U|odOl^#{ zG4wy5!Y%|in(YAEVH)Tn4l|*cK3dj!JWIT{I6P-`oaqM{3~Brl?$-ttYCEsA_eE5Q z2%o@Le*8-hg*40ak(B87)sccARPfNud+DiFfD7IeKmtnlB(;&-I0zPNGOhQ@ng4np zcNb_EH_Eke+R)2gj03eJGw}Uj`|9P-YMz9ln`h$ljqDVZW%-phbD(#!Bo-3Dodvot zrz&J+mv`kR<2QxW60^v;B85?7b6dbgtauG-%ub-`zmQGjQL41oXkZq{=^O-xFlrL;vu^!xS~=CyJ=mXBeg(DKKb+k10i&L^705yS+Ttv7MU_Y0SDmz z0=i_}hXc-Ew%+Hk(vv-1xaWR)!pUw)Vw2jM49)VCb7!t0tRZXE`;BiSxjl zlA}|MVyz!sR(Top3!nkG^FTMT8rg~NX|yNdqifVOu7Q)iJ%iaqSC|n(Kx(Hj!evey z;(pvDCz4Va9bwx^|Gua+@wlk)o8z~|eex`*oGH`*cLC@oJa0#JoG|k5eU)0){1d!% zMVpFRpHZOL&Py_KO?n&i!1qcoS{GsQ*<@&hRHFDVoQ;&rx=!{DbkH_CS@(P$z+D8o z7Hn@yBL7)_EkE5=qDy?8%{rJ%^64X%6@B@DjTJ?MK{8=RugE&mVu%(#lhDjV&0VOq z5JCOcye>di<#J1h3E(aPUA>#-q*y&CX@Vv``qsX!{3c{QA{tp?$v+D(Y>T))xnJvj zD)vu=EPuXjak*LzT~_G*=B=4UwA_)*c(dtSB?@qtfiB)JwngdpLB9RBszi4D&J-&3 zQ)!mUNz!PA1_GR?j?I>7W8rhxl%DL5JZhu!Q5&}6@DIm&58v=qh1x`Hs)6(I3eZKO zQs^3Rph8)3bxt!vTQ60Z;3e25OxIynRgV2xpRkgAwXb>k->;r(2L54n?7`$`5>0;! z1<3}m_LLAOIf=Ic>tZ6w-Wb_=*JsIQAIVuZq*MP2-c!q^};YFR$)HkUoqTR2d zMsb0iCe=}05rpOQ7zByS(GgyoOp-Rrc;zu0)XLsRd9q$aVj1evaRWID+0Xm{cOB?T ze}5)XRxS?X++je8&?LC_QaP3jS1z!CMX!<8a6B?9OZz}*14AK(q(j$x+GZu9SYB*?!U9QRV#<}zj|KMj32rTKp4PWe7k z5HT!$T-d{yc&Uk4^`RUtrBW^U!sqvFven%ga30zOx~X+eK5zD2?21Z8nI9f(B+`@n zRy(q9w0|!+#{6^@%E!8pycho3SYA0k!_gLieEAah}mcW#59swmMmFap!iF-H;zFLas=S6<38fI~a z+bgq$<>@%brLhZuyA5>j!WCyceJUU0Qtdx{{`A|L2<>B$`^>m8OxDf@@frhiz zTB5c%9r_hXDbg;r8g`e;7t*2H@LQaZQH>vf&l`A7f&^sX3`354&?WANNMd4$=FO79 zj(u>T_X!XF2QvKRyoHb*qhJPd5_$Fh(PxsMR;EQW+|Eo}21(&&?0p+%1G$%gdckWd zNI-Jz&Pa2F2NLCR|9!=J-ZPVkjJficE9Attg2x8d(f=J7Om)6xzVE~?mn4BERA~;u zwL(MsyWu?k-KTo--E$Q9Y!))E?*Uy54=#!e^(~yRl>6SrGC?LN#MRpHT6giKI7>tv z!@^juzm5EyMclf+WAD}VwpAxaefdb|&1S0m)-3}!ggbBn?mp0Un)u4^#r>BZ)OFyB;EQhok^-~JCf#4L||HfCJa#W+93;^BD5bziG{q>XrD z4R8;DE>yXmsm9^e29|ciS7i3g!=1>W8_(_zn5)0%RjqM!nZiDKKNAFDYS;>+6o1ii zG$!&*dR|>j6Lm&0S?}uQ=m6Y9po?$u9Q^avs3S-;5o&GF=nfvc{9|-UJtcWYEJ8HZ z6kZHv=!*W_!)B%|jCXM~$uarC@@Jv)GhD?%9#3AIvqyk?1a$H4(v?@k`c+AW)Twkk zcTRbF*dI*1@lqUwjZ=0^b}vQugue9(=G(cX^S=+!K_|fpmzx;U>TIb=MAIl&t5N{C z;JXY+K!Jr$Z`giXO@Dc9(z8;SXhf;wXZTUHuxpQk^IeOPzYDJ1%}9v$*h>b55yNuQ zJwd8xUByp)&Q55hEAkOj2z-|Z=?~y%8WIq%ht6jYrJ9&yI7KalFN#XgXc8{-xx>0x zziS->VrXNJYEe0GsrD5rnb!(^%3P#J{n~N+qm}(ZRN9Wr%Jsl`{uJn9C-fUNRg_FA zMjGmeX5OEOQwts(F;y#YS)y#f%DS3759q1sx}nsr>;GZZP%``W{;xr;olLiS7apg zR}XYI+{|?|a+H#w-CF3s=wHd{`837uSK^(kgNBK;Z0-+2zAA=$W|jloGoU*xtyu_$qp2>+LG#|Ot*N0U_*$R&z(Sdbm_H9ENRj@mRicK^>@9m<-b$)T zs30(A8eNe7o&&MUcBtVsV!Z!b2g6GtpkDBp2?n!yHH6mK2d>d_kti}!a6_p*Urn`zf7hW1uM(h}7G7d*B>0zzWR z5ysSfPI2K+Z=C+QX@rJ_faR^k!2L_e;wMsJ3dR6|vDz=2-x?aob2%+xfla<6cRoHP zhU_ZFXY@Kdui(27NPhsovj7Q5YiMGycEcNk^ZV(0TCa~9Y|>Y>+sBB}_k@^68UZq_ z7cxZySSWqYq^^NHL=$Ix&581(HJsGcpDrIPer>A(>%9iLWUVa2C(PyF@^Y+Y?2Er* zm+;*c_>pp87=Dw+FGX!nQq3@lkp0%+)m#=F=QjqfUtH;$M>Vb^mMmTB7Z%cOYlnI{83 zu!Ad5g1@xHLcjTqMd~4hJZk78j>P!*&=u3<*hmZP4}XE~*85pk*jER7%fbL0yuC)9 zrP%3yW4z6ZO95kEo1$tS>J}|w3v$0n!H-{@1n zEzHCc$)^dv7I=`8#q}g4Go-Z=>Sh)Qrdbir@T~&U;ngYcVU#50{><5)o5}m;TR!^oM((i+0I%nCyWP_g>qfCl~H~!o3%t#Iv5r<;v+tCTI{q{zB?4BN&ZI(lzfwK+xj|;JX`0 zz2Lb663|MYEG=IuMOgeI8Wk)+bHiljA95$XJ^ytlX}bX}f(8UBDJ!ECjAgo`LSLjMdec{1bA-ud{?R z#8n#v5pe=fp4rvk-^2M#@R+Cvwy|Q0^>IL6*LISc5dcY?;u!GgxR3S<=w!%=Q;(O#RmA+(a7jfkW=&YQ8_+^Ut98>2;%lx- z6}_rM5bZin{E<_u8=#9)V8kvHJ5+7unsMdFwP< z{=_?kIB;Hz2gC~vy4`NLISKE+`_(6M!dON{LXKJZe$z5I$l)cr>qqd_)GyaRM~hjg z>Y^^=ge~(`UzK_z%B*t9@VUueHm6ib=znL%|Ft(5&^5{Ark_Yc{boAK2s0;+TF7>D zE^AoooMFl zRo<5dZrKY59Lb?6l&pl*_$uO@9Ts{YXs0MmWPdC{?CfFa)c(B6WJkiGI{rq^yC1(U zM^#bE?7|l!=ZXOr4s;d8W$RY3l+fWXhmBe(;?J}jsTqE9jO;AsKC%%~F~aNsk5aQ)v{`ClI3LD#dc(nnpuR^-U}C@@GuMG0G) zPZ(hl=A$su$`&E^XJ#7BATwn1)st>#%BYk~nK|6VOP0obr{wQ;u3!BvE5Ln%H=t|I zC20THHo-CY7%f^2E0A4-_32Z(fB;&PfP#gI)ArPN`Q>*(n#nUL-?xZr$wSCRKU~*4 zdrT3gGUt#@l%>T0@gjh3{T)x6;hL%5nRd2wKYIW4pTaOTQ_OGIkl%P^?8V-YSgOQK z2DhW}!=VXp$5Z!2+AB4ob6W5PHz_lgsd?f3?@Z{wJRpMZrfAC_42vs%zH`?lZp8ZM z6K=W$E61~Ho#ujZG;wfu zk<=^ms~-~kseM@XIt(^&xqGxnt9ibkHr-c=m!{~l&i@rAFJCU1x2={HaM3~c%w=LA z;MizYa^I9?NZK)jkM(aKI%j`AN~dQ1m}fEK?=_R7!_l89>w~alHi(%o1!~`Lzw<;% zqu<#4V7+RV23!o#wRn+Qs&-hxo9$|F60+1}5QQ2*DSASqVrQcq&2Am+Fy-M?XH zPLLG4?o%W3Y_tId1d_M|Q&x_Gt?-8>>KT2{#6dHOkAz_#on$razxTrlGA5x3m!|%E zJn{**WbgLt`TzE2|8ucH7t0#{7YRGfQt5B)owJ3q1hrMt_lUQ2-i}V$zhE#-cD70i z+8$5n88){=qv`W@)(=&pCakqYW0bnPb`&ZM^Z^$Kbmw~}K0CkI^p$cz0D2!8jJRXRQ&G@;J-ZJfi6u*U^bhG2rh2F7?LKA_-_jMbjQweSZO#^(Mk)vIP*8* zZ;I{|<#C>l6Gb1fJ6y-O9C>$YX1NU|&auo|82>ky{?Ek+T?^5~h`L>6U5F?aMum`N zYA@$|XqVwlX_&*JT$L_CpC9$q7;zKMW28@=nYyM+)Z=`kCRmk$ZgEGrzwZ6)!TnSM z(4E0hzax$RZpKcEtAkUdWMJ9uS?;Uz^VT_7U~IENZggnf_2CkivZhWdy<9^>s9)&97$@~V^+=f(kfcn7*z?}wYvUW0u^BgqCLlO}tY z!-P)R5se2Dr(920@CLWMI_e!7{B=6suu#}br$BOL;3cyA!!qqcpkEUXn|_{f+&_3UNOpjYhgUhVGBfQ1+J@|89GsiS21&$h=Jo zDIK+j*qTbj#l0mcz$FIV=|Z6s#j7H$xcFA(_3URH+DlMdg>rGP7jrt)> zv}4QV*g39eWhM1}uB$;g!fE^$L2C(*HX66))obUKsh8ogKfbfd7eQoHrMt#OGG_O7 zeQVWE5i7pf;JF?d=n8yd4C89fvXC7*nL%})Lb_^rRI28AD+jgvH&Z6D{jVSgM3T+k zfY^?di;8dcj>T~q!Jxrh+flt8g5bq&6f=Lz_KTnVZwbYU=`ZR?iSW4=(alH_~-gzfEx z@O;Nca(P*Ql5BQC+D~_lP+n3iwq=B#(SAh;xRjt@Bb~tc!)?_Y=~Ab( z+O$WL$kCy_1>FC=-SOWC#vs$abT{byS~L7w|CVhgwP|m`3StS@+AMu1hwbL%ww+7U$Fm92TX#FbdfmPhtdLj+1)R)_7E^4x(o3@)(@)_|8ElI&E~|En?j z&!q)j#)u(16dYgZt5}#yeq06dyIrGS*jmK zlZ@K=6(`utLA6~iG6{YE!gpL+g>XEncH!`Yr`B+bE;AN(tzqlhz>P!c?`CoGA;4t- z-8r;xuqq~UPwthgd_F#Yz85H{67=-4u+03bv8!9o`P|z4QNw7cM(pQ;GsUrz0xGgF zx*D%n4~RZzN!QFWVE@Yqy7?8VSi{JDUr3h^tdg*J4q{1kDTUe%`V!K*KZvZ#R}~r+ z+c+GmN2=j=7!2F0WDMT1ARsRje&;uFwpyU=>IdRw0^L#={cQ}dmwq#CilkeFGP%#J zYmM@6d8vt^9#x7U<;SCPl-x033+CUwurM3qoI|#5%=M;^itY<7JfE>QELR zXVcVE7#?As?pce+$MaBJk-04jKN@|u@0tbY53HcucSjC47tYZkJdb~x+n=Dq6!X?yI*1cR}1uCyd0pb&~%?EL_HHB3Zr3R*29`q z1`o-=&0ItNe#P9> zg6?m~uZQMm2+;hicvM8N8z`n{0X(zH91TTSeU7=B&5>WBa5w9DswQ9d70eF@LZ zOjBU^U842=9YV4Ki5qifzGIM~8f&;#w~SeX2BjSkFE{A2aWT-iwehzFH<(KfS|RD; zhLvxKQ9mbVdNIeAY=@oa`fJBmOmysQxx7X!#XsF{Y+-cbs_EBYA5U}F!Z(8J03OhV z`$;T2N+8Os`T@6;6^hap2!0wtDxrqv2>TMnE3;K)1Knr^sm_B^j@hrHDY{B&M}y zS99IL(XqZ$DEl#(ZBooTcYTr~-4d%*0ROgyAXhK=0LmOq?W=KlyFHp}>?YvygKl29 z+D0eb#Yp3DIM6K34rcuakJAA(%B!T3B@*oJhv$8zo zoAWgXTir*CGe@p5p4-yS@oz60m|m=3a&w*~ETUVB;Cnd_^^AH+-*3M?bFG}-Ru`^- zDaVqO@xg&{16(1{Jtozk40}o7;I|7*r@-G@6N zPgHS;{IH{-9LK@iZuJ2Oo{U+XmQ7;1|DEmr*FOk@E`8+uC~vPP(&|kqADm>2xtRZk zd%f{V5RQ~3+=Whn6okXPUUBFFiuHxn?}X3T)3q<+g5n3Ldfd0xg%xd^NPsH>x*7K@ zPKE4Z&WR^t@WLfk4Vp^~4`(F5PExgg+*gYG{PEf8B513?m{NSsD<3Iabcn7)e>}Y4tc$8TA=1 z4Lnm06GAq3?ch2<0(1wwwotlOIWWG#bE{L5FIxI4tC8&Y475q1K%A@nxR)4$IFFQm zUH`!DSR}VqzOVi${74l|)I$nUkV3So^@$#cR}yrOnJw|nORCuAF)BsN)<%1=n%cz5 zJr&}pOJ5plmp^bcEZary{*)fd`+X34-9$ptbg(`oQFef7N+f3U;b6uWaHT-EJ+o$> z7A|3P;r9w0hofba`{Fm@!YL%xU&5RxYJ#7VR~K>h{v!LVEaV+U&-V7`3VW{iHBO`` ziVe51ce!tm1FkgaN^41^2b=z(>YI7kd$)#=RuRv5a9Wybk{s{p#b>Gh)#io`hM zb$>tCOm4glYOT~9>5MbB{m>}r`6$o87S2LD=}tC>30rufw;`U}703PQy{r*6%^SRN z$FbC(fU5|)gFhfu{F2`nKcD|<9yUgHI^;a@e5BB?HdSEVu2#T>+YpucY#EtI^u1b$ zP2d^!*r2i+3Io)*O*_!dFTMx!UHLKqyZt z3C|UK4`QPqkFuu3i zVgOtf&@FR$*FcRMNAD|BMWOG@8H(y5hKJc77uH<>OH+`v%OSxa#75^s7HhCI6nTCh z{>s~rUw~9RnS2DJY~y3+_>m53{KZGLb99G_^S=)>|S6dQNwNvEVqb2D&uCf4reLh+sr-_V(He zSx(XC`VnIm7pC(f-MHZG{^;WtC?L`aR<-?UJ=fMgE&U;7+^$p?A4u+wUVE8H@g1z! zPzPPul1;vC)~O$Vi=$h7>ls5{P9OM8O*^f&@2y+>1ZdlO!v>VAD!B)b65J!MbBl8g zHcxQHN{blycy??`k`x=^{tKuH9QWGqb%Gva%h0s0M z^?NN|eVFREU&sq}jnV+HQYk8yC%3*|B)LiWV$Xy_I0piZtCG5@;2}!TF9B z=n^&-?=pqH2x8#>jX~7KRczZ74#ir%tI@Y(+#u(N-S5K2Mh{ePT~6Gy$g=0E%3V_P z6bvKt|FXm|Uyt#fh!MzxHt0%Dw&RMuE=c7hXSkY?J-5C)kBr~t#IL7-@vq!&S3i+1 z$q9eL#Q(T8?a=XicLWN$9LE0%*&^0LF~Un{*p3EpbwJmv9aryic+{|Y3WrCUDl*vJ zq;>SEmWjMo5<-F*=C~)cimif=jCV!jUBSJ}Lq)%(p-bjfx=mqla-ujthG+rc>Vobz zysze$&%)DQ%7wvL8v13**xg(5d`JQu)jRL1s@+Cr*>JtRx)dr9G`k{z(R{n$(-USowx zQ$|8G35guVkSyAyOLcSW+hc-GsVa2iQP-@1c=bUyvOu8!x9Xr*N!1<&h=z2uwb5iM{A`nnp5ld`X$C4Gn)s^x&$z{$TK)Jw;cqzQ5_(pOz zE4<^5I2MW}b7`NLT54G!jjS(%Act7)AO-SZ1iGhJVX1b`^}^6j66vFtv37a^qf+f2 zg>YNeRW^UB_N7Q3M%1$(tLLQ>r{5=daEaaMhsr_2J1)N{kmRsEWP;fdPDP84M;DSWOW;)11O5u9wd zV#w_rFJYld19_ajtM6PY`g9HAb@PBcn1U`DWv1J(U3a)-AXLfz51V&Riaj?DW08~E zx6+{mE_|O}!V58DkP3@;x$IX=pg%yY5|g}VZ{^bYv$=+G*I5bHE1QAtZsnT}GvhMq z;*0dff`7mFEbBdFGp_UPY~TLIASn~q#Cgj%j_QJqj+1yja&t)<9-Qhl@aQkQ#fdkl zgyrXv1;lF(y5d!uxTBI8%=|INPr=1ZFNOmq_!=I6*VErC{C%F|n|d8qhdH;}>Si5* zN>Gz{`89O=gxp&%2ccz5ahr4LKMc4Qpo`4i!zo=zXb-heS}#;v`Gr59a{G~lVZ7w& zZ%V`W*n#)e_7eqbkc(EZ@UONvf#@BMr||HX7gHymVf^CaZvU&H{cjy$3A!jrqxSPW zdbBnJ*~OxV8wlfgx|D(ce#0?sOEZf&Pg>8s&t7%65%DPgQ4lK_)wb`ADCx|BAmLFh z><8$BU=wiv*9vs|=aDPy5eD28zlXR<=ahdibnc2^7HXaAirp%!y~e=WUThYFL2H`& zrRHwe7%LQt6&)iJ>g=6<96){}rWoo7#B2S3+;dB6ms+gu&!6>VQvc@25`@n0e2j2g zA@6=q@SlUqbFY6tpYYK#W(6U4uc&=vyy75&D6Hh}L zf76EGzw^s`HxOrcqtS#&c5mStEY&=XlVk5~2fUsrLV2O{52GOWYdWYKXzGMpK>aph zyp|doQ3m3*1zlKX)Brm%0-sHj+45{lW%p+LFQ&wAOq72A(#?}LoulKj?D|XtaoTAK zapmVo_=2Si<%7uY^cZXfUxa)z2loYV?LfErP|{v8*q>eCPr_UL*K(2Xzv-E8pC+zo zWu>}kjA8^52YQXM9!?E+QVHX{jkohmuQlO3H02DVhi3M6As2MYbI=yxji?XCqYd6U^o(e zeesR4n$!YGGTb8h4Uhtf zQ(B*9_BQ+$`U*d!-w<5MCL>3>snwdg;gRhOZEApUI(!p-&$yApxm&&pF#;b6* zzJ)rG{$Fh8cM49!>u&Z)6iy`2mdysbL&^} z;p?0=owuWuL4rGsU0c^Oi`tpHY>SJR=yv>A4!GW+D{_g| zv{8pW&4>*TbxGP_x@KfzuUh^ldU+t^gr)a#ZMC!)66)5aY;}?VCH$FenDP_m&D5`{ zYbIo4r22V10>JeF-3zN3A20cSlVw&;DKAn18rll9@EctUhS-fDq8>fDm6HWKho@^Z zfn^3#O!f49oGVs!!TkDyE=+s3GkI4FqF@T%dxa2N)PkIEbqt%o zbamT&Uh3oS-(spT(@+_%X7Hg{+-j$)CX-R|<*uopbMUUU@6(m?!2t34f$nQUEVuiu zRM>3%r&av2uSLg)7SyWPPPY&{$>PU5!z|&8hzt61a1I!`-+85(_r)+{@KZ7$(FF1I zj+Jzh zfdX(n{|R&jDS3W%f8`G&RAJO>|2*~~gFNN@VMF3zk5V}7m)m6ja0Azp#-mlXmarmR zR(3~@?`CC(qs`$){x5x@4|)VUK)gYqo3LR(*>UiLY>pwy5!tV0+2p6{*z z=3Y71Ig0lc;}KrsHIYPY982vL*#?0n^eK0#9*nDwH(cXX=71Xvx>*>|klk_(jv@Km zz5{`6j{$6RO+uSqZPVSN`+W>OH9saqXSO;i=Ja;l@t94B2`2;@+r-}^8A@PUJrXrs zm;r7G=t?|&>TDZN^Z!`aB2e%{WX?++4ZhJeX=iHP87lxu^U(Y@F|f{|GDGbd;zyiX z%(&6F55*hgJxf9ebOtzXh#}mJ118yYfc2)JTVo!d;R=};eMw5wI zWszN6N-XB4A&33m2qTE_wXmbjtfMM`N=A6D_tGb<#%76eGxUq<;MfRX%hsZP58y_D zE|QDA`p>(zxlp5cQha}xfWMeJfADk#)&ESL(;JEqvcXkXVwJwpy2j4vt((O0EQX`` z!e#8_WBx-bBYUhh-W718LDzblrg7*z*35t76=nEgii!AVug(-EJzI{7_~R}9C`u8H z=l}`wChg2mEDuusq^D$B)6eQbNS~azXG`meKS%*?4CrRIH<*_#?n=v@6CS%5rV{F> z$9b){eY!!x(}#eiuj)U%Nfr^tP?bD=VF*KVwdoV5yX0L)hIkI{nmiPQO{qmP$(I!-XUpHlCvP&2wd!Ze$uUNXD7|2^?Sd!wKSh_2g}c|(uDjlPwxyR7~G~7WwPUW zw*L^1b0V7o50P==k;M^ zJ{LiE!hLpk+4|GixmpdEAC;?^Ikw@`L}r$)RManf@hVj6pImj2lG*?_5p=u0SyvNFsKC~Jsqs-82&{w)Bd2OE zx4%Sbv_!~Cr)yr55raGYtnW2RZp3TKjb}YKX@o9#j8K z5Qzwk#F4=|ykyX=FEm;_AQmQgkp96e>MX|b@0o4RBTZ~c+r`?M4Uem~kJCCUm^Q7Q zGmDQJxzE4MzH~>lL#9tSo{P9VU%Cx|{dx-M{^cB-*cb|@3Ni2;B3l=k!n`BUqx;qy zd(W|-XuD}RR~cIoF4M5>Jaq`o1S=(plVwQ$#@#uG=nlfY*&|4*_Mi3NKEW5zeSgBG z5dp`gID0Q#QJk6mUc9X^XwK?A8vSO8#SIC|PjTFNRm`rzstfnyi$2{8&*4aR^TD{@ zD{WV?NhfY`dmz85pc?{B6b>ataQONM@(0zF;o&`0BcF?u=I@R2{OTjDf~$h^tnkN* z64GjjVt;8pjnuSuW-CJ6on?7g(<_tA^4u`Wt}f)vbC7!AzI`U>!k%f1d!&9zO={@;t+pqft5m};!om>y z<&VS9Fw+r^RF;stH_`HDsRHAn{(oNU29Qaa8n}u&e;~6;{Inh{0qa(>K)34Fo1l?6 zS?(q{nyRXD|909`YfyVzxM zh9fn2)ulNUPc`xQ!uipKrtNN{N*2Ji>cDRpsLvW66vr9PeonD)Hb@KLd7~fz zKbWVIhnoz}ck)12LUPWlnmNm3XjzjW6GLth-MsnDg%H~MHFR7F5PwGM7pu zJeS0YTkfS}dVh}~4bF{*P7EgRS56s8Al`h?<(3#e)(!cl@^>@arU?<>)W#Y&>ZS&< zvKqOROQ<`@@f*b1Crjw;z>w}7i61Tz*P^m@Z1EPd$0C+C`QP`nzt3CZ4h56t*s|a)j@zY|y>=(VSpO<;SJf>wg&8|`i;w=VU*Y24wBE$#m z;aU7UcTH?a!Smn6G$4Ij3F);MX6Y9)t{-dL*ir;Yvj^V^I>mf-rGk5?TgOR%UF^}2V+p&n9t|18x z?hxo`qGJ6xF|PV!?DK?_%ID|KuYg+$x`gfbPz21TzaEW?Qbpx-uP{CdbVuFBplt71 zPV)LeW|M?ZVY$d-MhfOTr(%3MaU12IrfW#g`)ohrIj8-Dzz=ZCK(`Hg|5}P+r}b)M zs0MN{S?gU%6C90zVCUFEs>!_14~v-}PE-?AH9y&&5GivkHgj-YtDv4VnqB@~CX3E} zeCz?Z<)Ax<%5GQ9u%kL1{3=zg^mP0o_<%m?^V_k%MHM)|Afxpl=&e7kASLa8JDb~V zeE&yv+3-NqD(9<&AhNlBEPk9Z;8y$}m)CWNprl=I3iac%3Y47LmO9z-=hd}XcHc_h z=swCn!kveMc3y+{_l$f9j)cSnp}*%4hs@KHkRqS4V?v+6{nSd({nQP6`5i?H31jv! zVIwx!^!4?HAEioC?#%3QZ%ryY=XX(uD|Qg9ND9P?O%+3Uw#7W(-~j;)PC%=4o}Za3 zSl3nsx>?QQ#7NF3zv2i{i~6y5iFNl#@6`z83r?yRtu%`)I?a(W&1B-o@Y{;qTHPB> zkiH7fLZRCoq?`y)R8p7?O#^wT2Hjk>0`mC0k9>#+_)!lFf(vl62c?(jB^hX#knE7R61%m=@xRb+Q#nU#KL!~iWrKAJ z|C^)y_krQzd2f2gJ(kXY_*VMX&i#2r4vB-jo8|hHAD^Ia67yNU+OWQsj3JSBHQuNj z>0gigh-%JfBQqxUqrRS(DjfV>M;+)A4B8~9?fvNe^L(pv%A=p@^FAh*R7>aPf(c5G zI!w;+?ZX!lI2^&cp;B=d9(b5^Tf<%fmZNKWW+>&aBYGc+fjrcM?#kOcsc%uu)KOIK zjQEp3)w`0uP1NCs8C8hYDSwbUs&BVWxe~$}oVFSH#87*_bm%Ibq78>8(W!fWUA7U! z3%290pqnP^^<>IK5tBJ%?LrXgWq0_Qd12qHR_wd`7m?cJ=|ekB%TPOw8J7U@rpb;~ zt@t;|pK9wK1ZuJw%tBPmr+9&Q8~%?Q>Pie_i?@!qaUnybJ5hd7!!0|%JKk};*Y@HY zw^^fi{Fj$-IMCI^OlU>LPmU-o*4$VV97 z^4fZ%SsMooiT!t4daCbrfq0uh_j_+nGE6Yamr|h#YG;_mbLz}p&IBK8PF0B1-8{xh zPVO(UJXknP@l!I>6!V3~{4i1%GHHIBHW5kju>ujRT?VCoqcopx{-!}gjexvH@eWkg zeDC7ARVTkS{SVZRd~m+g3cBjP6cDAzSGY6Se#E|6-Y$*a0%?`=wp+(#-j4Ex`Vmhm z@NZ90dw%YX|NdTcwGnQ77*JGd5-GEC(>L)PPqhNX+XlK@o>40tL`WQp<~()is?dT` zXnB3(*i@ZKLU4oKV|mCIx2V{zvpP>&+nvm(T3&T}y_A%!=mwdnumsC=VzS^ms~vP7 zE@WIcSOPCfjNVDOMe1L6klWCGd#8WH+=AVRN-NHW>d6-J>))H*)5|FxNwB%^7)mAd zqsQ^i`yC)^Sd!$yy1@?6g{`%`ztY|E_4n=yW%Ttu&DMBp#ByFtPa;3_%$YGu^w*K8yQj6Lh;k_iT2~ z0xMgD*ia+G#eU>dq1bLUN3AyKMg{Em70`f?3;xR z+RAv2C)ePv6anJ>4!TnO3bXT@si|+y@;`P?e&;pilHDEp*T-t^!(`bezwCdH!Kgvx%hRHtPmG)yFoW4TgO!W;jPn(gq%c#8XB2xDKiWS zH2$%+BYdco8JiA0Wz>&6QM)?3mP}+@8#|&%T>c|23VEmf@U|tz(+v{9?E&2q9yIEt z;Gb&+F7d=8UDA`vN~RpUBLTk+aFnt;quVD+VQ(o*XWRc7?M7@VvERKt^1PgbBp;bq5zkYNNdA_5x9ATR?EaT6X+KqX-w?+h zwTbvuus<6B-BaayJe#lA#*c&WAI0yObLiCd-MC@x8smP6ZE>FZ5BZ~gCz!m`P#uOf zgLuv(L5w&FhGFE;Clnr)MJ9pSx&q=I1YL$tS-kxE>MPR;hRnbtAGYZlc; z7qDe;SEKII>zft+i>wePsRJ9?KW89Hy18>uVE`S{6OPdIUKi{ihCp{!m$&Z%uUV_J zYAJYv33_Sp3$w)^N{z%QMv)xPSu7sayQ!ZTVgg-j!WpHf1(|pU_mVLwv%lZRT$Vn) z-Bba`w_(u5MPokok*e|BS}Qu-{#-fW+3-sT$;{82{q3liBBHPo+gGidD62&C5AQx# z)%9S7qcI;Ch}~E*v-=Rk7s|%v0eKh!-HZC=ek`hiiu1K%?;Q(4qh8nI)fKcYeIZ&z29+v|;o zMhtCm09aGTZK! z$Aa%WMbA<(Ukuw$3PN6x%KLP0L;XZkKI8m$9M_3Lnlm6{ivI?AYJckfr1>|7@bbn?AG`jxLc-D)7%~)CZBuS~wOuWrvGoWhZvhi^R{^9;J31`Pm zGh=)71AfyRj?c&?4%ENNd*fzR)>RX?r@?W45_C1wo+~{x=W#-kLS(V!Hiq&Ezr|C# zbfZw|X51sw8ga&BjGe;kTzE*g7eo)g7w0tlBah;97ZJ5O@$aN{{yGVWcM5cm_U(5& zxOJxs>pd#&7{k?=i7I6!V?Jrf2@KhmhaR1tJ1KfBi8nTRuqYD;9|mWMN^%K$zNQP} zm`3(V!LxvMy3?S0cdPN`BS$NPIEsLk7*{IKT!jPo)wE7jAnV|HHYIt_uC^^a3~uJ; z11~)zO*}HIsLf2&10kI##}U#k6A$_S?u`2H|MnAfRRhLJh1ZmsjJeX_-WvH9=4kgR zK3tAUIjavB#PC&m-C244ACd^yg*{$1L0&E!F>RP(y2{@>NLH7S%dO9(r zM_0wk?Br!K2KO~)K^LNPLNNPt)ij-ckC`uRWUO*e0;JSzMFd6Qsx*2}kOIT@{SjP1 z)~}C$n`S}1=TteydRm;+s9T``o#P4>!)Y&Gep*1$5)IomoD znr4NoMl8J#mad)}az0dn!Kn0`cD@K!y6jE577VO0NwMW#%2{7_wvWNOwt3KXtL2OJ z*X<^FvC*~iP$P!?&2j-ja7^tO(5A53*t7WXIKE;xi3Q3bzeSdx(*}$c%+o(8wsFiz#&MpU!6OSmX0oF$Je2zf{cxR zk66sViQYLM<^M5FO8;uAIRZDP6^ZN#tk+ls-Rm3(RYhDLo;SWQg)>GlrTl{EIt!7t z6Zvc~_zLi$iZ51FA5c}1&Dx1NGE}NHhC;gJ7L&sNUCf?&)Vhat<__d{33S(EQutEH znh{rcYkaA@YX^3Z$hdH<&Hns-V=Wc<>Cdy_?;rFNN0Kr3TH}&zU7e2hB0jqQ4W+}F zbnm0Ebna{ccNuiiE+4D((nj=Uis{C(sX4Q~kJq6y54l7Ndfr5SPPQTabfz3NFDk}b z4mBQy%QcASCtzS*_sYnMc7qq``1Q;UaDRbr-fcnd<@TYCkH<&*DMQx6} zZVYPw-yLoLwc}OLwSaJnQC=<1g+nPVi#xzy^1AO4Yb!~ZxtZ2t%uN1Jbb2!Grq7CWdO2B(GTM}X z#A}Lsl+V2vZ8k&ZguV8!Kinz}0bibR6q*6UWKj1jz40SkiQSYiBjB!sE~|BMu#wg6 z#N}hVy_w7UWq1AEmj6Z|tEABzh;ye%p2l8=n@ANlH9oGP_Pu=KRtT=yz_Cx)x3-ll zV)94X;JN7r=*B}es~En^e$sPxe9=Hdr{z*ov1RFX{@}#=$njG9QI;6`UAo{_hB8D) z=vaO+wc93clBGdN+A`lE*^k$_3@{IypsS1KKTgYZDv}(3H7)Y)(MB9b7J04~=(jC{yiZ{LZZN>wWTlrj-9BQyz2fkJKAFv&7fi4BP0)8isxrDCt zAJv_VoaVN52~&wO#W5!P;=wJAUBhy?8;R?y8NaNk;LwK)Th#!i*uX)n)DBu}Whw0` z1ZW_?+o0<(`8I`g8?mcXEj;w=+v!F}fdyFGEhD(o0k*y=pUbGq*sAmde)WBAebJV1vAcx?8n)A1vU@c+pV)!?{U9L#ag=h<6us@p^yp9y)WpVCCI0k1;S{eZN+65f%9IT5!0A1U*MRu&aa00}lWlqL4 z%aqk9cb1JYyIX&+!Bks{ox{#{qbFU>`JfBE(8&kBWF_GnI2AtV7NKZ^8l{|V7akzq zL(q*#J__>2iC*NsM3XnE#xx#`dZ#I)>1^Ao!h3;k6H7u%p&fP%7vP|jIud_f;T0y8 zk;62C$62&~ylN1!XVEqZ3{ck1TUqmf`e!7=E{Y9;FO_*2T|tU%s{{t>82 z(AjW#Qu;X=*~QdjGc^3u2D2KGkb0pVAuB;FvavF?Cf#_tDVLcirdl42ijX%0i1!3^ zn@hWu$GhLq;bjU%?3ZzzSIsal+PY3Hn2YJmrJiZy3(LP2svmS*jKCZY6vp`lXYab9 z>^+4k#XyH<%r20F>%vpe#aWHZF$?S=o7HfO?Ypg8DGNx7bJA6XMy)k8 zy@I!hyH6B4py%ok>7#>DvG3lRWwgiZ*`|97oIYty_1bP)4!fx3xGVFgD&yv zi=;2Eu3~_Y9p!M6$r?)gcP#QbT8k|Ci=0w{n;nVa&5I?nz`*40mhk}EB7>S4h=z{O zlaYaR>6u^JKY{D43($pfux{@mldd;}Uxa&YX&<*+b!8*-@L{+K0DtKxxs zi)g$*K>MC4hh~INRHq6?g(+*jkClSGT@}2q_!4xTAHsOq=IE{^-lJg9s%MWymVCHt zuhvEm`jbI%V~w)Iu?>(Zkb;R?E8!9mEsc7?KpxOYf(iiZdvnngkN!{I>c1jo%=&}D4jr`W-g z`H4LcT<6i}Cd^zWira}TsjT46cCyXC|Kn}2|75}2e~*~sWovc>|J%8pxu?0mOS0vV zN;rf{OTq`@z59Rcy$4tn%eMYKARvMY0t$iw1xy6VK~zu?l%%34f|3UrvJ42KB4*49 zBZ@g^QB0UI=PXe%N6ZP+|6MaRclvY7eeOQr*>|6FPtS9HyL;B#wW?}Wb#+zs;Nki` z-}YL;AfM%`~5U9 zb4P&6^qKh|VylPWj=Hg*3ej)VDmdA}uFV}q)Q)u3z^J{D9?4L;E(b>sHio z_N28#^R>J=<^9a{tDbHubiNpWKlS9}^q~#c+}S$AYFOWyy(Ss7b)5L=>8Xhxd-|3> zcdgemW31`^!A=f2U30{mhJL;aV+uQ8uO3{W#qs-v>-S;jnfJBtu3f5EH|T1RLgTw7 zO698@U3GLdoaQAIjGYzm?Yy}2qJl!Nc4Hpc7Y7-SSTyFz(-}uo)f}v|9CO_&xce~G zT)%@-?;Q9xqf3*62ghycZRhQj|f&6zunDm|@zYoW>LqtnG^sqtx% zHqZA41cZ+g7{qVCrl)CBC(VIV-mhH01NCby`}t^)-sJ0J=5xtUzKsiO&zaB1&94MDzO}LkoIk)GB+W$?^M*>-U9stKj@q zrw@;vq}^g+f^cb~cjxlJ7LVMHtnYm>t6!>Jio?jNqoKuNeu2B3i*LWk@8nf(sM2kF z>n(HB+MGUBwv^-dJJ;{foZD^uH?O@D5p~>bXiUc)m%hx)KlY(sy+=u2V-7D&D<7VH zuqvf#LL;R;wNEOZ+M3fZW7n-CNBRXe8&Q}!PR}r%Ct2s9`P3GGs?LD}nU{LCl zeH_0(xqjC_=@t7XqUz$@h@;;!j&6NeOJrGOb?IU(9S`R1=e+FFhn)$e$? z;E=lYnQ?IjC2!;U_in3wZO_&7U8aS(uD+7G@L6EW%+*~42~AoLpT95nqodD@s~o=y z{~y0sZ!cTpnz-fN*y60+4}Ak?`VZ^;LD)OF?Bk0O4`YftxVc=owg1Wa%`uaV1iG!~ zxI|yD>AR=L>8uu$KlJUK-(xq&uOip4?Zbmzl+Ul2z5K_Nb^S`}`B*D!W-q<98| zJH55sQqBh`EHPK5f!=L523A75jX-ers|4+MRN3uQp(| z)4r&$rE~XNI=OA@|Jt*@;>^dNwvQTWlNYI+d9ks3)HXSnZi4XpPxIrIJC z>z?aQZLr5b>MdWtDRKP?)m8To0a{Q`t{f?b| z@Xq>g-_Dn$XMG88{p0bWvRk{}L_4iGU=r%3KBRqhVIQ}*o*H$BpZxK<^@o+W)t7fZ zUN`egtp3O+ZX?WsnwN9@*5Ug7{IIFsqR?q~2iE&Gq`tkL!RDv;FTT4xdwSO`Wnn6Y z4}XNUZNB-m*eupr-1zC5pOaM#^16D?nX@MHcD23A*rVsNIDXZ*ep?sqO7iHxPvx1$ zou38$hi0FfW*^t(^%u8eA1x0UXfJB&{;=Wo^f$WSTMl`-{Jq|>dl`=cylQz|DY7t* zYaRad7WcisI@hnoC>>X)q0M^-u0FR%?`y~l(}fO714l<&s@;E<*kb?c=8ZDLL>Jdt z-#2iLuB9_k95e0M+-##_gP6L#hH0HTVQ9Y z#a4v{x~mJ03!F3SuA6kbkr&5reXd^z8~^dMZm+A|%s*h|yEj!&te0to9kSn5dtUn+ zKi0Q@wWTQhvHuZ|x~^q|O9C>l1YWOga^c6=$OQ{cJ2Yx^P+5=r_iq|pzaNE@h7Fy) zzv+{_N&3y5SD$^oXp-~uXSbK-)IDs{U_jEm_r8wJ12jZ)OGm1ne7CTHqscd?xARKp zq?@ahEIei7c9v6KO|D42x79E3f3 z_dj^*VARz~i}wVK+V*aU`Ik-$Z|e4YFeH9u;pn8j%ert!G@@vE<;ih=PP0EwGl4iR+wJzxI(ugpF7`a#PxgMqDud#L7H%>P3hCF zr)SyEu(KHDbI9Ph`@{IFK9hwSdFRWwifV7J>K{Dhfo5;r%A051M(TBaoqTn~qLLM2v)x4=jy)TA z^cnHSH*f!qiSyd1-f=4!mDFy|v*J(O_nUfLztQu`CjYQnx~kvB4;JbRn18J~;kdzF5Abtru?Cl2~tznP1h6?bY7H&Vg7Vg1a@&6Pfm(=zX{?_*Akc`NO; zt#7(75vQ#4_Pmq$IWwf9VTg5ydpjpI9ouTKY59?`vAMN2a(}05!1dcOR+xU-e8}6C zC7WV0I*lD{v-ou7_qe3Xx(^)R1ol5|cRzlbYvr_W*_LUy>@F(z^lg&7GR6K`O+8(DphYj7FclBCZ zdPL)SdZloHsK+&BUDMSACgiklq;??3V@3w|erwA0J3M)J@5#@K^B>JLsUDH)VPvDe zVvl3%ik5ek*L}{2DSPPD&hv_T#SDd_v`$*1SI6$pExNL#!KDwyx?O^_zZuOl(3fz{}a*yS#{2up1YH36b6b(8#ak}`nzx#GC9aHzyl{20t z4`|RnE?s9~wrBso-Ksm;bNBn2bN$*!Rd*S#WN~iHwgg3!wk_w+$Z3*pkkNIYU#rlO zzBx@g6(uIzR^M3b%ick~p7(ruX5_F~!_>M%0tc9$J7cDl<+YAeUPG?mK164Iw7HR-e0FS&mC)YQ=*?$+xk(A_xqq4DSK zcl>gn=xr25a{RX7`aR*Or+neg{u#IT>-rtlj>C>DSy(-8y+n@k95EwHJ=db~ByZ(jai@9P`?N_a6vi_m$n@ z_%-7CbxwGAztObtJ6C$v@9Qz*X@H@^gS9`!)=f5a@wIuqchn^Hr3L-OeIHD>tUF`U z$JGrN_v~1|PsPUGY08cJta`c9lDltY%=Noy=W46#YCG*dD=B`CZ=^jlJ~-v^x1@?& zO>gQLdmM@yJ!(Q9y`*zzJDp2yxhnY8-Nv2UJ$|h@&Pm|WWl`&m;cJAP@|tk{ngvWB zrK@#d=alm2=g*AWs_y)${b22&!m-!m4}UTBp0-WzY2eb^M-Oa!Z*)AnMZw(}(}Eu6 z#kyplnYuCe<~O&)137+Mas9SW_Z*NjdfnoVH=13%7Ot{Pt=nSH4DCDi!3IGGl=8}| z+I6^A*Se(X>O=UX1{1nbwbn5=U%i&W%pZkg(uc5SYeF+TgYvx$|uwtZM!rz-)ZXDAt%zpESIZ2 zzmWfC`}~TTwPy~pIM6|DX#DX}gGyZ1B-nHOw&nWmG`Q*cR<-Qjhu^du7q{eT(B2ES zwh5}0ho{XLw7a%SyE|p`X8i~|e)UdElfVaOti!a_Pv#Z2hzeM;@0g`>R>}0|9KY?j zejnYMu|qjadFUynzTeM{F!q}JDec3uff&M}#p%ZtFrhZ;7PMhg8rj%P=Gp^qsI)@^>_C!BE z-N142ly=v31xGcU7Ic1hXj<*FzNY>16g4hfUGj9P`tpGD-&*eLcu4Wfz3t7ig-ukd zn|JS?Day&`#KD~FSF}WB&4vliTSCj8hV;sxrJAuqKXq?K>q#G?f?al5IlMVM-NGny zjqwnD)3a|w`@LzhHQ1;9XTxSiYt4>UHQ%Z}k>l5b>vx;S`suy~M#oz>JKW@9esq;z zx0LA{gZ<~X@?HGiRoUP`=>*53dD&h3&3`U79e?%y*5!Nf&n&rY8Sr9pLf)#yo%A?< z+jIS@2D}T)YFX(RGFkoJ#T~sf-d`IuVu;$BWg`kx74?*M6uo;o|6F{vx?6tL7+Y(V z+Zm%zx^?&0Iumw6s^z7M!)!RIBtZSbhxp?*?{qU5mqjwCrzhkoE`t@zt{fXtg z@fyax;|_^7pXfGOx7!Z8UKU60wCnElQZ;GbNauG>xB47>uUv4i-PtV(8G#j!rxP=$ zxG2YLRM7Vt!(F#nbN%Lg(CfV9$o*j@!5hl&tZV$KN%YpmZxb6Hzj$k28>1t`mZqP}2Xpmr?gv_1-ECvwGE?{4iqVfR<|aLQ)2mC7ZE8{9<1qzQ(>)$f z;XdbWxqh!j?#qnHTfX^5WQ$8tt?hq-qddM|*xI>ltxDyL*86k6$8+a9c3i*XH<~V-|De_8%lb|3#o`ZAE?@UPQukw} z{os^VHksvTDq8frv`;i}#EL=Q{ypY(9ksrWg3q^|V}+$xZ9KcXuf58Bk7LjE>$hp- z=GSg-TG_g7t5ds=O}~4M@5F9Acl33d=DOuZo5K%0&R1L8aM^>eSB)nZM}C{UVn^xG zoq@IE>I5G>n624xH1~a$1K015C1ZqfQG##KcYr?8?mu-)%ySA*NYX~?kh z6;`I33)iiCF{P2xveyCo>Kk4*b5&FrRC&1AtU_^X(ZI*KramR>vkR}^Zkkuve(~zA zR%>_I%;xxY;`-ffV3*Q-`Rl2XuVNndn7(LB!nUY-dYgB4ylJfE+pSfH4bSSViv4-i zxN=aVq>98S!NP%iU5s-ks`%@NhSqmE_>4PFcHsKmR#bAfSM64*?{%GnA}gNsU$JCp zwB@IwpI6f+uhl+yeM2i}=jGQov>7$8fyM-VjoeAE)t2b&Devg{SY=YmfrF#D?{S>D zew*wFu9I!^u5@*2#PF{5$_ry(9G)@eb@;0`8|}`o*z3^h$Qz$=+1>UWFOJc#cW}?w z5OXb2>-DovrY7Bedi2HFx*s`l=*abJx@or4cQ1`g7WLF7t9iNJH#>J@qQG=jXy!57 z!(Zl(Gddf1;)7ap%Aoh-CIsZoIIz2MQKWg)H}^p&LUUpoyO(g^Gj!tmUD!8yLF=9C z@1)K9bojmT4#!BhOQ+hNSM~VZE3GKcYGCc^;t;cL-}i2LIBc2O^?-|$o~GaX95!jK z`?(SO{a17`n}hQHT_4&OroXMPD-dKw#EC3o#D7;w1Oh6{Fj0z-N^lH6N>oRg==`7g zp*#}85)ws`0)eB7Ku{lfkWDBKPZh;Q3P!;8SLFN8tOM`s&qaXRH#spbE;UIY_=*PC z_zU{gpDPi6H6H;!0(=Di??iyc*cefYh-#E;CJ<=;jbkkRJp+AYM>>~2&wtWK^86LWCx=A|1mU8DzjcoJpA`4MqOOwrTx>o(EIv*U;w+s%{}uWC zPkd5Y!Xgrr6L4(ONg$}h-_!q-u>G%ILv6ITt3aTJwmF95-}zklU#&Qw+5dV3sIMg@ z3sX`=!sOYW|Nqx{xPdS3CUO`BFbf zO{Lu{?A!I{`@#Qad;IPmBwLI)F~JT;w~)VgjQCwFXlwaem_X3*pENg;)>kNwfZvbd zfA5@&%2JFwfxCB2wl~;8rZM}k+RvsumLU&4|#_?mF zEXWj>WV!+Iv1tES^>V5I|K$HtoI_KkV;mpl|Ky&)*PV|59|1lB|9TOiXH-;rQdlx3 zN-uN%-u>8rz3A{I;v>LEfRDgGKLRxF#*5-5zg6Sc2LJr{@*e*)B0#^zG{=-Lr zj{qM5J_7%TBS7<}v}jR8G>%r6|J=J1N-KK@{t;>EHzhFr$A2g;$wF~r9Nv`p-S~4c z{dWu=)i+5LnUX9N3QBMPHG3YEM?zwxFg`Is(6ogA-O|5fKlyhqGxa}_*gS%MP|g2l z_TRZB`Lgp7;3M$gMS#Y-u$07by5`vX|NHZo|1K81#z%mUz`sreXl$CMq#*g*l6g4t zf4}h8w#}dZrx5;hg1@%>ymvkVd<6Ii@Dbo6z(;_O03QK90(=Dc2=Ec$Bfv+1j{qM5 zJ_39M_z3*lM&SR#e(RsE!=Fy@Z`-_l!TAXA5#S@hM}Ut29|1lBd<6Ii@Dbo6z(;_O z03QK90(=Dc2>e|U;CJEvuE_KG@)6)8z(;_O03QK90(=Dc2=Ec$Bfv+1j{qM5J_39M z_z3)~M1bET`&VfRz8ri6_z3V3;3L3CfR6wl0X_nJ1o#LD1pEqx?*)7W_z3V3;3L3C zfR6wl0X_nJ1o#N>5#S@hM}Ut29|1lBd<6Ii@Dbo6z(;_O03QK90(=Dc2=Ec$Bfv+1 zj{qM5J_39M_z3V3;3L3CfR6wl0X_nJ1o#N>5#S@hM}Ut29|1lBd<6Ii@Dbo6z(;_O z03QK90(=Dc2=Ec$Bfv+1j{qM5J_39M_z3V3;3L3CfR6wl0X_nJ1o#N>5#S@hM}Ut2 z9|1lBd<6Ii{7)jFYFA5g*|e_GqgqE%f;c5CF3ut@F(Nif6eqOkmn;-^Hng@h6pJ#1 ziBV>TwuWJGq9F;1QEIXre*Bbv==%dj>A#R_hokH}of7uU_6SEhr93+@+Y=n=UshED zCG4MAeafy=hHW#T&vRx|!TBI|-Ak6XHf$Os;8Vq}Q^mOsv%O}vIzu-tv+l4%vQ~88nAW4Ieoq|n3~VhrUDzCHUx$^A-y)UHNtrd zW>aN0UD%>wqj1$>Ha(n&vG}PmTVvRSuu;6#nN1((jbNjA*M*JpG61^F)_`5t1h(eP zpBA$&a}* zS=zR+c`{oIW@`tV7qc0$w5G6mGn+B9nZf46Y$nWR4x2BtwPOA(VC%(fZP<0~Ve8Fo zZJEsywm!_(j@hhW^J6wsX0wK^FSD63n+_fHVbC6gRMWawP!Ya*bJD> zlGz+!Yszd^%;pH2KC@ZFMyF2TC;BOUY}s`k=nF);PiRmh*%`dT3Ee05%+?X-b68pj zX6po79H5UQY}6Gy10!5V_fBVaoeR#pv$QVE<_eoTv$?`XE^(P23C^00!3!) z#;)rIn<}$)XVa%+?(?$<2m?2eY~3T+Hs79?a$en*i4wMFSGT5trfHNV>Un7S~HtJv-O3oEwlB9jmpvwv}3jacAYXEwhC(+hEx2 zm@SOif?;!Dws2+(fz6TGBA6`{HYa9_WVSHaoS99?Y~iqVWVR?~i-4^YvkhUkNZ2|v zTQsu?VRKnP9W0-9uZ1vgrGM3p!!8VUwH;&md zVVe(IR~*MP+i09GV73X&mIa$S^EZ*%#=v$3*SX^n9jIF0;+XIX#Q%vxM2^;M@lRqCT>e+2-Q>EsH@OY?NINcmNyqhvn?L zc{s0tjrzk1W}A=mbu8^lW?KN;CT3g3YztxYhmG1`HEj5wU=bL=Z0p!{i|IOL{0E=) z%$AFDdcIH_Y+$w}IHzX`#d{;OEyZ~+)Q#%6iP`dS{uy~t9XB)EGMs;5wk^!I9JV8{ z(Pt~Ot-$#)X4}SWD`DFK8`XO|v#r8;KD%xQv#o|L5H_m!PG(z!^B`u+XSTJlQ9Y=R zyO?bq&U>RCRG;0&{rH)v#nk5hZ!j)pRdWvr#rw9*WZ{uoh5#sQe~K z&BFc8=PJ75ml*2Y{6Gy#o)0igA1L!bq; zK|Rm_&>Hm?8lwbU2RA@5CEn}F7;Q^7Pa1xyCnpcT@z28N(1&90(yX` zgStQs+=fXRM-}i5=ifmw(8qTJ@D=BEaID6$5stdx2F@Gc*bry|4d4%AfC#t(M_>uO z5ues*Q$x@km;hQUM}iO#4x+#i5Dg+gFi;2jzyRn0S`Rk{%>b=~n}V0PDIbB?fY!XP zKpFBY2NmEBxCAbPd0-*P1&hG~FcnM$7r;fZ4vYkA0IhjxjZ14eWwfb0Ilnq09wn{ z2CASApmm%gj&E@M06qdov_Ti(3A%!wpcC){-GCEt1D%04@CDt04{!$^fD7;d&Y%Zy z1s#DMum=uc0Pq8}-UtW%fDiZ zg*s(`(O?W13r2!bU>wKP#e%1 zoYvfGKpoTt^+0`~0W?7aparyn4rmD0!tXM$5o`jRL33aTXdP}0Xr0{(&^nsd&9qK7 z1+)&Pb+09`0@i@mt+YB0$c&D`?>;J*SP^&x6wL{)@8H~ zqjdny@o8N}>nIOg(--suUcd+V0z+ucK|P=a>H5oB}3+_P`3zdWqIYv>tK>Hh|VV zw8nXlBdu#_9YcG0w05Dj3aw2V!d8tqd;!xDlVdm@2SwlnI0=q|d(iHH3eXJSeZgdu zeHNg#%OkKB&{||Yp!LUQuoUEhWnej20qz1n&==T%w!j=%1502EtU!C90=}Ytp8>5) ztbq-%1+?FI3gvi+GEK#G)4&|M9_$1AK_NH@4ud1$C^!bTgM6?B*aAB+5I%#zAP@#h zU@HaJ0nOhBgJjraK?D$jC{O@H>1OVD^q5YLMpfykdl<#|#`3OiuHPb-`7y*WZVZaz#U*HL7k7XjtPWu}R zKpoVT_A6e3VZaN}enTs;1$A2wXm5a)SF|VF9drSmfhKSQ4M0O+3sk{El&Kbu^sa{9 z;k*FVAP+nMQ^9O-4@85BAQ!v=uR$qT2Nr{CAPvyoxfvLX^H4y05_19Vf2_y%RA2&H zffkIfs4MLo%tl?_fCr!g6oUB3SBsc}=nmu4IJHO4=#aXnmh|hnwKBl=3&10jrIKyz>rpf$q~5Cw!F5>VeO1+qRh4CkpJ z1&Bd1J8s1B1h@glfpuUlxDGCWi(oa_3s!>j;2anY&Vu9MC^!Q4gFT=C%lz`9R9!Lk3paPVGG(fgH>`1n|?3`lp5PSmnIku-be**S`M}V$*0I2?S{uq$o zk6T%z+tb2TTFwL)XgcOTH;z+7ojC_CQuPnMTjc z&Y%-0LwaiCE;y%tMzP~QGgI+>G_*{R0OCOi=nrTfLvuGb&<%72H*mcdj-zqxiDM7o z0o*}%K=ZwRfYu!}51~1rAD}q{%`eF24}!rU5C{f>06_KuAP5WwaUdLof-n#RM1bb! z`;q?;9HW2`M1lxFV?->DRF6?$Bp3mPgH(_L5H*1!tTI)`GNqbQvdQoM%(V|;&%G~>ZIKz*A&_i=s~+y*zm1aKYX zgR9^QxC}0WOW*=H56*y7U?o@q^1yU31!RLsU?S*?yb0Mk*(Y-}nVp+vDoZ!*H`gtN zZ6UMg;J5_jf;nI&m;q#Y&SK}YIkv?(p9d&kN>A6!1(cSXPWF8f?3CYpAS){!7XaDy zTszsg*Ha#3lU*azW#6gZbiN!c15_8fMrNmTZu%nVhXJ+EA#e~J0NcTSKy9%D>;>C^ ztX-(yTfr8v8LS7J0L611p!_HuKsBBa&S%0DO$l^o&i0hNm(zWD|$|BR~dMc-^U&!*~ z=0*8aKakahVo7l%f27g1bgxj%W$~r*aeeJ%*HRfNK9ok52c_8!C=L0fvQye!KvqtQ zGnG|V2I{ji|I|N8qdq6osayqs^4NnTYv~&5qbI=$KpH{uI}IpLih-d(~9hXCC-)UWpf8c*o{puT

}C-qIL5A}2EpVW7$zf-@W`23Y)`c3%11+Mn(P+5pNc0mK6ed^C zflxsE(1XDsU=M=8Ko9^1fd0TA^aFmN6R-ho0k=M;_)cY|GPVO$J}MK%mFh=zu>h8U z>e>L1O;#tmh9He>)_~$fzqKJ>w!j&508W7FWe4aQ((TzfrKkFnT~-!~6Md(0{dy$- z)FxDZx}IW1d3Oe6?**tG$uG4Jm6_^Eza1f8)K28r3wVN_zynYjDCXS(mE9Fk%-jIA zO;^wbkPq@nN1_KH|Kw9vC$iIbZ$RfDRJ&g}uUHMgx~_3R5f)s^b0 z2e>hiY2=scP1ng{K{4Rw$^A}wQaNP(p7N*k)JN$^Wm5-~pDdnqq!`J3YT%sOQ)VN7 zbPd&++9w3a`ViHZ@}M+SPwK-mKa`HjM!ra+x)5}&tUj{ubS?Ro)t9cJ7*c!M0m`3j z)CRJ?L^itLWNCgqPk<(inXLbi54u+=4IR_KFpvtwAQ>FSn396yaF79JfJtB^pzFqg zv0xM!12RDt7|qV zJA>nCK-bL&^FRTZ1$Kdauo-Lu8^H#!7%Tvbz(U}G@v|?;#rYCI{(bSiA6Sp`bzm)6 z16Bii&aK381y~N2fu$f1tOAsN2iOk6P)5pgE7-!m)86k8_}GT;RL`AYH=r_~0w=*i zPzVlyJzyW$3-+_`WIF_?Y$rewpz<97AG24tf=>F;uy z0Q$Xx0ni7!;05&O;2C%X9)LTb65Iv%!976zhIj~`g2&(qplgUPfS&)KaQp!1y7!<8 zyaeySTkrw-kLpCeOmH*;viKY0oa#av)vqm}-$%&KsUMo+ zJH4}|IVa7T#{)-vcLwy{nBEuDchc-}v;z+8yUf;seecMzZ)fi^-?veMXS7epAZz=< zsgC$lP5b})-LIAWPc?OL4fa~I4w@R+mwQgd@1@iz6)dJWHpj7Wx<`mc;jTf3DlM2o zYbEUWX3bCioHQz>@~5GSCoFYfNyL%7^@@3Nb8wxia6^?ySkz&mcR5-(wg}tV>DB9f zuMJh`&4MN@TbMF&$5w?QQ#W2TRLO%y1Ik4lDW4ZJ&3?|Ea8lP$g+_K#el44-O0boM zrG+Kh9aoUo-us7VshT|3Q&kAIwy?FZlfH$h3q`-7NrN#)ea}O&a$$29zfI zz}l;NX;;i73T!AjqEBgx(mtzitY_U8iY1cRpnpI??6TD6+hvb5kMx0J3&jdgC2^c6 zAq68&zpN44G}nKI;%H%Ojl!8C4MldDNtT)E1YtN7I}1DVHcXTvr2N__i8MXxRHsW6 zD+_z+I|T!z`LO*=7iX0v4WU?}KFFsxyiut$H(BP}W&iMnVq;-LG5EDj6;)VpBsR6wz6=L?lDsf8tpq>f9$$%)rtxfHaHU`3&SE%9l@-}w<{XYD#}3` zN!%Cn%h6?S;*kqiVF4?HkK3}YbaFeYONOrS_N9JiV9X1);1Q_e=M7(Lg!9a$Vs{% z&Mli<$%Hpj{O+%f%?aPuA0LREH!l0qi# zD{AdHArj!TxZ~9)XY18^t)tM6zTzVelPZ3XyH05^J35`CqzsQsMJkuPFq`_FCmfM0 zDZ*s2Fd5I#v4KC=87Xwpp?gl!vBjxF!jj=|--U?lhm}unm8YTKQBohB-9B)7tKFTP zbQI_pn%b~5fkJ&Wb8o8nwBrqHctcmDF46`HjeNTE&4!n6`Tk7qEg>u+Q51<;cdzEg zEsx!tiWty+YGox@g)}rCh$r{>v1^U-NGR0baBtJEi^!YljaA84Vs{RbD3Z~IetSkO zS5a|z=_c!gPD%>syjC>6U1Ex8U&r;fD)EoxN+nYs&rf-~!sX)ux$=%FM<32!udVCx zNv_cEY$+dm@ACyK=IqLlE4ol97M5KXhwM?&P?Rg}n6h$1W=xf;$yK@1i7DAio1;S- zbV!#gy_urgptI>-g`D$pB?1bKu%~PHUf}*D{+L`zV~SpNwUysld!byJ%9LY*DvwrA z6MsuBya;20hbDdup#Y|tE zEmvMK<@Cp_<|9}8&y_2+R57DLeew(}_g{M&5hz#mpfrNw*ZHz(lco*U$rTHx)YEl) znzwb>DY@dtluhoU!O1SIm&lbsro@G={CRWszAkbl35qWAxw1mDX;GV}z2u4u9;(#e zItMEjUVo)}helXS8b)inPpz?%MjCoD9nfi{HF)Ntu}T*CTq>*PL`kuIOU`ZV7KwXMSI@$Ed+GxzZ7e5tPrti!yDOoc$?R zLZDCy9(6HM{m{*=NUn^6VhBZZrg2sDv@V>oErrqoO65|q(e7)@H_Ou;Vrd*&Z*jE# zdf8pBRIoHAQR9QhmA*o2%WC=)3YB2dnTkD`%MN?Wm8KZrDWc~b`mTR8MXkSF=?I0= z^s6|$V$%CD`f?=@N@FN4wfjURXP=3bD`F_ra$~#qyz=nSF&nuu6G~GkO*48aJREr= zORj8&qEBhOmc>5bpyn-CPBL#A_pVr(eLMF}uH0kZvXgULmuL5^Cs%$lZy!4u1)4m2 zGE%NI#&ATj?s~|0mGMf!Qn_*p-H^&=*U?U|+ml(VNRd7PA3&iPTzqC5rppyY zRFjnGHT?@__gw=FG!*IwH~g2LjrMtVMy@Pp%A$Jx8z1fQPD`#Fg+hJQ*s703x4``~<;s01)JLCs zEBAh>5OYMXs2~8OoN*o%YMDBzuUu&hr4Qu)yn#NwY0j+l_pToO|!ab#&^8? zWL$G7mKIj{pTGxnPP1#*vZm_ z_KZ+(IoZDi3T8X>TsQ-To)}*m2xEWPURVT0vX-&^y<$gcYR*RootkE8j-F?$taJ6# z;f+>cD0NC$QdoGLP;mN-t$L36wIV3iP--dx)?lb*YpJ*BFC(**Ty}d%(nwYxEuqj; z(_x?}>dguZ3#I>R1t%yp@{LyVGx|I`8&4To`}BoEHC>u1=sI}i@))_20ENb?%*lry zJlOkrxLlbEg(7-J#dLyt)+IbOW!_dp!Hu7_wSC0#8`<#!xpD*wjYy5nul8NPKX<=e zxy$k~k8Z6zaJup>x$+$fm2K3OpV!icUW%40dTp>*0!0{I{A}`ritBR45(?EcLmcX@ zp;u0Q*D}v8NP|0@x?-GgSOO_FswO@?y@RGeK?LZokBAP7i-mIO z{uoQ|MuV{0MemjDU_=VTQ-?sAF-~AxseksQM3Jm^h2kXqqg&YD)$JbBs4&|aij#$8 z455E_D;df&zmsQf3)jX#v6J?Ap?GMjFnPG(rp<>Z_43;Yq0l{tF+?a%O%cV31?lbX z8jL(rlmG?y2q{sbgh+EN_3A$o)z{zMM=bFsDcg{^#PBeru{gBXqN{bAtKiqBa2?Cc2HP-V#Mad!{XxvGm58bd|9y_ObEwAK_drD@Abqa$@%?t_9EEVWM}Q~Zl7O|_bP zWk}LU#*pDqXx!8rpwQE~@#)!h$|r2!BvEjyqMtFPq2`VQ88Z_WLSYfDfTD>s!px^>$pb6bLBUFs z%2vgc!)Cc9&i;Cyk~G$|Ecn3`>$v=PXD>w$fx_ZezrA#I_;~B^*#qtkr6&`fBvgVH zP;`*bj1@cmzmK})4~6v*J18{5?rhxL>!`L-ZI%!Efj1Ny6DzYzQ+D{CRh6WX^mri@ z8pS&KCJk>o;aEo~XgAva%7Q{OJ8_}^rmcz^ZzO3XEtkiX4pv_M^vB$xmP0?J)-Hr% zf;9d0dt7P$CLeuArqo=YUq>-bg=&HsyX{cwLmANLy3gRZXDV5#QHn!Q=w3K8ePn%I#T$4w z;|@PPGlmN~?_0fI__r)>z?i$pH7`Nz3=2 zQX0~88w(RETe2uVIV=iqjXr0@eVE}D!qOo3sJO6{6k(*`%JMtcw-z+tC{e5}oUl5i zVFI710n@AW2l{r0g1eNwB_>2*48uFJ?OhiwOb=6o0y~WdqJ${?+k(+44cC|*dw%co zb%`P=n9EG9@ z<;1yXyE8+)hsu?j%a)cLmXtIcZ?%>bUu->c*jLQbSP5!Yg0SOCC5Ug^EPP{5crQf- z3N@vR3KORc#c|j@&uf;x(+5jRAX!!4M;dLUxlq^Vdf@I?n7`3&iUJFqaYxb^GO2dk zJfBrN=?Xn7;CVrhjIfBr`-5s`ZaZ5C{10ZF$g=>;)KV- z#vddlklgjHpwNgE+bJh|=(Vy_P}r=dW~GLC2u7EHE>dr5ODjvp*S>GVN`U&LMT;V$ z5$p5uGd`{A_10aYNZKbUEG60;!{1f$;U72rI#Ny9TBZ!%=>BnScxPdU!>aTqh1Jxm ztF-T^Jsr^0W%)F`Ns;vfkyw~c1KfJE0VRF4p52nC+1gE7wm^j?rS6}W(X0lmAL=2N zZc-)x%;-5?hio>1f*og4B89>vbCFn3Y;?h7e2*7+D?(2|8b>=I4ZV3dQvdM=kNimL zJCp{ueK+RKalUy@i{o1KoTHXQE7Uww^+6gW*aDVDN{T~YOe?nmdst)-I!#Kf2lSsMR?1oW9pCBKG$EYYlp=~Wt$x=NCCZo{ z(loy9kF9Kc_P7qx(AE#qOoKvC=kCWNA}+LkmkfoTb5Nqg#O8QD4w+jPy}w>S=~+n{ zN!j}Kl=hwQp~jtD)ioTUu#sXF6uK9#1Z=$A^Zl}iiVB%D#^dR1<|$nRo<4u^nSSqJ z3(31fJ0}eP-cTANO;oYVPJeU9hjQiDxeFBbj#7v;v=_ZB{Kbnf_bd3jCn%EV&j_Y` z^RxUsrh#xK6!yjwtCExykubR|*wSyO>AvYuFiWJjiZ#FS{Ivx1e$EijB-F=CIvY&6 zb?IGc!a z{#YN`s9bXi=-C)P9IM0Ip`)87{FKaus3TYk#KQPt^rov}&xif%%`v_&>2EgF3N??3 zDQpdxD|BvI_ND(Jq`{MfywzOOPCnB8QN^-}BNtA#!MafvgWo=XBqMpv-hQ)VW`(|k z@$J{Xqp4u-i~Tc1QXCg1rt$ja(mFbAh0`xeN-gOjHP0#Hg~>yNX!ZANwU#K(iJB$p zRg#r>q$pXkbQKq!C_OjtRW$R45`^@U_8lvi)g~jyHPDwvhvrq$P-y;k@xj5Qg)=^2 zUWFbnxwro~x-qQN`hrak(Ju3`75oN>k3{NB| ztb$Sng+?)@0PB7iR5qS~!k$d7eWc#nweRumbCAwkNg8P@{C+P0-pu`^X||Rfc+o;^ zMiFJ>bKoK5SJT4n+@ftL-}? zEvao)SNUD?+cmA^8JvMMv^O|=&++4;mR8yFG&PSdHIE^`j{f+~0(%119JiWdP;-6$ z%=p%h26%jGZiV0MhtR!1eW#!F*_b!1&|Gv?S^7Lh@3j_mfTD%CoqlS&Idyx*3)T~H zpVr)~YThNNIo5xsrm~UzPt9&6FOB~AYamU9N`L9oC8WRf={&TZL+uos{d5Pjxl1Y( zdd^K4bUJj5x7ssFPsARim2DdK>X1B{h|Pmw-KsD({|`O`2g0!Rs2y z9sI{%fzb1m9?v!dr0XB|jXyUu+0m7D3D~UD1qzKJ6?T1w57uAGc4RE9?F2oc=s?-v zG%v}o@!Mszdu)YPwG<47LU+lVp1y-O)^!;tS5l$qLMeWhy})SB`U`Sp8cUP6r6R66 z)PId!Sq+8eJN|W_P7n^v@Q^D9q0pVx^` z_4?Ql9n4U$61T8&s5zp){^CYQA$*YZ*?R^@dj9PC(yU}wR^DE;f^;GzxDJK(uh-7j zJUUh|lJ=3%KG>iXR6?P;?>$zW>SkaY)y4&BR8E3h$VghEVXD zCF@*%b5EC;p5vrxXj9c0N*gGx3>!H#AL(B%SN_;{B5*CufWF{JZxKcn_RVrWI*F6! z*ZN?rqCHhhb4#ya>At_`?w@xn2HmCko1~`pf3MN*e{bSaZp-7u^l;m z;oFfrE9A;_DD-Z3V8-f$9~xF{l`ET}&~wh?UR?KfNB7W9Fw18@6pE-uH}_JFPA_Rr z&XiM7Xbsr4mwzvx>2qoJ#FU#%(f=I(a)VdPDRSi@6zT_!v>$o5$?kDfuGH`r4y(2| zNJB06{K?|QecK=RMjGkl_V+VY$vk9;FhM*#Awm$U-^*c1fAtHB3bjI{^@tHCCeRL0 zhve|!PI{ZtB;F*yY5dKojGy4q*xM~sy0d9=Vr}2n1~E#~Qd2(&hSCycd(=ClmXH6U zJ+k`P3I36m%M6qDMCa7C1|yVK(q4chqLzYxq!nt8bq!BI)U@VO*Ia^{^Ql>>Ic|Ua z-JooaRP*n}{*kiP@NO5+)0*D7ItpUMLU9E8&T~J{&d(qCJxBYn=TFV|Ld`L_1XoSa zcY=#wTlg;5pDb%_`~Rj_)qH2wG=^ZW^B=eyH{i)g_uR=Q+CP>))u3HAc5fem(v0rL zO~N&KSCP8K$gEv)Tr9R^Oo&)M7qOP5`E3a# zv!~xG*ru=+{8o{q`E98sBl#=bZ`7u;->pl3drXP&%i5ITNkW0s$CSG2!{^RstzeDc z@5D);ng^%7ch`9}96QdkQk%jXJppCE>X-j={@0a+d`}2JpdE&;AV^$Lm1}8|mJG#; zwtoHRPB873`GUWGz6AEzOQG?U_t$O>AW{_yU&ok5kJ~U-{n{$jUE)5rCqvWdgNdi z`(yO`9m&>)zz7PpX{}i$>MuS-(>o*FjJ8PA9!fnZCgm4JIrrac(;FKb$^KhMrfha{ z3G=+Pr8fOOUh*dbf}T)l?sBxCYx=vD4F=NNKFNYoFaSyeC<`G-~FPu^pBuUe3k8bj_aKP1K zsW(b<1`3t!rmJf!-K3c)8`XzeE}0&3_`Et&Hg0Xx=hEFG%%kZ|B!&un&ScI>%2%x% zCe4Qu#Y2k6fW4?Zr=ZWoN0yQiR#Me2L#6$|GfJ!*7!+0o1^efe=8tcnGLeGv`E3a# z%{?ty>a9g-`{35WEgr)g>x#c?IcfW7qd}>rF0VCbww+?T8l{%xp0Xwzve% zk%rndSvmI66W3Xvk%mf*PTH0!2dwT@YIaq1k;Fg}xIdPSUf7^If?;9!5ehzaDRLwO+}+t_+y)9q)6|Muw=;#8-e-t>Q`a6`qoDb*e|^Bh9v@%NWrLq z1Dl4vpW8$d9poh01x*vjVYd2uO{rT>@jZE(&{XMjDE-N*oaR5?N#6`fijbHfOhLyI z4Ct^aWO@SydZN>F8=dC{OLNoLeckh!mGmBv6}tio#jVYoidSOY*L$F_w-q(~a>NFI zA%`?HQXKLV9asEujrtos>!G}ZLM?Yr^=T_l-?QiC`TS(cumRRhr;qfNy+uGx)rU!= zv}S(Z3uVJl`aKfcoz#P(4R1;QmjWISNFFWs_S-jIk{F;BL=omu3EKv{8L2N=LOTo0 z+aJe7Sx?=!fEk903%nDVqB???RCe-NCicb7-F6 zf9-{FMxrLhH@uUO+$D9PP^=F)9d-*FdY~Qih8Q%0LJ?Ii`Pw~x`-SaLXy}8|0t!X+ zdz`}dq?T?aP*|J(=GQ<}YNUy0-d;oo`j>Y+;)XO%=-B87=}>4C8+g**@0sTp+Izwv zM)mp4J3ZeVv{y-n|KGe_rUwH`Q1jeHKU3P;`|G&-c1hiT zfW3io!moOuQ2QJ{zCP&m&XNi!h^PZ*gEmb0`rNtq?z;-jBnnLv1zn&}e_M5K;qYZK zS4B|pQ!=_6BNJ1E3Al$w>=-m>^oSc(Q1Itw^ct?_*;4}EddDXw2pR`zUmCSXZHFqJ zbNIy^`hh1ab%up=^@9fakELa!_q4yh`+&m!QV?@^$^1a}_nPwg4t_8ohA7b0FT7Ew z`#1%(Hob*|H(@&7kKr$!%so$bA8L`<3<_dEGZB<)NFtt^H)=O|pt|AS7^y-dcACT& z{@z!q=cv6iI@0?EM|eXkj76#Go{JW5{aLNCNrb zqDYbu8H|X38`x7gMI$5;O$H%y5bW*F-L15@yV{_;6BtA?K>`FeL4e6%at5}s8H z<{XH(jrz?S)%4IKwC+3<`^nLM%6LzdvYJzVdad<3CkQ>D!Bpa(ptd3M*?pzuwq31l z7ct7=UULZ`ki+!*_8;`zR-LQiJO<5Z5^u{KD{z(^e8ydOe0ax&fS^ks39M;=3;<65 z*4cYbIqyTvU^F+48UgMS7XU&Y*C*TT`CgwPGpJu65b*vAND`0{eLp$lnzh$!kr0UI z1xf7>pDc6k`xib9&w+6O`4SMCdz!f5AJc!m(#y1$fT+P%tT|n9@I!Ugd8bZXeZ>GW zco-lwhjRKykN$hm9#^FmXU4U!`NbhGKAHLE&k8HfiXYfTb zpDotEYI;+8ca7TpfczFX*Y5S=PkW5JZy$y89w2K2(zMlvYxMhZ&>>1X-vdJJXZDKE z-|+l<7riNQU`Ki%C#_4<$)E4C@A6jzf|Gr;FJNOp$ig0T#d^17x;`UKX0a+K2zO(mSXOqH3G=D8| zjt7Kl?v+w{=gq$!Ptt*2lktsNRV23t`eueSLe0!u<#;hm@Z50=yWaS1*8$8M?}Kb4 zpGI(&u0;1bL5#CT?$E2(S6^*{_T$%rS)x}0hvs`9OWynT+~XdlomW4j<{FW~?k9?w zk_nv)wz+xB#YxEl`h_$gYl64!`W-p?vaMG;9uV3^1${H;(*>M0fYbViId45X^!No# zjU1H33_wV)pPkVErpnewk_{09LNK%`WTz8j$ygC+R z89?BP3`)ERNMGQbw#s#@?)m1#5sKRTfKbai;LMf2Sv+8iDS$}JXRZY^BzKaK&X-^Q z`PN-eJ?$iwj~V9$;81zqnKu3M?tur=Dx55-8OIEn{zsu9`(@Vp{6AX{^=kq3a{(aK z>OWof?t?%7RsX)6&(KEe$6V6eWj-r+ANBc;&&>IqDv!Aq%;hmd%p5e5&s`^rn!EAP zj#T^j^T;YotupKNKY&BKlfPJg%AaPfnEHppF>AcJJZ7A+rw9!>W!647o%PU6>gRrj zhM4ndgf}zJ(v_RpQkXetq@-qQ=JGU>kGU@~Q(JhN=+Q4Z=Gv!E-0bKUr3c>uvKBP) z+vHX6WM_4J1PJZOh3z$4OLIvZ;mu6V3^A9~j5BVguy3W=e;;${*|%>&GmShrOdJ9T z^*>*fKRWkj@1s8}h}j=40B0lMY`b;)rtgn94s$5J&v%B*XN}~?hb>nea*l#r1IYgX zXMW4K`~AJosz)lwGl2XWkkfI3@A8`uT|0mbSuFDz{K~d>BuX!?8$bq|y}?yZ7p?xr zMTHCcZL#EX;XzVaHwA?H#xuTnXZt(0U-o)MZ3jTe!~b-_>T_nD{a0F%mOgAFzNNV@ zITHC$e>!n|;rtU`-GqE{X)UJ!LLSN^)3<%|@o{(h{Wdgl1|S;)^5q)y-+AlAH_uZz zHvmF*^o$!f`tFFm?m31b@H+=59s^_@K>GLIXxL#}&k}tJavG5^`yp>ioL4X0`?LA0 zKX{$W$E?@pzR}$3zeYZ!Z{HtyPxD9DUM;+6I-NVjtk-6r&urh!p3o|1h}s_Y+~_;b z+5FYbWl0BPOacgvf6o2GGFNQ#@^*VN1Quao9I*H7Gp36%6Baluv%2LiC=ab(VxGJa-D!k_rCXk*%XJUSGh_&cyJOB5yONu?d!o7Z?53aChVYQT z5o$5*2efF$*-R~_-6lAeJ5vIy%o4qKwit@L{?xJ-I>_8k%_TL@yTsJCoFg`SC}z*w+|$p-t-*R#xHXY*{4d3Mq~pJ<+CGtZ@&M*M>k=6=pRH)x(mGLJFLGpFXc zPSf1eNXv}o4Ac+J$keU_n&%TuvtPp!=DFL)FBB`0pWfBGU$5Oe5@NQM?2g%1y#^f8 zoy^(WF7x^ihrg$A%q{r;zO6EsrxA-}w%3i6^cM?@+ljDN5WkM`i-k=jezCAkga7}u zux7jSf8Sa*u={NAn($PqXR6(Owsd!rnWd9F&a_(5i0w67f3sCK*J&dX9R`WU@7i0s z5;gZ(|9{H5k@A=|#N5j)-O-d$cP#VQW?$LtlQ&XQOT~I) z;m#{xxO$I8bQ=k+FErzoOF&kEA2R2x+=Js=KiUlt+Dd?RGw(8SI;!uw^Uqu7*^w_1 zMC>vs07APEFW>B=SPTyU^b zVf3RPkH6qPoTtU9DLNiiDGkLL9Gw1ZeS5*|J5Ss}a*Z{k&w)ex->%$p;f(68za_5a zsZ7J|tl;goD@1wvthVH`TmRB`Je3CvP+ki!aqQsB?`tAv$CT^I?dY(68*wDm@`&WP5ccUF~ z+L%u^3~o+LDN|{%&eC;4YsX){z)d#C;K&{Md>OBpA;{1(ZrT3+k-4I{-5A*~#GX@}YNiY9Ehm&~Z;SEINVno#9o&)_T0Y|Y4QG9G3Ql_g2T~ZB;ERQ; zrCh1c19yM^?P0SdHRx!$lB!g3U(4I;KlJ5^lY9Le5L!D#ogRFZsD(SOSu}0+5jWwq zK0_e57C`81U&kX?95Z&|0@OA`a3(Sb2%V?h`iU1mz46&KuzwUB;HKi{M5l!OeeA1G z%{}G9I~c;P8>D>eWm z&X+g`yuD=TjXO7Ck2AF^f?NRzY2x}vesR``hpx4cps=F>8G74H>>BdS0?MTPj!j zoY{Ty%)=MA6W2oDYAv7Nf@|-?X9(ItttN6lX!T|pJaVmQS#QjI^sJRvSpnzgSVvJF zvrVk#i&+HcUo28(37Q40YdhA>NB%0+hgw+o@WT}(s=`rK7efTP3e?fmp^!U z2|@c=3`l=KK3X-sY3Y?Czn2hb)%cr5o!)WowHv(t+z}@!h?%!TfkQphr#EkVS^qot z{|)2tjqhfz&Ak0@anM!}{@V{@$Nzm!`+2h^*N`=CNH28e@m|W<87rN-+gr~9LcR;6 zW0t{)TSUzji>s}*aCGyJQf`p-I6%m!SmC0xp4#+;_b+D%x>Vfu2MEdS!r4!(H>G3F z$`XQn4g!Ss8a9o7*!%Fb33Ps28s9bvId}8Ny=uP+4=ZX@0qF;vbuKw-_UYH`H-sVV zqMQN*hOz9vt=MOQVjxzIYJX18($*(Gv2(_3ur{-!{8H^{0Fh zN6h_IY+ag%#@vELmmrZZHvdkcJNusc(oMfUXt&;wHF{b4S9{mdL`akV#oU-f?+^l7 z%w{U|xYrZg&p77k_mq)f;Yp>E?2Qq|t+ZqsR zr!yWuX62WkUie=D0pszlk!3IyIO_ms$NArn8vEpw(_}u-sxttgb9$dme{!EKxA^t~ z34wI31!OHi3bRlA@XBA$gNKi{&Ab`7#@NhY6G80(Q0oI~Ph4~I>I;_p{TqsdX8@tS z5zh|)wAWrwuDP3nyelEEp77v0YyIQjqW@t_VYVUWwh-I4*-`u!`Sb$^tBpJNc{7k0|M;$L{>wFFqYW z7D-;9xE>&6UAmH6eRA}c>wPHmfkd|gglg{1{JR$p+VqVrB{gWs?&C3q>noyR$DK)JhJx`p#LSmOqE?^`PumAC#tUa%u&IQMOeAgrgj(?P zA9pTzXT7~|mJpQZAwYfF7lxs5G~7WUCfrELzZVkdbO9fx@e-P1#WY(_JG@*xdj`17u2@FUIP+q zE%|-g(tTq0=4W@GGHdpV?_tCO-QiOg&jZpQvVL)cd9P2nu>hB%pAnZ zja!!4!kSBJhM2iFbMVgnqAlFl_3`)xJO412Wx#FD&oG1Fm z#IyT6^26`n@x6fI=tu4rdL8k}(aZGQCm&_8NU{DXw_t-sf^^I_{%e$ndcenbeBhb8 z&m6NCw-Ro1hT29eG5D~MfmwI47@=)=6pVXMCjW&y>9%~ z=8Fy%KCGh$T)O2kTM9#YP*SrExnREVYDzy||J_TAW^RsJAb$rqX6tYE#bSLVo9}|Q zU><##+d?C=1Ut|se0EMc(mqws?9ZLu?ekb${Q|97|^YHAD61G67ulEF|@ zdC-@bHPPHNnWbaUc(maEt$boNp5Oj7b6}cF8)lhHGyDGL`Z3Rxm~qUl-n=ej&}(?> z=6uYxZN@S8w2f$pxi>S9OB&(8tOw?jntO~`f0S+2y-x@q>6VpW?dUq`E?ViL{uFJ& ztfOWQ%>9B{6U`De+j#TLPmk-=+RvHw&0O1Nt_^kv92g*|1+#QacC^`KM=>fe+1LkIAK9EilkUqfK;>peKdEl)NY5mkm&5U!-i$ZQ!OqyEl z{_)TaMLx6~dj%k5El;?`duGc~d*1^H)g1iZ8v&tPPrjcw;@c;^@x+^~Q?uRazlE4N z9l6^RONLyyUKem^^#!%?^-Ch3_F+d{J#g#A*l+3ATru0)jY>~6@BaQ*cb)KCyhP=f zwAagGhH1`ON58rKrJdM~>O;IziRSma-uUSKQ(kX6=X^kDy%Du=3vg&v^>fey!P{5)bC2)e`)XPhfv-V0W)93N-!pd+65Z+Hbo%N4`Jx1Bbh{U7ZsUPs ze0s)Zx9$JKAD-D?axjd?r^(h_s_jp&x8J+!L9aalh^*7vyrb|9^VlJ&p8dVI20wIsl=yw*3cAoLJnug=S=^p<)gtRtD_ZbpeOk&w4MNJMBN`kEC@b+GB?D zoD4``KniCc`s{%ptV?xDT7_DueJu?TuAkU_4vd3&q;wX#lfCiBeeT=hRIyVD5S|yy z7dsM(eU_~G{Vi`z6f2QzDSq>sD9>6~|L&W$2i|lQIFPl_EFp`FTP$Z0mA1aSBexa3XdxlDH3@3{XS}*-|EJ~?*CaRK)V_S?OSJZN zF+iHhie2!!uvPspy!pMiE}Kg;S<;TS6)Myi6EhE+`q>NXJdg%tINnx4{lw~<;JPTN zsh7`KqRokz*U}gQYW?33`qp*AbGaS%o_mTcDR_%{3rm)CLy41n@#L`=Z}`>%#dXXp zS+Y*I01mGdKXBi?Tl25d`nIGtvm_vDZ#dcyYt>-j&>HfM-)^2+sXKXv!Wjby)#?28 ziZB0X%(^=&$Q}}MP~Xo#OcnQj3J}=`9|A}p;7omJ{EWqy-A}TX983bFA0V9z-d=Ob z+P~Qw5Xtr9fUE(?Nh7~2&-?UF>{s@2ws}*?I=Rd>-QUkXka{MfW~v`viNrfY$zrKc zyl?mspR9Re8)+}yj|7~K)MUJKmo5G2hw8^epZ%m$DIQt8V_l=pFw#&;x{|1MM~BgZr<~gvL|N4P1T2mW|H3{bS%zTY!cb-Zw)p zGk%et(r&xVt*ogyFxz<8kV4C(L}Ks1U32D`k9J+8aMIaiHs4xEZ1<~`zn}E! zO=5*zTG&)>GFr(q?;JO1kF^dXO_a4A^H!N`Sut;wNj>q}*a&B$JSsm$f7$=AACdTg=;D5+~-}F{z`m`JiV&4~YJpJR$8(G@pao_w?Xv zkRHUgddLU2V!tn>^VWYhdtlw8o@!I|la!E+r>uC$;!9V1P(jT0AZEv!Z1o1M0tYc~ zq=uyO-5se) zy8WB#wcf(EgrTwFH4|WoH8-t=NgO)nEL_`*yhIht;kIMEW}`eI#t}j;r7D*UIV7o+fc1>$N51=;aT; zaNC*mTBmPEAB4}-2bwtl$&c?m=7>GSE-L1_wd_sx@|E(OS;wz^(vnja@~dA%$nVXk z^3(w)KHl=>^KV`Gz#~BoJQLe3*?cCOZ!4d7-Gz^rr+&F2bHMiCTyQ}7OrQG63kU8t z9Q&_j(@tFVv9NrZnRgwKef{Dkit89z%aV@$M6{p5|M~d1?XP~p-+zFT9<-g1TkpTT z{pyJ;ywfarqgL|C-U9MT$0HXW^uhQi0U>Jegv=Ip*r&ovdvft|2W_{-1H+jb`+T*t zhR4VP)zS~7kPq2|yH37r&Q66>P^Uh%a{;0L^uFibZ@H#?2TuI~ z!a91Tgk0YI(q5Nb_3a3W1Kqg|kp94Va+{sEIq#^e&}%XWkb!{%KnxlWYF<}`HU8FB z-?-#}uf8LXi^_vuW-@9!S!hjc(Y5x<8?Co+9w4;06)g*^r|2|WTX%S8kK%*-E&C%N zvXxW{VxQeR-fEjYv&*kP0)(t3aL!yJtk^Pd9(MSlpM5FXDUYhpmyi|TxO#=eeX9un znsxLtKxk}s{FqtO=QfS{7SslbCx5R8g!;xW#?9U*z2Y{+f!uF-7a%0-=Qh4=lj2D$ ziBS%ZgC7E9H9*o&Z*{ilyoyge%+k33vGc9Z1`+i*VIP8R|~e*A!)4!wP^pU$FP zR3sggr}c|76gP*){rKC-Z@P`<$D&8et;Z(=~J&RI_9~@fFtdJVXTQdHA5c#Ov-w~tn$=t@4iEp2VC#@Zy|%t zS3CZ=t$sE3Vwn%99SR8fe6MY{=D1s?U8{{tt^4)F>YZ_xf0;KXWV?cRpYD_Jl4rn|VQ>VlmWNntg51$LIdiT?N*PA!shkr5$ zI8lq&8NU#-{YZLE8ccrEC}Fv*RiEzrN}x9lv7;bR@RsAOV8J=%|D=qKRE!3At_k>;?CH zGIX>*k^tAo1489laM+J)?f>LShcIuv*YI>e`T{a(zc*fNIeZHm1IjUNOr81`*4Tb7 zmK?lz{F{&5fB0fCDqx9TBO#YRK6~-*yIg<2ln!{K)!1wvp7ETOW^b_h{k@q3Zoy`a zkCB_?ZR>AD%X+Nkl6hCJIi7Z~N3Q3_*Rs3_M$x&oiqF? z@`R{oLYwRRo#^YYeew0(OD}J*Geg*3n`?Vx;H(7RmUOIn%o77AyapUl|%&oy6M_feH_h#Dk18W3tfe_H&?Wv?&3rwb62h9J8ELUP-8 z{WoskZlkMco7JU zFO6yrJ#7p%S)N)yL^7Q)YodVz$T~*ji360!AW=Zf7S>G7&|^RbD}FC}=fq9Bm0sKW z8rru``WBxLK~QrB9fgH8mo!G!cCA7_@7-Xl-1PmFzC8m7`7U>sk2>%_zZ!R*g2ZTul#UrErsfC-ay#=!p^0-_=P!TQ zoJXiNQrkvJOLP`#L08-~pv z`|vq;{UoIWYB92wo~qeTY{cs{c(>5rMoMbnz*;{&lC{+MRH7I63x7QE-F0p(@<}xE zP+)grYJutp$_0Wwb6cBZ!KSTd+%22>q&dT z+tTIQ&>A5(b4jn+M`-W1U(CDpi9W;H!JD)pX1N{Ms~7iKW9D4(>X4tVe_ypzvmO{M zYcod&|){nCt;?ihz($vFkUtSN{F^aR20Ryv92%?0iXWwd*&z zX}gPlO*2{2`p2|jjM=E>%(ZQ{*O-oEzv|=tZz><(HNMQ{;j@=ZPzzMjWe*y%-_y%q zHy;pc3&^JtYKA!nw5*sJ8OjH8``}l-_zt4ZLo(jj*ZTBj-nh-x-uS`10mpo!QSFQK zTeAJeyx4NR*yCFF=09%q&k3g-uI@Ve8jyaF!QNMl?*IA*&-GW3m6q?tv+i@YsvN({ z%>#HOF34>F$N=DM_4_mayut3n{|&COt~sKqx!IhLnd^%|jeN1McKzKo+dsX{OvS;q zl7q>wez9Q24{c{E$TlkooD2Rn{o#vC_uWo%6TF%8F+*xO7%i!NhkQsn*WTW5&V$cv z(yBNxQ#)@((SEKyWc;ap-@6{OY_hq6d$d@2YTBu*;+68L+=NOA zvv85%m;r-_4=87+d4<-k2aFt$%4OT~g;w~R{I60@^Y6U>_P?t1=UM$RlQ)p!R$q9< z=p`FYxwlfrLp)Qx(&5h!IBwt8-M_grDLj!AM-F?cSJ!Gkma6$=5flcW_2`1qM$0|Z z|1L37-hE2ugY$k|do6;O0e|feE4|b5%ulnoknqQ^`|Q7eSoM@yyB#CE?`cijeD`kO z+dmiy_&SjC9leI%uW8;OKHLo3HrM97v`M`POV(GK}9@DCIITU8!2GBsn5gES3ifu}GK*a6D?F zl*;Cl2uPq7Lz(-*HZLDZfEXsx>9r)&xhy7OWdbdNZZ9bhY|G*N04lp{oCsq+IbG4e zlbJ$?39}KY_USXqy$w8#bgdMz`10qGnEa2I#Xp3 zO=WYPm;g+d%L557V1;Q?zT%@)sG_74)-c*Dm16mK0|(;BZ5B5LbvI!pdQ!QmP-+{f zr5c#jLrK~vF?eKCrEQu8J(?+KM5B_pPk=^gAf$uFmAsB@R}zXkQ1I-`1!W4z<2woF zXsi#q<#fB3sX_yDg+kd&dikl?!r`J9&{A|PC^}_e>cJ#@H+X5_gL}_G1CBm=fbb2*>P zP}OZIb)de$4!)CgS%j<9H7x-YxFIQh4JFAJGF~X6(3Q=2SXqZR!!-gb zVVn<4!5|fj>ET0z7<5?Gu4Jmz5sB&2(v++DLOH3&z)&|23B_RZ6Cy)V zf^;_3JS3o<_bM&rOemEg6-t%LXG#!Qh$}x%=K}Y|c~Npfc{Kh-TwJ-!&7%f&1>6;i zUOq}sum|~Q^kiAXkv@arSf9mktY8QxHs7X^6|tpkIX$%|wj*0C4z|wli`MF$#Ms@WVna4LXrioP`HP*LUjjPp>Pjr>B<38da#F-G}Qwk zE!0Cgnp%U77V04#p+?+fKt~HTM2DMWK!-yO(czXA(BV)I>G+xh(*inLsE2fXtr2vz zP=j<(7VzWKL8ymxlw}1O73d)qWwJp<1$szDXbV|+P*H&%Qc;}@sHi{>sR&VsS_-~< zNF(SH!AS7kLmEO1f{)<4AsRwc1dX2SN#GQqEWx+NM+QTxf#k=O3b|ahXz4UW0+10O zaPo)Iv^aSnVmwLLxO(0=nNFtCO=JY5DL=ZzFq)`36nFU0WJh^wIs*3FF(-(?0!ab2 zEnl@jJF4Ye1g!Cd`)*pY5pY18C=S4P4TPZ8sb&dd(gTS-3Z`k5LcEZN?k#IHu;dG1@D2q z`x(S_qZ;L2hb@IHVoKoW(5Su$Ip{r0v{<+-ykeSJ_`BS0*!V5#IF>|SjK!tD8Nq7fPSS{0FyAN@1AXELHo z(3$t6mjd-#$q@0MBbQKf4#X0QZJ2M}k_4pn$c8Cv7AzpF#c6cMc^%kAkR6yVlsx|% zYugpP^MlEqmhSRE!b?^w*_;n1yO^xBWAQXo9!JQ@l1wELZJHOC9xQSu5?!sb*$73L z^Jx&HnB>Cc6RtHreliwl{EJ0OyhG;dilnS0pTJcd*N;t-1}goar1j(JVi%x%HL=!&w#7rxPHl~$uciGDQfj#OJVoy625mZ)iVCZF~) z*s8);k&K&E%4XWUPA`|kDnC|?i%4WEL|l4g8Q}6Nwpex5k|JMPjwa%Ijuko=>I3S` zHH3qlLt$t%7LHjz^?YPulQ`3(M~n4tS|(3JV(B^=h+u(*NDQ=$?!|DpYnpU4_E?l$ zGsG-b!D$t~eoC60K}id-UYF-1K@XySi2{ir<5h6*5Dr=k zHkPSfAevJhiWXju>}o@hu(KKiQe&bJQ11mp0NtTNza9@$4rx4GdTB90-xmpiG&32B z4|xHWR%S+u)FZyQnSI;;WSqXVKS`6#^MEV!MCiI9*ch3!QH)eJ01X(99?vTLNxzmu|+EbZ-W!nRk7dQdWu;neg7u5c8@oJ-mB zG9}oRLWlO1?I`BFt|a!al|2jHvYrkZgu>v|z3WlsN$3G9Z~*8)w7shmTmw&hu;<79 ztJridHc?x+R~wc=Lj};&j}rS4iH^tHx$T=LMH&zhAG9?Q7dc5+q1f(qc%=?p5yjVf zV7nHytb#4Eg<>UJ$m3Wyo(jdT>0~Nj#wN_JO0q(JL%LMJj>>W|)tRSj6Owp@6C1d* z9n}*4hZFhjGOuzPi-fsC1~E;@r_IA{7kpVt7UVKsYYMx}GoDvWdQ+;Y9I~sHQaSj2 z9YoM)M$jsy$BAv7E!dmc)QO9CTC+LYb&Q?W$uypL@noJ;v)~lRo#~MuubfWdkz?Uy zi#r*L(UTdyautT(vx9_H| z3m>&!S2{F%_mIjR;Tck?Qgt9AYOizcwy50rP%fOPi9U zbq!HD=&@+wL!G;RBl6G{161`O4e7~dfbj^DxFaJ;8_7FT7S3&G$Sgz#rcLhrw-5}P zJg|drHL~HGQgE|kk=lJBZy^*(338Dbr~&?C$Gjz#6XRSqHjq#{RiS~Vg}h26WGXQr zQMbZ|vm?$z`Llky#&LW!6R7+P{d22D2kiszD05fn8rszw5NUKkLVi)lK^K77dmDpM z1DU9uL#d@ITBIIlH$f{d8vIdR*x8GkYS4;C;lPTlQQVDL5fQ0Dw-5zqfvDkTrGDJfZ~O*U83{veFCcg$>xTq9xUAB0zLL+8Bct2etbs4g4bEX z{8Trv#0TTJ+5*f9O>EE)(!0GpI0{pdo_?UrbiM@Y!`)^}wYAkNS=iH3fr1ud?QqS9 zL>(HCkgg5*rYT+Up{Ic}gPX@}{KTXdL?tR4CH7n~_e)+|Dwp$eA*>42(tL0&np9E; z603pJDb{iYs?G!#nbmJf)vIFuF$*WNk}6NOa1%)hijf#5>N3LQg-)S@&@W-QdzO+{ zEyF#dB8V@bkqc$FJ5h%g=)xl@rMY5Q@q~Yv#Dqt=UAW$?R^*n_MRgWw#H2_;qh=R67nZhBjjaTrC6@q{^_XAiLGV`~zDH@mRuX%ETqNl&|;#$Fk}WAuj~ANK7RX zBqRnmMpxs}=Ffnvg;0IC501)>Ikc8kzKtfsF#TjZWE)8df{_^RRk#v;0FNy#WecU# z2r?e4xJxH^Yyy`W$o?lA1eOdhh4a37X?l4Ooocsc>Zo}pe6u4)EOR1*pEtP`hcrlxg z%!2Q_y0lCoP1{hYsra9DwQ;Y^v$8;wUtH;~F29v7RIV0*CBIm=x%zSiOz+`x7Jp{M z>%u8Nn*-0LMWg~fEyT9mr4m|pz}7ZD)XsJL%3$bpw*!IexUn09Kzn~)2>DaqketQKt{0rgARX#RQWx7VFT&@;r zVFNF*&}|nM_QMH5GaSJVjEfyCG4T^R!1h1us&S29plTstOK*kQMqoF*(vuyezuLll#k6)h&7hbvg_$*0=9QVcw# zpmZeLBD{Lg!EOynJLmcmV9zqwF_Etx)UxauO=jLNM152$L60oI(Ef4X4x3Zlk%ZPI zuS*)h>m*ovpDI>P5r*D{!Wa#O!tg*tVXW8Ggj>8yDj155-54Zs8Xa<5o$ryx5<_t^n&wsFn)Uv=9uN zq-ZI6kQs1;Z&aULnBwVhUN*JRP>Dc91-NVEPJk|hauEsAfJX3*BDg15#Pb?J6Cd37 zu=KIkmrG(FOq;Dqt3)J$00VU>r&9e}Wu2752|+C!fu+-D1IqdNP7XNalF7d>e@K6sy#Ay4F-(%Eg0b{6!JOfY-g*B?t*}xoD4`RrPy*;6x zh4)NR44*Wy`4lnq6drg}0gW+Bg~ibG$7Ev1Othz#mQmp8v%k(v^u*v)pE#!R1Ln@{ zLkO8=oQZZ#m&qE7o$utwg&bL%CN~48-%|KEtw8bPqPc~;)Shoml02r3^t1z~VDj=m}8YE)fSD0!EJ0TmbC)~n*t>~T$@JU9>+&1YbJaba&C-A@>t@sA>4|G3(@t$_NTXca56 z7F*7-RX83Hm%Tc%z&P$vkRl!3KJ8048V>~u#OQ&+kL67S(!9V~?0ereKpdOQtD4tI`65V66f;IoliBB~g`!k5vRG4gNJtis2sqNWk zB?!m%n5fz^?-yLf^n@6jACTZ*p1>R8>_~-0VH3ug^B3c~#ybAxPGO4IoeY3 zeZ43rW;#UAOIeHFH~1pY$0`LkGn|c*Of19V>R>GG%ANa?dttr(%gnj-wi;1FX0^cy zUQiq7a^po{gN{ zVGtVsVk|6oa$53(+{)c~x++C}!6+!rb@;2b#pDX(DQT_jU<4!`v~=--im)>^^)5Au zmMyX79I6%xnu@m+GNcGe9NfTJk5)_qTgor9wIG8T3sk74(-aDoj^kdD4;6~&%0}eo z-rog5a+BIv+hk*bzMl|@ z^&Mm}hLnVY9@ADi@feDmfQS&3v*QlY^IauH&W{n5+(T;8N7AS%uZgw`+YLo%I0+h| zFpZgM1ZO89rOr=Ffdc;m(>(@|h$73_ca-YX7^V;~&o3tl3n_Cbmhg@h*MYmzRay{K zfh4BvU>jTxH(t4+e1Iyy*x);-9fW=aPYwY+_=d@&LszH*eoO|p!esMymzR&ug9QI3 zu|zyX;KLvnTMDUC2D`&Muz90QCs$=Z$2%OyP4lqtN^H~@FTEvk?^1@|P;19|@}%F) zu*^qWnRv#aosPR(q*{{}jMc=|wSpGrfg~Ja3L59$oGwHn3l)e+hUvtD80>f8el(#k zyeKON8ob~K-o@E`vHVw%hvqRNtzgubM9+sOj&NavbtOC|HI=891`0(_LfPA2m=h2R zM?eGRmKjSmh0EsC2nx$Ryo(QAR-m8<*>7^$5hZnCs{k4R+*DVe&*?LCm{fit%Vu}E zTe@)q3P}75N!2l5pf?g=%H{$to8_{QMa+6@1Fjwfzw&4$Hj(ptc*#_?(k`BA3!{s`>-{;4s0!iLdh{#5DBxL_u2}TEX`SANY#!DAMN}7rlxpXEd79RWuEm~sq@FgCrS)QgfF5K=$|YA_M8MaBb(KJq zHpxNBo|Vbvva4DHvI?kUK$e;asvfApH}mW&GcGWqOK*WEzgVAK9t~P2?jUWYGdTWd zT{V<~!wekyL3;Ou4|}pe5FTx?{mvqZmO__DZ1FFKjnZzVu`rcOVOmz(ucI(Yp5MY;9BwAa;#MdJ;c!Bb z4oAS;yM?FaO9T`bI7lszdOC_G1SAV40uZU&rm{%U>3dzkRRO57J7295fUJe;YQm~A z{hYaGxdFPGf?j*F%)ScH+$_8w3^&laa7QZMc7|eL?ivdq#RAR+SOjUnKn?~-U0sh> zouH(JuvOpPR|m=u+~Auw`2*KJreXn$gFC?0LR`77@jMOZ`H}(P2H#{kMmaMM8ZJJ98v*@nonA|}wCYHMjHu`d62st+XabCgqf~&E1e$gOdD0tHdlEv+c)VsvwW05ZYZJn==N6<9sM~ zmEc9^9LiH1mjXNG%w(LQ_IOzu9uFq9rlJe5p6#*Xfweet(9%&Oe&rjFGgtXz# zz=B*GuXHPT0UISPOj4(zBAfu9=N8A6agegTo93A4lo~X>ki!8!6;0b!Ws(@VW;^g0fQ0jE zl%(UUk`JT#QXC8H4s^^1FcX%R6G{jD;`F5W?*89Lt;ri?YT~$ubIm3B6yr(?qH)on zD`yRSo+OtVc=-GaIaq$K7OfvJ%* zqIHx;B}N`9P)n6h-AZF7HfhvBy%q_%)JCe@>Yz!x=tv&;fknd-FL$4Q;XAS!Oo(@) zZm~_Sgr+WA1vITvz&X_<<={t>-A~e5CLSV^=|of^)1AcpOBHK5*ISzsWC?JGtj8i z<^!)%93gYgsrj5mFpx_mMrBej)1pRvenkjW{5|-7&aGYrBS9kSFR1tswk2@@mPtEq zarW|XzcEOwmn9v?XH1Xlc_D=Y`?N#|RNRy6#zKNtO~FBNsF-*4(NZn6$V96mw9c$L zE4_X5npjk|DAq#q{beeZ)ZnxkwDC(G^(e??VDJIAmOWtlseG-MUFm@1Ft$UrIp)^@z^Z5gTJZ z#R$Lk$=r9D**gR!;U&_rqYh)_BZu8&PzguWjAGKI?qa1t-q(;}!-MXcsD&Yul*_GY zKzjjGZDMUD@W?eV#uIed-{(z(h-<=VgeTq)z*k%{Y>g`=abZBd59c8F0U%=|+1zH=rW2c^>G3b-b*Nac8>QPpXv=4Dy<}aD-wK_*xeO z!Yv!6IGUJuOi%XH3zeo97Dzn0g6pkb=bH;j_wHA7xTytOMT5PBA@p#H8UoB*9oCa` z|brRn^UX|4gQuHdEYewI%MokS_Wk4<()uWl-g_(jzFzsYB~9 zfO>M2RS(wZrpK@XIvQho7g`irL>(4W(u+)wfm|e}K5Cj6!-FU#cHeIaZV z(t?PHvq@U#q!yFdsf|_o;G!Iil0xkIl@N*~WgSivH;!q0zk$U~&g*MH$i$VTC+&ku z5*`&JgKz|sb8l1&>M@Qzta2F`2Sn#rQ4y<&`tn!>#*Z#l?7^C51O+@qVtQP-fGsLd z5a=G9VWFYq_ z*jh@=RtgaHcU53liae8pCmwO(XR;+*!Fm6j?Q*9`N}?9VMcL)``W@Kkggw?px(C$4 zq@E1q^dJ~?7t${yM$5IENr<4>149#uwQzL(ax;Esd#cjehKIj%{%)Bd!oqw_T4bmw zVF!)eLg%ORTCy2>`I7EXW zJUf-nI!~DC$-s&pr2U5O!wpJ6VQFDLN$!%WEuN(gY7?6U z8>e24f1ykxak>u95WS?D$jHE}-M+&Lfa#7WKcWc)3yb;5O5}V=+jojT|29zmR-id%Ke%L&? zCh_EkIN-@IlBdj&7o|Nkc{m_l-CSinQ7C32xw>c;Lqi~9RnYiIUQ*qB%hhUL*L3$>b@L8~SXf_J}u6D<=n6)q;zaqYAZOA1uN z5v)G0<`F(h2pZuCNCx|3TxuVxKhOw;!G_#oV-c>d4O|eV9E4Ao71>8pno0s+3$Y}f z*t7?O)SYnsZx}82)>Li~0@43Oj`Gf8Yk~806=WGRr6gn8$!;&8e%cacxpi5=io@7WD;Mh=t3!Rtk09r=%wXDLu$l>?#3S z8caKKmn1)#2bbKj!bufHKXoYt9laxzQZ<@*UBTqfZ_^!kG zTDJpqEyUO^4beI{U~3^@<5~*wI3;+R%2(A`M29=ZWg^f~0aPnGSSEwhgVbV&;P7BG zodGS?;Rk8SKvu_sUXlfH*^f>f7|M`hmQvyqc%wK3b0J28!70A4*L3K7}H1b5bbW>7^#y9}bU89_2|= z;pV{#M2~<%O)zqylY2N2gyUo7tnH$)P&VKwngybmysPzvg#jwz2ofK?NpDy35YwO$ z3WJ1HH;QH-litoLcXzZDa^==)UYxhU?P{>xNtrzkPj_IVe z@Iq|#t`jb}%5~TAwu%7*JR2aYjx3fZR0z-tg-L`?GZ82!u!Cj(~y|s*8s})qop(D;Z?a(qR3CGQw9X|85{J zM#6{aZo-+QN#&*j4sYqnKu8ZNT9&$LE3gwoKS=L3fGA}Fm&$T+@xhLdtAkOd19&RH z{JGj~$cT{b1BseArsS$~NK%ehK|%$%1U#O?Rk+yPpFz)6q=^XoO*=sv5DUJ+2kt0y zSfU^sUU#1T%8-W}~3@2%FukN4-|61^BoG+LE=F3fXBP=o5Tbmau*-BS|+^$fGVC zFJ`{9(&CcFw3nKi!fnZPg$79g-DIhh>Mqkgn8~SG5AG-*4$;DjY9zAI+KOooFowUl zJ4XlvgBrx(_+ha`4+>_ddVbHRF+wlOkqH(ZKDux*hlIIiadmB_9dlQ32vAYtjGLc= zW|>4hMxFF-0$nRn&f#j6@DUXRN&HkydLwUzm189^VT5$q)8h+-A{c-ckaAfw{e zFZi0iM}%D_#UyUx#Ff_&jQoNCqB@LltzuIoG~19E)4f{3WR-_vRHfHMi)z=S#jfIN z9=9N!$!2dM7LyueV`7;#_AsQ~;@0E0 zL`x2)28(P=pt^(~#|CJ|MT4IEmCASn2#WCl=8^ps+%{LvMhs_?Oqp%w+l+)9%|I@R z%fpJaI1r4)XjIS+TCzA$T`7x(MK_jYRBN@=YixSt6&ueva@PcH7a7t=p@2(+^KuM; z2=UaJ3X6`w!US+c8e|-NtIRBz5%UWCNQ@>Vv)hk6*+h%%g|((O>~cPdS2oy^Z~m@} zZ(xR`BnX6}>ZKDFzaSKj110x8D&R=esHDK^RG0Lq{Y&iwt`@2bTkAulodc2DNYEn3 z7k($YXu7?+2`)z9>J@D7pT;8~mv{i@B$lIPBfwVX3f`L~rYx#hn;2QtMuNOlEJ!>> zPd5a19uY9do@zKe8JwNQE&{X?wvfDBys+!142O2P)1oN;dqPm!U;h%90A_ki<^Ek)&>{kd4QM!!X;)u z(N9pufq0C2Tne#>v;fRmK3CgzHk-nq0+DERG*}2L|!uGGZaBJRJ}v zC@zqwhn9H+3Yumh%Z=67BDYv{jCxI!X@#G7cAbKZrE4O}^(34DE32`Cc_tbQ0a;?z zzQ_`q0s*a1xGoCR7qX8;ocP}?Bv;;%Sq#FbYj@SWM*URu$q}E99>*ndDJ}ctHIpwO z7Y_hUxzUJ|V^I7f8hen5#Nmv(Utvpcaa%*X82r2AYW!G=d=WQHPr+6ermJheGKwykXL1 z<<%r4cu;}5BoRNYNpzq(wey{z>2Btc2~`k_#DI!>`M!3dRuCfn*QUtW!ErTyRVzH{ z9Q1;*@hmr&UPmy4ek?YgDY|q)!}R;GXjENvSbgH>(jh<#l&QN~PDnYm8GN6#oSfAs z_v_+XU-kekJ;+m+uKLhcP=Kz5ko!od2azset}KaN_q=qeh4}7aJ}oa^m*Zin#o#g= z42a6A!c|8UNa648gFynCNq0!(lR{%E=TF(;CIakbyBCC&JHt({8Q7M!QVdXd ztz29lYGFuTFA75P3r&WO4zSqa{D3)6zVyh3gey2WdrSB5irxR+9k`@?GOnV=lBFd( z2PTQcKi3;io2`+{y-=Kjpb9W<9qz4GX5fc~0Qq7MyUUD*tp?O~$?@^M8h>A#Fm!}nek${c>I0eRcBg%y(`6?DNl}9ba?1hZx3UGD)L6hZ< z7nH&g$zgt{W~l+1!y?-OZ2wb9Q22Uuln)0T?J|^!Kt_I{1UQqyRY*JZT4|P{h%%xw za0aPczU!3777%&{8oMya;I(wqzEHYa%))X_T4Y)i#{zUIP=pE4iNvVB1x^xfh2|SX z#QV3&Txwdka1rsOS!-)orj75h&16gT0y(a#}T1JLw;d$YtlJK^m0A0C4 zCtm);nL(Zts^;l%Cc5S#d?nhzB<`w1eIr>0r`Tx;P?$=-pw3dN+QeY8HjR#-t|twKP~ETy`y5Qjm&9fsWhB3d;{v!VzeUr0sThF40WPhasSN+7F%vhfz& zK>dLleAm^ez$Kab6kUE5e1l*2oLSKJfEj$VVR7|_ngIr`7OJbPnk5Ie79z*fJ)z&h zuYFRNKqXe8y0Epr1=w1MjUku2n$O}MX6ZU~max50T$xXYE3Ai0YSJQynmBOjz92uu z0;q(-N*BcyLrI*j#B;ThVT+E%B_|>9jj~}XDh~_2jubBXf~5ux{}XubS=J0X0NN}E zJpU7#?w&${c4I0ZSmJ|ublE5*#q@!|p?L(-FV{cU<_yVb#sb;MFJQS3 zIr3{+z~NtDNXcQKfy%@Lj79X)f#nC0KtT_3GpIu>aStj9ImJOh)h#$;BkuL8U_@mp z5znXjQ;90T2E|nx?Y%0LKnpR~E^N+>AFKkh3e;8Npss)#e6z~9lq~$5AnnQ$9Ua|D zKwhhmCGHfk$jsl@PhKS$(1Xmq%bCz7oq?`}Fr0B4;#{eUt-E-t8MwhW8nQfJP%L{@ zn5C4pzxLCBM35fhb8lAahK$6?8~KF-Q%kjbEP+swU+~TOxvERP&zR#G2EUH#!o=M| znDW5ecO+u}yFN_J?(*|_gz0~?fSuf;aB}d+k_|%0m)0iiQVPb9zzx1xp7p54V!$>eIy5cmHsdVk*5Q1nT}L%7c1$&3+>@db5HM z{ZAmuS!jL^hn_;90~z!*r+J5KG$}EX#VHXDyRM4Or)bIve<2(kQ*qU1SU`lSO{`-o zhWZT`jj+f;BOJkOv!Rp~VH97xx3>nROwX{?9(1raU8ei@gJ$Ifs! zXwkz`NqRDn(t}(|myLj6D0?9yW+WIUTXI#(4MY{-99=hG(~1nrMgEZgNs57%igrpd zd=!bAbjmh!8c8XsX}BON583hTFWoqRv+`sI^KD0DaQ6)kcXA}IkHGL7BWQSOblo3L z1a;x!o5|QF&}LhRh)WJO;-bNedw>~c29&}Pbya7$c%TuEAng=_wp1?f+6lHxXd&(= zT?(ZO8~N)&E`iH>Wy`z(4pjNYSgr<-p-Kt8FJAfqq6%cQFECtB|3+F*MK8ilp?sy6^(R8y0P|ZjqGWFA~Gb!D2;YROi|( zHI$X7%veZ*`MNyE5Pe40@>8{gWOPs!7k!pAI3d%Sz&bgMCYITSDR7=Hk2RhhK`(~S zx@d+g6STq+m==%*iMDyO+h?hcAPwjQ-%P^QSi%|x^l$`MD$|g=xx{v%G9)4rlDV@m z7D^`srtp-UkgS+X;k1HKB|AYqr68%tur9miox+6yk#Gbv=4$YIJ0%KqW;H1%4ro8C zOY&Ni2f7wQ?(Q+YG95rx0n|C&orr#{T&R|??*iJOzG(iI9)7gQ7ndM`ApQ!&M|U`E)aK*ox+5}Owtr6 zZHRVR0gX=(&_ckLZPmhYT**NuE}H3aCBnHIh-t7E`}!2604e%`_SZ2g3o0lq2&yI5 zQg+xp06!d2mz!ZX3RIo0s)+PoEJuvv)s-tOLf7aCe5kGjG(ure80?e=U8x8}`l0kv z^lYtp!Hkze@MER4I&0S=>VDK`YS1hKmc*+A$i~guY$WR5CO_#V-R=`yO zHZ(3XMTd)_h3KF7gH59g$6Y=3ObgaX3{2F-aT#3Y*Q$YN&;v@MQXsu%OdP^o!hDnQ z#^M&=IVpQLOMQgWfodqswZc-8zEQeRw0US+Dv;7bOo)3TqM)g(g|o?Y(@>!mgya`Y zxjab;4Hs^;1wBXu0>L-LEU%ETU`AL3ek7(YWesWq_`x^#My?)NwL8k1X3Dq`vdXfG zU@w6@YKVI!%GnC78DW1~)uZhJ{6QO!`2&*^vKnYW%bFnoRl0&yVwq->NGr7jxL+D8`{SDq1okqy_6zzp%=HLO6o!uWsoBJrI7+bS6@7^;p_k zi&4)C0*r$=`VC%#Z%E2LITme)AP|jGWv1~Aw^rF6`P)*BdNL5!gLNrWkROnPZ^e!! z=U`k9%;1|bxhvp#434+ZP>Dc91wh5!bg?CabFK(G>vDgB`3N8d-^d77f~QDOr{c*K z+Y}UZoQnh+{wJ$|%SEVFIal5lY4{G|M1 z!@{Nzo0PE>jJGneaoeld#1u&h9wIRyDz6E_1soXEUfNw&%5D~5{%BH;*bh^~H6lMo1KA;xwo9F{n8v^$`Uh88NIlvQ%%?9hS+ z=@Sb_C>dLX8p=yaL*$L(xc4om^4*y~1_r~nTW5_pTtoxCx@xaV{vxRGFEFU67+=uN(MqA3Zl@uA5U`KyIXy`6FS{Tv z<;{34Rod>#zrb)`=!6X+;<*{|k;F!Hca{3Da*(TmN78UzwEMih;CLJu%lRNUamwD438;O{}}m5Y#3HWet_BRh?zhlnz9+5OFsuBwOr-qjz=O z;*|+OPky0cV@sQBSAi@Rl$n|-{h%Odr+m{uLjLRAyR>_GpVSV;=H)o%8u{CMbanX9 zF#|>ppnXw=)~)fyJ9Y}Ky%UMQZMFXJH+Gwmxc~IuAF=xVcN}(Z^_$`!DsTU^_oNSB zI((%iEgPq9+xB0d-SgQWZ@sBk+l=e}@#&dc|MaJm9$ouGNqpomky-E2VlQIT0pd{~ z|98xQp|KhF^0}___m}i`LAA?zxHPB_OQnNUw0`}1jp~D6@4jAqDCrLv9;x>UUIz{m zOyC9aCh?=|++a=Ts3aNuf8|7C`qB99gWm`6yE=ZMk_r5O`o{A2Vi~_1epf;~e*T~O G_kRF>SZgT& literal 0 HcmV?d00001 diff --git a/lib/world/src/chunk/chunk_fetcher.rs b/lib/world/src/chunk/chunk_fetcher.rs index 8325a53..ddd48c6 100644 --- a/lib/world/src/chunk/chunk_fetcher.rs +++ b/lib/world/src/chunk/chunk_fetcher.rs @@ -2,16 +2,25 @@ use crate::chunk::chunk_pos::ChunkPos; use crate::game::Game; use crate::terrain_gen::TerrainGenerator; use crate::{chunk::chunk::Chunk, utils::js_log}; +use js_sys; use serde::{Deserialize, Serialize}; +use std::cell::RefCell; +use std::rc::Rc; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::JsFuture; use web_sys::{Request, RequestInit, RequestMode, Response}; +/// Shared state for tracking an in-flight async chunk load +type InFlightState = Rc>>>; + #[derive(Clone, Serialize, Deserialize)] #[wasm_bindgen(getter_with_clone)] pub struct ChunkFetcher { chunks_to_load: Vec, chunk_loader: ChunkLoader, + /// Tracks all currently loading chunks (not serialized) + #[serde(skip)] + in_flight: Vec, } #[derive(Clone, Serialize, Deserialize)] @@ -25,6 +34,7 @@ impl ChunkFetcher { Self { chunks_to_load: Vec::new(), chunk_loader, + in_flight: Vec::new(), } } @@ -39,18 +49,58 @@ impl ChunkFetcher { self.chunks_to_load.push(chunk_pos); } - pub async fn consume_single_chunk(&mut self) -> Option { - let chunk_pos = self.chunks_to_load.pop()?; - match &self.chunk_loader { - ChunkLoader::TerrainGenerator(loader) => { - let chunk = loader.get_chunk(chunk_pos.x, chunk_pos.y); - Some(chunk) + /// Attempts to get a loaded chunk. Returns `Some(chunk)` if one is ready, + /// or `None` if still loading or no chunks are pending. + /// + /// For server-loaded chunks, this spawns async fetches in the background + /// and returns chunks as they complete on subsequent calls. + pub fn consume_single_chunk(&mut self) -> Option { + // 1. Check if any in-flight request has completed + let mut completed_index = None; + for (i, in_flight) in self.in_flight.iter().enumerate() { + if in_flight.borrow().is_some() { + completed_index = Some(i); + break; } - ChunkLoader::Server(loader) => { - let chunk = loader.load_chunk(chunk_pos).await.unwrap(); - Some(chunk) + } + + if let Some(index) = completed_index { + let in_flight = self.in_flight.remove(index); + let result = in_flight.borrow_mut().take().unwrap(); + match result { + Ok(chunk) => return Some(chunk), + Err(e) => { + js_log(&format!("Chunk load failed: {}", e)); + // Continue to try starting new requests or check other in-flight + } } } + + // 2. Start new requests for any pending chunks + while let Some(chunk_pos) = self.chunks_to_load.pop() { + match &self.chunk_loader { + ChunkLoader::TerrainGenerator(loader) => { + // Sync case - return immediately + return Some(loader.get_chunk(chunk_pos.x, chunk_pos.y)); + } + ChunkLoader::Server(loader) => { + // Async case - spawn background task + let state: InFlightState = Rc::new(RefCell::new(None)); + let state_clone = state.clone(); + let loader_clone = loader.clone(); + + wasm_bindgen_futures::spawn_local(async move { + let result = loader_clone.load_chunk(chunk_pos).await; + let mapped = result.map_err(|e| format!("{:?}", e)); + *state_clone.borrow_mut() = Some(mapped); + }); + + self.in_flight.push(state); + } + } + } + + None // No chunks ready yet } pub fn get_chunk_to_load_count(&self) -> usize { @@ -92,7 +142,7 @@ impl Game { #[wasm_bindgen(js_name = "getPendingChunkCount")] pub fn get_pending_chunk_count(&self) -> usize { - self.chunk_fetcher.chunks_to_load.len() + self.chunk_fetcher.chunks_to_load.len() + self.chunk_fetcher.in_flight.len() } } @@ -118,29 +168,48 @@ impl ServerChunkLoader { self.base_url, self.game_id, chunk_pos.x, chunk_pos.y ); - let opts = RequestInit::new(); - opts.set_method("GET"); - opts.set_mode(RequestMode::Cors); - - let request = Request::new_with_str_and_init(&url, &opts)?; - - request - .headers() - .set("Accept", "application/vnd.github.v3+json")?; - - let window = web_sys::window().unwrap(); - let resp_value = JsFuture::from(window.fetch_with_request(&request)).await?; - - // `resp_value` is a `Response` object. - assert!(resp_value.is_instance_of::()); - let resp: Response = resp_value.dyn_into().unwrap(); + loop { + let opts = RequestInit::new(); + opts.set_method("GET"); + opts.set_mode(RequestMode::Cors); + + let request = Request::new_with_str_and_init(&url, &opts)?; + + request + .headers() + .set("Accept", "application/vnd.github.v3+json")?; + + let window = web_sys::window().unwrap(); + let resp_value = JsFuture::from(window.fetch_with_request(&request)).await?; + + // `resp_value` is a `Response` object. + assert!(resp_value.is_instance_of::()); + let resp: Response = resp_value.dyn_into().unwrap(); + + // Handle not found - wait and retry + if resp.status() == 404 { + js_log(&format!( + "Chunk requested at ({}, {}), retrying in 1 second...", + chunk_pos.x, chunk_pos.y + )); + // Sleep for 1 second before retrying + let promise = js_sys::Promise::new(&mut |resolve, _| { + let window = web_sys::window().unwrap(); + window + .set_timeout_with_callback_and_timeout_and_arguments_0(&resolve, 1000) + .unwrap(); + }); + JsFuture::from(promise).await?; + continue; + } - // Convert this other `Promise` into a rust `Future`. - let json = JsFuture::from(resp.json()?).await?; + // Convert this other `Promise` into a rust `Future`. + let json = JsFuture::from(resp.json()?).await?; - let chunk = Chunk::deserialize(json)?; + let chunk = Chunk::deserialize(json)?; - // Send the JSON response back to JS. - Ok(chunk) + // Send the JSON response back to JS. + return Ok(chunk); + } } } diff --git a/lib/world/src/game.rs b/lib/world/src/game.rs index 9d144b0..7fcb9d9 100644 --- a/lib/world/src/game.rs +++ b/lib/world/src/game.rs @@ -2,6 +2,7 @@ use crate::{ chunk::{ chunk::{Chunk, ChunkId}, chunk_fetcher::ChunkFetcher, + chunk_pos::ChunkPos, }, components::world_pos::WorldPos, entities::{ @@ -25,7 +26,7 @@ use crate::{ }; use serde::{Deserialize, Serialize}; use uuid::Uuid; -use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; #[wasm_bindgen(getter_with_clone)] pub struct Game { @@ -159,8 +160,8 @@ impl Game { self.schedule.removed_entities.clear(); } - pub async fn add_single_chunk(&mut self) { - let chunk = self.chunk_fetcher.consume_single_chunk().await; + pub fn add_single_chunk(&mut self) { + let chunk = self.chunk_fetcher.consume_single_chunk(); if let Some(chunk) = chunk { let chunk_id = chunk.get_id(); self.world.insert_chunk(chunk); @@ -170,6 +171,10 @@ impl Game { } } + pub fn request_chunk(&mut self, chunk_pos: ChunkPos) { + self.chunk_fetcher.request_chunk(chunk_pos); + } + pub fn add_blocks(&mut self) { let new_blocks = std::mem::take(&mut self.schedule.new_blocks); for block in new_blocks { @@ -199,6 +204,7 @@ impl Game { self.run_scripts(); self.add_new_entities(); self.remove_entities(); + // TODO: this shouldn't be async self.add_single_chunk(); self.add_blocks(); self.remove_blocks(); @@ -220,6 +226,29 @@ pub struct GameDiff { pub updated_chunks: Vec, } +#[wasm_bindgen] +impl GameDiff { + #[wasm_bindgen(constructor)] + pub fn new() -> GameDiff { + GameDiff { + updated_entities: Vec::new(), + updated_chunks: Vec::new(), + } + } + + pub fn add_entity(&mut self, entity_id: EntityId) { + self.updated_entities.push(entity_id); + } + + pub fn add_chunk(&mut self, chunk_id: ChunkId) { + self.updated_chunks.push(chunk_id); + } + + pub fn to_js(&self) -> Result { + serde_wasm_bindgen::to_value(self) + } +} + pub struct GameSchedule { pub new_entities: Vec, pub new_blocks: Vec, From 1f7588b3a3d62b84c68771ce81426b99e3f265dc Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sat, 24 Jan 2026 20:29:18 +0000 Subject: [PATCH 54/61] Fix to loading too many chunks --- lib/world/src/chunk/chunk_fetcher.rs | 45 ++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/lib/world/src/chunk/chunk_fetcher.rs b/lib/world/src/chunk/chunk_fetcher.rs index ddd48c6..94bcf5b 100644 --- a/lib/world/src/chunk/chunk_fetcher.rs +++ b/lib/world/src/chunk/chunk_fetcher.rs @@ -11,7 +11,14 @@ use wasm_bindgen_futures::JsFuture; use web_sys::{Request, RequestInit, RequestMode, Response}; /// Shared state for tracking an in-flight async chunk load -type InFlightState = Rc>>>; +type InFlightResult = Rc>>>; + +/// An in-flight chunk request with its position and result state +#[derive(Clone)] +struct InFlightChunk { + pos: ChunkPos, + result: InFlightResult, +} #[derive(Clone, Serialize, Deserialize)] #[wasm_bindgen(getter_with_clone)] @@ -20,7 +27,7 @@ pub struct ChunkFetcher { chunk_loader: ChunkLoader, /// Tracks all currently loading chunks (not serialized) #[serde(skip)] - in_flight: Vec, + in_flight: Vec, } #[derive(Clone, Serialize, Deserialize)] @@ -39,13 +46,22 @@ impl ChunkFetcher { } pub fn request_chunk(&mut self, chunk_pos: ChunkPos) { + // Check if already queued + if self.chunks_to_load.iter().any(|pos| pos == &chunk_pos) { + return; + } + // Check if already in-flight + if self + .in_flight + .iter() + .any(|inflight| inflight.pos == chunk_pos) + { + return; + } js_log(&format!( "chunk_fetcher.rs: Requesting chunk: {:?}", chunk_pos )); - if self.chunks_to_load.iter().any(|pos| pos == &chunk_pos) { - return; - } self.chunks_to_load.push(chunk_pos); } @@ -58,7 +74,7 @@ impl ChunkFetcher { // 1. Check if any in-flight request has completed let mut completed_index = None; for (i, in_flight) in self.in_flight.iter().enumerate() { - if in_flight.borrow().is_some() { + if in_flight.result.borrow().is_some() { completed_index = Some(i); break; } @@ -66,7 +82,7 @@ impl ChunkFetcher { if let Some(index) = completed_index { let in_flight = self.in_flight.remove(index); - let result = in_flight.borrow_mut().take().unwrap(); + let result = in_flight.result.borrow_mut().take().unwrap(); match result { Ok(chunk) => return Some(chunk), Err(e) => { @@ -85,17 +101,20 @@ impl ChunkFetcher { } ChunkLoader::Server(loader) => { // Async case - spawn background task - let state: InFlightState = Rc::new(RefCell::new(None)); - let state_clone = state.clone(); + let result: InFlightResult = Rc::new(RefCell::new(None)); + let result_clone = result.clone(); let loader_clone = loader.clone(); wasm_bindgen_futures::spawn_local(async move { - let result = loader_clone.load_chunk(chunk_pos).await; - let mapped = result.map_err(|e| format!("{:?}", e)); - *state_clone.borrow_mut() = Some(mapped); + let fetch_result = loader_clone.load_chunk(chunk_pos).await; + let mapped = fetch_result.map_err(|e| format!("{:?}", e)); + *result_clone.borrow_mut() = Some(mapped); }); - self.in_flight.push(state); + self.in_flight.push(InFlightChunk { + pos: chunk_pos, + result, + }); } } } From 5851fdf5cdaa8f946ec50b1df9a35cdc966db719 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 25 Jan 2026 04:41:35 +0000 Subject: [PATCH 55/61] Entities are rendered, but the posistions aren't synced --- DEVLOG.md | 41 +++++----- apps/server/src/db.ts | 14 ++-- apps/server/src/server-game-manager.ts | 9 +++ apps/server/src/server.ts | 11 ++- .../src/components/ClientGameView.tsx | 70 +++++++++++++++-- .../src/components/ServerGameView.tsx | 39 +++++++++- .../controllers/keyboardPlayerController.ts | 6 +- apps/web-client/src/renders/game-renderer.ts | 12 ++- apps/web-client/src/renders/player-render.ts | 9 ++- .../src/services/mp-games-service.ts | 14 +++- .../src/services/sp-games-service.ts | 14 ++-- .../src/{socket-types.ts => api-types.ts} | 5 ++ lib/engine/src/camera.ts | 11 +-- lib/engine/src/config.ts | 61 --------------- lib/engine/src/index.ts | 3 +- lib/engine/src/serialize.ts | 5 -- lib/engine/tsconfig.tsbuildinfo | 2 +- lib/world/src/entities/entities.rs | 5 ++ lib/world/src/game.rs | 77 ++++++++++++++++++- lib/world/src/scripts/game_script.rs | 53 ++++++++++++- lib/world/src/world/world_chunk.rs | 10 ++- 21 files changed, 333 insertions(+), 138 deletions(-) rename lib/engine/src/{socket-types.ts => api-types.ts} (95%) delete mode 100644 lib/engine/src/config.ts diff --git a/DEVLOG.md b/DEVLOG.md index da1d4ff..71f37fd 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,23 +1,27 @@ +# 01_24_26 + +Working on loading chunks with the server. I started to launch chunk requests in the background so I don't have to await on the consume single chunk request. + # 01_11_26 Worked on the starting flow for making a client and server game. The joining and starting of a game seems to have some race condition because I have to refresh the page to actually join. Need to figure out this flow more - # 09_14_25 Yesterday I got the menu and saving stuff working much better. I'm pretty happy with how everything works now. I also restructred a lot of things and made chunk mesh rendering much quicker. I might want to move to some sort of shared memory thing for inserting chunks. I'm not sure why it is so slow still. Goals for today + - Get multiplayer working again. - Add an options screen for launching new games - Speed up chunk loading again - # 09_13_25 I need to get the PR out, here are the remaining things to do + - Ensure the game scripts thing works - Get mobile working - Battle Test the server @@ -25,8 +29,6 @@ I need to get the PR out, here are the remaining things to do Then deploy this! - - # 08_30_25 It's been a bit but I'm back. I've mostly been working on getting scripts to be serialzied. It is hard to get the wasm scripts to live in rust. @@ -35,7 +37,6 @@ I'm currently trying to load the scripts and everything is moving forward. I probably want to move to a similar structure as the Entities soon where a GameScript is a struct instead of a trait - # 06_03_25 I've worked more on optimizing the chunk insertion code. The release build of the app is much faster now and I'm happy with it. @@ -107,7 +108,7 @@ The next hardest thing to me seems to be the server. It seem more complicated to - The server the game on a loop, anytime the game state changes it will be broadcast to all the clients. - The server can change either because the game performs an action (like spawning an entity) or because the clients send actions to the server. -But I think there is a problem: If the game sends all of these diffs to the client, it will send an update to the client for every single action. That will be too much since the clients can compute the velocity themselves. + But I think there is a problem: If the game sends all of these diffs to the client, it will send an update to the client for every single action. That will be too much since the clients can compute the velocity themselves. I think a good solution to this is to have "script actions" that are generated by game scripts. Then the server can mark the scripts whose actions will be sent to the client. That way it can exclude scripts like "MovePlayer" but include ones like "SpawnCows" and then the client would not use the SpawnCow script. @@ -357,27 +358,27 @@ Trying to think about the best way to have an entity be controlled by gpt4. Migh Maybe each entity needs a controller. The entity class controls the logic of the entity and the moves it can make. The controller calls those moves in interesting ways. The entity controller for a player might be a socket, a keyboard, or gpt4. type entityController = { - entity: Entity - update: () => void +entity: Entity +update: () => void } examples keyboardPlayerController { - setup() { - // start event listeners for fast events - } - update() { - call some entity moves - } +setup() { +// start event listeners for fast events +} +update() { +call some entity moves +} } socketPlayerController { - setup() { - // start socket listeners - } - update() { - call some entity moves - } +setup() { +// start socket listeners +} +update() { +call some entity moves +} } # 08/23/23 diff --git a/apps/server/src/db.ts b/apps/server/src/db.ts index 5296961..c526086 100644 --- a/apps/server/src/db.ts +++ b/apps/server/src/db.ts @@ -1,5 +1,9 @@ -import { IGameMetadata, ISerializedGame, serializeGame } from "@craft/engine"; -import { Game } from "@craft/rust-world"; +import { + IApiGameMetadata, + ISerializedGame, + serializeGame, +} from "@craft/engine"; +import { CreateGameOptions, Game } from "@craft/rust-world"; import { Collection, Document, MongoClient } from "mongodb"; export class GameDb { @@ -20,7 +24,7 @@ export class GameDb { this.gameCollection = this.client.db("tylercraft").collection("games"); } - getAllGameMetadata(): Promise { + getAllGameMetadata(): Promise { return this.gameCollection .find( {}, @@ -67,8 +71,8 @@ export class GameDb { ); } - async createGame(): Promise { - const game = new Game(); + async createGame(options: CreateGameOptions): Promise { + const game = Game.create(options); await this.saveGame(game); return game; } diff --git a/apps/server/src/server-game-manager.ts b/apps/server/src/server-game-manager.ts index 68af483..aeb109b 100644 --- a/apps/server/src/server-game-manager.ts +++ b/apps/server/src/server-game-manager.ts @@ -37,6 +37,14 @@ class ServerGameManagerGameScript { add_script_to_registry(ServerGameManagerGameScript); } + onScriptMounted(allChunkIds: Set, allEntityIds: Set): void { + console.log( + "ServerGameManagerGameScript onScriptMounted", + allChunkIds, + allEntityIds + ); + } + onChunkUpdate(chunkId: number): void { console.log("ServerGameManagerGameScript onChunkUpdate", chunkId); this.updatedChunks.add(chunkId); @@ -105,6 +113,7 @@ export class ServerGameManager { }); game.ensureScript(ServerGameManagerGameScript.name); + game.add_all_scripts(); } private getGameManagerGameScript(): ServerGameManagerGameScript { diff --git a/apps/server/src/server.ts b/apps/server/src/server.ts index f404f58..a21c616 100644 --- a/apps/server/src/server.ts +++ b/apps/server/src/server.ts @@ -5,7 +5,8 @@ import cors from "cors"; import SocketServer from "./socket.js"; import { ServerGameManager } from "./server-game-manager.js"; import { GameDb } from "./db.js"; -import { IGameMetadata } from "@craft/engine"; +import { IApiGameMetadata } from "@craft/engine"; +import { CreateGameOptions } from "@craft/rust-world"; import { makeLogger } from "./logger.js"; const PORT = process.env.PORT ?? 3000; @@ -36,7 +37,7 @@ app.use(express.static(webClientPath)); app.get("/games", async (_req: Request, res: Response) => { const gamesMetadata = await gameDb.getAllGameMetadata(); - const gameInfos: (IGameMetadata & { + const gameInfos: (IApiGameMetadata & { isRunning: boolean; onlinePlayers: number; })[] = gamesMetadata.map((gameMetadata) => { @@ -52,8 +53,10 @@ app.get("/games", async (_req: Request, res: Response) => { }); app.post("/game", async (req: Request, res: Response) => { - log("Creating game"); - const game = await gameDb.createGame(); + const body = req.body; + log("Creating game", body); + const options = CreateGameOptions.from_js(req.body); + const game = await gameDb.createGame(options); log("Game created", game.id); res.send(game.id); }); diff --git a/apps/web-client/src/components/ClientGameView.tsx b/apps/web-client/src/components/ClientGameView.tsx index 34172d4..9eb32aa 100644 --- a/apps/web-client/src/components/ClientGameView.tsx +++ b/apps/web-client/src/components/ClientGameView.tsx @@ -2,14 +2,29 @@ import React, { useState } from "react"; import { run, create } from "../services/sp-games-service"; import { RunningGameView } from "./RunningGameView"; import { useNavigate, useParams } from "react-router-dom"; +import { CreateGameOptions } from "@craft/rust-world"; export function ClientGameView() { const { gameId } = useParams<{ gameId: string }>(); const navigate = useNavigate(); - const [gameName, setGameName] = useState(""); + const defaultOptions = CreateGameOptions.default(); + const [gameName, setGameName] = useState(defaultOptions.name); + const [seed, setSeed] = useState(defaultOptions.seed); + const [flatWorld, setFlatWorld] = useState(defaultOptions.flatWorld); + const [flatWorldHeight, setFlatWorldHeight] = useState( + defaultOptions.flatWorldHeight + ); + const [debugWorld, setDebugWorld] = useState(defaultOptions.debugWorld); async function createGame() { - const id = await create(gameName); + const options = new CreateGameOptions( + gameName, + flatWorld, + flatWorldHeight, + debugWorld, + seed + ); + const id = await create(options); navigate(`/client-game/${id}`); } @@ -17,12 +32,51 @@ export function ClientGameView() { return (

Create Game - setGameName(e.target.value)} - /> +
+ + setGameName(e.target.value)} + /> +
+
+ + setSeed(Number(e.target.value))} + /> +
+
+ + setFlatWorld(e.target.checked)} + /> +
+
+ + setFlatWorldHeight(Number(e.target.value))} + /> +
+
+ + setDebugWorld(e.target.checked)} + /> +
); diff --git a/apps/web-client/src/components/ServerGameView.tsx b/apps/web-client/src/components/ServerGameView.tsx index 22519bc..84f3522 100644 --- a/apps/web-client/src/components/ServerGameView.tsx +++ b/apps/web-client/src/components/ServerGameView.tsx @@ -2,14 +2,27 @@ import React, { useState } from "react"; import { run, create } from "../services/mp-games-service"; import { RunningGameView } from "./RunningGameView"; import { useNavigate, useParams } from "react-router-dom"; +import { CreateGameOptions } from "@craft/rust-world"; export function ServerGameView() { const { gameId } = useParams<{ gameId: string }>(); const navigate = useNavigate(); const [gameName, setGameName] = useState(""); + const [flatWorld, setFlatWorld] = useState(false); + const [flatWorldHeight, setFlatWorldHeight] = useState(0); + const [debugWorld, setDebugWorld] = useState(false); + const [seed, setSeed] = useState(0); async function createGame() { - const id = await create(gameName); + const id = await create( + new CreateGameOptions( + gameName, + flatWorld, + flatWorldHeight, + debugWorld, + seed + ) + ); navigate(`/server-game/${id}`); } @@ -22,6 +35,30 @@ export function ServerGameView() { value={gameName} onChange={(e) => setGameName(e.target.value)} /> + setFlatWorldHeight(Number(e.target.value))} + /> + setDebugWorld(e.target.checked)} + /> + setSeed(Number(e.target.value))} + /> + setFlatWorld(e.target.checked)} + />
); diff --git a/apps/web-client/src/controllers/keyboardPlayerController.ts b/apps/web-client/src/controllers/keyboardPlayerController.ts index 46cb8bf..3c33bb1 100644 --- a/apps/web-client/src/controllers/keyboardPlayerController.ts +++ b/apps/web-client/src/controllers/keyboardPlayerController.ts @@ -1,4 +1,4 @@ -import { CONFIG, PlayerController } from "@craft/engine"; +import { PlayerController } from "@craft/engine"; import { Direction, EntityActionDto, Game } from "@craft/rust-world"; import { GameRenderer, PlayerPerspective } from "../renders/game-renderer"; @@ -55,8 +55,8 @@ export class KeyboardPlayerEntityController extends PlayerController { return; } - let moveX = e.movementX * CONFIG.player.mouseRotSpeed; - const moveY = e.movementY * CONFIG.player.mouseRotSpeed; + let moveX = e.movementX * 0.002; + const moveY = e.movementY * 0.002; if ( this.gameRenderer.perspective === PlayerPerspective.ThirdPersonFront diff --git a/apps/web-client/src/renders/game-renderer.ts b/apps/web-client/src/renders/game-renderer.ts index a3519ae..a4246a9 100644 --- a/apps/web-client/src/renders/game-renderer.ts +++ b/apps/web-client/src/renders/game-renderer.ts @@ -73,6 +73,16 @@ export class GameRendererGameScript { add_script_to_registry(GameRendererGameScript); } + onScriptMounted(allChunkIds: Set, allEntityIds: Set): void { + log("GameScript onScriptMounted", allChunkIds, allEntityIds); + for (const chunkId of allChunkIds) { + this.updatedChunks.add(chunkId); + } + for (const entityId of allEntityIds) { + this.updatedEntities.add(entityId); + } + } + // This is called by the rust side when a chunk is updated onChunkUpdate(chunkId: number): void { log("GameScript onChunkUpdate", chunkId); @@ -484,7 +494,7 @@ export class GameRenderer { log("Adding entity", entity); // if (entity instanceof PlayerWrapper) { if (Player.is_player(entity)) { - log("Adding player"); + log("Adding player with id", entity.id); const renderer = new PlayerRenderer(this.game, this, entity.id); this.entityRenderers.set(entity.id, renderer); } else if (Fireball.is_fireball(entity)) { diff --git a/apps/web-client/src/renders/player-render.ts b/apps/web-client/src/renders/player-render.ts index 767d9d3..ca65cb3 100644 --- a/apps/web-client/src/renders/player-render.ts +++ b/apps/web-client/src/renders/player-render.ts @@ -38,7 +38,14 @@ export class PlayerRenderer extends Renderer { } render(camera: Camera) { - const player = this.game.entities.get_entity_as_player(this.entityId); + const player = this.game.getEntityAsPlayer(this.entityId); + console.log( + "Rendering player with id", + this.entityId, + player?.pos.x, + player?.pos.y, + player?.pos.z + ); if (!player) { throw new Error("Player not found"); } diff --git a/apps/web-client/src/services/mp-games-service.ts b/apps/web-client/src/services/mp-games-service.ts index 0ba889b..04705ff 100644 --- a/apps/web-client/src/services/mp-games-service.ts +++ b/apps/web-client/src/services/mp-games-service.ts @@ -8,7 +8,7 @@ import { SocketHandler, SocketListener } from "./socket-service"; import { AppConfig } from "../appConfig"; import { ChunkFetcher, - ChunkPos, + CreateGameOptions, Entities, Entity, EntityActionDto, @@ -36,10 +36,15 @@ export async function getAllGames(): Promise { return await response.json(); } -export async function create(name: string): Promise { +export async function create(options: CreateGameOptions): Promise { + const optionsJson = options.to_js(); + console.log("Creating game", optionsJson); const response = await fetch(`${baseUrl}/game`, { method: "POST", - body: JSON.stringify({ name }), + body: JSON.stringify(optionsJson), + headers: { + "Content-Type": "application/json", + }, }); return await response.text(); } @@ -126,6 +131,7 @@ export async function run( // ===== Game Scripts ===== game.ensureScript(GameRendererGameScript.name); game.ensureScript(SandBoxGScript.name()); + game.add_all_scripts(); // ===== Main Player ===== const myUid = getMyUid(); @@ -158,7 +164,7 @@ export async function run( } if (message.isType(ISocketMessageType.newPlayer)) { const player = message.data; - game.addEntity(Entity.from_js(player)); + game.schedule_entity_insert(Entity.from_js(player)); } // if (message.isType(ISocketMessageType.gameDiff)) { // const diff = message.data; diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index 925e965..9452c30 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -1,11 +1,11 @@ import { - IGameMetadata, + IApiGameMetadata, ISerializedGame, deserializeGame, serializeGame, } from "@craft/engine"; -import { Game } from "@craft/rust-world"; -import { getMyUid, task } from "../utils"; +import { CreateGameOptions, Game } from "@craft/rust-world"; +import { getMyUid } from "../utils"; import { SandBoxGScript } from "@craft/rust-world"; import { GameRendererGameScript } from "../renders/game-renderer"; import { @@ -21,11 +21,10 @@ const log = (...message: any[]) => { console.log("sp-games-service.ts: ", ...message); }; -export async function create(gameName: string): Promise { +export async function create(options: CreateGameOptions): Promise { log("Creating new game"); const startCreation = performance.now(); - const game = new Game(); - game.name = gameName; + const game = Game.create(options); const endCreation = performance.now(); log("Created new game in", endCreation - startCreation, "ms"); log("Saving game"); @@ -67,6 +66,7 @@ export async function run( log("Ensuring scripts"); game.ensureScript(SandBoxGScript.name()); game.ensureScript(GameRendererGameScript.name); + game.add_all_scripts(); // ===== Main Player ===== const mainPlayerUid = getMyUid(); @@ -139,7 +139,7 @@ export class ClientDbGamesService { private constructor(private db: IDBDatabase) {} - getAllGames(): Promise { + getAllGames(): Promise { return new Promise((resolve) => { const transaction = this.db.transaction([ ClientDbGamesService.WORLDS_OBS, diff --git a/lib/engine/src/socket-types.ts b/lib/engine/src/api-types.ts similarity index 95% rename from lib/engine/src/socket-types.ts rename to lib/engine/src/api-types.ts index 03d8071..ef4553b 100644 --- a/lib/engine/src/socket-types.ts +++ b/lib/engine/src/api-types.ts @@ -71,3 +71,8 @@ export class SocketMessage extends MessageHolder< return new SocketMessage(type, data); } } + +export interface IApiGameMetadata { + gameId: string; + name: string; +} diff --git a/lib/engine/src/camera.ts b/lib/engine/src/camera.ts index 0400ee3..344a8e9 100644 --- a/lib/engine/src/camera.ts +++ b/lib/engine/src/camera.ts @@ -1,4 +1,3 @@ -import { CONFIG } from "./config.js"; import { Vector3D } from "./vector.js"; import { Player } from "@craft/rust-world"; @@ -24,10 +23,7 @@ export const makeCameraForPlayer = (player: Player) => { }; }; -export const makeThirdPersonBackCamera = ( - player: Player, - dist = CONFIG.player.thirdPersonCamDist -) => { +export const makeThirdPersonBackCamera = (player: Player, dist = 6) => { const rot = new Vector3D([0, player.rot.phi, player.rot.theta]); const player_pos = new Vector3D([player.pos.x, player.pos.y, player.pos.z]); @@ -43,10 +39,7 @@ export const makeThirdPersonBackCamera = ( }; }; -export const makeThirdPersonFrontCamera = ( - player: Player, - dist = CONFIG.player.thirdPersonCamDist -) => { +export const makeThirdPersonFrontCamera = (player: Player, dist = 6) => { const player_rot = new Vector3D([0, player.rot.phi, player.rot.theta]); const player_pos = new Vector3D([player.pos.x, player.pos.y, player.pos.z]); diff --git a/lib/engine/src/config.ts b/lib/engine/src/config.ts deleted file mode 100644 index 7489774..0000000 --- a/lib/engine/src/config.ts +++ /dev/null @@ -1,61 +0,0 @@ -export const BASE_CONFIG = { - seed: "bungi", - - renderDistance: 2, - - /** - * How many chunks to load in each direction starting at the player - */ - loadDistance: 2, - - transparency: true, - - fovFactor: 0.6, - - glFov: (45 * Math.PI) / 180, - - terrain: { - generateChunks: true, - jagFactor: 32, - maxHeight: 12, - cloudLevel: 30, - waterLever: -1, - chunkSize: 16, - // chunkSize: 4, - flatWorld: true, - // flatWorld: true, - // trees: true, - trees: false, - // flowers: true, - flowers: false, - /** - * Make the world load forever in all directions. - * If off the world loads to the size of Config.loadDistance - */ - infiniteGen: true, - }, - - gravity: -0.013, - - player: { - speed: 0.2, - reach: 10, - // jumpSpeed: 0.16, - jumpSpeed: 0.25, - mouseRotSpeed: 0.002, - thirdPersonCamDist: 6, - }, -}; - -export let CONFIG = BASE_CONFIG; - -export type IConfig = typeof CONFIG; - -export function setConfig(config: IConfig) { - CONFIG = { ...config }; -} - -// declare var window; - -// if (window) -// (window as any).config = CONFIG; diff --git a/lib/engine/src/index.ts b/lib/engine/src/index.ts index 69e4d57..4e5015b 100644 --- a/lib/engine/src/index.ts +++ b/lib/engine/src/index.ts @@ -1,9 +1,8 @@ export * from "./camera.js"; -export * from "./config.js"; export * from "./vector.js"; export * from "./serialize.js"; export * from "./playerActions.js"; export * from "./utils.js"; export * from "./blockdata.js"; -export * from "./socket-types.js"; +export * from "./api-types.js"; export * from "./game-script.js"; diff --git a/lib/engine/src/serialize.ts b/lib/engine/src/serialize.ts index 1ff5f35..3d598b3 100644 --- a/lib/engine/src/serialize.ts +++ b/lib/engine/src/serialize.ts @@ -29,11 +29,6 @@ export interface ISerializedChunkFetcher { json: any; } -export interface IGameMetadata { - gameId: string; - name: string; -} - export interface ISerializedScript { scripts: Array<{ config: string; diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index df76078..7439af2 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/blockdata.ts","./src/config.ts","./src/vector.ts","./src/camera.ts","./src/game-script.ts","./src/serialize.ts","./src/playerActions.ts","./src/utils.ts","./src/socket-types.ts","./src/index.ts","./src/messageHelpers.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,70,113],[47,49,50,70,113],[70,113],[48,49,50,51,52,53,54,55,56,70,113],[47,53,70,113],[59,70,113],[59,60,61,62,63,70,113],[59,61,70,113],[70,113,128,163,164],[70,113,128,163],[70,113,125,128,163,169,170,171],[70,113,165,170,172,174],[70,113,176],[70,113,125,163],[70,110,113],[70,112,113],[113],[70,113,118,148],[70,113,114,119,125,126,133,145,156],[70,113,114,115,125,133],[65,66,67,70,113],[70,113,116,157],[70,113,117,118,126,134],[70,113,118,145,153],[70,113,119,121,125,133],[70,112,113,120],[70,113,121,122],[70,113,125],[70,113,123,125],[70,112,113,125],[70,113,125,126,127,145,156],[70,113,125,126,127,140,145,148],[70,108,113,161],[70,108,113,121,125,128,133,145,156],[70,113,125,126,128,129,133,145,153,156],[70,113,128,130,145,153,156],[68,69,70,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162],[70,113,125,131],[70,113,132,156],[70,113,121,125,133,145],[70,113,134],[70,113,135],[70,112,113,136],[70,110,111,112,113,114,115,116,117,118,119,120,121,122,123,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162],[70,113,138],[70,113,139],[70,113,125,140,141],[70,113,140,142,157,159],[70,113,125,145,146,148],[70,113,147,148],[70,113,145,146],[70,113,148],[70,113,149],[70,110,113,145],[70,113,125,151,152],[70,113,151,152],[70,113,118,133,145,153],[70,113,154],[70,113,133,155],[70,113,128,139,156],[70,113,118,157],[70,113,145,158],[70,113,132,159],[70,113,160],[70,113,118,125,127,136,145,156,159,161],[70,113,145,162],[70,113,182],[70,113,179,180,181],[70,113,128,145,163],[70,113,186,225],[70,113,186,210,225],[70,113,225],[70,113,186],[70,113,186,211,225],[70,113,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224],[70,113,211,225],[70,113,126,145,163,168],[70,113,128,163,169,173],[70,113,125,128,130,133,145,153,156,162,163],[70,80,84,113,156],[70,80,113,145,156],[70,75,113],[70,77,80,113,153,156],[70,113,133,153],[70,113,163],[70,75,113,163],[70,77,80,113,133,156],[70,72,73,76,79,113,125,145,156],[70,80,87,113],[70,72,78,113],[70,80,101,102,113],[70,76,80,113,148,156,163],[70,101,113,163],[70,74,75,113,163],[70,80,113],[70,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,102,103,104,105,106,107,113],[70,80,95,113],[70,80,87,88,113],[70,78,80,88,89,113],[70,79,113],[70,72,75,80,113],[70,80,84,88,89,113],[70,84,113],[70,78,80,83,113,156],[70,72,77,80,87,113],[70,113,145],[70,75,80,101,113,161,163]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a56d86b81448ffa5532fc4b13a765911afc2a1b3309a9109c85b1028001c6dd3","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"01641e541f78b4f0bc7aa912bfe9aeed0c1f35135e679ed219583d2417e55aa8","signature":"6e6944f0524bb598b6634ba27595a9bd3b8025c8a30f2c4a054686557c1f60e6","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"2190af24cd8970497490c683989e0519fb8c15489edda3df05dc3c5e8c95bf13","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"1e20cfe580515334f0b432b26673699222b566ab627585b1197fd0f19dd696ef","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"4357f8c19a1320944e3d07085401be1004b78698bbac254fae4e9bbce02a83f1","signature":"2453b54c36a150578fe9b40af1fc1d7468476ae8e9f7c16a1882037e13ea7194","impliedFormat":99},{"version":"c072992f5050052cd71af7ed891c172c21ea18afaa2303aecd871502cf97ed79","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"637faa90ef9fab63d1ec947535eb42bd94883ac62cf851d55fd735b08a4542b5","signature":"5e5ef417b2eb6cbe0656f81d95a84bc3a632b21b0f033b72757b24db0e5f20a9","impliedFormat":99},{"version":"2910afd0b4d1ea52cded30c6e252900275a892cf18dca8b0bd20e5ecfefcd5c1","impliedFormat":99},{"version":"c377b02fff54ab51cd49d83cd77dedd57146f5a0dbb31ecde57694fd1ee1e48a","signature":"7d5fb2c9812ddb34bd3bcf2c4cbf3a61807603aa4b6a47d88fb7d747ae571253","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,58]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[48,1],[51,2],[49,3],[52,1],[57,4],[58,3],[54,1],[53,1],[56,5],[55,3],[50,3],[47,3],[61,6],[59,3],[64,7],[60,6],[62,8],[63,6],[165,9],[164,10],[166,10],[167,3],[172,11],[175,12],[176,13],[173,3],[177,3],[178,14],[168,3],[110,15],[111,15],[112,16],[70,17],[113,18],[114,19],[115,20],[65,3],[68,21],[66,3],[67,3],[116,22],[117,23],[118,24],[119,25],[120,26],[121,27],[122,27],[124,28],[123,29],[125,30],[126,31],[127,32],[109,33],[69,3],[128,34],[129,35],[130,36],[163,37],[131,38],[132,39],[133,40],[134,41],[135,42],[136,43],[137,44],[138,45],[139,46],[140,47],[141,47],[142,48],[143,3],[144,3],[145,49],[147,50],[146,51],[148,52],[149,53],[150,54],[151,55],[152,56],[153,57],[154,58],[155,59],[156,60],[157,61],[158,62],[159,63],[160,64],[161,65],[162,66],[179,3],[170,3],[171,3],[183,67],[180,3],[182,68],[184,69],[185,3],[210,70],[211,71],[186,72],[189,72],[208,70],[209,70],[199,70],[198,73],[196,70],[191,70],[204,70],[202,70],[206,70],[190,70],[203,70],[207,70],[192,70],[193,70],[205,70],[187,70],[194,70],[195,70],[197,70],[201,70],[212,74],[200,70],[188,70],[225,75],[224,3],[219,74],[221,76],[220,74],[213,74],[214,74],[216,74],[218,74],[222,76],[223,76],[215,76],[217,76],[169,77],[174,78],[226,3],[227,3],[228,3],[229,79],[71,3],[181,3],[45,3],[46,3],[8,3],[10,3],[9,3],[2,3],[11,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[3,3],[19,3],[20,3],[4,3],[21,3],[25,3],[22,3],[23,3],[24,3],[26,3],[27,3],[28,3],[5,3],[29,3],[30,3],[31,3],[32,3],[6,3],[36,3],[33,3],[34,3],[35,3],[37,3],[7,3],[38,3],[43,3],[44,3],[39,3],[40,3],[41,3],[42,3],[1,3],[87,80],[97,81],[86,80],[107,82],[78,83],[77,84],[106,85],[100,86],[105,87],[80,88],[94,89],[79,90],[103,91],[75,92],[74,85],[104,93],[76,94],[81,95],[82,3],[85,95],[72,3],[108,96],[98,97],[89,98],[90,99],[92,100],[88,101],[91,102],[101,85],[83,103],[84,104],[93,105],[73,106],[96,97],[95,95],[99,3],[102,107]],"latestChangedDtsFile":"./dist/types.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/serialize.ts","./src/api-types.ts","./src/blockdata.ts","./src/vector.ts","./src/camera.ts","./src/game-script.ts","./src/playerActions.ts","./src/utils.ts","./src/index.ts","./src/messageHelpers.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,48,69,112],[47,69,112],[47,51,69,112],[48,49,50,51,52,53,54,55,69,112],[69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"629709adae9d5a1ce11fd909c06e5366c918073418fdbca68aad39964d08fb65","impliedFormat":99},{"version":"5be0d07a39109cf78a19082ded6b15f6bd4b8bef7004c732c4613cab1979155a","signature":"9c77ac4cc293efb26797c0f4842aa1c3022e5915d927b88b7ee7429f3926d840","impliedFormat":99},{"version":"4c89c2497dffcd2dec6a8ee8075719545163214393166c6c5542de09dc76ee4f","signature":"0177e6117f562265fea03e7e70f5b408861dc2281c099fcce07768a655bd8687","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"be0742a712314d1ff5abbf6e0ab8f19820b4004c8eb2881c7db28a7d71695cbc","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"1e20cfe580515334f0b432b26673699222b566ab627585b1197fd0f19dd696ef","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"c072992f5050052cd71af7ed891c172c21ea18afaa2303aecd871502cf97ed79","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"29b5d606da6db9a01664e84fae53674ced22682a02e96e24b9e1b6497049ed6d","impliedFormat":99},{"version":"c377b02fff54ab51cd49d83cd77dedd57146f5a0dbb31ecde57694fd1ee1e48a","signature":"7d5fb2c9812ddb34bd3bcf2c4cbf3a61807603aa4b6a47d88fb7d747ae571253","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[49,1],[50,2],[52,3],[53,2],[56,4],[57,5],[54,2],[48,2],[55,5],[51,5],[47,5],[60,6],[58,5],[63,7],[59,6],[61,8],[62,6],[164,9],[163,10],[165,10],[166,5],[171,11],[174,12],[175,13],[172,5],[176,5],[177,14],[167,5],[109,15],[110,15],[111,16],[69,17],[112,18],[113,19],[114,20],[64,5],[67,21],[65,5],[66,5],[115,22],[116,23],[117,24],[118,25],[119,26],[120,27],[121,27],[123,28],[122,29],[124,30],[125,31],[126,32],[108,33],[68,5],[127,34],[128,35],[129,36],[162,37],[130,38],[131,39],[132,40],[133,41],[134,42],[135,43],[136,44],[137,45],[138,46],[139,47],[140,47],[141,48],[142,5],[143,5],[144,49],[146,50],[145,51],[147,52],[148,53],[149,54],[150,55],[151,56],[152,57],[153,58],[154,59],[155,60],[156,61],[157,62],[158,63],[159,64],[160,65],[161,66],[178,5],[169,5],[170,5],[182,67],[179,5],[181,68],[183,69],[184,5],[209,70],[210,71],[185,72],[188,72],[207,70],[208,70],[198,70],[197,73],[195,70],[190,70],[203,70],[201,70],[205,70],[189,70],[202,70],[206,70],[191,70],[192,70],[204,70],[186,70],[193,70],[194,70],[196,70],[200,70],[211,74],[199,70],[187,70],[224,75],[223,5],[218,74],[220,76],[219,74],[212,74],[213,74],[215,74],[217,74],[221,76],[222,76],[214,76],[216,76],[168,77],[173,78],[225,5],[226,5],[227,5],[228,79],[70,5],[180,5],[45,5],[46,5],[8,5],[10,5],[9,5],[2,5],[11,5],[12,5],[13,5],[14,5],[15,5],[16,5],[17,5],[18,5],[3,5],[19,5],[20,5],[4,5],[21,5],[25,5],[22,5],[23,5],[24,5],[26,5],[27,5],[28,5],[5,5],[29,5],[30,5],[31,5],[32,5],[6,5],[36,5],[33,5],[34,5],[35,5],[37,5],[7,5],[38,5],[43,5],[44,5],[39,5],[40,5],[41,5],[42,5],[1,5],[86,80],[96,81],[85,80],[106,82],[77,83],[76,84],[105,85],[99,86],[104,87],[79,88],[93,89],[78,90],[102,91],[74,92],[73,85],[103,93],[75,94],[80,95],[81,5],[84,95],[71,5],[107,96],[97,97],[88,98],[89,99],[91,100],[87,101],[90,102],[100,85],[82,103],[83,104],[92,105],[72,106],[95,97],[94,95],[98,5],[101,107]],"latestChangedDtsFile":"./dist/serialize.d.ts","version":"5.8.3"} \ No newline at end of file diff --git a/lib/world/src/entities/entities.rs b/lib/world/src/entities/entities.rs index 24b8f64..5e68934 100644 --- a/lib/world/src/entities/entities.rs +++ b/lib/world/src/entities/entities.rs @@ -6,6 +6,7 @@ use super::fireball::Fireball; use super::player::Player; use serde::{Deserialize, Serialize}; use serde_wasm_bindgen::{from_value, to_value}; +use std::collections::HashSet; use std::{any::TypeId, fmt::Debug}; use wasm_bindgen::prelude::*; @@ -73,6 +74,10 @@ impl Entities { &self.entities } + pub fn get_all_entity_ids(&self) -> HashSet { + self.entities.iter().map(|entity| entity.id).collect() + } + pub fn get_all_mut(&mut self) -> &mut Vec { &mut self.entities } diff --git a/lib/world/src/game.rs b/lib/world/src/game.rs index 7fcb9d9..ef40a76 100644 --- a/lib/world/src/game.rs +++ b/lib/world/src/game.rs @@ -28,6 +28,57 @@ use serde::{Deserialize, Serialize}; use uuid::Uuid; use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; +#[wasm_bindgen(getter_with_clone)] +#[derive(Serialize, Deserialize)] +pub struct CreateGameOptions { + pub name: String, + #[wasm_bindgen(js_name = "flatWorld")] + pub flat_world: bool, + #[wasm_bindgen(js_name = "flatWorldHeight")] + pub flat_world_height: i32, + #[wasm_bindgen(js_name = "debugWorld")] + pub debug_world: bool, + pub seed: u32, +} + +#[wasm_bindgen] +impl CreateGameOptions { + #[wasm_bindgen(constructor)] + pub fn new( + name: String, + flat_world: bool, + flat_world_height: i32, + debug_world: bool, + seed: u32, + ) -> CreateGameOptions { + CreateGameOptions { + name, + flat_world, + flat_world_height, + debug_world, + seed, + } + } + + pub fn default() -> CreateGameOptions { + CreateGameOptions { + name: "".to_string(), + flat_world: false, + flat_world_height: 1, + debug_world: false, + seed: 0, + } + } + + pub fn from_js(value: JsValue) -> Result { + serde_wasm_bindgen::from_value(value) + } + + pub fn to_js(&self) -> Result { + serde_wasm_bindgen::to_value(self) + } +} + #[wasm_bindgen(getter_with_clone)] pub struct Game { pub name: String, @@ -81,6 +132,20 @@ impl Game { g } + #[wasm_bindgen(js_name = "create")] + pub fn create(options: CreateGameOptions) -> Game { + let mut g = Game::new(); + g.name = options.name; + g.chunk_fetcher = ChunkFetcher::make_from_terrain_generator(TerrainGenerator::new( + options.seed, + options.flat_world, + options.flat_world_height, + options.debug_world, + )); + g.add_default_scripts(); + g + } + pub fn build( id: Option, name: Option, @@ -121,6 +186,13 @@ impl Game { self.schedule.combine(schedule); } + pub fn add_all_scripts(&mut self) { + let all_chunk_ids = self.world.get_all_chunk_ids(); + let all_entity_ids = self.entities.get_all_entity_ids(); + self.scripts + .add_all_scheduled_scripts(&all_chunk_ids, &all_entity_ids); + } + pub fn run_scripts(&mut self) { let world = &self.world; for script in self.scripts.get_scripts_mut() { @@ -201,6 +273,7 @@ impl Game { pub fn update(&mut self) { self.handle_actions(); + self.add_all_scripts(); self.run_scripts(); self.add_new_entities(); self.remove_entities(); @@ -388,11 +461,11 @@ mod tests { game.update(); let move_script = Box::new(MoveScript::default()); - game.scripts.add_script(move_script); + game.scripts.schedule_script_for_mount(move_script); game.update(); let velocity_script = Box::new(VelocityScript::default()); - game.scripts.add_script(velocity_script); + game.scripts.schedule_script_for_mount(velocity_script); game.update(); game.action_holder.add_handler(MoveAction::make_handler()); diff --git a/lib/world/src/scripts/game_script.rs b/lib/world/src/scripts/game_script.rs index 5c35f13..f2067e0 100644 --- a/lib/world/src/scripts/game_script.rs +++ b/lib/world/src/scripts/game_script.rs @@ -19,12 +19,21 @@ use serde_json::{from_value, to_value}; use std::any::Any; use std::cell::RefCell; use std::collections::HashMap; +use std::collections::HashSet; use std::fmt::Debug; use std::sync::Mutex; use wasm_bindgen::prelude::wasm_bindgen; use wasm_bindgen::{JsCast, JsValue}; pub trait GameScript: Any + Debug { + fn on_script_mounted( + &mut self, + _all_chunk_ids: &HashSet, + _all_entity_ids: &HashSet, + ) { + // Default implementation does nothing + } + fn update( &mut self, _world: &World, @@ -89,6 +98,7 @@ impl std::fmt::Display for ScriptNotFoundError { #[wasm_bindgen] pub struct GameScripts { scripts: Vec>, + scripts_to_add: Vec>, } impl Clone for GameScripts { @@ -140,7 +150,10 @@ impl<'de> Deserialize<'de> for GameScripts { let GameScriptHelper { scripts } = GameScriptHelper::deserialize(deserializer)?; - let mut game_scripts = GameScripts { scripts: vec![] }; + let mut game_scripts = GameScripts { + scripts: vec![], + scripts_to_add: vec![], + }; for item in scripts { let js_config: JsValue = JSON::parse(&item.config).unwrap(); @@ -174,7 +187,25 @@ impl GameScripts { }) } - pub fn add_script(&mut self, script: Box) { + pub fn schedule_script_for_mount(&mut self, script: Box) { + self.scripts_to_add.push(script); + } + + pub fn add_all_scheduled_scripts( + &mut self, + all_chunk_ids: &HashSet, + all_entity_ids: &HashSet, + ) { + let scripts = std::mem::take(&mut self.scripts_to_add); + for script in scripts { + let script_name = script.get_name(); + self.add_script(script); + let script = self.get_script_by_name_mut(script_name).unwrap(); + script.on_script_mounted(all_chunk_ids, all_entity_ids); + } + } + + fn add_script(&mut self, script: Box) { js_log(&format!("Adding script {}", script.get_name())); let name = script.get_name(); if let Some(idx) = self.scripts.iter().position(|s| s.get_name() == name) { @@ -223,7 +254,7 @@ impl GameScripts { } let game_script = GameScripts::build_script_from_registry(script_name); - self.add_script(game_script); + self.schedule_script_for_mount(game_script); } pub fn get_script_state(&self, script_name: String) -> JsValue { @@ -326,6 +357,7 @@ pub struct WasmGameScript { context: JsValue, get_config_jsfn: js_sys::Function, set_config_jsfn: js_sys::Function, + on_script_mounted_jsfn: js_sys::Function, on_chunk_update_jsfn: js_sys::Function, on_entity_update_jsfn: js_sys::Function, } @@ -360,6 +392,8 @@ impl WasmGameScript { js_class_instance )); + let on_script_mounted_jsfn = get(&js_class_instance, &JsValue::from("onScriptMounted")) + .expect("Can't find method onScriptMounted"); let on_chunk_update_jsfn = get(&js_class_instance, &JsValue::from("onChunkUpdate")) .expect("Can't find method onChunkUpdate"); let on_entity_update_jsfn = get(&js_class_instance, &JsValue::from("onEntityUpdate")) @@ -371,6 +405,7 @@ impl WasmGameScript { WasmGameScript { name, + on_script_mounted_jsfn: on_script_mounted_jsfn.into(), on_chunk_update_jsfn: on_chunk_update_jsfn.into(), on_entity_update_jsfn: on_entity_update_jsfn.into(), get_config_jsfn: get_config_jsfn.into(), @@ -402,6 +437,18 @@ impl GameScript for WasmGameScript { self.set_config_jsfn.call1(&self.context, &config).unwrap(); } + fn on_script_mounted( + &mut self, + all_chunk_ids: &HashSet, + all_entity_ids: &HashSet, + ) { + let val = serde_wasm_bindgen::to_value(&all_chunk_ids).unwrap(); + let val2 = serde_wasm_bindgen::to_value(&all_entity_ids).unwrap(); + self.on_script_mounted_jsfn + .call2(&self.context, &val, &val2) + .unwrap(); + } + fn on_chunk_update(&self, chunk_id: ChunkId) { let val = serde_wasm_bindgen::to_value(&chunk_id).unwrap(); self.on_chunk_update_jsfn diff --git a/lib/world/src/world/world_chunk.rs b/lib/world/src/world/world_chunk.rs index 6ece316..2d3ad5e 100644 --- a/lib/world/src/world/world_chunk.rs +++ b/lib/world/src/world/world_chunk.rs @@ -2,7 +2,11 @@ use wasm_bindgen::prelude::wasm_bindgen; use super::{ChunkNotLoadedError, World, WorldStateDiff}; use crate::{ - chunk::{chunk::Chunk, chunk_mesh::ChunkMesh, chunk_pos::ChunkPos}, + chunk::{ + chunk::{Chunk, ChunkId}, + chunk_mesh::ChunkMesh, + chunk_pos::ChunkPos, + }, components::world_pos::WorldPos, game::Game, }; @@ -30,6 +34,10 @@ impl World { self.get_chunk(&world_pos.to_chunk_pos()) } + pub fn get_all_chunk_ids(&self) -> HashSet { + self.chunks.keys().map(|&k| k as u64).collect() + } + pub fn get_mut_chunk( &mut self, chunk_pos: &ChunkPos, From 1c5f0a531645c3a99e6987f4ec7a549994d442d0 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 25 Jan 2026 05:16:25 +0000 Subject: [PATCH 56/61] remove unneeded mount --- lib/world/src/game.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/world/src/game.rs b/lib/world/src/game.rs index ef40a76..8d964a7 100644 --- a/lib/world/src/game.rs +++ b/lib/world/src/game.rs @@ -111,8 +111,6 @@ impl Game { .add_handler(SecondaryBeltAction::make_handler()); self.action_holder .add_handler(SelectItemAction::make_handler()); - - self.update(); } #[wasm_bindgen(constructor)] From 281bac34ad041f0d31c056d245b4ad446055fbe3 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 25 Jan 2026 05:19:18 +0000 Subject: [PATCH 57/61] devlog update --- DEVLOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DEVLOG.md b/DEVLOG.md index 71f37fd..2632103 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -2,6 +2,8 @@ Working on loading chunks with the server. I started to launch chunk requests in the background so I don't have to await on the consume single chunk request. +Looks like multiplayer is working. But the client and server are hopelessly out of sync. I also don't know why the client is so slow, I need to figure that out. That should help. But really I need to add deltas to the update functions and I need to have the server sync the position with the client. + # 01_11_26 Worked on the starting flow for making a client and server game. The joining and starting of a game seems to have some race condition because I have to refresh the page to actually join. From 1926887bb72f1e169722081b5273780974f6a495 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 25 Jan 2026 05:28:59 +0000 Subject: [PATCH 58/61] Removed game updates outside of the game loop --- apps/web-client/src/services/running-game.ts | 2 -- .../src/services/sp-games-service.ts | 10 +++--- lib/world/src/entities/player.rs | 1 - lib/world/src/game.rs | 4 +-- lib/world/src/scripts/game_script.rs | 24 ++++++++----- lib/world/src/scripts/sandbox.rs | 35 ++++++++++++++++++- 6 files changed, 55 insertions(+), 21 deletions(-) diff --git a/apps/web-client/src/services/running-game.ts b/apps/web-client/src/services/running-game.ts index d9f3ff8..ef79d3f 100644 --- a/apps/web-client/src/services/running-game.ts +++ b/apps/web-client/src/services/running-game.ts @@ -170,8 +170,6 @@ export async function loadInitialChunks( ) { const { game } = runningGame; console.log("Loading initial chunks"); - game.run_scripts(); - async function task() { await new Promise((resolve) => setTimeout(resolve, 0)); } diff --git a/apps/web-client/src/services/sp-games-service.ts b/apps/web-client/src/services/sp-games-service.ts index 9452c30..855562a 100644 --- a/apps/web-client/src/services/sp-games-service.ts +++ b/apps/web-client/src/services/sp-games-service.ts @@ -62,17 +62,17 @@ export async function run( log("The Game", game); (window as any).game = game; + // ===== Main Player ===== + const mainPlayerUid = getMyUid(); + game.makeAndAddPlayer(mainPlayerUid); + game.add_new_entities(); + // ===== Game Scripts ===== log("Ensuring scripts"); game.ensureScript(SandBoxGScript.name()); game.ensureScript(GameRendererGameScript.name); game.add_all_scripts(); - // ===== Main Player ===== - const mainPlayerUid = getMyUid(); - game.makeAndAddPlayer(mainPlayerUid); - game.update(); - // ===== Running Game ===== const runningGame = new RunningGame(game, mainPlayerUid); diff --git a/lib/world/src/entities/player.rs b/lib/world/src/entities/player.rs index 0df6c4c..b6eca57 100644 --- a/lib/world/src/entities/player.rs +++ b/lib/world/src/entities/player.rs @@ -107,6 +107,5 @@ impl Game { } let player = Player::make_entity(uid); self.schedule_entity_insert(player); - self.update(); } } diff --git a/lib/world/src/game.rs b/lib/world/src/game.rs index 8d964a7..35f4b3c 100644 --- a/lib/world/src/game.rs +++ b/lib/world/src/game.rs @@ -185,10 +185,8 @@ impl Game { } pub fn add_all_scripts(&mut self) { - let all_chunk_ids = self.world.get_all_chunk_ids(); - let all_entity_ids = self.entities.get_all_entity_ids(); self.scripts - .add_all_scheduled_scripts(&all_chunk_ids, &all_entity_ids); + .add_all_scheduled_scripts(&self.world, &self.entities, &mut self.chunk_fetcher); } pub fn run_scripts(&mut self) { diff --git a/lib/world/src/scripts/game_script.rs b/lib/world/src/scripts/game_script.rs index f2067e0..cfa692d 100644 --- a/lib/world/src/scripts/game_script.rs +++ b/lib/world/src/scripts/game_script.rs @@ -1,6 +1,6 @@ use crate::chunk::chunk::ChunkId; use crate::chunk::chunk_fetcher::ChunkFetcher; -use crate::entities::entities::{EntityQuery, EntityQueryResults}; +use crate::entities::entities::{Entities, EntityQuery, EntityQueryResults}; use crate::entities::entity::EntityId; use crate::entities::fireball::FireballScript; use crate::game::Game; @@ -19,7 +19,6 @@ use serde_json::{from_value, to_value}; use std::any::Any; use std::cell::RefCell; use std::collections::HashMap; -use std::collections::HashSet; use std::fmt::Debug; use std::sync::Mutex; use wasm_bindgen::prelude::wasm_bindgen; @@ -28,8 +27,9 @@ use wasm_bindgen::{JsCast, JsValue}; pub trait GameScript: Any + Debug { fn on_script_mounted( &mut self, - _all_chunk_ids: &HashSet, - _all_entity_ids: &HashSet, + _world: &World, + _entities: &Entities, + _chunk_fetcher: &mut ChunkFetcher, ) { // Default implementation does nothing } @@ -193,15 +193,16 @@ impl GameScripts { pub fn add_all_scheduled_scripts( &mut self, - all_chunk_ids: &HashSet, - all_entity_ids: &HashSet, + world: &World, + entities: &Entities, + chunk_fetcher: &mut ChunkFetcher, ) { let scripts = std::mem::take(&mut self.scripts_to_add); for script in scripts { let script_name = script.get_name(); self.add_script(script); let script = self.get_script_by_name_mut(script_name).unwrap(); - script.on_script_mounted(all_chunk_ids, all_entity_ids); + script.on_script_mounted(world, entities, chunk_fetcher); } } @@ -439,9 +440,14 @@ impl GameScript for WasmGameScript { fn on_script_mounted( &mut self, - all_chunk_ids: &HashSet, - all_entity_ids: &HashSet, + world: &World, + entities: &Entities, + _chunk_fetcher: &mut ChunkFetcher, ) { + // For JavaScript scripts, we pass the IDs since they can access + // the full Game object to get World/Entities data as needed + let all_chunk_ids = world.get_all_chunk_ids(); + let all_entity_ids = entities.get_all_entity_ids(); let val = serde_wasm_bindgen::to_value(&all_chunk_ids).unwrap(); let val2 = serde_wasm_bindgen::to_value(&all_entity_ids).unwrap(); self.on_script_mounted_jsfn diff --git a/lib/world/src/scripts/sandbox.rs b/lib/world/src/scripts/sandbox.rs index 541b648..d1c60fa 100644 --- a/lib/world/src/scripts/sandbox.rs +++ b/lib/world/src/scripts/sandbox.rs @@ -1,5 +1,5 @@ use crate::chunk::chunk_pos::ChunkPos; -use crate::entities::entities::{EntityQuery, EntityQueryResults}; +use crate::entities::entities::{Entities, EntityQuery, EntityQueryResults}; use crate::game::GameSchedule; use crate::scripts::game_script::GameScript; use crate::{ @@ -80,6 +80,39 @@ impl GameScript for SandBoxGScript { query } + fn on_script_mounted( + &mut self, + world: &World, + entities: &Entities, + chunk_fetcher: &mut ChunkFetcher, + ) { + web_sys::console::log_1( + &format!( + "SandBoxGScript onScriptMounted: {} chunks, {} entities", + world.get_all_chunk_ids().len(), + entities.get_all_entity_ids().len() + ) + .into(), + ); + + // Request chunks around all entities on mount + let entity_poses: Vec = entities + .get_all() + .iter() + .filter_map(|ent| ent.get::().cloned()) + .collect(); + + let nearby_unloaded_chunks: Vec = entity_poses + .iter() + .flat_map(|p| self.get_chunks_around_player(p)) + .filter(|pos| !world.has_chunk(pos)) + .collect(); + + for chunk_pos in nearby_unloaded_chunks { + chunk_fetcher.request_chunk(chunk_pos); + } + } + fn update( &mut self, world: &World, From 9b49d02a1a56ad0ba2ff36871bcee34394c718b3 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 8 Feb 2026 22:00:46 +0000 Subject: [PATCH 59/61] Add teleport action --- .../src/components/GameConfigMenu.tsx | 73 ++++++++++++++++++- lib/engine/src/playerActions.ts | 6 ++ lib/world/src/entities/entity_action.rs | 2 + lib/world/src/game.rs | 27 ++++--- lib/world/src/scripts/mod.rs | 1 + lib/world/src/scripts/player_tp_script.rs | 67 +++++++++++++++++ 6 files changed, 164 insertions(+), 12 deletions(-) create mode 100644 lib/world/src/scripts/player_tp_script.rs diff --git a/apps/web-client/src/components/GameConfigMenu.tsx b/apps/web-client/src/components/GameConfigMenu.tsx index 0ac2645..742a982 100644 --- a/apps/web-client/src/components/GameConfigMenu.tsx +++ b/apps/web-client/src/components/GameConfigMenu.tsx @@ -2,6 +2,7 @@ import React, { useEffect, useState } from "react"; import { BooleanInput, NumberInput, TextInput } from "./ui/Inputs"; import { RunningGame } from "../services/sp-games-service"; import { useNavigate } from "react-router-dom"; +import { TeleportAction } from "@craft/rust-world"; interface GameConfigMenuProps { runningGame: RunningGame; @@ -20,7 +21,7 @@ interface ChunkFetcherConfig { }; } -type ActiveTab = "Chunk Fetcher" | "Game Config" | string; +type ActiveTab = "Chunk Fetcher" | "Game Config" | "Player Actions" | string; function MenuLabel({ children }: { children: React.ReactNode }) { return {children}; @@ -40,8 +41,24 @@ export function GameConfigMenu({ useState(game.serializeChunkFetcher()); const [activeTab, setActiveTab] = useState("Game Config"); const [gameName, setGameName] = useState(game.name); + const [tpX, setTpX] = useState(0); + const [tpY, setTpY] = useState(0); + const [tpZ, setTpZ] = useState(0); const navigate = useNavigate(); + // Load current player position when Player Actions tab is opened + useEffect(() => { + if (isOpen && activeTab === "Player Actions") { + const player = game.getEntityAsPlayer(runningGame.playerId); + if (player) { + const pos = player.pos; + setTpX(Math.round(pos.x * 100) / 100); + setTpY(Math.round(pos.y * 100) / 100); + setTpZ(Math.round(pos.z * 100) / 100); + } + } + }, [isOpen, activeTab]); + useEffect(() => { if (isOpen && runningGame) { // Get all script names @@ -129,6 +146,11 @@ export function GameConfigMenu({ setGameName(value); }; + const handleTeleport = () => { + const action = TeleportAction.make_wasm(runningGame.playerId, tpX, tpY, tpZ); + runningGame.onAction(action); + }; + const handleSaveGame = () => { runningGame.save(); }; @@ -290,6 +312,17 @@ export function GameConfigMenu({ Chunk Fetcher + {/* Player Actions Tab */} + + {/* Script Tabs */} {scriptNames.map((name) => (
+ ) : activeTab === "Player Actions" ? ( +
+

+ Player Actions +

+ +

Teleport

+
+ X: + setTpX(v)} + /> +
+
+ Y: + setTpY(v)} + /> +
+
+ Z: + setTpZ(v)} + /> +
+ +
) : activeTab === "Game Config" ? (

diff --git a/lib/engine/src/playerActions.ts b/lib/engine/src/playerActions.ts index b645225..d783dca 100644 --- a/lib/engine/src/playerActions.ts +++ b/lib/engine/src/playerActions.ts @@ -8,6 +8,7 @@ import { SecondaryBeltAction, SelectItemAction, SphericalRotation, + TeleportAction, UsePrimaryItemAction, } from "@craft/rust-world"; export abstract class PlayerController { @@ -83,6 +84,11 @@ export abstract class PlayerController { this.handleAction(action); } + teleport(x: number, y: number, z: number) { + const action = TeleportAction.make_wasm(this.playerId, x, y, z); + this.handleAction(action); + } + toggleCreative() { // const action = PlayerAction.make(PlayerActionType.ToggleCreative, { // playerUid: this.player.uid, diff --git a/lib/world/src/entities/entity_action.rs b/lib/world/src/entities/entity_action.rs index 1af8553..c4c100e 100644 --- a/lib/world/src/entities/entity_action.rs +++ b/lib/world/src/entities/entity_action.rs @@ -7,6 +7,7 @@ use crate::scripts::player_belt_script::{ use crate::scripts::player_jump_script::JumpActionData; use crate::scripts::player_move_script::MoveActionData; use crate::scripts::player_rot_script::RotateActionData; +use crate::scripts::player_tp_script::TeleportActionData; use crate::utils::js_log; use crate::world::World; use lazy_static::lazy_static; @@ -78,6 +79,7 @@ lazy_static! { register_action::(&mut map, "SecondaryBeltAction"); register_action::(&mut map, "SelectItemAction"); register_action::(&mut map, "Jump-Action"); + register_action::(&mut map, "Teleport"); Mutex::new(map) }; diff --git a/lib/world/src/game.rs b/lib/world/src/game.rs index 35f4b3c..a030409 100644 --- a/lib/world/src/game.rs +++ b/lib/world/src/game.rs @@ -18,6 +18,7 @@ use crate::{ player_jump_script::JumpAction, player_move_script::{MoveAction, MoveScript}, player_rot_script::RotateAction, + player_tp_script::TeleportAction, velocity_script::VelocityScript, }, terrain_gen::TerrainGenerator, @@ -111,6 +112,8 @@ impl Game { .add_handler(SecondaryBeltAction::make_handler()); self.action_holder .add_handler(SelectItemAction::make_handler()); + self.action_holder + .add_handler(TeleportAction::make_handler()); } #[wasm_bindgen(constructor)] @@ -189,12 +192,12 @@ impl Game { .add_all_scheduled_scripts(&self.world, &self.entities, &mut self.chunk_fetcher); } - pub fn run_scripts(&mut self) { + pub fn run_scripts(&mut self, delta_ms: f32) { let world = &self.world; for script in self.scripts.get_scripts_mut() { let query = script.get_query(); let query_results = self.entities.query(&query); - let diff = script.update(world, query_results, &mut self.chunk_fetcher); + let diff = script.update(world, query_results, &mut self.chunk_fetcher, delta_ms); if let Some(diff) = diff { self.schedule.combine(diff); } @@ -267,10 +270,10 @@ impl Game { self.schedule.removed_blocks.clear(); } - pub fn update(&mut self) { + pub fn update(&mut self, delta_ms: f32) { self.handle_actions(); self.add_all_scripts(); - self.run_scripts(); + self.run_scripts(delta_ms); self.add_new_entities(); self.remove_entities(); // TODO: this shouldn't be async @@ -418,12 +421,14 @@ mod tests { }; use super::*; + const TEST_DELTA_MS: f32 = 16.67; + #[test] pub fn add_player() { let mut game = Game::new(); let player = Player::make_entity(1); game.schedule_entity_insert(player); - game.update(); + game.update(TEST_DELTA_MS); // expect game to have a player in it game.entities.get_all_mut().iter().for_each(|ent| { @@ -436,12 +441,12 @@ mod tests { let mut game = Game::new(); let player = Player::make_entity(1); game.schedule_entity_insert(player); - game.update(); + game.update(TEST_DELTA_MS); let jump_action_handler = JumpAction::make_handler(); game.action_holder.add_handler(jump_action_handler); let jump_action = JumpAction::make_dto(1, JumpActionData {}); game.action_holder.add(jump_action); - game.update(); + game.update(TEST_DELTA_MS); let player = game.entities.get_entity_by_id(1).unwrap(); let player_vel = player.get::().unwrap(); assert!(player_vel.y > 0.0); @@ -454,15 +459,15 @@ mod tests { player.print_components(); game.schedule_entity_insert(player); - game.update(); + game.update(TEST_DELTA_MS); let move_script = Box::new(MoveScript::default()); game.scripts.schedule_script_for_mount(move_script); - game.update(); + game.update(TEST_DELTA_MS); let velocity_script = Box::new(VelocityScript::default()); game.scripts.schedule_script_for_mount(velocity_script); - game.update(); + game.update(TEST_DELTA_MS); game.action_holder.add_handler(MoveAction::make_handler()); @@ -473,7 +478,7 @@ mod tests { }, ); game.action_holder.add(move_action); - game.update(); + game.update(TEST_DELTA_MS); let player = game.entities.get_entity_by_id(1).unwrap(); let player_pos = player.get::().unwrap(); diff --git a/lib/world/src/scripts/mod.rs b/lib/world/src/scripts/mod.rs index 0c6b0ff..6c11b5f 100644 --- a/lib/world/src/scripts/mod.rs +++ b/lib/world/src/scripts/mod.rs @@ -6,4 +6,5 @@ pub mod player_move_script; pub mod player_rot_script; pub mod sandbox; pub mod script_map; +pub mod player_tp_script; pub mod velocity_script; diff --git a/lib/world/src/scripts/player_tp_script.rs b/lib/world/src/scripts/player_tp_script.rs new file mode 100644 index 0000000..5acb508 --- /dev/null +++ b/lib/world/src/scripts/player_tp_script.rs @@ -0,0 +1,67 @@ +use serde::{Deserialize, Serialize}; + +use crate::components::fine_world_pos::FineWorldPos; +use crate::components::velocity::Velocity; +use crate::entities::entity::{Entity, EntityId}; +use crate::entities::entity_action::{EntityActionDto, EntityActionDtoMaker, EntityActionHandler}; +use crate::game::GameSchedule; +use crate::utils::js_log; +use crate::world::World; +use wasm_bindgen::prelude::wasm_bindgen; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct TeleportActionData { + pub x: f32, + pub y: f32, + pub z: f32, +} + +#[derive(Clone, Debug, Default)] +#[wasm_bindgen] +pub struct TeleportAction {} + +impl EntityActionDtoMaker for TeleportAction { + fn get_action_type_static() -> &'static str { + "Teleport" + } +} + +impl EntityActionHandler for TeleportAction { + fn get_action_type(&self) -> &'static str { + "Teleport" + } + + fn handle_dto( + &self, + _world: &World, + entity: &mut Entity, + data: &EntityActionDto, + ) -> GameSchedule { + let data = data.get_data::().unwrap(); + + let new_pos = FineWorldPos { + x: data.x, + y: data.y, + z: data.z, + }; + + js_log(&format!("Teleporting entity to {:?}", new_pos)); + + entity.set::(new_pos); + entity.set::(Velocity::default()); + + GameSchedule::empty() + } +} + +pub mod wasm { + use super::*; + + #[wasm_bindgen] + impl TeleportAction { + pub fn make_wasm(entity_id: EntityId, x: f32, y: f32, z: f32) -> EntityActionDto { + let data = TeleportActionData { x, y, z }; + TeleportAction::make_dto(entity_id, data) + } + } +} From c62b57342aa71b1de2295be0a14d62faa5e71104 Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 8 Feb 2026 22:52:48 +0000 Subject: [PATCH 60/61] Refactor rotation handling in player actions; update game scripts to support fixed timestep updates and entity synchronization. Added new entity sync endpoint and improved serialization logic for entities. --- apps/server/src/server-game-manager.ts | 30 ++++- apps/server/src/server.ts | 13 ++ .../src/services/entity-sync-checker.ts | 126 ++++++++++++++++++ .../src/services/mp-games-service.ts | 2 +- apps/web-client/src/services/running-game.ts | 59 +++++++- lib/engine/src/playerActions.ts | 6 +- lib/engine/src/serialize.ts | 3 +- lib/world/src/entities/entities.rs | 7 + lib/world/src/entities/fireball.rs | 1 + lib/world/src/geometry/rotation.rs | 4 + lib/world/src/scripts/game_script.rs | 2 + .../src/scripts/player_gravity_script.rs | 1 + lib/world/src/scripts/player_move_script.rs | 1 + lib/world/src/scripts/player_rot_script.rs | 10 +- lib/world/src/scripts/sandbox.rs | 1 + lib/world/src/scripts/velocity_script.rs | 1 + 16 files changed, 250 insertions(+), 17 deletions(-) create mode 100644 apps/web-client/src/services/entity-sync-checker.ts diff --git a/apps/server/src/server-game-manager.ts b/apps/server/src/server-game-manager.ts index aeb109b..a5a179a 100644 --- a/apps/server/src/server-game-manager.ts +++ b/apps/server/src/server-game-manager.ts @@ -23,6 +23,8 @@ type ClientId = number; const AUTO_SAVE_GAME = false; const AUTO_SAVE_GAME_INTERVAL = 5000; +const FIXED_TIMESTEP_MS = 1000 / 60; // 16.67ms = 60 ticks per second +const FPS_LOG_INTERVAL_MS = 5000; // Log FPS every 5 seconds const makeGameLogger = (gameId: string) => { return makeLogger(`ServerGameManager:${gameId}`); @@ -71,6 +73,10 @@ export class ServerGameManager { is_running = false; log: (...args: any[]) => void; + // FPS tracking + private updateCount = 0; + private lastFpsLogTime = Date.now(); + static async create( gameDto: ISerializedGame, socketService: SocketServer, @@ -80,7 +86,7 @@ export class ServerGameManager { const log = makeGameLogger(game.id); game.ensureScript(SandBoxGScript.name()); - game.run_scripts(); + game.run_scripts(FIXED_TIMESTEP_MS); async function task() { await new Promise((resolve) => setTimeout(resolve, 0)); @@ -135,13 +141,13 @@ export class ServerGameManager { } this.game.makeAndAddPlayer(myUid); + this.game.add_new_entities(); // Ensure player is added before serializing const entities = this.game.serializeEntities(); - this.log("Entities", JSON.stringify(entities, null, 2)); // load chunks around the player - this.game.run_scripts(); + this.game.run_scripts(FIXED_TIMESTEP_MS); async function task() { await new Promise((resolve) => setTimeout(resolve, 0)); @@ -235,7 +241,19 @@ export class ServerGameManager { // } update() { - this.game.update(); + this.game.update(FIXED_TIMESTEP_MS); + this.updateCount++; + + // Log FPS periodically + const now = Date.now(); + if (now - this.lastFpsLogTime >= FPS_LOG_INTERVAL_MS) { + const elapsed = (now - this.lastFpsLogTime) / 1000; + const fps = this.updateCount / elapsed; + this.log(`Server FPS: ${fps.toFixed(1)}`); + this.updateCount = 0; + this.lastFpsLogTime = now; + } + // send game diff to clients const updatedChunks = this.getGameManagerGameScript().getUpdatedChunks(); if (updatedChunks.length > 0) { @@ -303,6 +321,10 @@ export class ServerGameManager { return this.clients.size; } + getSerializedEntities(): unknown { + return this.game.serializeEntities(); + } + save() { this.gameDb.saveGame(this.game); } diff --git a/apps/server/src/server.ts b/apps/server/src/server.ts index a21c616..70a5c99 100644 --- a/apps/server/src/server.ts +++ b/apps/server/src/server.ts @@ -115,4 +115,17 @@ app.get("/game/:id/chunk/:x/:y", async (req: Request, res: Response) => { res.send(chunk); }); +// Entity sync endpoint for client-server comparison +app.get("/game/:id/entities", async (req: Request, res: Response) => { + const { id } = req.params; + const game = games.get(id); + if (!game) { + res.status(404).send("Game not found"); + return; + } + + const entitiesJs = game.getSerializedEntities(); + res.json(entitiesJs); +}); + console.log("Server started"); diff --git a/apps/web-client/src/services/entity-sync-checker.ts b/apps/web-client/src/services/entity-sync-checker.ts new file mode 100644 index 0000000..3b46109 --- /dev/null +++ b/apps/web-client/src/services/entity-sync-checker.ts @@ -0,0 +1,126 @@ +import { Game } from "@craft/rust-world"; +import { SerializedEntities } from "@craft/engine"; + +function getPositionFromComponents( + components: [string, string][] +): { x: number; y: number; z: number } | null { + const posComponent = components.find(([name]) => + name.includes("FineWorldPos") + ); + if (!posComponent) return null; + return JSON.parse(posComponent[1]); +} + +/** + * Entity sync checker for comparing client and server entity states. + * Useful for debugging multiplayer synchronization issues. + */ +export class EntitySyncChecker { + private syncCheckInterval: number | null = null; + + constructor( + private game: Game, + private gameId: string, + private serverUrl: string + ) {} + + start(intervalMs = 1000) { + if (this.syncCheckInterval) { + this.stop(); + } + + console.log( + `[Sync] Starting entity sync check every ${intervalMs}ms for game ${this.gameId}` + ); + + this.syncCheckInterval = window.setInterval(async () => { + await this.checkSync(); + }, intervalMs); + } + + stop() { + if (this.syncCheckInterval) { + clearInterval(this.syncCheckInterval); + this.syncCheckInterval = null; + console.log("[Sync] Stopped entity sync check"); + } + } + + private async checkSync() { + try { + const response = await fetch( + `${this.serverUrl}/game/${this.gameId}/entities` + ); + if (!response.ok) { + console.error( + "[Sync] Failed to fetch server entities:", + response.statusText + ); + return; + } + + const data = (await response.json()) as SerializedEntities; + const serverEntities = data.entities; + + for (const serverEntity of serverEntities) { + const localEntity = this.game.getEntityById(serverEntity.id); + if (!localEntity) { + console.log(`[Sync] Entity ${serverEntity.id} missing locally`); + continue; + } + + const serverPos = getPositionFromComponents(serverEntity.components); + if (!serverPos) { + console.log(`[Sync] Entity ${serverEntity.id} missing position`); + continue; + } + + // Get local position from the wasm Entity object + const localPlayer = this.game.getEntityAsPlayer(serverEntity.id); + if (!localPlayer) { + console.log(`[Sync] Entity ${serverEntity.id} missing local player`); + continue; + } + + const localPos = localPlayer.pos; + if (!localPos) { + console.log( + `[Sync] Entity ${serverEntity.id} missing local position` + ); + continue; + } + + const posDiff = Math.sqrt( + Math.pow(localPos.x - serverPos.x, 2) + + Math.pow(localPos.y - serverPos.y, 2) + + Math.pow(localPos.z - serverPos.z, 2) + ); + console.log("posDiff", posDiff, "for entity", serverEntity.id); + + if (posDiff > 0.01) { + // Threshold for "different" + console.log( + `[Sync] Entity ${serverEntity.id} position diff: ${posDiff.toFixed( + 3 + )}` + ); + console.log( + ` Local: (${localPos.x.toFixed(2)}, ${localPos.y.toFixed( + 2 + )}, ${localPos.z.toFixed(2)})` + ); + console.log( + ` Server: (${serverPos.x.toFixed(2)}, ${serverPos.y.toFixed( + 2 + )}, ${serverPos.z.toFixed(2)})` + ); + } + } + + // Apply server-authoritative entity state + this.game.replaceEntities(data); + } catch (err) { + console.error("[Sync] Failed to fetch server entities:", err); + } + } +} diff --git a/apps/web-client/src/services/mp-games-service.ts b/apps/web-client/src/services/mp-games-service.ts index 04705ff..bf56cb3 100644 --- a/apps/web-client/src/services/mp-games-service.ts +++ b/apps/web-client/src/services/mp-games-service.ts @@ -138,7 +138,7 @@ export async function run( console.log("My UID", myUid); // ===== Running Game ===== - const runningGame = new RunningGame(game, myUid); + const runningGame = new RunningGame(game, myUid, true); // ===== Load Initial Chunks ===== await loadInitialChunks(runningGame, uiMessage); diff --git a/apps/web-client/src/services/running-game.ts b/apps/web-client/src/services/running-game.ts index ef79d3f..3087df1 100644 --- a/apps/web-client/src/services/running-game.ts +++ b/apps/web-client/src/services/running-game.ts @@ -4,11 +4,17 @@ import { IS_MOBILE, task } from "../utils"; import { MobileController } from "../controllers/mobileController"; import { KeyboardPlayerEntityController } from "../controllers/keyboardPlayerController"; import { GameRenderer } from "../renders/game-renderer"; +import { EntitySyncChecker } from "./entity-sync-checker"; +import { AppConfig } from "../appConfig"; export interface RunGameError { error: string; } +// Fixed timestep constants +const FIXED_TIMESTEP_MS = 1000 / 60; // 16.67ms = 60 ticks per second +const MAX_ACCUMULATED_TIME = FIXED_TIMESTEP_MS * 5; // Cap at 5 frames to prevent spiral of death + function makeListenerGroup(listenerGroupName: string) { const listeners: Array<{ func: (...args: T) => void; name: string }> = []; return { @@ -27,14 +33,35 @@ function makeListenerGroup(listenerGroupName: string) { export class RunningGame { private running = true; private pendingActions: unknown[] = []; - - constructor(public game: Game, public playerId: number) {} + private accumulatedTime = 0; + private lastFrameTime = performance.now(); + public currentFrameTime = 0; // Exposed for renderers to use + private entitySyncChecker: EntitySyncChecker | null = null; + + constructor( + public game: Game, + public playerId: number, + enableEntitySync = false + ) { + if (enableEntitySync) { + this.entitySyncChecker = new EntitySyncChecker( + this.game, + this.game.id, + AppConfig.api.baseUrl + ); + } + } public startListeners = makeListenerGroup<[]>("start"); public start() { console.log("Starting game"); this.startListeners.callAll(); + // Start entity sync checker if configured + if (this.entitySyncChecker) { + this.entitySyncChecker.start(); + } + const updateWrapper = async () => { await this.update(); if (this.running) { @@ -49,12 +76,29 @@ export class RunningGame { public cleanup() { console.log("Cleaning up game"); this.running = false; + + // Stop entity sync checker + if (this.entitySyncChecker) { + this.entitySyncChecker.stop(); + } + this.cleanupListeners.callAll(); } public updateListeners = makeListenerGroup<[]>("update"); public async update() { const start = performance.now(); + const now = performance.now(); + const frameTime = now - this.lastFrameTime; + this.lastFrameTime = now; + this.currentFrameTime = now; + + // Cap accumulated time to prevent spiral of death + this.accumulatedTime = Math.min( + this.accumulatedTime + frameTime, + MAX_ACCUMULATED_TIME + ); + // Drain pending actions from JS queue into Rust queue // This must happen in a synchronous block before any awaits for (const actionData of this.pendingActions) { @@ -62,7 +106,13 @@ export class RunningGame { } this.pendingActions = []; this.game.handle_actions(); - this.game.run_scripts(); + + // Run fixed timestep updates + while (this.accumulatedTime >= FIXED_TIMESTEP_MS) { + this.game.run_scripts(FIXED_TIMESTEP_MS); + this.accumulatedTime -= FIXED_TIMESTEP_MS; + } + await task(); this.game.add_new_entities(); await task(); @@ -129,7 +179,8 @@ export async function addGameRenderer( const gameRenderer = new GameRenderer(runningGame.game, runningGame.playerId); const update = () => { gameRenderer.update(); - gameRenderer.renderLoop(0); + // Pass actual timestamp to fix FPS counter (was hardcoded to 0) + gameRenderer.renderLoop(runningGame.currentFrameTime); }; const cleanup = () => { gameRenderer.cleanup(); diff --git a/lib/engine/src/playerActions.ts b/lib/engine/src/playerActions.ts index d783dca..c92c653 100644 --- a/lib/engine/src/playerActions.ts +++ b/lib/engine/src/playerActions.ts @@ -24,8 +24,12 @@ export abstract class PlayerController { } rotate(x: number, y: number) { + const player = this.game.getEntityAsPlayer(this.playerId); + if (!player) return; + const currentRot = player.rot; const rotDiff = SphericalRotation.new_wasm(x, y); - const action = RotateAction.make_wasm(this.playerId, rotDiff); + const newRot = currentRot.add(rotDiff); + const action = RotateAction.make_wasm(this.playerId, newRot); this.handleAction(action); } diff --git a/lib/engine/src/serialize.ts b/lib/engine/src/serialize.ts index 3d598b3..e8ab1b8 100644 --- a/lib/engine/src/serialize.ts +++ b/lib/engine/src/serialize.ts @@ -53,7 +53,8 @@ export interface ISerializedWorld { export interface SerializedEntity { id: number; - components: string[]; + name: string; + components: [string, string][]; // [typeName, jsonValue] } export interface SerializedEntities { diff --git a/lib/world/src/entities/entities.rs b/lib/world/src/entities/entities.rs index 5e68934..1a2ce6c 100644 --- a/lib/world/src/entities/entities.rs +++ b/lib/world/src/entities/entities.rs @@ -154,6 +154,13 @@ impl Game { pub fn add_entity(&mut self, entity: Entity) { self.entities.add_entity(entity); } + + #[wasm_bindgen(js_name = "replaceEntities")] + pub fn replace_entities(&mut self, entities_js: JsValue) -> Result<(), serde_wasm_bindgen::Error> { + let entities: Entities = from_value(entities_js)?; + self.entities = entities; + Ok(()) + } } #[wasm_bindgen] diff --git a/lib/world/src/entities/fireball.rs b/lib/world/src/entities/fireball.rs index e38fee2..e3b0b3a 100644 --- a/lib/world/src/entities/fireball.rs +++ b/lib/world/src/entities/fireball.rs @@ -91,6 +91,7 @@ impl GameScript for FireballScript { world: &crate::world::World, mut query_results: EntityQueryResults, _chunk_fetcher: &mut ChunkFetcher, + _delta_ms: f32, ) -> Option { let mut game_schedule = GameSchedule::empty(); diff --git a/lib/world/src/geometry/rotation.rs b/lib/world/src/geometry/rotation.rs index b3174b9..55b2251 100644 --- a/lib/world/src/geometry/rotation.rs +++ b/lib/world/src/geometry/rotation.rs @@ -21,6 +21,10 @@ impl SphericalRotation { pub fn new_wasm(theta: f32, phi: f32) -> SphericalRotation { SphericalRotation { theta, phi } } + + pub fn add(&self, other: &SphericalRotation) -> SphericalRotation { + *self + *other + } } impl_component!(SphericalRotation); diff --git a/lib/world/src/scripts/game_script.rs b/lib/world/src/scripts/game_script.rs index cfa692d..8d4081d 100644 --- a/lib/world/src/scripts/game_script.rs +++ b/lib/world/src/scripts/game_script.rs @@ -39,6 +39,7 @@ pub trait GameScript: Any + Debug { _world: &World, _query_results: EntityQueryResults, _chunk_fetcher: &mut ChunkFetcher, + _delta_ms: f32, ) -> Option { None } @@ -422,6 +423,7 @@ impl GameScript for WasmGameScript { _world: &World, _query_results: EntityQueryResults, _chunk_fetcher: &mut ChunkFetcher, + _delta_ms: f32, ) -> Option { None } diff --git a/lib/world/src/scripts/player_gravity_script.rs b/lib/world/src/scripts/player_gravity_script.rs index cfb7f57..961d960 100644 --- a/lib/world/src/scripts/player_gravity_script.rs +++ b/lib/world/src/scripts/player_gravity_script.rs @@ -68,6 +68,7 @@ impl GameScript for GravityScript { _world: &World, query_results: EntityQueryResults, _chunk_fetcher: &mut ChunkFetcher, + _delta_ms: f32, ) -> Option { for entity in query_results.entities { let data = entity.get::().unwrap(); diff --git a/lib/world/src/scripts/player_move_script.rs b/lib/world/src/scripts/player_move_script.rs index b1a1e44..52a5730 100644 --- a/lib/world/src/scripts/player_move_script.rs +++ b/lib/world/src/scripts/player_move_script.rs @@ -99,6 +99,7 @@ impl GameScript for MoveScript { _world: &crate::world::World, query_results: EntityQueryResults, _chunk_fetcher: &mut ChunkFetcher, + _delta_ms: f32, ) -> Option { for entity in query_results.entities { let rot = entity.get::().unwrap().to_owned(); diff --git a/lib/world/src/scripts/player_rot_script.rs b/lib/world/src/scripts/player_rot_script.rs index 4ee5990..43a0432 100644 --- a/lib/world/src/scripts/player_rot_script.rs +++ b/lib/world/src/scripts/player_rot_script.rs @@ -9,7 +9,7 @@ use wasm_bindgen::prelude::wasm_bindgen; #[wasm_bindgen] #[derive(Clone, Debug, Serialize, Deserialize)] pub struct RotateActionData { - pub rot_diff: SphericalRotation, + pub rot: SphericalRotation, } #[wasm_bindgen] @@ -34,9 +34,7 @@ impl EntityActionHandler for RotateAction { ) -> GameSchedule { let data = data.get_data::().unwrap(); - let new_rot = entity.get::().unwrap().to_owned() + data.rot_diff; - - entity.set::(new_rot); + entity.set::(data.rot); GameSchedule::empty() } @@ -49,8 +47,8 @@ pub mod wasm { #[wasm_bindgen] impl RotateAction { - pub fn make_wasm(entity_id: EntityId, rot_diff: SphericalRotation) -> EntityActionDto { - let data = RotateActionData { rot_diff }; + pub fn make_wasm(entity_id: EntityId, rot: SphericalRotation) -> EntityActionDto { + let data = RotateActionData { rot }; RotateAction::make_dto(entity_id, data) } diff --git a/lib/world/src/scripts/sandbox.rs b/lib/world/src/scripts/sandbox.rs index d1c60fa..1498ba2 100644 --- a/lib/world/src/scripts/sandbox.rs +++ b/lib/world/src/scripts/sandbox.rs @@ -118,6 +118,7 @@ impl GameScript for SandBoxGScript { world: &World, query_results: EntityQueryResults, chunk_fetcher: &mut ChunkFetcher, + _delta_ms: f32, ) -> Option { let entity_poses: Vec = query_results .entities diff --git a/lib/world/src/scripts/velocity_script.rs b/lib/world/src/scripts/velocity_script.rs index e1cb41b..4ffc4b0 100644 --- a/lib/world/src/scripts/velocity_script.rs +++ b/lib/world/src/scripts/velocity_script.rs @@ -62,6 +62,7 @@ impl GameScript for VelocityScript { world: &crate::world::World, query_results: EntityQueryResults, _chunk_fetcher: &mut ChunkFetcher, + _delta_ms: f32, ) -> Option { for entity in query_results.entities { let mut vel = entity.get::().unwrap().to_owned(); From 75d27f0ff03973c2577d3f249f044594350018bf Mon Sep 17 00:00:00 2001 From: Tyler Tracy Date: Sun, 8 Feb 2026 23:22:07 +0000 Subject: [PATCH 61/61] Server syncing works! --- apps/server/src/server-game-manager.ts | 2 + .../src/components/ServerGameView.tsx | 89 +++++++++++-------- .../controllers/keyboardPlayerController.ts | 2 +- .../src/controllers/mobileController.ts | 2 +- .../src/game-scripts/agent-gscript.ts | 1 + apps/web-client/src/renders/game-renderer.ts | 2 +- apps/web-client/src/renders/player-render.ts | 16 ++-- apps/web-client/src/services/running-game.ts | 2 +- lib/engine/src/playerActions.ts | 24 +++-- lib/engine/tsconfig.tsbuildinfo | 2 +- 10 files changed, 89 insertions(+), 53 deletions(-) diff --git a/apps/server/src/server-game-manager.ts b/apps/server/src/server-game-manager.ts index a5a179a..b189b37 100644 --- a/apps/server/src/server-game-manager.ts +++ b/apps/server/src/server-game-manager.ts @@ -275,6 +275,7 @@ export class ServerGameManager { start() { this.log("Starting game"); + this.is_running = true; if (this.timer) { clearInterval(this.timer); } @@ -294,6 +295,7 @@ export class ServerGameManager { } stop() { + this.is_running = false; if (this.timer) { clearInterval(this.timer); this.timer = null; diff --git a/apps/web-client/src/components/ServerGameView.tsx b/apps/web-client/src/components/ServerGameView.tsx index 84f3522..2e49d86 100644 --- a/apps/web-client/src/components/ServerGameView.tsx +++ b/apps/web-client/src/components/ServerGameView.tsx @@ -7,11 +7,14 @@ import { CreateGameOptions } from "@craft/rust-world"; export function ServerGameView() { const { gameId } = useParams<{ gameId: string }>(); const navigate = useNavigate(); - const [gameName, setGameName] = useState(""); - const [flatWorld, setFlatWorld] = useState(false); - const [flatWorldHeight, setFlatWorldHeight] = useState(0); - const [debugWorld, setDebugWorld] = useState(false); - const [seed, setSeed] = useState(0); + const defaultOptions = CreateGameOptions.default(); + const [gameName, setGameName] = useState(defaultOptions.name); + const [seed, setSeed] = useState(defaultOptions.seed); + const [flatWorld, setFlatWorld] = useState(defaultOptions.flatWorld); + const [flatWorldHeight, setFlatWorldHeight] = useState( + defaultOptions.flatWorldHeight + ); + const [debugWorld, setDebugWorld] = useState(defaultOptions.debugWorld); async function createGame() { const id = await create( @@ -29,36 +32,52 @@ export function ServerGameView() { if (!gameId) { return (
- setGameName(e.target.value)} - /> - setFlatWorldHeight(Number(e.target.value))} - /> - setDebugWorld(e.target.checked)} - /> - setSeed(Number(e.target.value))} - /> - setFlatWorld(e.target.checked)} - /> + Create Game +
+ + setGameName(e.target.value)} + /> +
+
+ + setSeed(Number(e.target.value))} + /> +
+
+ + setFlatWorld(e.target.checked)} + /> +
+
+ + setFlatWorldHeight(Number(e.target.value))} + /> +
+
+ + setDebugWorld(e.target.checked)} + /> +
); diff --git a/apps/web-client/src/controllers/keyboardPlayerController.ts b/apps/web-client/src/controllers/keyboardPlayerController.ts index 3c33bb1..fe4af32 100644 --- a/apps/web-client/src/controllers/keyboardPlayerController.ts +++ b/apps/web-client/src/controllers/keyboardPlayerController.ts @@ -220,6 +220,6 @@ export class KeyboardPlayerEntityController extends PlayerController { } update() { - // NO-OP + this.resetFrame(); } } diff --git a/apps/web-client/src/controllers/mobileController.ts b/apps/web-client/src/controllers/mobileController.ts index 56dc5a5..3156090 100644 --- a/apps/web-client/src/controllers/mobileController.ts +++ b/apps/web-client/src/controllers/mobileController.ts @@ -192,7 +192,7 @@ export class MobileController extends PlayerController { } update() { - // NO-OP + this.resetFrame(); } cleanup(): void { diff --git a/apps/web-client/src/game-scripts/agent-gscript.ts b/apps/web-client/src/game-scripts/agent-gscript.ts index c71668b..50da541 100644 --- a/apps/web-client/src/game-scripts/agent-gscript.ts +++ b/apps/web-client/src/game-scripts/agent-gscript.ts @@ -7,6 +7,7 @@ import { GameScript } from "@craft/engine/game-script"; export class AiAgentController extends PlayerController { update(): void { + this.resetFrame(); this.move([Direction.Forwards]); } diff --git a/apps/web-client/src/renders/game-renderer.ts b/apps/web-client/src/renders/game-renderer.ts index a4246a9..d6ad87d 100644 --- a/apps/web-client/src/renders/game-renderer.ts +++ b/apps/web-client/src/renders/game-renderer.ts @@ -279,7 +279,7 @@ export class GameRenderer { getCamera(): Camera { const player = this.game.getEntityAsPlayer(this.mainPlayerId); if (!player) { - throw new Error("Player not found"); + throw new Error("Main player not found with id " + this.mainPlayerId); } if (this.isXr) { return makeXRCamera(player); diff --git a/apps/web-client/src/renders/player-render.ts b/apps/web-client/src/renders/player-render.ts index ca65cb3..c6268c3 100644 --- a/apps/web-client/src/renders/player-render.ts +++ b/apps/web-client/src/renders/player-render.ts @@ -39,15 +39,15 @@ export class PlayerRenderer extends Renderer { render(camera: Camera) { const player = this.game.getEntityAsPlayer(this.entityId); - console.log( - "Rendering player with id", - this.entityId, - player?.pos.x, - player?.pos.y, - player?.pos.z - ); + // console.log( + // "Rendering player with id", + // this.entityId, + // player?.pos.x, + // player?.pos.y, + // player?.pos.z + // ); if (!player) { - throw new Error("Player not found"); + throw new Error("Player with id " + this.entityId + " not found"); } const player_render_wrapper = new PlayerRenderWrapper(player); this.calculateBuffers(player_render_wrapper); diff --git a/apps/web-client/src/services/running-game.ts b/apps/web-client/src/services/running-game.ts index 3087df1..7437a8f 100644 --- a/apps/web-client/src/services/running-game.ts +++ b/apps/web-client/src/services/running-game.ts @@ -169,7 +169,7 @@ export function addPlayerController( ); }; const playerController = getPlayerController(runningGame); - runningGame.updateListeners.addListener(playerController.update, "update"); + runningGame.updateListeners.addListener(() => playerController.update(), "update"); } export async function addGameRenderer( diff --git a/lib/engine/src/playerActions.ts b/lib/engine/src/playerActions.ts index c92c653..80e57ca 100644 --- a/lib/engine/src/playerActions.ts +++ b/lib/engine/src/playerActions.ts @@ -12,6 +12,8 @@ import { UsePrimaryItemAction, } from "@craft/rust-world"; export abstract class PlayerController { + private _pendingRotation: SphericalRotation | null = null; + constructor( protected game: Game, protected handleAction: (action: EntityActionDto) => void, @@ -24,15 +26,27 @@ export abstract class PlayerController { } rotate(x: number, y: number) { - const player = this.game.getEntityAsPlayer(this.playerId); - if (!player) return; - const currentRot = player.rot; + if (!this._pendingRotation) { + const player = this.game.getEntityAsPlayer(this.playerId); + if (!player) return; + this._pendingRotation = player.rot; + } const rotDiff = SphericalRotation.new_wasm(x, y); - const newRot = currentRot.add(rotDiff); - const action = RotateAction.make_wasm(this.playerId, newRot); + this._pendingRotation = this._pendingRotation.add(rotDiff); + // Create a copy for the action since make_wasm consumes the WASM object + const rotCopy = SphericalRotation.new_wasm( + this._pendingRotation.theta, + this._pendingRotation.phi + ); + const action = RotateAction.make_wasm(this.playerId, rotCopy); this.handleAction(action); } + /** Call once per frame to reset frame-local state like the rotation accumulator. */ + resetFrame() { + this._pendingRotation = null; + } + move(direction: Direction | "None") { let action: EntityActionDto; if (direction === "None") { diff --git a/lib/engine/tsconfig.tsbuildinfo b/lib/engine/tsconfig.tsbuildinfo index 7439af2..ba97cf9 100644 --- a/lib/engine/tsconfig.tsbuildinfo +++ b/lib/engine/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/serialize.ts","./src/api-types.ts","./src/blockdata.ts","./src/vector.ts","./src/camera.ts","./src/game-script.ts","./src/playerActions.ts","./src/utils.ts","./src/index.ts","./src/messageHelpers.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,48,69,112],[47,69,112],[47,51,69,112],[48,49,50,51,52,53,54,55,69,112],[69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"629709adae9d5a1ce11fd909c06e5366c918073418fdbca68aad39964d08fb65","impliedFormat":99},{"version":"5be0d07a39109cf78a19082ded6b15f6bd4b8bef7004c732c4613cab1979155a","signature":"9c77ac4cc293efb26797c0f4842aa1c3022e5915d927b88b7ee7429f3926d840","impliedFormat":99},{"version":"4c89c2497dffcd2dec6a8ee8075719545163214393166c6c5542de09dc76ee4f","signature":"0177e6117f562265fea03e7e70f5b408861dc2281c099fcce07768a655bd8687","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"be0742a712314d1ff5abbf6e0ab8f19820b4004c8eb2881c7db28a7d71695cbc","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"1e20cfe580515334f0b432b26673699222b566ab627585b1197fd0f19dd696ef","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"c072992f5050052cd71af7ed891c172c21ea18afaa2303aecd871502cf97ed79","signature":"9976571aa23a0295864f20e952ec5ed77a9b9f533ecf510570edac12763fe3ca","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"29b5d606da6db9a01664e84fae53674ced22682a02e96e24b9e1b6497049ed6d","impliedFormat":99},{"version":"c377b02fff54ab51cd49d83cd77dedd57146f5a0dbb31ecde57694fd1ee1e48a","signature":"7d5fb2c9812ddb34bd3bcf2c4cbf3a61807603aa4b6a47d88fb7d747ae571253","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[49,1],[50,2],[52,3],[53,2],[56,4],[57,5],[54,2],[48,2],[55,5],[51,5],[47,5],[60,6],[58,5],[63,7],[59,6],[61,8],[62,6],[164,9],[163,10],[165,10],[166,5],[171,11],[174,12],[175,13],[172,5],[176,5],[177,14],[167,5],[109,15],[110,15],[111,16],[69,17],[112,18],[113,19],[114,20],[64,5],[67,21],[65,5],[66,5],[115,22],[116,23],[117,24],[118,25],[119,26],[120,27],[121,27],[123,28],[122,29],[124,30],[125,31],[126,32],[108,33],[68,5],[127,34],[128,35],[129,36],[162,37],[130,38],[131,39],[132,40],[133,41],[134,42],[135,43],[136,44],[137,45],[138,46],[139,47],[140,47],[141,48],[142,5],[143,5],[144,49],[146,50],[145,51],[147,52],[148,53],[149,54],[150,55],[151,56],[152,57],[153,58],[154,59],[155,60],[156,61],[157,62],[158,63],[159,64],[160,65],[161,66],[178,5],[169,5],[170,5],[182,67],[179,5],[181,68],[183,69],[184,5],[209,70],[210,71],[185,72],[188,72],[207,70],[208,70],[198,70],[197,73],[195,70],[190,70],[203,70],[201,70],[205,70],[189,70],[202,70],[206,70],[191,70],[192,70],[204,70],[186,70],[193,70],[194,70],[196,70],[200,70],[211,74],[199,70],[187,70],[224,75],[223,5],[218,74],[220,76],[219,74],[212,74],[213,74],[215,74],[217,74],[221,76],[222,76],[214,76],[216,76],[168,77],[173,78],[225,5],[226,5],[227,5],[228,79],[70,5],[180,5],[45,5],[46,5],[8,5],[10,5],[9,5],[2,5],[11,5],[12,5],[13,5],[14,5],[15,5],[16,5],[17,5],[18,5],[3,5],[19,5],[20,5],[4,5],[21,5],[25,5],[22,5],[23,5],[24,5],[26,5],[27,5],[28,5],[5,5],[29,5],[30,5],[31,5],[32,5],[6,5],[36,5],[33,5],[34,5],[35,5],[37,5],[7,5],[38,5],[43,5],[44,5],[39,5],[40,5],[41,5],[42,5],[1,5],[86,80],[96,81],[85,80],[106,82],[77,83],[76,84],[105,85],[99,86],[104,87],[79,88],[93,89],[78,90],[102,91],[74,92],[73,85],[103,93],[75,94],[80,95],[81,5],[84,95],[71,5],[107,96],[97,97],[88,98],[89,99],[91,100],[87,101],[90,102],[100,85],[82,103],[83,104],[92,105],[72,106],[95,97],[94,95],[98,5],[101,107]],"latestChangedDtsFile":"./dist/serialize.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../world/pkg/world.d.ts","./src/serialize.ts","./src/api-types.ts","./src/blockdata.ts","./src/vector.ts","./src/camera.ts","./src/game-script.ts","./src/playerActions.ts","./src/utils.ts","./src/index.ts","./src/messageHelpers.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/gl-matrix/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/seedrandom/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/webidl-conversions/index.d.ts","../../node_modules/@types/webxr/index.d.ts","../../node_modules/@types/whatwg-url/index.d.ts","../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[47,48,69,112],[47,69,112],[47,51,69,112],[48,49,50,51,52,53,54,55,69,112],[69,112],[58,69,112],[58,59,60,61,62,69,112],[58,60,69,112],[69,112,127,162,163],[69,112,127,162],[69,112,124,127,162,168,169,170],[69,112,164,169,171,173],[69,112,175],[69,112,124,162],[69,109,112],[69,111,112],[112],[69,112,117,147],[69,112,113,118,124,125,132,144,155],[69,112,113,114,124,132],[64,65,66,69,112],[69,112,115,156],[69,112,116,117,125,133],[69,112,117,144,152],[69,112,118,120,124,132],[69,111,112,119],[69,112,120,121],[69,112,124],[69,112,122,124],[69,111,112,124],[69,112,124,125,126,144,155],[69,112,124,125,126,139,144,147],[69,107,112,160],[69,107,112,120,124,127,132,144,155],[69,112,124,125,127,128,132,144,152,155],[69,112,127,129,144,152,155],[67,68,69,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,124,130],[69,112,131,155],[69,112,120,124,132,144],[69,112,133],[69,112,134],[69,111,112,135],[69,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[69,112,137],[69,112,138],[69,112,124,139,140],[69,112,139,141,156,158],[69,112,124,144,145,147],[69,112,146,147],[69,112,144,145],[69,112,147],[69,112,148],[69,109,112,144],[69,112,124,150,151],[69,112,150,151],[69,112,117,132,144,152],[69,112,153],[69,112,132,154],[69,112,127,138,155],[69,112,117,156],[69,112,144,157],[69,112,131,158],[69,112,159],[69,112,117,124,126,135,144,155,158,160],[69,112,144,161],[69,112,181],[69,112,178,179,180],[69,112,127,144,162],[69,112,185,224],[69,112,185,209,224],[69,112,224],[69,112,185],[69,112,185,210,224],[69,112,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223],[69,112,210,224],[69,112,125,144,162,167],[69,112,127,162,168,172],[69,112,124,127,129,132,144,152,155,161,162],[69,79,83,112,155],[69,79,112,144,155],[69,74,112],[69,76,79,112,152,155],[69,112,132,152],[69,112,162],[69,74,112,162],[69,76,79,112,132,155],[69,71,72,75,78,112,124,144,155],[69,79,86,112],[69,71,77,112],[69,79,100,101,112],[69,75,79,112,147,155,162],[69,100,112,162],[69,73,74,112,162],[69,79,112],[69,73,74,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,112],[69,79,94,112],[69,79,86,87,112],[69,77,79,87,88,112],[69,78,112],[69,71,74,79,112],[69,79,83,87,88,112],[69,83,112],[69,77,79,82,112,155],[69,71,76,79,86,112],[69,112,144],[69,74,79,100,112,160,162]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fd4e97e73911659479e2455b8c1b1272c0216562663188cad2a5c386d25fd28","impliedFormat":99},{"version":"bc6c7c642b4c2e84953a03d9306323aaaae80daf6d650d7538485ee2f73b07ec","signature":"47962d0680fe4cd6e645f7231c0774b0f4041faa4a6d5d522dcf3871876a27fa","impliedFormat":99},{"version":"4c89c2497dffcd2dec6a8ee8075719545163214393166c6c5542de09dc76ee4f","signature":"0177e6117f562265fea03e7e70f5b408861dc2281c099fcce07768a655bd8687","impliedFormat":99},{"version":"cc5b076ac0f6607279e70a6254873d7929f52254d6d854bfbc95f7e21379eacd","signature":"723c8f01f59ba76ea8057364b30eb863584157893a3a06ddd381a5579efce21d","impliedFormat":99},{"version":"dbce1a180bdd50d83d0c1a5c07fd5bc0870c6afa4dfec57ba8d7153837715f46","signature":"30f017d88514e0806b293981b753975158585001d76e8f0c37bba5fdee67e3a0","impliedFormat":99},{"version":"be0742a712314d1ff5abbf6e0ab8f19820b4004c8eb2881c7db28a7d71695cbc","signature":"e85731236253a48ecc7417c332254f495e829ee1a59b6359cb7732f87b153318","impliedFormat":99},{"version":"1e20cfe580515334f0b432b26673699222b566ab627585b1197fd0f19dd696ef","signature":"1ba770ec9fa3f3f9d2a7c8d26b95208327927d7fe6046e65574d2fcff854ce17","impliedFormat":99},{"version":"b034e4fc88c160a686ae4c986e76dbf9a04befc677fd2df3523f2fd3453c3b3c","signature":"70c9425cbaefd481bd76d8c806b68664348a0da2b46aac154155f0d9fe06cd50","impliedFormat":99},{"version":"368f662f9b34973be10e9230ec1041f8b4b30310887cfe6755afd0ff968674d6","signature":"1b6256fb93bee06b9b07cd2c6554c9135ce2fd1f8a9472c328dfb62ff7817348","impliedFormat":99},{"version":"29b5d606da6db9a01664e84fae53674ced22682a02e96e24b9e1b6497049ed6d","impliedFormat":99},{"version":"c377b02fff54ab51cd49d83cd77dedd57146f5a0dbb31ecde57694fd1ee1e48a","signature":"7d5fb2c9812ddb34bd3bcf2c4cbf3a61807603aa4b6a47d88fb7d747ae571253","impliedFormat":99},{"version":"d88b3dc8b7055665059ea06ffafce9467fc4bdfa7cb2d7a6f4262556bb482b0d","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"32ddc6ad753ae79571bbf28cebff7a383bf7f562ac5ef5d25c94ef7f71609d49","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"81df92841a7a12d551fcbc7e4e83dbb7d54e0c73f33a82162d13e9ae89700079","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"88d9a77d2abc23a7d26625dd6dae5b57199a8693b85c9819355651c9d9bab90f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"25be1eb939c9c63242c7a45446edb20c40541da967f43f1aa6a00ed53c0552db","impliedFormat":1},{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"4a0f0317476f6801c0e19b8ba226ccaf5970a598e6439e6facd1054b59b078e0","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"69b76e74a56b52e89f3400cbd99a9e2a67f4a4f7b6d0b07dff2c637ac514b3e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","impliedFormat":1},{"version":"bb5d24e66d38263b1bda38d0f9b7a72aa2a9de2f7dfd840132a2e372bffd95d8","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"844ab83672160ca57a2a2ea46da4c64200d8c18d4ebb2087819649cad099ff0e","impliedFormat":1},{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"6414851ace6758f45d36688d409766f48c6edba5ebbd1a925b1b30e992412b9d","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[48,57]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"esModuleInterop":true,"module":199,"noImplicitAny":true,"outDir":"./dist","preserveConstEnums":true,"removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[49,1],[50,2],[52,3],[53,2],[56,4],[57,5],[54,2],[48,2],[55,5],[51,5],[47,5],[60,6],[58,5],[63,7],[59,6],[61,8],[62,6],[164,9],[163,10],[165,10],[166,5],[171,11],[174,12],[175,13],[172,5],[176,5],[177,14],[167,5],[109,15],[110,15],[111,16],[69,17],[112,18],[113,19],[114,20],[64,5],[67,21],[65,5],[66,5],[115,22],[116,23],[117,24],[118,25],[119,26],[120,27],[121,27],[123,28],[122,29],[124,30],[125,31],[126,32],[108,33],[68,5],[127,34],[128,35],[129,36],[162,37],[130,38],[131,39],[132,40],[133,41],[134,42],[135,43],[136,44],[137,45],[138,46],[139,47],[140,47],[141,48],[142,5],[143,5],[144,49],[146,50],[145,51],[147,52],[148,53],[149,54],[150,55],[151,56],[152,57],[153,58],[154,59],[155,60],[156,61],[157,62],[158,63],[159,64],[160,65],[161,66],[178,5],[169,5],[170,5],[182,67],[179,5],[181,68],[183,69],[184,5],[209,70],[210,71],[185,72],[188,72],[207,70],[208,70],[198,70],[197,73],[195,70],[190,70],[203,70],[201,70],[205,70],[189,70],[202,70],[206,70],[191,70],[192,70],[204,70],[186,70],[193,70],[194,70],[196,70],[200,70],[211,74],[199,70],[187,70],[224,75],[223,5],[218,74],[220,76],[219,74],[212,74],[213,74],[215,74],[217,74],[221,76],[222,76],[214,76],[216,76],[168,77],[173,78],[225,5],[226,5],[227,5],[228,79],[70,5],[180,5],[45,5],[46,5],[8,5],[10,5],[9,5],[2,5],[11,5],[12,5],[13,5],[14,5],[15,5],[16,5],[17,5],[18,5],[3,5],[19,5],[20,5],[4,5],[21,5],[25,5],[22,5],[23,5],[24,5],[26,5],[27,5],[28,5],[5,5],[29,5],[30,5],[31,5],[32,5],[6,5],[36,5],[33,5],[34,5],[35,5],[37,5],[7,5],[38,5],[43,5],[44,5],[39,5],[40,5],[41,5],[42,5],[1,5],[86,80],[96,81],[85,80],[106,82],[77,83],[76,84],[105,85],[99,86],[104,87],[79,88],[93,89],[78,90],[102,91],[74,92],[73,85],[103,93],[75,94],[80,95],[81,5],[84,95],[71,5],[107,96],[97,97],[88,98],[89,99],[91,100],[87,101],[90,102],[100,85],[82,103],[83,104],[92,105],[72,106],[95,97],[94,95],[98,5],[101,107]],"latestChangedDtsFile":"./dist/playerActions.d.ts","version":"5.8.3"} \ No newline at end of file