From 4b18f4be8b414996a2184615a5f059248d2c2589 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Thu, 15 Feb 2024 21:58:48 +0300 Subject: [PATCH 0001/1195] add generated packets types --- src/generatedClientPackets.ts | 543 ++++++++++++ src/generatedServerPackets.ts | 1495 +++++++++++++++++++++++++++++++++ src/globals.d.ts | 7 +- 3 files changed, 2044 insertions(+), 1 deletion(-) create mode 100644 src/generatedClientPackets.ts create mode 100644 src/generatedServerPackets.ts diff --git a/src/generatedClientPackets.ts b/src/generatedClientPackets.ts new file mode 100644 index 00000000..2715cd73 --- /dev/null +++ b/src/generatedClientPackets.ts @@ -0,0 +1,543 @@ +export interface ClientWriteMap { + keep_alive: /** 1.7 */ { + keepAliveId: number; + } | /** 1.12.2 */ { + keepAliveId: bigint; + }; + /** Removed in 1.19 */ + chat: /** 1.7 */ { + message: string; + }; + use_entity: /** 1.7 */ { + target: number; + mouse: number; + x: any; + y: any; + z: any; + } | /** 1.9 */ { + target: number; + mouse: number; + x: any; + y: any; + z: any; + hand: any; + } | /** 1.16 */ { + target: number; + mouse: number; + x: any; + y: any; + z: any; + hand: any; + sneaking: boolean; + }; + flying: /** 1.7 */ { + onGround: boolean; + }; + position: /** 1.7 */ { + x: number; + stance: number; + y: number; + z: number; + onGround: boolean; + } | /** 1.8 */ { + x: number; + y: number; + z: number; + onGround: boolean; + }; + look: /** 1.7 */ { + yaw: number; + pitch: number; + onGround: boolean; + }; + position_look: /** 1.7 */ { + x: number; + stance: number; + y: number; + z: number; + yaw: number; + pitch: number; + onGround: boolean; + } | /** 1.8 */ { + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + onGround: boolean; + }; + block_dig: /** 1.7 */ { + status: number; + location: any; + face: number; + } | /** 1.8 */ { + status: number; + location: { x: number, y: number, z: number }; + face: number; + } | /** 1.19 */ { + status: number; + location: { x: number, y: number, z: number }; + face: number; + sequence: number; + }; + block_place: /** 1.7 */ { + location: any; + direction: number; + heldItem: any; + cursorX: number; + cursorY: number; + cursorZ: number; + } | /** 1.8 */ { + location: { x: number, y: number, z: number }; + direction: number; + heldItem: any; + cursorX: number; + cursorY: number; + cursorZ: number; + } | /** 1.9 */ { + location: { x: number, y: number, z: number }; + direction: number; + hand: number; + cursorX: number; + cursorY: number; + cursorZ: number; + } | /** 1.14 */ { + hand: number; + location: { x: number, y: number, z: number }; + direction: number; + cursorX: number; + cursorY: number; + cursorZ: number; + insideBlock: boolean; + } | /** 1.19 */ { + hand: number; + location: { x: number, y: number, z: number }; + direction: number; + cursorX: number; + cursorY: number; + cursorZ: number; + insideBlock: boolean; + sequence: number; + }; + held_item_slot: /** 1.7 */ { + slotId: number; + }; + arm_animation: /** 1.7 */ { + entityId: number; + animation: number; + } | /** 1.8 */ { + + } | /** 1.9 */ { + hand: number; + }; + entity_action: /** 1.7 */ { + entityId: number; + actionId: number; + jumpBoost: number; + }; + steer_vehicle: /** 1.7 */ { + sideways: number; + forward: number; + jump: boolean; + unmount: boolean; + } | /** 1.8 */ { + sideways: number; + forward: number; + jump: number; + }; + close_window: /** 1.7 */ { + windowId: number; + }; + window_click: /** 1.7 */ { + windowId: number; + slot: number; + mouseButton: number; + action: number; + mode: number; + item: any; + } | /** 1.17 */ { + windowId: number; + slot: number; + mouseButton: number; + mode: number; + changedSlots: any; + cursorItem: any; + } | /** 1.17.1 */ { + windowId: number; + stateId: number; + slot: number; + mouseButton: number; + mode: number; + changedSlots: any; + cursorItem: any; + }; + /** Removed in 1.17 */ + transaction: /** 1.7 */ { + windowId: number; + action: number; + accepted: boolean; + }; + set_creative_slot: /** 1.7 */ { + slot: number; + item: any; + }; + enchant_item: /** 1.7 */ { + windowId: number; + enchantment: number; + }; + update_sign: /** 1.7 */ { + location: any; + text1: string; + text2: string; + text3: string; + text4: string; + } | /** 1.8 */ { + location: { x: number, y: number, z: number }; + text1: string; + text2: string; + text3: string; + text4: string; + } | /** 1.20 */ { + location: { x: number, y: number, z: number }; + isFrontText: boolean; + text1: string; + text2: string; + text3: string; + text4: string; + }; + abilities: /** 1.7 */ { + flags: number; + flyingSpeed: number; + walkingSpeed: number; + } | /** 1.16 */ { + flags: number; + }; + tab_complete: /** 1.7 */ { + text: string; + } | /** 1.8 */ { + text: string; + block: any; + } | /** 1.9 */ { + text: string; + assumeCommand: boolean; + lookedAtBlock: any; + } | /** 1.13 */ { + transactionId: number; + text: string; + }; + settings: /** 1.7 */ { + locale: string; + viewDistance: number; + chatFlags: number; + chatColors: boolean; + difficulty: number; + showCape: boolean; + } | /** 1.8 */ { + locale: string; + viewDistance: number; + chatFlags: number; + chatColors: boolean; + skinParts: number; + } | /** 1.9 */ { + locale: string; + viewDistance: number; + chatFlags: number; + chatColors: boolean; + skinParts: number; + mainHand: number; + } | /** 1.17 */ { + locale: string; + viewDistance: number; + chatFlags: number; + chatColors: boolean; + skinParts: number; + mainHand: number; + disableTextFiltering: boolean; + } | /** 1.18 */ { + locale: string; + viewDistance: number; + chatFlags: number; + chatColors: boolean; + skinParts: number; + mainHand: number; + enableTextFiltering: boolean; + enableServerListing: boolean; + }; + client_command: /** 1.7 */ { + payload: number; + } | /** 1.9 */ { + actionId: number; + }; + custom_payload: /** 1.7 */ { + channel: string; + data: any; + }; + packet: /** 1.7 */ { + name: any; + params: any; + }; + spectate: /** 1.8 */ { + target: any; + }; + resource_pack_receive: /** 1.8 */ { + hash: string; + result: number; + } | /** 1.10 */ { + result: number; + } | /** 1.20.3 */ { + uuid: any; + result: number; + }; + teleport_confirm: /** 1.9 */ { + teleportId: number; + }; + vehicle_move: /** 1.9 */ { + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + }; + steer_boat: /** 1.9 */ { + leftPaddle: boolean; + rightPaddle: boolean; + }; + use_item: /** 1.9 */ { + hand: number; + } | /** 1.19 */ { + hand: number; + sequence: number; + }; + /** Removed in 1.12.1 */ + prepare_crafting_grid: /** 1.12 */ { + windowId: number; + actionNumber: number; + returnEntry: any; + prepareEntry: any; + }; + /** Removed in 1.16.2 */ + crafting_book_data: /** 1.12 */ { + type: number; + undefined: any; + }; + advancement_tab: /** 1.12 */ { + action: number; + tabId: any; + }; + craft_recipe_request: /** 1.12.1 */ { + windowId: number; + recipe: number; + makeAll: boolean; + } | /** 1.13 */ { + windowId: number; + recipe: string; + makeAll: boolean; + }; + query_block_nbt: /** 1.13 */ { + transactionId: number; + location: { x: number, y: number, z: number }; + }; + edit_book: /** 1.13 */ { + new_book: any; + signing: boolean; + } | /** 1.13.1 */ { + new_book: any; + signing: boolean; + hand: number; + } | /** 1.17.1 */ { + hand: number; + pages: any; + title: any; + }; + query_entity_nbt: /** 1.13 */ { + transactionId: number; + entityId: number; + }; + pick_item: /** 1.13 */ { + slot: number; + }; + name_item: /** 1.13 */ { + name: string; + }; + select_trade: /** 1.13 */ { + slot: number; + }; + set_beacon_effect: /** 1.13 */ { + primary_effect: number; + secondary_effect: number; + } | /** 1.19 */ { + primary_effect: any; + secondary_effect: any; + }; + update_command_block: /** 1.13 */ { + location: { x: number, y: number, z: number }; + command: string; + mode: number; + flags: number; + }; + update_command_block_minecart: /** 1.13 */ { + entityId: number; + command: string; + track_output: boolean; + }; + update_structure_block: /** 1.13 */ { + location: { x: number, y: number, z: number }; + action: number; + mode: number; + name: string; + offset_x: number; + offset_y: number; + offset_z: number; + size_x: number; + size_y: number; + size_z: number; + mirror: number; + rotation: number; + metadata: string; + integrity: number; + seed: any; + flags: number; + } | /** 1.19 */ { + location: { x: number, y: number, z: number }; + action: number; + mode: number; + name: string; + offset_x: number; + offset_y: number; + offset_z: number; + size_x: number; + size_y: number; + size_z: number; + mirror: number; + rotation: number; + metadata: string; + integrity: number; + seed: number; + flags: number; + }; + set_difficulty: /** 1.14 */ { + newDifficulty: number; + }; + lock_difficulty: /** 1.14 */ { + locked: boolean; + }; + update_jigsaw_block: /** 1.14 */ { + location: { x: number, y: number, z: number }; + attachmentType: string; + targetPool: string; + finalState: string; + } | /** 1.16 */ { + location: { x: number, y: number, z: number }; + name: string; + target: string; + pool: string; + finalState: string; + jointType: string; + } | /** 1.20.3 */ { + location: { x: number, y: number, z: number }; + name: string; + target: string; + pool: string; + finalState: string; + jointType: string; + selection_priority: number; + placement_priority: number; + }; + generate_structure: /** 1.16 */ { + location: { x: number, y: number, z: number }; + levels: number; + keepJigsaws: boolean; + }; + displayed_recipe: /** 1.16.2 */ { + recipeId: string; + }; + recipe_book: /** 1.16.2 */ { + bookId: number; + bookOpen: boolean; + filterActive: boolean; + }; + pong: /** 1.17 */ { + id: number; + }; + chat_command: /** 1.19 */ { + command: string; + timestamp: bigint; + salt: bigint; + argumentSignatures: any; + signedPreview: boolean; + } | /** 1.19.2 */ { + command: string; + timestamp: bigint; + salt: bigint; + argumentSignatures: any; + signedPreview: boolean; + previousMessages: any; + lastRejectedMessage: any; + } | /** 1.19.3 */ { + command: string; + timestamp: bigint; + salt: bigint; + argumentSignatures: any; + messageCount: number; + acknowledged: any; + }; + chat_message: /** 1.19 */ { + message: string; + timestamp: bigint; + salt: bigint; + signature: any; + signedPreview: boolean; + } | /** 1.19.2 */ { + message: string; + timestamp: bigint; + salt: bigint; + signature: any; + signedPreview: boolean; + previousMessages: any; + lastRejectedMessage: any; + } | /** 1.19.3 */ { + message: string; + timestamp: bigint; + salt: bigint; + signature: any; + offset: number; + acknowledged: any; + }; + /** Removed in 1.19.3 */ + chat_preview: /** 1.19 */ { + query: number; + message: string; + }; + message_acknowledgement: /** 1.19.2 */ { + previousMessages: any; + lastRejectedMessage: any; + } | /** 1.19.3 */ { + count: number; + }; + chat_session_update: /** 1.19.3 */ { + sessionUUID: any; + expireTime: bigint; + publicKey: any; + signature: any; + }; + chunk_batch_received: /** 1.20.2 */ { + chunksPerTick: number; + }; + /** Removed in 1.20.3 */ + configuation_acknowledged: /** 1.20.2 */ { + + }; + ping_request: /** 1.20.2 */ { + id: bigint; + }; + configuration_acknowledged: /** 1.20.3 */ { + + }; + set_slot_state: /** 1.20.3 */ { + slot_id: number; + window_id: number; + state: boolean; + }; +} + +export declare const clientWrite: (name: T, data: ClientWriteMap[T]) => Buffer diff --git a/src/generatedServerPackets.ts b/src/generatedServerPackets.ts new file mode 100644 index 00000000..ffc232c5 --- /dev/null +++ b/src/generatedServerPackets.ts @@ -0,0 +1,1495 @@ +// from server to client + +export interface ClientOnMap { + keep_alive: /** 1.7 */ { + keepAliveId: number; + } | /** 1.12.2 */ { + keepAliveId: bigint; + }; + login: /** 1.7 */ { + entityId: number; + gameMode: number; + dimension: number; + difficulty: number; + maxPlayers: number; + levelType: string; + } | /** 1.8 */ { + entityId: number; + gameMode: number; + dimension: number; + difficulty: number; + maxPlayers: number; + levelType: string; + reducedDebugInfo: boolean; + } | /** 1.14 */ { + entityId: number; + gameMode: number; + dimension: number; + maxPlayers: number; + levelType: string; + viewDistance: number; + reducedDebugInfo: boolean; + } | /** 1.15 */ { + entityId: number; + gameMode: number; + dimension: number; + hashedSeed: bigint; + maxPlayers: number; + levelType: string; + viewDistance: number; + reducedDebugInfo: boolean; + enableRespawnScreen: boolean; + } | /** 1.16 */ { + entityId: number; + gameMode: number; + previousGameMode: number; + worldNames: any; + dimensionCodec: any; + dimension: string; + worldName: string; + hashedSeed: bigint; + maxPlayers: number; + viewDistance: number; + reducedDebugInfo: boolean; + enableRespawnScreen: boolean; + isDebug: boolean; + isFlat: boolean; + } | /** 1.16.2 */ { + entityId: number; + isHardcore: boolean; + gameMode: number; + previousGameMode: number; + worldNames: any; + dimensionCodec: any; + dimension: any; + worldName: string; + hashedSeed: bigint; + maxPlayers: number; + viewDistance: number; + reducedDebugInfo: boolean; + enableRespawnScreen: boolean; + isDebug: boolean; + isFlat: boolean; + } | /** 1.18 */ { + entityId: number; + isHardcore: boolean; + gameMode: number; + previousGameMode: number; + worldNames: any; + dimensionCodec: any; + dimension: any; + worldName: string; + hashedSeed: bigint; + maxPlayers: number; + viewDistance: number; + simulationDistance: number; + reducedDebugInfo: boolean; + enableRespawnScreen: boolean; + isDebug: boolean; + isFlat: boolean; + } | /** 1.19 */ { + entityId: number; + isHardcore: boolean; + gameMode: number; + previousGameMode: number; + worldNames: any; + dimensionCodec: any; + worldType: string; + worldName: string; + hashedSeed: bigint; + maxPlayers: number; + viewDistance: number; + simulationDistance: number; + reducedDebugInfo: boolean; + enableRespawnScreen: boolean; + isDebug: boolean; + isFlat: boolean; + death: any; + } | /** 1.20 */ { + entityId: number; + isHardcore: boolean; + gameMode: number; + previousGameMode: number; + worldNames: any; + dimensionCodec: any; + worldType: string; + worldName: string; + hashedSeed: bigint; + maxPlayers: number; + viewDistance: number; + simulationDistance: number; + reducedDebugInfo: boolean; + enableRespawnScreen: boolean; + isDebug: boolean; + isFlat: boolean; + death: any; + portalCooldown: number; + }; + /** Removed in 1.19 */ + chat: /** 1.7 */ { + message: string; + } | /** 1.8 */ { + message: string; + position: number; + } | /** 1.16 */ { + message: string; + position: number; + sender: any; + }; + update_time: /** 1.7 */ { + age: bigint; + time: bigint; + }; + entity_equipment: /** 1.7 */ { + entityId: number; + slot: number; + item: any; + } | /** 1.16 */ { + entityId: number; + equipments: any; + }; + spawn_position: /** 1.7 */ { + location: any; + } | /** 1.8 */ { + location: { x: number, y: number, z: number }; + } | /** 1.17 */ { + location: { x: number, y: number, z: number }; + angle: number; + }; + update_health: /** 1.7 */ { + health: number; + food: number; + foodSaturation: number; + }; + respawn: /** 1.7 */ { + dimension: number; + difficulty: number; + gamemode: number; + levelType: string; + } | /** 1.14 */ { + dimension: number; + gamemode: number; + levelType: string; + } | /** 1.15 */ { + dimension: number; + hashedSeed: bigint; + gamemode: number; + levelType: string; + } | /** 1.16 */ { + dimension: string; + worldName: string; + hashedSeed: bigint; + gamemode: number; + previousGamemode: number; + isDebug: boolean; + isFlat: boolean; + copyMetadata: boolean; + } | /** 1.16.2 */ { + dimension: any; + worldName: string; + hashedSeed: bigint; + gamemode: number; + previousGamemode: number; + isDebug: boolean; + isFlat: boolean; + copyMetadata: boolean; + } | /** 1.19 */ { + dimension: string; + worldName: string; + hashedSeed: bigint; + gamemode: number; + previousGamemode: number; + isDebug: boolean; + isFlat: boolean; + copyMetadata: boolean; + death: any; + } | /** 1.20 */ { + dimension: string; + worldName: string; + hashedSeed: bigint; + gamemode: number; + previousGamemode: number; + isDebug: boolean; + isFlat: boolean; + copyMetadata: boolean; + death: any; + portalCooldown: number; + }; + position: /** 1.7 */ { + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + onGround: boolean; + } | /** 1.8 */ { + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + flags: number; + } | /** 1.9 */ { + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + flags: number; + teleportId: number; + } | /** 1.17 */ { + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + flags: number; + teleportId: number; + dismountVehicle: boolean; + } /** 1.19.4 */ ; + held_item_slot: /** 1.7 */ { + slot: number; + }; + /** Removed in 1.14 */ + bed: /** 1.7 */ { + entityId: number; + location: any; + } | /** 1.8 */ { + entityId: number; + location: { x: number, y: number, z: number }; + }; + animation: /** 1.7 */ { + entityId: number; + animation: number; + }; + named_entity_spawn: /** 1.7 */ { + entityId: number; + playerUUID: string; + playerName: string; + data: any; + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + currentItem: number; + metadata: any; + } | /** 1.8 */ { + entityId: number; + playerUUID: any; + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + currentItem: number; + metadata: any; + } | /** 1.9 */ { + entityId: number; + playerUUID: any; + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + metadata: any; + } | /** 1.15 */ { + entityId: number; + playerUUID: any; + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + }; + collect: /** 1.7 */ { + collectedEntityId: number; + collectorEntityId: number; + } | /** 1.11 */ { + collectedEntityId: number; + collectorEntityId: number; + pickupItemCount: number; + }; + spawn_entity: /** 1.7 */ { + entityId: number; + type: number; + x: number; + y: number; + z: number; + pitch: number; + yaw: number; + objectData: any; + } | /** 1.9 */ { + entityId: number; + objectUUID: any; + type: number; + x: number; + y: number; + z: number; + pitch: number; + yaw: number; + objectData: number; + velocityX: number; + velocityY: number; + velocityZ: number; + } | /** 1.19 */ { + entityId: number; + objectUUID: any; + type: number; + x: number; + y: number; + z: number; + pitch: number; + yaw: number; + headPitch: number; + objectData: number; + velocityX: number; + velocityY: number; + velocityZ: number; + }; + /** Removed in 1.19 */ + spawn_entity_living: /** 1.7 */ { + entityId: number; + type: number; + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + headPitch: number; + velocityX: number; + velocityY: number; + velocityZ: number; + metadata: any; + } | /** 1.9 */ { + entityId: number; + entityUUID: any; + type: number; + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + headPitch: number; + velocityX: number; + velocityY: number; + velocityZ: number; + metadata: any; + } | /** 1.15 */ { + entityId: number; + entityUUID: any; + type: number; + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + headPitch: number; + velocityX: number; + velocityY: number; + velocityZ: number; + }; + /** Removed in 1.19 */ + spawn_entity_painting: /** 1.7 */ { + entityId: number; + title: string; + location: any; + direction: number; + } | /** 1.8 */ { + entityId: number; + title: string; + location: { x: number, y: number, z: number }; + direction: number; + } | /** 1.9 */ { + entityId: number; + entityUUID: any; + title: string; + location: { x: number, y: number, z: number }; + direction: number; + } | /** 1.13 */ { + entityId: number; + entityUUID: any; + title: number; + location: { x: number, y: number, z: number }; + direction: number; + }; + spawn_entity_experience_orb: /** 1.7 */ { + entityId: number; + x: number; + y: number; + z: number; + count: number; + }; + entity_velocity: /** 1.7 */ { + entityId: number; + velocityX: number; + velocityY: number; + velocityZ: number; + }; + /** Removed in 1.17 */ + entity_destroy: /** 1.17.1 */ { + entityIds: any; + }; + /** Removed in 1.17 */ + entity: /** 1.7 */ { + entityId: number; + }; + rel_entity_move: /** 1.7 */ { + entityId: number; + dX: number; + dY: number; + dZ: number; + } | /** 1.8 */ { + entityId: number; + dX: number; + dY: number; + dZ: number; + onGround: boolean; + }; + entity_look: /** 1.7 */ { + entityId: number; + yaw: number; + pitch: number; + } | /** 1.8 */ { + entityId: number; + yaw: number; + pitch: number; + onGround: boolean; + }; + entity_move_look: /** 1.7 */ { + entityId: number; + dX: number; + dY: number; + dZ: number; + yaw: number; + pitch: number; + } | /** 1.8 */ { + entityId: number; + dX: number; + dY: number; + dZ: number; + yaw: number; + pitch: number; + onGround: boolean; + }; + entity_teleport: /** 1.7 */ { + entityId: number; + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + } | /** 1.8 */ { + entityId: number; + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + onGround: boolean; + }; + entity_head_rotation: /** 1.7 */ { + entityId: number; + headYaw: number; + }; + entity_status: /** 1.7 */ { + entityId: number; + entityStatus: number; + }; + attach_entity: /** 1.7 */ { + entityId: number; + vehicleId: number; + leash: boolean; + } | /** 1.9 */ { + entityId: number; + vehicleId: number; + }; + entity_metadata: /** 1.7 */ { + entityId: number; + metadata: any; + }; + entity_effect: /** 1.7 */ { + entityId: number; + effectId: number; + amplifier: number; + duration: number; + } | /** 1.8 */ { + entityId: number; + effectId: number; + amplifier: number; + duration: number; + hideParticles: boolean; + } | /** 1.9 */ { + entityId: number; + effectId: number; + amplifier: number; + duration: number; + hideParticles: number; + } | /** 1.19 */ { + entityId: number; + effectId: number; + amplifier: number; + duration: number; + hideParticles: number; + factorCodec: any; + }; + remove_entity_effect: /** 1.7 */ { + entityId: number; + effectId: number; + }; + experience: /** 1.7 */ { + experienceBar: number; + level: number; + totalExperience: number; + } | /** 1.19.3 */ { + experienceBar: number; + totalExperience: number; + level: number; + }; + /** Removed in 1.9 */ + update_attributes: /** 1.7 */ { + entityId: number; + properties: any; + }; + map_chunk: /** 1.7 */ { + x: number; + z: number; + groundUp: boolean; + bitMap: number; + addBitMap: number; + compressedChunkData: any; + } | /** 1.8 */ { + x: number; + z: number; + groundUp: boolean; + bitMap: number; + chunkData: any; + } | /** 1.9.4 */ { + x: number; + z: number; + groundUp: boolean; + bitMap: number; + chunkData: any; + blockEntities: any; + } | /** 1.14 */ { + x: number; + z: number; + groundUp: boolean; + bitMap: number; + heightmaps: any; + chunkData: any; + blockEntities: any; + } | /** 1.15 */ { + x: number; + z: number; + groundUp: boolean; + bitMap: number; + heightmaps: any; + biomes: any; + chunkData: any; + blockEntities: any; + } | /** 1.16 */ { + x: number; + z: number; + groundUp: boolean; + ignoreOldData: boolean; + bitMap: number; + heightmaps: any; + biomes: any; + chunkData: any; + blockEntities: any; + } /** 1.16.2 */ | /** 1.17 */ { + x: number; + z: number; + bitMap: any; + heightmaps: any; + biomes: any; + chunkData: any; + blockEntities: any; + } | /** 1.18 */ { + x: number; + z: number; + heightmaps: any; + chunkData: any; + blockEntities: any; + trustEdges: boolean; + skyLightMask: any; + blockLightMask: any; + emptySkyLightMask: any; + emptyBlockLightMask: any; + skyLight: any; + blockLight: any; + } | /** 1.20 */ { + x: number; + z: number; + heightmaps: any; + chunkData: any; + blockEntities: any; + skyLightMask: any; + blockLightMask: any; + emptySkyLightMask: any; + emptyBlockLightMask: any; + skyLight: any; + blockLight: any; + }; + multi_block_change: /** 1.7 */ { + chunkX: number; + chunkZ: number; + recordCount: any; + dataLength: number; + records: any; + } | /** 1.8 */ { + chunkX: number; + chunkZ: number; + records: any; + } | /** 1.16.2 */ { + chunkCoordinates: any; + notTrustEdges: boolean; + records: any; + } | /** 1.19.2 */ { + chunkCoordinates: any; + suppressLightUpdates: boolean; + records: any; + } | /** 1.20 */ { + chunkCoordinates: any; + records: any; + }; + block_change: /** 1.7 */ { + location: any; + type: number; + metadata: number; + } | /** 1.8 */ { + location: { x: number, y: number, z: number }; + type: number; + }; + block_action: /** 1.7 */ { + location: any; + byte1: number; + byte2: number; + blockId: number; + } | /** 1.8 */ { + location: { x: number, y: number, z: number }; + byte1: number; + byte2: number; + blockId: number; + }; + block_break_animation: /** 1.7 */ { + entityId: number; + location: any; + destroyStage: number; + } | /** 1.8 */ { + entityId: number; + location: { x: number, y: number, z: number }; + destroyStage: number; + }; + /** Removed in 1.9 */ + map_chunk_bulk: /** 1.7 */ { + chunkColumnCount: any; + dataLength: any; + skyLightSent: boolean; + compressedChunkData: any; + meta: any; + } | /** 1.8 */ { + skyLightSent: boolean; + meta: any; + data: any; + }; + explosion: /** 1.7 */ { + x: number; + y: number; + z: number; + radius: number; + affectedBlockOffsets: any; + playerMotionX: number; + playerMotionY: number; + playerMotionZ: number; + }; + world_event: /** 1.7 */ { + effectId: number; + location: any; + data: number; + global: boolean; + } | /** 1.8 */ { + effectId: number; + location: { x: number, y: number, z: number }; + data: number; + global: boolean; + }; + /** Removed in 1.19.3 */ + named_sound_effect: /** 1.7 */ { + soundName: string; + x: number; + y: number; + z: number; + volume: number; + pitch: number; + } | /** 1.9 */ { + soundName: string; + soundCategory: number; + x: number; + y: number; + z: number; + volume: number; + pitch: number; + } | /** 1.19 */ { + soundName: string; + soundCategory: number; + x: number; + y: number; + z: number; + volume: number; + pitch: number; + seed: bigint; + }; + world_particles: /** 1.7 */ { + particleName: string; + x: number; + y: number; + z: number; + offsetX: number; + offsetY: number; + offsetZ: number; + particleData: number; + particles: number; + } | /** 1.8 */ { + particleId: number; + longDistance: boolean; + x: number; + y: number; + z: number; + offsetX: number; + offsetY: number; + offsetZ: number; + particleData: number; + particles: number; + data: any; + }; + game_state_change: /** 1.7 */ { + reason: number; + gameMode: number; + }; + /** Removed in 1.16 */ + spawn_entity_weather: /** 1.7 */ { + entityId: number; + type: number; + x: number; + y: number; + z: number; + }; + open_window: /** 1.7 */ { + windowId: number; + inventoryType: number; + windowTitle: string; + slotCount: number; + useProvidedTitle: boolean; + entityId: any; + } | /** 1.8 */ { + windowId: number; + inventoryType: string; + windowTitle: string; + slotCount: number; + entityId: any; + } | /** 1.14 */ { + windowId: number; + inventoryType: number; + windowTitle: string; + }; + close_window: /** 1.7 */ { + windowId: number; + }; + set_slot: /** 1.7 */ { + windowId: number; + slot: number; + item: any; + } | /** 1.17.1 */ { + windowId: number; + stateId: number; + slot: number; + item: any; + }; + window_items: /** 1.7 */ { + windowId: number; + items: any; + } | /** 1.17.1 */ { + windowId: number; + stateId: number; + items: any; + carriedItem: any; + }; + craft_progress_bar: /** 1.7 */ { + windowId: number; + property: number; + value: number; + }; + /** Removed in 1.17 */ + transaction: /** 1.7 */ { + windowId: number; + action: number; + accepted: boolean; + }; + /** Removed in 1.9.4 */ + update_sign: /** 1.7 */ { + location: any; + text1: string; + text2: string; + text3: string; + text4: string; + } | /** 1.8 */ { + location: { x: number, y: number, z: number }; + text1: string; + text2: string; + text3: string; + text4: string; + }; + map: /** 1.7 */ { + itemDamage: number; + data: any; + } | /** 1.8 */ { + itemDamage: number; + scale: number; + icons: any; + columns: number; + rows: any; + x: any; + y: any; + data: any; + } | /** 1.9 */ { + itemDamage: number; + scale: number; + trackingPosition: boolean; + icons: any; + columns: number; + rows: any; + x: any; + y: any; + data: any; + } | /** 1.14 */ { + itemDamage: number; + scale: number; + trackingPosition: boolean; + locked: boolean; + icons: any; + columns: number; + rows: any; + x: any; + y: any; + data: any; + } | /** 1.17 */ { + itemDamage: number; + scale: number; + locked: boolean; + icons: any; + columns: number; + rows: any; + x: any; + y: any; + data: any; + }; + tile_entity_data: /** 1.7 */ { + location: any; + action: number; + nbtData: any; + } | /** 1.8 */ { + location: { x: number, y: number, z: number }; + action: number; + nbtData: any; + }; + open_sign_entity: /** 1.7 */ { + location: any; + } | /** 1.8 */ { + location: { x: number, y: number, z: number }; + } | /** 1.20 */ { + location: { x: number, y: number, z: number }; + isFrontText: boolean; + }; + statistics: /** 1.7 */ { + entries: any; + }; + player_info: /** 1.7 */ { + playerName: string; + online: boolean; + ping: number; + } | /** 1.8 */ { + action: number; + data: any; + }; + abilities: /** 1.7 */ { + flags: number; + flyingSpeed: number; + walkingSpeed: number; + }; + tab_complete: /** 1.7 */ { + matches: any; + } | /** 1.13 */ { + transactionId: number; + start: number; + length: number; + matches: any; + }; + scoreboard_objective: /** 1.7 */ { + name: string; + displayText: string; + action: number; + } | /** 1.8 */ { + name: string; + action: number; + displayText: any; + type: any; + }; + scoreboard_score: /** 1.7 */ { + itemName: string; + action: number; + scoreName: any; + value: any; + } | /** 1.8 */ { + itemName: string; + action: number; + scoreName: string; + value: any; + }; + scoreboard_display_objective: /** 1.7 */ { + position: number; + name: string; + }; + /** Removed in 1.9 */ + scoreboard_team: /** 1.7 */ { + team: string; + mode: number; + name: any; + prefix: any; + suffix: any; + friendlyFire: any; + players: any; + } | /** 1.8 */ { + team: string; + mode: number; + name: any; + prefix: any; + suffix: any; + friendlyFire: any; + nameTagVisibility: any; + color: any; + players: any; + }; + custom_payload: /** 1.7 */ { + channel: string; + data: any; + }; + kick_disconnect: /** 1.7 */ { + reason: string; + }; + packet: /** 1.7 */ { + name: any; + params: any; + }; + difficulty: /** 1.8 */ { + difficulty: number; + } | /** 1.14 */ { + difficulty: number; + difficultyLocked: boolean; + }; + /** Removed in 1.17 */ + combat_event: /** 1.8 */ { + event: number; + duration: any; + playerId: any; + entityId: any; + message: any; + }; + camera: /** 1.8 */ { + cameraId: number; + }; + /** Removed in 1.17 */ + world_border: /** 1.8 */ { + action: number; + radius: any; + x: any; + z: any; + old_radius: any; + new_radius: any; + speed: any; + portalBoundary: any; + warning_time: any; + warning_blocks: any; + }; + /** Removed in 1.17 */ + title: /** 1.8 */ { + action: number; + text: any; + fadeIn: any; + stay: any; + fadeOut: any; + }; + /** Removed in 1.9 */ + set_compression: /** 1.8 */ { + threshold: number; + }; + playerlist_header: /** 1.8 */ { + header: string; + footer: string; + }; + resource_pack_send: /** 1.8 */ { + url: string; + hash: string; + } | /** 1.17 */ { + url: string; + hash: string; + forced: boolean; + promptMessage: any; + }; + /** Removed in 1.9 */ + update_entity_nbt: /** 1.8 */ { + entityId: number; + tag: any; + }; + boss_bar: /** 1.9 */ { + entityUUID: any; + action: number; + title: any; + health: any; + color: any; + dividers: any; + flags: any; + }; + set_cooldown: /** 1.9 */ { + itemID: number; + cooldownTicks: number; + }; + unload_chunk: /** 1.9 */ { + chunkX: number; + chunkZ: number; + }; + vehicle_move: /** 1.9 */ { + x: number; + y: number; + z: number; + yaw: number; + pitch: number; + }; + set_passengers: /** 1.9 */ { + entityId: number; + passengers: any; + }; + teams: /** 1.9 */ { + team: string; + mode: number; + name: any; + prefix: any; + suffix: any; + friendlyFire: any; + nameTagVisibility: any; + collisionRule: any; + color: any; + players: any; + } | /** 1.13 */ { + team: string; + mode: number; + name: any; + friendlyFire: any; + nameTagVisibility: any; + collisionRule: any; + formatting: any; + prefix: any; + suffix: any; + players: any; + }; + sound_effect: /** 1.9 */ { + soundId: number; + soundCategory: number; + x: number; + y: number; + z: number; + volume: number; + pitch: number; + } | /** 1.19 */ { + soundId: number; + soundCategory: number; + x: number; + y: number; + z: number; + volume: number; + pitch: number; + seed: bigint; + }; + entity_update_attributes: /** 1.9 */ { + entityId: number; + properties: any; + }; + advancements: /** 1.12 */ { + reset: boolean; + advancementMapping: any; + identifiers: any; + progressMapping: any; + }; + unlock_recipes: /** 1.12 */ { + action: number; + craftingBookOpen: boolean; + filteringCraftable: boolean; + recipes1: any; + recipes2: any; + } | /** 1.13 */ { + action: number; + craftingBookOpen: boolean; + filteringCraftable: boolean; + smeltingBookOpen: boolean; + filteringSmeltable: boolean; + recipes1: any; + recipes2: any; + } | /** 1.16.2 */ { + action: number; + craftingBookOpen: boolean; + filteringCraftable: boolean; + smeltingBookOpen: boolean; + filteringSmeltable: boolean; + blastFurnaceOpen: boolean; + filteringBlastFurnace: boolean; + smokerBookOpen: boolean; + filteringSmoker: boolean; + recipes1: any; + recipes2: any; + }; + select_advancement_tab: /** 1.12 */ { + id: any; + }; + craft_recipe_response: /** 1.12.1 */ { + windowId: number; + recipe: number; + } | /** 1.13 */ { + windowId: number; + recipe: string; + }; + declare_commands: /** 1.13 */ { + nodes: any; + rootIndex: number; + }; + face_player: /** 1.13 */ { + feet_eyes: number; + x: number; + y: number; + z: number; + isEntity: boolean; + entityId: any; + entity_feet_eyes: any; + }; + nbt_query_response: /** 1.13 */ { + transactionId: number; + nbt: any; + }; + stop_sound: /** 1.13 */ { + flags: number; + source: any; + sound: any; + }; + declare_recipes: /** 1.13 */ { + recipes: any; + }; + tags: /** 1.13 */ { + blockTags: any; + itemTags: any; + fluidTags: any; + } | /** 1.14 */ { + blockTags: any; + itemTags: any; + fluidTags: any; + entityTags: any; + } | /** 1.17 */ { + tags: any; + }; + open_horse_window: /** 1.14 */ { + windowId: number; + nbSlots: number; + entityId: number; + }; + update_light: /** 1.14 */ { + chunkX: number; + chunkZ: number; + skyLightMask: number; + blockLightMask: number; + emptySkyLightMask: number; + emptyBlockLightMask: number; + data: any; + } | /** 1.16 */ { + chunkX: number; + chunkZ: number; + trustEdges: boolean; + skyLightMask: number; + blockLightMask: number; + emptySkyLightMask: number; + emptyBlockLightMask: number; + data: any; + } | /** 1.17 */ { + chunkX: number; + chunkZ: number; + trustEdges: boolean; + skyLightMask: any; + blockLightMask: any; + emptySkyLightMask: any; + emptyBlockLightMask: any; + skyLight: any; + blockLight: any; + } | /** 1.20 */ { + chunkX: number; + chunkZ: number; + skyLightMask: any; + blockLightMask: any; + emptySkyLightMask: any; + emptyBlockLightMask: any; + skyLight: any; + blockLight: any; + }; + trade_list: /** 1.14 */ { + windowId: number; + trades: any; + villagerLevel: number; + experience: number; + isRegularVillager: boolean; + } | /** 1.14.3 */ { + windowId: number; + trades: any; + villagerLevel: number; + experience: number; + isRegularVillager: boolean; + canRestock: boolean; + }; + open_book: /** 1.14 */ { + hand: number; + }; + update_view_position: /** 1.14 */ { + chunkX: number; + chunkZ: number; + }; + update_view_distance: /** 1.14 */ { + viewDistance: number; + }; + entity_sound_effect: /** 1.14 */ { + soundId: number; + soundCategory: number; + entityId: number; + volume: number; + pitch: number; + } | /** 1.19.2 */ { + soundId: number; + soundCategory: number; + entityId: number; + volume: number; + pitch: number; + seed: bigint; + }; + acknowledge_player_digging: /** 1.14.4 */ { + location: { x: number, y: number, z: number }; + block: number; + status: number; + successful: boolean; + } | /** 1.19 */ { + sequenceId: number; + }; + end_combat_event: /** 1.17 */ { + duration: number; + entityId: number; + } | /** 1.20 */ { + duration: number; + }; + enter_combat_event: /** 1.17 */ { + + }; + death_combat_event: /** 1.17 */ { + playerId: number; + entityId: number; + message: string; + } | /** 1.20 */ { + playerId: number; + message: string; + }; + /** Removed in 1.17.1 */ + destroy_entity: /** 1.17 */ { + entityId: number; + }; + /** Removed in 1.19 */ + sculk_vibration_signal: /** 1.17 */ { + sourcePosition: { x: number, y: number, z: number }; + destinationIdentifier: string; + destination: any; + arrivalTicks: number; + }; + clear_titles: /** 1.17 */ { + reset: boolean; + }; + initialize_world_border: /** 1.17 */ { + x: number; + z: number; + oldDiameter: number; + newDiameter: number; + speed: any; + portalTeleportBoundary: number; + warningBlocks: number; + warningTime: number; + } | /** 1.19 */ { + x: number; + z: number; + oldDiameter: number; + newDiameter: number; + speed: number; + portalTeleportBoundary: number; + warningBlocks: number; + warningTime: number; + }; + action_bar: /** 1.17 */ { + text: string; + }; + world_border_center: /** 1.17 */ { + x: number; + z: number; + }; + world_border_lerp_size: /** 1.17 */ { + oldDiameter: number; + newDiameter: number; + speed: any; + } | /** 1.19 */ { + oldDiameter: number; + newDiameter: number; + speed: number; + }; + world_border_size: /** 1.17 */ { + diameter: number; + }; + world_border_warning_delay: /** 1.17 */ { + warningTime: number; + }; + world_border_warning_reach: /** 1.17 */ { + warningBlocks: number; + }; + ping: /** 1.17 */ { + id: number; + }; + set_title_subtitle: /** 1.17 */ { + text: string; + }; + set_title_text: /** 1.17 */ { + text: string; + }; + set_title_time: /** 1.17 */ { + fadeIn: number; + stay: number; + fadeOut: number; + }; + simulation_distance: /** 1.18 */ { + distance: number; + }; + /** Removed in 1.19.3 */ + chat_preview: /** 1.19 */ { + queryId: number; + message: any; + }; + player_chat: /** 1.19 */ { + signedChatContent: string; + unsignedChatContent: any; + type: number; + senderUuid: any; + senderName: string; + senderTeam: any; + timestamp: bigint; + salt: bigint; + signature: any; + } | /** 1.19.2 */ { + previousSignature: any; + senderUuid: any; + signature: any; + plainMessage: string; + formattedMessage: any; + timestamp: bigint; + salt: bigint; + previousMessages: any; + unsignedContent: any; + filterType: number; + filterTypeMask: any; + type: number; + networkName: string; + networkTargetName: any; + } | /** 1.19.3 */ { + senderUuid: any; + index: number; + signature: any; + plainMessage: string; + timestamp: bigint; + salt: bigint; + previousMessages: any; + unsignedChatContent: any; + filterType: number; + filterTypeMask: any; + type: number; + networkName: string; + networkTargetName: any; + }; + /** Removed in 1.19.3 */ + should_display_chat_preview: /** 1.19 */ { + should_display_chat_preview: boolean; + }; + system_chat: /** 1.19 */ { + content: string; + type: number; + } | /** 1.19.2 */ { + content: string; + isActionBar: boolean; + }; + server_data: /** 1.19 */ { + motd: any; + icon: any; + previewsChat: boolean; + } | /** 1.19.2 */ { + motd: any; + icon: any; + previewsChat: boolean; + enforcesSecureChat: boolean; + } | /** 1.19.3 */ { + motd: any; + icon: any; + enforcesSecureChat: boolean; + } | /** 1.19.4 */ { + motd: string; + iconBytes: any; + enforcesSecureChat: boolean; + }; + chat_suggestions: /** 1.19.2 */ { + action: number; + entries: any; + }; + hide_message: /** 1.19.2 */ { + signature: any; + } | /** 1.19.3 */ { + id: number; + signature: any; + }; + /** Removed in 1.19.3 */ + message_header: /** 1.19.2 */ { + previousSignature: any; + senderUuid: any; + signature: any; + messageHash: any; + }; + profileless_chat: /** 1.19.3 */ { + message: string; + type: number; + name: string; + target: any; + }; + player_remove: /** 1.19.3 */ { + players: any; + }; + feature_flags: /** 1.19.3 */ { + features: any; + }; + chunk_biomes: /** 1.19.4 */ { + biomes: any; + }; + damage_event: /** 1.19.4 */ { + entityId: number; + sourceTypeId: number; + sourceCauseId: any; + sourceDirectId: any; + sourcePosition: any; + }; + hurt_animation: /** 1.19.4 */ { + entityId: number; + yaw: number; + }; +} diff --git a/src/globals.d.ts b/src/globals.d.ts index fee3f5ec..145096f9 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -2,7 +2,12 @@ declare const THREE: typeof import('three') // todo make optional -declare const bot: Omit & { world: import('prismarine-world').world.WorldSync } +declare const bot: Omit & { + world: import('prismarine-world').world.WorldSync + _client: import('minecraft-protocol').Client & { + write: typeof import('./generatedClientPackets').clientWrite + } +} declare const __type_bot: typeof bot declare const viewer: import('prismarine-viewer/viewer/lib/viewer').Viewer declare const worldView: import('prismarine-viewer/viewer/lib/worldDataEmitter').WorldDataEmitter | undefined From 145f2a52ca1253408ba7515a2d2a16a48cccdb50 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 16 Feb 2024 13:40:09 +0300 Subject: [PATCH 0002/1195] try to download block states from root (trying to fix utopia) --- prismarine-viewer/viewer/lib/worldrenderer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prismarine-viewer/viewer/lib/worldrenderer.ts b/prismarine-viewer/viewer/lib/worldrenderer.ts index afa668c2..bc8f55f9 100644 --- a/prismarine-viewer/viewer/lib/worldrenderer.ts +++ b/prismarine-viewer/viewer/lib/worldrenderer.ts @@ -259,7 +259,7 @@ export class WorldRenderer { const loadBlockStates = async () => { return new Promise(resolve => { if (this.customBlockStatesData) return resolve(this.customBlockStatesData) - return loadJSON(`blocksStates/${this.texturesVersion}.json`, (data) => { + return loadJSON(`/blocksStates/${this.texturesVersion}.json`, (data) => { this.downloadedBlockStatesData = data // todo this.renderUpdateEmitter.emit('blockStatesDownloaded') From 99e58d806923b9f6522144e07978213f9ddab261 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 16 Feb 2024 13:45:41 +0300 Subject: [PATCH 0003/1195] fix: improve compatibility with tor browser by disabling sound support --- src/basicSounds.ts | 8 +++++++- src/utils.ts | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/basicSounds.ts b/src/basicSounds.ts index a16193fe..53c86652 100644 --- a/src/basicSounds.ts +++ b/src/basicSounds.ts @@ -1,5 +1,6 @@ import { options } from './optionsStorage' import { isCypress } from './standaloneUtils' +import { reportWarningOnce } from './utils' let audioContext: AudioContext const sounds: Record = {} @@ -39,7 +40,12 @@ export async function playSound (url, soundVolume = 1) { if (!volume) return - audioContext ??= new window.AudioContext() + try { + audioContext ??= new window.AudioContext() + } catch (err) { + reportWarningOnce('audioContext', 'Failed to create audio context. Some sounds will not play') + return + } for (const [soundName, sound] of Object.entries(sounds)) { if (convertedSounds.includes(soundName)) continue diff --git a/src/utils.ts b/src/utils.ts index 4492c29e..e8658acf 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -187,3 +187,11 @@ export function assertDefined (x: T | undefined): asserts x is T { export const haveDirectoryPicker = () => { return !!window.showDirectoryPicker } + +const reportedWarnings = new Set() + +export const reportWarningOnce = (id: string, message: string) => { + if (reportedWarnings.has(id)) return + reportedWarnings.add(id) + console.warn(message) +} From 21430d51b5bfad34a939508e07096589af127750 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 16 Feb 2024 14:15:38 +0300 Subject: [PATCH 0004/1195] feat: add basic support for other guis like enchanting table horse villager or anvil --- pnpm-lock.yaml | 97 ++++++++++++++++++++++++-------------------- src/playerWindows.ts | 21 +++++++++- 2 files changed, 72 insertions(+), 46 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e394cb98..08f47225 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: + flying-squid: file:../space-squid-2 three: 0.128.0 diamond-square: github:zardoy/diamond-square prismarine-block: github:zardoy/prismarine-block#next-era @@ -76,8 +77,8 @@ importers: specifier: ^4.18.2 version: 4.18.2 flying-squid: - specifier: npm:@zardoy/flying-squid@^0.0.9 - version: /@zardoy/flying-squid@0.0.9 + specifier: file:C:\Users\Vitaly\Documents\repos\space-squid-2 + version: file:../space-squid-2 fs-extra: specifier: ^11.1.1 version: 11.1.1 @@ -241,7 +242,7 @@ importers: version: 1.0.0 minecraft-inventory-gui: specifier: github:zardoy/minecraft-inventory-gui#next - version: github.com/zardoy/minecraft-inventory-gui/e794b5d44d9cdaf58c4bf9fc5fbbc3a729f4b447(@types/react@18.2.20)(react@18.2.0) + version: github.com/zardoy/minecraft-inventory-gui/306d056da5ebf49cc2550aa311d0f17f60cdb6cd(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:PrismarineJS/mineflayer version: github.com/PrismarineJS/mineflayer/cc98f1307e3ab48477d2a9ff29da4447f42b30bc @@ -5594,45 +5595,6 @@ packages: tslib: 1.14.1 dev: true - /@zardoy/flying-squid@0.0.9: - resolution: {integrity: sha512-Q7xqm+Uu/Y/8jziVM+sazddDw50t3IoQ7y0BTAgLpYaqEsJDvTAoXmHspd9NRFVEs0CM4M/qZxvztCcdJryGIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - change-case: 4.1.2 - colors: 1.4.0 - diamond-square: github.com/zardoy/diamond-square/915fce8e27fe8eb45464d89b9563956afa4f7687 - emit-then: 2.0.0 - event-promise: 0.0.1 - exit-hook: 2.2.1 - flatmap: 0.0.3 - long: 5.2.3 - minecraft-data: 3.60.0 - minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f - mkdirp: 2.1.6 - moment: 2.29.4 - needle: 2.9.1 - node-gzip: 1.1.2 - node-rsa: 1.1.1 - prismarine-chunk: 1.35.0(minecraft-data@3.60.0) - prismarine-entity: 2.3.1 - prismarine-item: 1.14.0 - prismarine-nbt: 2.5.0 - prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.60.0) - prismarine-windows: 2.8.0 - prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 - random-seed: 0.3.0 - range: 0.0.3 - readline: 1.3.0 - typed-emitter: 1.4.0 - uuid-1345: 1.0.2 - vec3: 0.1.8 - yargs: 17.7.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - /@zardoy/react-util@0.2.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-glABtx54mh4XSaK6BNALWE3mlshPjcPwPsRj/GnOXEA7WJY/6n43iJoukbaYF3758mGZRU5Fq6gklyFjBg0yHQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -12208,6 +12170,10 @@ packages: resolution: {integrity: sha512-yosVdGg1hNGkXPzqGiOYNEpXKjEOxzUCg2rB0l+NKdyCaSf4z+i5ojbN0IqDSezMMf71YEglI+ZUTgTffn5afw==} dev: false + /rambda@9.1.0: + resolution: {integrity: sha512-fCRAq8Of+bAuqjAA0MSb/umbNgiYwy9N5camM2T++Qu/mRImLT3a31hf0REvnqaWCrgrdC3ewf/ucAILsYeBgQ==} + dev: false + /ramda@0.29.0: resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} dev: true @@ -15139,6 +15105,47 @@ packages: react: 18.2.0 dev: false + file:../space-squid-2: + resolution: {directory: ../space-squid-2, type: directory} + name: '@zardoy/flying-squid' + engines: {node: '>=8'} + hasBin: true + dependencies: + change-case: 4.1.2 + colors: 1.4.0 + diamond-square: github.com/zardoy/diamond-square/915fce8e27fe8eb45464d89b9563956afa4f7687 + emit-then: 2.0.0 + event-promise: 0.0.1 + exit-hook: 2.2.1 + flatmap: 0.0.3 + long: 5.2.3 + minecraft-data: 3.60.0 + minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f + mkdirp: 2.1.6 + moment: 2.29.4 + needle: 2.9.1 + node-gzip: 1.1.2 + node-rsa: 1.1.1 + prismarine-chunk: 1.35.0(minecraft-data@3.60.0) + prismarine-entity: 2.3.1 + prismarine-item: 1.14.0 + prismarine-nbt: 2.5.0 + prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.60.0) + prismarine-windows: 2.8.0 + prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 + rambda: 9.1.0 + random-seed: 0.3.0 + range: 0.0.3 + readline: 1.3.0 + typed-emitter: 1.4.0 + uuid-1345: 1.0.2 + vec3: 0.1.8 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + github.com/PrismarineJS/mineflayer/cc98f1307e3ab48477d2a9ff29da4447f42b30bc: resolution: {tarball: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/cc98f1307e3ab48477d2a9ff29da4447f42b30bc} name: mineflayer @@ -15193,9 +15200,9 @@ packages: vec3: 0.1.8 dev: false - github.com/zardoy/minecraft-inventory-gui/e794b5d44d9cdaf58c4bf9fc5fbbc3a729f4b447(@types/react@18.2.20)(react@18.2.0): - resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/e794b5d44d9cdaf58c4bf9fc5fbbc3a729f4b447} - id: github.com/zardoy/minecraft-inventory-gui/e794b5d44d9cdaf58c4bf9fc5fbbc3a729f4b447 + github.com/zardoy/minecraft-inventory-gui/306d056da5ebf49cc2550aa311d0f17f60cdb6cd(@types/react@18.2.20)(react@18.2.0): + resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/306d056da5ebf49cc2550aa311d0f17f60cdb6cd} + id: github.com/zardoy/minecraft-inventory-gui/306d056da5ebf49cc2550aa311d0f17f60cdb6cd name: minecraft-inventory-gui version: 1.0.1 dependencies: diff --git a/src/playerWindows.ts b/src/playerWindows.ts index 1d5844de..ee5667c5 100644 --- a/src/playerWindows.ts +++ b/src/playerWindows.ts @@ -6,6 +6,11 @@ import LargeChestLikeGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui import FurnaceGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/furnace.png' import CraftingTableGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/crafting_table.png' import DispenserGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/dispenser.png' +import HopperGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/hopper.png' +import HorseGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/horse.png' +import VillageGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/villager.png' +import EnchantingGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/enchanting_table.png' +import AnvilGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/anvil.png' import Dirt from 'minecraft-assets/minecraft-assets/data/1.17.1/blocks/dirt.png' import { subscribeKey } from 'valtio/utils' @@ -184,6 +189,11 @@ const getImageSrc = (path): string | HTMLImageElement => { case 'gui/container/crafting_table': return CraftingTableGui case 'gui/container/shulker_box': return ChestLikeGui case 'gui/container/generic_54': return LargeChestLikeGui + case 'gui/container/hopper': return HopperGui + case 'gui/container/horse': return HorseGui + case 'gui/container/villager': return VillageGui + case 'gui/container/enchanting_table': return EnchantingGui + case 'gui/container/anvil': return AnvilGui } return Dirt } @@ -332,11 +342,20 @@ export const onModalClose = (callback: () => any) => { const implementedContainersGuiMap = { // todo allow arbitrary size instead! 'minecraft:generic_9x3': 'ChestWin', + // hopper + 'minecraft:generic_5x1': 'HopperWin', 'minecraft:generic_9x6': 'LargeChestWin', 'minecraft:generic_3x3': 'DropDispenseWin', 'minecraft:furnace': 'FurnaceWin', 'minecraft:smoker': 'FurnaceWin', - 'minecraft:crafting': 'CraftingWin' + 'minecraft:crafting': 'CraftingWin', + 'minecraft:anvil': 'AnvilWin', + // enchant + 'minecraft:enchanting_table': 'EnchantingWin', + // horse + 'minecraft:horse': 'HorseWin', + // villager + 'minecraft:villager': 'VillagerWin', } const upJei = (search: string) => { From 90f0cbab0d83bc5468b457b0eb672aa5516cb37c Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 16 Feb 2024 14:16:08 +0300 Subject: [PATCH 0005/1195] fix tsc --- src/menus/pause_screen.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/menus/pause_screen.js b/src/menus/pause_screen.js index f8042ea5..ce376645 100644 --- a/src/menus/pause_screen.js +++ b/src/menus/pause_screen.js @@ -4,7 +4,8 @@ const { subscribe } = require('valtio') const { subscribeKey } = require('valtio/utils') const { hideCurrentModal, showModal, miscUiState, notification, openOptionsMenu } = require('../globalState') const { fsState } = require('../loadSave') -const { disconnect, openGithub } = require('../utils') +const { openGithub } = require('../utils') +const { disconnect } = require('../flyingSquidUtils') const { closeWan, openToWanAndCopyJoinLink, getJoinLink } = require('../localServerMultiplayer') const { uniqueFileNameFromWorldName, copyFilesAsyncWithProgress } = require('../browserfs') const { showOptionsModal } = require('../react/SelectOption') From 7657afbd1bac557f30ecc87a0cdd61e62e0b4e49 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 16 Feb 2024 14:57:04 +0300 Subject: [PATCH 0006/1195] add generic win 95 support for mineberry --- assets/generic_91.png | Bin 0 -> 2468 bytes assets/generic_92.png | Bin 0 -> 2504 bytes assets/generic_93.png | Bin 0 -> 2524 bytes assets/generic_94.png | Bin 0 -> 2536 bytes assets/generic_95.png | Bin 0 -> 2564 bytes pnpm-lock.yaml | 8 ++++---- src/playerWindows.ts | 3 +++ 7 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 assets/generic_91.png create mode 100644 assets/generic_92.png create mode 100644 assets/generic_93.png create mode 100644 assets/generic_94.png create mode 100644 assets/generic_95.png diff --git a/assets/generic_91.png b/assets/generic_91.png new file mode 100644 index 0000000000000000000000000000000000000000..99e4d04ae8581563228e4cd505d390adcc9fe152 GIT binary patch literal 2468 zcmbVO4Qvx-82&moG7yM_8K;nWIiiD%>;1Id?Jg?}+KtUn7^C4QXyAJHwLR9}9d|d{ zZ6XDXM590=(E!W*K_jAI5F%5Afkvib3MTwaG8_p8Fk#suNf)Ate%E#tq#I;Sn)~j% z=X>7geV_N<_O<%O3nx!}dLjT|a$T*r0RS6X+CbrWba_GFA4Hc4TJ0(WfXAj;UmMud zRt!MFkFtNIxze|Y7uBd;kkkOQ$DL@QD_QSJQ`69KJLa-ygXW4+a!*qAZDW*pKk@k zR{H8OkE%nAwKIfBQ542S zCew{0sp%Y|T9#HZGIc@~BjbWb(ss(qDFu|oEKY0EBdOq$NWut=Ld7%?md;|euxhGC zSRH{n`}n>9sJ1>|Hbzb@(P%b=VODQIX=DnL6K(jLHAprBL-Q2P({vf-;3+B% z^{J8^Y|cWR1jP_^xu16OE}D0`?t`M9kpxqCC|DBtpsGg&l&~BXLXgyy5RPTb$a~a? zs-wV2og<~f=i}=X!xR(|)_L7H%GoZ<5)Y+7Am~E!%PSl#!E#QP5LkymI0cD?oP!aW zU|{&XR~4HqXRY(;E|*jhar_sR3kWPtSI`8*1!*Gaas~;3VnqT%j-zP`u?f;J+Y((y zFPad!m(@}wA;utN0~HR@ML3}(5{$!16N1QbM8H)pxq_@1U}(nb=2V05wX%V%YtFnM z%i#LVDk5X4p5O)1>UB3RS|&rJAiXW;sK+Bk&YX{hAtD{c{B#&Y4Vp1Qhx0?Ib`NbX zawPGFuwiuRk7i|BQ&##&%{Uh6nX-ssK?y-LIZ50~hO|aZ+7$Btex;t>GmeJgXvSH~ z>~uvp+4&3=M6ILgo2;qn2VmUhI`4dc{7V1TrR%m<6;&<$>A-^CS6BUzI9u4UQ<}c- z>=!<)Cwb%?HKl#rz|h7?e^ig#-M;5yV9~QjUJk$Weg2K3?fbr?n!5W62RD5@^vt{q zfj!Sn?V&(t_nk=hq0o%38!abZKXu6#FR^RaNQN{!6eV^w#Py$(J=3muPM0Q54tN}swz`wA3|)I7N3pZz zPdl-Epif+Qrlj?Q)>%b~uIsG6<0oaQ@*K6L}+L_n!$(a&1@9vb*R9Fm&jRmKCu4Kp5Tc>QdzCN`3CRd4)dFq?I zl<$Lg!H2uPearZ=tNnb*#JRSPgO^H<<+YA#ua(={H8ySaLAO#cR|CDv8+WYUd?HO) z5lg1uXhG_mnM?>R~3^Ftnchw^X}@>!&l3y{;Kqg>xwu1J-uM< ws<&@+9X;b`K0i0-WPbjGEj-3 z!W@c^NpvI{2?Pz8Xhaeo>LL+wixY;A_=q7aOhHA4CPTLn1__DyzqYFzwv2d5bKl+n z_x--#_qeZJHP!3#au?b3&C*r~u5(*MA1EcV7Vj z*PUzenxTeyV3QPd;D4Ry#W6{A;B^)k2@wL*_zS%EPW!;qAPq*#KoaSX#TES9`*6iyMnT&;6$G8lSt z;66ZIhmB#AQC6Brnq^s%Vn~J|5Q0$KgBl+pf@<*ugA=NPB84Es=GY|$y%t&t%?9E+K|j*J)00$u0URs z6}K$=CpuL#AsJ&#Ml-gwP6~>0SY0;B0XlgNI&joA6G2%CnsqZYN6{QjFQ-f#MJ1pv zS(Lo(DX5vC7=pICX)|Y`Inz`qni-MT_-VnSzhYK<-b^qih9(5Y3<*}WPy|i$EGv4ff)&~)*fuB< z`p|g)WL903h!{nyjiK!nBm^rX5+>eE6RekJ36qDidaZU3Z?g0HG{*;otCUpKy7uJv zu@SZ;Ex&}tXM*Deebybgpf?$cc=ENBrXKecIq4tvK}33&<|m@7vR4c93M^|vwVQUh z$V}o@zU}VP@2!;yO)2S_hVlPMPnJdS@xdmDHYbVe$&mVrNi>DLvtRMEN$Y3=j&_`G zrnW13NbP4BMAQn}zG1cabpW#7u5y;SBj>OF_bXTn@B8JU`9t<& zE5i9Xf1Z?22sLB38aH1ldw(^3R6Y2}2lVVcm&;dvyM)?(nT-|<7hHRK=FJmd-RfTa z%CBRQ7yDi^+#E2wPLD*DZ_ZwA%irFUHM;e9UstaI%m6t61D)Vbqpu}vS8eWwWv7Z_ zYhr_=g{9|O5BzcKLQ(9q*l2DBpEyf`aOaKN!n)H%vA1G_OTi`kp;VM#|A3)=g;0B7}~P;olz8COioANm8tX7+1xXJ zJa^>bG@VKj>PF|b?7p5SV-49QEui60&%ma}BZ)C7{F063ET6sq@A2rlXi0-GzG~}m zVd=J$n;m)gU+U=XE&1rp&!b1c^=k(fsyoI8dTYUO`{9oDfv?MkukSh4-8pr#^r6Q< kks3trv#!oj|wGXPyx71hqeYZ{;V2cbLEbpQYW literal 0 HcmV?d00001 diff --git a/assets/generic_93.png b/assets/generic_93.png new file mode 100644 index 0000000000000000000000000000000000000000..1b35f671d1dc6e621e204386105e02b00d467f95 GIT binary patch literal 2524 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 C^X*0e literal 0 HcmV?d00001 diff --git a/assets/generic_95.png b/assets/generic_95.png new file mode 100644 index 0000000000000000000000000000000000000000..2286dbfc87153e08e8b1f8b04156931cf8e6f16a GIT binary patch literal 2564 zcmbtUeQXnD7=Ozg8yEzF3kxEg#~(1@dLO-h+(B9A3T$e}80E`M$MyPlJ!pI7?nb*2 zLj8zD(aZ!taG8t7Fb9diM8k*3P!fg#qLBd0hGBD)5!^DOW?>P;_u8&*vJaw{G=1*w z_x_&W^Lw6qUN0_MIc4&!$pC;Ug$2$M01PNJfXs>LuT*L9p}$Gtf{iKwkIvA422fL* z4M6&Ll6!-;!Sx(3%0Z*xl|9fH4TcdKfTg+7upn-M8s>rJQpk??ebt0xlGl!}H@hfT zI3N0@f+_{BsVZ`dRa->Pi{~!GmPUC*5QLh5MT3Em%17;ZoR>$j{+PtEI7HiG$Mf`r z*alZImM<$1vlqbbOPni` z$81270fnu@S=3LEyz znymWeQK(a|hb2JXx?HIoBWei-Qz=w!`8HHW(vT6+s=G1_$r7l_6^aO#Z$mQY>D7e! zd<6=cthi-4FxaW$LCF|nGP2l$^-{Z+W=CLs}VWUkP!B|)i!FgyOL9-sl zCkhs`z&KQWjWDiwwP>)gEA2`#o7p)&u1YZWnrzf#p1EC zDK)DU34LfnU?{7u%8M9T#sUS}<|7yiX@M-u5uDe=5N4J$c_^QarZ}rU&G7-@3nUe_ zt}^+3tbtpTQ9#1tGrwc=E9{f*%i+Ie9+fhlq5H<|neNvQLW$3d}1< z-iE0cfaEAhODDO zINEV~nA)!BCbgeo2vI9&``%jcp>P0dK(RM%Y}Z2RHOPJgxi zWBcqoliN$)vKuE1OdKKYFd>eOhVcHgb7sD@@Uhsl=Kf=u?tw*#pzDbT1P?ojih}8< z_s!Z~`p5wrFkWuy#EXA9lnCCI$I>6S#|7<)4~y>VMSv z*MDiO<7&ml&lh(zHrJhN&jQnc1H}3=uzio$)gICP3b&Ks>gL|9SuJB07Iy`8{LAOJ zm!==IfrFP@I~N{akJx}Amgc(D^;FO7*!i-)$Y)p2nCrVbmNWt5(YA}1+SxhP&42b? z+0)XO)&5&m!`WKlZs+wJ@aqXn?hVg{!W;LjyQ^alej*r{V;Iu&#L$m7&WNV$_YCDo VQAf`y@(@5*;qoHq!KXL9{5Q$K2EzaV literal 0 HcmV?d00001 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08f47225..d4380982 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -242,7 +242,7 @@ importers: version: 1.0.0 minecraft-inventory-gui: specifier: github:zardoy/minecraft-inventory-gui#next - version: github.com/zardoy/minecraft-inventory-gui/306d056da5ebf49cc2550aa311d0f17f60cdb6cd(@types/react@18.2.20)(react@18.2.0) + version: github.com/zardoy/minecraft-inventory-gui/5dfb4e39e601108f6e1306cd0f4b9de45cf6b1db(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:PrismarineJS/mineflayer version: github.com/PrismarineJS/mineflayer/cc98f1307e3ab48477d2a9ff29da4447f42b30bc @@ -15200,9 +15200,9 @@ packages: vec3: 0.1.8 dev: false - github.com/zardoy/minecraft-inventory-gui/306d056da5ebf49cc2550aa311d0f17f60cdb6cd(@types/react@18.2.20)(react@18.2.0): - resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/306d056da5ebf49cc2550aa311d0f17f60cdb6cd} - id: github.com/zardoy/minecraft-inventory-gui/306d056da5ebf49cc2550aa311d0f17f60cdb6cd + github.com/zardoy/minecraft-inventory-gui/5dfb4e39e601108f6e1306cd0f4b9de45cf6b1db(@types/react@18.2.20)(react@18.2.0): + resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/5dfb4e39e601108f6e1306cd0f4b9de45cf6b1db} + id: github.com/zardoy/minecraft-inventory-gui/5dfb4e39e601108f6e1306cd0f4b9de45cf6b1db name: minecraft-inventory-gui version: 1.0.1 dependencies: diff --git a/src/playerWindows.ts b/src/playerWindows.ts index ee5667c5..753dcab3 100644 --- a/src/playerWindows.ts +++ b/src/playerWindows.ts @@ -27,6 +27,7 @@ import mojangson from 'mojangson' import nbt from 'prismarine-nbt' import { splitEvery, equals } from 'rambda' import PItem, { Item } from 'prismarine-item' +import Generic95 from '../assets/generic_95.png' import { activeModalStack, hideCurrentModal, miscUiState, showModal } from './globalState' import invspriteJson from './invsprite.json' import { options } from './optionsStorage' @@ -189,6 +190,7 @@ const getImageSrc = (path): string | HTMLImageElement => { case 'gui/container/crafting_table': return CraftingTableGui case 'gui/container/shulker_box': return ChestLikeGui case 'gui/container/generic_54': return LargeChestLikeGui + case 'gui/container/generic_95': return Generic95 case 'gui/container/hopper': return HopperGui case 'gui/container/horse': return HorseGui case 'gui/container/villager': return VillageGui @@ -342,6 +344,7 @@ export const onModalClose = (callback: () => any) => { const implementedContainersGuiMap = { // todo allow arbitrary size instead! 'minecraft:generic_9x3': 'ChestWin', + 'minecraft:generic_9x5': 'Generic95Win', // hopper 'minecraft:generic_5x1': 'HopperWin', 'minecraft:generic_9x6': 'LargeChestWin', From 726df2efd72a2d209c243ef1a6c6fc0b5207612b Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 16 Feb 2024 14:58:10 +0300 Subject: [PATCH 0007/1195] up lock --- pnpm-lock.yaml | 89 +++++++++++++++++++++++--------------------------- 1 file changed, 41 insertions(+), 48 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d4380982..4301e98d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,6 @@ settings: excludeLinksFromLockfile: false overrides: - flying-squid: file:../space-squid-2 three: 0.128.0 diamond-square: github:zardoy/diamond-square prismarine-block: github:zardoy/prismarine-block#next-era @@ -77,8 +76,8 @@ importers: specifier: ^4.18.2 version: 4.18.2 flying-squid: - specifier: file:C:\Users\Vitaly\Documents\repos\space-squid-2 - version: file:../space-squid-2 + specifier: npm:@zardoy/flying-squid@^0.0.9 + version: /@zardoy/flying-squid@0.0.9 fs-extra: specifier: ^11.1.1 version: 11.1.1 @@ -5595,6 +5594,45 @@ packages: tslib: 1.14.1 dev: true + /@zardoy/flying-squid@0.0.9: + resolution: {integrity: sha512-Q7xqm+Uu/Y/8jziVM+sazddDw50t3IoQ7y0BTAgLpYaqEsJDvTAoXmHspd9NRFVEs0CM4M/qZxvztCcdJryGIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + change-case: 4.1.2 + colors: 1.4.0 + diamond-square: github.com/zardoy/diamond-square/915fce8e27fe8eb45464d89b9563956afa4f7687 + emit-then: 2.0.0 + event-promise: 0.0.1 + exit-hook: 2.2.1 + flatmap: 0.0.3 + long: 5.2.3 + minecraft-data: 3.60.0 + minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f + mkdirp: 2.1.6 + moment: 2.29.4 + needle: 2.9.1 + node-gzip: 1.1.2 + node-rsa: 1.1.1 + prismarine-chunk: 1.35.0(minecraft-data@3.60.0) + prismarine-entity: 2.3.1 + prismarine-item: 1.14.0 + prismarine-nbt: 2.5.0 + prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.60.0) + prismarine-windows: 2.8.0 + prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 + random-seed: 0.3.0 + range: 0.0.3 + readline: 1.3.0 + typed-emitter: 1.4.0 + uuid-1345: 1.0.2 + vec3: 0.1.8 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /@zardoy/react-util@0.2.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-glABtx54mh4XSaK6BNALWE3mlshPjcPwPsRj/GnOXEA7WJY/6n43iJoukbaYF3758mGZRU5Fq6gklyFjBg0yHQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -12170,10 +12208,6 @@ packages: resolution: {integrity: sha512-yosVdGg1hNGkXPzqGiOYNEpXKjEOxzUCg2rB0l+NKdyCaSf4z+i5ojbN0IqDSezMMf71YEglI+ZUTgTffn5afw==} dev: false - /rambda@9.1.0: - resolution: {integrity: sha512-fCRAq8Of+bAuqjAA0MSb/umbNgiYwy9N5camM2T++Qu/mRImLT3a31hf0REvnqaWCrgrdC3ewf/ucAILsYeBgQ==} - dev: false - /ramda@0.29.0: resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} dev: true @@ -15105,47 +15139,6 @@ packages: react: 18.2.0 dev: false - file:../space-squid-2: - resolution: {directory: ../space-squid-2, type: directory} - name: '@zardoy/flying-squid' - engines: {node: '>=8'} - hasBin: true - dependencies: - change-case: 4.1.2 - colors: 1.4.0 - diamond-square: github.com/zardoy/diamond-square/915fce8e27fe8eb45464d89b9563956afa4f7687 - emit-then: 2.0.0 - event-promise: 0.0.1 - exit-hook: 2.2.1 - flatmap: 0.0.3 - long: 5.2.3 - minecraft-data: 3.60.0 - minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f - mkdirp: 2.1.6 - moment: 2.29.4 - needle: 2.9.1 - node-gzip: 1.1.2 - node-rsa: 1.1.1 - prismarine-chunk: 1.35.0(minecraft-data@3.60.0) - prismarine-entity: 2.3.1 - prismarine-item: 1.14.0 - prismarine-nbt: 2.5.0 - prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.60.0) - prismarine-windows: 2.8.0 - prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 - rambda: 9.1.0 - random-seed: 0.3.0 - range: 0.0.3 - readline: 1.3.0 - typed-emitter: 1.4.0 - uuid-1345: 1.0.2 - vec3: 0.1.8 - yargs: 17.7.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - github.com/PrismarineJS/mineflayer/cc98f1307e3ab48477d2a9ff29da4447f42b30bc: resolution: {tarball: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/cc98f1307e3ab48477d2a9ff29da4447f42b30bc} name: mineflayer From a4c92ae5da9040890eafa05780f8a91dbb84839e Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 16 Feb 2024 15:11:14 +0300 Subject: [PATCH 0008/1195] wip DEPS_VERSIONS --- esbuild.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esbuild.mjs b/esbuild.mjs index 46283bb1..2d18ae3a 100644 --- a/esbuild.mjs +++ b/esbuild.mjs @@ -70,7 +70,8 @@ const buildOptions = { 'process.env.NODE_ENV': JSON.stringify(dev ? 'development' : 'production'), 'process.env.BUILD_VERSION': JSON.stringify(!dev ? buildingVersion : 'undefined'), 'process.env.GITHUB_URL': - JSON.stringify(`https://github.com/${process.env.GITHUB_REPOSITORY || `${process.env.VERCEL_GIT_REPO_OWNER}/${process.env.VERCEL_GIT_REPO_SLUG}`}`) + JSON.stringify(`https://github.com/${process.env.GITHUB_REPOSITORY || `${process.env.VERCEL_GIT_REPO_OWNER}/${process.env.VERCEL_GIT_REPO_SLUG}`}`), + 'process.env.DEPS_VERSIONS': JSON.stringify({}) }, loader: { // todo use external or resolve issues with duplicating From 6a603f9c9cf0671a01274afe4d68fe6c7d01cb55 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 16 Feb 2024 15:14:35 +0300 Subject: [PATCH 0009/1195] fix villager path, add beacon --- src/playerWindows.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/playerWindows.ts b/src/playerWindows.ts index 753dcab3..6bc3f486 100644 --- a/src/playerWindows.ts +++ b/src/playerWindows.ts @@ -8,9 +8,10 @@ import CraftingTableGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/ import DispenserGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/dispenser.png' import HopperGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/hopper.png' import HorseGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/horse.png' -import VillageGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/villager.png' +import VillagerGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/villager2.png' import EnchantingGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/enchanting_table.png' import AnvilGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/anvil.png' +import BeaconGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/beacon.png' import Dirt from 'minecraft-assets/minecraft-assets/data/1.17.1/blocks/dirt.png' import { subscribeKey } from 'valtio/utils' @@ -193,9 +194,10 @@ const getImageSrc = (path): string | HTMLImageElement => { case 'gui/container/generic_95': return Generic95 case 'gui/container/hopper': return HopperGui case 'gui/container/horse': return HorseGui - case 'gui/container/villager': return VillageGui + case 'gui/container/villager2': return VillagerGui case 'gui/container/enchanting_table': return EnchantingGui case 'gui/container/anvil': return AnvilGui + case 'gui/container/beacon': return BeaconGui } return Dirt } From 6444d3f2ea57c7c5c934d7aa2d982a2f3b3a5c1c Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 16 Feb 2024 08:00:55 +0300 Subject: [PATCH 0010/1195] Add notes for using next branch and linking dependencies locally --- CONTRIBUTING.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 407fd03f..22958d3f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,6 +8,9 @@ After forking the repository, run the following commands to get started: A few notes: +- Use `next` branch for development and as base & target branch for pull requests if possible. +- To link dependency locally e.g. flying-squid add this to `pnpm` > `overrides` of root package.json: `"flying-squid": "file:../space-squid",` (with some modules `pnpm link` also works) + - It's recommended to use debugger for debugging. VSCode has a great debugger built-in. If debugger is slow, you can use `--no-sources` flag that would allow browser to speedup .map file parsing. - Some data are cached between restarts. If you see something doesn't work after upgrading dependencies, try to clear the by simply removing the `dist` folder. - The same folder `dist` is used for both development and production builds, so be careful when deploying the project. From 39a9d36a878ff5fc100d5cafa2ea6dd44095e03d Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 16 Feb 2024 09:30:26 +0300 Subject: [PATCH 0011/1195] up deps --- package.json | 4 +- pnpm-lock.yaml | 557 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 371 insertions(+), 190 deletions(-) diff --git a/package.json b/package.json index b28f786e..f9cfe462 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "lit": "^2.8.0", "lodash-es": "^4.17.21", "minecraft-assets": "^1.12.2", - "minecraft-data": "3.60.0", + "minecraft-data": "3.61.0", "net-browserify": "github:zardoy/prismarinejs-net-browserify", "node-gzip": "^1.1.2", "peerjs": "^1.5.0", @@ -129,7 +129,7 @@ "diamond-square": "github:zardoy/diamond-square", "prismarine-block": "github:zardoy/prismarine-block#next-era", "prismarine-world": "github:zardoy/prismarine-world#next-era", - "minecraft-data": "3.60.0", + "minecraft-data": "3.61.0", "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", "minecraft-protocol": "github:zardoy/minecraft-protocol#everything", "react": "^18.2.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4301e98d..b1fc701e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ overrides: diamond-square: github:zardoy/diamond-square prismarine-block: github:zardoy/prismarine-block#next-era prismarine-world: github:zardoy/prismarine-world#next-era - minecraft-data: 3.60.0 + minecraft-data: 3.61.0 prismarine-provider-anvil: github:zardoy/prismarine-provider-anvil#everything minecraft-protocol: github:zardoy/minecraft-protocol#everything react: ^18.2.0 @@ -97,8 +97,8 @@ importers: specifier: ^1.12.2 version: 1.12.2 minecraft-data: - specifier: 3.60.0 - version: 3.60.0 + specifier: 3.61.0 + version: 3.61.0 net-browserify: specifier: github:zardoy/prismarinejs-net-browserify version: github.com/zardoy/prismarinejs-net-browserify/7d827dba61bd2f9ac9a6086fe2079a0fccadd070 @@ -153,7 +153,7 @@ importers: optionalDependencies: systeminformation: specifier: ^5.21.22 - version: 5.21.22 + version: 5.21.24 devDependencies: '@storybook/addon-essentials': specifier: ^7.4.6 @@ -169,13 +169,13 @@ importers: version: 7.4.6(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@storybook/react-vite': specifier: ^7.4.6 - version: 7.4.6(react-dom@18.2.0)(react@18.2.0)(rollup@2.79.1)(typescript@5.2.2)(vite@4.5.0) + version: 7.4.6(react-dom@18.2.0)(react@18.2.0)(rollup@2.79.1)(typescript@5.2.2)(vite@4.5.2) '@storybook/web-components': specifier: ^7.4.6 version: 7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0) '@storybook/web-components-vite': specifier: ^7.4.6 - version: 7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(vite@4.5.0) + version: 7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(vite@4.5.2) '@types/lodash-es': specifier: ^4.17.9 version: 4.17.9 @@ -244,7 +244,7 @@ importers: version: github.com/zardoy/minecraft-inventory-gui/5dfb4e39e601108f6e1306cd0f4b9de45cf6b1db(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:PrismarineJS/mineflayer - version: github.com/PrismarineJS/mineflayer/cc98f1307e3ab48477d2a9ff29da4447f42b30bc + version: github.com/PrismarineJS/mineflayer/b9491ae508dc52e4538dd66eb6f47a639facde20 mineflayer-pathfinder: specifier: ^2.4.4 version: 2.4.4 @@ -331,7 +331,7 @@ importers: version: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chunk: specifier: ^1.22.0 - version: 1.35.0(minecraft-data@3.60.0) + version: 1.35.0(minecraft-data@3.61.0) prismarine-schematic: specifier: ^1.2.0 version: 1.2.3 @@ -403,15 +403,15 @@ packages: default-browser-id: 3.0.0 dev: true - /@azure/msal-common@14.3.0: - resolution: {integrity: sha512-nKwhWW7QbiziXG8lcebCqbyxiuJAdBik7SBu3vPdJJ+rUr8M2uigAIi5OY7FwddRahlYzLMGG8U1oMeEOulNqQ==} + /@azure/msal-common@14.7.0: + resolution: {integrity: sha512-WexujW5jKWib7xtIxR7fEVyd5xcA3FNwenELy2HO4YC/ivTFdsEcDhtpKQuRUHqXRwxoqBblyZzTAhBm4v6fHA==} engines: {node: '>=0.8.0'} - /@azure/msal-node@2.4.0: - resolution: {integrity: sha512-Le2UhUs+RhEoEQ+/BZxqrDw74yq1jlqUeovo43IE4clHEbtWaX+KdUFrdWxLe4RQemA4jPEZwBiODvKhbOxafg==} - engines: {node: 18 || 20} + /@azure/msal-node@2.6.3: + resolution: {integrity: sha512-ojjJqUwb297T5Tcln4PbJANFEqRXfbQXcyOrtdr1HQYIo+dSuCT/o0nG6bFVihf6fcNykDwJLCQPVXzTkx/oGg==} + engines: {node: '>=16'} dependencies: - '@azure/msal-common': 14.3.0 + '@azure/msal-common': 14.7.0 jsonwebtoken: 9.0.2 uuid: 8.3.2 @@ -1711,48 +1711,48 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@cbor-extract/cbor-extract-darwin-arm64@2.1.1: - resolution: {integrity: sha512-blVBy5MXz6m36Vx0DfLd7PChOQKEs8lK2bD1WJn/vVgG4FXZiZmZb2GECHFvVPA5T7OnODd9xZiL3nMCv6QUhA==} + /@cbor-extract/cbor-extract-darwin-arm64@2.2.0: + resolution: {integrity: sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==} cpu: [arm64] os: [darwin] requiresBuild: true dev: false optional: true - /@cbor-extract/cbor-extract-darwin-x64@2.1.1: - resolution: {integrity: sha512-h6KFOzqk8jXTvkOftyRIWGrd7sKQzQv2jVdTL9nKSf3D2drCvQB/LHUxAOpPXo3pv2clDtKs3xnHalpEh3rDsw==} + /@cbor-extract/cbor-extract-darwin-x64@2.2.0: + resolution: {integrity: sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==} cpu: [x64] os: [darwin] requiresBuild: true dev: false optional: true - /@cbor-extract/cbor-extract-linux-arm64@2.1.1: - resolution: {integrity: sha512-SxAaRcYf8S0QHaMc7gvRSiTSr7nUYMqbUdErBEu+HYA4Q6UNydx1VwFE68hGcp1qvxcy9yT5U7gA+a5XikfwSQ==} + /@cbor-extract/cbor-extract-linux-arm64@2.2.0: + resolution: {integrity: sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: false optional: true - /@cbor-extract/cbor-extract-linux-arm@2.1.1: - resolution: {integrity: sha512-ds0uikdcIGUjPyraV4oJqyVE5gl/qYBpa/Wnh6l6xLE2lj/hwnjT2XcZCChdXwW/YFZ1LUHs6waoYN8PmK0nKQ==} + /@cbor-extract/cbor-extract-linux-arm@2.2.0: + resolution: {integrity: sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==} cpu: [arm] os: [linux] requiresBuild: true dev: false optional: true - /@cbor-extract/cbor-extract-linux-x64@2.1.1: - resolution: {integrity: sha512-GVK+8fNIE9lJQHAlhOROYiI0Yd4bAZ4u++C2ZjlkS3YmO6hi+FUxe6Dqm+OKWTcMpL/l71N6CQAmaRcb4zyJuA==} + /@cbor-extract/cbor-extract-linux-x64@2.2.0: + resolution: {integrity: sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==} cpu: [x64] os: [linux] requiresBuild: true dev: false optional: true - /@cbor-extract/cbor-extract-win32-x64@2.1.1: - resolution: {integrity: sha512-2Niq1C41dCRIDeD8LddiH+mxGlO7HJ612Ll3D/E73ZWBmycued+8ghTr/Ho3CMOWPUEr08XtyBMVXAjqF+TcKw==} + /@cbor-extract/cbor-extract-win32-x64@2.2.0: + resolution: {integrity: sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==} cpu: [x64] os: [win32] requiresBuild: true @@ -3105,7 +3105,7 @@ packages: regenerator-runtime: 0.13.11 dev: false - /@joshwooding/vite-plugin-react-docgen-typescript@0.2.1(typescript@5.2.2)(vite@4.5.0): + /@joshwooding/vite-plugin-react-docgen-typescript@0.2.1(typescript@5.2.2)(vite@4.5.2): resolution: {integrity: sha512-ou4ZJSXMMWHqGS4g8uNRbC5TiTWxAgQZiVucoUrOCWuPrTbkpJbmVyIi9jU72SBry7gQtuMEDp4YR8EEXAg7VQ==} peerDependencies: typescript: '>= 4.3.x' @@ -3119,7 +3119,7 @@ packages: magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.2.2) typescript: 5.2.2 - vite: 4.5.0 + vite: 4.5.2 dev: true /@jridgewell/gen-mapping@0.3.3: @@ -4310,7 +4310,7 @@ packages: - supports-color dev: true - /@storybook/builder-vite@7.4.6(typescript@5.2.2)(vite@4.5.0): + /@storybook/builder-vite@7.4.6(typescript@5.2.2)(vite@4.5.2): resolution: {integrity: sha512-xV9STYK+TkqWWTf2ydm6jx+7P70fjD2UPd1XTUw08uKszIjhuuxk+bG/OF5R1E25mPunAKXm6kBFh351AKejBg==} peerDependencies: '@preact/preset-vite': '*' @@ -4345,7 +4345,7 @@ packages: remark-slug: 6.1.0 rollup: 3.29.4 typescript: 5.2.2 - vite: 4.5.0 + vite: 4.5.2 transitivePeerDependencies: - encoding - supports-color @@ -4686,7 +4686,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/react-vite@7.4.6(react-dom@18.2.0)(react@18.2.0)(rollup@2.79.1)(typescript@5.2.2)(vite@4.5.0): + /@storybook/react-vite@7.4.6(react-dom@18.2.0)(react@18.2.0)(rollup@2.79.1)(typescript@5.2.2)(vite@4.5.2): resolution: {integrity: sha512-jkjnrf3FxzR5wcmebXRPflrsM4WIDjWyW/NVFJwxi5PeIOk7fE7/QAPrm4NFRUu2Q7DeuH3oLKsw8bigvUI9RA==} engines: {node: '>=16'} peerDependencies: @@ -4694,17 +4694,17 @@ packages: react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 vite: ^3.0.0 || ^4.0.0 dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.2.2)(vite@4.5.0) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.2.2)(vite@4.5.2) '@rollup/pluginutils': 5.0.5(rollup@2.79.1) - '@storybook/builder-vite': 7.4.6(typescript@5.2.2)(vite@4.5.0) + '@storybook/builder-vite': 7.4.6(typescript@5.2.2)(vite@4.5.2) '@storybook/react': 7.4.6(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@vitejs/plugin-react': 3.1.0(vite@4.5.0) + '@vitejs/plugin-react': 3.1.0(vite@4.5.2) ast-types: 0.14.2 magic-string: 0.30.4 react: 18.2.0 react-docgen: 6.0.0-alpha.3 react-dom: 18.2.0(react@18.2.0) - vite: 4.5.0 + vite: 4.5.2 transitivePeerDependencies: - '@preact/preset-vite' - encoding @@ -4806,14 +4806,14 @@ packages: file-system-cache: 2.3.0 dev: true - /@storybook/web-components-vite@7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(vite@4.5.0): + /@storybook/web-components-vite@7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(vite@4.5.2): resolution: {integrity: sha512-L/y6MTLbqfHaM0faK9Yl8n5PIyW4daZrtk7NfaOT6UjgNFjOx3o4CctYew6oj90cNk5HdZQX2OZny043GxDLZw==} engines: {node: ^14.18 || >=16} peerDependencies: react: ^18.2.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/builder-vite': 7.4.6(typescript@5.2.2)(vite@4.5.0) + '@storybook/builder-vite': 7.4.6(typescript@5.2.2)(vite@4.5.2) '@storybook/core-server': 7.4.6 '@storybook/node-logger': 7.4.6 '@storybook/web-components': 7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0) @@ -5098,6 +5098,11 @@ packages: resolution: {integrity: sha512-YGncyA25/MaVtQkjWW9r0EFBukZ+JulsLcVZBlGUfIb96OBMjkoRWwQo5IEWJ8Fj06Go3GHw+bjYDitv6BaGsA==} dev: true + /@types/node@20.11.19: + resolution: {integrity: sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==} + dependencies: + undici-types: 5.26.5 + /@types/node@20.8.0: resolution: {integrity: sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==} @@ -5159,10 +5164,10 @@ packages: '@types/scheduler': 0.16.3 csstype: 3.1.2 - /@types/readable-stream@4.0.4: - resolution: {integrity: sha512-NSAiePj3Iq3kBArfpUWRNX/mRw8DibYD6YhNCIJDfUP/iIOQYsNJgtHyjpbuZlcbL7TxILS8qYjY/nXXvtcFQg==} + /@types/readable-stream@4.0.10: + resolution: {integrity: sha512-AbUKBjcC8SHmImNi4yK2bbjogQlkFSg7shZCcicxPQapniOlajG8GCc39lvXzCWX4lLRRs7DM3VAeSlqmEVZUA==} dependencies: - '@types/node': 20.8.10 + '@types/node': 20.11.19 safe-buffer: 5.1.2 /@types/resolve@1.17.1: @@ -5255,8 +5260,8 @@ packages: '@types/node': 20.8.0 dev: true - /@types/yauzl@2.10.2: - resolution: {integrity: sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==} + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: '@types/node': 20.8.10 @@ -5436,7 +5441,7 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@vitejs/plugin-react@3.1.0(vite@4.5.0): + /@vitejs/plugin-react@3.1.0(vite@4.5.2): resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -5447,7 +5452,7 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.11) magic-string: 0.27.0 react-refresh: 0.14.0 - vite: 4.5.0 + vite: 4.5.2 transitivePeerDependencies: - supports-color dev: true @@ -5607,18 +5612,18 @@ packages: exit-hook: 2.2.1 flatmap: 0.0.3 long: 5.2.3 - minecraft-data: 3.60.0 + minecraft-data: 3.61.0 minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f mkdirp: 2.1.6 moment: 2.29.4 needle: 2.9.1 node-gzip: 1.1.2 node-rsa: 1.1.1 - prismarine-chunk: 1.35.0(minecraft-data@3.60.0) + prismarine-chunk: 1.35.0(minecraft-data@3.61.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 - prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.60.0) + prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.61.0) prismarine-windows: 2.8.0 prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 random-seed: 0.3.0 @@ -5894,6 +5899,14 @@ packages: call-bind: 1.0.2 is-array-buffer: 3.0.2 + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: true + /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -5933,14 +5946,14 @@ packages: es-shim-unscopables: 1.0.0 dev: true - /array.prototype.tosorted@1.1.2: - resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} + /array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 + es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - get-intrinsic: 1.2.2 dev: true /arraybuffer.prototype.slice@1.0.2: @@ -5955,6 +5968,20 @@ packages: is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.2 + dev: true + /arraybuffer.slice@0.0.7: resolution: {integrity: sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==} dev: false @@ -6054,6 +6081,11 @@ packages: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} + /available-typed-arrays@1.0.6: + resolution: {integrity: sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==} + engines: {node: '>= 0.4'} + dev: true + /aws-sign2@0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} @@ -6063,7 +6095,7 @@ packages: /axios@0.21.4(debug@4.3.4): resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.3(debug@4.3.4) + follow-redirects: 1.15.5(debug@4.3.4) transitivePeerDependencies: - debug @@ -6483,12 +6515,15 @@ packages: function-bind: 1.1.1 get-intrinsic: 1.2.1 - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 + get-intrinsic: 1.2.4 + set-function-length: 1.2.1 dev: true /callsites@3.1.0: @@ -6549,26 +6584,26 @@ packages: /caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - /cbor-extract@2.1.1: - resolution: {integrity: sha512-1UX977+L+zOJHsp0mWFG13GLwO6ucKgSmSW6JTl8B9GUvACvHeIVpFqhU92299Z6PfD09aTXDell5p+lp1rUFA==} + /cbor-extract@2.2.0: + resolution: {integrity: sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==} hasBin: true requiresBuild: true dependencies: - node-gyp-build-optional-packages: 5.0.3 + node-gyp-build-optional-packages: 5.1.1 optionalDependencies: - '@cbor-extract/cbor-extract-darwin-arm64': 2.1.1 - '@cbor-extract/cbor-extract-darwin-x64': 2.1.1 - '@cbor-extract/cbor-extract-linux-arm': 2.1.1 - '@cbor-extract/cbor-extract-linux-arm64': 2.1.1 - '@cbor-extract/cbor-extract-linux-x64': 2.1.1 - '@cbor-extract/cbor-extract-win32-x64': 2.1.1 + '@cbor-extract/cbor-extract-darwin-arm64': 2.2.0 + '@cbor-extract/cbor-extract-darwin-x64': 2.2.0 + '@cbor-extract/cbor-extract-linux-arm': 2.2.0 + '@cbor-extract/cbor-extract-linux-arm64': 2.2.0 + '@cbor-extract/cbor-extract-linux-x64': 2.2.0 + '@cbor-extract/cbor-extract-win32-x64': 2.2.0 dev: false optional: true /cbor-x@1.5.4: resolution: {integrity: sha512-PVKILDn+Rf6MRhhcyzGXi5eizn1i0i3F8Fe6UMMxXBnWkalq9+C5+VTmlIjAYM4iF2IYF2N+zToqAfYOp+3rfw==} optionalDependencies: - cbor-extract: 2.1.1 + cbor-extract: 2.2.0 dev: false /chai@4.3.10: @@ -7305,13 +7340,13 @@ packages: gopd: 1.0.1 has-property-descriptors: 1.0.0 - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 + es-define-property: 1.0.0 + es-errors: 1.3.0 gopd: 1.0.1 - has-property-descriptors: 1.0.1 dev: true /define-lazy-prop@2.0.0: @@ -7796,68 +7831,84 @@ packages: unbox-primitive: 1.0.2 which-typed-array: 1.1.11 - /es-abstract@1.22.3: - resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + /es-abstract@1.22.4: + resolution: {integrity: sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.2 - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.6 + call-bind: 1.0.7 + es-define-property: 1.0.0 + es-errors: 1.3.0 es-set-tostringtag: 2.0.2 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 - get-intrinsic: 1.2.2 - get-symbol-description: 1.0.0 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 globalthis: 1.0.3 gopd: 1.0.1 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 has-proto: 1.0.1 has-symbols: 1.0.3 - hasown: 2.0.0 - internal-slot: 1.0.6 - is-array-buffer: 3.0.2 + hasown: 2.0.1 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 is-callable: 1.2.7 is-negative-zero: 2.0.2 is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 is-string: 1.0.7 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 is-weakref: 1.0.2 object-inspect: 1.13.1 object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.1 - safe-array-concat: 1.0.1 - safe-regex-test: 1.0.0 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.0 + safe-regex-test: 1.0.3 string.prototype.trim: 1.2.8 string.prototype.trimend: 1.0.7 string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.0 + typed-array-buffer: 1.0.1 typed-array-byte-length: 1.0.0 typed-array-byte-offset: 1.0.0 typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.13 + which-typed-array: 1.1.14 dev: true - /es-iterator-helpers@1.0.15: - resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-iterator-helpers@1.0.17: + resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} + engines: {node: '>= 0.4'} dependencies: asynciterator.prototype: 1.0.0 - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 + es-errors: 1.3.0 es-set-tostringtag: 2.0.2 function-bind: 1.1.2 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 globalthis: 1.0.3 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 has-proto: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.6 + internal-slot: 1.0.7 iterator.prototype: 1.1.2 - safe-array-concat: 1.0.1 + safe-array-concat: 1.1.0 dev: true /es-module-lexer@0.9.3: @@ -7876,9 +7927,9 @@ packages: resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 - has-tostringtag: 1.0.0 - hasown: 2.0.0 + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.1 dev: true /es-shim-unscopables@1.0.0: @@ -7890,7 +7941,7 @@ packages: /es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - hasown: 2.0.0 + hasown: 2.0.1 dev: true /es-to-primitive@1.2.1: @@ -8265,9 +8316,9 @@ packages: dependencies: array-includes: 3.1.7 array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.2 + array.prototype.tosorted: 1.1.3 doctrine: 2.1.0 - es-iterator-helpers: 1.0.15 + es-iterator-helpers: 1.0.17 eslint: 8.50.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 @@ -8605,7 +8656,7 @@ packages: get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: - '@types/yauzl': 2.10.2 + '@types/yauzl': 2.10.3 transitivePeerDependencies: - supports-color @@ -8809,6 +8860,18 @@ packages: optional: true dependencies: debug: 4.3.4(supports-color@8.1.1) + dev: true + + /follow-redirects@1.15.5(debug@4.3.4): + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.4(supports-color@8.1.1) /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -8983,13 +9046,15 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} dependencies: + es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 - hasown: 2.0.0 + hasown: 2.0.1 dev: true /get-nonce@1.0.1: @@ -9034,6 +9099,15 @@ packages: call-bind: 1.0.2 get-intrinsic: 1.2.1 + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + dev: true + /get-tsconfig@4.7.2: resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} dependencies: @@ -9273,10 +9347,10 @@ packages: dependencies: get-intrinsic: 1.2.1 - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: - get-intrinsic: 1.2.2 + es-define-property: 1.0.0 dev: true /has-proto@1.0.1: @@ -9293,6 +9367,13 @@ packages: dependencies: has-symbols: 1.0.3 + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + /has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: false @@ -9319,8 +9400,8 @@ packages: minimalistic-assert: 1.0.1 dev: true - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + /hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 @@ -9618,13 +9699,13 @@ packages: has: 1.0.3 side-channel: 1.0.4 - /internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 - hasown: 2.0.0 - side-channel: 1.0.4 + es-errors: 1.3.0 + hasown: 2.0.1 + side-channel: 1.0.5 dev: true /invariant@2.2.4: @@ -9659,6 +9740,14 @@ packages: get-intrinsic: 1.2.1 is-typed-array: 1.1.12 + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -9670,7 +9759,7 @@ packages: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-bigint@1.0.4: @@ -9717,7 +9806,7 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.0 + hasown: 2.0.1 dev: true /is-date-object@1.0.5: @@ -9744,7 +9833,7 @@ packages: /is-finalizationregistry@1.0.2: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 dev: true /is-fullwidth-code-point@3.0.0: @@ -9895,6 +9984,13 @@ packages: dependencies: which-typed-array: 1.1.11 + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.14 + dev: true + /is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -9914,8 +10010,8 @@ packages: /is-weakset@2.0.2: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 dev: true /is-wsl@2.2.0: @@ -9991,9 +10087,9 @@ packages: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: define-properties: 1.2.1 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.4 + reflect.getprototypeof: 1.0.5 set-function-name: 2.0.1 dev: true @@ -10243,7 +10339,7 @@ packages: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.5.4 + semver: 7.6.0 /jsprim@2.0.2: resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} @@ -10260,7 +10356,7 @@ packages: dependencies: array-includes: 3.1.7 array.prototype.flat: 1.3.2 - object.assign: 4.1.4 + object.assign: 4.1.5 object.values: 1.1.7 dev: true @@ -10799,8 +10895,8 @@ packages: resolution: {integrity: sha512-/eMxh3LNjCXOnU6KnQMjBM8dRnoJNpWIg7mD2m2RthraYiQK2FNzPWIKxWm2j3Ufcf5nzFXupgABledE86r4fQ==} dev: false - /minecraft-data@3.60.0: - resolution: {integrity: sha512-zTS2DsFZBvHsYCUaKL+E0mSbrgAAX5DJzYmlskh/6WnVV7lxftW7jDjR8SMgGoBBS1V0TZ79BWp3+aD3r8wKIg==} + /minecraft-data@3.61.0: + resolution: {integrity: sha512-e7FMplGNjhAZvdxT66bP56ZqHymr+BrzCZlhNxRr1suFKueGSTQQA+DZ2ZU/vW/02dBFCrHfBEJh1sw5vOZ+Ew==} /minecraft-folder-path@1.2.0: resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} @@ -10836,7 +10932,7 @@ packages: /mineflayer-pathfinder@2.4.4: resolution: {integrity: sha512-HAXakZrJRb1UC+5dv8EaDrqjW3ZnBnBk3nkb6x/YWyhHCUKn/E7VU0FO+UN9whuqPlkSaVumEdXJdydE6lSYxQ==} dependencies: - minecraft-data: 3.60.0 + minecraft-data: 3.61.0 prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-entity: 2.3.1 prismarine-item: 1.14.0 @@ -11049,6 +11145,12 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} requiresBuild: true @@ -11153,10 +11255,12 @@ packages: dependencies: whatwg-url: 5.0.0 - /node-gyp-build-optional-packages@5.0.3: - resolution: {integrity: sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==} + /node-gyp-build-optional-packages@5.1.1: + resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} hasBin: true requiresBuild: true + dependencies: + detect-libc: 2.0.2 dev: false optional: true @@ -11341,29 +11445,39 @@ packages: has-symbols: 1.0.3 object-keys: 1.1.1 + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + /object.entries@1.1.7: resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 dev: true /object.fromentries@2.0.7: resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 dev: true /object.hasown@1.1.3: resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} dependencies: define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 dev: true /object.values@1.1.7: @@ -11826,6 +11940,15 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /potpack@1.0.2: resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} dev: false @@ -11889,10 +12012,10 @@ packages: engines: {node: '>= 0.8'} dev: true - /prismarine-auth@2.3.0: - resolution: {integrity: sha512-giKZiHwuQdpMJ7KX94UncOJqM3u+yqKIR2UI/rqmdmFUuQilV9vhlz/zehpVkvo7FE8gmZsuUMCUPhI+gtgd3A==} + /prismarine-auth@2.4.1: + resolution: {integrity: sha512-DwDI3Ucxf/eThJJo5QVzlywFrJulL1fK1z6F8bybvddim8YgudRksQc3w4cE2m0hPPHfE1BRd5lh1NpedrixMQ==} dependencies: - '@azure/msal-node': 2.4.0 + '@azure/msal-node': 2.6.3 '@xboxreplay/xboxlive-auth': 3.3.3(debug@4.3.4) debug: 4.3.4(supports-color@8.1.1) jose: 4.15.4 @@ -11903,13 +12026,13 @@ packages: - encoding - supports-color - /prismarine-biome@1.3.0(minecraft-data@3.60.0)(prismarine-registry@1.7.0): + /prismarine-biome@1.3.0(minecraft-data@3.61.0)(prismarine-registry@1.7.0): resolution: {integrity: sha512-GY6nZxq93mTErT7jD7jt8YS1aPrOakbJHh39seYsJFXvueIOdHAmW16kYQVrTVMW5MlWLQVxV/EquRwOgr4MnQ==} peerDependencies: - minecraft-data: 3.60.0 + minecraft-data: 3.61.0 prismarine-registry: ^1.1.0 dependencies: - minecraft-data: 3.60.0 + minecraft-data: 3.61.0 prismarine-registry: 1.7.0 /prismarine-chat@1.9.1: @@ -11920,11 +12043,11 @@ packages: prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 - /prismarine-chunk@1.35.0(minecraft-data@3.60.0): + /prismarine-chunk@1.35.0(minecraft-data@3.61.0): resolution: {integrity: sha512-Q1lElMUle7wWxWdQjbZo3j2/dLNG325j90IcbbMmBTnHdQSWIjWFe792XOz3RVBlvrhRJEiZk38S6/eQTQ9esw==} engines: {node: '>=14'} dependencies: - prismarine-biome: 1.3.0(minecraft-data@3.60.0)(prismarine-registry@1.7.0) + prismarine-biome: 1.3.0(minecraft-data@3.61.0)(prismarine-registry@1.7.0) prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-nbt: 2.2.1 prismarine-registry: 1.7.0 @@ -11962,7 +12085,7 @@ packages: /prismarine-physics@1.8.0: resolution: {integrity: sha512-gbM+S+bmVtOKVv+Z0WGaHMeEeBHISIDsRDRlv8sr0dex3ZJRhuq8djA02CBreguXtI18ZKh6q3TSj2qDr45NHA==} dependencies: - minecraft-data: 3.60.0 + minecraft-data: 3.61.0 prismarine-nbt: 2.5.0 vec3: 0.1.8 dev: true @@ -11987,13 +12110,13 @@ packages: /prismarine-registry@1.7.0: resolution: {integrity: sha512-yyva0FpWI078nNeMhx8ekVza5uUTYhEv+C+ADu3wUQXiG8qhXkvrf0uzsnhTgZL8BLdsi2axgCEiKw9qSKIuxQ==} dependencies: - minecraft-data: 3.60.0 + minecraft-data: 3.61.0 prismarine-nbt: 2.5.0 /prismarine-schematic@1.2.3: resolution: {integrity: sha512-Mwpn43vEHhm3aw3cPhJjWqztkW+nX+QLajDHlTask8lEOTGl1WmpvFja4iwiws4GIvaC8x0Foptf4uvDsnjrAg==} dependencies: - minecraft-data: 3.60.0 + minecraft-data: 3.61.0 prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-nbt: 2.2.1 prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 @@ -12588,8 +12711,8 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readable-stream@4.4.2: - resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} + /readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: abort-controller: 3.0.0 @@ -12638,14 +12761,15 @@ packages: strip-indent: 4.0.0 dev: true - /reflect.getprototypeof@1.0.4: - resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + /reflect.getprototypeof@1.0.5: + resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + es-abstract: 1.22.4 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 globalthis: 1.0.3 which-builtin-type: 1.1.3 dev: true @@ -12684,6 +12808,16 @@ packages: define-properties: 1.2.1 set-function-name: 2.0.1 + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.1 + dev: true + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} @@ -12896,6 +13030,16 @@ packages: has-symbols: 1.0.3 isarray: 2.0.5 + /safe-array-concat@1.1.0: + resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -12909,6 +13053,15 @@ packages: get-intrinsic: 1.2.1 is-regex: 1.1.4 + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + dev: true + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -12960,6 +13113,13 @@ packages: dependencies: lru-cache: 6.0.0 + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -13009,14 +13169,16 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: false - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + /set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 gopd: 1.0.1 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 dev: true /set-function-name@2.0.1: @@ -13101,6 +13263,16 @@ packages: get-intrinsic: 1.2.1 object-inspect: 1.12.3 + /side-channel@1.0.5: + resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + dev: true + /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} dev: true @@ -13663,8 +13835,8 @@ packages: resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} dev: true - /systeminformation@5.21.22: - resolution: {integrity: sha512-gNHloAJSyS+sKWkwvmvozZ1eHrdVTEsynWMTY6lvLGBB70gflkBQFw8drXXr1oEXY84+Vr9tOOrN8xHZLJSycA==} + /systeminformation@5.21.24: + resolution: {integrity: sha512-xQada8ByGGFoRXJaUptGgddn3i7IjtSdqNdCKzB8xkzsM7pHnfLYBWxkPdGzhZ0Z/l+W1yo+aZQZ74d2isj8kw==} engines: {node: '>=8.0.0'} os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true @@ -14045,6 +14217,15 @@ packages: get-intrinsic: 1.2.1 is-typed-array: 1.1.12 + /typed-array-buffer@1.0.1: + resolution: {integrity: sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + dev: true + /typed-array-byte-length@1.0.0: resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} engines: {node: '>= 0.4'} @@ -14493,8 +14674,8 @@ packages: optionalDependencies: fsevents: 2.3.3 - /vite@4.5.0: - resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} + /vite@4.5.2: + resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -14522,7 +14703,7 @@ packages: optional: true dependencies: esbuild: 0.18.20 - postcss: 8.4.31 + postcss: 8.4.35 rollup: 3.29.4 optionalDependencies: fsevents: 2.3.3 @@ -14681,7 +14862,7 @@ packages: engines: {node: '>= 0.4'} dependencies: function.prototype.name: 1.1.6 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-async-function: 2.0.0 is-date-object: 1.0.5 is-finalizationregistry: 1.0.2 @@ -14691,7 +14872,7 @@ packages: isarray: 2.0.5 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 - which-typed-array: 1.1.13 + which-typed-array: 1.1.14 dev: true /which-collection@1.0.1: @@ -14713,15 +14894,15 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 - /which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + /which-typed-array@1.1.14: + resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + available-typed-arrays: 1.0.6 + call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /which@1.3.1: @@ -15139,18 +15320,18 @@ packages: react: 18.2.0 dev: false - github.com/PrismarineJS/mineflayer/cc98f1307e3ab48477d2a9ff29da4447f42b30bc: - resolution: {tarball: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/cc98f1307e3ab48477d2a9ff29da4447f42b30bc} + github.com/PrismarineJS/mineflayer/b9491ae508dc52e4538dd66eb6f47a639facde20: + resolution: {tarball: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/b9491ae508dc52e4538dd66eb6f47a639facde20} name: mineflayer - version: 4.18.0 + version: 4.19.0 engines: {node: '>=18'} dependencies: - minecraft-data: 3.60.0 + minecraft-data: 3.61.0 minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f - prismarine-biome: 1.3.0(minecraft-data@3.60.0)(prismarine-registry@1.7.0) + prismarine-biome: 1.3.0(minecraft-data@3.61.0)(prismarine-registry@1.7.0) prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chat: 1.9.1 - prismarine-chunk: 1.35.0(minecraft-data@3.60.0) + prismarine-chunk: 1.35.0(minecraft-data@3.61.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.2.1 @@ -15187,8 +15368,8 @@ packages: name: diamond-square version: 1.3.0 dependencies: - minecraft-data: 3.60.0 - prismarine-chunk: 1.35.0(minecraft-data@3.60.0) + minecraft-data: 3.61.0 + prismarine-chunk: 1.35.0(minecraft-data@3.61.0) random-seed: 0.3.0 vec3: 0.1.8 dev: false @@ -15211,22 +15392,22 @@ packages: version: 1.45.0 engines: {node: '>=14'} dependencies: - '@types/readable-stream': 4.0.4 + '@types/readable-stream': 4.0.10 aes-js: 3.1.2 buffer-equal: 1.0.1 debug: 4.3.4(supports-color@8.1.1) endian-toggle: 0.0.0 lodash.get: 4.4.2 lodash.merge: 4.6.2 - minecraft-data: 3.60.0 + minecraft-data: 3.61.0 minecraft-folder-path: 1.2.0 node-fetch: 2.7.0 node-rsa: 0.4.2 - prismarine-auth: 2.3.0 + prismarine-auth: 2.4.1 prismarine-nbt: 2.5.0 prismarine-realms: 1.3.2 protodef: 1.15.0 - readable-stream: 4.4.2 + readable-stream: 4.5.2 uuid-1345: 1.0.2 yggdrasil: 1.7.0 transitivePeerDependencies: @@ -15238,20 +15419,20 @@ packages: name: prismarine-block version: 1.17.1 dependencies: - minecraft-data: 3.60.0 - prismarine-biome: 1.3.0(minecraft-data@3.60.0)(prismarine-registry@1.7.0) + minecraft-data: 3.61.0 + prismarine-biome: 1.3.0(minecraft-data@3.61.0)(prismarine-registry@1.7.0) prismarine-chat: 1.9.1 prismarine-item: 1.14.0 prismarine-nbt: 2.2.1 prismarine-registry: 1.7.0 - github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.60.0): + github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.61.0): resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f} id: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f name: prismarine-provider-anvil version: 2.7.0 dependencies: - prismarine-chunk: 1.35.0(minecraft-data@3.60.0) + prismarine-chunk: 1.35.0(minecraft-data@3.61.0) prismarine-nbt: 2.5.0 uint4: 0.1.2 vec3: 0.1.8 From 0f26cd7d81ccac4e9a4cb63f503229ab355af643 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 16 Feb 2024 20:32:43 +0300 Subject: [PATCH 0012/1195] fix: three.js scene was clipped in firefox with webgl2 disabled eg tor --- src/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index c5d21230..4523b66d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -105,7 +105,9 @@ const renderer = new THREE.WebGLRenderer({ }) initWithRenderer(renderer.domElement) window.renderer = renderer -renderer.setPixelRatio(window.devicePixelRatio || 1) // todo this value is too high on ios, need to check, probably we should use avg, also need to make it configurable +let pixelRatio = window.devicePixelRatio || 1 // todo this value is too high on ios, need to check, probably we should use avg, also need to make it configurable +if (!renderer.capabilities.isWebGL2) pixelRatio = 1 // webgl1 has issues with high pixel ratio (sometimes screen is clipped) +renderer.setPixelRatio(pixelRatio) renderer.setSize(window.innerWidth, window.innerHeight) renderer.domElement.id = 'viewer-canvas' document.body.appendChild(renderer.domElement) From 4c852af72bb17e5d717104d981a0f0a39723b35c Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 16 Feb 2024 22:24:52 +0300 Subject: [PATCH 0013/1195] feat: enchants & durability display in inventory gui --- pnpm-lock.yaml | 8 ++++---- src/playerWindows.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b1fc701e..6df7d660 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -241,7 +241,7 @@ importers: version: 1.0.0 minecraft-inventory-gui: specifier: github:zardoy/minecraft-inventory-gui#next - version: github.com/zardoy/minecraft-inventory-gui/5dfb4e39e601108f6e1306cd0f4b9de45cf6b1db(@types/react@18.2.20)(react@18.2.0) + version: github.com/zardoy/minecraft-inventory-gui/b54222dcdc508f7418102a7e25abf3df35a8c9ba(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:PrismarineJS/mineflayer version: github.com/PrismarineJS/mineflayer/b9491ae508dc52e4538dd66eb6f47a639facde20 @@ -15374,9 +15374,9 @@ packages: vec3: 0.1.8 dev: false - github.com/zardoy/minecraft-inventory-gui/5dfb4e39e601108f6e1306cd0f4b9de45cf6b1db(@types/react@18.2.20)(react@18.2.0): - resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/5dfb4e39e601108f6e1306cd0f4b9de45cf6b1db} - id: github.com/zardoy/minecraft-inventory-gui/5dfb4e39e601108f6e1306cd0f4b9de45cf6b1db + github.com/zardoy/minecraft-inventory-gui/b54222dcdc508f7418102a7e25abf3df35a8c9ba(@types/react@18.2.20)(react@18.2.0): + resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/b54222dcdc508f7418102a7e25abf3df35a8c9ba} + id: github.com/zardoy/minecraft-inventory-gui/b54222dcdc508f7418102a7e25abf3df35a8c9ba name: minecraft-inventory-gui version: 1.0.1 dependencies: diff --git a/src/playerWindows.ts b/src/playerWindows.ts index 6bc3f486..bdbe34a1 100644 --- a/src/playerWindows.ts +++ b/src/playerWindows.ts @@ -242,7 +242,7 @@ const isFullBlock = (block: string) => { return shape[0] === 0 && shape[1] === 0 && shape[2] === 0 && shape[3] === 1 && shape[4] === 1 && shape[5] === 1 } -type RenderSlot = Pick +type RenderSlot = Pick const renderSlot = (slot: RenderSlot, skipBlock = false): { texture: string, blockData?, scale?: number, slice?: number[] } | undefined => { const itemName = slot.name const isItem = loadedData.itemsByName[itemName] From fbfbce5498b205857ec6c96b06431565594fc69d Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 16 Feb 2024 20:43:53 +0300 Subject: [PATCH 0014/1195] Add worldInteractions to window object --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index 4523b66d..0b1e15d2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -91,6 +91,7 @@ import { downloadSoundsIfNeeded } from './soundSystem' window.debug = debug window.THREE = THREE +window.worldInteractions = worldInteractions window.beforeRenderFrame = [] // ACTUAL CODE From 333b2300e367e30c7ac044ca00a6637f2a9b8c11 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 17 Feb 2024 00:41:18 +0300 Subject: [PATCH 0015/1195] wip add new touch controls and other stuff --- src/gameUnload.ts | 17 ++++ src/react/Chat.stories.tsx | 1 + src/react/ChatContainer.tsx | 5 +- src/react/ChatProvider.tsx | 5 +- src/react/ConceptCommandsGui.stories.tsx | 52 ++++++++++++ src/react/PixelartIcon.tsx | 4 + src/react/TouchAreas.stories.tsx | 19 +++++ src/react/TouchAreasControls.tsx | 102 +++++++++++++++++++++++ src/react/TouchAreasControlsProvider.tsx | 12 +++ src/reactUi.tsx | 2 + 10 files changed, 215 insertions(+), 4 deletions(-) create mode 100644 src/gameUnload.ts create mode 100644 src/react/ConceptCommandsGui.stories.tsx create mode 100644 src/react/PixelartIcon.tsx create mode 100644 src/react/TouchAreas.stories.tsx create mode 100644 src/react/TouchAreasControls.tsx create mode 100644 src/react/TouchAreasControlsProvider.tsx diff --git a/src/gameUnload.ts b/src/gameUnload.ts new file mode 100644 index 00000000..d5622411 --- /dev/null +++ b/src/gameUnload.ts @@ -0,0 +1,17 @@ +import { subscribe } from 'valtio' +import { miscUiState } from './globalState' + +let toCleanup = [] as Array<() => void> + +export const watchUnloadForCleanup = (func: () => void) => { + toCleanup.push(func) +} + +subscribe(miscUiState, () => { + if (!miscUiState.gameLoaded) { + for (const func of toCleanup) { + func() + } + toCleanup = [] + } +}) diff --git a/src/react/Chat.stories.tsx b/src/react/Chat.stories.tsx index 7790f3dc..93585dd8 100644 --- a/src/react/Chat.stories.tsx +++ b/src/react/Chat.stories.tsx @@ -95,6 +95,7 @@ type Story = StoryObj export const Primary: Story = { args: { + usingTouch: false, messages: [{ parts: [ { diff --git a/src/react/ChatContainer.tsx b/src/react/ChatContainer.tsx index ccb8e9a2..5d9d0585 100644 --- a/src/react/ChatContainer.tsx +++ b/src/react/ChatContainer.tsx @@ -29,6 +29,7 @@ const MessageLine = ({ message }: { message: Message }) => { type Props = { messages: Message[] + usingTouch: boolean opacity?: number opened?: boolean onClose?: () => void @@ -52,9 +53,7 @@ export const fadeMessage = (message: Message, initialTimeout: boolean, requestUp }, initialTimeout ? 5000 : 0) } -export default ({ messages, opacity = 1, fetchCompletionItems, opened, sendMessage, onClose }: Props) => { - const usingTouch = useSnapshot(miscUiState).currentTouch - +export default ({ messages, opacity = 1, fetchCompletionItems, opened, sendMessage, onClose, usingTouch }: Props) => { const sendHistoryRef = useRef(JSON.parse(window.sessionStorage.chatHistory || '[]')) const [completePadText, setCompletePadText] = useState('') diff --git a/src/react/ChatProvider.tsx b/src/react/ChatProvider.tsx index 9275b14a..46f81fb8 100644 --- a/src/react/ChatProvider.tsx +++ b/src/react/ChatProvider.tsx @@ -1,7 +1,8 @@ import { useEffect, useRef, useState } from 'react' +import { useSnapshot } from 'valtio' import { formatMessage } from '../botUtils' import { getBuiltinCommandsList, tryHandleBuiltinCommand } from '../builtinCommands' -import { hideCurrentModal } from '../globalState' +import { hideCurrentModal, miscUiState } from '../globalState' import { options } from '../optionsStorage' import ChatContainer, { Message, fadeMessage } from './ChatContainer' import { useIsModalActive } from './utils' @@ -11,6 +12,7 @@ export default () => { const isChatActive = useIsModalActive('chat') const { messagesLimit, chatOpacity, chatOpacityOpened } = options const lastMessageId = useRef(0) + const usingTouch = useSnapshot(miscUiState).currentTouch useEffect(() => { bot.addListener('message', (jsonMsg, position) => { @@ -33,6 +35,7 @@ export default () => { }, []) return + +const Button2 = ({ title, icon }) => { + //@ts-expect-error + return + + } } + +const MineIcon = () => { + return + + +} diff --git a/src/react/TouchAreasControlsProvider.tsx b/src/react/TouchAreasControlsProvider.tsx index 7a3f9637..7de8eaca 100644 --- a/src/react/TouchAreasControlsProvider.tsx +++ b/src/react/TouchAreasControlsProvider.tsx @@ -1,5 +1,5 @@ import { useSnapshot } from 'valtio' -import { activeModalStack } from '../globalState' +import { activeModalStack, hideModal } from '../globalState' import { options } from '../optionsStorage' import TouchAreasControls from './TouchAreasControls' import { useIsModalActive, useUsingTouch } from './utils' @@ -7,7 +7,13 @@ import { useIsModalActive, useUsingTouch } from './utils' export default () => { const usingTouch = useUsingTouch() const hasModals = useSnapshot(activeModalStack).length !== 0 - const setupActive = useIsModalActive('touch-areas-setup') + const setupActive = useIsModalActive('touch-buttons-setup') + const { touchControlsPositions, touchControlsType } = useSnapshot(options) - return + return { + if (newPositions) { + options.touchControlsPositions = newPositions + } + hideModal() + }} /> } diff --git a/src/react/TouchControls.tsx b/src/react/TouchControls.tsx index 6e5cb4a7..db71ae1f 100644 --- a/src/react/TouchControls.tsx +++ b/src/react/TouchControls.tsx @@ -49,8 +49,9 @@ export default () => { const usingTouch = useUsingTouch() const { usingGamepadInput } = useSnapshot(miscUiState) const modals = useSnapshot(activeModalStack) + const { touchControlsType } = useSnapshot(options) - if (!usingTouch || usingGamepadInput) return null + if (!usingTouch || usingGamepadInput || touchControlsType !== 'classic') return null return (
Date: Mon, 19 Feb 2024 11:21:17 +0300 Subject: [PATCH 0034/1195] fix: false nametag was added to every mob --- prismarine-viewer/viewer/lib/entities.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prismarine-viewer/viewer/lib/entities.js b/prismarine-viewer/viewer/lib/entities.js index 7e706bfe..5ca6b44b 100644 --- a/prismarine-viewer/viewer/lib/entities.js +++ b/prismarine-viewer/viewer/lib/entities.js @@ -320,7 +320,7 @@ export class Entities extends EventEmitter { } // not player const displayText = entity.metadata?.[3] && this.displaySimpleText(entity.metadata[2]); - if (entity.name !== 'player') { + if (entity.name !== 'player' && displayText) { addNametag({ ...entity, username: displayText }, this.entitiesOptions, this.entities[entity.id].children.find(c => c.name === 'mesh')) } From dd1c335c898fbd8296d388ac69d4c9df64d3413d Mon Sep 17 00:00:00 2001 From: Vitaly Date: Mon, 19 Feb 2024 15:56:40 +0300 Subject: [PATCH 0035/1195] fix: improve gpu perf when many players are on the screen (stop useless texture duplication) --- prismarine-viewer/viewer/lib/entities.js | 47 ++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/prismarine-viewer/viewer/lib/entities.js b/prismarine-viewer/viewer/lib/entities.js index 5ca6b44b..422f8ed9 100644 --- a/prismarine-viewer/viewer/lib/entities.js +++ b/prismarine-viewer/viewer/lib/entities.js @@ -133,6 +133,9 @@ export class Entities extends EventEmitter { return playerObject } + // fixme workaround + defaultSteveTexture + // true means use default skin url updatePlayerSkin (entityId, username, /** @type {string | true} */skinUrl, /** @type {string | true | undefined} */capeUrl = undefined) { let playerObject = this.getPlayerObject(entityId) @@ -146,15 +149,24 @@ export class Entities extends EventEmitter { loadImage(skinUrl).then((image) => { playerObject = this.getPlayerObject(entityId) if (!playerObject) return - const skinCanvas = document.createElement('canvas') - loadSkinToCanvas(skinCanvas, image) - const skinTexture = new THREE.CanvasTexture(skinCanvas) + /** @type {THREE.CanvasTexture} */ + let skinTexture + if (skinUrl === stevePng && this.defaultSteveTexture) { + skinTexture = this.defaultSteveTexture + } else { + const skinCanvas = document.createElement('canvas') + loadSkinToCanvas(skinCanvas, image) + skinTexture = new THREE.CanvasTexture(skinCanvas) + if (skinUrl === stevePng) { + this.defaultSteveTexture = skinTexture + } + } skinTexture.magFilter = THREE.NearestFilter skinTexture.minFilter = THREE.NearestFilter skinTexture.needsUpdate = true //@ts-ignore playerObject.skin.map = skinTexture - playerObject.skin.modelType = inferModelType(skinCanvas) + playerObject.skin.modelType = inferModelType(skinTexture.image) const earsCanvas = document.createElement('canvas') loadEarsToCanvasFromSkin(earsCanvas, image) @@ -324,6 +336,33 @@ export class Entities extends EventEmitter { addNametag({ ...entity, username: displayText }, this.entitiesOptions, this.entities[entity.id].children.find(c => c.name === 'mesh')) } + // todo handle map, map_chunks events + // if (entity.name === 'item_frame' || entity.name === 'glow_item_frame') { + // const example = { + // "present": true, + // "itemId": 847, + // "itemCount": 1, + // "nbtData": { + // "type": "compound", + // "name": "", + // "value": { + // "map": { + // "type": "int", + // "value": 2146483444 + // }, + // "interactiveboard": { + // "type": "byte", + // "value": 1 + // } + // } + // } + // } + // const item = entity.metadata?.[8] + // if (item.nbtData) { + // const nbt = nbt.simplify(item.nbtData) + // } + // } + // this can be undefined in case where packet entity_destroy was sent twice (so it was already deleted) const e = this.entities[entity.id] From 46adf05534750f2bb686dc0cf4e10a9857f33bd8 Mon Sep 17 00:00:00 2001 From: Aliasghar Ghanati <45513491+AliLordLoss@users.noreply.github.com> Date: Fri, 23 Feb 2024 01:41:10 +0330 Subject: [PATCH 0036/1195] fix: Incorrect calculation of resource pack installation progress (#74) resolves #55 --- src/texturePack.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/texturePack.ts b/src/texturePack.ts index 321ce104..3af09a87 100644 --- a/src/texturePack.ts +++ b/src/texturePack.ts @@ -76,7 +76,7 @@ export const installTexturePack = async (file: File | ArrayBuffer, name = file[' const allFilesArr = Object.entries(zipFile.files) let done = 0 const upStatus = () => { - setLoadingScreenStatus(`${status} ${Math.round(++done / allFilesArr.length * 100)}%`) + setLoadingScreenStatus(`${status} ${Math.round(done / allFilesArr.length * 100)}%`) } await Promise.all(allFilesArr.map(async ([path, file]) => { const writePath = join(texturePackBasePath, path) From d36bec02bfb7222ef8ea1b0503371bf16812a9e2 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 23 Feb 2024 01:16:16 +0300 Subject: [PATCH 0037/1195] fix: open maps in the same tab --- src/menus/components/common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/menus/components/common.js b/src/menus/components/common.js index 3e827de1..83c74abd 100644 --- a/src/menus/components/common.js +++ b/src/menus/components/common.js @@ -48,7 +48,7 @@ function openURL (url, newTab = true) { if (newTab) { window.open(url, '_blank', 'noopener,noreferrer') } else { - window.open(url) + window.open(url, '_self') } } From 3b0af89756b258a5f328f913766ebbff820411ce Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 25 Feb 2024 23:41:18 +0300 Subject: [PATCH 0038/1195] fix: fix player walking & running animation by using mineflayer-tracker to get correct velocity of players --- package.json | 5 +++++ pnpm-lock.yaml | 36 +++++++++++++++++++++++++++++++++--- src/entities.ts | 32 +++++++++++++++++++++++--------- 3 files changed, 61 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index f9cfe462..7fade875 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "@dimaka/interface": "0.0.3-alpha.0", "@floating-ui/react": "^0.26.1", "@mui/base": "5.0.0-beta.34", + "@nxg-org/mineflayer-tracker": "^1.2.1", "@types/react": "^18.2.20", "@types/react-dom": "^18.2.7", "@types/wicg-file-system-access": "^2023.10.2", @@ -64,6 +65,7 @@ "react-transition-group": "^4.4.5", "sanitize-filename": "^1.6.3", "skinview3d": "^3.0.1", + "source-map-js": "^1.0.2", "stats-gl": "^1.0.5", "stats.js": "^0.17.0", "tabbable": "^6.2.0", @@ -133,6 +135,9 @@ "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", "minecraft-protocol": "github:zardoy/minecraft-protocol#everything", "react": "^18.2.0" + }, + "patchedDependencies": { + "source-map-js@1.0.2": "patches/source-map-js@1.0.2.patch" } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dcee2dcf..9affe440 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,11 @@ overrides: minecraft-protocol: github:zardoy/minecraft-protocol#everything react: ^18.2.0 +patchedDependencies: + source-map-js@1.0.2: + hash: 64rmfibsvq4yinbp7ki2vnrrau + path: patches/source-map-js@1.0.2.patch + importers: .: @@ -27,6 +32,9 @@ importers: '@mui/base': specifier: 5.0.0-beta.34 version: 5.0.0-beta.34(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@nxg-org/mineflayer-tracker': + specifier: ^1.2.1 + version: 1.2.1 '@types/react': specifier: ^18.2.20 version: 18.2.20 @@ -129,6 +137,9 @@ importers: skinview3d: specifier: ^3.0.1 version: 3.0.1 + source-map-js: + specifier: ^1.0.2 + version: 1.0.2(patch_hash=64rmfibsvq4yinbp7ki2vnrrau) stats-gl: specifier: ^1.0.5 version: 1.0.5 @@ -3304,6 +3315,23 @@ packages: dev: false optional: true + /@nxg-org/mineflayer-tracker@1.2.1: + resolution: {integrity: sha512-SI1ffF8zvg3/ZNE021Ja2W0FZPN+WbQDZf8yFqOcXtPRXAtM9W6HvoACdzXep8BZid7WYgYLIgjKpB+9RqvCNQ==} + dependencies: + '@nxg-org/mineflayer-trajectories': 1.1.1 + '@nxg-org/mineflayer-util-plugin': 1.8.3 + dev: false + + /@nxg-org/mineflayer-trajectories@1.1.1: + resolution: {integrity: sha512-X103KXlX8+L3uMeK4jQxMUdTizv01sQRSfBizAF/iOAdfQZehRLXr3CYKeJzfwPYGLN0X0JCl++cMEcZVn4vbg==} + dependencies: + '@nxg-org/mineflayer-util-plugin': 1.8.3 + dev: false + + /@nxg-org/mineflayer-util-plugin@1.8.3: + resolution: {integrity: sha512-YlIbzCDs9822xuvmYlD0vXZz0iye9buqp9NK4nNn15gYybdqBtC/YxK6BLqXtwNohZCKoZdKgei7Xd5Bt2/rUg==} + dev: false + /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -7431,6 +7459,7 @@ packages: /detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} + requiresBuild: true dev: false /detect-node-es@1.1.0: @@ -11938,7 +11967,7 @@ packages: dependencies: nanoid: 3.3.6 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.0.2(patch_hash=64rmfibsvq4yinbp7ki2vnrrau) /postcss@8.4.35: resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} @@ -11946,7 +11975,7 @@ packages: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.0.2(patch_hash=64rmfibsvq4yinbp7ki2vnrrau) dev: true /potpack@1.0.2: @@ -13499,9 +13528,10 @@ packages: dev: false optional: true - /source-map-js@1.0.2: + /source-map-js@1.0.2(patch_hash=64rmfibsvq4yinbp7ki2vnrrau): resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + patched: true /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} diff --git a/src/entities.ts b/src/entities.ts index 4e8fb0d2..0e000c12 100644 --- a/src/entities.ts +++ b/src/entities.ts @@ -1,7 +1,10 @@ import { Entity } from 'prismarine-entity' +import tracker from '@nxg-org/mineflayer-tracker' import { options, watchValue } from './optionsStorage' customEvents.on('gameLoaded', () => { + bot.loadPlugin(tracker) + // todo cleanup (move to viewer, also shouldnt be used at all) const playerPerAnimation = {} as Record const entityData = (e: Entity) => { @@ -10,6 +13,7 @@ customEvents.on('gameLoaded', () => { window.debugEntityMetadata[e.username] = e // todo entity spawn timing issue, check perf if (viewer.entities.entities[e.id]?.playerObject) { + bot.tracker.trackEntity(e) const { playerObject } = viewer.entities.entities[e.id] playerObject.backEquipment = e.equipment.some((item) => item?.name === 'elytra') ? 'elytra' : 'cape' if (playerObject.cape.map === null) { @@ -17,18 +21,27 @@ customEvents.on('gameLoaded', () => { } // todo (easy, important) elytra flying animation // todo cleanup states - const WALKING_SPEED = 0.1 - const SPRINTING_SPEED = 0.15 - const isWalking = Math.abs(e.velocity.x) > WALKING_SPEED || Math.abs(e.velocity.z) > WALKING_SPEED - const isSprinting = Math.abs(e.velocity.x) > SPRINTING_SPEED || Math.abs(e.velocity.z) > SPRINTING_SPEED - const newAnimation = isWalking ? (isSprinting ? 'running' : 'walking') : 'idle' - if (newAnimation !== playerPerAnimation[e.username]) { - viewer.entities.playAnimation(e.id, newAnimation) - playerPerAnimation[e.username] = newAnimation - } } } + bot.on('physicsTick', () => { + for (const [id, { tracking, info }] of Object.entries(bot.tracker.trackingData)) { + if (!tracking) continue + const e = bot.entities[id]! + const speed = info.avgSpeed + const WALKING_SPEED = 0.03 + const SPRINTING_SPEED = 0.18 + const isWalking = Math.abs(speed.x) > WALKING_SPEED || Math.abs(speed.z) > WALKING_SPEED + const isSprinting = Math.abs(speed.x) > SPRINTING_SPEED || Math.abs(speed.z) > SPRINTING_SPEED + const newAnimation = isWalking ? (isSprinting ? 'running' : 'walking') : 'idle' + const username = e.username! + if (newAnimation !== playerPerAnimation[username]) { + viewer.entities.playAnimation(e.id, newAnimation) + playerPerAnimation[username] = newAnimation + } + } + }) + bot.on('entitySwingArm', (e) => { if (viewer.entities.entities[e.id]?.playerObject) { viewer.entities.playAnimation(e.id, 'oneSwing') @@ -54,6 +67,7 @@ customEvents.on('gameLoaded', () => { viewer.entities.addListener('remove', (e) => { loadedSkinEntityIds.delete(e.id) playerPerAnimation[e.username] = '' + bot.tracker.stopTrackingEntity(e, true) }) bot.on('entityMoved', (e) => { From 727d56d7b8b7849236a357d0d434a1bcd6f936f8 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 25 Feb 2024 23:41:29 +0300 Subject: [PATCH 0039/1195] up readme note --- README.MD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.MD b/README.MD index 029786a7..d4c3c6e8 100644 --- a/README.MD +++ b/README.MD @@ -6,7 +6,7 @@ A true Minecraft client running in your browser! A port of the original game to This project is a work in progress, but I consider it to be usable. If you encounter any bugs or usability issues, please report them! -You can try this out at [mcraft.fun](https://mcraft.fun/), [mcon.vercel.app](https://mcon.vercel.app/) or the GitHub pages deploy. +You can try this out at [mcraft.fun](https://mcraft.fun/), [pcm.gg](https://pcm.gg) (short link) [mcon.vercel.app](https://mcon.vercel.app/) or the GitHub pages deploy. Every commit from the `develop` (default) branch is deployed to [s.mcraft.fun](https://s.mcraft.fun/) - so it's usually newer, but might be less stable. ### Big Features From 59b32331d0eb01c15b263797e165849f5a1dad77 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 26 Feb 2024 03:52:59 +0300 Subject: [PATCH 0040/1195] up mc protocol & data for 1.20.4 --- package.json | 4 ++-- pnpm-lock.yaml | 56 +++++++++++++++++++++++++------------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index 7fade875..4fe5a2d5 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "lit": "^2.8.0", "lodash-es": "^4.17.21", "minecraft-assets": "^1.12.2", - "minecraft-data": "3.61.0", + "minecraft-data": "3.61.2", "net-browserify": "github:zardoy/prismarinejs-net-browserify", "node-gzip": "^1.1.2", "peerjs": "^1.5.0", @@ -131,7 +131,7 @@ "diamond-square": "github:zardoy/diamond-square", "prismarine-block": "github:zardoy/prismarine-block#next-era", "prismarine-world": "github:zardoy/prismarine-world#next-era", - "minecraft-data": "3.61.0", + "minecraft-data": "3.61.2", "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", "minecraft-protocol": "github:zardoy/minecraft-protocol#everything", "react": "^18.2.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9affe440..8896d703 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ overrides: diamond-square: github:zardoy/diamond-square prismarine-block: github:zardoy/prismarine-block#next-era prismarine-world: github:zardoy/prismarine-world#next-era - minecraft-data: 3.61.0 + minecraft-data: 3.61.2 prismarine-provider-anvil: github:zardoy/prismarine-provider-anvil#everything minecraft-protocol: github:zardoy/minecraft-protocol#everything react: ^18.2.0 @@ -105,8 +105,8 @@ importers: specifier: ^1.12.2 version: 1.12.2 minecraft-data: - specifier: 3.61.0 - version: 3.61.0 + specifier: 3.61.2 + version: 3.61.2 net-browserify: specifier: github:zardoy/prismarinejs-net-browserify version: github.com/zardoy/prismarinejs-net-browserify/7d827dba61bd2f9ac9a6086fe2079a0fccadd070 @@ -342,7 +342,7 @@ importers: version: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chunk: specifier: ^1.22.0 - version: 1.35.0(minecraft-data@3.61.0) + version: 1.35.0(minecraft-data@3.61.2) prismarine-schematic: specifier: ^1.2.0 version: 1.2.3 @@ -5640,18 +5640,18 @@ packages: exit-hook: 2.2.1 flatmap: 0.0.3 long: 5.2.3 - minecraft-data: 3.61.0 + minecraft-data: 3.61.2 minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f mkdirp: 2.1.6 moment: 2.29.4 needle: 2.9.1 node-gzip: 1.1.2 node-rsa: 1.1.1 - prismarine-chunk: 1.35.0(minecraft-data@3.61.0) + prismarine-chunk: 1.35.0(minecraft-data@3.61.2) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 - prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.61.0) + prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.61.2) prismarine-windows: 2.8.0 prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 random-seed: 0.3.0 @@ -10924,8 +10924,8 @@ packages: resolution: {integrity: sha512-/eMxh3LNjCXOnU6KnQMjBM8dRnoJNpWIg7mD2m2RthraYiQK2FNzPWIKxWm2j3Ufcf5nzFXupgABledE86r4fQ==} dev: false - /minecraft-data@3.61.0: - resolution: {integrity: sha512-e7FMplGNjhAZvdxT66bP56ZqHymr+BrzCZlhNxRr1suFKueGSTQQA+DZ2ZU/vW/02dBFCrHfBEJh1sw5vOZ+Ew==} + /minecraft-data@3.61.2: + resolution: {integrity: sha512-4RsP5rkQx78ZaOKWGeVidc+PjH+DFzNFrQMtSVAgabDOHDWrhSaOlpkxpltHy+vYUyLhglfAkc2g1DUkgHQcTQ==} /minecraft-folder-path@1.2.0: resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} @@ -10961,7 +10961,7 @@ packages: /mineflayer-pathfinder@2.4.4: resolution: {integrity: sha512-HAXakZrJRb1UC+5dv8EaDrqjW3ZnBnBk3nkb6x/YWyhHCUKn/E7VU0FO+UN9whuqPlkSaVumEdXJdydE6lSYxQ==} dependencies: - minecraft-data: 3.61.0 + minecraft-data: 3.61.2 prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-entity: 2.3.1 prismarine-item: 1.14.0 @@ -12055,13 +12055,13 @@ packages: - encoding - supports-color - /prismarine-biome@1.3.0(minecraft-data@3.61.0)(prismarine-registry@1.7.0): + /prismarine-biome@1.3.0(minecraft-data@3.61.2)(prismarine-registry@1.7.0): resolution: {integrity: sha512-GY6nZxq93mTErT7jD7jt8YS1aPrOakbJHh39seYsJFXvueIOdHAmW16kYQVrTVMW5MlWLQVxV/EquRwOgr4MnQ==} peerDependencies: - minecraft-data: 3.61.0 + minecraft-data: 3.61.2 prismarine-registry: ^1.1.0 dependencies: - minecraft-data: 3.61.0 + minecraft-data: 3.61.2 prismarine-registry: 1.7.0 /prismarine-chat@1.9.1: @@ -12072,11 +12072,11 @@ packages: prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 - /prismarine-chunk@1.35.0(minecraft-data@3.61.0): + /prismarine-chunk@1.35.0(minecraft-data@3.61.2): resolution: {integrity: sha512-Q1lElMUle7wWxWdQjbZo3j2/dLNG325j90IcbbMmBTnHdQSWIjWFe792XOz3RVBlvrhRJEiZk38S6/eQTQ9esw==} engines: {node: '>=14'} dependencies: - prismarine-biome: 1.3.0(minecraft-data@3.61.0)(prismarine-registry@1.7.0) + prismarine-biome: 1.3.0(minecraft-data@3.61.2)(prismarine-registry@1.7.0) prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-nbt: 2.2.1 prismarine-registry: 1.7.0 @@ -12114,7 +12114,7 @@ packages: /prismarine-physics@1.8.0: resolution: {integrity: sha512-gbM+S+bmVtOKVv+Z0WGaHMeEeBHISIDsRDRlv8sr0dex3ZJRhuq8djA02CBreguXtI18ZKh6q3TSj2qDr45NHA==} dependencies: - minecraft-data: 3.61.0 + minecraft-data: 3.61.2 prismarine-nbt: 2.5.0 vec3: 0.1.8 dev: true @@ -12139,13 +12139,13 @@ packages: /prismarine-registry@1.7.0: resolution: {integrity: sha512-yyva0FpWI078nNeMhx8ekVza5uUTYhEv+C+ADu3wUQXiG8qhXkvrf0uzsnhTgZL8BLdsi2axgCEiKw9qSKIuxQ==} dependencies: - minecraft-data: 3.61.0 + minecraft-data: 3.61.2 prismarine-nbt: 2.5.0 /prismarine-schematic@1.2.3: resolution: {integrity: sha512-Mwpn43vEHhm3aw3cPhJjWqztkW+nX+QLajDHlTask8lEOTGl1WmpvFja4iwiws4GIvaC8x0Foptf4uvDsnjrAg==} dependencies: - minecraft-data: 3.61.0 + minecraft-data: 3.61.2 prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-nbt: 2.2.1 prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 @@ -15356,12 +15356,12 @@ packages: version: 4.19.0 engines: {node: '>=18'} dependencies: - minecraft-data: 3.61.0 + minecraft-data: 3.61.2 minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f - prismarine-biome: 1.3.0(minecraft-data@3.61.0)(prismarine-registry@1.7.0) + prismarine-biome: 1.3.0(minecraft-data@3.61.2)(prismarine-registry@1.7.0) prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chat: 1.9.1 - prismarine-chunk: 1.35.0(minecraft-data@3.61.0) + prismarine-chunk: 1.35.0(minecraft-data@3.61.2) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.2.1 @@ -15398,8 +15398,8 @@ packages: name: diamond-square version: 1.3.0 dependencies: - minecraft-data: 3.61.0 - prismarine-chunk: 1.35.0(minecraft-data@3.61.0) + minecraft-data: 3.61.2 + prismarine-chunk: 1.35.0(minecraft-data@3.61.2) random-seed: 0.3.0 vec3: 0.1.8 dev: false @@ -15429,7 +15429,7 @@ packages: endian-toggle: 0.0.0 lodash.get: 4.4.2 lodash.merge: 4.6.2 - minecraft-data: 3.61.0 + minecraft-data: 3.61.2 minecraft-folder-path: 1.2.0 node-fetch: 2.7.0 node-rsa: 0.4.2 @@ -15449,20 +15449,20 @@ packages: name: prismarine-block version: 1.17.1 dependencies: - minecraft-data: 3.61.0 - prismarine-biome: 1.3.0(minecraft-data@3.61.0)(prismarine-registry@1.7.0) + minecraft-data: 3.61.2 + prismarine-biome: 1.3.0(minecraft-data@3.61.2)(prismarine-registry@1.7.0) prismarine-chat: 1.9.1 prismarine-item: 1.14.0 prismarine-nbt: 2.2.1 prismarine-registry: 1.7.0 - github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.61.0): + github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.61.2): resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f} id: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f name: prismarine-provider-anvil version: 2.7.0 dependencies: - prismarine-chunk: 1.35.0(minecraft-data@3.61.0) + prismarine-chunk: 1.35.0(minecraft-data@3.61.2) prismarine-nbt: 2.5.0 uint4: 0.1.2 vec3: 0.1.8 From dc6f899e8fdb10418601f85c27f93d8c65837ddc Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 27 Feb 2024 02:22:57 +0300 Subject: [PATCH 0041/1195] also add a way to debug chunks by leveraging y axis --- prismarine-viewer/viewer/lib/simpleUtils.ts | 7 +++++++ prismarine-viewer/viewer/lib/worldrenderer.ts | 11 ++++++----- src/index.ts | 5 +++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/prismarine-viewer/viewer/lib/simpleUtils.ts b/prismarine-viewer/viewer/lib/simpleUtils.ts index b46f9612..f4899993 100644 --- a/prismarine-viewer/viewer/lib/simpleUtils.ts +++ b/prismarine-viewer/viewer/lib/simpleUtils.ts @@ -16,3 +16,10 @@ export function chunkPos (pos: { x: number, z: number }) { const z = Math.floor(pos.z / 16) return [x, z] } + +export function sectionPos (pos: { x: number, y: number, z: number }) { + const x = Math.floor(pos.x / 16) + const y = Math.floor(pos.z / 16) + const z = Math.floor(pos.z / 16) + return [x, y, z] +} diff --git a/prismarine-viewer/viewer/lib/worldrenderer.ts b/prismarine-viewer/viewer/lib/worldrenderer.ts index bc8f55f9..4f16671b 100644 --- a/prismarine-viewer/viewer/lib/worldrenderer.ts +++ b/prismarine-viewer/viewer/lib/worldrenderer.ts @@ -9,7 +9,7 @@ import { dispose3 } from './dispose' import { toMajor } from './version.js' import PrismarineChatLoader from 'prismarine-chat' import { renderSign } from '../sign-renderer/' -import { chunkPos } from './simpleUtils' +import { chunkPos, sectionPos } from './simpleUtils' function mod (x, n) { return ((x % n) + n) % n @@ -274,12 +274,13 @@ export class WorldRenderer { }) } - getLoadedChunksRelative (pos: Vec3) { - const [currentX, currentZ] = chunkPos(pos) + getLoadedChunksRelative (pos: Vec3, includeY = false) { + const [currentX, currentY, currentZ] = sectionPos(pos) return Object.fromEntries(Object.entries(this.sectionObjects).map(([key, o]) => { const [xRaw, yRaw, zRaw] = key.split(',').map(Number) - const [x, z] = chunkPos({ x: xRaw, z: zRaw }) - return [`${x - currentX},${z - currentZ}`, o] + const [x, y, z] = sectionPos({ x: xRaw, y: yRaw, z: zRaw }) + const setKey = includeY ? `${x - currentX},${y - currentY},${z - currentZ}` : `${x - currentX},${z - currentZ}` + return [setKey, o] })) } diff --git a/src/index.ts b/src/index.ts index 933d68de..620b5597 100644 --- a/src/index.ts +++ b/src/index.ts @@ -139,6 +139,11 @@ Object.defineProperty(window, 'debugSceneChunks', { return viewer.world.getLoadedChunksRelative(bot.entity.position) }, }) +Object.defineProperty(window, 'debugSceneChunksY', { + get () { + return viewer.world.getLoadedChunksRelative(bot.entity.position, true) + }, +}) viewer.entities.entitiesOptions = { fontFamily: 'mojangles' } From 96a2296752080ad76abc0d5af0b325183f4d839e Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 2 Mar 2024 22:16:22 +0300 Subject: [PATCH 0042/1195] feat: update three js and improve render performance --- package.json | 9 +-- pnpm-lock.yaml | 60 ++++++++++--------- prismarine-viewer/viewer/lib/entity/Entity.js | 2 +- prismarine-viewer/viewer/lib/viewer.ts | 5 ++ 4 files changed, 42 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index 4fe5a2d5..2df3712c 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "@types/lodash-es": "^4.17.9", "@types/react-transition-group": "^4.4.7", "@types/stats.js": "^0.17.1", - "@types/three": "0.128.0", + "@types/three": "0.154.0", "@types/ua-parser-js": "^0.7.39", "@xmcl/installer": "^5.1.0", "assert": "^2.0.0", @@ -115,7 +115,7 @@ "rimraf": "^5.0.1", "storybook": "^7.4.6", "stream-browserify": "^3.0.0", - "three": "0.128.0", + "three": "0.154.0", "timers-browserify": "^2.0.12", "typescript": "^5.2.2", "use-typed-event-listener": "^4.0.2", @@ -127,7 +127,7 @@ }, "pnpm": { "overrides": { - "three": "0.128.0", + "three": "0.154.0", "diamond-square": "github:zardoy/diamond-square", "prismarine-block": "github:zardoy/prismarine-block#next-era", "prismarine-world": "github:zardoy/prismarine-world#next-era", @@ -135,9 +135,6 @@ "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", "minecraft-protocol": "github:zardoy/minecraft-protocol#everything", "react": "^18.2.0" - }, - "patchedDependencies": { - "source-map-js@1.0.2": "patches/source-map-js@1.0.2.patch" } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8896d703..41f711b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: - three: 0.128.0 + three: 0.154.0 diamond-square: github:zardoy/diamond-square prismarine-block: github:zardoy/prismarine-block#next-era prismarine-world: github:zardoy/prismarine-world#next-era @@ -14,11 +14,6 @@ overrides: minecraft-protocol: github:zardoy/minecraft-protocol#everything react: ^18.2.0 -patchedDependencies: - source-map-js@1.0.2: - hash: 64rmfibsvq4yinbp7ki2vnrrau - path: patches/source-map-js@1.0.2.patch - importers: .: @@ -139,7 +134,7 @@ importers: version: 3.0.1 source-map-js: specifier: ^1.0.2 - version: 1.0.2(patch_hash=64rmfibsvq4yinbp7ki2vnrrau) + version: 1.0.2 stats-gl: specifier: ^1.0.5 version: 1.0.5 @@ -197,8 +192,8 @@ importers: specifier: ^0.17.1 version: 0.17.1 '@types/three': - specifier: 0.128.0 - version: 0.128.0 + specifier: 0.154.0 + version: 0.154.0 '@types/ua-parser-js': specifier: ^0.7.39 version: 0.7.39 @@ -287,8 +282,8 @@ importers: specifier: ^3.0.0 version: 3.0.0 three: - specifier: 0.128.0 - version: 0.128.0 + specifier: 0.154.0 + version: 0.154.0 timers-browserify: specifier: ^2.0.12 version: 2.0.12 @@ -360,7 +355,7 @@ importers: version: 4.7.2 three-stdlib: specifier: ^2.26.11 - version: 2.28.5(three@0.128.0) + version: 2.28.5(three@0.154.0) three.meshline: specifier: ^1.3.0 version: 1.4.0 @@ -4899,6 +4894,10 @@ packages: dev: false optional: true + /@tweenjs/tween.js@18.6.4: + resolution: {integrity: sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ==} + dev: true + /@tweenjs/tween.js@20.0.3: resolution: {integrity: sha512-SYUe1UgY5HM05EB4+0B4arq2IPjvyzKXoklXKxSYrc2IFxGm1cBrqg5XbiB5uwbs0xY5j+rj986NAJMM0KZaUw==} dev: false @@ -5239,8 +5238,15 @@ packages: /@types/stats.js@0.17.1: resolution: {integrity: sha512-OgfYE1x2w1jRUXzzKABX+kOdwz2y9PE0uSwnZabkWfJTWOzm7Pvfm4JI2xqRE0q2nwUe2jZLWcrcnhd9lQU63w==} - /@types/three@0.128.0: - resolution: {integrity: sha512-Jwq5XYUkzAcPTo34hlGAQGUyAI0b2F3aCCFWG/v7ZhJBEG5HGcusMSr70GhDlT8Gs0f02QnSPZ2RCA1MrCOa/w==} + /@types/three@0.154.0: + resolution: {integrity: sha512-IioqpGhch6FdLDh4zazRn3rXHj6Vn2nVOziJdXVbJFi9CaI65LtP9qqUtpzbsHK2Ezlox8NtsLNHSw3AQzucjA==} + dependencies: + '@tweenjs/tween.js': 18.6.4 + '@types/stats.js': 0.17.1 + '@types/webxr': 0.5.7 + fflate: 0.6.10 + lil-gui: 0.17.0 + meshoptimizer: 0.18.1 dev: true /@types/three@0.156.0: @@ -5265,7 +5271,6 @@ packages: /@types/webxr@0.5.7: resolution: {integrity: sha512-Rcgs5c2eNFnHp53YOjgtKfl/zWX1Y+uFGUwlSXrWcZWu3yhANRezmph4MninmqybUYT6g9ZE0aQ9QIdPkLR3Kg==} - dev: false /@types/wicg-file-system-access@2023.10.2: resolution: {integrity: sha512-nSiK8qt0O7sQmDcW3HYfvya7GDoD6ipgdcUFzk3QN+UBIqXeNg38Nh6VnKv7EIPfkVETRiquyMskCbpxUzgX1Q==} @@ -8749,7 +8754,6 @@ packages: /fflate@0.6.10: resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} - dev: false /figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} @@ -10458,6 +10462,10 @@ packages: immediate: 3.0.6 dev: false + /lil-gui@0.17.0: + resolution: {integrity: sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==} + dev: true + /lil-gui@0.18.2: resolution: {integrity: sha512-DgdrLy3/KGC0PiQLKgOcJMPItP4xY4iWgJ9+91Zaxfr8GCTmMps05QS9w9jW7yspILlbscbquwjOwxmWnSx5Uw==} dev: false @@ -10852,7 +10860,6 @@ packages: /meshoptimizer@0.18.1: resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==} - dev: false /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} @@ -11967,7 +11974,7 @@ packages: dependencies: nanoid: 3.3.6 picocolors: 1.0.0 - source-map-js: 1.0.2(patch_hash=64rmfibsvq4yinbp7ki2vnrrau) + source-map-js: 1.0.2 /postcss@8.4.35: resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} @@ -11975,7 +11982,7 @@ packages: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2(patch_hash=64rmfibsvq4yinbp7ki2vnrrau) + source-map-js: 1.0.2 dev: true /potpack@1.0.2: @@ -13360,7 +13367,7 @@ packages: dependencies: '@types/three': 0.156.0 skinview-utils: 0.7.1 - three: 0.128.0 + three: 0.154.0 dev: false /slash@3.0.0: @@ -13528,10 +13535,9 @@ packages: dev: false optional: true - /source-map-js@1.0.2(patch_hash=64rmfibsvq4yinbp7ki2vnrrau): + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - patched: true /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -13982,10 +13988,10 @@ packages: any-promise: 1.3.0 dev: false - /three-stdlib@2.28.5(three@0.128.0): + /three-stdlib@2.28.5(three@0.154.0): resolution: {integrity: sha512-JdLMhkpT+1ZWeQPyKQNW1zqUwISI2hsUljS6u3vB9lp5EvwsayaAzGnbVeR35895udOF+zxcTiQY3psk+qqlxg==} peerDependencies: - three: 0.128.0 + three: 0.154.0 dependencies: '@types/draco3d': 1.4.7 '@types/offscreencanvas': 2019.7.2 @@ -13993,15 +13999,15 @@ packages: draco3d: 1.5.6 fflate: 0.6.10 potpack: 1.0.2 - three: 0.128.0 + three: 0.154.0 dev: false /three.meshline@1.4.0: resolution: {integrity: sha512-A8IsiMrWP8zmHisGDAJ76ZD7t/dOF/oCe/FUKNE6Bu01ZYEx8N6IlU/1Plb2aOZtAuWM2A8s8qS3hvY0OFuvOw==} dev: false - /three@0.128.0: - resolution: {integrity: sha512-i0ap/E+OaSfzw7bD1TtYnPo3VEplkl70WX5fZqZnfZsE3k3aSFudqrrC9ldFZfYFkn1zwDmBcdGfiIm/hnbyZA==} + /three@0.154.0: + resolution: {integrity: sha512-Uzz8C/5GesJzv8i+Y2prEMYUwodwZySPcNhuJUdsVMH2Yn4Nm8qlbQe6qRN5fOhg55XB0WiLfTPBxVHxpE60ug==} /throttle-debounce@3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} diff --git a/prismarine-viewer/viewer/lib/entity/Entity.js b/prismarine-viewer/viewer/lib/entity/Entity.js index 645c9135..881ad8c9 100644 --- a/prismarine-viewer/viewer/lib/entity/Entity.js +++ b/prismarine-viewer/viewer/lib/entity/Entity.js @@ -191,7 +191,7 @@ function getMesh (texture, jsonModel, overrides = {}) { geometry.setAttribute('skinWeight', new THREE.Float32BufferAttribute(geoData.skinWeights, 4)) geometry.setIndex(geoData.indices) - const material = new THREE.MeshLambertMaterial({ transparent: true, skinning: true, alphaTest: 0.1 }) + const material = new THREE.MeshLambertMaterial({ transparent: true, alphaTest: 0.1 }) const mesh = new THREE.SkinnedMesh(geometry, material) mesh.add(...rootBones) mesh.bind(skeleton) diff --git a/prismarine-viewer/viewer/lib/viewer.ts b/prismarine-viewer/viewer/lib/viewer.ts index 02888293..f58a7ba3 100644 --- a/prismarine-viewer/viewer/lib/viewer.ts +++ b/prismarine-viewer/viewer/lib/viewer.ts @@ -29,7 +29,12 @@ export class Viewer { renderPass: RenderPass constructor(public renderer: THREE.WebGLRenderer, numWorkers?: number, public enableFXAA = false) { + // https://discourse.threejs.org/t/updates-to-color-management-in-three-js-r152/50791 + THREE.ColorManagement.enabled = false + renderer.outputColorSpace = THREE.LinearSRGBColorSpace + this.scene = new THREE.Scene() + this.scene.matrixAutoUpdate = false // for perf this.resetScene() if (this.enableFXAA) { this.enableFxaaScene() From 0ea67e27d880a144d2e3d5c1862d731335ca4a15 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 2 Mar 2024 22:26:31 +0300 Subject: [PATCH 0043/1195] fix: new proxy --- config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.json b/config.json index 81572913..b7fa1d7e 100644 --- a/config.json +++ b/config.json @@ -1,7 +1,7 @@ { "version": 1, "defaultHost": "", - "defaultProxy": "zardoy.site:2344", + "defaultProxy": "proxy.mcraft.fun", "defaultVersion": "1.18.2", "mapsProvider": "https://maps.mcraft.fun/" } From 7d424578ddc2c959ea7d4b079da827e52cf157d4 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 2 Mar 2024 22:36:56 +0300 Subject: [PATCH 0044/1195] try to fix build --- prismarine-viewer/examples/playground.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prismarine-viewer/examples/playground.ts b/prismarine-viewer/examples/playground.ts index b31c082e..1f2a189a 100644 --- a/prismarine-viewer/examples/playground.ts +++ b/prismarine-viewer/examples/playground.ts @@ -15,7 +15,7 @@ import Entity from '../viewer/lib/entity/Entity' globalThis.THREE = THREE //@ts-ignore -require('three/examples/js/controls/OrbitControls') +//require('three/examples/js/controls/OrbitControls') const gui = new GUI() From 31324a54eaf2f05271e71e72ca5455894e3ed8fc Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 2 Mar 2024 22:55:54 +0300 Subject: [PATCH 0045/1195] ci: Update publish.yml --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3a898779..64fe5154 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,7 +4,7 @@ env: VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} on: push: - branches: [main] + branches: [release] jobs: build-and-deploy: runs-on: ubuntu-latest From 09e3667e46cc6f81c551e36649440029d027f464 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 2 Mar 2024 22:57:38 +0300 Subject: [PATCH 0046/1195] Up orbitcontrols import --- prismarine-viewer/examples/playground.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/prismarine-viewer/examples/playground.ts b/prismarine-viewer/examples/playground.ts index 1f2a189a..a1bd6d0f 100644 --- a/prismarine-viewer/examples/playground.ts +++ b/prismarine-viewer/examples/playground.ts @@ -15,7 +15,7 @@ import Entity from '../viewer/lib/entity/Entity' globalThis.THREE = THREE //@ts-ignore -//require('three/examples/js/controls/OrbitControls') +import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; const gui = new GUI() @@ -291,7 +291,7 @@ async function main () { //@ts-ignore - const controls = new globalThis.THREE.OrbitControls(viewer.camera, renderer.domElement) + const controls = new OrbitControls(viewer.camera, renderer.domElement) controls.target.set(targetPos.x + 0.5, targetPos.y + 0.5, targetPos.z + 0.5) const cameraPos = targetPos.offset(2, 2, 2) From e880b72df459326cf219b8335ac69ecfd3168a54 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 29 Feb 2024 17:30:09 +0300 Subject: [PATCH 0047/1195] fix: display loading text instead of empty list when singleplayer worlds are in process of reading --- src/react/Singleplayer.tsx | 21 +++++++++++++-------- src/react/SingleplayerProvider.tsx | 5 +++-- src/react/singleplayer.module.css | 3 +++ 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/react/Singleplayer.tsx b/src/react/Singleplayer.tsx index b16067a0..c35be9d9 100644 --- a/src/react/Singleplayer.tsx +++ b/src/react/Singleplayer.tsx @@ -55,7 +55,7 @@ const World = ({ name, isFocused, title, lastPlayed, size, detail = '', onFocus, } interface Props { - worldData: WorldProps[] + worldData: WorldProps[] | null // null means loading onWorldAction (action: 'load' | 'export' | 'delete' | 'edit', worldName: string): void onGeneralAction (action: 'cancel' | 'create'): void } @@ -86,14 +86,19 @@ export default ({ worldData, onGeneralAction, onWorldAction }: Props) => { Select Saved World setSearch(value)} />
-
+
{ - worldData.filter(data => data.title.toLowerCase().includes(search.toLowerCase())).map(({ name, title, size, lastPlayed, detail }) => ( - { - if (interaction === 'enter') onWorldAction('load', name) - else if (interaction === 'space') firstButton.current?.focus() - }} detail={detail} /> - )) + worldData + ? worldData.filter(data => data.title.toLowerCase().includes(search.toLowerCase())).map(({ name, title, size, lastPlayed, detail }) => ( + { + if (interaction === 'enter') onWorldAction('load', name) + else if (interaction === 'space') firstButton.current?.focus() + }} detail={detail} /> + )) + :
Loading...
}
diff --git a/src/react/SingleplayerProvider.tsx b/src/react/SingleplayerProvider.tsx index bb9e34da..6d9232f6 100644 --- a/src/react/SingleplayerProvider.tsx +++ b/src/react/SingleplayerProvider.tsx @@ -10,11 +10,12 @@ import Singleplayer, { WorldProps } from './Singleplayer' import { useIsModalActive } from './utils' import { showOptionsModal } from './SelectOption' -const worldsProxy: { value: WorldProps[] } = proxy({ value: [] }) +const worldsProxy = proxy({ value: null as null | WorldProps[] }) export const readWorlds = () => { (async () => { try { + worldsProxy.value = null const worlds = await fs.promises.readdir(`/data/worlds`) worldsProxy.value = (await Promise.allSettled(worlds.map(async (folder) => { const { levelDat } = (await readLevelDat(`/data/worlds/${folder}`))! @@ -55,7 +56,7 @@ export const loadInMemorySave = async (worldPath: string) => { } export default () => { - const worlds = useSnapshot(worldsProxy).value as WorldProps[] + const worlds = useSnapshot(worldsProxy).value as WorldProps[] | null const active = useIsModalActive('singleplayer') useEffect(() => { diff --git a/src/react/singleplayer.module.css b/src/react/singleplayer.module.css index a2bb39e9..44f9f83a 100644 --- a/src/react/singleplayer.module.css +++ b/src/react/singleplayer.module.css @@ -17,6 +17,9 @@ /* todo think of better workaround */ scrollbar-width: var(--thin-if-firefox); } +.content_loading { + padding-top: 20px; +} .world_root { height: 40px; From 8b17b53bd06ca21f72ff3b3d1566928a61b86bee Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 29 Feb 2024 23:13:03 +0300 Subject: [PATCH 0048/1195] fix: remove debugSceneChunksY and instead change format of keys for `debugSceneChunks` to include also Y --- prismarine-viewer/viewer/lib/simpleUtils.ts | 2 +- src/devtools.ts | 6 ++++++ src/index.ts | 10 ---------- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/prismarine-viewer/viewer/lib/simpleUtils.ts b/prismarine-viewer/viewer/lib/simpleUtils.ts index f4899993..4cf2ac0e 100644 --- a/prismarine-viewer/viewer/lib/simpleUtils.ts +++ b/prismarine-viewer/viewer/lib/simpleUtils.ts @@ -19,7 +19,7 @@ export function chunkPos (pos: { x: number, z: number }) { export function sectionPos (pos: { x: number, y: number, z: number }) { const x = Math.floor(pos.x / 16) - const y = Math.floor(pos.z / 16) + const y = Math.floor(pos.y / 16) const z = Math.floor(pos.z / 16) return [x, y, z] } diff --git a/src/devtools.ts b/src/devtools.ts index e49fdcfc..165d4667 100644 --- a/src/devtools.ts +++ b/src/devtools.ts @@ -16,3 +16,9 @@ window.cursorEntity = () => { // wanderer window.inspectPlayer = () => require('fs').promises.readFile('/world/playerdata/9e487d23-2ffc-365a-b1f8-f38203f59233.dat').then(window.nbt.parse).then(console.log) + +Object.defineProperty(window, 'debugSceneChunks', { + get () { + return viewer.world.getLoadedChunksRelative(bot.entity.position, true) + }, +}) diff --git a/src/index.ts b/src/index.ts index 620b5597..431387d0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -134,16 +134,6 @@ if (isFirefox) { // Create viewer const viewer: import('prismarine-viewer/viewer/lib/viewer').Viewer = new Viewer(renderer, options.numWorkers) window.viewer = viewer -Object.defineProperty(window, 'debugSceneChunks', { - get () { - return viewer.world.getLoadedChunksRelative(bot.entity.position) - }, -}) -Object.defineProperty(window, 'debugSceneChunksY', { - get () { - return viewer.world.getLoadedChunksRelative(bot.entity.position, true) - }, -}) viewer.entities.entitiesOptions = { fontFamily: 'mojangles' } From fbffc9bccbe2e37226db15ea2a6f92bcb7a2e90d Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 5 Mar 2024 03:42:04 +0300 Subject: [PATCH 0049/1195] fix(rendering): workaround: fix glass pane rendering issues in tradeoff of disabling their colored textures for now --- prismarine-viewer/viewer/lib/worldrenderer.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/prismarine-viewer/viewer/lib/worldrenderer.ts b/prismarine-viewer/viewer/lib/worldrenderer.ts index 4f16671b..1b67a342 100644 --- a/prismarine-viewer/viewer/lib/worldrenderer.ts +++ b/prismarine-viewer/viewer/lib/worldrenderer.ts @@ -17,7 +17,8 @@ function mod (x, n) { export class WorldRenderer { worldConfig = { minY: 0, worldHeight: 256 } - material = new THREE.MeshLambertMaterial({ vertexColors: true, transparent: true, alphaTest: 0.1 }) + // todo @sa2urami set alphaTest back to 0.1 and instead properly sort transparent and solid objects (needs to be done in worker too) + material = new THREE.MeshLambertMaterial({ vertexColors: true, transparent: true, alphaTest: 0.5 }) blockEntities = {} sectionObjects: Record = {} From 5b497c4ff2bd24dfacb4dd07b1ef6a1a89cc688f Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 5 Mar 2024 03:42:24 +0300 Subject: [PATCH 0050/1195] improve contributing --- CONTRIBUTING.md | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 22958d3f..98017f6b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,32 @@ After forking the repository, run the following commands to get started: 1. Install dependencies: `pnpm i` 2. Start the project in development mode: `pnpm start` -A few notes: +## Project Structure + +- `src` - main app source code +- `src/react` - React components - almost all UI is in this folder. Almost every component has its base (reused in app and storybook) and `Provider` - which is a component that provides context to its children. Consider looking at DeathScreen component to see how it's used. +- `src/menus` - Old Lit Element GUI. In the process of migration to React. + +- `prismarine-viewer` - Improved version of . Here is everything related to rendering the game world itself (no ui at all). Two most important parts here are: +- `prismarine-viewer/viewer/lib/worldrenderer.ts` - adding new objects to three.js happens here (sections) +- `prismarine-viewer/viewer/lib/models.ts` - preparing data for rendering (blocks) - happens in worker: out file - `worker.js`, building - `prismarine-viewer/buildWorker.mjs` +- `prismarine-viewer/examples/playground.ts` - Playground (source of ) Use this for testing render changes. You can also modify playground code. + +How different modules are used: + +- `mineflayer` - provider `bot` variable and as mineflayer states it is a wrapper for the `node-minecraft-protocol` module and is used to connect and interact with real Java Minecraft servers. However not all events & properties are exposed and sometimes you have to use `bot._client.on('packet_name', data => ...)` to handle packets that are not handled via mineflayer API. Also you can use almost any mineflayer plugin. + +## Making protocol changes + +You can get a description of packets for the latest protocol version from and for previous protocol versions from (look for *Page* links that have *Protocol* in URL). + +Also there are [src/generatedClientPackets.ts](src/generatedClientPackets.ts) and [src/generatedServerPackets.ts](src/generatedServerPackets.ts) files that have definitions of packets that come from the server and the client respectively. These files are generated from the protocol files. Protocol, blocks info and other data go from repository. + +### Would be useful to have + +- cleanup folder & modules structure, cleanup playground code + +A few other notes: - Use `next` branch for development and as base & target branch for pull requests if possible. - To link dependency locally e.g. flying-squid add this to `pnpm` > `overrides` of root package.json: `"flying-squid": "file:../space-squid",` (with some modules `pnpm link` also works) @@ -14,4 +39,4 @@ A few notes: - It's recommended to use debugger for debugging. VSCode has a great debugger built-in. If debugger is slow, you can use `--no-sources` flag that would allow browser to speedup .map file parsing. - Some data are cached between restarts. If you see something doesn't work after upgrading dependencies, try to clear the by simply removing the `dist` folder. - The same folder `dist` is used for both development and production builds, so be careful when deploying the project. -- Use `start-prod` script to start the project in production mode after running `build` script to build the project. +- Use `start-prod` script to start the project in production mode after running the `build` script to build the project. From 01c8f8bdb882d9fde9edfdb69277dd9e8972897e Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 5 Mar 2024 03:45:38 +0300 Subject: [PATCH 0051/1195] fix: update mineflayer to support 1.20.4 fixes #80 --- package.json | 4 +-- pnpm-lock.yaml | 75 ++++++++++++++++++++++++++++---------------------- 2 files changed, 44 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 2df3712c..a21c60b3 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "lit": "^2.8.0", "lodash-es": "^4.17.21", "minecraft-assets": "^1.12.2", - "minecraft-data": "3.61.2", + "minecraft-data": "3.62.0", "net-browserify": "github:zardoy/prismarinejs-net-browserify", "node-gzip": "^1.1.2", "peerjs": "^1.5.0", @@ -131,7 +131,7 @@ "diamond-square": "github:zardoy/diamond-square", "prismarine-block": "github:zardoy/prismarine-block#next-era", "prismarine-world": "github:zardoy/prismarine-world#next-era", - "minecraft-data": "3.61.2", + "minecraft-data": "3.62.0", "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", "minecraft-protocol": "github:zardoy/minecraft-protocol#everything", "react": "^18.2.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41f711b7..07ca67ae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ overrides: diamond-square: github:zardoy/diamond-square prismarine-block: github:zardoy/prismarine-block#next-era prismarine-world: github:zardoy/prismarine-world#next-era - minecraft-data: 3.61.2 + minecraft-data: 3.62.0 prismarine-provider-anvil: github:zardoy/prismarine-provider-anvil#everything minecraft-protocol: github:zardoy/minecraft-protocol#everything react: ^18.2.0 @@ -100,8 +100,8 @@ importers: specifier: ^1.12.2 version: 1.12.2 minecraft-data: - specifier: 3.61.2 - version: 3.61.2 + specifier: 3.62.0 + version: 3.62.0 net-browserify: specifier: github:zardoy/prismarinejs-net-browserify version: github.com/zardoy/prismarinejs-net-browserify/7d827dba61bd2f9ac9a6086fe2079a0fccadd070 @@ -250,7 +250,7 @@ importers: version: github.com/zardoy/minecraft-inventory-gui/bf2e7ba3afdc606604d85682d081778281d533cb(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:PrismarineJS/mineflayer - version: github.com/PrismarineJS/mineflayer/b9491ae508dc52e4538dd66eb6f47a639facde20 + version: github.com/PrismarineJS/mineflayer/d77a0511d02fe552170249ec19c2ff3030d17137 mineflayer-pathfinder: specifier: ^2.4.4 version: 2.4.4 @@ -337,7 +337,7 @@ importers: version: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chunk: specifier: ^1.22.0 - version: 1.35.0(minecraft-data@3.61.2) + version: 1.35.0(minecraft-data@3.62.0) prismarine-schematic: specifier: ^1.2.0 version: 1.2.3 @@ -5645,18 +5645,18 @@ packages: exit-hook: 2.2.1 flatmap: 0.0.3 long: 5.2.3 - minecraft-data: 3.61.2 + minecraft-data: 3.62.0 minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f mkdirp: 2.1.6 moment: 2.29.4 needle: 2.9.1 node-gzip: 1.1.2 node-rsa: 1.1.1 - prismarine-chunk: 1.35.0(minecraft-data@3.61.2) + prismarine-chunk: 1.35.0(minecraft-data@3.62.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 - prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.61.2) + prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0) prismarine-windows: 2.8.0 prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 random-seed: 0.3.0 @@ -10931,8 +10931,8 @@ packages: resolution: {integrity: sha512-/eMxh3LNjCXOnU6KnQMjBM8dRnoJNpWIg7mD2m2RthraYiQK2FNzPWIKxWm2j3Ufcf5nzFXupgABledE86r4fQ==} dev: false - /minecraft-data@3.61.2: - resolution: {integrity: sha512-4RsP5rkQx78ZaOKWGeVidc+PjH+DFzNFrQMtSVAgabDOHDWrhSaOlpkxpltHy+vYUyLhglfAkc2g1DUkgHQcTQ==} + /minecraft-data@3.62.0: + resolution: {integrity: sha512-jJXZ/WgyX79tIHlqvfyqG+sJDUekHiA3e9NRUCMGUno4NDrZMcpRI065DnkrI720RHTMb8iadf0NmnBP4Rla5A==} /minecraft-folder-path@1.2.0: resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} @@ -10968,7 +10968,7 @@ packages: /mineflayer-pathfinder@2.4.4: resolution: {integrity: sha512-HAXakZrJRb1UC+5dv8EaDrqjW3ZnBnBk3nkb6x/YWyhHCUKn/E7VU0FO+UN9whuqPlkSaVumEdXJdydE6lSYxQ==} dependencies: - minecraft-data: 3.61.2 + minecraft-data: 3.62.0 prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-entity: 2.3.1 prismarine-item: 1.14.0 @@ -12062,13 +12062,13 @@ packages: - encoding - supports-color - /prismarine-biome@1.3.0(minecraft-data@3.61.2)(prismarine-registry@1.7.0): + /prismarine-biome@1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0): resolution: {integrity: sha512-GY6nZxq93mTErT7jD7jt8YS1aPrOakbJHh39seYsJFXvueIOdHAmW16kYQVrTVMW5MlWLQVxV/EquRwOgr4MnQ==} peerDependencies: - minecraft-data: 3.61.2 + minecraft-data: 3.62.0 prismarine-registry: ^1.1.0 dependencies: - minecraft-data: 3.61.2 + minecraft-data: 3.62.0 prismarine-registry: 1.7.0 /prismarine-chat@1.9.1: @@ -12079,11 +12079,11 @@ packages: prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 - /prismarine-chunk@1.35.0(minecraft-data@3.61.2): + /prismarine-chunk@1.35.0(minecraft-data@3.62.0): resolution: {integrity: sha512-Q1lElMUle7wWxWdQjbZo3j2/dLNG325j90IcbbMmBTnHdQSWIjWFe792XOz3RVBlvrhRJEiZk38S6/eQTQ9esw==} engines: {node: '>=14'} dependencies: - prismarine-biome: 1.3.0(minecraft-data@3.61.2)(prismarine-registry@1.7.0) + prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-nbt: 2.2.1 prismarine-registry: 1.7.0 @@ -12121,7 +12121,7 @@ packages: /prismarine-physics@1.8.0: resolution: {integrity: sha512-gbM+S+bmVtOKVv+Z0WGaHMeEeBHISIDsRDRlv8sr0dex3ZJRhuq8djA02CBreguXtI18ZKh6q3TSj2qDr45NHA==} dependencies: - minecraft-data: 3.61.2 + minecraft-data: 3.62.0 prismarine-nbt: 2.5.0 vec3: 0.1.8 dev: true @@ -12146,13 +12146,13 @@ packages: /prismarine-registry@1.7.0: resolution: {integrity: sha512-yyva0FpWI078nNeMhx8ekVza5uUTYhEv+C+ADu3wUQXiG8qhXkvrf0uzsnhTgZL8BLdsi2axgCEiKw9qSKIuxQ==} dependencies: - minecraft-data: 3.61.2 + minecraft-data: 3.62.0 prismarine-nbt: 2.5.0 /prismarine-schematic@1.2.3: resolution: {integrity: sha512-Mwpn43vEHhm3aw3cPhJjWqztkW+nX+QLajDHlTask8lEOTGl1WmpvFja4iwiws4GIvaC8x0Foptf4uvDsnjrAg==} dependencies: - minecraft-data: 3.61.2 + minecraft-data: 3.62.0 prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-nbt: 2.2.1 prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 @@ -12165,6 +12165,15 @@ packages: prismarine-item: 1.14.0 prismarine-registry: 1.7.0 typed-emitter: 2.1.0 + dev: false + + /prismarine-windows@2.9.0: + resolution: {integrity: sha512-fm4kOLjGFPov7TEJRmXHoiPabxIQrG36r2mDjlNxfkcLfMHFb3/1ML6mp4iRQa7wL0GK4DIAyiBqCWoeWDxARg==} + dependencies: + prismarine-item: 1.14.0 + prismarine-registry: 1.7.0 + typed-emitter: 2.1.0 + dev: true /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -15356,25 +15365,25 @@ packages: react: 18.2.0 dev: false - github.com/PrismarineJS/mineflayer/b9491ae508dc52e4538dd66eb6f47a639facde20: - resolution: {tarball: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/b9491ae508dc52e4538dd66eb6f47a639facde20} + github.com/PrismarineJS/mineflayer/d77a0511d02fe552170249ec19c2ff3030d17137: + resolution: {tarball: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/d77a0511d02fe552170249ec19c2ff3030d17137} name: mineflayer - version: 4.19.0 + version: 4.20.0 engines: {node: '>=18'} dependencies: - minecraft-data: 3.61.2 + minecraft-data: 3.62.0 minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f - prismarine-biome: 1.3.0(minecraft-data@3.61.2)(prismarine-registry@1.7.0) + prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chat: 1.9.1 - prismarine-chunk: 1.35.0(minecraft-data@3.61.2) + prismarine-chunk: 1.35.0(minecraft-data@3.62.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.2.1 prismarine-physics: 1.8.0 prismarine-recipe: 1.3.1(prismarine-registry@1.7.0) prismarine-registry: 1.7.0 - prismarine-windows: 2.8.0 + prismarine-windows: 2.9.0 prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 protodef: 1.15.0 typed-emitter: 1.4.0 @@ -15404,8 +15413,8 @@ packages: name: diamond-square version: 1.3.0 dependencies: - minecraft-data: 3.61.2 - prismarine-chunk: 1.35.0(minecraft-data@3.61.2) + minecraft-data: 3.62.0 + prismarine-chunk: 1.35.0(minecraft-data@3.62.0) random-seed: 0.3.0 vec3: 0.1.8 dev: false @@ -15435,7 +15444,7 @@ packages: endian-toggle: 0.0.0 lodash.get: 4.4.2 lodash.merge: 4.6.2 - minecraft-data: 3.61.2 + minecraft-data: 3.62.0 minecraft-folder-path: 1.2.0 node-fetch: 2.7.0 node-rsa: 0.4.2 @@ -15455,20 +15464,20 @@ packages: name: prismarine-block version: 1.17.1 dependencies: - minecraft-data: 3.61.2 - prismarine-biome: 1.3.0(minecraft-data@3.61.2)(prismarine-registry@1.7.0) + minecraft-data: 3.62.0 + prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) prismarine-chat: 1.9.1 prismarine-item: 1.14.0 prismarine-nbt: 2.2.1 prismarine-registry: 1.7.0 - github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.61.2): + github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0): resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f} id: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f name: prismarine-provider-anvil version: 2.7.0 dependencies: - prismarine-chunk: 1.35.0(minecraft-data@3.61.2) + prismarine-chunk: 1.35.0(minecraft-data@3.62.0) prismarine-nbt: 2.5.0 uint4: 0.1.2 vec3: 0.1.8 From 084565886fbf185ffc008a44568a6820ac4bd92c Mon Sep 17 00:00:00 2001 From: gguio <109200692+gguio@users.noreply.github.com> Date: Tue, 5 Mar 2024 22:39:40 +0400 Subject: [PATCH 0052/1195] feat: add support for titles, subtitle and action bar display! (#73) Co-authored-by: gguio Co-authored-by: Vitaly Turovsky --- patches/mineflayer@4.19.0.patch | 154 ++++++++++++++++++++++++++++++ src/generatedServerPackets.ts | 8 ++ src/globals.d.ts | 3 +- src/index.ts | 2 +- src/react/DeathScreenProvider.tsx | 8 +- src/react/Title.css | 42 ++++++++ src/react/Title.stories.tsx | 31 ++++++ src/react/Title.tsx | 115 ++++++++++++++++++++++ src/react/TitleProvider.tsx | 139 +++++++++++++++++++++++++++ src/reactUi.tsx | 2 + 10 files changed, 495 insertions(+), 9 deletions(-) create mode 100644 patches/mineflayer@4.19.0.patch create mode 100644 src/react/Title.css create mode 100644 src/react/Title.stories.tsx create mode 100644 src/react/Title.tsx create mode 100644 src/react/TitleProvider.tsx diff --git a/patches/mineflayer@4.19.0.patch b/patches/mineflayer@4.19.0.patch new file mode 100644 index 00000000..84f39d94 --- /dev/null +++ b/patches/mineflayer@4.19.0.patch @@ -0,0 +1,154 @@ +diff --git a/.gitignore b/.gitignore +deleted file mode 100644 +index c76d8b46fb163dfd8c42b45c9f8b4193a3d8b2be..0000000000000000000000000000000000000000 +diff --git a/.npmignore b/.npmignore +deleted file mode 100644 +index 0418e13233f31a47d08ef2ac62d478fb7d3afff4..0000000000000000000000000000000000000000 +diff --git a/.npmrc b/.npmrc +deleted file mode 100644 +index 4c1bf7793ac7fd7e34f4601e0afecb345105137b..0000000000000000000000000000000000000000 +diff --git a/examples/anvil_saver/.npmrc b/examples/anvil_saver/.npmrc +deleted file mode 100644 +index 4c1bf7793ac7fd7e34f4601e0afecb345105137b..0000000000000000000000000000000000000000 +diff --git a/examples/pathfinder/.npmrc b/examples/pathfinder/.npmrc +deleted file mode 100644 +index 4c1bf7793ac7fd7e34f4601e0afecb345105137b..0000000000000000000000000000000000000000 +diff --git a/examples/place_end_crystal/.npmrc b/examples/place_end_crystal/.npmrc +deleted file mode 100644 +index 4c1bf7793ac7fd7e34f4601e0afecb345105137b..0000000000000000000000000000000000000000 +diff --git a/examples/screenshot-with-node-canvas-webgl/.npmrc b/examples/screenshot-with-node-canvas-webgl/.npmrc +deleted file mode 100644 +index 4c1bf7793ac7fd7e34f4601e0afecb345105137b..0000000000000000000000000000000000000000 +diff --git a/examples/viewer/.npmrc b/examples/viewer/.npmrc +deleted file mode 100644 +index 4c1bf7793ac7fd7e34f4601e0afecb345105137b..0000000000000000000000000000000000000000 +diff --git a/lib/plugins/title.js b/lib/plugins/title.js +index f8714d7577c9dcfc0a01e143f7990d5ba469e529..ad32303c3d52d61055b6bb1f7a0d2d2961802093 100644 +--- a/lib/plugins/title.js ++++ b/lib/plugins/title.js +@@ -3,7 +3,7 @@ module.exports = inject + function inject (bot) { + bot._client.on('title', (packet) => { + if (packet.action === 0 || packet.action === 1) { +- bot.emit('title', packet.text) ++ bot.emit('title', packet) + } + }) + } +diff --git a/test/common/util.js b/test/common/util.js +deleted file mode 100644 +index 928999312a708fe10530a099f4f003670dc57108..0000000000000000000000000000000000000000 +diff --git a/test/externalTest.js b/test/externalTest.js +deleted file mode 100644 +index 91997f5b554f609c3e00c7b53a7d5b6c64e3891c..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/anvil.js b/test/externalTests/anvil.js +deleted file mode 100644 +index 71f0512723cdbbefb2789f2612468a8427d1a35d..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/bed.js b/test/externalTests/bed.js +deleted file mode 100644 +index 35ecf034b4f7aa4464e50083bac1c353c1b18b34..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/book.js b/test/externalTests/book.js +deleted file mode 100644 +index f22b9e1bf00bf7505041adedfb0ec2a0fef5d803..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/breath.js b/test/externalTests/breath.js +deleted file mode 100644 +index e1abd0942190d7ef03820dab4813b6d6ce7da464..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/chat.js b/test/externalTests/chat.js +deleted file mode 100644 +index 0c26cf02f6afe168b7e6094da2590aaf76415e81..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/commandBlock.js b/test/externalTests/commandBlock.js +deleted file mode 100644 +index c47234dd6244377069a1d94826ff9005f51ce679..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/complete.js b/test/externalTests/complete.js +deleted file mode 100644 +index 8519686f651577cfbde4c36f9391d6fae7b9c586..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/consume.js b/test/externalTests/consume.js +deleted file mode 100644 +index d45ed92fe2c805b7c837e086129ac04d645ff406..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/crafting.js b/test/externalTests/crafting.js +deleted file mode 100644 +index 6bf7fd47ce61ce86366e492f2fe5bbda1494bfd5..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/creative.js b/test/externalTests/creative.js +deleted file mode 100644 +index cb4c5f0e9c8fc4fe53e824ed83a581c64c42513f..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/digAndBuild.js b/test/externalTests/digAndBuild.js +deleted file mode 100644 +index f7b244a5ee756bc7500262bfdf659c1b8fe54ce8..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/digEverything.js b/test/externalTests/digEverything.js +deleted file mode 100644 +index b1bea30eaff8ad9a6a8efcceb4dbb04d147d4226..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/dimensionName.js b/test/externalTests/dimensionName.js +deleted file mode 100644 +index 615cfe6d0913a1fa63bfc4a00751deedf5ae774f..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/displayName.js b/test/externalTests/displayName.js +deleted file mode 100644 +index 0dbf94f8591737df2748b6cc93a5195f660f7e52..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/elytra.js b/test/externalTests/elytra.js +deleted file mode 100644 +index b79cc85b6f15c23aa5d898a3de36dc9876d80161..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/enchanting.js b/test/externalTests/enchanting.js +deleted file mode 100644 +index b319873b2ae71f4a02d7485384ee9223f46c2ddb..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/exampleBee.js b/test/externalTests/exampleBee.js +deleted file mode 100644 +index 6509ff831d358a94d25a3d468f2488c02b9827dc..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/exampleBlockFinder.js b/test/externalTests/exampleBlockFinder.js +deleted file mode 100644 +index 55b95e0b1a348986a306190ca05d5c414b84e1ca..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/exampleDigger.js b/test/externalTests/exampleDigger.js +deleted file mode 100644 +index 6ac4eccf6eccc2cec1787a8c58ff2ee4cdd28614..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/exampleInventory.js b/test/externalTests/exampleInventory.js +deleted file mode 100644 +index 6f4bac01905495cc83d0ff2d2efc05a65c2e48d4..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/fishing.js b/test/externalTests/fishing.js +deleted file mode 100644 +index c0348c77dffe86411ffda75942ef0ba9c2655e67..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/furnace.js b/test/externalTests/furnace.js +deleted file mode 100644 +index 37f32e6857ea5faadcd1b00bf6cb886d7e37f541..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/gamemode.js b/test/externalTests/gamemode.js +deleted file mode 100644 +index d4cc45a041d4b54b5b35126b0f755cd645636520..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/heldItem.js b/test/externalTests/heldItem.js +deleted file mode 100644 +index 51286db0aae5f1647005dcfd73f0929e1af4ee13..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/nether.js b/test/externalTests/nether.js +deleted file mode 100644 +index 84c99fec6cc753d4db3863cfe8fb846134de2788..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/particles.js b/test/externalTests/particles.js +deleted file mode 100644 +index 58fe4c939f1b66162b29d2e4d7281841dd1bbe34..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/placeEntity.js b/test/externalTests/placeEntity.js +deleted file mode 100644 +index 48155e5544b49e4a52eb24904af320c823b125d4..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/plugins/testCommon.js b/test/externalTests/plugins/testCommon.js +deleted file mode 100644 +index 55d4d792b885d366a28b7c9c3beec68301926bad..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/rain.js b/test/externalTests/rain.js +deleted file mode 100644 +index be23c65029c8de7bd5aeb239514d4f9ddd4c9f3a..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/rayTrace.js b/test/externalTests/rayTrace.js +deleted file mode 100644 +index 8d252e3c5289fb98779036a165a31da2c3883b1a..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/scoreboard.js b/test/externalTests/scoreboard.js +deleted file mode 100644 +index cab934d0ad82f86fc5c5e6eb6b3e1746d7c583ab..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/sign.js b/test/externalTests/sign.js +deleted file mode 100644 +index 27c35d24f12798844a23c9906a855001ce2c9f11..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/spawnEvent.js b/test/externalTests/spawnEvent.js +deleted file mode 100644 +index 94d04ce721a8c7ce54da411a73f234d836bab57c..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/team.js b/test/externalTests/team.js +deleted file mode 100644 +index 0eccbf9375acf5dd30d42dc67c95b6003962a3a6..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/trade.js b/test/externalTests/trade.js +deleted file mode 100644 +index 1ad502bc842c9c2a7850b66d8b0a4678bb3cfa21..0000000000000000000000000000000000000000 +diff --git a/test/externalTests/useChests.js b/test/externalTests/useChests.js +deleted file mode 100644 +index 7c0f216b477f406e783d2cb67249b6067f567f0e..0000000000000000000000000000000000000000 +diff --git a/test/internalTest.js b/test/internalTest.js +deleted file mode 100644 +index 25b44e77455afc7e0753fe5e24d72a906f06855d..0000000000000000000000000000000000000000 diff --git a/src/generatedServerPackets.ts b/src/generatedServerPackets.ts index ffc232c5..1c7ffa9e 100644 --- a/src/generatedServerPackets.ts +++ b/src/generatedServerPackets.ts @@ -1493,3 +1493,11 @@ export interface ClientOnMap { yaw: number; }; } + +type ClientOnMcProtocolEvents = ClientOnMap & { + [x: `raw.${string}`]: any + packet: any + state: any +} + +export declare const clientOn: (name: T, callback: (data: ClientOnMcProtocolEvents[T], packetMeta: import('minecraft-protocol').PacketMeta) => void) => void diff --git a/src/globals.d.ts b/src/globals.d.ts index 6affacf7..75c9d0a0 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -4,8 +4,9 @@ declare const THREE: typeof import('three') // todo make optional declare const bot: Omit & { world: import('prismarine-world').world.WorldSync - _client: import('minecraft-protocol').Client & { + _client: Omit & { write: typeof import('./generatedClientPackets').clientWrite + on: typeof import('./generatedServerPackets').clientOn } } declare const __type_bot: typeof bot diff --git a/src/index.ts b/src/index.ts index 431387d0..48f9df89 100644 --- a/src/index.ts +++ b/src/index.ts @@ -546,7 +546,7 @@ async function connect (connectOptions: { const packetBeforePlay = (_, __, ___, fullBuffer) => { lastPacket = fullBuffer.toString() } - bot._client.on('packet', packetBeforePlay) + bot._client.on('packet', packetBeforePlay as any) const playStateSwitch = (newState) => { if (newState === 'play') { bot._client.removeListener('packet', packetBeforePlay) diff --git a/src/react/DeathScreenProvider.tsx b/src/react/DeathScreenProvider.tsx index 90013639..930ed070 100644 --- a/src/react/DeathScreenProvider.tsx +++ b/src/react/DeathScreenProvider.tsx @@ -14,13 +14,7 @@ export default () => { const isModalActive = useIsModalActive('death-screen') useEffect(() => { - type DeathEvent = { - playerId: number - entityId: number - message: string - } - - bot._client.on('death_combat_event', (data: DeathEvent) => { + bot._client.on('death_combat_event', (data) => { try { if (data.playerId !== bot.entity.id) return const messageParsed = JSON.parse(data.message) diff --git a/src/react/Title.css b/src/react/Title.css new file mode 100644 index 00000000..3f078a1d --- /dev/null +++ b/src/react/Title.css @@ -0,0 +1,42 @@ +.title-container { + position: fixed; + inset: 0; + z-index: -1; + pointer-events: none; + white-space: nowrap; +} + +.message-title { + position: fixed; + top: 50%; + left: 0; + transform: translateY(calc(-100% - 5px)); + right: 0; + color: white; + text-align: center; + font-size: 2rem; + margin: 0px; + padding-bottom: 0px; +} + +.message-subtitle { + position: fixed; + top: 50%; + left: 0; + transform: translateY(10px); + right: 0; + text-align: center; + color: white; + font-size: 1rem; + margin: 0px; + padding: 0px; +} + +.action-bar { + position: fixed; + bottom: 20%; + left: 0; + right: 0; + font-size: 0.7rem; + text-align: center; +} diff --git a/src/react/Title.stories.tsx b/src/react/Title.stories.tsx new file mode 100644 index 00000000..dfb88aeb --- /dev/null +++ b/src/react/Title.stories.tsx @@ -0,0 +1,31 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import Title from './Title' + +const meta: Meta = { + component: Title +} + +export default meta +type Story = StoryObj; + +export const Primary: Story = { + args: { + title: { + text: 'New title', + }, + subtitle: { + text: 'Subtitle' + }, + actionBar: { + text: 'Action bar text' + }, + openTitle: false, + openActionBar: false, + transitionTimes: { + fadeIn: 2500, + stay: 17_500, + fadeOut: 5000 + } + } +} diff --git a/src/react/Title.tsx b/src/react/Title.tsx new file mode 100644 index 00000000..bec445f1 --- /dev/null +++ b/src/react/Title.tsx @@ -0,0 +1,115 @@ +import { useState, useEffect } from 'react' +import { Transition } from 'react-transition-group' +import MessageFormattedString from './MessageFormattedString' +import './Title.css' + +export type AnimationTimes = { + fadeIn: number, + stay: number, + fadeOut: number +} + +type TitleProps = { + title: string | Record, + subtitle: string | Record, + actionBar: string | Record, + transitionTimes: AnimationTimes, + openTitle: boolean, + openActionBar: boolean +} + +const Title = ( + { + title, + subtitle, + actionBar, + transitionTimes, + openTitle = false, + openActionBar = false + }: TitleProps +) => { + const [mounted, setMounted] = useState(false) + const [useEnterTransition, setUseEnterTransition] = useState(true) + + const defaultDuration = 500 + const startStyle = { + opacity: 1, + transition: `${transitionTimes.fadeIn}ms ease-in-out all` } + const endExitStyle = { + opacity: 0, + transition: `${transitionTimes.fadeOut}ms ease-in-out all` } + + const stateStyles = { + entering: startStyle, + entered: { opacity: 1 }, + exiting: endExitStyle, + exited: { opacity: 0 }, + } + + useEffect(() => { + if (!mounted && (openTitle || openActionBar)) { + setMounted(true) + } + }, [openTitle, openActionBar]) + + return ( +
+ { + setUseEnterTransition(prev => false) + }} + onExited={() => { + setUseEnterTransition(prev => true) + }} + > + {(state) => { + return ( +
+

+ +

+

+ +

+
+ )}} +
+ { + // setUseEnterTransition(prev => false) + // }} + // onExited={() => { + // setUseEnterTransition(prev => true) + // }} + > + {(state) => { + return ( +
+
+ +
+
+ ) + }} +
+
+ ) +} + +export default Title diff --git a/src/react/TitleProvider.tsx b/src/react/TitleProvider.tsx new file mode 100644 index 00000000..151a93c1 --- /dev/null +++ b/src/react/TitleProvider.tsx @@ -0,0 +1,139 @@ +import { useEffect, useMemo, useState } from 'react' +import type { ClientOnMap } from '../generatedServerPackets' +import Title from './Title' +import type { AnimationTimes } from './Title' + + +const defaultText: Record = { 'text': '' } +const defaultTimings: AnimationTimes = { fadeIn: 400, stay: 3800, fadeOut: 800 } + +const ticksToMs = (ticks: AnimationTimes) => { + ticks.fadeIn *= 50 + ticks.stay *= 50 + ticks.fadeOut *= 50 + return ticks +} + +export default () => { + const [title, setTitle] = useState>(defaultText) + const [subtitle, setSubtitle] = useState>(defaultText) + const [actionBar, setActionBar] = useState>(defaultText) + const [animTimes, setAnimTimes] = useState(defaultTimings) + const [openTitle, setOpenTitle] = useState(false) + const [openActionBar, setOpenActionBar] = useState(false) + + useMemo(() => { + bot._client.on('set_title_text', (packet) => { + setTitle(JSON.parse(packet.text)) + setOpenTitle(true) + }) + bot._client.on('set_title_subtitle', (packet) => { + setSubtitle(JSON.parse(packet.text)) + }) + bot._client.on('action_bar', (packet) => { + setActionBar(JSON.parse(packet.text)) + setOpenActionBar(true) + }) + bot._client.on('set_title_time', (packet) => { + setAnimTimes(ticksToMs(packet)) + }) + bot._client.on('clear_titles', (mes) => { + setOpenTitle(false) + setOpenActionBar(false) + if (mes.reset) { + setTitle(defaultText) + setSubtitle(defaultText) + setActionBar(defaultText) + setAnimTimes(defaultTimings) + } + }) + + + bot.on('actionBar', (packet) => { + setActionBar(packet) + setOpenActionBar(true) + }) + + // before 1.17 + bot._client.on('title', (packet: ClientOnMap['title'] | string) => { + let mes: ClientOnMap['title'] + if (typeof packet === 'string') { + mes = JSON.parse(packet) + } else { + mes = packet + } + switch (mes.action) { + case 0: + setTitle(JSON.parse(mes.text)) + setOpenTitle(true) + break + case 1: + setSubtitle(JSON.parse(mes.text)) + break + case 2: + setActionBar(JSON.parse(mes.text)) + setOpenActionBar(true) + break + case 3: + setAnimTimes(ticksToMs({ fadeIn: mes.fadeIn, stay: mes.stay, fadeOut: mes.fadeOut })) + break + case 4: + setOpenTitle(false) + setOpenActionBar(false) + break + case 5: + setOpenTitle(false) + setOpenActionBar(false) + setTitle(defaultText) + setSubtitle(defaultText) + setActionBar(defaultText) + setAnimTimes(defaultTimings) + break + } + }) + }, []) + + useEffect(() => { + const id = setTimeout(() => { + setOpenTitle(false) + }, animTimes.stay) // only initial stay time is used for title + + return () => { + clearTimeout(id) + } + }, [title, subtitle]) + + useEffect(() => { + let id: any = null + if (!openTitle) { + id = setTimeout(() => { + setSubtitle(defaultText) + }, animTimes.fadeOut) + } + + return () => { + if (id) { + clearTimeout(id) + } + } + }, [openTitle]) + + useEffect(() => { + const id = setTimeout(() => { + setOpenActionBar(false) + }, animTimes.stay) + + return () => { + clearTimeout(id) + } + }, [actionBar]) + + return +} diff --git a/src/reactUi.tsx b/src/reactUi.tsx index e3f630b5..af637853 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -14,6 +14,7 @@ import AppStatusProvider from './react/AppStatusProvider' import SelectOption from './react/SelectOption' import EnterFullscreenButton from './react/EnterFullscreenButton' import ChatProvider from './react/ChatProvider' +import TitleProvider from './react/TitleProvider' import SoundMuffler from './react/SoundMuffler' import TouchControls from './react/TouchControls' import widgets from './react/widgets' @@ -60,6 +61,7 @@ const InGameUi = () => { <DeathScreenProvider /> <ChatProvider /> <SoundMuffler /> + <TitleProvider /> <TouchAreasControlsProvider /> </Portal> <DisplayQr /> From 82bb38ae02b667470eec22406d91e014013afbf0 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky <vital2580@icloud.com> Date: Wed, 6 Mar 2024 05:50:35 +0300 Subject: [PATCH 0053/1195] fix: wasnt possible to select text & click links in chat on mobile --- src/react/Chat.stories.tsx | 5 ++++- src/react/ChatContainer.css | 2 ++ src/react/TouchAreasControls.tsx | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/react/Chat.stories.tsx b/src/react/Chat.stories.tsx index 93585dd8..c568f23b 100644 --- a/src/react/Chat.stories.tsx +++ b/src/react/Chat.stories.tsx @@ -71,7 +71,9 @@ const meta: Meta<typeof Chat> = { } } - return <div> + return <div style={{ + marginTop: args.usingTouch ? 100 : 0 + }}> <div style={{ fontSize: 6, userSelect: 'auto', color: 'gray' }}>Hint: you can capture needed message with <code>bot.on('message', console.log)</code>, copy object, and assign it here to <code>window.spamMessage</code> variable (but ensure the correct frame window is selected in devtools)</div> <Chat {...args} opened={open} messages={messages} onClose={() => setOpen(false)} fetchCompletionItems={async (triggerType, value) => { console.log('fetchCompletionItems') @@ -96,6 +98,7 @@ type Story = StoryObj<typeof Chat> export const Primary: Story = { args: { usingTouch: false, + allowSelection: false, messages: [{ parts: [ { diff --git a/src/react/ChatContainer.css b/src/react/ChatContainer.css index f283b9fc..69da94b0 100644 --- a/src/react/ChatContainer.css +++ b/src/react/ChatContainer.css @@ -97,6 +97,8 @@ div.chat-wrapper { .input-mobile { top: 15px; position: absolute; + /* since input form is blow chat messages we remove clickable container area to allow interact with the messages */ + height: 0; } .input-mobile #chatinput { diff --git a/src/react/TouchAreasControls.tsx b/src/react/TouchAreasControls.tsx index ac5a72ce..70dfe46d 100644 --- a/src/react/TouchAreasControls.tsx +++ b/src/react/TouchAreasControls.tsx @@ -150,7 +150,8 @@ export default ({ touchActive, setupActive, buttonsPositions, closeButtonsSetup useEffect(() => { joystickPointer.joystickInner = joystickInner.current && ref(joystickInner.current) - }, []) + // todo antipattern + }, [touchActive]) if (!touchActive) return null From 084ed7b98774d1dc4ae0d04d9246f5d428ff937e Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky <vital2580@icloud.com> Date: Wed, 6 Mar 2024 05:51:32 +0300 Subject: [PATCH 0054/1195] small title cleanup --- patches/mineflayer@4.19.0.patch | 154 -------------------------------- src/react/Title.stories.tsx | 4 +- 2 files changed, 2 insertions(+), 156 deletions(-) delete mode 100644 patches/mineflayer@4.19.0.patch diff --git a/patches/mineflayer@4.19.0.patch b/patches/mineflayer@4.19.0.patch deleted file mode 100644 index 84f39d94..00000000 --- a/patches/mineflayer@4.19.0.patch +++ /dev/null @@ -1,154 +0,0 @@ -diff --git a/.gitignore b/.gitignore -deleted file mode 100644 -index c76d8b46fb163dfd8c42b45c9f8b4193a3d8b2be..0000000000000000000000000000000000000000 -diff --git a/.npmignore b/.npmignore -deleted file mode 100644 -index 0418e13233f31a47d08ef2ac62d478fb7d3afff4..0000000000000000000000000000000000000000 -diff --git a/.npmrc b/.npmrc -deleted file mode 100644 -index 4c1bf7793ac7fd7e34f4601e0afecb345105137b..0000000000000000000000000000000000000000 -diff --git a/examples/anvil_saver/.npmrc b/examples/anvil_saver/.npmrc -deleted file mode 100644 -index 4c1bf7793ac7fd7e34f4601e0afecb345105137b..0000000000000000000000000000000000000000 -diff --git a/examples/pathfinder/.npmrc b/examples/pathfinder/.npmrc -deleted file mode 100644 -index 4c1bf7793ac7fd7e34f4601e0afecb345105137b..0000000000000000000000000000000000000000 -diff --git a/examples/place_end_crystal/.npmrc b/examples/place_end_crystal/.npmrc -deleted file mode 100644 -index 4c1bf7793ac7fd7e34f4601e0afecb345105137b..0000000000000000000000000000000000000000 -diff --git a/examples/screenshot-with-node-canvas-webgl/.npmrc b/examples/screenshot-with-node-canvas-webgl/.npmrc -deleted file mode 100644 -index 4c1bf7793ac7fd7e34f4601e0afecb345105137b..0000000000000000000000000000000000000000 -diff --git a/examples/viewer/.npmrc b/examples/viewer/.npmrc -deleted file mode 100644 -index 4c1bf7793ac7fd7e34f4601e0afecb345105137b..0000000000000000000000000000000000000000 -diff --git a/lib/plugins/title.js b/lib/plugins/title.js -index f8714d7577c9dcfc0a01e143f7990d5ba469e529..ad32303c3d52d61055b6bb1f7a0d2d2961802093 100644 ---- a/lib/plugins/title.js -+++ b/lib/plugins/title.js -@@ -3,7 +3,7 @@ module.exports = inject - function inject (bot) { - bot._client.on('title', (packet) => { - if (packet.action === 0 || packet.action === 1) { -- bot.emit('title', packet.text) -+ bot.emit('title', packet) - } - }) - } -diff --git a/test/common/util.js b/test/common/util.js -deleted file mode 100644 -index 928999312a708fe10530a099f4f003670dc57108..0000000000000000000000000000000000000000 -diff --git a/test/externalTest.js b/test/externalTest.js -deleted file mode 100644 -index 91997f5b554f609c3e00c7b53a7d5b6c64e3891c..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/anvil.js b/test/externalTests/anvil.js -deleted file mode 100644 -index 71f0512723cdbbefb2789f2612468a8427d1a35d..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/bed.js b/test/externalTests/bed.js -deleted file mode 100644 -index 35ecf034b4f7aa4464e50083bac1c353c1b18b34..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/book.js b/test/externalTests/book.js -deleted file mode 100644 -index f22b9e1bf00bf7505041adedfb0ec2a0fef5d803..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/breath.js b/test/externalTests/breath.js -deleted file mode 100644 -index e1abd0942190d7ef03820dab4813b6d6ce7da464..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/chat.js b/test/externalTests/chat.js -deleted file mode 100644 -index 0c26cf02f6afe168b7e6094da2590aaf76415e81..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/commandBlock.js b/test/externalTests/commandBlock.js -deleted file mode 100644 -index c47234dd6244377069a1d94826ff9005f51ce679..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/complete.js b/test/externalTests/complete.js -deleted file mode 100644 -index 8519686f651577cfbde4c36f9391d6fae7b9c586..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/consume.js b/test/externalTests/consume.js -deleted file mode 100644 -index d45ed92fe2c805b7c837e086129ac04d645ff406..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/crafting.js b/test/externalTests/crafting.js -deleted file mode 100644 -index 6bf7fd47ce61ce86366e492f2fe5bbda1494bfd5..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/creative.js b/test/externalTests/creative.js -deleted file mode 100644 -index cb4c5f0e9c8fc4fe53e824ed83a581c64c42513f..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/digAndBuild.js b/test/externalTests/digAndBuild.js -deleted file mode 100644 -index f7b244a5ee756bc7500262bfdf659c1b8fe54ce8..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/digEverything.js b/test/externalTests/digEverything.js -deleted file mode 100644 -index b1bea30eaff8ad9a6a8efcceb4dbb04d147d4226..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/dimensionName.js b/test/externalTests/dimensionName.js -deleted file mode 100644 -index 615cfe6d0913a1fa63bfc4a00751deedf5ae774f..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/displayName.js b/test/externalTests/displayName.js -deleted file mode 100644 -index 0dbf94f8591737df2748b6cc93a5195f660f7e52..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/elytra.js b/test/externalTests/elytra.js -deleted file mode 100644 -index b79cc85b6f15c23aa5d898a3de36dc9876d80161..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/enchanting.js b/test/externalTests/enchanting.js -deleted file mode 100644 -index b319873b2ae71f4a02d7485384ee9223f46c2ddb..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/exampleBee.js b/test/externalTests/exampleBee.js -deleted file mode 100644 -index 6509ff831d358a94d25a3d468f2488c02b9827dc..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/exampleBlockFinder.js b/test/externalTests/exampleBlockFinder.js -deleted file mode 100644 -index 55b95e0b1a348986a306190ca05d5c414b84e1ca..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/exampleDigger.js b/test/externalTests/exampleDigger.js -deleted file mode 100644 -index 6ac4eccf6eccc2cec1787a8c58ff2ee4cdd28614..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/exampleInventory.js b/test/externalTests/exampleInventory.js -deleted file mode 100644 -index 6f4bac01905495cc83d0ff2d2efc05a65c2e48d4..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/fishing.js b/test/externalTests/fishing.js -deleted file mode 100644 -index c0348c77dffe86411ffda75942ef0ba9c2655e67..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/furnace.js b/test/externalTests/furnace.js -deleted file mode 100644 -index 37f32e6857ea5faadcd1b00bf6cb886d7e37f541..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/gamemode.js b/test/externalTests/gamemode.js -deleted file mode 100644 -index d4cc45a041d4b54b5b35126b0f755cd645636520..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/heldItem.js b/test/externalTests/heldItem.js -deleted file mode 100644 -index 51286db0aae5f1647005dcfd73f0929e1af4ee13..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/nether.js b/test/externalTests/nether.js -deleted file mode 100644 -index 84c99fec6cc753d4db3863cfe8fb846134de2788..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/particles.js b/test/externalTests/particles.js -deleted file mode 100644 -index 58fe4c939f1b66162b29d2e4d7281841dd1bbe34..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/placeEntity.js b/test/externalTests/placeEntity.js -deleted file mode 100644 -index 48155e5544b49e4a52eb24904af320c823b125d4..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/plugins/testCommon.js b/test/externalTests/plugins/testCommon.js -deleted file mode 100644 -index 55d4d792b885d366a28b7c9c3beec68301926bad..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/rain.js b/test/externalTests/rain.js -deleted file mode 100644 -index be23c65029c8de7bd5aeb239514d4f9ddd4c9f3a..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/rayTrace.js b/test/externalTests/rayTrace.js -deleted file mode 100644 -index 8d252e3c5289fb98779036a165a31da2c3883b1a..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/scoreboard.js b/test/externalTests/scoreboard.js -deleted file mode 100644 -index cab934d0ad82f86fc5c5e6eb6b3e1746d7c583ab..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/sign.js b/test/externalTests/sign.js -deleted file mode 100644 -index 27c35d24f12798844a23c9906a855001ce2c9f11..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/spawnEvent.js b/test/externalTests/spawnEvent.js -deleted file mode 100644 -index 94d04ce721a8c7ce54da411a73f234d836bab57c..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/team.js b/test/externalTests/team.js -deleted file mode 100644 -index 0eccbf9375acf5dd30d42dc67c95b6003962a3a6..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/trade.js b/test/externalTests/trade.js -deleted file mode 100644 -index 1ad502bc842c9c2a7850b66d8b0a4678bb3cfa21..0000000000000000000000000000000000000000 -diff --git a/test/externalTests/useChests.js b/test/externalTests/useChests.js -deleted file mode 100644 -index 7c0f216b477f406e783d2cb67249b6067f567f0e..0000000000000000000000000000000000000000 -diff --git a/test/internalTest.js b/test/internalTest.js -deleted file mode 100644 -index 25b44e77455afc7e0753fe5e24d72a906f06855d..0000000000000000000000000000000000000000 diff --git a/src/react/Title.stories.tsx b/src/react/Title.stories.tsx index dfb88aeb..3e7d8fb7 100644 --- a/src/react/Title.stories.tsx +++ b/src/react/Title.stories.tsx @@ -11,6 +11,8 @@ type Story = StoryObj<typeof Title>; export const Primary: Story = { args: { + openTitle: false, + openActionBar: false, title: { text: 'New title', }, @@ -20,8 +22,6 @@ export const Primary: Story = { actionBar: { text: 'Action bar text' }, - openTitle: false, - openActionBar: false, transitionTimes: { fadeIn: 2500, stay: 17_500, From 0b06adbd6a721404b1fed9cd70aec5c26276c8ce Mon Sep 17 00:00:00 2001 From: Vitaly <vital2580@icloud.com> Date: Wed, 6 Mar 2024 01:07:13 +0300 Subject: [PATCH 0055/1195] fix: rare crash in entity velocity tracker which makes you impossible to move --- src/entities.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/entities.ts b/src/entities.ts index 0e000c12..0889c9ed 100644 --- a/src/entities.ts +++ b/src/entities.ts @@ -27,7 +27,8 @@ customEvents.on('gameLoaded', () => { bot.on('physicsTick', () => { for (const [id, { tracking, info }] of Object.entries(bot.tracker.trackingData)) { if (!tracking) continue - const e = bot.entities[id]! + const e = bot.entities[id] + if (!e) continue const speed = info.avgSpeed const WALKING_SPEED = 0.03 const SPRINTING_SPEED = 0.18 From 5659774d3b64f8a01db14d1d78493a99bf2d0593 Mon Sep 17 00:00:00 2001 From: Vitaly <vital2580@icloud.com> Date: Wed, 6 Mar 2024 06:55:44 +0300 Subject: [PATCH 0056/1195] hotfix: display food bar --- src/menus/components/food_bar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/menus/components/food_bar.js b/src/menus/components/food_bar.js index f64413fe..48f783fb 100644 --- a/src/menus/components/food_bar.js +++ b/src/menus/components/food_bar.js @@ -5,7 +5,7 @@ class FoodBar extends LitElement { static get styles () { return css` .foodbar { - position: absolute; + position: fixed; display: flex; flex-direction: row-reverse; left: calc(50% + 91px); From 121e17d2a71148b8c984d448f2197d0275507a82 Mon Sep 17 00:00:00 2001 From: gguio <nikvish150@gmail.com> Date: Wed, 6 Mar 2024 14:44:56 +0400 Subject: [PATCH 0057/1195] Scoreboard component + storybook --- src/react/Scoreboard.css | 26 ++++++++++++++++++++++ src/react/Scoreboard.stories.tsx | 27 +++++++++++++++++++++++ src/react/Scoreboard.tsx | 37 ++++++++++++++++++++++++++++++++ src/react/ScoreboardProvider.tsx | 32 +++++++++++++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 src/react/Scoreboard.css create mode 100644 src/react/Scoreboard.stories.tsx create mode 100644 src/react/Scoreboard.tsx create mode 100644 src/react/ScoreboardProvider.tsx diff --git a/src/react/Scoreboard.css b/src/react/Scoreboard.css new file mode 100644 index 00000000..79ff1659 --- /dev/null +++ b/src/react/Scoreboard.css @@ -0,0 +1,26 @@ +.scoreboard-container { + position: fixed; + right: 0px; + top: 50%; + transform: translateY(-50%); + opacity: 0.7; + background-color: black; + min-width: 100px; + max-width: 400px; + display: flex; + flex-direction: column; + padding-inline: 5px; +} + +.scoreboard-title { + text-align: center; +} + +.item-container { + display: flex; +} + +.item-value { + margin-left: auto; + color: lightcoral; +} diff --git a/src/react/Scoreboard.stories.tsx b/src/react/Scoreboard.stories.tsx new file mode 100644 index 00000000..76d37c17 --- /dev/null +++ b/src/react/Scoreboard.stories.tsx @@ -0,0 +1,27 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import Scoreboard from './Scoreboard' + +const meta: Meta<typeof Scoreboard> = { + component: Scoreboard +} + +export default meta +type Story = StoryObj<typeof Scoreboard>; + +export const Primary: Story = { + args: { + title: 'Scoreboard', + items: [ + { + name: 'item 1', + value: 9 + }, + { + name: 'item 2', + value: 8 + } + ], + open: true + } +} diff --git a/src/react/Scoreboard.tsx b/src/react/Scoreboard.tsx new file mode 100644 index 00000000..3e4b5d3e --- /dev/null +++ b/src/react/Scoreboard.tsx @@ -0,0 +1,37 @@ +import './Scoreboard.css' + + +export type ScoreboardItems = Array<{name: string, value: number}> + +type ScoreboardProps = { + title: string, + items: ScoreboardItems, + open: boolean +} + + +export default function Scoreboard ({ title, items, open }: ScoreboardProps) { + + if (!open) return null + return ( + <div className='scoreboard-container'> + <div className='scoreboard-title'> + {title} + </div> + { + items.map((item, index) => { + return( + <div className='item-container'> + <div className='item-name'> + {item.name} + </div> + <div className='item-value'> + {item.value} + </div> + </div> + ) + }) + } + </div> + ) +} diff --git a/src/react/ScoreboardProvider.tsx b/src/react/ScoreboardProvider.tsx new file mode 100644 index 00000000..455c4669 --- /dev/null +++ b/src/react/ScoreboardProvider.tsx @@ -0,0 +1,32 @@ +import { useEffect, useState } from 'react' +import Scoreboard from './Scoreboard' +import type { ScoreboardItems } from './Scoreboard' + + +const updateScoreboard = () => { + console.log(bot.scoreboard.sidebar) +} + +export default function ScoreboardProvider () { + const [title, setTitle] = useState('Scoreboard') + const [items, setItems] = useState<ScoreboardItems>([]) + const [open, setOpen] = useState(false) + + useEffect(() => { + bot.on('scoreboardCreated', (scoreboard) => { + setOpen(open) + }) + bot.on('scoreUpdated', (scoreboard, item) => { + console.log(scoreboard) + console.log(item) + }) + }, []) + + return( + <Scoreboard + title={title} + items={items} + open={open} + /> + ) +} From 2da256a7c61b2db06a4ebb34a334ce71786d5c02 Mon Sep 17 00:00:00 2001 From: gguio <nikvish150@gmail.com> Date: Wed, 6 Mar 2024 15:31:09 +0400 Subject: [PATCH 0058/1195] Packet handling (not tested) --- src/react/Scoreboard.css | 3 +++ src/react/ScoreboardProvider.tsx | 25 +++++++++++++++++++------ src/reactUi.tsx | 2 ++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/react/Scoreboard.css b/src/react/Scoreboard.css index 79ff1659..41a15958 100644 --- a/src/react/Scoreboard.css +++ b/src/react/Scoreboard.css @@ -1,4 +1,7 @@ .scoreboard-container { + z-index: -1; + pointer-events: none; + white-space: nowrap; position: fixed; right: 0px; top: 50%; diff --git a/src/react/ScoreboardProvider.tsx b/src/react/ScoreboardProvider.tsx index 455c4669..f677058e 100644 --- a/src/react/ScoreboardProvider.tsx +++ b/src/react/ScoreboardProvider.tsx @@ -3,22 +3,35 @@ import Scoreboard from './Scoreboard' import type { ScoreboardItems } from './Scoreboard' -const updateScoreboard = () => { - console.log(bot.scoreboard.sidebar) -} export default function ScoreboardProvider () { + const [name, setName] = useState('') const [title, setTitle] = useState('Scoreboard') const [items, setItems] = useState<ScoreboardItems>([]) const [open, setOpen] = useState(false) + const updateScoreboard = (scoreboard, HandlerFunction) => { + if (scoreboard.name === name) HandlerFunction() + } + useEffect(() => { bot.on('scoreboardCreated', (scoreboard) => { - setOpen(open) + setName(scoreboard.name) + setTitle(scoreboard.title) + setItems(scoreboard.items) + setOpen(true) + }) + bot.on('scoreboardTitleChanged', (scoreboard) => { + updateScoreboard(scoreboard, () => {setTitle(scoreboard.title)}) }) bot.on('scoreUpdated', (scoreboard, item) => { - console.log(scoreboard) - console.log(item) + updateScoreboard(scoreboard, () => {setItems(scoreboard.items)}) + }) + bot.on('scoreRemoved', (scoreboard, item) => { + updateScoreboard(scoreboard, () => {setItems(scoreboard.items)}) + }) + bot.on('scoreboardDeleted', (scoreboard) => { + updateScoreboard(scoreboard, () => {setOpen(false)}) }) }, []) diff --git a/src/reactUi.tsx b/src/reactUi.tsx index af637853..45415578 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -15,6 +15,7 @@ import SelectOption from './react/SelectOption' import EnterFullscreenButton from './react/EnterFullscreenButton' import ChatProvider from './react/ChatProvider' import TitleProvider from './react/TitleProvider' +import ScoreboardProvider from './react/ScoreboardProvider' import SoundMuffler from './react/SoundMuffler' import TouchControls from './react/TouchControls' import widgets from './react/widgets' @@ -62,6 +63,7 @@ const InGameUi = () => { <ChatProvider /> <SoundMuffler /> <TitleProvider /> + <ScoreboardProvider /> <TouchAreasControlsProvider /> </Portal> <DisplayQr /> From 9a11d876ab82263eae9e9996c8fef25392409c3d Mon Sep 17 00:00:00 2001 From: gguio <nikvish150@gmail.com> Date: Wed, 6 Mar 2024 16:20:47 +0400 Subject: [PATCH 0059/1195] Name state in ScoreboardProvider doesnt change --- src/react/Scoreboard.tsx | 2 +- src/react/ScoreboardProvider.tsx | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/react/Scoreboard.tsx b/src/react/Scoreboard.tsx index 3e4b5d3e..37a04027 100644 --- a/src/react/Scoreboard.tsx +++ b/src/react/Scoreboard.tsx @@ -21,7 +21,7 @@ export default function Scoreboard ({ title, items, open }: ScoreboardProps) { { items.map((item, index) => { return( - <div className='item-container'> + <div key={index} className='item-container'> <div className='item-name'> {item.name} </div> diff --git a/src/react/ScoreboardProvider.tsx b/src/react/ScoreboardProvider.tsx index f677058e..74d448cf 100644 --- a/src/react/ScoreboardProvider.tsx +++ b/src/react/ScoreboardProvider.tsx @@ -5,7 +5,7 @@ import type { ScoreboardItems } from './Scoreboard' export default function ScoreboardProvider () { - const [name, setName] = useState('') + const [name, setName] = useState('scoreboard') const [title, setTitle] = useState('Scoreboard') const [items, setItems] = useState<ScoreboardItems>([]) const [open, setOpen] = useState(false) @@ -16,19 +16,25 @@ export default function ScoreboardProvider () { useEffect(() => { bot.on('scoreboardCreated', (scoreboard) => { - setName(scoreboard.name) + console.log(scoreboard) setTitle(scoreboard.title) setItems(scoreboard.items) + setName(scoreboard.name) // name state doesnt change. Why ?? + // to test locally: + // 1. bot._client.emit('scoreboard_objective', {action: 0, name: 'name', displayText: 'test'}) + // 2. bot._client.emit('scoreboard_score', {action: 0, scoreName: 'name', itemName: 'item 1', value: 5}) setOpen(true) }) bot.on('scoreboardTitleChanged', (scoreboard) => { updateScoreboard(scoreboard, () => {setTitle(scoreboard.title)}) }) bot.on('scoreUpdated', (scoreboard, item) => { - updateScoreboard(scoreboard, () => {setItems(scoreboard.items)}) + console.log(name) + console.log(scoreboard.name) + if (scoreboard.name === name) setItems([...items, ...scoreboard.items]) }) bot.on('scoreRemoved', (scoreboard, item) => { - updateScoreboard(scoreboard, () => {setItems(scoreboard.items)}) + if (scoreboard.name === name) setItems([...items, ...scoreboard.items]) }) bot.on('scoreboardDeleted', (scoreboard) => { updateScoreboard(scoreboard, () => {setOpen(false)}) From 4bb5d695c88859a00581db1651ff60483b186320 Mon Sep 17 00:00:00 2001 From: gguio <nikvish150@gmail.com> Date: Thu, 7 Mar 2024 00:52:37 +0400 Subject: [PATCH 0060/1195] Tested on play.minemalia.com --- src/react/Scoreboard.css | 3 +++ src/react/Scoreboard.tsx | 8 ++++---- src/react/ScoreboardProvider.tsx | 23 +++++------------------ 3 files changed, 12 insertions(+), 22 deletions(-) diff --git a/src/react/Scoreboard.css b/src/react/Scoreboard.css index 41a15958..43f0c99e 100644 --- a/src/react/Scoreboard.css +++ b/src/react/Scoreboard.css @@ -13,6 +13,9 @@ display: flex; flex-direction: column; padding-inline: 5px; + font-size: 0.5rem; + max-height: 70%; + overflow: hidden; } .scoreboard-title { diff --git a/src/react/Scoreboard.tsx b/src/react/Scoreboard.tsx index 37a04027..318dec8f 100644 --- a/src/react/Scoreboard.tsx +++ b/src/react/Scoreboard.tsx @@ -1,7 +1,8 @@ import './Scoreboard.css' +import MessageFormattedString from './MessageFormattedString' -export type ScoreboardItems = Array<{name: string, value: number}> +export type ScoreboardItems = Array<{name: string, value: number, displayName?: any}> type ScoreboardProps = { title: string, @@ -9,21 +10,20 @@ type ScoreboardProps = { open: boolean } - export default function Scoreboard ({ title, items, open }: ScoreboardProps) { if (!open) return null return ( <div className='scoreboard-container'> <div className='scoreboard-title'> - {title} + <MessageFormattedString message={title} /> </div> { items.map((item, index) => { return( <div key={index} className='item-container'> <div className='item-name'> - {item.name} + <MessageFormattedString message={item.displayName ?? item.name} /> </div> <div className='item-value'> {item.value} diff --git a/src/react/ScoreboardProvider.tsx b/src/react/ScoreboardProvider.tsx index 74d448cf..8164c411 100644 --- a/src/react/ScoreboardProvider.tsx +++ b/src/react/ScoreboardProvider.tsx @@ -3,41 +3,28 @@ import Scoreboard from './Scoreboard' import type { ScoreboardItems } from './Scoreboard' - export default function ScoreboardProvider () { - const [name, setName] = useState('scoreboard') const [title, setTitle] = useState('Scoreboard') const [items, setItems] = useState<ScoreboardItems>([]) const [open, setOpen] = useState(false) - const updateScoreboard = (scoreboard, HandlerFunction) => { - if (scoreboard.name === name) HandlerFunction() - } - useEffect(() => { bot.on('scoreboardCreated', (scoreboard) => { - console.log(scoreboard) setTitle(scoreboard.title) - setItems(scoreboard.items) - setName(scoreboard.name) // name state doesnt change. Why ?? - // to test locally: - // 1. bot._client.emit('scoreboard_objective', {action: 0, name: 'name', displayText: 'test'}) - // 2. bot._client.emit('scoreboard_score', {action: 0, scoreName: 'name', itemName: 'item 1', value: 5}) + setItems([...scoreboard.items]) setOpen(true) }) bot.on('scoreboardTitleChanged', (scoreboard) => { - updateScoreboard(scoreboard, () => {setTitle(scoreboard.title)}) + setTitle(scoreboard.title) }) bot.on('scoreUpdated', (scoreboard, item) => { - console.log(name) - console.log(scoreboard.name) - if (scoreboard.name === name) setItems([...items, ...scoreboard.items]) + setItems([...items, ...scoreboard.items]) }) bot.on('scoreRemoved', (scoreboard, item) => { - if (scoreboard.name === name) setItems([...items, ...scoreboard.items]) + setItems([...items, ...scoreboard.items]) }) bot.on('scoreboardDeleted', (scoreboard) => { - updateScoreboard(scoreboard, () => {setOpen(false)}) + setOpen(false) }) }, []) From 85b95327a24c6ce72a8d3f6636f1d2225b913c08 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky <vital2580@icloud.com> Date: Thu, 7 Mar 2024 00:56:03 +0300 Subject: [PATCH 0061/1195] fix listeners --- src/react/ScoreboardProvider.tsx | 43 +++++++++++++++++--------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/react/ScoreboardProvider.tsx b/src/react/ScoreboardProvider.tsx index 8164c411..c354513b 100644 --- a/src/react/ScoreboardProvider.tsx +++ b/src/react/ScoreboardProvider.tsx @@ -1,5 +1,5 @@ -import { useEffect, useState } from 'react' -import Scoreboard from './Scoreboard' +import { useMemo, useState } from 'react' +import Scoreboard from './Scoreboard' import type { ScoreboardItems } from './Scoreboard' @@ -8,28 +8,31 @@ export default function ScoreboardProvider () { const [items, setItems] = useState<ScoreboardItems>([]) const [open, setOpen] = useState(false) - useEffect(() => { - bot.on('scoreboardCreated', (scoreboard) => { - setTitle(scoreboard.title) - setItems([...scoreboard.items]) - setOpen(true) - }) - bot.on('scoreboardTitleChanged', (scoreboard) => { - setTitle(scoreboard.title) - }) - bot.on('scoreUpdated', (scoreboard, item) => { - setItems([...items, ...scoreboard.items]) - }) - bot.on('scoreRemoved', (scoreboard, item) => { - setItems([...items, ...scoreboard.items]) - }) - bot.on('scoreboardDeleted', (scoreboard) => { - setOpen(false) + useMemo(() => { // useMemo instead of useEffect to register them asap and not after the initial dom render + const updateSidebarScoreboard = () => { + if (bot.scoreboard.sidebar) { + setTitle(bot.scoreboard.sidebar.title) + setItems([...bot.scoreboard.sidebar.items]) + setOpen(true) + } else { + setOpen(false) + } + } + + bot.on('scoreboardCreated', updateSidebarScoreboard) // not used atm but still good to have + bot.on('scoreboardTitleChanged', updateSidebarScoreboard) + bot.on('scoreUpdated', updateSidebarScoreboard) + bot.on('scoreRemoved', updateSidebarScoreboard) + bot.on('scoreboardDeleted', updateSidebarScoreboard) + bot.on('scoreboardPosition', () => { + void Promise.resolve().then(() => { + updateSidebarScoreboard() + }) // mineflayer bug: wait for the next tick to get the correct scoreboard position }) }, []) return( - <Scoreboard + <Scoreboard title={title} items={items} open={open} From 43438ec78507dea258cbb16e9d2c1ddcae34c92f Mon Sep 17 00:00:00 2001 From: gguio <nikvish150@gmail.com> Date: Thu, 7 Mar 2024 02:06:00 +0400 Subject: [PATCH 0062/1195] full opacity --- src/react/Scoreboard.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/react/Scoreboard.css b/src/react/Scoreboard.css index 43f0c99e..73811e7c 100644 --- a/src/react/Scoreboard.css +++ b/src/react/Scoreboard.css @@ -6,7 +6,6 @@ right: 0px; top: 50%; transform: translateY(-50%); - opacity: 0.7; background-color: black; min-width: 100px; max-width: 400px; From df71afbcd38fdfdb81ba03e3b80231890018be52 Mon Sep 17 00:00:00 2001 From: gguio <nikvish150@gmail.com> Date: Thu, 7 Mar 2024 14:51:45 +0400 Subject: [PATCH 0063/1195] fixed opacity --- src/react/Scoreboard.css | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/react/Scoreboard.css b/src/react/Scoreboard.css index 73811e7c..7abaa8b9 100644 --- a/src/react/Scoreboard.css +++ b/src/react/Scoreboard.css @@ -6,7 +6,7 @@ right: 0px; top: 50%; transform: translateY(-50%); - background-color: black; + background-color: rgba(0, 0, 0, 0.4); min-width: 100px; max-width: 400px; display: flex; @@ -17,6 +17,12 @@ overflow: hidden; } +@media (max-width: 800px) { + .scoreboard-container { + font-size: 0.4rem; + } +} + .scoreboard-title { text-align: center; } From 16997588a5ae9b52d71730a325370bc3698a2d97 Mon Sep 17 00:00:00 2001 From: gguio <nikvish150@gmail.com> Date: Thu, 7 Mar 2024 14:59:12 +0400 Subject: [PATCH 0064/1195] scoreboard below title --- src/react/Scoreboard.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/react/Scoreboard.css b/src/react/Scoreboard.css index 7abaa8b9..b2bb8521 100644 --- a/src/react/Scoreboard.css +++ b/src/react/Scoreboard.css @@ -1,5 +1,5 @@ .scoreboard-container { - z-index: -1; + z-index: -2; pointer-events: none; white-space: nowrap; position: fixed; From 5a426d09ad9213e1c4a51c6218941d1255fa4c03 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky <vital2580@icloud.com> Date: Sat, 9 Mar 2024 21:08:45 +0300 Subject: [PATCH 0065/1195] up inventory gui --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07ca67ae..a7c206ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -247,7 +247,7 @@ importers: version: 1.0.0 minecraft-inventory-gui: specifier: github:zardoy/minecraft-inventory-gui#next - version: github.com/zardoy/minecraft-inventory-gui/bf2e7ba3afdc606604d85682d081778281d533cb(@types/react@18.2.20)(react@18.2.0) + version: github.com/zardoy/minecraft-inventory-gui/9371b804525d2d7f857767898b2bd1d9b7acb093(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:PrismarineJS/mineflayer version: github.com/PrismarineJS/mineflayer/d77a0511d02fe552170249ec19c2ff3030d17137 @@ -15419,9 +15419,9 @@ packages: vec3: 0.1.8 dev: false - github.com/zardoy/minecraft-inventory-gui/bf2e7ba3afdc606604d85682d081778281d533cb(@types/react@18.2.20)(react@18.2.0): - resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/bf2e7ba3afdc606604d85682d081778281d533cb} - id: github.com/zardoy/minecraft-inventory-gui/bf2e7ba3afdc606604d85682d081778281d533cb + github.com/zardoy/minecraft-inventory-gui/9371b804525d2d7f857767898b2bd1d9b7acb093(@types/react@18.2.20)(react@18.2.0): + resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/9371b804525d2d7f857767898b2bd1d9b7acb093} + id: github.com/zardoy/minecraft-inventory-gui/9371b804525d2d7f857767898b2bd1d9b7acb093 name: minecraft-inventory-gui version: 1.0.1 dependencies: From 72070b6ddb1fd6762d6eeaadf3313c80be8dc2ee Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky <vital2580@icloud.com> Date: Mon, 11 Mar 2024 00:09:09 +0300 Subject: [PATCH 0066/1195] try to fix react ui crash --- src/react/MessageFormattedString.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/react/MessageFormattedString.tsx b/src/react/MessageFormattedString.tsx index 11b29e6b..d1f8a10f 100644 --- a/src/react/MessageFormattedString.tsx +++ b/src/react/MessageFormattedString.tsx @@ -4,10 +4,16 @@ import { formatMessage } from '../botUtils' import MessageFormatted from './MessageFormatted' /** like MessageFormatted, but receives raw string or json instead, uses window.loadedData */ -export default ({ message }: { message: string | Record<string, any> }) => { +export default ({ message }: { message: string | Record<string, any> | null }) => { const messageJson = useMemo(() => { - return formatMessage(typeof message === 'string' ? fromFormattedString(message) : message) + if (!message) return null + try { + return formatMessage(typeof message === 'string' ? fromFormattedString(message) : message) + } catch (err) { + console.error(err) // todo ensure its being logged + return null + } }, [message]) - return <MessageFormatted parts={messageJson} /> + return messageJson ? <MessageFormatted parts={messageJson} /> : null } From 848802c689ba757f70878045c1a80cd18c5201d9 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky <vital2580@icloud.com> Date: Mon, 11 Mar 2024 00:28:12 +0300 Subject: [PATCH 0067/1195] up inv --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a7c206ba..91a178d0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -247,7 +247,7 @@ importers: version: 1.0.0 minecraft-inventory-gui: specifier: github:zardoy/minecraft-inventory-gui#next - version: github.com/zardoy/minecraft-inventory-gui/9371b804525d2d7f857767898b2bd1d9b7acb093(@types/react@18.2.20)(react@18.2.0) + version: github.com/zardoy/minecraft-inventory-gui/6685fa4a10590a5decef90a454ba0b9e045e7737(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:PrismarineJS/mineflayer version: github.com/PrismarineJS/mineflayer/d77a0511d02fe552170249ec19c2ff3030d17137 @@ -15419,9 +15419,9 @@ packages: vec3: 0.1.8 dev: false - github.com/zardoy/minecraft-inventory-gui/9371b804525d2d7f857767898b2bd1d9b7acb093(@types/react@18.2.20)(react@18.2.0): - resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/9371b804525d2d7f857767898b2bd1d9b7acb093} - id: github.com/zardoy/minecraft-inventory-gui/9371b804525d2d7f857767898b2bd1d9b7acb093 + github.com/zardoy/minecraft-inventory-gui/6685fa4a10590a5decef90a454ba0b9e045e7737(@types/react@18.2.20)(react@18.2.0): + resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/6685fa4a10590a5decef90a454ba0b9e045e7737} + id: github.com/zardoy/minecraft-inventory-gui/6685fa4a10590a5decef90a454ba0b9e045e7737 name: minecraft-inventory-gui version: 1.0.1 dependencies: From 3f1f65bd5e3fc3bc7df8d5825ecdb6c65f2a7b11 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky <vital2580@icloud.com> Date: Mon, 11 Mar 2024 00:44:18 +0300 Subject: [PATCH 0068/1195] improve performance of too frequent formatted strings (eg chat) --- src/react/ChatContainer.tsx | 3 ++- src/react/Scoreboard.tsx | 23 +++++++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/react/ChatContainer.tsx b/src/react/ChatContainer.tsx index a468313e..8186712a 100644 --- a/src/react/ChatContainer.tsx +++ b/src/react/ChatContainer.tsx @@ -6,6 +6,7 @@ import { miscUiState } from '../globalState' import { MessagePart } from './MessageFormatted' import './ChatContainer.css' import { isIos } from './utils' +import { reactKeyForMessage } from './Scoreboard' export type Message = { parts: MessageFormatPart[], @@ -206,7 +207,7 @@ export default ({ messages, opacity = 1, fetchCompletionItems, opened, sendMessa }}> {opacity && <div ref={chatMessages} className={`chat ${opened ? 'opened' : ''}`} id="chat-messages" style={{ opacity }}> {messages.map((m) => ( - <MessageLine key={m.id} message={m} /> + <MessageLine key={reactKeyForMessage(m)} message={m} /> ))} </div> || undefined} </div> diff --git a/src/react/Scoreboard.tsx b/src/react/Scoreboard.tsx index 318dec8f..546a0f58 100644 --- a/src/react/Scoreboard.tsx +++ b/src/react/Scoreboard.tsx @@ -10,6 +10,10 @@ type ScoreboardProps = { open: boolean } +export const reactKeyForMessage = (message) => { + return typeof message === 'string' ? message : JSON.stringify(message) +} + export default function Scoreboard ({ title, items, open }: ScoreboardProps) { if (!open) return null @@ -19,17 +23,16 @@ export default function Scoreboard ({ title, items, open }: ScoreboardProps) { <MessageFormattedString message={title} /> </div> { - items.map((item, index) => { - return( - <div key={index} className='item-container'> - <div className='item-name'> - <MessageFormattedString message={item.displayName ?? item.name} /> - </div> - <div className='item-value'> - {item.value} - </div> + items.map((item) => { + const message = item.displayName ?? item.name + return <div key={reactKeyForMessage(message) + '_' + item.value} className='item-container'> + <div className='item-name'> + <MessageFormattedString message={message} /> </div> - ) + <div className='item-value'> + {item.value} + </div> + </div> }) } </div> From 45c290f5e493acc818a99c86549c23351d4f2ac7 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky <vital2580@icloud.com> Date: Mon, 11 Mar 2024 02:54:56 +0300 Subject: [PATCH 0069/1195] fix: fix chat completions display on mobile --- src/react/ChatContainer.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/react/ChatContainer.css b/src/react/ChatContainer.css index 69da94b0..41917783 100644 --- a/src/react/ChatContainer.css +++ b/src/react/ChatContainer.css @@ -47,7 +47,8 @@ div.chat-wrapper { .input-mobile .chat-completions { transform: none; top: 100%; - padding-left: 0; + padding-left: calc(env(safe-area-inset-left) / 2); + margin-top: 20px; /* input height */ } From af43339ca94ad00bc1ea98e00cb14baff51e5315 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky <vital2580@icloud.com> Date: Mon, 11 Mar 2024 02:55:10 +0300 Subject: [PATCH 0070/1195] fix: fix chat history navigation on ios --- src/react/ChatContainer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/react/ChatContainer.tsx b/src/react/ChatContainer.tsx index 8186712a..e965a326 100644 --- a/src/react/ChatContainer.tsx +++ b/src/react/ChatContainer.tsx @@ -146,7 +146,7 @@ export default ({ messages, opacity = 1, fetchCompletionItems, opened, sendMessa const auxInputFocus = (fireKey: string) => { chatInput.current.focus() - document.dispatchEvent(new KeyboardEvent('keydown', { code: fireKey })) + chatInput.current.dispatchEvent(new KeyboardEvent('keydown', { code: fireKey, bubbles: true })) } const getDefaultCompleteValue = () => { From f16dbdd61f5b524c892d3da9bfa78f5b18ed13d8 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky <vital2580@icloud.com> Date: Wed, 13 Mar 2024 14:31:41 +0300 Subject: [PATCH 0071/1195] try to fix uncontrolled flying bug --- src/controls.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/controls.ts b/src/controls.ts index 068b16b0..a02f76c4 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -348,6 +348,12 @@ let endFlyLoop: ReturnType<typeof makeInterval> | undefined const currentFlyVector = new Vec3(0, 0, 0) window.currentFlyVector = currentFlyVector +// todo cleanup +const flyingPressedKeys = { + down: false, + up: false +} + const startFlyLoop = () => { if (!isFlying()) return endFlyLoop?.() @@ -378,12 +384,14 @@ const patchedSetControlState = (action, state) => { if (!changeVec) { return originalSetControlState(action, state) } + if (flyingPressedKeys[state === 'jump' ? 'up' : 'down'] === state) return const toAddVec = changeVec.scaled(state ? 1 : -1) for (const coord of ['x', 'y', 'z']) { if (toAddVec[coord] === 0) continue if (currentFlyVector[coord] === toAddVec[coord]) return } currentFlyVector.add(toAddVec) + flyingPressedKeys[state === 'jump' ? 'up' : 'down'] = state } const startFlying = (sendAbilities = true) => { @@ -406,6 +414,11 @@ const endFlying = (sendAbilities = true) => { flags: 0, }) } + Object.assign(flyingPressedKeys, { + up: false, + down: false + }) + currentFlyVector.set(0, 0, 0) bot.physics['airborneAcceleration'] = standardAirborneAcceleration bot.creative.stopFlying() endFlyLoop?.() From c04c9cfdad1ebef435ebe882dbf216f487c7ca84 Mon Sep 17 00:00:00 2001 From: Vitaly <vital2580@icloud.com> Date: Sun, 17 Mar 2024 05:25:21 +0300 Subject: [PATCH 0072/1195] feat: implement Google Drive storage provider (#87) --- package.json | 7 +- pnpm-lock.yaml | 73 ++++++++---- src/browserfs.ts | 29 +++++ src/googledrive.ts | 64 ++++++++++ src/react/CreateWorldProvider.tsx | 3 +- src/react/GoogleButton.css | 106 +++++++++++++++++ src/react/GoogleButton.tsx | 22 ++++ src/react/Input.tsx | 5 +- src/react/Singleplayer.stories.tsx | 7 ++ src/react/Singleplayer.tsx | 64 +++++++--- src/react/SingleplayerProvider.tsx | 183 +++++++++++++++++++++++++---- src/react/Slider.stories.tsx | 2 +- src/react/Tabs.stories.tsx | 23 ++++ src/react/Tabs.tsx | 50 ++++++++ src/topRightStats.ts | 6 +- tsconfig.json | 3 + 16 files changed, 574 insertions(+), 73 deletions(-) create mode 100644 src/googledrive.ts create mode 100644 src/react/GoogleButton.css create mode 100644 src/react/GoogleButton.tsx create mode 100644 src/react/Tabs.stories.tsx create mode 100644 src/react/Tabs.tsx diff --git a/package.json b/package.json index a21c60b3..18077e28 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,8 @@ "@floating-ui/react": "^0.26.1", "@mui/base": "5.0.0-beta.34", "@nxg-org/mineflayer-tracker": "^1.2.1", + "@react-oauth/google": "^0.12.1", + "@types/gapi": "^0.0.47", "@types/react": "^18.2.20", "@types/react-dom": "^18.2.7", "@types/wicg-file-system-access": "^2023.10.2", @@ -47,7 +49,7 @@ "esbuild": "^0.19.3", "esbuild-plugin-polyfill-node": "^0.3.0", "express": "^4.18.2", - "flying-squid": "npm:@zardoy/flying-squid@^0.0.9", + "flying-squid": "npm:@zardoy/flying-squid@^0.0.10", "fs-extra": "^11.1.1", "iconify-icon": "^1.0.8", "jszip": "^3.10.1", @@ -72,7 +74,8 @@ "title-case": "3.x", "ua-parser-js": "^1.0.37", "valtio": "^1.11.1", - "workbox-build": "^7.0.0" + "workbox-build": "^7.0.0", + "google-drive-browserfs": "github:zardoy/browserfs#google-drive" }, "devDependencies": { "@storybook/addon-essentials": "^7.4.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 91a178d0..983ff2b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,6 +30,12 @@ importers: '@nxg-org/mineflayer-tracker': specifier: ^1.2.1 version: 1.2.1 + '@react-oauth/google': + specifier: ^0.12.1 + version: 0.12.1(react-dom@18.2.0)(react@18.2.0) + '@types/gapi': + specifier: ^0.0.47 + version: 0.0.47 '@types/react': specifier: ^18.2.20 version: 18.2.20 @@ -50,7 +56,7 @@ importers: version: 0.0.11 browserfs: specifier: github:zardoy/browserfs#build - version: github.com/zardoy/browserfs/0ff5df5c4e67f54b5f032b87dc650e8b78626bc7 + version: github.com/zardoy/browserfs/e60ca69e74888e057a96a468afe1d62347d3f56f change-case: specifier: ^5.1.2 version: 5.1.2 @@ -79,11 +85,14 @@ importers: specifier: ^4.18.2 version: 4.18.2 flying-squid: - specifier: npm:@zardoy/flying-squid@^0.0.9 - version: /@zardoy/flying-squid@0.0.9 + specifier: npm:@zardoy/flying-squid@^0.0.10 + version: /@zardoy/flying-squid@0.0.10 fs-extra: specifier: ^11.1.1 version: 11.1.1 + google-drive-browserfs: + specifier: github:zardoy/browserfs#google-drive + version: github.com/zardoy/browserfs/6d7a80cbba53d06eee81b8dd3aae6f256699310f iconify-icon: specifier: ^1.0.8 version: 1.0.8 @@ -3295,7 +3304,7 @@ packages: requiresBuild: true dependencies: '@gar/promisify': 1.1.3 - semver: 7.5.4 + semver: 7.6.0 dev: false optional: true @@ -3898,6 +3907,16 @@ packages: '@babel/runtime': 7.22.11 dev: true + /@react-oauth/google@0.12.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qagsy22t+7UdkYAiT5ZhfM4StXi9PPNvw0zuwNmabrWyMKddczMtBIOARflbaIj+wHiQjnMAsZmzsUYuXeyoSg==} + peerDependencies: + react: ^18.2.0 + react-dom: '>=16.8.0' + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@rollup/plugin-babel@5.3.1(@babel/core@7.22.11)(rollup@2.79.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} @@ -5028,6 +5047,10 @@ packages: resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} dev: true + /@types/gapi@0.0.47: + resolution: {integrity: sha512-/ZsLuq6BffMgbKMtZyDZ8vwQvTyKhKQ1G2K6VyWCgtHHhfSSXbk4+4JwImZiTjWNXfI2q1ZStAwFFHSkNoTkHA==} + dev: false + /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: @@ -5411,7 +5434,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.0 ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: @@ -5432,7 +5455,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.0 ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: @@ -5452,7 +5475,7 @@ packages: '@typescript-eslint/types': 6.1.0 '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.2.2) eslint: 8.50.0 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript @@ -5632,8 +5655,8 @@ packages: tslib: 1.14.1 dev: true - /@zardoy/flying-squid@0.0.9: - resolution: {integrity: sha512-Q7xqm+Uu/Y/8jziVM+sazddDw50t3IoQ7y0BTAgLpYaqEsJDvTAoXmHspd9NRFVEs0CM4M/qZxvztCcdJryGIg==} + /@zardoy/flying-squid@0.0.10: + resolution: {integrity: sha512-uMpNRjYWbBAgWUld4pIPOIM3vBtcR4LWuBBBwDALhZDIRU+Iu7kHjbUD0OfBzayYn78qB3T1d6dJj4oRa0M7Jg==} engines: {node: '>=8'} hasBin: true dependencies: @@ -5657,7 +5680,7 @@ packages: prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0) - prismarine-windows: 2.8.0 + prismarine-windows: 2.9.0 prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 random-seed: 0.3.0 range: 0.0.3 @@ -10723,7 +10746,7 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /make-fetch-happen@10.2.1: @@ -11249,7 +11272,7 @@ packages: engines: {node: '>=10'} requiresBuild: true dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: false /node-addon-api@5.1.0: @@ -11314,7 +11337,7 @@ packages: nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.5.4 + semver: 7.6.0 tar: 6.2.0 which: 2.0.2 transitivePeerDependencies: @@ -11392,7 +11415,7 @@ packages: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.0 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-license: 3.0.4 dev: true @@ -12159,21 +12182,12 @@ packages: vec3: 0.1.8 dev: false - /prismarine-windows@2.8.0: - resolution: {integrity: sha512-9HVhJ8tfCeRubYwQzgz8oiHNAebMJ5hDdjm45PZwrOgewaislnR2HDsbPMWiCcyWkYL7J8bVLVoSzEzv5pH98g==} - dependencies: - prismarine-item: 1.14.0 - prismarine-registry: 1.7.0 - typed-emitter: 2.1.0 - dev: false - /prismarine-windows@2.9.0: resolution: {integrity: sha512-fm4kOLjGFPov7TEJRmXHoiPabxIQrG36r2mDjlNxfkcLfMHFb3/1ML6mp4iRQa7wL0GK4DIAyiBqCWoeWDxARg==} dependencies: prismarine-item: 1.14.0 prismarine-registry: 1.7.0 typed-emitter: 2.1.0 - dev: true /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -13360,7 +13374,7 @@ packages: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /sisteransi@1.0.5: @@ -15400,8 +15414,15 @@ packages: engines: {node: '>= 0.6.0'} dev: true - github.com/zardoy/browserfs/0ff5df5c4e67f54b5f032b87dc650e8b78626bc7: - resolution: {tarball: https://codeload.github.com/zardoy/browserfs/tar.gz/0ff5df5c4e67f54b5f032b87dc650e8b78626bc7} + github.com/zardoy/browserfs/6d7a80cbba53d06eee81b8dd3aae6f256699310f: + resolution: {tarball: https://codeload.github.com/zardoy/browserfs/tar.gz/6d7a80cbba53d06eee81b8dd3aae6f256699310f} + name: browserfs + version: 2.0.0 + engines: {node: '>= 18'} + dev: false + + github.com/zardoy/browserfs/e60ca69e74888e057a96a468afe1d62347d3f56f: + resolution: {tarball: https://codeload.github.com/zardoy/browserfs/tar.gz/e60ca69e74888e057a96a468afe1d62347d3f56f} name: browserfs version: 2.0.0-zardoy dependencies: diff --git a/src/browserfs.ts b/src/browserfs.ts index 13c266ac..978f704d 100644 --- a/src/browserfs.ts +++ b/src/browserfs.ts @@ -10,6 +10,7 @@ import { fsState, loadSave } from './loadSave' import { installTexturePack, installTexturePackFromHandle, updateTexturePackInstalledState } from './texturePack' import { miscUiState } from './globalState' import { setLoadingScreenStatus } from './utils' +const { GoogleDriveFileSystem } = require('google-drive-browserfs/src/backends/GoogleDrive') // disable type checking browserfs.install(window) const defaultMountablePoints = { @@ -176,6 +177,34 @@ export const mountExportFolder = async () => { return true } +let googleDriveFileSystem + +/** Only cached! */ +export const googleDriveGetFileIdFromPath = (path: string) => { + return googleDriveFileSystem._getExistingFileId(path) +} + +export const mountGoogleDriveFolder = async (readonly: boolean) => { + googleDriveFileSystem = new GoogleDriveFileSystem() + googleDriveFileSystem.isReadonly = readonly + await new Promise<void>(resolve => { + browserfs.configure({ + fs: 'MountableFileSystem', + options: { + ...defaultMountablePoints, + '/google': googleDriveFileSystem + }, + }, (e) => { + if (e) throw e + resolve() + }) + }) + fsState.isReadonly = readonly + fsState.syncFs = false + fsState.inMemorySave = false + return true +} + export async function removeFileRecursiveAsync (path) { const errors = [] as Array<[string, Error]> try { diff --git a/src/googledrive.ts b/src/googledrive.ts new file mode 100644 index 00000000..3c9c89b0 --- /dev/null +++ b/src/googledrive.ts @@ -0,0 +1,64 @@ +import { GoogleOAuthProvider, useGoogleLogin } from '@react-oauth/google' +import { proxy, ref, subscribe } from 'valtio' +import React from 'react' + +const CLIENT_ID = '137156026346-igv2gkjsj2hlid92rs3q7cjjnc77s132.apps.googleusercontent.com' +// const CLIENT_ID = process.env.GOOGLE_CLIENT_ID +const SCOPES = 'https://www.googleapis.com/auth/drive' + +export const GoogleDriveProvider = ({ children }) => { + return React.createElement(GoogleOAuthProvider, { clientId: CLIENT_ID } as any, children) + // return <GoogleOAuthProvider clientId={CLIENT_ID}><Root /></GoogleOAuthProvider> +} + +export const isGoogleDriveAvailable = () => { + return !!CLIENT_ID +} + +export const useGoogleLogIn = () => { + const login = useGoogleLogin({ + onSuccess (tokenResponse) { + localStorage.hasEverLoggedIn = true + googleProviderData.accessToken = tokenResponse.access_token + googleProviderData.expiresIn = ref(new Date(Date.now() + tokenResponse.expires_in * 1000)) + googleProviderData.hasEverLoggedIn = true + }, + // interested in initial value only + prompt: googleProviderData.hasEverLoggedIn ? 'none' : 'consent', + scope: SCOPES, + flow: 'implicit', + onError (error) { + const accessDenied = error.error === 'access_denied' || error.error === 'invalid_scope' || (error as any).error_subtype === 'access_denied' + if (accessDenied) { + googleProviderData.hasEverLoggedIn = false + } + } + }) + return login +} + +export const googleProviderData = proxy({ + accessToken: (localStorage.saveAccessToken ? localStorage.accessToken : null) as string | null, + hasEverLoggedIn: !!(localStorage.hasEverLoggedIn), + isReady: false, + expiresIn: localStorage.saveAccessToken ? ref(new Date(Date.now() + 1000 * 60 * 60)) : null, + readonlyMode: localStorage.googleReadonlyMode ? localStorage.googleReadonlyMode === 'true' : true, + worldsPath: localStorage.googleWorldsPath || '/worlds/' +}) + +subscribe(googleProviderData, () => { + localStorage.googleReadonlyMode = googleProviderData.readonlyMode + localStorage.googleWorldsPath = googleProviderData.worldsPath + if (googleProviderData.hasEverLoggedIn) { + localStorage.hasEverLoggedIn = true + } else { + delete localStorage.hasEverLoggedIn + } + + if (localStorage.saveAccessToken && googleProviderData) { + // For testing only + localStorage.accessToken = googleProviderData.accessToken || null + } else { + delete localStorage.accessToken + } +}) diff --git a/src/react/CreateWorldProvider.tsx b/src/react/CreateWorldProvider.tsx index 2bf0b321..58208f95 100644 --- a/src/react/CreateWorldProvider.tsx +++ b/src/react/CreateWorldProvider.tsx @@ -4,6 +4,7 @@ import defaultLocalServerOptions from '../defaultLocalServerOptions' import { mkdirRecursive, uniqueFileNameFromWorldName } from '../browserfs' import CreateWorld, { WorldCustomize, creatingWorldState } from './CreateWorld' import { useIsModalActive } from './utils' +import { getWorldsPath } from './SingleplayerProvider' export default () => { const activeCreate = useIsModalActive('create-world') @@ -24,7 +25,7 @@ export default () => { // create new world const { title, type, version } = creatingWorldState // todo display path in ui + disable if exist - const savePath = await uniqueFileNameFromWorldName(title, `/data/worlds`) + const savePath = await uniqueFileNameFromWorldName(title, getWorldsPath()) await mkdirRecursive(savePath) let generation if (type === 'flat') { diff --git a/src/react/GoogleButton.css b/src/react/GoogleButton.css new file mode 100644 index 00000000..e90da816 --- /dev/null +++ b/src/react/GoogleButton.css @@ -0,0 +1,106 @@ +.gsi-material-button { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + -webkit-appearance: none; + background-color: #f2f2f2; + background-image: none; + border: none; + -webkit-border-radius: 20px; + border-radius: 20px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: #1f1f1f; + cursor: pointer; + font-family: 'Roboto', arial, sans-serif; + font-size: 14px; + height: 40px; + letter-spacing: 0.25px; + outline: none; + overflow: hidden; + padding: 0 12px; + position: relative; + text-align: center; + -webkit-transition: background-color .218s, border-color .218s, box-shadow .218s; + transition: background-color .218s, border-color .218s, box-shadow .218s; + vertical-align: middle; + white-space: nowrap; + width: auto; + max-width: 400px; + min-width: min-content; + } + + .gsi-material-button .gsi-material-button-icon { + height: 20px; + margin-right: 12px; + min-width: 20px; + width: 20px; + } + + .gsi-material-button .gsi-material-button-content-wrapper { + -webkit-align-items: center; + align-items: center; + display: flex; + -webkit-flex-direction: row; + flex-direction: row; + -webkit-flex-wrap: nowrap; + flex-wrap: nowrap; + height: 100%; + justify-content: space-between; + position: relative; + width: 100%; + } + + .gsi-material-button .gsi-material-button-contents { + -webkit-flex-grow: 1; + flex-grow: 1; + font-family: 'Roboto', arial, sans-serif; + font-weight: 500; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: top; + } + + .gsi-material-button .gsi-material-button-state { + -webkit-transition: opacity .218s; + transition: opacity .218s; + bottom: 0; + left: 0; + opacity: 0; + position: absolute; + right: 0; + top: 0; + } + + .gsi-material-button:disabled { + cursor: default; + background-color: #ffffff61; + } + + .gsi-material-button:disabled .gsi-material-button-state { + background-color: #1f1f1f1f; + } + + .gsi-material-button:disabled .gsi-material-button-contents { + opacity: 38%; + } + + .gsi-material-button:disabled .gsi-material-button-icon { + opacity: 38%; + } + + .gsi-material-button:not(:disabled):active .gsi-material-button-state, + .gsi-material-button:not(:disabled):focus .gsi-material-button-state { + background-color: #001d35; + opacity: 12%; + } + + .gsi-material-button:not(:disabled):hover { + -webkit-box-shadow: 0 1px 2px 0 rgba(60, 64, 67, .30), 0 1px 3px 1px rgba(60, 64, 67, .15); + box-shadow: 0 1px 2px 0 rgba(60, 64, 67, .30), 0 1px 3px 1px rgba(60, 64, 67, .15); + } + + .gsi-material-button:not(:disabled):hover .gsi-material-button-state { + background-color: #001d35; + opacity: 8%; + } diff --git a/src/react/GoogleButton.tsx b/src/react/GoogleButton.tsx new file mode 100644 index 00000000..4effecb6 --- /dev/null +++ b/src/react/GoogleButton.tsx @@ -0,0 +1,22 @@ +import './GoogleButton.css' + +export default ({ onClick }) => { + return <button className="gsi-material-button" onClick={onClick} style={{ + transform: 'scale(0.55) translate(-20%)', + }}> + <div className="gsi-material-button-state" /> + <div className="gsi-material-button-content-wrapper"> + <div className="gsi-material-button-icon"> + <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"> + <path fill="#EA4335" d="M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z"></path> + <path fill="#4285F4" d="M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z"></path> + <path fill="#FBBC05" d="M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z"></path> + <path fill="#34A853" d="M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z"></path> + <path fill="none" d="M0 0h48v48H0z"></path> + </svg> + </div> + <span className="gsi-material-button-contents">Continue with Google</span> + <span style={{ display: 'none' }}>Continue with Google</span> + </div> + </button> +} diff --git a/src/react/Input.tsx b/src/react/Input.tsx index 0fc8be3a..d2e264cb 100644 --- a/src/react/Input.tsx +++ b/src/react/Input.tsx @@ -3,10 +3,11 @@ import styles from './input.module.css' import { useUsingTouch } from './utils' interface Props extends React.ComponentProps<'input'> { + rootStyles?: React.CSSProperties autoFocus?: boolean } -export default ({ autoFocus, ...inputProps }: Props) => { +export default ({ autoFocus, rootStyles, ...inputProps }: Props) => { const ref = useRef<HTMLInputElement>(null!) const isTouch = useUsingTouch() @@ -15,7 +16,7 @@ export default ({ autoFocus, ...inputProps }: Props) => { ref.current.focus() }, []) - return <div className={styles.container}> + return <div className={styles.container} style={rootStyles}> <input ref={ref} className={styles.input} autoComplete='off' autoCapitalize='off' autoCorrect='off' autoSave='off' spellCheck='false' {...inputProps} /> </div> } diff --git a/src/react/Singleplayer.stories.tsx b/src/react/Singleplayer.stories.tsx index 27b5a61d..83b93b24 100644 --- a/src/react/Singleplayer.stories.tsx +++ b/src/react/Singleplayer.stories.tsx @@ -11,6 +11,13 @@ const meta: Meta<{ open }> = { lastPlayed: Date.now() - 600_000, size: 100_000, }))} + providerActions={{ + local () { }, + }} + providers={{ + local: 'Local', + test: 'Test', + }} onWorldAction={() => { }} onGeneralAction={() => { }} /> diff --git a/src/react/Singleplayer.tsx b/src/react/Singleplayer.tsx index c35be9d9..e806c02b 100644 --- a/src/react/Singleplayer.tsx +++ b/src/react/Singleplayer.tsx @@ -1,5 +1,5 @@ import classNames from 'classnames' -import { useMemo, useRef, useState } from 'react' +import { Fragment, useEffect, useMemo, useRef, useState } from 'react' // todo optimize size import missingWorldPreview from 'minecraft-assets/minecraft-assets/data/1.10/gui/presets/isles.png' @@ -9,6 +9,7 @@ import { focusable } from 'tabbable' import styles from './singleplayer.module.css' import Input from './Input' import Button from './Button' +import Tabs from './Tabs' export interface WorldProps { name: string @@ -20,6 +21,7 @@ export interface WorldProps { detail?: string onInteraction?(interaction: 'enter' | 'space') } + const World = ({ name, isFocused, title, lastPlayed, size, detail = '', onFocus, onInteraction }: WorldProps) => { const timeRelativeFormatted = useMemo(() => { if (!lastPlayed) return @@ -56,11 +58,19 @@ const World = ({ name, isFocused, title, lastPlayed, size, detail = '', onFocus, interface Props { worldData: WorldProps[] | null // null means loading + providers: Record<string, string> + activeProvider?: string + setActiveProvider?: (provider: string) => void + providerActions?: Record<string, (() => void) | undefined | JSX.Element> + disabledProviders?: string[] + isReadonly?: boolean + error?: string + onWorldAction (action: 'load' | 'export' | 'delete' | 'edit', worldName: string): void onGeneralAction (action: 'cancel' | 'create'): void } -export default ({ worldData, onGeneralAction, onWorldAction }: Props) => { +export default ({ worldData, onGeneralAction, onWorldAction, activeProvider, setActiveProvider, providerActions, providers, disabledProviders, error, isReadonly }: Props) => { const containerRef = useRef<any>() const firstButton = useRef<HTMLButtonElement>(null!) @@ -79,6 +89,10 @@ export default ({ worldData, onGeneralAction, onWorldAction }: Props) => { const [search, setSearch] = useState('') const [focusedWorld, setFocusedWorld] = useState('') + useEffect(() => { + setFocusedWorld('') + }, [activeProvider]) + return <div ref={containerRef}> <div className="dirt-bg" /> <div className={classNames('fullscreen', styles.root)}> @@ -87,24 +101,42 @@ export default ({ worldData, onGeneralAction, onWorldAction }: Props) => { <Input autoFocus value={search} onChange={({ target: { value } }) => setSearch(value)} /> </div> <div className={classNames(styles.content, !worldData && styles.content_loading)}> - { - worldData - ? worldData.filter(data => data.title.toLowerCase().includes(search.toLowerCase())).map(({ name, title, size, lastPlayed, detail }) => ( - <World title={title} lastPlayed={lastPlayed} size={size} name={name} onFocus={setFocusedWorld} isFocused={focusedWorld === name} key={name} onInteraction={(interaction) => { - if (interaction === 'enter') onWorldAction('load', name) - else if (interaction === 'space') firstButton.current?.focus() - }} detail={detail} /> - )) - : <div style={{ - fontSize: 10, - color: 'lightgray', - }}>Loading...</div> - } + <Tabs tabs={Object.keys(providers)} disabledTabs={disabledProviders} activeTab={activeProvider ?? ''} labels={providers} onTabChange={(tab) => { + setActiveProvider?.(tab as any) + }} fullSize /> + <div style={{ + marginTop: 3, + }}> + { + providerActions && <div style={{ + display: 'flex', + alignItems: 'center', + // overflow: 'auto', + }}> + <span style={{ fontSize: 9, marginRight: 3 }}>Actions: </span> {Object.entries(providerActions).map(([label, action]) => ( + typeof action === 'function' ? <Button key={label} onClick={action} style={{ width: 100 }}>{label}</Button> : <Fragment key={label}>{action}</Fragment> + ))} + </div> + } + { + worldData + ? worldData.filter(data => data.title.toLowerCase().includes(search.toLowerCase())).map(({ name, title, size, lastPlayed, detail }) => ( + <World title={title} lastPlayed={lastPlayed} size={size} name={name} onFocus={setFocusedWorld} isFocused={focusedWorld === name} key={name} onInteraction={(interaction) => { + if (interaction === 'enter') onWorldAction('load', name) + else if (interaction === 'space') firstButton.current?.focus() + }} detail={detail} /> + )) + : <div style={{ + fontSize: 10, + color: error ? 'red' : 'lightgray', + }}>{error || 'Loading (#dev check console if loading too long)...'}</div> + } + </div> </div> <div style={{ display: 'flex', flexDirection: 'column', minWidth: 400 }}> <div> <Button rootRef={firstButton} disabled={!focusedWorld} onClick={() => onWorldAction('load', focusedWorld)}>LOAD WORLD</Button> - <Button onClick={() => onGeneralAction('create')}>Create New World</Button> + <Button onClick={() => onGeneralAction('create')} disabled={isReadonly}>Create New World</Button> </div> <div> <Button style={{ width: 100 }} disabled={!focusedWorld} onClick={() => onWorldAction('export', focusedWorld)}>Export</Button> diff --git a/src/react/SingleplayerProvider.tsx b/src/react/SingleplayerProvider.tsx index 6d9232f6..6b23d60e 100644 --- a/src/react/SingleplayerProvider.tsx +++ b/src/react/SingleplayerProvider.tsx @@ -1,29 +1,68 @@ import fs from 'fs' -import { proxy, useSnapshot } from 'valtio' -import { useEffect } from 'react' +import { proxy, subscribe, useSnapshot } from 'valtio' +import { useEffect, useRef, useState } from 'react' +import { loadScript } from 'prismarine-viewer/viewer/lib/utils' import { fsState, loadSave, longArrayToNumber, readLevelDat } from '../loadSave' -import { mountExportFolder, removeFileRecursiveAsync } from '../browserfs' +import { googleDriveGetFileIdFromPath, mountExportFolder, mountGoogleDriveFolder, removeFileRecursiveAsync } from '../browserfs' import { hideCurrentModal, showModal } from '../globalState' import { haveDirectoryPicker, setLoadingScreenStatus } from '../utils' import { exportWorld } from '../builtinCommands' +import { googleProviderData, useGoogleLogIn, GoogleDriveProvider, isGoogleDriveAvailable } from '../googledrive' import Singleplayer, { WorldProps } from './Singleplayer' import { useIsModalActive } from './utils' import { showOptionsModal } from './SelectOption' +import Input from './Input' +import GoogleButton from './GoogleButton' -const worldsProxy = proxy({ value: null as null | WorldProps[] }) +const worldsProxy = proxy({ + value: null as null | WorldProps[], + selectedProvider: 'local' as 'local' | 'google', + error: '', +}) -export const readWorlds = () => { +export const getWorldsPath = () => { + return worldsProxy.selectedProvider === 'local' ? `/data/worlds` : worldsProxy.selectedProvider === 'google' ? `/google/${googleProviderData.worldsPath.replace(/\/$/, '')}` : '' +} + +const providersEnableFeatures = { + local: { + calculateSize: true, + delete: true, + export: true, + }, + google: { + calculateSize: false, + // TODO + delete: false, + export: false, + } +} + +export const readWorlds = (abortController: AbortController) => { + if (abortController.signal.aborted) return + worldsProxy.error = ''; (async () => { try { + const loggedIn = !!googleProviderData.accessToken worldsProxy.value = null - const worlds = await fs.promises.readdir(`/data/worlds`) - worldsProxy.value = (await Promise.allSettled(worlds.map(async (folder) => { - const { levelDat } = (await readLevelDat(`/data/worlds/${folder}`))! + if (worldsProxy.selectedProvider === 'google' && !loggedIn) { + worldsProxy.value = [] + return + } + const worldsPath = getWorldsPath() + const provider = worldsProxy.selectedProvider + + const worlds = await fs.promises.readdir(worldsPath) + + const newMappedWorlds = (await Promise.allSettled(worlds.map(async (folder) => { + const { levelDat } = (await readLevelDat(`${worldsPath}/${folder}`))! let size = 0 - // todo use whole dir size - for (const region of await fs.promises.readdir(`/data/worlds/${folder}/region`)) { - const stat = await fs.promises.stat(`/data/worlds/${folder}/region/${region}`) - size += stat.size + if (providersEnableFeatures[provider].calculateSize) { + // todo use whole dir size + for (const region of await fs.promises.readdir(`${worldsPath}/${folder}/region`)) { + const stat = await fs.promises.stat(`${worldsPath}/${folder}/region/${region}`) + size += stat.size + } } const levelName = levelDat.LevelName as string | undefined return { @@ -40,11 +79,18 @@ export const readWorlds = () => { } return true }).map(x => (x as Extract<typeof x, { value }>).value) + if (abortController.signal.aborted) return + worldsProxy.value = newMappedWorlds } catch (err) { + if (err.name === 'AbortError') return console.warn(err) - worldsProxy.value = [] + worldsProxy.value = null + worldsProxy.error = err.message } - })() + })().catch((err) => { + // todo it still doesn't work for some reason! + worldsProxy.error = err.message + }) } export const loadInMemorySave = async (worldPath: string) => { @@ -56,32 +102,125 @@ export const loadInMemorySave = async (worldPath: string) => { } export default () => { - const worlds = useSnapshot(worldsProxy).value as WorldProps[] | null const active = useIsModalActive('singleplayer') - useEffect(() => { - if (!active) return - readWorlds() - }, [active]) - if (!active) return null + return <GoogleDriveProvider> + <Inner /> + </GoogleDriveProvider> +} + +const Inner = () => { + const worlds = useSnapshot(worldsProxy).value as WorldProps[] | null + const { selectedProvider, error } = useSnapshot(worldsProxy) + const readWorldsAbortController = useRef(new AbortController()) + + // 3rd party providers + useEffect(() => { + if (selectedProvider !== 'google') return + void loadScript('https://apis.google.com/js/api.js').then(async (scriptEl) => { + if (!scriptEl) return // already loaded + gapi.load('client', () => { + void gapi.client.load('https://www.googleapis.com/discovery/v1/apis/drive/v3/rest').then(() => { + googleProviderData.isReady = true + }) + }) + }) + }, [selectedProvider]) + + const loggedIn = !!useSnapshot(googleProviderData).accessToken + const googleDriveReadonly = useSnapshot(googleProviderData).readonlyMode + const { worldsPath } = useSnapshot(googleProviderData) + + useEffect(() => { + (async () => { + if (selectedProvider === 'google') { + await mountGoogleDriveFolder(googleProviderData.readonlyMode) + } + if (selectedProvider === 'local' && !(await fs.promises.stat('/data/worlds').catch(() => false))) { + await fs.promises.mkdir('/data/worlds') + } + readWorlds(readWorldsAbortController.current) + })() + + return () => { + readWorldsAbortController.current.abort() + readWorldsAbortController.current = new AbortController() + } + }, [selectedProvider, loggedIn, worldsPath, googleDriveReadonly]) + + const googleLogIn = useGoogleLogIn() + + const isGoogleProviderReady = useSnapshot(googleProviderData).isReady + const providerActions = selectedProvider === 'google' ? isGoogleProviderReady ? loggedIn ? { + 'Log Out' () { + googleProviderData.hasEverLoggedIn = false + googleProviderData.accessToken = null + // TODO revoke token + }, + async [`Read Only: ${googleDriveReadonly ? 'ON' : 'OFF'}`] () { + if (googleProviderData.readonlyMode) { + const choice = await showOptionsModal('[Unstable Feature] Enabling world save might corrupt your worlds, eg remove entities (note: you can always restore previous version of files in Drive)', ['Continue']) + if (choice !== 'Continue') return + } + googleProviderData.readonlyMode = !googleProviderData.readonlyMode + }, + 'Worlds Path': <Input rootStyles={{ width: 100 }} placeholder='Worlds path' defaultValue={worldsPath} onBlur={(e) => { + googleProviderData.worldsPath = e.target.value + }} /> + } : { + 'Log In': <GoogleButton onClick={googleLogIn} /> + } : { + 'Loading...' () { } + } : undefined + // end + return <Singleplayer + error={error} + isReadonly={selectedProvider === 'google' && (googleDriveReadonly || !isGoogleProviderReady)} + providers={{ + local: 'Local', + google: 'Google Drive', + }} + disabledProviders={[...isGoogleDriveAvailable() ? [] : ['google']]} worldData={worlds} + providerActions={providerActions} + activeProvider={selectedProvider} + setActiveProvider={(provider) => { + worldsProxy.selectedProvider = provider as any + }} onWorldAction={async (action, worldName) => { - const worldPath = `/data/worlds/${worldName}` + const worldPath = `${getWorldsPath()}/${worldName}` + const openInGoogleDrive = () => { + const fileId = googleDriveGetFileIdFromPath(worldPath.replace('/google/', '')) + if (!fileId) return alert('File not found') + window.open(`https://drive.google.com/drive/folders/${fileId}`) + } + if (action === 'load') { + setLoadingScreenStatus(`Starting loading world ${worldName}`) await loadInMemorySave(worldPath) return } if (action === 'delete') { + if (selectedProvider === 'google') { + openInGoogleDrive() + return + } + if (!confirm('Are you sure you want to delete current world')) return setLoadingScreenStatus(`Removing world ${worldName}`) await removeFileRecursiveAsync(worldPath) setLoadingScreenStatus(undefined) - readWorlds() + readWorlds(readWorldsAbortController.current) } if (action === 'export') { + if (selectedProvider === 'google') { + openInGoogleDrive() + return + } + const selectedVariant = haveDirectoryPicker() ? await showOptionsModal('Select export type', ['Select folder (recommended)', 'Download ZIP file']) diff --git a/src/react/Slider.stories.tsx b/src/react/Slider.stories.tsx index 5ad55fca..6b52d7be 100644 --- a/src/react/Slider.stories.tsx +++ b/src/react/Slider.stories.tsx @@ -5,7 +5,7 @@ import Slider from './Slider' const meta: Meta<typeof Slider> = { component: Slider, args: { - label: 'hapiness', + label: 'happiness', value: 0, updateValue (value) { console.log('updateValue', value) diff --git a/src/react/Tabs.stories.tsx b/src/react/Tabs.stories.tsx new file mode 100644 index 00000000..3b3b8565 --- /dev/null +++ b/src/react/Tabs.stories.tsx @@ -0,0 +1,23 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import Tabs from './Tabs' + +const meta: Meta<typeof Tabs> = { + component: Tabs, + args: { + tabs: [ + 'Tab 1', + 'Tab 2', + ], + activeTab: 'Tab 1', + }, +} + +export default meta +type Story = StoryObj<typeof Tabs>; + +export const Primary: Story = { + args: { + fullSize: true, + }, +} diff --git a/src/react/Tabs.tsx b/src/react/Tabs.tsx new file mode 100644 index 00000000..4e750a8a --- /dev/null +++ b/src/react/Tabs.tsx @@ -0,0 +1,50 @@ +import Button from './Button' + +interface Props { + tabs: string[] + activeTab: string + onTabChange: (tab: string) => void + + disabledTabs?: string[] + labels?: Record<string, string> + fullSize?: boolean + style?: React.CSSProperties +} + +export default ({ tabs, activeTab, labels, onTabChange, fullSize, style, disabledTabs }: Props) => { + return <div style={{ + width: fullSize ? '100%' : undefined, + display: fullSize ? 'flex' : undefined, + ...style, + }}> + {tabs.map(tab => { + const active = tab === activeTab + return <div key={tab} style={{ + position: 'relative', + width: fullSize ? '100%' : 150, + }}> + <Button disabled={active || disabledTabs?.includes(tab)} style={{ + width: '100%', + height: '100%', + // background: active ? 'rgb(77, 77, 77)' : 'rgb(114, 114, 114)', + color: 'white', + cursor: 'pointer', + fontSize: 9, + padding: '2px 0px', + }} onClick={() => { + onTabChange(tab) + }}>{labels?.[tab] ?? tab}</Button> + {active && <div style={{ + position: 'absolute', + bottom: 0, + left: 0, + right: 0, + height: 1, + background: 'white', + width: '50%', + margin: 'auto', + }} />} + </div> + })} + </div> +} diff --git a/src/topRightStats.ts b/src/topRightStats.ts index e1d3f62a..a105ac6b 100644 --- a/src/topRightStats.ts +++ b/src/topRightStats.ts @@ -46,9 +46,9 @@ if (hideStats) { export const initWithRenderer = (canvas) => { if (hideStats) return statsGl.init(canvas) - if (statsGl.gpuPanel && process.env.NODE_ENV !== 'production') { - addStatsGlStat(statsGl.gpuPanel.canvas) - } + // if (statsGl.gpuPanel && process.env.NODE_ENV !== 'production') { + // addStatsGlStat(statsGl.gpuPanel.canvas) + // } // addStatsGlStat(statsGl.msPanel.canvas) statsGl.container.style.display = 'flex' statsGl.container.style.justifyContent = 'flex-end' diff --git a/tsconfig.json b/tsconfig.json index fce887b3..47a363c3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -24,5 +24,8 @@ "src", "cypress", "prismarine-viewer/viewer" + ], + "exclude": [ + "node_modules", ] } From 0ac4177a65b404fdff1d98b26c54dc13363badd3 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky <vital2580@icloud.com> Date: Sun, 17 Mar 2024 05:53:58 +0300 Subject: [PATCH 0073/1195] add privacy policy for google --- src/react/MainMenu.tsx | 8 +++++++- src/react/mainMenu.module.css | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/react/MainMenu.tsx b/src/react/MainMenu.tsx index 5d240b01..5d42daa0 100644 --- a/src/react/MainMenu.tsx +++ b/src/react/MainMenu.tsx @@ -130,7 +130,13 @@ export default ({ connectToServerAction, mapsProvider, singleplayerAction, optio > Prismarine Web Client {versionStatus} </span> - <span className={styles['product-description']}>A Minecraft client in the browser!</span> + <span className={styles['product-description']}> + <a style={{ + color: 'lightgray', + fontSize: 9, + }} href='https://privacy.mcraft.fun'>Privacy Policy</a> + <span>A Minecraft client in the browser!</span> + </span> </div> {mapsProvider && diff --git a/src/react/mainMenu.module.css b/src/react/mainMenu.module.css index 939cf794..5b84431b 100644 --- a/src/react/mainMenu.module.css +++ b/src/react/mainMenu.module.css @@ -82,6 +82,7 @@ display: flex; flex-direction: row; justify-content: space-between; + align-items: flex-end; position: absolute; bottom: -1px; left: 1px; @@ -96,6 +97,10 @@ } .product-description { + display: flex; + flex-direction: column; + gap: 3; + align-items: flex-end; padding-right: calc(env(safe-area-inset-right) / 2); } From 826fed54d9d5883b40cd2bec7d764dc2ee0c5e0e Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky <vital2580@icloud.com> Date: Mon, 18 Mar 2024 05:21:46 +0300 Subject: [PATCH 0074/1195] fix: rewrite google drive integration by using native picker (safer for user) fix: allow to switch accounts in google provider (fix sign out) feat: add google drive ui integration (open with context menu) --- pnpm-lock.yaml | 14 ++-- src/browserfs.ts | 3 +- src/googledrive.ts | 58 ++++++++++++++-- src/index.ts | 2 + src/react/SingleplayerProvider.tsx | 104 ++++++++++++++++++++++++----- src/react/utils.ts | 5 +- 6 files changed, 153 insertions(+), 33 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 983ff2b1..d61b5d64 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -92,7 +92,7 @@ importers: version: 11.1.1 google-drive-browserfs: specifier: github:zardoy/browserfs#google-drive - version: github.com/zardoy/browserfs/6d7a80cbba53d06eee81b8dd3aae6f256699310f + version: github.com/zardoy/browserfs/ab58ae8ef00e3a31db01909e365e6cb5188436e0 iconify-icon: specifier: ^1.0.8 version: 1.0.8 @@ -259,7 +259,7 @@ importers: version: github.com/zardoy/minecraft-inventory-gui/6685fa4a10590a5decef90a454ba0b9e045e7737(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:PrismarineJS/mineflayer - version: github.com/PrismarineJS/mineflayer/d77a0511d02fe552170249ec19c2ff3030d17137 + version: github.com/PrismarineJS/mineflayer/195b3cbd70a110080af9b77a4659991c5d9e484a mineflayer-pathfinder: specifier: ^2.4.4 version: 2.4.4 @@ -15379,8 +15379,8 @@ packages: react: 18.2.0 dev: false - github.com/PrismarineJS/mineflayer/d77a0511d02fe552170249ec19c2ff3030d17137: - resolution: {tarball: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/d77a0511d02fe552170249ec19c2ff3030d17137} + github.com/PrismarineJS/mineflayer/195b3cbd70a110080af9b77a4659991c5d9e484a: + resolution: {tarball: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/195b3cbd70a110080af9b77a4659991c5d9e484a} name: mineflayer version: 4.20.0 engines: {node: '>=18'} @@ -15393,7 +15393,7 @@ packages: prismarine-chunk: 1.35.0(minecraft-data@3.62.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 - prismarine-nbt: 2.2.1 + prismarine-nbt: 2.5.0 prismarine-physics: 1.8.0 prismarine-recipe: 1.3.1(prismarine-registry@1.7.0) prismarine-registry: 1.7.0 @@ -15414,8 +15414,8 @@ packages: engines: {node: '>= 0.6.0'} dev: true - github.com/zardoy/browserfs/6d7a80cbba53d06eee81b8dd3aae6f256699310f: - resolution: {tarball: https://codeload.github.com/zardoy/browserfs/tar.gz/6d7a80cbba53d06eee81b8dd3aae6f256699310f} + github.com/zardoy/browserfs/ab58ae8ef00e3a31db01909e365e6cb5188436e0: + resolution: {tarball: https://codeload.github.com/zardoy/browserfs/tar.gz/ab58ae8ef00e3a31db01909e365e6cb5188436e0} name: browserfs version: 2.0.0 engines: {node: '>= 18'} diff --git a/src/browserfs.ts b/src/browserfs.ts index 978f704d..d9670b14 100644 --- a/src/browserfs.ts +++ b/src/browserfs.ts @@ -184,8 +184,9 @@ export const googleDriveGetFileIdFromPath = (path: string) => { return googleDriveFileSystem._getExistingFileId(path) } -export const mountGoogleDriveFolder = async (readonly: boolean) => { +export const mountGoogleDriveFolder = async (readonly: boolean, rootId: string) => { googleDriveFileSystem = new GoogleDriveFileSystem() + googleDriveFileSystem.rootDirId = rootId googleDriveFileSystem.isReadonly = readonly await new Promise<void>(resolve => { browserfs.configure({ diff --git a/src/googledrive.ts b/src/googledrive.ts index 3c9c89b0..2128ae2f 100644 --- a/src/googledrive.ts +++ b/src/googledrive.ts @@ -1,10 +1,16 @@ import { GoogleOAuthProvider, useGoogleLogin } from '@react-oauth/google' import { proxy, ref, subscribe } from 'valtio' import React from 'react' +import { loadScript } from 'prismarine-viewer/viewer/lib/utils' +import { loadGoogleDriveApi, loadInMemorySave } from './react/SingleplayerProvider' +import { setLoadingScreenStatus } from './utils' +import { mountGoogleDriveFolder } from './browserfs' +import { showOptionsModal } from './react/SelectOption' const CLIENT_ID = '137156026346-igv2gkjsj2hlid92rs3q7cjjnc77s132.apps.googleusercontent.com' // const CLIENT_ID = process.env.GOOGLE_CLIENT_ID -const SCOPES = 'https://www.googleapis.com/auth/drive' +const SCOPES = 'https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/drive.install' +export const APP_ID = CLIENT_ID.split('-')[0] export const GoogleDriveProvider = ({ children }) => { return React.createElement(GoogleOAuthProvider, { clientId: CLIENT_ID } as any, children) @@ -23,8 +29,7 @@ export const useGoogleLogIn = () => { googleProviderData.expiresIn = ref(new Date(Date.now() + tokenResponse.expires_in * 1000)) googleProviderData.hasEverLoggedIn = true }, - // interested in initial value only - prompt: googleProviderData.hasEverLoggedIn ? 'none' : 'consent', + // prompt: hasEverLoggedIn ? 'none' : 'consent', scope: SCOPES, flow: 'implicit', onError (error) { @@ -34,7 +39,45 @@ export const useGoogleLogIn = () => { } } }) - return login + return () => login({ + prompt: googleProviderData.hasEverLoggedIn ? 'none' : 'consent' + }) +} + +export const possiblyHandleStateVariable = async () => { + const stateParam = new URLSearchParams(window.location.search).get('state') + if (!stateParam) return + setLoadingScreenStatus('Opening world in read only mode, waiting for login...') + await loadGoogleDriveApi() + await loadScript('https://accounts.google.com/gsi/client') + const parsed = JSON.parse(stateParam) as { + ids: [string] + action: 'open' + userId: string + } + const tokenClient = window.google.accounts.oauth2.initTokenClient({ + client_id: CLIENT_ID, + scope: SCOPES, + async callback (response) { + if (response.error) { + setLoadingScreenStatus('Error: ' + response.error, true) + googleProviderData.hasEverLoggedIn = false + return + } + setLoadingScreenStatus('Opening world in read only mode...') + googleProviderData.accessToken = response.access_token + await mountGoogleDriveFolder(true, parsed.ids[0]) + await loadInMemorySave('/google') + } + }) + const choice = await showOptionsModal('Select an action...', ['Login']) + if (choice === 'Login') { + tokenClient.requestAccessToken({ + prompt: googleProviderData.hasEverLoggedIn ? '' : 'consent', + }) + } else { + window.close() + } } export const googleProviderData = proxy({ @@ -43,12 +86,15 @@ export const googleProviderData = proxy({ isReady: false, expiresIn: localStorage.saveAccessToken ? ref(new Date(Date.now() + 1000 * 60 * 60)) : null, readonlyMode: localStorage.googleReadonlyMode ? localStorage.googleReadonlyMode === 'true' : true, - worldsPath: localStorage.googleWorldsPath || '/worlds/' + lastSelectedFolder: (localStorage.lastSelectedFolder ? JSON.parse(localStorage.lastSelectedFolder) : null) as { + id: string + name: string + } | null }) subscribe(googleProviderData, () => { localStorage.googleReadonlyMode = googleProviderData.readonlyMode - localStorage.googleWorldsPath = googleProviderData.worldsPath + localStorage.lastSelectedFolder = googleProviderData.lastSelectedFolder ? JSON.stringify(googleProviderData.lastSelectedFolder) : null if (googleProviderData.hasEverLoggedIn) { localStorage.hasEverLoggedIn = true } else { diff --git a/src/index.ts b/src/index.ts index 48f9df89..a0ed33f9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -886,3 +886,5 @@ if (initialLoader) { initialLoader.style.opacity = '0' window.pageLoaded = true } + +void possiblyHandleStateVariable() diff --git a/src/react/SingleplayerProvider.tsx b/src/react/SingleplayerProvider.tsx index 6b23d60e..8a081663 100644 --- a/src/react/SingleplayerProvider.tsx +++ b/src/react/SingleplayerProvider.tsx @@ -7,7 +7,7 @@ import { googleDriveGetFileIdFromPath, mountExportFolder, mountGoogleDriveFolder import { hideCurrentModal, showModal } from '../globalState' import { haveDirectoryPicker, setLoadingScreenStatus } from '../utils' import { exportWorld } from '../builtinCommands' -import { googleProviderData, useGoogleLogIn, GoogleDriveProvider, isGoogleDriveAvailable } from '../googledrive' +import { googleProviderData, useGoogleLogIn, GoogleDriveProvider, isGoogleDriveAvailable, APP_ID } from '../googledrive' import Singleplayer, { WorldProps } from './Singleplayer' import { useIsModalActive } from './utils' import { showOptionsModal } from './SelectOption' @@ -21,7 +21,7 @@ const worldsProxy = proxy({ }) export const getWorldsPath = () => { - return worldsProxy.selectedProvider === 'local' ? `/data/worlds` : worldsProxy.selectedProvider === 'google' ? `/google/${googleProviderData.worldsPath.replace(/\/$/, '')}` : '' + return worldsProxy.selectedProvider === 'local' ? `/data/worlds` : worldsProxy.selectedProvider === 'google' ? `/google/${'/'.replace(/\/$/, '')}` : '' } const providersEnableFeatures = { @@ -111,32 +111,62 @@ export default () => { </GoogleDriveProvider> } +export const loadGoogleDriveApi = async () => { + const scriptEl = await loadScript('https://apis.google.com/js/api.js') + if (!scriptEl) return // already loaded + return new Promise<void>((resolve) => { + gapi.load('client', () => { + gapi.load('client:picker', () => { + void gapi.client.load('https://www.googleapis.com/discovery/v1/apis/drive/v3/rest').then(() => { + googleProviderData.isReady = true + resolve() + }) + }) + }) + }) +} + const Inner = () => { const worlds = useSnapshot(worldsProxy).value as WorldProps[] | null const { selectedProvider, error } = useSnapshot(worldsProxy) const readWorldsAbortController = useRef(new AbortController()) + useEffect(() => { + return () => { + worldsProxy.selectedProvider = 'local' + } + }, []) + // 3rd party providers useEffect(() => { if (selectedProvider !== 'google') return - void loadScript('https://apis.google.com/js/api.js').then(async (scriptEl) => { - if (!scriptEl) return // already loaded - gapi.load('client', () => { - void gapi.client.load('https://www.googleapis.com/discovery/v1/apis/drive/v3/rest').then(() => { - googleProviderData.isReady = true - }) - }) - }) + void loadGoogleDriveApi() }, [selectedProvider]) + const [selectedGoogleId, setSelectedGoogleId] = useState('') const loggedIn = !!useSnapshot(googleProviderData).accessToken const googleDriveReadonly = useSnapshot(googleProviderData).readonlyMode - const { worldsPath } = useSnapshot(googleProviderData) useEffect(() => { (async () => { if (selectedProvider === 'google') { - await mountGoogleDriveFolder(googleProviderData.readonlyMode) + if (!selectedGoogleId) { + worldsProxy.value = [] + return + } + await mountGoogleDriveFolder(googleProviderData.readonlyMode, selectedGoogleId) + const exists = async (path) => { + try { + await fs.promises.stat(path) + return true + } catch { + return false + } + } + if (await exists(`${getWorldsPath()}/level.dat`)) { + await loadInMemorySave(getWorldsPath()) + return + } } if (selectedProvider === 'local' && !(await fs.promises.stat('/data/worlds').catch(() => false))) { await fs.promises.mkdir('/data/worlds') @@ -148,7 +178,7 @@ const Inner = () => { readWorldsAbortController.current.abort() readWorldsAbortController.current = new AbortController() } - }, [selectedProvider, loggedIn, worldsPath, googleDriveReadonly]) + }, [selectedProvider, loggedIn, googleDriveReadonly, selectedGoogleId]) const googleLogIn = useGoogleLogIn() @@ -157,7 +187,8 @@ const Inner = () => { 'Log Out' () { googleProviderData.hasEverLoggedIn = false googleProviderData.accessToken = null - // TODO revoke token + googleProviderData.lastSelectedFolder = null + window.google.accounts.oauth2.revoke(googleProviderData.accessToken) }, async [`Read Only: ${googleDriveReadonly ? 'ON' : 'OFF'}`] () { if (googleProviderData.readonlyMode) { @@ -166,9 +197,9 @@ const Inner = () => { } googleProviderData.readonlyMode = !googleProviderData.readonlyMode }, - 'Worlds Path': <Input rootStyles={{ width: 100 }} placeholder='Worlds path' defaultValue={worldsPath} onBlur={(e) => { - googleProviderData.worldsPath = e.target.value - }} /> + // 'Worlds Path': <Input rootStyles={{ width: 100 }} placeholder='Worlds path' defaultValue={worldsPath} onBlur={(e) => { + // googleProviderData.worldsPath = e.target.value + // }} /> } : { 'Log In': <GoogleButton onClick={googleLogIn} /> } : { @@ -176,6 +207,45 @@ const Inner = () => { } : undefined // end + useEffect(() => { + let picker + if (loggedIn && selectedProvider === 'google' && isGoogleProviderReady) { + const { google } = window + + const view = new google.picker.DocsView(google.picker.ViewId.FOLDERS) + .setIncludeFolders(true) + .setMimeTypes('application/vnd.google-apps.folder') + .setSelectFolderEnabled(true) + .setParent('root') + + + picker = new google.picker.PickerBuilder() + .enableFeature(google.picker.Feature.NAV_HIDDEN) + .enableFeature(google.picker.Feature.MULTISELECT_ENABLED) + .setDeveloperKey('AIzaSyBTiHpEqaLL7mEcrsnSS4M-z8cpRH5UwY0') + .setAppId(APP_ID) + .setOAuthToken(googleProviderData.accessToken) + .addView(view) + .addView(new google.picker.DocsUploadView()) + .setTitle('Select a folder with your worlds') + .setCallback((data) => { + if (data.action === google.picker.Action.PICKED) { + googleProviderData.lastSelectedFolder = { + id: data.docs[0].id, + name: data.docs[0].name, + } + setSelectedGoogleId(data.docs[0].id) + } + }) + .build() + picker.setVisible(true) + } + + return () => { + if (picker) picker.dispose() + } + }, [selectedProvider, loggedIn]) + return <Singleplayer error={error} isReadonly={selectedProvider === 'google' && (googleDriveReadonly || !isGoogleProviderReady)} diff --git a/src/react/utils.ts b/src/react/utils.ts index e4b30422..900b279f 100644 --- a/src/react/utils.ts +++ b/src/react/utils.ts @@ -3,8 +3,9 @@ import { useEffect, useRef } from 'react' import { UAParser } from 'ua-parser-js' import { activeModalStack, miscUiState } from '../globalState' -export const useIsModalActive = (modal: string) => { - return useSnapshot(activeModalStack).at(-1)?.reactType === modal +export const useIsModalActive = (modal: string, useIncludes = false) => { + const allStack = useSnapshot(activeModalStack) + return useIncludes ? allStack.some(x => x.reactType === modal) : allStack.at(-1)?.reactType === modal } export const useIsWidgetActive = (name: string) => { From 4d4732d15d35ddd57b60c81fdee92afc218b5c6e Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky <vital2580@icloud.com> Date: Mon, 18 Mar 2024 05:22:07 +0300 Subject: [PATCH 0075/1195] fix: fix critical ui crash in 1.8.8 for chat --- src/react/MessageFormatted.tsx | 38 +++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/react/MessageFormatted.tsx b/src/react/MessageFormatted.tsx index c83c70f6..cc1a089c 100644 --- a/src/react/MessageFormatted.tsx +++ b/src/react/MessageFormatted.tsx @@ -1,24 +1,34 @@ import { ComponentProps } from 'react' import { render } from '@xmcl/text-component' import { noCase } from 'change-case' +import mojangson from 'mojangson' import { MessageFormatPart } from '../botUtils' import { openURL } from '../menus/components/common' import { chatInputValueGlobal } from './ChatContainer' const hoverItemToText = (hoverEvent: MessageFormatPart['hoverEvent']) => { - if (!hoverEvent) return undefined - const contents = hoverEvent['contents'] ?? hoverEvent.value - if (typeof contents === 'string') return contents - // if (hoverEvent.action === 'show_text') { - // return contents - // } - if (hoverEvent.action === 'show_item') { - return contents.id - } - if (hoverEvent.action === 'show_entity') { - let str = noCase(contents.type.replace('minecraft:', '')) - if (contents.name) str += `: ${contents.name.text}` - return str + try { + if (!hoverEvent) return undefined + const contents = hoverEvent['contents'] ?? hoverEvent.value + if (typeof contents.text === 'string' && contents.text.startsWith('{')) { + Object.assign(contents, mojangson.simplify(mojangson.parse(contents.text))) + } + if (typeof contents === 'string') return contents + // if (hoverEvent.action === 'show_text') { + // return contents + // } + if (hoverEvent.action === 'show_item') { + return contents.id + } + if (hoverEvent.action === 'show_entity') { + let str = noCase(contents.type.replace('minecraft:', '')) + if (contents.name) str += `: ${contents.name.text}` + return str + } + } catch (err) { + // todo report critical error + console.error('Failed to parse message hover', err) + return undefined } } @@ -45,7 +55,7 @@ const clickEventToProps = (clickEvent: MessageFormatPart['clickEvent']) => { if (clickEvent.action === 'copy_to_clipboard') { return { onClick () { - navigator.clipboard.writeText(clickEvent.value) + void navigator.clipboard.writeText(clickEvent.value) } } } From cff438921d2deda417a9a7c957e8a08bba03d791 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky <vital2580@icloud.com> Date: Mon, 18 Mar 2024 05:40:51 +0300 Subject: [PATCH 0076/1195] feat: update favicon --- assets/favicon.ico | Bin 3902 -> 0 bytes assets/favicon.png | Bin 22967 -> 526230 bytes assets/favicon.svg | 1 - index.html | 9 +++++++-- src/index.ts | 1 + 5 files changed, 8 insertions(+), 3 deletions(-) delete mode 100644 assets/favicon.ico delete mode 100644 assets/favicon.svg diff --git a/assets/favicon.ico b/assets/favicon.ico deleted file mode 100644 index 27f48c13add5e5bf93921eff48f96a3b76af19bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3902 zcmc&%>2Fk36d(Tq{pL3k5|hsIrtQoWB0)`vG%D@Pbf%@9eLB;bcDhX0DP5o&Ws$YC z#S&0<5Fv^}+=94;=m(7&{ium7Hl;vo0|K(t@bjGenDS<v8K;rNX>Q+p_uY4X_x#T9 zoO`cI^#uJbSg4}^3sst@RH~;{DwT%X0&2^saX<eCo>Zxx$&;JtpnsUhZ}RFmj=sGU zq2`xh@#qn5c^St}j^XOm#5}BIH*|XDDo%c|A9d{(m|Z#)xilztX;I|V!0eXL&{2ZZ zA0Nid^{MO(W*Bwz)^&XJ>2X9mZNk2-G8gr0UPPc}sd#ob=EC2a3yW8tL-XpDIQ!+h zxPAL(2CJ!G-JiXOZ+`d!U4xav535f?q-z=0@2bGan?W=X?h1znRh@b094$c8MkBn< zxiEXwg7cn@A$<SSSD5{4HZ?#}@A$;87}?W<(twHh(;(Qo6a%AW*l{Ev@C0Vh@&ruA z?HDdVbiEO-20d|*gYv4y7~8iN6O)&c5FS0=y>|y^K7U8(Vud3I&PV~ewpcK9$S<&l zj|RYvF{8c9QAB=*y7Gme9V3KEjj`Kz6d=-PKxs%v^HL)cE5>K%PUGJFyN|%=?%MQa z?AW~;R&OqtN4B|nuR8%N8_f2h0)$uRqivfBty@j-w-MiNHEh0o?A+Ur>6t46cl`2s zbgv80oO0l<Ta3P8yYMHDk$jc?EKKPq`^qu)k*-#ezwC4US_8_$vd?QaRAGGLJYFOG z6;3rmvFFqJro?5;#@>gR-HF_G5Vy^njBwQIMQlAyxu_d3pmmE0uBcvcy=(s<>N~6` zAwJhV)TGjWs{4$X<R{y&h)8JJY(m4J0gPMQZxC}RCZ1z`PPik_p)8n>O>ej;ezHzd zVa5CY6_es9V;T_~G9l7yKn3~TxWR}LzZO+Zg(4@)!$xf0=gAnyY%yb`A4i>DaJsTu zB2DU0TBQ@1cDg#kON3S{s!iCk-}_iFS5cmZD9*BWB%x#WF}B@AT9RP*8%fJLk&9ao zJRVHeF5|Lp1MPW2$Bf4sF0YY9o#I;UtX+g{2YgxiIeLt1f<m`D<$4gW3(6~F`P*b% z#^g8`^BUpQ!o`>eGh?!Lcue<Ji{OR7<9Tx~usu=#$VVk++~>HT6%nqB@_NLzARQ)S zZ6_?QgWl+~A{JbSEncly&&+P^oMtj&EBq`bT*hR(ac%OIv4##;qG!kkf76mVEUu&8 zRtZ(zdU54vj*r<xF{;;#oaA_NeNg(G7*AbF%)zm8QJbt@NvzRq+ZU5i-K$5<0JVPk z%Fn(w(j(;oV_Up5CtBB<Uo|FTQm%6D*!>2fqj)^oH_p?>zCzdod176*1+>DSuo8>$ zl#S-V?>#LNcs$3<7SPRUmSfE^<$3cOXRoCCSW`gx=@C4-h-d!B>LYD6N(ik{_@%^2 zbx+tl-Wk=+#hZ20u+AXX8hcO&PwfkE)hvb0Ph+XZm-zI=j|Sxt9fDm_qA#g1GV}#H zCE`-%n`;r*UEae~x4uIADl_?|7Ce?zYDH|S`;xfJU^{{1q;YJA`L<G>W$t(l?;P}r zeF)z(mpr#fTpvl_XR@8?9ozG_bN!L?^3aK4T>R}9T3=jZ%`U6f{%1~;@!5~k5cx=4 z_G}E#?S&_<T*9W2HlbmQR}FU))#jdgXeXHy)-iqWib`TH$a|B~*LyMb`((nN=+8U1 z@cx;j2sZMbE{F0>D>#{NY<WEAu`MXaPu_!_`o|tj34Y<y&)7EBA#$k5MSDilF!Phl zS*mBD)f%qhIanE7^l-0vQE5KyJ?{&@{`M2J_q#>S<Gr$@o^qV(T`H^~^*ib)FKF*! zp|eEy`T)NB@f>Dn@2AB`_u|GMGjt9)f?APJT-VibHptk_A?Gm9#Z3KtcBx-w#fN9# z!p&PZ(wWS<{~DdUj=#4XHEl&yGq}cRL>)7WbBa#%pE$J#Q`3nW$r>Qdzy}W=&^h1& f4jvyOofQg=^O^84<=e#MMezG<fAMqZ|8@NvI<6>) diff --git a/assets/favicon.png b/assets/favicon.png index 0b46a03263713ccb0df3231f28c542761d0569c0..af7135883f1a74d082d6dd223f3d8598633b71f7 100644 GIT binary patch literal 526230 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%0DjZdLOIUw7%X~d8S?)Y8J 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�E<9fzp`zJC)$*C_k2SUwiswt2UlFxC7k4<^ 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 9*^r)zDZvYiYJs=SyY2vbT~4Z`uF# zhwps&=FvLAcCM_CN;Gp<msm?(186fkM;unIpaEutDPtQrr?}AIhtHpX`Hj=3KRCU2 z>B{@(XZPK7<enQ>Ze7Dp*9|!Zju8lb<H<peLBVhYLID6+EpYIGTW-1GhL!b;FFgJ1 z<l^Z(IX<q+86ctXP^uAP0ULIjcDiX{TrMq*%E9H0i%=pbx3m~EVT242z}d5+AMMpk z&%F->32yG<uC!3Ad}2)n2o^!S5X7B9a3=I%U-SWXVf0JCrv0L8^8^S)*9_)yO}{}f zFu@GF<RTIPU<J%TAX?bF?wb7Ux_mM~An!@dF6>0s7ycz0_o7UJM1(k8TAsBt^A@2% zy-dZJY^n7eL6df#+IERYfK4au!?*3Z`>wmb@%U{=)(88>hyXM(IZ;p$Q@FIf9f#wx zEEU+!U0`l0oJ*J&czX-K^URxXoIdwE&%L+58vc1-`SRCqiAx!46vl#Vwlke|r4%u4 z?{w?qqGS|^q%Gj0$!&9}#c$rea^J0={ln)r{>LA_@ap?7(|FI}{Ws2%Y;RB8Y;Dg0 zXtQ(qqP4oRzNekEAodKWU}8{$iEC@_!X3<D0j_WdbTNJ0nGED45QZ=X5PKY|1iR`b zfG7xp=nw+u!Rks8X*!!(((%$tDA>A7McTl8>)76vuRZqQ*B&}_ti;vJw>c<f@r{<E zq}TzIjA@hVA-CRb6LvUk1Mew*^xDN|Uwd<F+K8&wE0=k&0jMJYVb7taYrg&V*&n}t z;<I-i{}Z2m@X;IVfFfDiBXz6uZno{tQVwD)1aP24B`^gTx=gaVf|bu5x&O8!-+um` z*H2yf@X7|2%ZhSyYnHQ>gB1X&Y3Gv;X~GohwXt@Eb~D6CUbBm-fLlm}C781bIlGBN zh@w*f7fyj=pjdEZ53GU=utCW=ii}2eQ3hdcXF8o%f^k7h&<F3o;mZ%*dH-?Q4^%+( zZO%C-DXT#c>Db$xI+%pQr8v1Ut=EP*;5_i`hyL8DkKVqtabemHR`)Ang*4+T13(UL zPOJz3WkA&_d*MYxA!Lu>0v;WrAXA55k0q|-dIE4Azcz4!`NA^B+?@c1_W=QAA_91E zbO8ofI3&<w9utQk1=KbhkE5Ia(;uGr&U2@~_Q?HTyZ`9%C9DK2tykx|X0?a{w6jSe z#d56S*t&RSZSUIDX3(uYvEDl<ZhK_?vxgsk`%?E`f9JWkFP*uP2i2ZKK-jsoft^_~ zTH(!|WhuBUa>4T&$=Il!yXk~rf<#ChQ(z6E;(*q!Yyu+kAjE-4%tNmBF3)niHE(55 z%V=yNCL&{BK6GgN^4V@@b6Mu&`MCo{_gfF$|7U&i{u-zN2HLF2v|tJZXj-ndYqmWW z<I$i+IG6GifnvN2JoA3~&Wo?UcIw;}W2={Ph*RB8ygXYuyfcIXXMqbC&WCY6ojv!_ zmDm5R|LEZZ2mjQsec|{m<=NH-*4<JMSAo*e5vHj%q=3L+IIY)v6EHR0MA-Y#k;m>l z@`IP(`_W4$-@W*u({f!7$9vc3^K|C&MsO@IkK3J1Kw&8p64w@LFsUS9>N!CTVw%m= z*wh_lZi@r}9?*w0prQ?{;20PpT1Y0DQ3x&}6tM+Vgo(Q}^_&9PSh_X4^ziM69(&;K z+iw`}8Dc;PKrvob7*_$V05$Dq+oWnRsO#Yb*uJ{9fJ+_TI=A`LS5Cb0&iU;bXN^)E zxG>GX`_ze_zV!Yh_ul%s`;UL|w#rZufTTl~k)QyOGqQrfsxZ?~NGxi|(e=Tf_01b^ zI}i`y^2*W@f!hvC!+kYhnIwTk2^_~#l%;m_&8#}xtm{AuWWd<HAkVIWpzP+z;1*;= z3O1vJg&2UTPoms+L;A&NY9oddF<;~T0{{t}dU${E+WI5ljvl*bg05o0{DBZLusFyL zfQ%MiqyPc3E2NiQQ8Ez;L5Zx_&-CI;m%>GiA|wz;;y@CJh&gZw#5~*CHbGHW#b|_j zIZ>@%5o|c#x2!FN0f2yR1@ph*&-~J358YM5B9b91f+3QD83N3A=KGeGGH|JBy((v+ z*vycC(;5Hm|NPF=@4olJmCZ0-Um32vcKXAA{9pf1erI*`=Y08z-+1(f9mYIc94$F8 zwdt{OkZya@<|MHgEI9x`1%kxDA;zEf=-R!ve)Xxhr{8|&^{3x@r48$YwL?W*-rBfg ztuK{_LZR(^D@6CuQp{!!WvC!WXq6~HJ2O*F?ir?^;?Y4t=In^ftR%{1SFb_@tRy)` z<uLQW##Apa?aU@Krq$Ku@nB%hbav%pm|wp8@aV}0@Bi$>w;fqUy=!_~3|GuDJa=u^ z*$zo4s^K6Ajp7GcH4J9JJ2U+B%@1EV`O%r3)Kb`*qYB0H^5M&bO&|xHI*<3}F%9<A z`_XM(`r(@wUw-RP-g{)vHy*q93-|5a0aj#K4Tr&1pan9)QtOP;oeeO92804fBMuzG z-G^>Hd4A_R&%W`kXI?tJQ`UQLP37Lr9bh}jcy&0=-Smn#o5(px2XBfPS)=<%k&IhK zYd(i7w<ONS?o7Rk!$qBeGP-z*fkR1BauH)FW63jXoUAh`KxG&##jvkv55)Oj^o_^w zJ~+B%RVpOSGX_a05Q{Pj+}mbGPNS+$#53R$U~9t{TRi{4_RAlfedpZfmBytSRpSF~ z)9V80+Rz68y>|oy4s>0omL*UmGD{MKnTY@Z?*HM9`>sb6*Ks`oxQ<^N^i$m3VNMD+ zz!_ko-J&4(frXJ991Ae90S2UurfJ<#mBSXCWK<kEaQ@1<|M(A||H*T&eeJ<JK6l@- zV=J_;sLoqAax4#)rL&!Lmj_ZVudc!|;xgwcwc8<tTB_9}^_@rRyKec)?>&F{fBNZL z?_EAsuIwM&cyMPj?ap7RnN(A9Zz&-POPNx}e2%(;5`@4(NsvV-7{f|(F@pzo7ejCs zHldE%a;c0(*%Dft!z~Pkby@D5{cz8aR!H|#^OXng{<FS#?~wvsGhL~M01TdC3nw8M zD1o%7xPf14c2cpLW4P#e>pZ^o^jjw{Pv76znqX9}te4|uCZwi}<Kab$?|0Zaj~6cC z^hBDydud<XzA%yT@aa>RpZ~Z2i`(x%_O;)5@~%DAyTHMuWA6|p#3G<_06>~|CHXi~ zR8T@S!b*)pkKc6v@uN?@dGW=!&Ye7W){CXOTxzSBlja~)Rh&A&L1G@w1s1>xE5IEz zLo-C7*-gpK0U|TNnIQ}b2m-FaBd}!2#7WpCfQ#rccH|_XsEaBXw>zA+_YA|a<@l#P z_L<ubtsFa2R{#LbXbH}4<f<tUN0w04AFo+A+n(Dc9(5&c1Mgf(&%X2C^Y46k>fCI5 zCZlRk+ZlCK$3m*{`Ly$UFTVfO8*iWZ{N0b=apdkp#URRN#&p)L7d!|+$^fJYLlkP% zv|TnZ7kf*5;lV@Id<np;NlD}SXvrp%J$sJq7;>kbY6hXKv;Z_i4Y?%=WCnN2iAkI@ zOkoKCTLObr3GBP0p+MeC(qZZ(fB^!4ot=A;<j;|rz)V-+&P4EQG$A7FqR%9Jmrg{# zqBFqPerZ8ufH^?d0Du@mP$wb^fc=61fERouVgxoLCy+C_h_fgc;D}g*gL7mKAYu7A zJW4qz6FOmq0`s{9D@z#{bm{boTW?-n8Px%(LFFJmcIUAHOl)E~XA~5MB%}^<7-O_l zPuhesdR1P?pn#8n-~aaeZ@#<n>bvL4wLPnQ4qw=rw3iTQk5+@1PoMelKl>lQ`_!SY zf8nva?mkig2JGYEyxXjr*>JFIq0Yd@q+`KyT?}HJG+o=~!C-LD3XVKBJi7YmoktJ- z@XZTnHZHd<?OonmtQ_3=7_&{{5yfCWhr!&C37H@PN^X{{gl5+S>lX9iY}fnA*+52- zI4}p50(A``P;wy&i6bM5g^=7rRW6MN<0`Zpr*!M$9f$XP_H*}t`R=249vO}!3`lbn z6@)NPnP5dMsICZ_kvb$pzJhWZ<c$`uy?gof4?cS9%*Od?i+W|Syfz5ya7~66-kCMc zz^6EW>eL6@JdwIyURzx~-0fW6I``p^PhL5_`N9ugUiuSXe&UurI9g&z5*%b*$yTzU z0|-S#RiFXdt^?19!D?Xt{^6~^{n(@T-~PWmed<TAUpm_~gV9kLuckK7=3AcTRl#)~ zeXgE3ScC*OhL~FoH1LW|*^J$YTp28|2p5KgFsxdK8yPzoP;{<vD@R39lEA5(jM3b8 zWc{0u-uk7x%EN?ZB(iPfM!=BDv(LJ&j8S4Js=*wz1DXJvz-8d2bNQK*A3cBKqw_OE zT#?Zd;us;Mb|-oVuz(#fGlvs>GU~xByDJNrka8Br?wn@>?0PtH9oG|p>-aT8b~Cub z)lD4$&|4$B6A8coV;B8Pb8~VAxnVv_U6*ATh3g#a&8_WXP^~N-I(hEIzx3aH`#Vpq zeC3flzx?Q3heic63>XrP_pc)X(|In5ODT#W+(1UE(WXmM-!bAFzOeoqkA3!guk8H6 zQ?I{%>LlW5?cjc!D2yz3xf6HlT^v=$o|TkHK!K=S7~445gM(m98XN&GX2D&MRY$`Z z3h7ciEXvVJoh(l-eRN|btIhl~cir%3fBCbw4^RR&o9-DDU7Cj&8O(tgiD5vel(*+I zu9p+4rYbjq_viTDOP9a*;@j_EX|-BHeaK@ubxd{=GnmUOjsK6|e)rXG>HNua7X!_B z&6^0+UN3LWw?^YyqW$dD##8^^|M1XVw|}hvd+b11M?C-psMUtVHDOQ|NI=4%KwV(! zxIAqRmc`M1;h}v8-@4=A4_^M@C$D|@{^qnQRx#d_jFn36Itm@76f%>#_5+D@0I8rI zG(kI9OU8t3W=7%wI6?}DEHu+_L<JK<p&YFURF((<5~`Ai!NUA<Y|kEB4Zrc|U0-?V zu3MI=c4&sXLns6&yiH9@7DH*^ZKPybIB+p?#3}INNBG$r@4oc@2d8$X6Ag|Ps)n78 zo2K!(X(82MtYxvO+gE1!U-@sp^V3@nf9~PCAG-bM9s98_6fH2{xiSc-c`-#un1`__ z9Tj7%X;!PMrQEc0L%lS_{dXLH{H_ykp1VRQ8{x!kGR(aYR@LV7K+#yu5}6?c*A|&! z3E7AO6l~-~l#>T>Gj|8MQ-(1y96d`&J~jJSKtv?F@jCZWxG&r!>6%fG6MlIRfa90& ziGeymvO61FV3~V$s*^3=l<CvTV}P(w$rCYAa8_am7#u-N!op%4h@(p+slWws;URb^ zw1_sU&ASTSIA}yiIzh8pwA~~3?tA=>!~1GTa==)^s1DmZo6AMTh(#!kNdY2cQU*45 zu8hWeX22G(0sO(ww!ih%>pQ8qvf1$HhRfTzOY`BLLpgWt_QiU2d2nc@n_v0SJ0Jb* z?f>q!n~!|<bC2GA?+rG>da+U$OBv>_n$k!#gdzX{##blBP8+ltD*?ZGE53Z|;jce- z_`A<t`Pp;tT-dqL$Wrpchx?=ov*rqD2AxCa0wq^LCXyzKd+2)tSGSo=A-)h+6NCEB ziKs+~pv+)`0D*I;xe$+~3&*lrE-0i~bK%1SMe~`*kNw7DcYmx`-Y3vm)6BZ%(J0jH zKx-PK7{VOr;2F%Q444Dw4Bz<(Pn|gT+B+w=n#|=&T&h~*tsT~k$VI36gQwnk`Y8*p z!Sd4jfvyeHixU8Y!SeF4J=RX%zx>fVZ=8Ga)bD-mvAh4&CvLcTgxY1&=yI@?P*MUM zAP8e1h(Vl!zzyA2cR6}^^vK?ukKFtD$MCy9eeb8QzBQLMM=>Z+)l0~!oy`o0D}yxe z$OJ~7jWmc=WJZ*@YzWE8!0-SM{PQK;inuvqkg5vBz>NS3tToMSYhy|D{+kbe{gL}V zcV~S>Py>}VWGzGx27o|8R1E7nrDmRV7NjAb0H=Xh&&^&xefg)aytmOxLxVV2N4ean z?6kz$>KM@{!-%_KKV6Id31A@+Vq|v!M&t{ltn1vL>$si(T*t2+6z;x={>>~q%oiob zMdaZGCwI8x8dTLqBB3advvsY7l3L5NoXWv!RNa|eDMmN$yJgRZS3dez{;Ti(&L95l z&-?8!|0$olX%*N^*jHhx0u{Arwrp)@U>6Yyp%yA(C9+MsV{!BsKRSN=w#R?>XD5I7 z;@hV$y_Mn^GKj-+FdXJa+g1f}P#4Xlfhdu?XkVl;S3sGfv5>GwvOtKWLSP*))jQi) zFx^=ilmV$be|}hoTlWqgIk@zjkA420gMeeQF{y^d`d~=NP1ib{f@IHTxwk>jR88yg z6h#ZU==kv)+rR&_*IxN>b3&u#gEzOCa@V2hK#Tdw&bqZRefjc77j$L&{En@!RyQ4; zo1%-eOPd2(2_sSJ<};d4F8<-OCtiHxtv~NK9=hY;_>O(+2Z2I3b;yngfPs{Co;Ze4 z4E3;RQ)(JJT$TIw@$Fx`@xGgneCvhxpL_4}g=yExkhsdBfI2Y?t5_CSbJL=7cej8% zCv!3<w6I{>IT#=W2KA0fCD<X#fjI~ycn}Yf%TmNwm+H%>Pt3Q^JaBaF&-hb5`_+eU zyrDv2X{3-o0LodjB1mM3F?K*k$iNkkjR%J$;7W^cKi~ZL^;1v1{z}u#vAT}&Dm=Y~ zU(@gZ{Xe=JrIilp?vN5G>5v*NJ#sXoLmH$zrBk}Qry$)mx~1#8*YESb{r-hLuU+vt z=iCo0dh$M68eQAy6F6I$QIS1t7U<W)Yv+FnYZY9BL$=vJNyGvrTyJ}~>7s`!Y|D!* zsvTUQlpo%HAg%~PEc<{K_M4mnw0?3&@j6}e3|$Y{UF9`!%I<1hM7*vi>Cc|yN~gvB z$k0LuJ;g{-*bG$34x;1c>rZy^(E5!$21zKR=<VRd6Xg~?`})8YL2YXKvkm<@QiAN0 z9B}K4x;J29%XJi?53y^32=F~gA3ZXnLox{&M2p1j>eN;JJh}ry48);^p$Jx|nh{1I z%T6FrMq+J4NU4j%r;A-U#EB{GSmh$s6l^#q`S?=j<y-Dco|`F`A4>zauULb2BNl{{ z0r-#8o`YYl5YbUd*=ShVg8Mz8;b9K_N@wn`v+u<or=k4~zw~Y8`XDk!S{dyJt?U3c zr3}Q`!jo#OV2ZIsV-e>~Yt9!uJPFWi?#nE+h+>=lNDOhWsKDk|H9AbeNF!1kS*KhM zaVIQt)AiB$$f-)g?YM6J`Hvm6!?k2kXy6y4r2<Zr)Sxj+`gcKuQ4AG=O~f~PTmEJt zyeDgnKNeba70^Jk@FqJCP#(2$GCGPJ2J)Of*vpRj>XYN*)qgjeomDhkIoWIy2N=YZ zC9l<EuFN@l011U0xXeNTP=?%cPMSyxKH_!VE-_G$9^$iJ7i4A_5WmfyN&?CLj#QrA z#10wI(dy0q`s?7vw{3=6@t3!o`#KH@XVybaz`wD$9RCX}xF>E#BH+x=u8;+^**8~p zG`>QUS-@+}G)99@<aEMUv3-rO71~7ReBDYX^bnKzuG{@J;I?y*6WXdtOVK!Gn=HdJ zORXdWQ!B-$PgKrI7fV2v*&a}Za79vcrAZTqhT)I#aAj1o6AktH9!>0>wjS7hS$W-1 z+3iLAm4C`uyr(8F<$^f)bBM)89i6~M{aOH<1akX^Gpp^XFm>JUI-6InwRybQd$%gH zQRi>|yOe}gfxMluE)X5&`7x*mU<FirD@P3GwIFc$DdRKvU;W3{|3x?LP|z}yGOU~J z4{=Wl1A<LA5xVtq5flE62?B&$t%yE3wmVZc8fbz|$SPeZzX)>Lkln7h^uvz(B(HOQ zA0=N`&t6;CeJ`6O0=^@@x2e|jX(W&8$H276LvlH+%zSJ1DLgpDt<L6*EZXsT=%QxL zYrnmw`}XlHM?`crW2&`)+Y|7kI%Y*D;ZrQOqZWA>Ian40A{9{(npgLirwthy;()nZ z{*|@gJJNU8{#%Wh|DI96LsFc0V~w6EKw)uvjG3q2yo;9t_XEZbgpi?{C<<8_($Mqv ze9Y(M?0F;I+E{dUv}M7y@m;l(aRyMR`qQ|5Yo=q#Xsp37tz4&toOX#fbZolVVpU%H zP5j>DT-?#k+>h_N^@66B?$76IP3gu<!jCmidjXzLCBY`0w`-j1{{IsAu`$2NH;ac( zg|nJth^;Ty3x_F<2U8=JGEOpDp+#Ldy-$6NU3==E$9vuU&SWCm$^Rxpec~Mgp>E)t zxt78t>0U>9LKPw-&7yLlg~)6~b?QjA1U;ou`jR>|mc(SrkVU)3y>-v~t6R!vSYh|` z?~Bf1ojQ)636V+EwAPc^@k#_zWFrkF7_&=Ojx{?{KhicVzP}f9zqE#C`|ie&z400Q z!)~g@S8^YPRwjSc?`WrLlseOd{9f0>GR;F&)Y>X|H#m8&ozL%ORq3qrwdy^k@$-ZA z>1$u`C*6W$(@4bRbJYqd<?|38Q9dPo!j_YzxsLLRVaEaXfQwFOxAU%nq|b9Gcq%tj zb%{94)Sgww*5DR7_B<?t#7guuB|2FlnU6XUT^@I|mP|j$@)E$`l4wx#llrXC(*wx; zIrV;NfO*++SCjy~DIV~2h}*-2mL>&A`orN6H`oJW+<J)@l{%Mur1^K&qugb8g^8hx zXjb~I&Lehb2oX)Mhgc!4&=Viaj8I%l(nKy)THdah-=LnK3U+Yu>u#Yly!+oE+Pju# z01|`RKXoEqh@-s`Zt$B1T6z5V2J%T2PsCNNCD{wuLH7Fn>A0lVMR2q`CRzr|ii+*B zgiraq%1WG6L2w3bO5x^osOz4G*le(=u%2eKcgxpM*nq(*oRRkm`saCl&2;uy1zq>- zNbEy3II*BdN35gF%9hp{H*&d5w9(#qx^b%_^?R<q8!-aE-eoVp?!`F-sphQK70-pA z{_<fUm0!XTdy~_aXQ2+j9HkCJuVaCWkkkwo1X#VH>>)j^v1GNxi$#C+ATl3+a#7s> zi{0+$T=&}}IcvRuX=`yElrRL-29r6SSWrv^Zz^o=fjI^)a<Hx1Y+0IuN!D5~XGqpP z4|ZDlM9OslTb9BR+M8K0BSEK6`He&A-|%&d33=@@tXxdny3CM1l1V52hF5gYe4Sw= zJDXSY=WD-YGI=;RuYmeEik<%$e*e%{w~N(N+XSGq3)bI2M6azCD{n6OHZeauE3(nE zM&sD+bhkhG<>h=(bNzAAjtQELHQV)L_8Dhhbkv0nh^u+P=YbyCf~D$!yO=h)h%Xh` zvY#|t{Bcvl+Nonz`6>oD^XxMuctZ7hA8_il+9V;;6rLK0iK7{e2tYC&ntt2Y=^{Qb z+Oe3kUqope^Sx)LbZ^~%_g5<X7tIOwWG^-SXS(}FL(VX;JnQG=O#NjRTXE$g0NG3+ zjf@o4Qb9YsK3YU&v9mI0QTk9u)>j;<CH4rT$NlLc65{ir;$!v%!bZ~1{s7^BOaR)g zLsU0*4Mi#ZNEFM}HXhtJtrG$s8<gMqSyGs6tZhYFOx+wkZcLt>Ue6ynJN}ghJU7Ix zIfLRtuwpL?NHNezNe859dqwMImnszvBg^A=DaI&p*SwCqw%7gdv*(R{Yiugn6e;3d zjj(Vsrm`ler7emkP-y{0$nYXaZcrs#Jr<(n;nFWtbpZph&dXv0yw?Mh7b5Tpr{XU^ zu|h{HEu8H<UfVq*WX_mWU`#8&ED@f8mOWBt55q9)`^`saj^}1^Gdb3EZ@U@k6c3oU zO6SHyMYOvX!47M`XI11x<9l__M6&=`=kSNLW<%1L*>6WxPD2U(&y=&ji2H@xMlDpC z$NtcmECyU&hQ96xct50<u02gYI=w#l39dE8UL4kzY<6VleZKyNZsqWmXRiSNT3kCj zp{d>1j$6pv$^8rm{Bl>t+I_V>FX+WrSZ|ISSg05sO0h=|Q)Yu9MjoP~DMVr-j*w0C zy>Z5m?W0k2LQ?E|_eTzj<S;C8pZOA0BjI+H<AXO!xUnP)E&zmhogS(wFeBJ$+MRNQ z>awQRgY*AEG;#bNmj3xbJ8y2nNnj5AOFoajQ3pl+(dofIrDrI08`D!mlM7liq02)u z9JDk#W|m0+emW7!<+i7X#kl8`uB(P0lG{fnExYGqf3%ZBNaaW|(_kOoe%oW#n+$Uo zMkZgS8Iiy>>GrwqT9&+>nfLHNV{#IIoh#0k-v(OFm7xe_8DUfRM6aMvsluwMc_9l@ zr*j{9vrM-#dKHIGryNm(g(Kj_Z;@%iL<k{YU?7bBnQlug(#<%CDS}I_srub8)4Pwy zKt>_T{pRn2f)PZ~-h0;o#uA`m3!5-nI8ncz%EKBw6C;iusQ^JK%p?4j95PyL=5Y|# zcK2ZY?t!-pv@YHZkh)37M+@;tk&9fhFqALh33CYKCEeHKLB;IazXLJ73a<M<90)=K zKs4$?$0GYp8d7@iw38MG|Fk$ZHNmbtoH{!i#5;X0E8bzN>8L1rvEm)tj_^B^{8X~M zINhCWerZ2@+0?WP*!qt5JR}1@ujNmT^>vdGNjqZl^f07AvwX|lTFjSkzy3P^Wl-Vc z*m;HqJ@efw1FL3rEiBdRm*IZeEP9)-Mi3+#5}6h``q!tyum^pL`YmR34<TX_i8=zh z>sw1Vf`)t#x@Gvt`QJwBsl-hWLN$UzX+MvKdRei3Mmyt>UbHSing191wdcCmpdrXM z)_N`H`R*ET?e3d7FPc%?<o3^~V1;OoWj^(3>CTBPYZW)el2My>6-tYidabu<Ig%7u zdg{fbzkXJJP)k7%h2ai*a*=vDsyZ2qJT8S2Q9xh+!G5hjto-rQZvV1HNHT7ZfbcfH zR(!Vj4H==sNzX4MeU{YX$&F&?j@{A1-0rLWVV(SSzk^_+%ro$;H)S;o3Rqr%gjWY^ z2tl<Ve~fq)Q4AeX2AMwDU4+#}0=?lY>^f=<1cF-Uw!meOwH8kEn!J#Dfn;l7Pp9)G zX-_f2GOjB!>a4b=Iguxft?O~+h_l0I%gmfPl?A)=y9x#BcCj<})aT6Pm8>F!U+6gv zyB5_z2sJgr-%TrdHn~9j!F(<fTq~GGyRC2AJ5|Hs*V2|3A`hxp&TZ(!6x6ZvwF`gi zrlUQ}#UMs7Yt1iUZ#sM#W%jCsm2dQi(y;H9$^Ce@?-}6`ZV*F*YM;P)(^l@&s;lHZ zaJgI?HPwM>)P>g7Ic|uXm&N5qptwq5rmxA0WW9##^^yqhMcBk^YmNVyCK??f&!gRf zHHe-c<A*fy7PTQtrb;>#ktA?l@>}<9lCFsl*!)x}a-Pvh>zxJI49Q*ii?X%$XLlpj zy-0I{qpyb|q8W~-DYl9-nIsKL;M1ztzr&~Z)2lvspZ+=$VB|=hMhOT@ZJOh^v%KLE zZ2x=lL+=z_0`#=wAa)J=#M$X5pgG7k5m-iT289%)Vt6YqO$vi8K9At6SYp0SF^G(( zuVdY6#5b3fgP`>UyB8a5P5_eVcKGntP?uvTcPVtYbMIDU0v@bms}L%rF!Hid@=1e` zl1iww=uYbQY{-Zcq@07yhz7kj@N(KOeZF)*zl1hj*H0!U^<$-|Pg$v9fD~Dv4NVaC zyB&b$&!{$z54?>hVsE(|kTgFEmt^<Lyc`xb`(D)<oaqhXf4!S9?6s6%4C0mASA-A{ zukohwwjfmltUb=Rbp>8h-*^9mrL))Qs&j(b!wu1J3RJUQHI%aLc#fDe)c5wKs6K{j zp%1BBjxrOn*0nO#r`VI*3ncokPlk6t-TCFVpZ)$rfC<5tvmVbu_@wUvGPnK-Tq`;G zSSdO{g<XQaXYF|{?t8@K^m07d+^*LQbp2_*R>Dz6Y-u!~bfO}(@YnV7FHN&J33@Ay zZcD4xH1>FrYIQX#WTj?O7ggw%v0MvxdO;2*Bg4+jIzYag<Dx|zd=QoMy!Y}TxqUU9 zDi3?3i6jI(Wg>bmeq92acm;%cK&q$|4dmtrTlEwdnMO+-)7hQJw%X+sU1<dodti-R z088#D`rgQFCA}EE1mcJt<>znKxWr??6q)$)@`89<TD>=yYu+!dK2G;lpWb!7>KWF2 zlrsA=vN8;W&_e(gKpyj@t=&bAY;VjCueQhF+|K)clJ(bbA8<G;@X+Nzcx6eB)n1O= zqRAqu*mY9q9HENJlx*lI1k|LMx6>=;ODrCh`)vn|f=NDcR8KQq|3-A*33>YdZSR9h zJ1*i78%BlX!QGkBJHM+Ow+IU=n<7X=I$k7R&P$p6Z!W`m$;~_3ez@65sEqXUOzmk3 zR>;ugRXZ55*W)Kh$MmYVL>Pj2X8GQ~&C2|YUyc;zSl``PBk8;B6mWC8tkds3a{ks~ zTZ1|lHbs%7ukIB=kB%!4f~^cu>Brq<s!{EJJ~nX5$+kC5i<%X{h2W3mjeRaVDmtKN zIOY4<PA-gH^n8YzP=~G&Biu5{MlQn<WjH`dM$1e)GT56Um+i_pxh1OIa(4|~e=L>o zUuH)zAJmwya%PS&9jWrk)04(A5{>MY(M}(i6_!(mkThRNN?zZ@t&0Sh8h`5ySPH8~ zhz@ZLadu2{*S7^TDgc~=cEs@6e(-hsw$-v8xr2ve#&iAdVBu%tZ2_cc3WY1U3=rwP zoLLt1egx<~I*m-zhU);fJtC9GdG6ExPNsD;G^g|12W?@-8kIq68ZBy?a2b@TAX;Qj zUvgKPQMl)oM8acv{bo1#lY$a+1gr;l%W{K#c>O9@+^0U03hk|I=32nxW}FkhdrUTL zth?Rm#9J0FQi#G4MMp@q?%yZqm4|>q(y~$bw8LIAeuuKZId$H5uJg_u!#e;hRY%Ck z9L?bP^odBra?(D9pS16Z?M&glY2ciP{oT~p%ys|c)Afg^?B*H-GFA=kKpYlS3$;vs z%QqPP%!v48`pwDHF2WN2=J&tz!@FPmiqFI!Z$`hr|J-Vi@|C01A;;aQQht2<*~-hc z&Henmmvx!KU`EBJDa?}F>W5gQjm!4fMy849RwiB*6(cs)Zb#$@wY%qA+C;Sw>fVo^ z9Yi0CCQ0$E->9<Yh)3pjxE|c!P8oI72JiNR)Wh48h;}Df63AWTRWs`MLM&ih_!}b_ zIf+s2KTEM0iD(($f;Fw^cp1(%0wc`cgh$9!1HNWX9qKksWj{~xu6w`Cb{{}rHF0Gr zsm!V<<Mjm>IatZG`m0V3#=ec10w(@A1iQ-)kRQ67aC&-P=M=`hPQ|T19oW5h(AeFc zwJ-MAirk2n7AdX_>jl<|*=7j$FZ^wD%yAW5W?@LyRw!d1G0&kSy-UJdfsZEFz1C^4 zT^o{NKosh{%9K!%Jaz2i1$k92>ECPXyr!sP*VF$Vq1`WsJ|t>Y>{MdDUegD$1<XWk z(OzZ5v%(c_i;bFYindwFL~Lka$in9h;s#8^pgK5pabJTQZyS;;;(RcW?$rG>7h~eH z)f?{k{>(HaYL6wk`l{rjM~<MRA^StoM|Ff&NKK$TX&l-@0G{KD>u{=s>+tJc=lk4N zo>n)@IUDA1y6Xa)vh;gTUr&i#m=z|BE9yKg6JrS((-F~CiV`taHQg{fnsO&M5dji8 znl6RFMo&-)4C3Mr-q&?Mln68j6P`<pU^8{W7!H*ItylvpWSu!ochVmqt7R2HbDG$A z0Hd_}U_!_Tf@T==5!X8n0-{71W3n8ZmVK0mHOpOspPk^T$$dk>RdZaG*03&@MMVE9 zHm({LJ3gfp06PyT=60?#MH~b-g>MdXcD!zreDR-nT1+GPc~ky_%UN)2(e=ndX(`TF zU@Xku5z}y0W(3_4fjrt26i$@M?Jjjg%ke&i!Oz{?1@`5?eIHlc>-ImvD4(H9M;0}3 z#bM4eLMuO-R#Y@~W%;_8JI}#2mVbp$&!oGq#r$<LZr!i{O#B+g%cN?drKIHZ-5a#I zmA*S$Oges0l+9m-of1ThYoQ&_;&M6VN=PkVeniVZv%5*{A!?rKzxhJ(`cxy~@#@df zX7fV;fQDRsmEQc(LWnXJjVgY_RSn4yN5t7V=)30Arsi2^K$+KTkkftnkmU~owLq~_ zhv_-d-Rk`0pGt}KdlPfFpv8~W+yr!}HkSj)B*E4KL`un~H1ViJ2n&&v>N3chC1Vx4 zumA9jUq>5C;V%onmrStkSCXr@N70IE#K_?l-1_1_H*Afzq?ERjI3`2S3_slXJ~#O| zO1}JC-g`YSYi2mcQ1WRZRfZ*<oH(fI#>z`r=TVn@OfKNEg^4XsG@NwG`9SN$-<!Pp zIIg*Ful0TnMKqGq?ArifXzl<|MDj-Ab7{2fHn7&D^AC-?r!x5ZTr0C`5qF*lrwrr9 z84O}opsx_ktP{})!}Jo6cEUFu@UO~(g8Hi|(;lmWJ>L7tBID9?c}~q6LH_5X(}^!Q zo(MzvF3$}HYfp0&3j`AqJrgqZA{4I9pK^tk+fMDQu+-5S2uw=ZVQUNJPfqn=GDeN} zZ_jSP?&qe8S*>6Cox0(Q^VP%fVW;G_QaDdkRmf})H*}agHb^rs*~RfI9bp1bNMSKJ zO_0%@Emo{)@B8iP{pR?d|K;H*n6m@S@Fv*B!RECqeJDo1z{MR}heV+}RawbFCESux zO3|S79>>9Be)HPLvE@E9w{<rR)4YcQD`UJIg3=g+!^*^{cOy1GRivmffjWrn=@*sT znUouFJF)!Us7)xFHN2(qka9ImMUK}lkt6?znc*lg{o`uAK59=M0Qy^i4$6aO#rt_I z2Su9Ptib4YWCEmPT|!CDJn|JIc%)y3IfZkwnZpQvMaaE}zC?3MJd_5!%o)h*SsRmA z2_0X~?aGY%Bxv&H#+TMJ(*O=2RZUe<GkZ6&POmd(o;Q)A{;%np?<Ie5o+?MCl(*SN zmt_1Te{1I>`fJfGXfs1!mw>%Wu~F4}d2I^IR>@KKL%>s0=1Vek<sqF;4{=P4Bv*zv z3Y|mh<72%5ptpoSu!03thV*71@;<BQ^{%Rv^K@bNa}HSPyk5=SvZXLPh$(hO7&x$) z(BL)oyOO1~4?DI}t0h7%thR|mKUfMgH7_6Xsc>r=7CVyo>tr}g!Kw4{#Ym9quCMS` z+<!h$JYg8fNnhF|l_0`4dj#=mkm2g9%!}R5+i8=4P~dKiBtXR<A4W?hUR-VMmTc=S zXGFkaUxu9Za1ZT8TbCiK>bpXeMU(Je2W*_qR@*O+`4Y6tD#Ra=t*xm6^v7F$=nyV- z5TO|&kv|49+Wt%pSR477S`dMSxd(X%C<GYdf74sdLpp>=7%mm$>U8xUnJ*%%jWIcx zi~I}Ajy@Vo`Ez)iRmDz8;|Y(-T=?Ybr}^%iyVbZg@KL^Hau49Vgxf(Ox|j<T$y{49 z-Yb)8not#?NsZj$wV2~|vh&4Q^!h1Mi6S$qw+pVk&U{81UzucJ7?T&?+Zi2L&5o!~ zD)*#y881RVML?(K0n=&gFn|d;Qhx95gm@>9KutRCB)_P3`gvU8<@#NHc^%s}X|dBo zSlgLx`vCdOOZJwBlH(IDNM`;`%nx;`)x3YqchfSv&v+}hD?WG6xt$kd?R$*Nn|GVf zrBlZHU#Zy6s^)K17_VZbe>Em*(puz;p_4NwO}dK8WZ?X{nA`p2DEW^BzIRIo&<zT_ zF(9c>$H3SpR8Zsm;eH_H!kmxP1k_YOo2Z$74mf`r;;rcnu%hGVqt;LGp3w3{twbs- ziL|Q_wpre-#xhEEed|6wf$OeeX8yCD8!1bjYe8R_4CRvtK|I6^pE0CIBQXtxU{%^{ zk*Nz`3(nTt?;mfwUPXs*UqZXDe-jCA`u4>j@OLzN5vVXD7QEY2`QZNU$W}|?6!z;k z;Z|4SManE)Zuj#DT$$TT7hKB<|8qE<Q*WG6vSS=I7>I2<`qvS5az*2C`hF2d>2ich zP!jaigVbDk5*Y!oBT}XbQtK;IDjVfZRU_7hXqnbV+M^ToWs2VQ9_{(xz{<eTGkd|_ zDk;o9=Yd~8Ju~Bfp!}H~NOs-IG7}KALZtPvgmoC4A8J|)y`cN!HM3OY>uv~*UW5Lp zQyd|OLNgf^{?IGIREg2$BHYz6qu><hGaQUa&>QhpeJX-n$m%L~RWMG<Bzscnm#`E> zHaQ)|Dwf@17nbR-omxd^*9DGG<FC75|J&iCfa~1*80hLK@3y#eOG85gajjM=H|<bF zXi}{HJTZ5KfW$IcY)a}OXy*b6Z`F6Bv?k!ZLGVkr^C_hUX$=*-d|@_yw%O|g>CDyD zRVtc905ITw<H9_*^=jYfQCgB&A}#FO#JK>$NVzGaEkZE(omRPj<BRa%%-QxL7;Nmh z_pdlROorglwnwp##d>C=b$i9xwpD43KbhDl2!YHI8O0ES%<O{Zl+2t2!T5lWknonk zPke!F2p!Qh7+bzy;GkpDb#|lQ+mm|!sBBqv_Q&g?4`;wxs4iTIKYblS5?pPJ)`ng0 zc4j*Cm$4rvAb<XyT{X_Ix7kv%g4=4o{?7Y(KhX2|i@5i2#iy>Tf0<6XZNytkmq43X zThV1%QH4RDo28CGh7h)tvekn79|T7^rq0kwK?#3oOx$V^zx1CH>93~2WG$d_-Z#AA zryqtf6by|}$$=F;<7Zo<(2n~{pVX$M-={^r`P+7NYeL|z_73*`UMbJHi5}7OIi5Y_ zDdm#il_Q6kI`|vN?0*@o(Jg0=5puA;N2%3CMgkC=**-RWfqsGQaT-3IZw-B-n9*Gm zK0lxIdDn9Pd+8_T5DyY@g|ex2h7PKo-^q_@wi1<)l0@5(ty68`ht}=5HUI4yXy+~b zZ+mq!iiJ|cUh{4x$6#A{Hw-DNxK2i+8J-&+1Tb=iGVWlj;s=-64OMrbPT}^D`60)m z<H8-_*$5?edTGuC{$zd}f$!+4X*6hqxU!_M&6vQ1g2NmSfk;3XTx#dHYEsPEgA5Tq zE;7iG|M5?h0u%WiIA`Y^jcD6lZtKLm?+3O`+Fs|j?eYOIR4!n;j65>EY<wTGq7=5G zp`O&+EKT2*z~=S#e+{}O0f)cvIGX;*KYmBr=D2c`kU5o}SDeWoFM>o_d(`@%*86yz zWF<CmIx<n3BGRGvEYdgkLKH6n%)epDdvfBqf^6W11B&;KS?krtukcZPK&#EGlkZIz zoCCszANY}9F@+9I$i;jgznr``-(l{=SslG&<8ZurvpVziY4i&IZaL26%=Wzs6A#A^ zH{f;X&=;>=W1g%z&f~y>jSMV#HGH<Qrti{PbU?d(v4In6t^wL%%CK=H>f|<O{ka<o z5?;KJX#f(BDR1d`2%9r*M{`W+TF2AM^4?lI*K#`AUo`4|Qak5M0rh#%q15LY;x!ru zw^7YZ&BUxp?9U_`96^`WeaIg%FcHbVJA0_gZ?O&KfB8uFDG428$84b9y2Yt})}_@6 z${xP9DsqeWgtqSUFBU1_aPQ1>A6+L<e1Z<pI;%QvW*8^G>YLe!lW)j!_<8wT4*Pun zr=iU`?sr|AbGd7-J8<;*@vzIY-(zfZ|7NS}GMc;(gJ2fpno;HVY>FF_xRtKguFM;8 zx2vvM2sgmNVJ!lQ20$a+iX1BzA&2HrnVD&CH)83z&6DGQyLH6`?e_NG?z2LwR<C5g zAfy0L7mim6P?i0VRR&t%$<v4`56+UR>9CXTsNxQBtVBM1M;G$O-#Dc#;3c9XW)3er z+8p>lSjId?KARA#6>ezqB2m9ck$_-BtDQ998Xh+6$=?Y>`Q%Gr13>NR86~O1C{vum zwjAFX8yH~GI6z-39(_`Tf8fMF(-t|06z_clnx4V0uCKG%&F}8V;g^yCm=)#wI3lhC zk02HdSLPVRKyz-mYq{Sgq;&D7(Wpv3cTscwvXw&8XD>$5^QsTJChp_mVf#8ANZJqE zbwxMmcQkkCxm~G!bp@~9ZN&8Z^#E!;l3Y2$WFR!o)BHpE*o_WrdQ-%PKM^DV{+Ap% zey?M3lCU)xVZGt8B%f5%0jdg9^$flaA67MC@8=|Usy6$wnW>f0zatxp?Xw1Qwisl} zK%-ibWH@z1uLl_yD38Ad7+dyFFegw~L;RA+Bw(r+c#+@IvDXJX2)MoVzf9UQzMqk} z`ki#U0_w*PAOG;ic}p75qbCB;4U@A$>S;~7|8W6=>Ul!NeW8Kv5>vK0{?EZldus;z zYrMuwuBIsz)5W{a<)kr+qIg#^T<tBAFf>Q;%X0@oiI+O#0$G%ureY5R)Hgx}KldW2 zegk5VVterOn%%nr9S@GToz}+pLjQ8V{pfR{z+4l}Qh_H66G3|AKeKliJEWEui5>Sx z2*G5Punel!8ZaV+oANZ7ow@9BMJ(xUE#gw0tQi6U)@6sLVj!BS?>E&|)>1|$xR5ck z*Zvq=1*gjRbosunHe@NAA!XSOppmMvi3gG$t7id%9KlI`gVQhKzQ+~KVxVz$Xy?lx zSEn4W*OkEmoq;7p)~F(3yZBm4)V0L^Z+{RrRwW=T3ZC;H(fz9`U>ww3WbIrd08{{D zcUuo~aQkZlg90rVXGx?pwJ9k#cRT(_I=d+8ycCf3;1>fBRSsUqfln*M+~ICSj+69Q zxmX?Mzq8Sm4BM0N9yf1;r|p=|0(QRRt=*ho^kS;@F(r|e(~u6aDFcw!GCZ=&CWnJR zS}2WFg|M7w>t0M8S+99MXS>2VyvzA)HN&=Y%Wr4c8?Q#*wWVZ+$U27FZ5nfrxOga@ zzunIwWD9=y#~6sDA*EJJLvFZP(BMUiD_fL(rf0h~%`^Ccgq7l}V{1-;`B7`q`tvc> zr>^@&xHXZb5?@EyzG)xU%FzeXV(fW?ZjVBcRdcx?Hh4*u-*Hh_3|+Zgz<NIw@HFP* z)b*-P@X4sv*T&<W##y&1)K?&~l4g>tJ>ua08OiHBcKf}-jQ@S0xKapz9wswtK?4;= z=y9ua1}Q^xkB+?cPb@7!XbV!-N^ixPk@sm8p2_3Jm=&v-1Yg_chDAG)oVMJ2n8&;J zu(r95nZKmi!Zhv*qplj-E)7|L;73lkD6t>_vXs#X83$}jR+V5%URn#n<26A^tLZ4f zSTX*XsAVuy!m3lT`)jYpUi>llWs~Z0JNJ1Pt=reP47C7^h8l`+X42)k{cu>cxFw$| zKVC@6s<dQP=7kJ$>~b65NHEBGT8#WBy6$!QJTrN59lVq?-f*&iWsY_Tw`*T_W!|p( zdwMb#1d%B8He?RfhY*9N!Z4Hr(cj?9q>T%2`+h&`Xt|gHPf0$X-dE|UvFER$@iuC? zxjJ4^W*{=S6jH7LwaTy%Ft|NEEKHLL&{4sHXLWWxSS~}HeWNiEeq5vwo9UiFotgjt zI%gLga2`BfV<I6*iVeUd#+2`6rYiLQjmzt@U{eYqfOmJ|*H%dLJ<(G1*3h=sk!8}b zSX%R|yM`yY+vF5ige%oWRa5V%4WEoQ;X^r{#(=fnM{sxk-FfaE_%$55;<W>PKBN<@ z-dH&F#2Be=Ju>^75sHseXSatE+@klc-Y!GsD#u%F={u6o?J5X#Fzn=eep(Dp@ajCq zy*%y}#gp`a!u#+BMYsTpX9d4Bc+%V@)FTZ++~ohf+XrMRi9k!|FgdXR+sA`jjt(!= zjBOril&I_v#q?v^+{`pHpZ73N68A!iM#zjjw4sWpYDD}$Z;tVFeynhdp}5rNbkqSu z+6zmAzXwSJx!SqilT@(7>d3i&sJXbZu*O<0*=T%(D`@1$lHRAsqXExfUhal#sGbjH zz+xUpOPiJ~7*z%ImE0i~IoZX^lN}MefyJh%O-uJt$#G|!2Dj01?_0Lvdc@^W_<I#M z4^U%(t=G|X_;#DEb?Ugs_6Xr=+x>>$@Vq2P)_T`hEvaSuvV$cc^X|yz6-OcS+c9eZ zHkt?!)zJ3B|NH9=-a6dg%=wivwa{-hE933#w=^Pqk&mLKZEQ$wd?$<s*l*HU@@jW< z!O3hyB2B9CRInjrl)oEO)qH5tYze;-MI*RSYDv}PaV_QQ4jVI%d=L2wFDG{6B<{|y z3IC-(o>|eB^)U>7%N7j8)l(m+JSGdZpdrP5(?4oq&2*o$yL+AKyf+yhM`hx7_=5=A z;q8*RoE_Va%}+y4O#e==0@pDo$tH+?2eMLE=1P4ffdDj#Uf><0pTq0n!knm{7XeIk z^K3D(t;hx>pv&Sj^3%HDLgE|x7lTpOuP+geQ1mFV%|OVv7*dhHk06oZv(bFDHL)^| zf;Cwpog(p{Vu^3p{l~4(y0=Hs@Tvd=-<nE^zghBSv5@XtGlQ!ce_Z~?BIhcxu_hkP z%fxYzyI<3+5r3Yu-0Kyaqpgj;AFTST9O<T4tLnkbbVkV2J1f>N>Vnrw<0hZ2Zk{ED zYTbgYg)Ed1X#l{K!srENG&jW<jU@P$5OEyU8(*rqB{{H%sYJtFUWK`xcd#V9^%ra3 z-9U;kAuf5NFl@uo2q|qT>XP3pI+mnwWssWo4Cq+Sj4EPlX2ENox3@Xfk~+0nUB0H4 zUIDQSZEgjX1u9KKU*e*7s|_S>J}f_;JA67@km1L731=k0<{kllPI7dFs&R7vMlg~> zwd#@E=*KYbh!1#rc!YLd&RG=}iVxpViv6}-Nmn*SR+@AFww#t3FXFV<nl48O&ze<7 z!Q05vT3Izvu}c8oQX3EUdr%1hmCCZ{TRT(F&*3T)$|?pryYcC6Vusn!rji-<s_$lE z^&|S>0xPd`b8~QCncvYe{MCAI0yiW1d`|+1h_-Y!qe%0=W#Hw)H^YVrtdH9Gf3qn@ z5`b{7Q#whW4?v9<?%+#Qr9Jz?#d&<w4{yzRdsr~NpCL>tbcNp_A3YFj05JlPS%^R_ zhSt>3f=p}AZ2ZgxKQpHSo~x`mOKfeCLJ-7&Ihzv5#o1KfrjB9K2*|on6^(lQEb5Ps zDbi7MZy|YV*5Fl!<KB<RUp?IkApS?VK@{$bO-)SJQ(xno8espQ*6?2-;#cn%_|1eU zX)<!xW12b{CsY8pl+>tgWvWSJGs9wDIxBmBhFu+Tg65QqS9?;pKf94mCAr@19pPuf zv7OThi&ncfzR#%ylor5Ps!x~d`qA@4S55bNM72#FgcjF$#v<4K^AesL)!Qbo6Mk{4 zWU&$0V@n9(XUF>wLJIm&E33KaFuEw6Z#qpLBCIWUeeAO*Xifnqop=&r0qI%YF9Un? zXr`al04N<{I<oOxiz}q;oS!SH@&g&wu$I(yF+_WOh{Ud@h8c<*m^i-Fc%IjDjBn%^ z#qflrR}|}uF62xKF{w(1Ti#lX#O{pXYU@}kRkGO1qyWd{SLDzP=&kXE0jJuT!sJND z)RD5%#KJ`Y{dZt#EB(<)(P{mBZEdY$JJa5F4~q2ie$)G~R1NRbWzKg#OWhX>Mkanc z8>WE>n(l$x$M(iLbP!IHu5ahRe!ZbtRh^8#vl}jdj1z}X&Lkf^J<so9_Ic`gl?JId zXyP88=NlKlm>gGK=kqru8VNFu1Wn4r!diq|5u*w>>xt8fOCo*+qI?Ua+L*v*n&LY% z%y^EI^mdp373*j(nki^Z%-_IoKvFqFnoerd#eE`jfvu6rheT29Qu;T&AII^Oy5ZaB z4pU9EWX#<xmJ0l$;0lV7w9d!@<-iEt`5XJ@lMV+pZ5~Px<!&<A>dN+DE}Qi%w~Z^8 zIYsvC2HY(NYw~%oZ$gX8hZ~jlhw)CTlNL!NI;vPbl(AV?i{+f|Rtvo9dgf45-F-fE zU~Tfm<#6@Qx9G#IqvK&QYbsjB4^4AnT5AP6HhP2-RkCU>CRf8NL^A<Z3+cBJWPSK% znA9{1xtJSqVKe*=672ip^s@5QB^wYQC=|8l8H4&_jU^jv&)>=+Pz}T;Yes1EiO#N6 z`*?^yRKI*Fd)P_*-!G=qmr1CE8p00Q=X7{<139k;0!YiZ3;l{sbof>w8mIptDfO(y zxkD?3MnrVV?_d7oM%3HS(wj#4MpdBjsd@*G<197{S8y<N6ud&N!I~IhkXZDWyaH*b zuQmGJBAr6A5X$^F9pM7(0;qK+YQi6d@<4I}X<6G6(O{7<=9z<)PRH^e>!SIR-nYYW zt7T8pEoJ+oP8ou_5xXA%ooC5WEe^=Dy7c+mobFuoH&=lw`ZZzZSpSm}PH~T!Ta)Mg zcFqnjtG&z3izOIrQ99GyZg%fX>~gm~Zndpuja6sSaDjkwgTre^pDk^?MMH<3%OoC= z8$rVMV#~*XGrQxw&c*K&YmKD;_(x`WhnZg|d=^ZuQ;VA4n?f1C2!pT0GT&&)yLMuZ zmzVG0^6FZHTX>U!JMyx5DXq=`;_SiJ5V`Gd6Fa>jS!Jm`QJKuGZkp>G1(dOeE<M>N z6W}Ga5L=rw->)v6H~-48pf5_V*XH1rb8ElnNT1saeW^D-#lS$?y(X44sR80tvxBb~ zrf*1j=E4?UdzK1^PkmsMy0^zBo!9#~g6uUM2ndmy!{^+(hzPQ8Vi<mW%Zp_}z(@-P z>0Auyi#^Wm=K9*7du=Iqdi)&cunnD5BoLTv&|jV+2tv_qDbB6Q?FS4Z2mS<tZ-Uy? zH1ut&77Y%vM8Y$yc_9~{dRH;_+c=7oT|J=Ldq)I=|9hIEf>%9`fL&L=Wo~ssa9j9> zLxrbQ|Lof2s6z5s)bU=m7B&GrK)@-awJeAjmK^h!IkSQ$-MY};ULtcshJBldQPIKH zC^`b(Fk{%BeV_c@g&0n57SK&CmPtzX|99BBw=Vv;Q5D|xa%U8`s{IZ>Iq!M9b|w(= z2ZDrpb)2C|R^Z<DRmYBowAMPp{B|wx_8mrio(={nh?ItCWFzD9o8=c(k@>$UZuyQ7 zj9T`VJkM>u9PjIa@w43S1($bhKKw3QIu2?&AAfsH`bt<6DIHg7AF2gsFv;l@MR(|( zX4?fd6-8DuOj<<S%Ol7R$jdHV2MU7CTm)bWAX7A9ib<x?MZUMB*evq%SxfSN(dx!T zsYsk{yna<!C}qZ0xIp*&?{@>v@Jyagubcw5FWS4^Zgc1YArct_jSfNMOAp3D#g2}` zF^7aZnKo^lxUYS~xRM^jn@-RFI!V?f_*L5A-`cNv?P*a|*U5N@M-BMS_Y=@veTT19 zjWb5)jdMjNMaKtugWsqN2m*u>D?@f?Q2(dtNRlsEDzo)rJY$d#p3@#{k)~{kEbt;1 z7`qK&^Wc|Qw9~9a0;%e1Ot<raeFf2*iIUS(Y!W69_^cch9^47uvZ4vR8oG~TPMHOc z>SYL6GbLNL^4T|Wo={Y0nx?2>8RZDRZU$U2Ir*LxN<KpGXKv%92<-IA3wY?cA~s_P zdGoaY%}RgzE$kL_Ub^nO5AT-~_n4=W^o9+%a^|*zUZnYjK*vLVsmrYCiZEm=2q~hX zef3g{s6zJY;{pN~AzCm}hufhM>1H4ewg4B!h6MzHT98q|7tsZRE*|ki48#}coxa+$ zb&8Hs9Yh7eCm<5WQUZKel8ShTgeFh@c6vppU#}_iWS19AS@zP%)cy1;+_BZUHO%;3 z1SANBo<Wlvm6#2*Pgx&a8*_*WvI#q(>bUu90Jk(Q=00CPz6&@vRv5wI$Z0RS_=#en zB9htEaI(~vuLc^ADpGW`fQc^;Q|x1ZUR3n3a>{;_;=|7`94Y7G42jS;#bpfBcl0={ zFDRH&^;*k_|2DGt$^HB<3_JFZ*(`|vv-5C&?$e)kXxH5w-R<h#52mv&pIm!H_6$p) z7-^}OjDGmGHkZq^Y#Yx{1f|-#t0l}>znAlEFxATeoLl`e6^T)7{&*8`GX+0I_SR$& z_^CzSXt-rFZkwt7{Y7`mr!pp-Vu@ydO=L^uWHbPeka=$o9N=*@m+8$H#Bz&-!pi5g zSBAMgmX`~xR5JI7RMQbgS^A0`3_n^Gjp?r@w)YwuZYrwvEZ_k8BYG0C0qF*yum@Ue zzA?v;9tasFFi5zC5;wal+exsY3g4Wc6!N{vxom#Vh(u?2b_s{mNbL3HKUeq)cwF$E za1enA5FH!;5MR3ipGH=XS`L63oxzQ&^QpzT(fc(4%2EmV;D*4FV}}ul@(xfGEzCBI zPJP`>(jRjE!XS3NRQ$f<=_QhP`7>4}Rj!~>^e#2C#!-@kQg%zqIfo_P&+?LxO8gRh zeZ|S_Bo<o+91Hcxn1y(p6~UHOUf}-q12Q7OXu>B9-X5(sH~Y=f3)*}A(MCTr*BFoG zf2t{m-UrKtv@fEVa`P4^YzhR(*`?`wJhCcN`r~^0E9SB;@72^A@XfXv>5oZueibXD z1g06#hTc4XQ!0v_T}Y01bDSeh3&HLaziLeacqH~HqQmOSzxPG*Fvs3x@Jsrf6q2mn zZA=-&`rnU+ce&vy0?Q!nDp`o?*u<^>qG??tq{12XKYQ^3!>x-nJ|Gds_fSQ>)uDbv z7!)XsT3#9`0CDZ{(LI`b-G#rqXF~MDDQ}12H<*4@3rysU-H^Y1#T)o-Da$E|O-bq2 zp&vBRj(Bsi$7|naC^u9jkY_CpWJmKXOh{p=hTWE7xL8>+A*4Gy3KJ!W5;P2>>+n@s zOS7qz?>H~ffIc%ee6C<O!(c&T9Xtf`uf6upEe2eG{qL$sbYB`d#UBP@3blc67EE*q z_BB2^%BdIr1iL8alggJ<T6lsWqTMbtJ9dKZJyQ6Art&}3@FR`}@<XwhT^UIV`Vcr! zsh$XHF<M<_8+Q)or^K(f4)CU$rjB;k(3JON7ZVf7Ta)U+Mu&;~RPbFnfvTh$)m_K# zN?>IYo6D2&i#@8_qKgL+*j13<)4HhW++L5%V1Xu5VKggE##H#;ZG5RLG$<GpE79=b z1m7VuwxdUYtMIT7zTdz6`(peE?RpvHd`bWEuFIWjoDs>zd2(q--4w10C6cI(8hzGF zQKYG$j9u&ex37W+hqF#f`ftVvu8F$m3v0&U8Krxve$G;imBrqo9w3~E#!Mj<Ie|GK zA*S}as;2XxQX<XAe6|Z@PSpCSZ(a*9UQi&QsHbx~9qg-@ZNXREp+QfTEitx<T3i&D zrW&9QCr|rXPUn1@ScbCq2gK(9!!J*<O%`*YD0EcQUg#40W(B4s_dUtXeT?}OyIS8& zZZ@_+O@l^E!<(L7ix!VIkx)__`IabUyeD$p^CjlM0M3AZgo)md!M5Y3FNE1=TRIRN z3f<G4TR}3XBL=gM?UN&A&11BJEs5^6$X^^4V+HtkjxFTj_VOrfT{A&jsa}S(_#{sc z@PV4!X%^vUHw?lMf|1rm8-md9gd8C28CuXzP&pk*#^@`&PPglNOElMS2e$rj*$HOX z<^`g8wN|4}*^bd`q03mIBFg<<07fwk<?ydOw^B5{??wp0)Z@nv)c6>!^C3t;rM;~Y z``k_7WCEVRM$JVk>CxYa!N~El+rDp}3UF(6CMRJP)C20y+n40A{ZVogRv~PT<_J|S zc2!K*P%6W+%J|&STAtqbLuJ)l2{yqch{hH$HWZT;IkJfUY=IkY$>i}S1V9obM2a5U z!`RlzKm%fHVUCHaELMsn&D81rftuq5YwN0n6Ic#++H0PU8=7mLY;rrdy9j*4#3N(b za1wB?Pzmz#{$dSMOPzpBi8Nbid)ZsiKLuIr3eaecAZYG-p`y@l7!IMacfFdujA}vy zJYgDky{#PdQJEO|c1y|eqB?Rsg4dO@1E;VdD^#h;<syan9_f&#Tbaq6y?s*3Yz3pk zhs&v0%q-F}ByJR)Je04}!F*71#KVH)#_Jv(m&9WgAMt|!<q?*oCJN}JgK0z-vMB*s z6N5hhq~;{JLV<TgUv|C#kFneVnVIb}lRWJre>-?pAPGpy(h!lf=sbccpgVu5u{fJ8 z8^OmO`Qn0{Uk$0Mj#;_gcgL=qH4j@3!}1=$FZ^)yxQERM&j&qH0VLt_3<AuV<d%w` z_~F9QrT{=V??QUBRaLmHVxwuxgy;LaPTl60jr94$;zBCzR$wsck33q@9w{9Qc{E2H zhrJWSWnqRlVAtS-zLY^8wggK()My~ceZ4cUdI;G9u%k+iC@d8#M=M3mXrOS5K1B0T zTzCM8C7012g%PP~qR1Fe5ZQynGsC56u;@DTkYN7aSnPuHg{1rTFBP1?50(5k;=OQe z&jLn6(?*%l+*|zKrUeNcqrntP!Jv~K-$!wFN2K%<+h8M8Jg3f=Nh^m&!jv=fR5o_r z8Vh;BN^AT;mlH)ZyS2W0o|aaiDOh`daf7A~eE6cFLBIEx;z>xEp~67m%T8H$Q6*JJ zcde~B#u5g#)M`%=j2bD;lUshi=Oc#dX;CanobJj-0^28@sTpc2WvUS=LJRUnzON?T z2e$$L9{$7WU04J=Ni^*(kjo*5wEWN{Q$*zvu@g~cL52M+CvrFbAm5*XCtm9|tP=Nn zzBmt$EtHk6`#5QxP@Pg?40>c(B@LMqn4`$dJavGJ9MIr>1^txh1VC`$ziUsF{?P15 zk4f>E-~BxvlUi6n^aO&)BxVHKfgM6BOr~0-0e72>{1SS_z{Bz=IsK56gQ;&0KN!Ab zs5G`U8uBEmPOS%ggPJ$5Ki?0ZwjJpi5}{jt-V4go_)u;t^%>t<vBY*deo~HSuytbx zHAlkvV6k~BM@ZC;k=$=z;;_;q1v`y~pQSLS*L0M>)r#L;>3mLQR78*gT02ov?PqSi z$pnB<T7X<!guLXB_9?gUJt6Q&Kp+5<$(kpO5GAaykVqzo)1MAOM*!8iFYo8j?3j0< z?n|om+M_4(`Fu{xo?uRkWp0Q}h_*ETeh0%9=@@=Q2y#3!x9lf|pJYnh6l`sA(U_K8 z!3r#h_4SQ{?nbmp@DgcF$JCWl<@e+{!gbGeId`kPGttG~ZZgs4NUhDXWb$fqI&SF( zg*tyeFkK1IkXc?G7s2#R?W-M^pnky=`e>8KQy}oGMOtG6(a6N-k&hNT$Y;PlWe{Uj z-oBbNG6FKZ$zERBUUuqO79UMNe!s6zmXb}jna0rC@b!4B_`9U{Zlt-O??uy(;*S?= zTHo()dS@AEZX}ZE&_NF5gKp+_9Xua|g81x)C#Y>*6U#G%Ja{yak%%@r$6qeXVqWhT zuihI@>2g4`K5@Sl)^`;BB~VLk4UNju=GA)aB`{MiQMRaV95-Y@Z%2&OQ*c2Io|WcF ziBNz6lJk+*XQ8!3=%^OdN#^snh+LMM0!-$Hxk#Y@!*X2ru7lT40tVx9`k1s3&4sQ( z@!PN1BXtyZ!unwu73m+~{j$5tO`u|653y>G88Tt-L|PhBnKVvs#B4~~VvLZQHZETj z?DQX6DQ8v|e1&HQ49!bEhBDz+X^|4*5+^_=?}za7$!9?bbsq=|lqMkROuzeD-GBsQ z>YosT|5yT%go^J@E0*8SzfSQtHr~csF>WA+S`;9MyN}?fxv{tj^SQb?s5*=Z)AYN7 z7!3d^2%)TotJqeZT5lYGuOuy+BG=1Fb+Asj!JDR#i)0~4nC1l3%+id4@Wic0#DpR- z@}Df(d|VwylKGx@#g#)dqi*I*twW~n%sBm`@26f1Uk?tNPdg79Zr`<-t7W73imX#u zelbEUQGk5s1;j&If#~QUQxuAoj{t1Y$9a1r<FCd}+--=9W_&&4qIVY+nVg-^o5eQG z;wTpDK(8OI8Iv9vqmATo!ZMS}v#uo^`6uxrW9csSD>O`FH?H4k1!s_<YQdIz9@=58 z6+q`}iOu|LJXaxfOhl}RUU_^bjWa5)QSmes0lLiza(1$>^VlX9bwGsCMJ$Shqa<s= z*O}LgWv8yLn;51upN*VnR(Ji7X$Y!u!OwF3GGbu|lf|z~4Nl7StBZ!(hn|mwHvzk+ z!|z)jhdBdQY9G!+bxk_?X3T5?>N=b<`iol&eo6)5=X>F+CDMT%1W%Ze(5WNorN;*P ze6R7iBW2SdatJ8M$B;7-kT60Y$HYhF^og{OK~l*06d_`z`uJ0Fe3<cl=E8WUr(fSK z1X#AIt1q=ne7KCA;-J)fzv{D$6L3oMzSHJ)dJK~R*e*wghD3&cDfKnH<S!}xz#BC8 zph+E<o=BVy_seO!vjF>U&&}uWNjBvl$ZE;8_`%rt8;1_OCmm8OR-d(3i8EH;QURu8 zS4NVRXL(vPScD}I$S76y>~V$=c?9X4+32rPO$_M;-32_fIRUh|IkR#JWCKN85FYxF zswQ^1lsQ~9w%qln^X|t#%aVRqe{-)UIVs7)wv~kF^=if$@?3iI9kI~>D)^{+Jt*~3 zi23NTS*8Hj{XsI<IJsG#wd|%O)AY!78Zmg#t#EIBDQnt7vEMsDzZwh2O2rY@;6hw) zsn?YCb9_JX*J2wzi;b$9yEd;Y*wv#)C4a724S4vhqm6$0aIlQM0jz&nA|NA5LXxHy zA{d#a#0)A`K0W=7PmI!%Vpxk#NI+363o^4rk4VF)t!T$B6X42mY(5ive280%G-<mU z8jd?@H*Lv?*M%TPjsQ*o22aE!yG!1vZGSULNTdG{BqmRPj6o(K+6Z>&@U8dSth!wj z_q!kXl;jnQh-n$pr#*<z;HDD1#v#N|AA5Y*#X{U^`Kv*61Hdba9r2eHabg2rvMNzG z$L~undkP2ym{3v&_GFPBKX<=)^Zk$Na}9?h-&p|0N|hC`UrRSmElzEhT!DQ5kEyqQ zYx;5Dzc+Hgq`SMMkrL^Y21P(>G)PE~lx|SEyIVrKMhK(38z~V6f^^+`ANT8X9N+y1 z`(b-t&+|I3$0LjNgP=N}hx%^!s9iV#YzM#`GAyd|0nKBW2gt0G;)HvkAKDInkLQYb zg~w}kC-OXW@U-<?r2A^Qqx%dl6U!${Ij>;x)`RekK#HO^P((B&U!#V+A2fj$&Id|s z5?|k5{>JmXi%deDlH#u7!d0_~h$;nS1tyCRRqrzsgg$=FH0a2+s=~SOfU<Y=#u_~y z1;1QdOEDgvABW%l!d2pRK;Me3q8ISu-Le$j!bXARujhurxD5jdtmIyz6)Gc4&<xdx zagUti#nnZG`)7Q{Z8N<ik*q2j_<9N+Pj|rYWuou?Ui*JnzxwT``a^O5fGpoFq!yuI zc#xx_5C(dNmEaC*1=46iCzGr8N*c!<1P9)dcW0b+E$&Zt`ai9G*vL&KO#Q`9Suk9> zb}k)WH2-70wcVzr7+$-q-1P0qV3u)8JIqQ)aI)^ls>a*e6;oYLw||Q#v$^SLtgVHo zS*@?5vIsIlDC#yiX4c2&<Km){e0Bb<fa{K5-^oxb*fR|5+3nMHo;|(%ocC~SLwB=s zK-+nsZ$yG`+kw-##yzh<u`{#LkTX8gPD>UvU+Ng6Pus2nYD2brP1`QdzTtlRa(Cy8 z1kEgGX5ucy`2Sho!-^&>kRKWr=!j_(cj;xO#|HKB*Ol|t%kRT`6$<s4BZ0U^tA(3L z<_Jrnvr0lfpP7J}Cz}gdgdJ=2m_v}ZUO6U2F|*0e#_HKNW7Ylk)qWan+X+1H<|xVZ z%MFYZf4Z4+T~wYJjIyEuHq%PxU#Pk8v~g3WnojmYpuV{ni8?U#x$oO|AdMaf(SM;@ z(Oz>B?~2gD2S6q(>=T7#Wsoc9$Nf6XOl5JApYwaQyPqnZJ^Tpc`M2uqnc}fz5%eye zDA{+<fK#7a46Ocfc2HE&=SuR1%M;-U9JS?x?3fe+vWDf#PaGjs;-54fPyg2h#G~!H zUs|N=9=>J-iof_EsK`P;;ea20W!Fw+b;-QO#)3-@t5ajdNN7lJZl#v#cO~-j#M$)T zL&k}@j;_Y3FE71Px|C^Fl5_aT=Rdu$Z_XBlPQ}i7Yh(*_BvxjLZ4GElgXG10gL!!< zNkynxM4*4d6k@&)<-iL7F(H8Xprv(UwDiF2x4pd$GE2kKifEyrZ_W%vqA?+BkYPaz zg6k+W!ANCzu$TVtR*QYS7T)JcDP&1Y$|+a$%h~Alx^~SmL%B3o+xJLO5WSq(XBb1O zF4_urmb;iLzbhQW*(X>;ssWjB9sX|72ynKW;o!x)B3`~HF8`C*OcMgopKW7R8Rk}< zK<s~-a`*(GM#K<wqv1hZ#v$RB<h`UKj`7IFxl!KBFDzg_8*A1<A%Z7eqi>A=#VFSF zg$ip*U9iM-m^`?zY%6fK%oKrP{=;xWSVWLNqNA!8TnfiZy>H-Y+s^C~0A^!3|Ea(| zV$^ceb_T?}56iG$HCSvy!5RQVTF3ic-M4baaoC=BzXkkr{o6FTcD3yLm9}D3;!P`` z__tfj=arz3^j~Ykhyjfj+hyI6bfCdv!tRS%x`*KdlTFU+sTFR${YGzVikdR5W{gup zBP`lAc8<M?S5-E9yTytSExz!}5^In0fOB$TSM;%aH2`*bhd|xSCwBnfeP}uk{=kcY zv!8+99^^pz;3^20AFl!t2%)%aRA@s_WTl9ZTNbdH<R`ssMdf(~F^Rf&(sStc|9jl# zHraju={AFEfmW>Zpn1NeNrqVz2!Xu_>?KJK3hV=>J>j@BS)L=y?eiaWv(>zwLUQPG zTF;L%mP_ok=(uaX8~mxTZ(t>9gjD43TJ9&#H-7wJ`Lh-ix2=yj_xF*kCh+u|^!ixS z_c0b>7SW9MYp(e9qn^h5!rJB4PbeBc(q;Gg%w1a)G%--D<1a_t)t3c2^+i8sFf0`1 zWK`Vh)N?Y4Npw6&J?st$B7r8$tGNER3BGh~pS4KR?f6&i^f2FmwxY#zq6ZQN3Y5zX z#5v`$w*(_xhPHiaeGjib_uOr0Zr+`p;80zhU@crF62p(*sU$fJf2y@47t~y*CRPp& zCR8Fw(26G>1I@Uav}STjcdT`+=j+29`1t@ly&3p9zIREzAVg7bH0AyPB^t?S{F~M) z`65rx(&=H;q3Z_<)0?BuZ(MD2AjYH{uI{?}l_kP;tXhN8@OK%4I?|j|B(3p(NAB0N zY?{B^9E%_DOhQ?u^|jONlIB;(#5`3v>_6dz1A^Ay$tAzx@b*+c^bTG~u-5SywTv>W zjiIIFK1L_?t_!Fnl>s#N`)q`r6;{*37)6K~Wu5UW3ZH+{GYMG=>c~2~{;Ofh+%q$1 z{h>$6Oj&zO!#$rr=bjeuuu`(PaW@?@boDU!C?erg%^t{Oq0B{3plE=C%MihD5T4i{ zDaIEogIy%wx-_OEgnVt@lf9duV$1V?-bwxTA?;Mzq{Z0wAeV-|p-(*BF1j?C$d2`0 zI*&VnW$|!LODR88AYK-vA>Se3qJ-xPTf3huv8Ow_*j4xgkBWkmQOmRO5lAEO3v(OD zv&R7*6B@-1Xn&qLBLv6HEJ3?)XY)V`Mn;q153L_x6g{S1YcGvnM$ZY67S&K_oB{YE z8Pp>x0|hi8;>L?XCHkb`32_szi#1K;!t6w_5wB&>)$r9`0{O`DuFljLeQS(QT7!_W zCkxwRXfgz=(wRj_#O)m*rX!Rf9Y(Krlta#pPh@m=PslwcMS{3t!QTp`Sc|InwK0kX zGXa+`Sz-Tei*VdeesAR+3l@ELx^kAqD|%kXm42T4jk8f&tdeUa7;xl0h)~Q|fMJ<9 zLt=$mTV33>@u7x%41~h2)>m+TMfvTzSE_cRYkGKTCXa`4WY7Ilx67DL53@Z_ZA_{m zS$cT2-=+X!%R0Lygcsg@(%_W-DC#ksk1yxko@TqxOIB%p&pW>7`u*LthD^=m6SO&G z(u5CuLf3Zpv|*Xhc)<-<mG#HVhQp!$AHV$NcR-9d!{9IKp2&N1>b%-+b~SxQoLhmi zXdwhK?8!?8@MRdTrEB5ORYId-RE{=6!Zr}>a%QG_xY0AU>XWD?X*r2OM^KvY;?>Z} zzirG@ZpS={51VfH-SvWKvH%nr09nLKNMJAxZZKbDa3466elo!Q@9tdQ^V!TrS<A!{ zJUrsar^(*3AqOY5k~%E%>%~`%n&oB#RBnhR2KjXDKZ8hW0EHTsqE_(hhSrRiV~{~U zC4|%npP-cpv}eJdtxhZwNF@FH0G~W$9T=Vgq~2b+2&Q)^4o{W{0PCh-EeBc6THBPB zUnQ<AIDGs$ZF_pBA>#kn!uYg8PcwJT>tt5~Z^O60W~k1{^zw7Y=i?gtqPeEo*B^GQ z9BT5FWlAq{ct&*iz0Q=^0uHZMKTF)*YxdkVE^g)tRrCjX<B!V32YDzC5|6Dx5IXH> z#At+!+ggdqeHuEhAhbaqTWAoFH4Vl<>0>x)3*zx_30)tj;S38I4IT+jDt79&*idvQ z89#l~ezmIUhvYrdh|0!;nT;#9BeCB(q7qc?l7=O71wty9JdZ82RlWZD-#_Mc-~1xm z%-v_XXy+XCFrc*4AhO>V&(w3RY8y4i{;_3T&RXY#7$eC9hKYHHQ`%vUqJ?qG1_-dY zv4s5L-SCQ~))<=zH+G^VINfN?k1Fq}`e!V{n4a`bm?@Afrs>-{NrInG+q}wANl8-^ zz02!)194sq)%m(t%ibsdetz3{exy64@Y_Zh()R4ZyAO%Ah={o5HL)?)w&@WTu6)u3 zc*TEY_<<(gzd}yC&Jh(9CkA34r_YsEmzkhEA3%aK5QCbWz0#;YnE7Sy2Z;5q!?Lj> zu)M7@sRAGHC*)}zJw74hbOZoyPY0+EIw?NHDC)$}VB)}K<U7TUG7EA9kuU5Skrch; zxI2eq^eC{$gLoy)hAzQoPrP=_>l(jD<mOL&pbCf@ECcP)B9Nwcz)i~B3gvM2E>oZ9 z8+0c1x*xl`K>kL4?fw+m++1^b3BJ;9V|>M|t5ZK$%)@=8o+)Iri|afx>}IXXSEg{W z;Fadq&aNkx)IlVU+J(l=N1BS-Os@o#hc!7F<{2XTz<_jvNHdL@fV^z@tq;n7S%e2F zPz`ORD+{NN{1oS2>Osww4~7f<hfeItrU(7gG2@_EI)$cpv`piSPo2jM0J~}HF!9ei z5WljD^rB$Fz@;`~M1eI9r)Yh9Z|7!i=Jms5`F>4FFZXWo%faZkwd=Scx-UDnLVR-< zPO+fok$o&xnqZWfvR8aeM3CbTz?V#IzoQIurNZgD{~?gJo9^jw*V8x+1(`9m?De<? zw^G?6%cy*SWy^pX3W$q{;*usDJ&R6%7YoKH*Q$64HFeel9k$@)^87`VSpTC(T^e42 zL^dCa@}<WOmj}p!yy@|>Rh4BpT8Er0-0Zx$e)YbBuEs5}d{d!_zAbr~+v2p^@^5eQ zDJtS?P4xg;9<(knaeA>1GT<!|HQYhM%QCf-@39qC?SCIumiOhLzwT7OtKp#NMDcQD zqYLw(CS_nJbH#IGyb&4+3}IPTJEovVpAzxAqj@eSnbNzv&!b4cR1iHS*{uY7yc;wx zY*-c2Xyi|zpb!(UHJES5A%G~#IzyQVJx>2L)K+7R?jQLV0w=LY6^fUyJ|us7qd(Dh zf4HMT{yxIVw|Z&C>vxwMZ`Xa!FDXOs^Tw8d{e-NqG+g1ABN6K*d+^cu$X=~*F^(<a z>Jb%Dpb#H~Yu$*>u>F(@Z{uz=;LlJQk4bwSda}Jv?H;@M+wE|f7eXmOmmiFQuh|$X zvKi42@GFRn(1Aebz_qrXXf^zL{nr($uDbc|LQE(u!fx>Q>XAn}l_Q<2+FcDcaHXp` zq>SM70MT)RKn(#E4?DcqEBe?_GJtxiFC9jcjWXNm2xWB{vZvYB>AN`HLf#EO?iilt z^fU-ACZySy*1s(k=Z;alRvQzmXPv1w#{4HsJ}G9e918AezZ)AOnuE|}TpIDxC$)97 zizQJIORPD+K;YUCYW-V(SwD3XDdVfIF4KqWDO4xZdceMO#K`1H>P8eu6NFPxnz1im zUwMr%&YiI4S2j+Za<KROA0#;Q*df>NV7%u^^IlOnPY`luG9d3Pk3y|1O@CHv#f*ww z)r+Kt3>rFh{Ehf-eEVp#+5M)==tSa8lre60&b!rHW`!n_sJ)r)lVwlBf_S+8-2%D| z-tk(Q5bl+|UOy1pRoW9Q-V5w!<AYJC#Z-p2ir;<gxp!*n^Nkl<8qUa;R%1r7Qp3V} zFX~-76PaA}))H5P+1WM14o<s1*hZl_x%oO;bHnFC<kYl_L7JB($8iDkgR~ewlu?=) zJ&PVyE6cR7#Eku@#KoV&tE(TH*KzY`gM0?hR5!`m(cy(plnCpU-8P-5yj_s(So5G! z3wt9Q^+xE$t9Ke_Y8b*oqr13AR;Ga=%3BTyoG_{j1k>AkU-6X_z#*?Yuzd3$8MURx zfcy^pcu@%OA1B?7F9_h7|Gn<<ytBZVT>8d}OJ91oL-+Mkp(vV#h?|wJlBTu?ek2Tc z`9viP$5`T<eyCcd%64j^mEiC~3H8S!Z+@eCr&U;Ffy}%Ygd%j$e>31@#PIZ~_vJP9 z^97P$?ysu5IA-N)kov)BI~dG`g3gDEvPxtT(P`DJ@skX1s}{8d>CT=%?R=ORuE7i6 zQvsvO*~T4Y5TYls*9-p{K6bN}hTvcjjXDQ&zy9N&Xyy!@DRds_>h<+x#P<=E?oe4U zb#}8s+3FZxDztu!!N8^)UnG?kjJ5-c&JV_i2kT>%Y5!DjOi5PkPYkwi>0eb>xIJv} z`#TYl+gT&3U&!}f9$g_=9Lx?zgMH`0kgV~#SWj#eRqCrpz0A9|@%vjU;`s&1wWD)% zpfM4zHnVfHDXYa?ap&-;Gvccss&#ZrV?=(b-KV#$1qgR;O#OK3TH5fo{sIJUc}7B2 z8$qm^42D~~Cwj(K2cZ?A0DeYLB=LZT3VwV@6olTIk6Z(e>ml$HvH5xGO^0h6H8o^( zHH{~%LEqRUtKI+D`gJlN`!)Xj=j^TrB-MDm%p~A83keoh{k9>%b!7#?$SP@87Ur@S z?R<xVlbx_dsT>}Od6f!1<)#yTSlzr^ruv_?Ku~;@Mv0Si;Ls|iT+aG3Sj@+r&C^`j zjx;9+HaA2GKt=mAt04>1)u$`w4+^eljv1@nQJeAoG|ylw!ju)>{PH~I(c(E>;CfdM zy5{}sF5VGL3^yZQ@5qi5^;9pfq7P<O*U9vyXzz6n-XT0&vGcoLeur#PpWsQZIj6K6 z)mBX-d3Iox-MQo9<y1pP=Q(PwMsCoXF1mNZy7T#6KW#jrE~v3w*PAH8y%z`(#pP)z z%x{s?US#m&4>&c(2y^d?!46AVRJn}cq)Y<*?DaA7z;~wiO$z%_fSC-RWPEUPaqM0> z{kgC@hVGTMTf2AtOpQOuruXbgp8wX>&}S106q3k5H9kxtOYM5o-C=KSrS5iey-6h; z;^58B&zFO8-=4Rt4gzkj?p<25V-j49L)lqm|0L=xT5)2>`>@(5@r~fBfQ$5l5~&Et zwNOCOW4Sblj_3TR09+_O(O7oIRLEhbLC7^($hwRyL_{<x2<`Z*3CDceC<nQ0A-?(+ z!>+!5wNW7vIqRq1_P&m29hUaeq)9rHr+2iSzYrnRtdX;|<e0H~Q$pp@$|%^la3NGN zLR^+kyRPo!zad29r;^Z}61<k?i;>t5V#(FJrEu023`eeUXtSZVkf62&`CheSRRw{F zt>VOP6!q?4segYw7B*XOV{e9W4jM6hZCx@&oMJ6|2`gVS+VrdGexJZK*-{2I8WSe! z{{M5_ZoB$HUMDybU~OPQ5RFeNDbZK_UN>d@4HdJrF4IZ-k_AxDO}E_iWn)5{q43GL z31P<79%%y@8WIA|Hy#=VS(Tx2C^N#(xjN909@({J<Mj}<{s-)zTcpNC5hx0d)L^(| z`YvJ!iP3c4=?d8Wd_&aozA2Ov4zEZ~r*@Pz1^`e|#_c|!R53Fxs9n--O?CarYx94^ z<TdfT%6WI1EuMmD|I>D|d3Nonko=&{dkBeV*Cl3&Xm~L*kv;8#p{zzB7PRJj<QNGb zjtnwkz|<2QC0zO*oOAybz<Y<`FwpUr3*c!^=n4!rwLrtiWWyL8>*5^I$7{fGVK@KD z5ZoRqHvNiEX?1#7Lpg~`@2CUMZ_J{5d!PRbh`yDIEsR3VIwHevW%y>4x&*TEQI{Xs zxM1<td93Ur#cVtf_y^soEx_+|`@ZM;=qjd6n8&X1J@4d?x8}qJHMgAxoRuCFnjSND z6PZAqAh~jef@udk6$mS%S%Y-36NU{6DMyqz=@%Nbu#5!pvnbKYb%_ol!A2qoF4r4t z=nKK&@oa%~7*O9`Q{Q~i+FU!IE51}(!@F6qd~o47(v7~Ldfl^`F<fT7g25G>op>^K z@>_(r=W_e>x$OCb?!htOm#Is?kH00nU!O@faHfE(A}b=2U5B9eh4)ACxZ>IYr~A7c zWW_n>xgT%iVdEtmkLPRyxnl{%o4`Sx4>H(HB7&TipMI>288K6t@m05%VwIyunW32x zhV=)0F=vm?ra)m23LVLmRsaR*auwL4&+a7*)*2Kb3Rb^8UfIxj{cGNSU9i4Pi-8BE zN5_)Khr{G#;fH}IMj{H?sxG8g8yXi<e$Oe38=F3-k2GqidiNL~K2Xe|;Y{5Q=rFxz z%1X3>Vq0%Cwb_qXkAnzS8(Bjc*@RSrEmPNNGRKpBQGG>%`+ZL#0Bp>pid)%#TZ`2B z>E(DxyPizmtL5|zm^%r*8Fu^@BNw{pKb}+^A_0tg%#=b7Mm<ss)NwN&xzIj?1BH%t z4N0T(+a#nSYQN}u-GiKoo^vo1#Ti3zzrrGlU~bPSv`#Q1&FXE?3)&3wNa<Cz7+DOX zg?NIx227=%I;6iE@qGH_?y5tNCpV9Lgk;~W$Xi&isBpN1Fo`i<tGpz(GIwrS2KU?H zYMhoJw60M;1o#+%-X&O<q#XD%1J(IC86yzA5A4b6>d8oo#WkqSoQQ@E98&@Bbmv&h zzE_wFA&#h#cLo<Yt4`NbY8facU068Lwq6eMZg{WieVcua52R$Z#mo%>CBT#~QdRb0 ztBppwGAi)C@{x~Q$E;7g&|Lo$#*?$|93Bh`MyeU34oA(^+%l)Qa>FtwG$GrWWQa=U z&!n<}(kZpv^);j6I6y>jqygzGdPYUGB-nU^J*zw{|HxX6nQ^T1tfO0Tq7xe(8`3Z< zAP7#CPy{vxhB8d_xk_aJSFgz2CSpBgym|<u$|G>s7P)ihw+nifYte$*oN5Ygp0o%o z%OXDE+Av~bEdluQlZP33^%X`);R+yJR1bLq_T>Ufh&-i)=qmfPUu~n^x!quKC_ZK( zz)GHVz<iqKb9*?~d>Ee_8t@Q;MNPx9J!Rp0y43Sfb71O!x0~^D-OuAOT$@XT?Zx{_ zEl~8@c;@YxJH}tvH*;$z0tM6>i#vMZu<Z#nlhBuZd_jKN{l}vk#9$2A+w2Vb30daB zF)sR}O(Pf@1NK&+)<>>|>(idjrrB4s)45%`T&1%d6g4%(y0$tUX5zEvsaG%hPef|{ z5xIu6lKOfu+I)<7Lsf2M5iG-ZqC5^=W6sjPv~h3S7GK{mO*)lw55BKWq+{^0g}M{> z62E-0-sf~?dT+Y%G%w(OCt}amim9xSI#zFS)>CjZeQ&pjFLSihf?Y=ZbYDGpGRm&C zS$K2hBY5qH8oqRn6+u<2G&SiOp^Ni76!GOko1MJ({ANe;XJIKb!EQjnn4*UD7y=C{ zjDZpf4;JSJf2>dEmo81t+9LL$ZNbsj;%o#($0NOUMn3iClF~CjY66C&&Q2erzDwP% zns%SUY2Q=yM-~9!qaNIR>4oabSY!3&On&;KCAdS1H&tK$eC;^x{vGhJ@y$fcJ25)N zu8mijfUP1&#D#<Fd#(Mdv1ov`_g)<)M(_BTAP^-+S~G_MW;`~w1yPKpPOVm#)D`hK z3N+$7TH(wgvHLUV|I*a|CV^MNdFuvWH(Y~tw8-ag2%Zu>?BkMOW<*1$#1L^ho+azK zQ_QCC)4G)3cHC@M+q&zIU~^)AuyOuzZ|^#IBeXV1172pG<4qrNa9r7igM(_F`hw3w z;QZ_QI5DErkW9bzo~zYFgU_VcW3iR<t9`+e?Aj3ud2cUn=@Xb#%bAc3L&+jY9<M;1 z#*HQ#KblZR7DTAus$Z#B%HcgQGg9|*<>YsS*=u87E+<pJozzFojW5rr5m&U7=3*A? z$Yv`Ne%w?y?PW!d1qTxs1CjLv4;P#ZRx5XdH)(P}u}&)dMOx0p%zDXz8q<!Gd$#7D zi#|g(p4`l7TYaAC6?_+Ggo@#y8UA_ltlx&^3w~0wiq#C!>@|l3j?3yV*RZbu{2%B9 zR<3|Sjok^^eZ(Rm8$LB|1dsdd00cdfoG>;+RyvZoH;e!qr~JBFO<f#&AeNmuOz=(9 zed?d9nF>!ImuJv5t;v_OCH3p|9|u<w`X0o&`Nj=m5H2-l3g=&`T3D#$v8aI){L9F) zL0hIvIsv8Zfrqg0Ts6xceP;1H&7+Fhwf4#3YyoA8%z_M|EY_ppl9dLE>T8*gM(BXG zRn++U#>7OlV1ivD#vLJ1)R>PbUxw!+Kw!Qv=;Q-9aepsy|1ZOQArbK}DUcRI-tm`r z19Kf(6d;Q?_+47l!kJI3Kg#p6m#<9I6436Y>LyJ?!Hkftwa#EC%*fJ-<U_TAx)5Us z5a{7)Bv(LW7{4ODdqL&Smmlm((^2{^1u8;gUpcN8V<?p?_3MKHStS*%f=O9b!cGmu zqb>ufJ8mMREp+~e8A;H`r;E>0zUN(HaZ0KYO7@r{&HLgPSQ&aApf^tY;wSE;7QOUL z7}LRr2ozYkO{TT<R&*FqIXN-kl6hys=@Gs34kW%c(#;ubLM9!3U_>pUlaI5vDSXDf z^G(iFE4J12dFObNxpEQG<+l1pg6X8BtM^o@;W_4d?FptndJmMTO=#m~z$ruv{s#nd zB35oaS8>x)*|n-!(6l}f1ln1>N5RNPE6Q<p8X6Tk|6sG{qfKKlRAbTYh|C+v`c5UD zKN@p4b$5E0b!3ow7-1gaP^FotG>lUa$83?hEw*R6NqNqZf~^HCG5cwFnzfVw@`%j0 z!AUac7}7bdr^~#=B&G5=sl02@07;tsF#b=^-OjG~AkI3l8#!?o7-rO17QQwRiB)_| z`BNp%fuIui+ippymA-95^F{O7binzhB=TOi>$2==(8Ba_EiQud6^uTdlD)StR^ZC} zMP~AknEp>C(rE3WlbiZ)9@6~xhCb&$&~;z0Mdgg!S@d^yzM*t{+tS#^O?`cAIG*}8 zHiKR4RlfkYj$<DW7?%|-I$_3Pq;79phb64EH0v|Qjmq?T>)e;8pbn{f*t$|GzcZQ~ zcm7`xNB?q45}Q|QA+xdsmkn0=6v}6(tq!DIdfT4O<o>YFQX?Ie6BN?UUdRA-w4sEg zvQ{_7A52j=piF8^=Llu&WveFz2Ua68<B6EBHDVk-Svz?XJc@5wJ2_iK^w;{c<*fM@ zd=K&&9uE$hY!eA7+!~-i%CZ<p5DhGHrT;oH&7s4<j-3Wk3xqCU2&PTZCy!brE?-@x zXiehr-ojqDx!!3a4fnr>a3y^#pDDGLsBvm!F(Md0G643`>{p53%4!SGzTi=b(+1ik zD(kWvVAW2cu><r;FLb}En#C6*2h);CI-h@RY{JiHan~k2H`5wokuJ}@UB0YY7dde> zjFic!CX^GbvnM$x`l09vE@oc`ERQD;vC?N?K=C6<pf%L3oFk+T0^%0~Ix7PRWU`mu zDy!fCW%L=%qwpV(RPn+{|28Nk3ylC}Ls1vLR(|rwFSFU$;JsMI)ze)2aeC20)BXp* zEvTF%$kB$CjYFtY$51RCEsFQLF}b6expFvyADkB924UQzwhgijt3tovWYLJ*9k4UE zOS~|uncdK5ynIqzb`v;J7W@%HQEk{dX6H#RM(T{8WcWO1o-QuF_P|Mc%x&{e|L{jF z`60!-I?0g3?ZsDa_@0GNj?ggYFUA=ESHS8EIG>-CYF+0yZRBs%oc2A=1j9f8>gSHb z`Sghxy$<@ovEg|~exAj3Kt8Wln;3r^w^}H?cfVNvsIsF(lfP9i_65&IR!Ke!gD{Mp zlpmInA*wHpA&?UN)qhZ$tC&;qot$~5<qzYI*W^^l4z|4P(d*L&;sSUQTvx&DvGgeX z^4`h!az=CG^~KX*#Oi9=h>yn)8!+5KAV<^2yj{TLleJrjs1-`b!4spOz-v}M02Ija zCc`RFMuJGD4hIv4!ip&u?6%$a=$835J-s3@S>{t5%g^W-NSGGZFA5ivieDr7Q@15K zf^;>DjYwhN!)=FC$HCUjG`79;oVSxm)ob_6WU(^<BtoB+QF}_QnkHWMwPh3oN@h)l zX2dU<1MDUGL3Y`lNTIPUlSAq_5(Q(jAJ_U`|CTl;*N~XdZ6#i*i;1Xq$+eo;T8Bxh z7ghJyuP(xqUl|B6$xzR=+1WTU)gPi#qyz7w;!$uX5gMR<d4#hY9|XdHs%$*`)(qUB z5M!s!gb=|cSI+k2CNLnSKnJxkokG0%%hd}i#op!1?`zq#VlsXU1;-0x?Vbe*YLjEk z;Q}k}I>~W0jN2dR9u_x!5KXA2_vfhBn^4PusAT@J$WU265IsXEBl9bDvew98-32rQ zjBf9t`g<qItC}=k$;X+DZyS<q<U@bUgE<U@@=r2UoXsL!=rCu4CB`w1<YWk<`Z993 zaiFL-ky#^&`=bnF-w?(f7qE@*lFo;<R3G$E0s6nJWaOuIQwc^hk1_*EQz2NAda02j zyjvL}yl*ZLZDbog=T9YKiTUL3z_GQi-_&R3Jk`@0Fwdt>B83-(9Nyg!OWfk|+guzk zdll5WdyMmWSf1yiwUQ?QMMT)rc?YdK+E5OqzMIM;51E=HZ|*t!3oZ8ZyEpJ~H4?<| z(<Ty%wW8wtLI!-&w<&n0(EpUg>qmqAR*ZPUJ>6>#_tS13GL%k5Z`huarG9l^_DUAB zWHF9!MT21ZSTzt)6brUV@e4-M1niJ}%5>sYI1PIt7>z|=Zqx&dO)H!{2wVM(x+Jdg z*0xT#x*lm^_*;Z0;qP-X^f}M#ayN_1my-fdsYGltGiP}%*0!@@t+^&CA2S3JNYD#k zC!gShp|R$#xs}07CX)hshcdAG29B8lL8!%nk@fmuY9?7z^(a!+mncUBYw_>c`&)6t z*nacOgq>tnJ!By5&?ntY*K~cf`RB2}J)O$dz2+?_${{cr3I-q%gbEkUS`@1464|NX z7(vfz6|sbZ1xHjym6Na_K5FFbVwF_vVJuL9E3*aO`|jiI?WX3pwczs^K0L&?CG=7R zib{jY{sluA^#Q0owh93J$iEys2G1kgivtD{qyn+VQ)Sfxwck+wdmZ`MxBeH))8Fjy z;D-2gCyhfI2OpsHt(yZ6Fwl)7_^ZmWryY!xwZdbj;=uUnL~SzCPFjeZmjiDp_zoh$ zq5zL0X|N3&bU#~{IVcXr1pvhHY(!;XjwU*zBI5}wN%6r?mG$4yvIJB70+=Q1PB*`{ zFAI@zKm2#V`_Nr7Es?i+v21wlcRlYW^{|xi^<7ePN|la&p{sdNu@<Fxfd^yZmYOu6 z5lVs92u86&1vT8qGPvz4c+G}@=;H&?2w~_bAw_}}AZEs7W+C$^eQk=i{DxGu@$$Zz zKz~=KgOH2+@V$_s1u5UnA-_F|7Vc32{7fEws=~0!a45h^Iapkj3RI|;c3{lUP8jXB zkn_gdwW9h|$~8GgU-#vzG$y+Pc8xMd=<C$XeMa<=+^z0+ttSK&5w53ot&ddKT~~+x zJ=bHtQht}~`7eL!zg92^sc_0fT6)=7c#A>089qOG0X?k0tODbS@*lg4m_q7d0-`9+ zdMI1YPsyP4?1xN=2Nc}nCv=pa_S3;Z1hYdOnmS)P166~MFpKU7*HMg!jy8(ksQeeo zks;0@PT1QplDG7=tg~-*!PSvczPHFd<i8mkNw?Fyr%PT*XG`y{K54$;rSu}gSnPqo zNb`*!)%rXtA;!5z6!L9VM#~px-IHsrr*UMwU1t-Rr_DBUx(3vmvwLt=2@eC5D3EeK z_CIcJW+;AfWIbpOdB=C^TC$pE`^R<L`?O)x(|wW%x_NuXT|~vHukzYH4Wmel2skSo zg0EzTp+-m<L87)rx@75h|NC36&*S5PshGbDChc{az8;yHM@h7;n-g>_OFq+BCO0F& zhQVsG#@<GGKli>irJ;igPPVB*RBqsEX*y>bcbw_3{yYTI=y-h^R?iCR$OfarvAA%0 z!GfxMq*?$a<yWLTeWC(nwAi6Da&Kkc5EBlpG4SYW<Elhaf7e+)`2BB2hkvVdZMiMr zd21ADS#)cuUc={~;_)QH$467E%SIj<XD13SQf;WWmiI5=mug{ToKbt7jNPW%`A>Fh zgZ{vrwJK!=tOy7NElJQ?VU}9%uk8*bzy2CZa~?8&dHr4L-|^kBjj4E3Qb(!P9%ne` z!kQ(&CvI5czZdw{`PZ*gw)iX+@Yw<Ae+yOVyMU?vG!ofR?hSYe83~rCK8OdXLoXkL zP7*d4Y;lIKEpLlk<YT2p{CalWO=0D=K(q+r<(G>nOoXHn4IKmoX+K%fVleaez|cWM zu?nLUFeBsxQchtYjX-<uw|!}dR!2OPhQ8jhn9j|DT;jOfF`7!ZW>UN8R}t2e7_R9| zY__a=r!^KeOrwwR+n?m5T-j*gF#yFyUr}b1H`GYtfm8D5gPAB*eF9MsJYdg~cSy)A zkZU7F*@s1lpcYv~|MkCpYLCf{>hl>J&S%kg>5YNZdBM|&n(;4o)cSa?4~&N&O`8r- z+B$-56R<2BO<4WLeU`~cX`SR1kLw&9c6$N;#85-GQ;D6O4=XMQqx7lG<vE&26P1y* z20chrLZpg<OTjpsr|{Dsy2l^-#yyYC9klIcR$<!6p2loGaVVjYioE-0)tv?~>SC?x zhe6Ei?eOo^UN;-4QhvYweKV1CF%ysYRKtaoi)>hh9`1v$xa7O$H9ZOPFUP=t2jnx7 zd#zamul@1Tcizzx@`<7ENE5Qi^D&{tP0JG3ioOS-N28QDhrX+nm&<ie6Tvu1SzWB+ zmGHVpuKyly00i-1m2oZn7?j+pF)hVHTb|*c?Cdduln`GnBhT#CAGb%V-+P{)Dtte8 zIZh@N30c^TiZt`q92**Plwf4R?9&+r81lhvW*~@S1&6C4F-e7=Q%(0CmB_lE?dGZE z<G!z+i4uSJk9r|;o+15(qD-6NF)ZrJk&f6fLC(l!B;a?AfyHZe^wLON*4Z=vPl$hf zB0=vOz%y_-PTF~>Y`W@^8YALlg(86{7I__ks40(KE5J=Jb8r%~_0(y#k^P`^FopTi zeE$V(V%TDwf%10dTzPhPW<kF1d}d~YY;(=~uI>43@-B{7(r;)SZ%t^$Fj#I<S5d*6 z*h~Md%88$^jVLt@Wew+HNaMl6^~q{a1l{9NuJ5<g+dR{NzZrN^E9q*oZ5lse`fKy~ z6Mbq<)d&iBAOQyu(61`P{3FXI!rRm9{iX}#*}vtq?YR_nXraFnw)zUfjX@GWrZdCE z5dYo{vY#%{ARROs4wX7<(KNl&L<%pc1YZeSQ#NATRB?gjem4%Ts=eJdF5b;fViUah zs-uzJXy7^no^;yS6o{S2(qlk4V9^fGuR{-NI6K*Hm-^P{pIT&@f{onR5gD!>@9C_g zc!1R3d1UB*>ijmMSHv!PE5lz{&MuDwwAKkT*9w=NYf_K%{Ycm1eZLmewD(!^@01>5 z)lDvlpU;^dy1+uJXb@6vH5rdvqL2&JD_53J3rwQ(XXi$={tnOh6%sT1d=)Y2_-g!x z2(8qQ16YX2rgLXF)*xe`WqD?J*woKgLRS1sf}GZ+7tHoR(<M#3lb+u}7D{<vey!V> zdf%U`#Y}&}9_3hdUwPk8V#6Pp9+}bFgYqetn_MSiEFL^gk0O|n7;>D176`C#b;rjL zRL({tEN6QpV+ji^JSXQ+#G8&G4~ET3+wA$Vy-G{VR24a?Kzi)ek^bw4aG;{JeDkdu z+?Ef6Ka>JZ3!{Oa|8<{m9ai>RuU`YVX}P{1MJ6`uJRx;9R{F^hvIZ0ofInI1Ajie# zSXyqOua-3xDZ@CtS8ijPtX=sQAHvewN0JKKKn)}SwkyAUf$QoCJ%5@)de_1{alnj_ zgm4V&ea*Wi_Zl*3|0&))%B>rm8$(T_n}g3AP>J&Y=8*P&N&as|rpL%bp2s{>Rv;Eb zL4<hcP$BGKF|bMrLXQrfa6)76g@c(TWRMLP7aRI=@s4zkw~!zldv@Yv1LQo$0{Y<= zUj*RHQUtUoqm&7#jU4U83ZDA&z47?FP|_7}@%f8qTc1jxWid~cz9B3jmHo#3NKIFQ zJ%MdQJ4Ryf49C~S%Xv4q>)zyU>-=Sz$j0W<@lM^x%~f?mDlsc-#;?o-#!7@Vz(g30 z%Q0q-&xht?Wmw-!yB188KSTg?o8LqLTy0TzZFl4dmSMjwt)l`qibkulueZ+f<U!Ew zB1N0mpCx=2Pev79EO`pnR*?s3S)F9gVart}Q1J`4St^hf|IfKVDb-Z;JzMhPVHm1u z`Z`OTX7mOu4QmOw+p+)N<9D{SEskj2n_9W6!5oYTA{itEB;h*K(_=Fw%LU1J{H(Tn z%@NbHwK4s9;~w6!A^vRoxZT*$-o0G>O4Z6B;x9z<WQ7%-fD@iEye$tAHmhSC4F<_$ zr3Qw1R91yZD>}RGhQ)q-(NWTFEXeU(f}0WqTH;=m`I*dxKIwps=2lJw<{J%1|88u= z0gaMDKVS@Im{@yl1A-)`=q+43IBCxLSvh_WHMh4}nJ`p-fIi2ZK5c!4N?xC><865F z)=~`)>EQ!pS28}&6IK>-?ud${Pr7nNXW>yRzqTvGYQLL$K~C$l6^@4|^?0SkCfv@d zWs%yE?6x5JdjAk{f{4WMaDU4U?bojvNYqCxL2stzl;}j;eTH5v^^;4p=?RDb>SB;@ z)hNy4_d))7K}*&%Go8C4!pdM-WPg*=c)nbh@pk_mv|A3SYQ{Z*y&=YCSoRanX_gJj zSCpp=Zjzx=xtMSt)IC6mVd_P2GVq(}HJafX+U}-s%OOt>2XU`WONmWXv7|`;iboc2 zvRO0EY&<I6y%%eh{{^yE4wc^tE-u6;V2lVh4=a=g5#rPh2`Gb)+QuCX22+Ag8yhzt zX1GngwtD-8YREqTT#9cssNYleHCGf_*P&v+`YL9IVFbwee0*}P+4ZkaH9`-MXWd<n z(NDUctad3vuhf41_GV$wt!%%gn%jT-E9#J59a%X&%eU}A7=Yw+JWVg>e)PCBhrP4+ zad;i{_UkI{_a4uqovO0h>`t!<Z##d-XD&A>`>G!H0f2an0_Up^w;%EG;xn;aJQ?a_ z$5rdu(KM{Z8a!j2t@D9lvQhZjM(cw!F-xWr#0+&bw0J9Vvjyv|kFc|tytZq>7P?Ni zXJ?Wq$1FFDR(8yZBHTA3V`X;U<e(K<Ynbphqw@~7hG_=US(b(TkZFFdj)7Qtu!^b{ zC|~FnBzU|aLlL!OJkgiH*C(<M<4QFm+T&70V2|(T*t6>Cdydv-Ourl5%DcI}21;aP z;AiiyG=jR+vj}chh}{+OY+$xzd4+(-LJZjbPlQSbZ`<?XCC~rmryxZwt<mJrxGe-q zd_Vbs<-iZ|!}D*|cS*ozDu;|DUX!Pt8``jtt<bO*yjX~JN8TU5ll`MdQ(jy)n~-6i zuGK9X!(mbyh16=Td{h*AXHUNPW&A*8KrkjEkQ4$-!}U<s6J||%djWm8cz(?Dd4BBi ze^yu0!ym!NwoEUm5|6P`KbzCwcIH+vP?7COx?M2q{5!FeAdV+_Inj&s9Z%SoO&GUz zik0IDnTY;cK|_y7?;BQ^36fx&8RNjWX)LFuQQ1e{x){8%yIXrpPW?tcNt%%qT~|I5 zpFfeFR$djM^6B5qvYed%Zg-KX|JefOH}Hob&T-6q*Z1BL!Yt9W=JaL&>?43p21?df z$1Uu$tDi_~0&;;oE?6cEWrferB#7e9?!fHm$7PU|re9^eNbkY#7GcNDk)vPN8_?6~ zbK5AUul&7O*slN-oYx}+IiPZMTj<A@J)fJhwI9#DJy$KyTWvL`QUN=0M05oovHLxw zdj}N$@d#!o2Ljka%Eh(ctB*OMjqDKTQ`klhBnpPC)kWTzG4Jl9iNZQm0N0vv)y<~n zP1{G|FU)#fP?xBA&Tt0}fUQg%=Y6+D9?${^v4MGTd}YOLo1l16$-IwfW<YE$0R?!l zinu^km2JXQ@~`;j<I}sM?~*RpB9hS4nuzEEl3zY?@h{#7m4L0j8*9t|6^(_%1v^}# zt~Z*m7m9rIkdIkSQ}ISC?-^sR702BPpm`mU2QtN}W0>H5LA7D{6)$zK|9b5aw%z1= zZ62n@@o6E@$;ul|b}={%qbMa7;hI@2ty60Q2S04Eez`%CVEyj~R?BL~&grYyGgbq& z7Gx^2_HV~@{um59EV!@X1&p{&s>2<(qhuVN1PRo1X~0Y&P<lpP{SPAO4hhHNY6R3c zOT7CI2;3r*Xy!#%0PB%W8*-L=*;pUQBu~#$48UOzMsab*We>(Nuq3^LftVSbLEz{C zmZG{r|JS&7n|Cvg_eVW9qX9b$DXnRC0C}he_PKuQYLWppcTzsOwLU~ev}lQ-)1Tmb z*K_aiwPv1J-b(Kl>eh}hkM-e*dX;^7#3(X(?p^30+XN$txn6fs9Zr5XOB)iwDY(9< zg9CbdiX>cC>da~&OZF(S__ob1`IgPD>+RJm$;Z1rx-P%-aktr=eUz{g422<N{T{6@ zOWQoW%Kp_60C+Bo=Fqh@LTzb@3t_NI0Wo5$snN@VK<F;{<i;oprOM2M1s20hKYss< zfS%OQec7FuTywiv$E+WW6uxxVO*TT41~|>x48J*pklRS3E(4o`a9~+B$86toylzk4 z(JT@)MO<>#5bOiURjt&Oy9QsPAmI4yazM=^V^1c*5yeVN3=vz;$*!SSKSUn1uhsN# zXvAur$S45}|02e7)@uS30*S`3AP<bxU=c<$L*kn_7#a(V%saUiOZoe{u4D;A^PdaY zfA2wx<a0$DtpsC<6Ee$iLwRhY<XH_GYSB-h-l@m~@+(2|Xvp$5*g6eBCKzHkR1EQW zXKRfw_I`dnaxMXDKY5wNY0Wo87AWng?P&%TVB}|NL31(3$X;8ElM8&wh9XLW@k*J3 zG~S#~&dk9Cz_Mi&BHD}QhrgtA^C4wb;%A-CO~lP%-s5u2^ZLuvhYC%}f4fY+*Qlsx zl#0d)#^MS1!GQDwF~KyW2<dmKEJK9l-+t9oIr%?76wvkf>_bhv-osxLG#nHge-KL5 zB2kz9Ap7CG5aVr`@aGykxwd3oZX4U+Kj!#=gf<4{aup79j0QVg!qGzVWED03P*~lE z_MG;01H235Lh|2q*0rR&!{!Dyzeq}8QTfRG`$Kkt_y+4g#gXC8Z?jUZs6^$weyjN) z1|q)aNCwy?w)2qJ$hBrPzQ2s1+oKc3Mf|KfaP<52iz+K^b8{eS^uk6{(tok0CEya_ zAAlH#pc46*T?cXmw>u#;6bOLw#P;2-?@oYD0baM7YqwL^CSng#&&QW~6JOvVm#%gd z_BEBtWjXmIuBc5>+g9wD;bLRc3O2Hg*JyEH4XOt`q8-!*M{vs%+7e(~9eZJKzHQ;q zy}b*4fyRbPkc_@n%<<D_Us6jRL;a%~mIB67wVK26TX4aPIkqBs1X`F_N3XsS`{2^p zfw~Qs0s*%3i1!ZmSM*`*zgzzlFaCEB^t8qHJ>X*W+v9?slj+xn?_8<C5#y4iJpp{K zrWbun^e9z0-*UJ~I^S>C-Y@jHY~HPwL7%q7Pd_{5{PN5S9PTu%iJp&)v&$qgBmb@S zWGnr&RC670k|6Fx`zsJqE*&%2$ZxF^!p|4aAV}pE?EJyQTGomm*nNE*(R1CEwjt3b zb{d|4DVrLm(reUlGUt(Os6o-Du$aLrtR!$LpQ-z<VXnQcD!u;nYf%`%UZC0>U-78; z890bPF^ZLqNkmjUAB?~KF-d7&ChyHJYI?$8T_lJUF~B;_%s7zy7mq`RzzERA0this z<w?WFggVB^e$Y!xKUyxP2=mc$-F~OWTl>}Kdb92MBClt!Uao2shK&z!<YMEFjs!sm zIA7<(j*l22*nY`>tz+oAnjVk-d^XuwVN7c1-j3yYhD!BUPhX^o2$y>3<f!RX<Eh(R zoD5$rFHZVDw~3reHau$voKLfTHr0mAlt`3-1O`xogTx2W(&+(BpD5CMeHooP0v`WB ztEJpr4}KFJ1YB)|jgqU`#djUftv1u}@p5w;+p%&8QG4;xx|}atRytbmGb&Grd90fs z3J@&ar;}TYv8RoNk&E*u$zv&KP%ed&5H&fr7)R65-laLMT*pP6c0LZeV9lWk+wN=C zY9@eo@dcr?*gEX5dn2$Kk&3xANtmXo-$Bj0gEDr0Ny*E0OX9b19=DJb6btDw>p)km zp%sv!p*jrS61Pru0{^JFOju8;wr<Rg4lS>^^2`gb;x%h$mo?7f>X$%Q23{H47;wFx zbJ%)nj;R`znjaM=6`B?1O+i%!CFD@Yg3;ds78LhJAns0$Zam{T^B7hn<QL6WuADLd z4?WF#p_FINLqOPCAUJ4#{%usG=K<pW`GZYc{K=L0V)!&ndZFiU?cw~LTjwTEwxJsJ zZnKtWX2<nuX|b#WeS8v8I=n!Bp!AbvW@I|?#D1z7fFlDPZCJk7j0YDbSymGly%hrk zEBobqeZfS6yI5M4YT1P8U0T5Py_A>z<>c*%MV^GDHN?rx00q@i<i(T=Kk-uadhJLr zU?M+O3!Q#zpDJQ#@pIR;<OANO??H-)W_2}!TW?Xa{nhfP+47G&`e}+{EIH%W<FR9k z9%3IU9W`x;Q6di6;hq##XMc}I+$A;JRIw@F7ewj|;CpSTVOkmd#CUzNJh<^%%Fp3h zPK5S;OdZq7sPaky%`y~F7tElguoy&M00<_>$U0M17c8%Y3g(J??}g#<c6&SB|MP75 z1r(^PRH098$`EQCT_w|W?7nk-AP-W|&CoNC<y*JQEZdZT-p$?Hd<&QQ<95B#N!wVc z^$nc_mS0}&IAdwPU%*xA3d(<%{7Kt+HE@x3HDGo65h>?F4hz2rFv)le$wg?xL-@(8 zI)swgtBPKWG`D&1Cu`4>4d#GtSfZz9Vk6fxq|v<yhU2ZSJH_c>Qa@2$BT&J9BSrn& zfjWQ)dF?0}{1#gf_HMEK!s3VNUL!S-RycnGKOiK&p(6t)AycgFUjq7AHX2u|N`9&< z?D)dK<>)vCX;gg}ZV9+LH~o9?#L+@s`FTB}smkOZcRS(W-qxCByTHd6K=h0s<ME@f zm9<!=rkQ>{n)*KsZRS}t69t(W|A_m97%ci2IPrJ4{_!4<uKVOLPARn>7m}zmJJ3*$ zVI`YuiwXBDEYhCF=NUH>s{G`qf%KPLY~J@a(&gr5_oVBry(3j^!x`_q{9VnJ($thJ zVKWO}7y3Az>yV?~Xo$FcKtTfXHf(@_M3;T<Na7iR&Gh;V0JRCk@_N8@*!o&d#`=0a zJ}yB55s`ilxf2(wIWkWTMPUXZCnb`2<%uzd2HU{IAB{#lHD9=DZ0BnooUqgv^ghUL z49|{hr>}eXT_VfFmp5HXSGcXxjj_=m%Rd=_urcCSU#U8_y~+eoQ4lFwJD{@h?59l_ z-A(wWO{o2_E2pLfy?+&#D=PJvPAHn?G2R(gk!&Rt%Mj|Se__iqnO3}Uf23ryc|ZA7 zMuzCQoV;K81?B#ElB`%Px1*v=50(!HI+45KV;bSyMD~{t9MSyhaH5uSomB66elXPR z`TK=T@2d7VgS7wT<abGpBQg63Ww=3BjXH5<1J56QH7M(VL1C-MfU^K>42!l`wnQr* zjG7%?SZyy%^Ws+>;5Uh*Fz(meAm7j4=Mxs1)gOk!>6MPo^T7~(?aE3xeVZ5-f8?~h z8sUCu4vLgd&n@EO6lsFG^*(p~L7KMU*7oW%93H7ckEVo`d<4#EWTy`Wv^LscQS4L* zdT3gzeK|=p1peVLKVG03(f-UB@v{hRu`^Hx5IM&1&#qR|zd;D)7bUnBEEpNQl#%^Y znh${MR)>lf8M3_=vrN%NRu6hZYCY_{4m$k*4e)<L3fbi)wO1-WEu`y=h}km+Z4v!J z^`rc18Wv^?&<HgRzi8TjDds5`z;gX%v$YHg0!^qu7QuC>tbzQ*8lNhiFwp0=ceoZq zF>YA+sP*T<=NnM9;1JQ}T->9kz5XJR$?O}Y=eXy8!{ScQ@4C-!m_+cJ!36po;V2Fs zhC=ss)y7G?Tr9m!c5`yNijtCjM<BdsmX@c(lcwk6Ya|wO7#fawYO?CP`%uCIfwMLl zvWq7-I?R@?=DHgy^zMF5-0IC~kfCut9-|5k9(t)@+*Wrb<ajlYig|vVIL=cG-(B!O zzj37NxTouZo_<7^mnO*!5eMT;yr1^?S?4_1{7Yvh3La{wqdVCt<^N|aC2d3ey7xBc zBwQLbSye%|dA3a%cMM&DSO1-7Q}Vmj@sY|McI%P8epk_~NloMB2VP!>XWq%qhw({? zyMus7L>Bghw1%xP4|feOjyMREUA_FN$pTB41ORv$s)W1qRYK&;MK06xsNm=SkEyfp ziZWW?_6#}HNJ&UH2+}>YfYK!mGIV$M&?zC^B^@F?(kYEdNq4t&|K?lgoVC8c;a&S( zdq2;8Usu549l@@hbt_+Aac!OOY8x-y&q3%wDMD-9Ubke;iU!B!7fq{~*`FE!<||WI z?O|o`AyjT5suv18QCundj>Rq&z`53$ze|THomXeXEvPsq=Yvt{jMV)p>MLoiBrfRw zO)~~5>yiN`i6BV^0Xh>`9Gj%1vcZh8wR!xGaPwm6gyR#z%VX#H?NjsPH8G{{<;fGe z&1eIN6t6>A50x`ZnYma^Q>qFUAF449><@`}b^LHIAd8RskwPjVV;%tN`nrzQyyP?T zPJj>q<9EM`+$<YjD7V<CCC5Z<9H~Pdg&COYpI?*u-IOP-23~)OSzH#WS2O(7m{>8v z;>M+VLO3sCJ|~?i%CLoPUm)*LJN@CM_UObSYEXwl)`7HY3-iDpIdm!APg~R)Nt@&t zO`~Hl``%xW0MGv`0G2Zp1*xFGX0)UQV*y#QYRYxyGh{-;-bc!4R)?)K3mFNE#}~Q0 zB+@C??_WnGvx_*dP9lcMe>a=SI|}-^Re|4LBSxC+)C%=Oeq!$qZCZF&6w9Ny(Cv^< z?KWm!c_KJ|OGB(lNoh4^ET(L7w22AtTSYPubhZ4CGNklYNm;xCWw`Mb=XMn|l$U=x zt`6p@+8^`$_7fq`4c|o&li@TNp6ZT6RFy?=_wM}2TcK&`*C!HPE@8%BwnHw@@|+R% zwbe_AxYzox?_$mSMJ9J2Utb>?%$I-rN0L2bOZ3%&+m_v4^9TO>ZKz9O_7Jx&I+kXJ zXt2UZ9Cqf9LZBH~p?&Gl{@vxqm&0wko0Z!=!(WbKEtW=6$Py^Rhw8aw@7Z+w)FQnW zHGgD7YUu3%5LAAYES%@Xm-AniP5;pK(|!4L^mgiUpGAJG=66TO^l<Crqa!y|a+$8_ zNm+@b587)NANt!57PQ_Q7WbonQCdF;aJNO%^Bb?ZE^U4xPA9mDs9`5r8vL>h3lOTo z>A4H@PNT*ZL+#<{TDz#pX<Tk2t6-!*UJINUx)b+l>!8#&_;rP{Cj8ujFrl9gE2NEQ zW|&Lh0C>_uf7YaZh-6G+h0GP&TpO+5y+<+7IO_iKyB?ps6&bb;BSk*zr@FLL%#VL2 zrgmW_=pB?qI%VzHNX`Jw9s&W;9ea=XOAqE2CtFxuKVZG(t2{c&6*jq1Qp#Xbm;%c8 zu-&qN%bhUd)kjCFj)#Ho{@G~ctPmI(MD-nyU1n1_mn;SVbHjN}SN_CY?KZ#-^-r3k ze&=zM_<0WT_s0owpTl0B(<2IssjZd3F=+9cOg{s0S+V{6bT&4&B`r~8NXC3*#{7`a zfE;dl(cv|GMzC`~d~&my@@47R_f&_Xs*s?aJ0Zv-UDm|nv!4bEb9h+MqGE%bGvzk^ z*)RhFfco#o$jjDLHc2b{Cb<aDSCVmsF<r+Y39062$;d6-nG4i2tDCh*GVFsW!KIW$ zF4nWY-S518CgW)LzUO#aNXmnI*Ty?Jy>wKMkR`ftl2D_deL<Tctm&G?9zn(q((^a^ z*85@m?9cMeir*2sqvPXkPRuTQZvO#detKPu*Gy(P?r2z2yHy2^a3{}Bf+Q*sMwTa_ zg&<>017nXe-@|+?TCRf_AsO2$PX@wxMj8#hgqN<M?CkXH$p{=wCW%ScKZC}k)TOz6 zRRE#soHZmyf!-POr#|*5+@J!=Dz~AZ-aLnys=q2~Ol9B<A8&^)5I6bRsEMV(U2XA) zv-ai_T`HoK5N^y~C&6fd$OK~+E<5^WO4lww`>Rx~lciR6fY1Ve+NNp*5SIPZne9Z- z4T>^qffJ)yOh3A7h>Rh_MV&k}DL7uto+g8&ob&5duIN=#Jlu%5b=0;Wx;CHWQBi*A z!8;~3XwK}(h+{6RTr;F8SHBy_n_=NXHx`HOdZAbn*HLq%YIKP%c+(D``^7%$jMD+Y z%l44_D~<NGAER$;deKklHT!GkOKc*1JVtyE#^^)_b!;|N`dVplSXhvJ_K{lwo0isW zWb1x$d}_pgQ%Ju+=Pj8hCFydjr8x&@cuI*R9cU-rhSkA6)>svc*3au+UnAGQ_jR+E z^s_j^WRg?Qk=^EGoY_Y5X%l%ATPAlmnZP$WkHc|MS~^H)dil#&?hMuJ&vINf(;?90 zrky6PtC#csS4Lv3cZ0_QV$Kg=;!ioQLrp5J7c83aku{NNNoeqCp&0g-V)i4^@vpgo zso<36$2%2~=h<b1^r_V`yW{ImH><X)H%zI^qFA~h66^wUgXkJ8I0I%vTv!SLo|-63 zrqEb7R!4qr)H^&!$$ny`P35Hhyu>%IX2o~&S$|IJmjp_cEgl@dBK)=F@>egIsjI8{ z_Y|c*v~}#wUbI!;i^uppf9s1&S?258TPRyvtj_D5vSGnFZ0&=0k3p4{uev2WlK~)) znV%(oSIiknt@`12jrmkH{_CrJ5W<rqPUfz)uuOyOob?XeyzX=B7Dz!v&{5`x-yB)@ z5b{nP)QieU8T0&E2{4A*$Mh{9ga5*e_`3F|N+;~H9Y4%W+t<J|GSyP7_j^1%y(?|Y zaV?Q*a6TACYJI2ZW>0T>N#|+JKwev(!2cQDK@CEW{R?#Mad<UHgaJ%!Ax*q=Ce5af z8M;0KfVco?Q-)()UDzi$vhBb4DrviZV0ornD&)`vm1mV!ym9}MJ^z<dOX0yG0F<<! z!bA1=Y`Yt9e}YIu*ds0g7x8{OI@tgonZ%apVynXvLbmW0@<L(4fEtJqu>vYS-Shmb zs(|xUrhv!CM+DO9$>hCO6;#kccjrxAk{m^d>kpaKr9td7iBZ}_NdTKCP>YB;Y;FGE z#PW@UE|%wV?e!VOhZBgHm^2ABm);1)NS6>S9Tm_JpMhM{@FjISc|UlwkN>mal;7#q ztK7gF10CVtY7%TP5WyjL^H8Gc5R0#k@Pr%=6u-772FcKLi(Zj4$6gs^M{^|VwA+tm zSvh%|!>S+n()qCJzY|9nxT8(g>2KtJajyp)b?Iqi3C5=7K>lJZm|q2o<8EoJud#Nh zPIK^q-gcd@CwWrbos67{-<-^kePNr?xu!~=5Z(f5PJnrcxgEN};UA;ub2FBf9{M<f z(&-aeqq?oSc{PwtwRKm1odHm`TF1Y#V*~aux;WGEA&GFZ!NJ!jXV{!eq+3T$w1*4_ zNS8*iZbGdVIJ^$cL?sF18zGVVMD;j@>=p|)x-B>5Xkx(Q@P68gi0k2x5Tm<C%g%p$ ze>wnydep$*ispo91!VbuwO>z)jMcvhM|h=Zm_nh7zq3blJ|P3S_rFnof+5)Oq0HQS zxa<y&LUY??>B;?3O1{ti1mgbpIi9Pl)^-_)EI?}MmkLM_2Ab=hNOKYea`D%?bc^8( z-pvEB3zl|EB8y0Oj^Xl{;TR8T_vo@D=7h4cbjiSxlrox20t**FpYyx;YhygK?rJCW zpe}Z4Ht8)k_CHJjMO-3`X{>D)!q)JV;$K!YUTkci-u}>gms%-YsIZuJGrJ%2iu~ov z#A?6|Fct>%pv~-IaKfPz%(T#&Wx(}lv)6n_XlRfLwB*V4zWEdXS^R4DZXWLaw+`PJ zL;b-|3zf#xmbnqr-oRK0J<g^iSqh}1lL4%<E^*dzs4Qvfwt7K)!Mn#{Rwk7;mw)}l zD+m_tGNSqxu$J3ClbG^W=#L#!-vW(fBq@H^s3M<Su43~*uNuJom*c8fz`tws&X@Zm zmFH)TdbpCyG_Lt4m0;d^o#AsU7UiGmE_-_a*u%6;|0SfbOyL&Pv|uVP*=e-$r4HF} zwI0r%6WmZfABhT3zNMF<TR;k0F2j{re^d4<A9bjy)qANqfN{NU{rxY`&&$tADx!fl zrf+^#QZ*Z7YBjm0lo(*j(-3j4Wip%9(W`pUapIBIY^31>m?B7hn$1QwY-&8NK;AA7 zcfsb|A*_l+uN|meU1^b*UQ<h{P`fAe{@yJE)^_0FXzP)G@-jn*I`pk5_;v$AYOxN8 zuRMcgn0#$*4|^|mAsL{Z*YnvU{Dx`3|J-x}C~6%iR*-=YV5(e#9hNaqmr~=Bt0v_` zj{(Y7-MMB>?@9b8@valo9JptdhoFQk)(2F!T27>}q|GTOZ3&P(8Yj^Yu^|&_z@XA( zV4TqC53HAdu*55L$fzU=Nq&XRkYVCX|BiN3m{xcZa<xOAU@KfJ-l65?!m<5&I(01I z?0#N*<%z1(X>|-C%A;!YrCNk~_i`qzdCMxjnVnqLnA7XB`QaI?%LC^vyzg?_F2Rcv z(-U{uT7TI`m@fr0{A&HpSBMHerwSg$E_zU!06Dv)HlP5}sp*Az^)XYL$#T9$hQsHp z?X0=km%bv;rCLQ>1%DZ**+Tv3uw-+~o!l`|PcwS7bZX$DIUjJm+3P;%%PFEqtU&d7 zej12|UUw9Rmz?m9&oxs((iNJeQW}TidUBWsrC}_*8&}kP50cURS<23UhtYf9f5YJ< zst9rxi5(dUJiCsv6uWioygkb?@_p>kzxh?f1(q5$lpTIw0+fjSqMND0l7H)6!5h5a zaD|>4qo2Cpz4@#2YU9tT=+nR<RgQJcxs&~=pDWmO7etmR^A%ewG6vnO)GXP(;A8|F z6CblH<DQa;e8B1Avt%IvipdyGkeEoC+%jSKB`55o1Se{`@j?XLPI0_M+56nV0!(Yt zwDKt|9l;&KC@L|_5ES%=w6a~Pm&xNfo6yz_M~9o<O!JEzmf+1O|I10zr?P+E@)dvc ztl9arbsSMEB0EKm`#se(yn=6(|1G9!!V;h1j&PSTwwocFX_>r^BhHqLVavnp_^g#R zUr{=2H=(7W4Y{o~M0;GZ^JR%u-1ojQryP6WgOowmxLHSie}Rj@wH9+!CabPGF9x+4 zHIqP?khQF`*$^KA_h^vfjuUF~(%>ipX2;A-P-!}uYO0gxobk>tpcX)2SV{kvRuwr& zQd(A#ejEj?C>?Y^swC(VNf;{l6NQ}>t2<`zd>2cSmxvNKriooxJ`Mfb&1&<DfVk_b zsV9`9AgkH7agLfAN#bO!q%YFR34OkxHbn4Z!zJPZ=XuTYdxwk7=Gc_>n@a0#36dIf zl(J&@S4&uf!r+Nb4fWN}uk5ztEJgdsx-FL0X{lPxo=vz?jdjyp$Jtr=%;CQ%Gjbt! z8&L|UIk$UoI$I;(v!;n9_s6}r2kR|p!K7Ilwi}cnT7W4p`PhOt(sl9(#Ttf@sMzhl z)ywUddry`2fcs(nG<GX(@W|^>ZU*~07YaelVSGYf!Z$9dM`rn%lDQu0^_l{UA7s7G zZdV@S5VK3s57$~vTKUpsK_ITi5_@x1Mk~~B<LXn+YDE={c)O5Mg~!{FN2;fjo6n-& zG)Llkr|sSyGX_WG?1p75L=xlPHA-2$MO6SgC2G|9!W=~ti}8Qu5j~AeA?s7kZanF| zV<Poem{9i-CkAa-I+7(1DrPhUIOsygGJf!uAWx{!h&F~@F;r|BNG<iMhr@KTjk4-g zS5Kd+dOGL;xX9gK%>Fr^^}qWuG^@qgQKXTBkC^Xh@2X@3m^>$hn&;Q{B&9o}QKG`U z)-<STfusOS*f|!|^Njr_ji?4^{7l8CYA;1!c17DUb{Q)B4O`2|3>DmeBJC$3iTSd< zD9lRI+OfY=Q(-2TJ~Z9EGS52(kKMMKxNh@5zq+}hYSYZJm%qr_9|(LY5(v0FIt<(x ziGP_l>O^&2;`}Bl<Q4*;R`^D{-SEEq(3UP4fL(5nhM=$$#!+<~&fjqO?atg7J^y{z zun0V*&^i<|___2sv96**@--Hc%iO(RxJ4Z|n@MJ$1?%YdSa|F9@0AHLx8BX>)AmU< zo~1;P5STCo>~x4J3jpS}+m;WnVK`9=B8xmJKU^v}wtM<){zIf-N_<pEwX;|;NKrTj zrS<2^50_@Dt)t3HXFP27e6J<gF!`t0cfXC2M`G?+fi)VGNVMvwkG#m2@13L`R>dyv zPup&<El-7?OT|1^cO58~bWnhUUDh40`<Gr5!l}c_oX1wGMD%d^`nL9=(O1~B4$n*X zyC*M?r=1NK$J%0EH%HqQCYoi^Q^TJW*S{vThDyUF_e|zghqs0XB^3)eE#^?Lwj?Gb zJ)OryOJl8?+gc7;IjD6T3MHQ6ScS0t$Jc6)V*XGEVWTl}qu+1v6JXN=2n?X$gWfJc zUGOif-BieHZrsqHKe63qP$Li^hZ-H_3k&YNeUI@peu0;Qz&k`46~Xo|{=U@Uh;!19 zt%HPSpf_x#p_@WOR8$8uS!wJwwpMncd(ZEV#FIs+q&)K{2;+9C3jW8qg&S~o$?`bf zocHAAwwzM_%jNWbJ!HP8SV8}+w$5?FPWWot8giORYOAm_iFRgYxSN`oVxUWr`H|;n zcSN)v`0?5GvM;cuoJ{Te6+;*+7sppe=YbjyfSsB&;HF!%vwa7*i?C~&wO+D^R=H;@ zj5+a2<A*3(--3BQel?{RVaz0*8Z}DdpyUpN<L}2mO6WI_<wjnQ0+fP?O4vIuZqYVg zX{@X<JsFa4)wK4OZd`$dyEv``HR3bn7(_mx7tuz$&N$9)k@W}lPfT31(=`slrGA%; zlwSm>lH*1qN94qi?cKfm=ZfnKDggCa`x5@vnR4J&kC)OdO)f1JsGJ1$F&uk*7Hqy6 zI2F4Q?{M01MS!5-4>y!=f8=>bsfDtYvxZ7wZ|3M~#A}mSQ8cdaMB@IK-1vT{5&wLd zBf9E+K0_=n;%VFzWiwNuX=zQSNtnnQXNRY(JDJ$jnAotGVt1lz>u8t~5mytqgD{31 z>60P9w;Zoc{aK?iSy6)?BG{NJ_(q1cHV2b+1N&CO*(Cbqtn>L<<+D$vu+s(3O`wOV ztC%PcFwI`xAO+C6U9ya^lFV@M^RL{y`mYxFs6;M);Tc808ohrXDYq>eyC$$IF5~PS zKJBQcvmb35Oa>Ccmc3J+@^Ya~k^7!GZ;2KS6NH4;IA7?I3sAkUv`Icg)?#*-3!@T- z@Juvc(Z=YM<^Ug6I<j7B^lKt){zG&T-{B-sjpepYtlLpGl%Wn1!bQg$k>5GGE&5&0 zDqal)kaS}28bLn`7tOg(np_VvnHeMX4)$Z9xH9PxdXXT=YX>zk+}{xNtF?e*#ts14 z8timIh_y|C9lOFlbH?28<KEY?=8~vbsj6_+#VPP`P<Y5TjW#RUBJoSoY1=(yHSn3^ zj;G^%t$O4`swxmi71jcx!?Z<Z4%u}&j#Q6*Q+!M<kZgQ>?eDqTahl<YuwL}|ItDnE zST~tjj~$Yv9c*tGpTqhlm3sVaYqGt4P$6ll<?x5wm5F875m5n(CGltliAEk&)URc6 z%IONY)COjG1Ysyg33frvL9fW#>Z4w+%bQn)Tlv~~CCLZQZEDw8{!F7$D(Y|XtClQn ziHt3y*c2+_l8nwI^(c0+nN6WdDOTyy1R;4E=AIt))k)}%+Qrq$s;Th5song&Z0)iA z@IBZ6W|?PV)%h~()spi|;$*>_%{t1{)kE)GC1x;k?F?dOmCq*AKp1@5!1L3z!EMiV z6Wy_MxAeQ?<BDgXU>dFdvT=I(QDn;7k7@qORf;@F!H`N<M!F$vPRP}d&_vYTBl(lo zFF+)r*lf>sv9e!{r4Le{$^gA>@g|b6w~+w%lggJZWfX2?0v;xT@T~5SNN_H)?qEVW zeee$wY_{a;EC$UJ5d}=jXcAM+FCUx`>%ycj)t|IqR$d+v1K_(Wj)483332DG-vH93 z!oOrOA7Q<jsUt{<I%80BGs`+UdUsKJOdC$wxEb)7nynJw8ZdXU>ojn84AEo|+K=x0 zpmqH{eICvV8Ps42$#D4WMO>o#LEb9K(o{gJ3q$C^WT2wHT%U2oA*w#e2kn~n+9cxr z{F&T_lDrw1iB{m!=@*j|TFlgm6DPD;i#oC!DDiPnt_#Sf_;y2ji}nqzS^8#|dBS@Z znd3xeso?suQ2IhXM=A=wRlk2fzKfo(;pIyRz}Qn_RiT#QCSARfW5_t^K#Jc|!l5-) zWNS|pk6U93tG-u#i)ooGscx!8Bn0U6V;8CF#4i87kq>*UcxOd|b`}~dN~ES4J()<# zEyh$4YUl|5iI@uJjV{3j>2iBa7DJOy`wf@ef2`c=m)pEfhFMnw&I5gZ+`4vpoi0Bd z=+7QJG0)PrS!P<jiT_n^HdGG!#N9Sjc)U_^B>b{b9RhLiKeBYpds!J_S`q1NOi>4q z7=Q)k%Z3Zz3f2A8qHxX{uEvu2iSP`>uXvmdJ;blH)-{2vIV+W_oXctnXKDe!GxqX6 z7l=O6PG~jlIO%tzu4W^@2M9;oN~oHMlXlW}ujfRU2}qOTEwT1jc1ur=jNtd`m9x_9 zp_(E|$m8LkyZR4gJGWSWuug=v-spGCY9rn61twB<`MiBYlGpUOVR)R@TV|Q|lm~zi zzWC-Na>pbzrP!&eYFl4-EM_w@&fGcj4_k5p2EV9$KWWYw!1w0gOHw3eY#&wpE9Yk} zP6j0ZfCd+NYO7jWL;@>7G_@ah(RMmoZJaEOcf!`<BQp%)fhwsVom~41`>`%}ui!x$ zczA=7G0`y>Ce(I}p`fEo@xM|^eoEO_a;;u8i?pc1`GD+1UVW___6c=qOC=ju7Xt7+ zNpkD7dMpZKlHkyZ&ZMzWe7#)eWADq*>1u%0m4KM*jX<uTTd46F=4Yf$(tHWP0g`mI z*%5$)hEM`X-eUd;&pHWwXn5J{*Uk%ga97x*Mf}ef5r(=2{C^_3q8S`^*=Y^lt2q&3 zffHjl<jbzL(qT<Kae}=#P+ZMKYSpd+Fb-i!?YnJz78TaqXWUi)?e<;q7S0(OFH(iW zvo-d~Za}kZ!@FHGxRN)Tf=#vF?)>lIY~!t(+WtOrh7g{?$l&@)6nxyM7!Pg%{GKjR zI_(6|!DhKJpP;bZV&~2IAdGm$Yb}*-^|pt=sHJ!%L=C$N(8f|$Rw<=QLMQ^Y;HzfP zoIT#&7!bW(BA$I7{q@|}ocFxvEAG2_G?2m`&Iq=Q9>?Ux!TD8qL_jMaQa4bQV`s0S z``#Bvf{|nz3QQJE=42SNAhmEP@mKD$vyegLSxtC~yJ+)%Pi2ovHr>Kq=sZ>$8#i)) zVhbul8b7c0pc>@NFxR64f{=7M4;z^2leZ+_T|l9_^{qC9&iEMHEmf&attD@&I)6HE zr@UN40?#%U1Uk=t@1BUe(Mtgw{f%S_*l{}Ay}cW_-M+oEt(X*SHasW;rK?PS`Wr3y zt3~}EEAe?wUfcPwZRxHC=FgR;;1-cQ@7a=0wgu&cT?u5RL0$Dcc`lZ+5O4G><Yhiz z_dnPgvWz?*&}wmwzINvj?F&ODX=z<9dBKV4t|OA!P*@-IOeZCZoF1(A?dfPuLVBJe zNKT%XduK)C_0gB{n8N6g*X*f!lol1mdKD2x-ZtdRE#Hj4SnL)m3pjRO4H8qeyiE9P z{e7+@HKv?I<Hd6VsqG!;5F%ES5z4?IniD`8MHa?H=kn8uO0NHNJC;&o&j@<5Lg*X$ z6?!+gqV59P@~C>Qr8BXW2cKCO%hC*?kP(3hkD<&ki@*<R-Y<<AQn<;4v=M(yLQ~Zv zo$Vqopd1H{;O7;$Yn8{+RY;TLnf|Ngb0$iNhbP-Y&AWwt7egdNmQPM{qT;L!j5GtV z-FJUzumc{No?flAy@U}!s3w^G*0)&n=Ci!fzH7<)ItcwFf)O~{8~B_yLVi838QQ*D z_MJL^Z(Df={0SnK-i!o+1d-yJM%Z+tZ8p;J9I@De-#>T1`Yif%sZW*N!JD*^V4Y7c zPfUai-%ift$N!6576z$e;9Wa1dxNFHuatBbO4r<)gz+&Qh^#I(4lnh+LV0_snVWmI ziM0@Ky&=XbA&xo<!o~GJz}RTmLnkrNu}eHfSY)N>TQDs=jKf;VLS;~-0ik7w!gwrn zOPbQ;0q@#5TlqC%8Bpn|d2EvMic(%|AVrp8JllU>Qh`U3V8;7~LAl65XM5n9(bg^J zvlT8j+Z=gFdNu}(0MZTWj8q{A72|TbQ4v}ClAYu83`@Lm{ubi#^7hQZXf}}HgKOG4 z@OXk7NpWcq2aa`6K<66dK7h*!umxfW35Q7)dz81oQTw5eJ-3>ZE&hV8(s?<4Fh|w8 zc^*GTUXI}D<0S%REi)4gsb#TI_I|7S3<jGI3>z;PEnlA<qjx?XM7`qhZ)p?lyxK9B z^Sax%v`AxLYP39#;t=<CGFYwEJAJ1{CzDgpln&*TzTUb}o=@iq%dKmhXCT~eTAR7J z?bRNCxjl|oo-pqJ{1LuZ+>-Rh<+|x2IZ=3P_UAZXx#di#Sg_o{fW^Q`XU|4dN;*`2 zKsrN_hlMU7WQ?V^A2&NRMi7)O$*pp&*4pUm@?duHcq(f2#L#*EJLso~s=Sg@zO4tX zad}k|gb63;gZVbxnkfylX|qUFLDT&RD}qWiU{59B0Z!F^-?3n2Z5^2EqZRve|J#L& z`8MYSlYSb9^v+E02mYpJLm!pDdk*<_nc0yuzEW^jp7Q!6)*wG)G31xfzq6LrZTi2O zo`qXj+n9jm@34VGW0A$$mE0(tUM7TQ^Ft^DC!uQ~SvhrnW|2&p25h|0wG*2}9Qr*$ zi#Ov-sk3Q^-HFZYZ7;Kd{}A-%?b-N!R+S|Y1F}Ei1!$NT+cW0xe{#dKO(M5p!`z-G zaZOSh8<=PJGJd;PQ~$4k%0otBhf;xsJ>rwFU?-Gy4fGH8_)WAx!}m2M$vN0;XDd~% z3f25W;b#rU;TnI7?HX8J*7X-idhh&tOoKiEy_?8__2?w;1fbLTijl}PolFhzU{b}C zL|}l(9pf>fq2p`qY!|m*m_gX%Xs0)I;*#X%6e}gmkRsY-^z}VYSo6Hr5a;*jW(~5S zG6^++g6JmV=qwJ~{0ELbwS7>zsVmq#zi+DaO#J1n-O|WEB!cx&K(ryJmd|=UF1;YU z2CKZdrobbvsUW+*kR2ZoW|5vKbYHnOFqfS`Jd2J-3`!#5C1CMJ;ih49q?jz%dYeuA zEg0oDGo?Ym%W%fao~Mz|`W->%)0({z{4_i(b(jT^UduJT4o!)UBH4N!nFzB8tsugV zi@iy?5%u{s_A)XxkqdWWk3E3QYB`dcJ}jja*TL7LTE#p^77B`Mg{u@K61*fkM<HW= z2Jg(*{>+YIj3|V})+V;axXGQZV^8GRJfEd_<_7Lo&BM~-ci|c)YL@kTL)C`7B$5s^ z^+@D)<I@;Sk(^klMgY}dWHdG(^4nG9I};(h^Ecryu1-igpu)=`JVp;#m-Lfb5CNcd zcKEqy{j&1LbFy>)3VZE8F_~XvfnGMx<JXJ;#tjt(ukXhXFO$o-PQj;W_tZ#9$JbzN zMfw%-wHcrw2{i1w6mtKs;OC3u%Ui^l=7w}_fb$U2(|Id$R@uc)PR#~I>F?qER41Pn zY-9JAf;}e+NL`!NN=W&Zbub#HN=-=FU=MSdu!tyCF%a>8?iq2UdVWOk4g=lB=u#hi z-qGi?1Dr?dWleyp0Nx@*9l-ZG#q)^u6z)7x9zzC!K&As4+S~nCUBtW=4R4mcM^=!K zk|hkB7~b+YUwaF%97GdU>0}~9@>w`pH|nX@A~+1ao~8%F;1gD;Y&68LuO{VO#(pbn zMAQrkc`FZAu;}xbNm7uic5(Ag@x4HPF+sU$O*|O68EL0hFn+)9p4LqUbJ0qF#ARiU zj5%{sVb^B2@qDgoznmQ4VR~7cxcx_G<Zb2u9jbff#8>lMnJFzzmKB_-Y?(R5IbhR( zGO=gj3*9uSeL?fN<p|tjI$gP93Va+^S@Al3{FHjV(x4HypxX>D(j-A3*cR*z(@&iE z%=om!%;%11lTn3)uvZR0pw8Z8#wN^<8g>OmBEURBSniMqb^<s$)c-?NWcC;ZG(s4p zvsF9^%nw2F0F-2cq$okfz9ti(L^h<1Z%!<@^}k|O5wSV!*;iu=ch|FKzOxdkQtu}6 z5Ic^`)2FRevVhHVbjtSfzvzm>6h37C{QMh4uB5vR3Q&dDq+$eCeoZm4znoQju84JV z*~1N53o5jl`CC0^8~HgzfAB9gTHv?@XEIr$nt$|=&!|`DFH6kS!y0zFkU8gj&ohc~ zk|&Q0a;i7%p}I=L+Ujb=XCv2cRzxESqK6?<gMfW8L!($%972g)K^an^D74Oap^><r zJ^Aj%HX;U}54qiw>?yxEh}4O-yAUN^JfPpzzaoFy**yukO`RlRhW1y5AXDc{fS3na z+>^;hclOxHPN6!^gM0xV_?-`%o-6INX%=E+<fdP9MygxU3rU!jnuRP6gyk^||4i%7 z>AHk;ua&6k8&Ii)uGD-+^g8o7g+PP}SOi?o_!oc({I3KVSj^mdvzP@NI$tHE7gEu# zaA;0^H~*#7uRg8K-&h#=?9HM(uG78lZTmN0M@Ty>m+ATTGv;eliHv?Ov#L*j1K+pA zq@D`@n`s{RyFDqt8BuUtQ59&W5OvzSp7DQAC;=FSRhbb=OTaH2bi%6r<YapO*`Q}T zHDF2$Z{F^cUF5Z$-9vV3?A(j*gsYkq#``1doe%yJ<_b0cCf(&vhXmIOfmXOH6|^)$ z3%^g2ErFV-r+NX;GRRRXHWJ|AcaM-E*z%PEr&J(+7dV20Ej+SMjz|w+k^m#6M}viZ z6cZXWfeIEmioX0o9t=D`Z8F*pkOb412oxL={_mmUm~b<uaoNHcuwgh72z+O96rj+O z%9IWPbpmK>0hmNgxKoA5UH-T%Cpseka>x}`FS~>4lX_<W1Et+ql)JPm3t<nXght?- z{%)1LKi^f{N&UJp-FXPy&5Em%@d?TGcClfR!BIbS`4z&qB1wOQ!VX_&WesBnXXkx> zUU6j-7i_-!bN*!HcNAA-+uJSykV;C+(56!mlJEdYKsA-<M^TY$P4SwSYg2!C+;7|+ z*XhBp;;tI6ToNlu%6WLyP-N1$X%xzK2Pqm*$AXm3?m`tXR())CkL!<HEla0(W6ced zWsK$FtS&p#=Ep84bxnH<*@)$GrM{L*xS47f`FsKCtT4Cki_`V;%9ul|?BA9^Ri4Ou zOm+;l6K3YH*d;Y=B5Ab}Hs-f12PSQAgy`Mpu6s}Zb>2f%o}N{PR|6hv9L1b!F-eNp zK8&Q5K-|^9;dE%A+G#af+5(SK+G-QGL1IVJCB)R%Q|!W7@NqWEwRA2V-QC-o+rHId z7GI6e4N184+qa>ykM*`_4296-LHNxN8ZD2AD`!cMw9o4sD73m|v&OP<h($^x#p&j& zkosOC^N%LZTCfMz+1Gx@==c_Ps>qlTa7!IV4J^{HgIHGkYBGh<V>JeGm6a#iOz$dO z+8jCD{;j|@AjjqL><BuS*>TJb<x9_4C2HZekT<2;5v+Vc@oYgi@al3_!!gGj!Jie- z54D+a5*+1OS;^?3JIHkHxr}zxm>?CRVN!`oqJvZ>y}94a9mO9tAb@?&-Yl^@sn~Mh zY>pKJQs1b2N`YZ{ECQreJ!!)slN&^}x7+57c<vr7*(5QJ;Ypm4*+Y@Kg<&uf$zWXF z;E1|y6795X&J5)PWB;w&&-P5jh!uVK)j`k$IPfV7f_Sw42|~)=p|PLCF93?bPyo1q z+7%V50Mg~;52XK&z#SKt<!P%wy%=!V9W>wpX0>MZU$AC9Mikzk{H%7}MN>=oS`5|| zH9sD$+sW3YxOKa9td-^j_#G4V^~vV1z{MmbfNw?l{zzief_m#MU5EN8BDh1N>8qxZ zRm)PZLsN<tv(h?!|NU!SbX>mZ{zr^>wXNdKN1XTHh5hD>NV^#*bZ96qhMKBLqhgQh z5D@}5HJ2KFdeI}$cE!A2c7BL9FlmK*m<Ai~L-`|}vHih}iSYLoQtqVtQq9KwZwSWG z+wSl>t{xYeI0F1c`Ac~?iD{<Q1`MW;t3t}RtKbaw%mT@+d5)5@m|rUuzPxsjwTm{a zwDkDJXV7XP{ephv=kd3+LYZ3d$NTw*B5ZB|%KimfVP)V)fHP<M{dXHKzp%e@kzqns zFEe$5Ts}+{mAB$kDETs}NFK0kXslEF|15l)VA}i3WB2oa+RaF9uK*aGM|btUV1$KU z28hkpb0iJrVq`+XNUuG7R#61B@|0QXa1>Tk$|~M!o{7ETVS{2pJh(kSlm9aeMyHmz zHCrp|@ks&x9pXtsvN2mA(4>Hx%Hql=uzS9X#^;hscj@!P6o?%tVDn@o<LI1gbHDD3 z7yo&CCfXcucan8VZtVEFp|?%4fm~h!5L|~$!zqPUr{AjaC7OC>c;%|ivwyup=@0q) z`ARw>AXk2VY&tY+&tvJ$8)a%HkF!mI?`^lw*IA`mVAH;KW7Qv)bGqwF3^nx_E+u*2 z<6LA<%0_al=alJKKM^+uYFeSY)wT^5jRJ2u{8lj(q1;84AUj+Ovk$!S^GX2sNWwy! zSr;uQbd1*u>*^6cfn0hoPCn<WFUz~RKE`Kc@hjJGNIW^Erf<Xy{psiqg1Ug&#j`sa zGJ{D2hRs?)mi_cNs#nz6PoEwWBOD<Ae8s(P`aStqAfDchpA%Eg$J^#}1q{GAx_=Ys zcnK^wLUSdgq*9@><oTqWbsZv=cBl$_<xgnWV!g(+rDAM*Pv`zL5?l%89E2Bc?~FXc zxbHLiKu`ezT6I9XdO8s>rh9z{;O+4aV6Gu0DU@i&B&Yqej?Gl`W9s+pEY)`*{sOwS z#1np(&lyuxId^L(o#zuINFjyeQ`T$b=nT;&$hYltE0610r5uV_MhoJ0G5GGeZi`uv z9$p>Y{e-L`hAj$t9=T|<!MJaOC#2tyl+0im-X4c*L*F~7(KC9N$9%2%3<}Ul63NH` z22TVBD;v~7#49IkU`8-~+g@tuAii-o0|`fZc;BU5_)skF!!|8@(0gNb>;VNs`JRpj zLZqhSVR)m|sR(7j=EaTZUDpr&IZnXB&^4!3m2JAOE-MnO>LaFW!>Gpe7itqH<#X}J zvqr>{{yC+o$tMtOI$!^1+|r6HuD>>tH?MSm7MD>eCR@Z@Nq0t6cQ&?a&`=z=y7Z|F zyCw$a*qnVVOO1qqNB&3q+fybL5U7kRF)AeFn@`SwE=SX+?)PV5r-5al(y*OB?V#Gh zWBt>`@U}J;+<N=Mld8kkebwd*>)`9Q)I>-k4SrWlaw!sumBmzXx6{OdaCMyRT*b0v z(s0EvIUlXy#~%-x`lZW+hGdmQrtf<Ao!)LnOz^MzU(ZZw*W{DOMvGP&?2Wp8HL;4$ z)M!r9R9ei2OxW+aC=O?clyQ-^s()WW6RdF2l9#nn^#ovpB<2Ph0vD9VU)Ri8Tyn=6 zV<N{AeXTXZOI+mhcze!wm5GlLRWGrnS4>5(EESVx>=_jVcsAF7c$SI_<2W_TtYgFI zVCmW4e-Zs}5%PCi{BzbAG8$Le3+`#$;hmeqS!D#>XVe<@(r2@MEZ@A*GfO0r@meuu zY7hd-4ZvFhx}cK@`3U~)YUN+&ybn9E{r(CWC9ezmyua`+2|WQB6GpTJ=Iat<&VaMf zNcOuG@Psg+>){e8fKZErP1b{^v;;`v-}5;z*6TKLpCo=<wBkpkbjIOnD_$2H2vW_} zrgxWTO)%i3hZB}aVPS_&jDkrn9X^8z6|ywpNC$@Ce&g)&?EJK7{>!3A<_x>nzDKB^ zZ1=*IiCyesJnUk3VI9ZQ-IW@y5yyZY|1oE$sXmprxGK|SJX|{WBYu6k`OUXMYnsv# z%)`IjBJ&QHDkp!heBJd>x*bBr<mp22Nx&YaB=3Qy+QYNDAlxPtg8FnRHLRX|a^B;H zH^*ev$KF>x=m-n&>eJ}5z%ycu;W4*vW5h*?W;fOvZ3h1e;El#ZceEfMZa<_$FA<AK zi$C4ee?HQGUMtlOIQ_uU>HB=-R%*dMLXspEEJ&)ssmzwhE9{=2C~anJY>aRb*6~PC zk^*~1{rOoNDzT2j0R9!2=-KBAx6|>&08|o-0r_FDs!B@mjSxW1!}WbADS$Re5Q^(Q zp^QkI&2C@sXdQm4W=ol&rt@ODsLSSC+-!VrKIzxuf4u|_FaBcMjeP5uYXFG`8;p9? z^n-^}CRg^|GBZU6{|da}(S<DLs_=6yVgr-)wnn28Mqdxg%dN{=lmv`PEHAB*b~ud$ zlfqkByO$_x_QE>BbnoMHxq)|~ZIX)8YoF<c`npNSapTC5w<Ty`86P9F)8*156(faI z2|upm<06HD;%FkbrG+a|73`J_3|M|Tikz?I-Cccf(2>G$Ql3>#t5pAnVkee|$eK&$ z2vcL#LDB43`Sl*VHK_bgiv=d!R|Z#DWEy&Uds<l<Os_Lplu9Am{BN5Z*P(Uu)aC9u zJ9ZW|{yW(P6j?uQ@&GNBEv>Al7U8n3MZe{6WX<xohEc9%`pDLT6%#tpaPTbE6R}Ij z#>NCc$Eh`W^2gGJ^Bol1J8(GIb@-lq(O!L6%ZgvVm|sl2aV5E$MGjR5EEvY(N`(4{ zEF@qI)P4mBd;-$$U`FCiPgdF~l@&;)o-@{>8n`@OzI#}v>byPhCFV(~bJ1xPv9=o| zdEHn$#+dYlb+;T;8(Nh+Q<s_PzSQbyeogP7h->o7Njnn0wfsEE*RBir`oPqGZB)bl zRN+sj=jJiAhR}&WyCKbb=1EA$^oT=9*w#9jx^(CPqVH2C^Ii?Gm;K@x96Do_1oVQa zJ%g{}8#=d}4(tC{NTyVR8HwFiipyV?i{2P{ARW5`ik5}vN?nnS*B0Uu{uaKHI6C1x za!E9sYsvxTq4koU*_y1VVEzDgDgqDIRVDX^)^rAiDZs8~rd-Mk7Y@t><g#FO0(2Tw zk69sx65J?nZ^4E;w+^1;=?$pCOeJZurM@qC*=heM$`X-;vi%-#c9io$JaBbPWeL$N z#k1(bHIOQBb@9Zb<-)Yr4j&}PB&nh8brZ{)cDILqut4#oVRGjUrs%fr)!#kqc_20t zao<0p_x{m#+LXeY#{M0QreIq{5;Jet1h40rBhRQ4tR#hp=t|BP$7FX6iIDNq2%J=V zo2HJAwg-9%&7WZB+KQf_-dUzK_HU`usSy6f6ij;kkye*kItLM#PEnWXLpumv=$U8F zBO~ThRnqi&+Oc`5R#EZ@c+3;`cWb=oLBucx97|Jv{w6~Hh3_q2uhi#L%O(LiToZmX zO*b%L=3>Qr?<!XBGx5&oadyhlfA{W2>~H#)X#f6y2Rl0@UxP!#=E*a2GI$|eSzj5a zr0r_vmxl~R0C@EIDp5K_^3Vb{*c7|(n)V^iK7np!y{Tl5dN6A}9otG;Y;4z7s^oyI z@&U^5NzI-+i6X?(V?bd<lh3APYW`cwB<|H$SGRBML}cZa8_ZxXlW_`61u<s5!f~J! z%gjF~`=0~?O(l}@X@nX(OLuPdi|{%rct!Ns(6o=^_oG1=sX2n17G~bOBrrZYqzGlV zfK77jh#YY~+FX{N@B=~zqiRx$NPGPK`f2K<xp#CxT#2w8xOh-hl+=;;3nc=>NlTB9 z;@#oxRb6BKxr7x_(OjE&8nC1i;%8qsnOahe!HqG->C2HzGdP(1S>!%S5T+cB_7||S zI8d%|>lpYl!&=_LE6OWJ7}0xGTr9h|zf-*Z7Js3{diR1|YM?hrIg4kP9UZC87h$WN z{b_MfI$=R~C3eXq(DIXoh%~q0)bd~B8&?;b>~v8nx+>~-`FL+vA`Vc==<zDmxLvvQ z^fG>}c@OU$RFGqHHH*yuRR3O`W_*=$Vfp#?)yvws>4)c@)!WgcUx~Xq6~rA-S&Qyu z9BHuayVnM0$84-ArZvOKE|4s61mAmLa~YaiG7cv)KY5yd+ZkAF{6}8E({hGMZHK3K z%d8!S+I9^*%P7;4TEL7V;z$WB$0AhTm7cBt3dM5fNEOBFBeh9LuOUFKMF<WNLIJfp z^8^&5tr0`9OxbU#hK6)6Ut66kKZ(WQ-MBML0Dw2T#H2w)NU%!81^@V8c+Kmp{lGNT z>AYFTFrreP8m#}K*8-1z=-1tw9c}^6Ye-#<B)IF?PNV?$uAU#>=>aj&y0GV<P)`p| zQXUPraTHX{U?GNt;2A$PMz=#>B(P;dz#lz6*E5IlZdoW>El9`MX?_eyJ2>=10lEJq z^#_(mByz_`nk9FxiNQJ=JaeybUqC$s4$q(_Xe|XR+Rrh9(t6LGge3Vn41=cop>58_ zZ$_T_&)ZX*0?&p&aJ0Mr+eUYII4JTI_4BJ$ZVRr%jT6?MNW_jSEL#ANGb0mPWzqlk z;gwQ80$XBjNqsS0Soa&KC-d6I7t^{AXb{T!t=_KXCVNpM>Sd)OkfqY}y)3h07h8}F zo}sg9F?l4b>f+A*?^||~ZE(|;tJH^u9>sFlMGey5_15~o>G}S96EP(7AhQGzPZ2h; z1%sB0#bzO!;+RHwrTKeVn}RLYevn})VX~=giin;l=2foi%H!e7)Ref7&#k4H_e9dK zS`0V2w8{d&Vh+*TdOk=(Ad6>zq3r1267K0dS=`h0@vGIqhnLIVxm^FN5CyU{c~S<9 zlW3VO%GkA0X`~U=61IG4X;_c^j5KAWpYh>)Rg)s5zNQ3+>w9B0TG*EsOA3R<9vrON zR{ZtMOM)G07%FwXxCu4t{mFZJx4Cp4Sy|blpWhr(A+MY{$y0?sCJ8SN>F8;VWNDW~ z+-R~Cy!+88I^Qa$xJRD2tp7XgOO7s<B#VKkHDgUld6p793w?NL%(9+>*4cF;r!w(P zMwWTAV$BI@E_5CWjwoPytkqv-)Bni1Tnl}Ca0tuFmH-ghp{qxO(SGm{n46f=(O81p zKrtjewOs~W=%snc!L}H%P=E!Bv$5q36hyyN!!fpbS+p2;@_?`#Hgbr#d8q)}jCmPc z`O1uQGsA<iWkXODmw~z6o?VMwsB4Y&&mqLhqBr+&Yk{M-NM~;m@~(@cVKDPCMO-PF zC2bWiikD5Rx4?T@8k&jS!Fku1CAfR-R_1)N&#Jd}x}J)bvuV1oQATYT3n_$X!KwtC zsHneI%3K?rRK}9domk^a@dPSpyiz!&6S3~JH>jVLCNd25hTAvV+PP2s*naw@VkGjw z@wB`8@YwG8q?@-Wz!-}|%Z}=!YnuoD#0DfcTkAoimoQc9E4&cO#}GrdSR-|karQ=F z=X!1eJT?%SWqY+R+KzA81mMRW3*6{q3;RoL&Nf3D4!h|SZ!He8c@m;j-$?X<wKaJn z7$N~X*tH=z?SCb6oL`&O{eFEXWx`skA~R#>6k$r!!qw#onSvo*?tlHwv`x(kIBi|< zkGGyoOI_yfgay+DW0rmu6vV)TzbD^ukX{Kyvs=epV#0y}9{0bcWiMlA7|*%&9swSG zto~am*#v`4`sUxk$s$8Xd7RZWBYPa+kv}vWk>0TIZGlO?7OynWNiDE{i3v&sr$tzk zIlMut@8+f>Rt?6~r{*xQoIBtiKln-m<HGL-wQqy)?C?U>v14LGF=F1*3JEzwEj`Le zt2p3z1f!E7&R-ITP%?p-NUCX8o+W#j4X(---nmKY_**EMKN^24?(Fz|*)o=fMs#7& zaHqd(6ke8QK2$}ruvQMj*%P)P8#oBp&3s&+7!P=1Iu-G_ITt^!j2HFh;VB%QdY*)0 zJ6b?OxV5=Paa=<<5vq9shy3ZZli&1;3I;T7JilUypI(Wd#qT6H?z}~_&;EoYP?6T$ zoWUBm`Hj)0QB5eX^e$WTBi0Bh^#`QxvcopI{XxB^xP*sGGz7^SR`BWxXGd8Uoc~>? z7su)Oo0KdPPeKqk(W`AUWt*)}>bPE^(R(xYv4rLplSK(hl|DA4<LZ&g(gk|r*W<Hc zh_K?*WPJSb-GJpu%ZsWNjN!)lD4oO!c|*crUbrjTnE?ZLEsCyXm!svOy8gpwuicHn zhX_YUMFobmiUZ-r+%YA8PLk1!>=qEYl=X(ig06tT>j{JCQ2dZLXnpvUbO-W$T{%|z zirsbxEYhC%f{A|$`Dn2uIoCu-R)KpC-&v6r!2*lbmY5hJeY$_Yav4yx4iWt|^vZSF zdRthlc(Js_?n)ks?e@p}TC)AmI6Dq43CZ_r7&H=XrS~sN8HrsJB(YH0vS6{Gq#mQq z{+*>O9TEPVm?W>el9^5FAh(FGvj3SpRzT;q2vzgA2r~5p@8VFD$Ix-7Y87A8Ecu$b zQ&d7%&J@Z=t{&GneVI7+vQ=H0Kxr@Y@_Z>~S((}781A@;-a+i)QPp7{M>&u==<Xkd zz+V9>_>1k0xStoi3W&!2S_6tX9r>D|Wy%3;TLmrH_&Sum>Ag1ZdR?upEcSGAC#P-f zm+p$ki$-8Yz!smb(d6OEu4SdXz+g+jkdj<Il1t$J&iXppPy6W5#==HNXPV>N2Tm6r zZoMU#4^akkd!WNw4H6b>$k5P7VJ1(kao2hfPA(m8P}irH?%inSH}4l;XRu`T3Yw9^ z8tkFfuZCONgpKb*2&me84syPelRWMqH!rzgq{q7bgnv?am%O7COV^bH=TQX!4dwAo zOMI~Yj?ZGMVC)hE+%IfBOmv)Im$S+v$IgaT3Wc^X<0gvmY0yV_d^4=Ap~CnujCdVu zG#@$46D{SEOZ@@?j|x8lq$vm4ZvEJmw<rd)*Qi~Hn%{<!Ccwby+v8(}AU#t}S9I5} zVmD^$C_8pd&_gw}D-(Rv=I3!GwvMw@x?LDGdGTB_+3SJV-_YWz`G#q}sbW$aJ5k3u zF-%q1U6>WWJ>(Vy<Tr-r=+fh32ID3(Cq;8HLs;ohsig=fDaP;qzdr}vb^kaAB^t@V z$q8DzhL(k4i#Gt#fv606%Mxt5!e2j4bmcPS?z@i<9CxT<mrg8Dlw}N3<E+yi62;5I z7=*4=b8vgam^lef@l9DkjfnzYBUu7k^#S3ivE*}I%4nA{K$l2h$KpIEgUX3)szioJ zl(}|#9l>5^=6p_eYyt}zWE3iEa}veYgCz131CKzaMWXPW)AX@uZlc}u#M8+Ca$Ni> zMqru$jlp=j+wt>yW~&hJ+YS^2(8*hbnczk_&5wII7I{DCXox>UA9|gv)T?G>25pX) zK$Irkl=AG;G6ah5##$=aFm7fc^TupZ^NBCI=nYaBRhSG`dCKsp)*z1$EQ`V5ad3jM z8m1)^!~5@6yaO9%S}pZ=Qk}b72XPV(XFW<JLF5NpJ<4p@T3Fc<)HDf}Bh|OiwpT^x zBg8e?cfDy;ou}8|SM*m{cpV$p+6Y<0w?$ZSrPS08H#nsfL3j#XPJus~|9U>Iy+g!7 z`&9D0&o_4FRjW@7^=&>agqk!+Nq>W9OsLnt&pg!8<eTtd1ldnuIjw5q)^*uR$VK_S zBBSvPuW!A2VmxwK&l|<<C@FG_Xa!<h2;Thkrmej*$-m+od5@IvL&0t2tL_XoxXi-S z^H{p50C5~)LagcQeLrpOUIX~ecCq6QURZq{f%I}7)nEK~vweB$%dEXTJS;Lu8LCP0 zaszpI7L6fCoMA#e#t^#*mRMsD4^MA>-Z!RjbBlp>>$iiWz7s;J0`)!?jbG>2n>_-D z%f@PI9Ini?wJB}^nJjZ(^_5L@>$7}59G)xhZwSH7r%+UCFjB93Qtk<l<M?D{bAwi1 zRXFxfc8f{gE!s9ojvnC_0~jNNQJ^NY)cDtrL0|fj-+KwZq5BvfCI~WDT=<-Q5*~TZ ziA^^^N7;I!%#kDLvjs8o+foU*Js_*7MM{S8S7WI|kw`^oV$@=TqD_F={YQ%RpzVX0 ztlODN%Ur*kN3yg9>(7$#U=#dk+&TqywIaLU((?%hNp!8vC-aGQyM01*0u8YeCxfOt zvlsdI2dm#f)SV(c`6qQ6RBH;;r}7WSc>f3TKn=e;+{m5Cox9$UoP(2tAx;ij+c-GO zx@fib%vCAHfT94d(7||wTyJfkpH$)4;nke##o6<(y>ssRjq32>TaQgJ8LyRCz_ZqE zWCyx$3<4Bj<_0*MVF4caY{p}+%%6Jm!<XN`^yb;E(dtpN2xZUUY~E&XTWXcFbv{U> z4XL_i(rj5l?y69Cvp)IJL2R(Z<mB0r*vJfOOit_)jG}|Z`ltwC@5giWqj%6{UJU^T zIB`FG00T<I4jAQ5zymlN1O1<!gPoTSqb%U)5KzG=2qmL3RNxXU;DEsBUZ?_507<9L z=u%yfb8Zw#OhO1KVIl?+u=o4qZjzF%B~$myD?xYNFD>@5-vI36Gl1XlJL@ZCz`#c6 zY8M8vgJ8?;CMz)`Br}$nfUMjkFUpWw4NG?)h+E9+3Dyv0r;JS03TY`C*ekczJQ=s3 z1V=ai2Yfk4<GmuEK;Bgp)T7rL5`k$?_|<*>(;L`NXN7g-AM;E`Waco3L6y`^`^wI> zqdFLo8k2f97UBp~n6gEZY=L2cLZna-GeaQ4RI$WrGT2R9|Jnca)1Un0Cx6nH9{4lA zeaEq3`NmFr)k-k{h)8m-T-eMM6sUCrG=npRm4F)#R|QV3ADsV3&%bgW=hI@asAHR| zVRZnxXtvs_C|I+nx#zki&ul1L<W_QySsfYHx@EUSZp-9+^<K_K?(7hETAHK6d;4uO z7`p?#a>AWK+FfHPfB^QcN$h?LJ=va>!A{<-2was(oMD*>B+%d{mKljCyNj{pR#ghG zM%zvO(di2p(rX`X9{G#EcKC2Pt_&BZJ8P5=kE#Hj&CgZCNkUWv0&&A7(+UQM)(58! z;Oc|d-hA91fBvl(-`za7J*}~lWzse+5Wuk*Y)r;$oRihlx}Am)qOb@9aPRGBhz(%4 z3xqAen1BFQFdTH*NY;LXuS`yEd!ln&5`X&mYrxDp2ED-5Vdy$2S$4K;P*O_TIn1j= z&2k_~y_BYpB-mp-IQJEGM~XINRn3+%WmQ#D^Q>msT|FylLe8eiEs<u|M4q6@RSB88 zPTQ5NuV+ck-Q6?yJSDy&SL5;v#hww1cY8Sq_W|4r01^l=LLd)J5l{zr`$i)kSj#i+ zd{<njO-;j4uC2xq&Dx7fi`nARp^*RLZ$JE}eEADU1~?Qk%w8lyhEM^<09HU5Ey2LN zn{kOp=UGl;a=ye*UYNf1!PdL)o!y<e#I=KQm|XH~5z3+?J2g;;skWN4rNru<v#Xja zo4FZ#uj??g{_2~OtC_-c{~F~6S6J`=vlmE0OF{}!&r3Hrd4MyP(Z?VIz=++I#PSHl z4&K?ms1$?(xo`+l4l`llO&rCf(~WU)YIL}oUZhKJUAsEE`*XKHc+<(_tF$qIs@7@B zk)m+5wu;7#SsfP8Z>dCf6!U;LF5s<?wqJbv!)M<3;PiHD#p>G15tkv%RaH~6rtzk+ zy782wahD&`#X`Ha)P<k{?&=EfK=3XmkIc{&!G`{Fl9@4G&ey>I9x%c7-l4=vz(&?z zR_blL(C6_2?!D<J5fp$hI4~7tBcLRTB0?yfg~(ML(rR!ofdXD}s)7xmr8sl+h)^hE zZD^!#6bRxB0f-O)CWtwxV}rQ?U^tNx{*fCG?$;Ij*lz&#@fm>8WetG;X3j4GAPDcN zod^J&#b5+!QbQ#S7!4<*YL_I=cjqG#=D?yFJJO{Y9O4~i5)`;4K-deHlC&{ira_Vd z0Yoq*G7x!Rh6?t&6cQo=_X`1BAy)S8_6id>>xs%eeCYzz-I^J7w`PV+rrnC))!^Oo z0NQ;|&gkT$EG`DmoqCcbni7;aM8uLq1Q#q3kwJ8JbNk4l1BVVCsJG7ir$2b~@#kOp z`sW__%01UifCyzma1sLy;si$=3~S^DIk^fA4+86l%cF<OYi|Dhzw$r)=vU7_w|4A~ zYUAd!m(sjORTilM!HGx$C1iL4XH-lnNOo7w?8HU_G6Q!j2U~h8IS>>C$^`3;9HDR} z*cBx$+%vJj;eD}8uof<0rscHT70xV<9?k&631D_ct7H&I00KZ+nMuV&grX#KZF4c% z*jQQJt>-^~>Fur4@BE2}Zu{B|<Mr`M<!(ANZyDK9XJkheV<DNSb{JI^C|$a9edDGt z-FWBCCw}zgTaUf;(Hp0mi?iK>hfmBK)OBvNnz=Xu1vm~QM;2!IUX?B&b|<ib5CCC_ z8~P++W_Gyy6<*`wt_0~tpU~xJ9o=x39D7Xw5gg9m6R2Ea02s)<WuX!%!_+$-n@Vpm zFUlZ>xvAUUliUa(^nHYxK~+^PXEvj(rsP?TvT1@QsKRm=kp@-L>~3TRS9k{8mg4U| z2@VPv?Wr(7DbO_P&e)mu?#<-l(h;Q$W(<?kIJh|jfnB<d5y6FBgd#h;L7m_c#V}$J zJhszzYgFYS&p&_9^?%VfzIex>l}S?{8&#<>N(K#x=z}%P;I(kmraEQz!Mc-tl<^0z zUHZxEAAY!HNvkRz9v>W+sJul=$vC%d%1G+j+}u4=QpzBU?tRAFUWzM>sFTI3o5B>X zq?ycoxiEqE_rvXSCW!;yd!fM`<izSQqui0`48knE(HeKHrw|wrMnS|3g8E=sg>sOL z>#WV9RtKaFT&#|YvG24O&mN)r;oFXV?e?2*JsjgQ>crU~Y;I=86ifgLX4Wl^^2f)8 zS^EB)J5RlH;k`2#W-X>VF2)7o$he$M>zqyN*4oC~8f}Z*P*Ssi<gUqcqVDOHJNdZo zIR`9dAws08nE<$fa`)ou<}m4BQwhM{=8f>bj=sHwUnZU{SHVW;CqCk4e1)MMK+G_R z5EDi7k}-4=2ABefS-@f*6oEAckB&mT;#>&|2{9JzF=q}%h+vcn3#eAqmtNd2PmPU? z)yxzQhBCkm-&X+dW4{5|$7jg`h`TbSgYTs;686yN&I1Mzm>?}IIY%HFs<JGJ%NXKl zs8ey1ZryFD8KIL|s;BN9&WXTKc957DS%7C(0s(tdS?}j;pUz%!CYba(OA>&=WW7^p zSJ1hU1BBm-z5(ca0CsijWPSaJ3kJZt8n{b@fs+|X0{61NK)rfcp-veT1i7_PK}>_g zf=3>$A3J;g?AgtH_0eOamBa6Co%_#!_QK1rz5aLq#b2FNHbNnN$=pk9%^f5GE(Ass zz?$+w%dsr}zTf}q^Y_jE+h4r)*sD*;#&xUf$Iopoghc`(3nPYB+e}~yMHHza>cS)p z0~tV0Odv=9-pS77Zs`4gGI^$6jEDZ>kh3qfs;1NdWR@HNE158uD8Sqq<ka!SI^P>O zdW$Ec026pYB*Magk~_IcGDtb#z)4#oii1H_1hPik=70RJfB5oh`Rxa8`|_<PigE~G z5GWxVIwPCFLBf!b0KpnHiZg=AJ%>l9zI*$Z9=!dBPk#8z=iYhy%;^#X6d_A6^X!mV z6(C+Tfx*oEzN_Q^27(itkOo3QuEYix5+Vy&(!SYx&IdpYatDDN;^+kBjK0a#%Y7*m z0Z<~bJqayfaNTnt>RT^oGIIy4r{<Ffn8VEsvaB)*OBkr%U72@o^sZ#myAt(>!SbGM zCH4Qm$}m%-J?)2kcXWSw4ku?ULB!bm)1qZV&eS#M4kiy#A=J4Ahy{kQnln)h90(2w z0a45fLNyw$WWn5;IF7@O;iBE1pL^%XRcl8^^rwI2Yk$%MHyj7nVZ)%i7v7s3Jb@yh zS@t~!B8Y^%*ewR5qNpxy=bydy>QCO=e0JBiF!bsGg>k^ZQd~^U>RfU;8m>(1Z3dHj zf;k%n^_bz=lCodMasy!Q$^hJeCD-4S%$$1nOe_cA9d!yF9NmHvZcL;O5`Y<G&H{!r zgZq?pfC(ZTi6T*8Dg;Hv6`7ckvva|NF~wns5zWr&a=JKJHFq2ueEqgtzHsfq4Im=d z^E$hVNKs0N1)yr44Z@Lxb8AA#K>GMNJ8ggP^qX()kYO|!uOfPyXKTd`&0IYtYv!IB zN)5C@ZYcqpJ$sidPG;~#W-#@Xdg>d{7vroTIAw>x4Q4QMr_NFq{9EjO9DLbK(?7ME z#-4JQi3EMPFZGQ8bFa~52H4G*#d{A{fQ4CzgL-s{%w6OcQE(1U!7YFaMkEvkihx)l z4iI=y6=jo|s9S1)5HN6YGl2T|0wy9yAD6+j_jYN3?neOZW4{5|$7hQI<X6=FJ&6Gf zX9Fv-ld$_<E-%1<n`%{63}}l|TkKx+HV<XA2qA;e`zn)n=M=LNkU(l3$s(%-hca?t zt6VaSAsM+Nk{H|x=1$AmClkn+h@{^D(9*`mxql4*7E%-8Q*dX8x?@RtaTu9<$M1KA z^^|Xr^$Q08uFeD(^5CAxf@@-CP$m^mroq8xQC&;b*gBO5j=}2pFYF9N53L+&g1`RJ zyG?CW7_oz?yUa>N%&oaI0+GN4CP;`j0*|5V!11G_oBoV@|EtF~|Hr3Z|M1M&@ye08 zaYisOyOA2VDvpvVljIQH)jjvMiwI01fy^Px>k0r0YGLY5a9wWJ9gZu(T~Fp+aDy2# zxlm7R$mG$1o&duAHG~-%vLV7Ed8fi-hoNu^>V+bz$GXXdhf!IuFX{{DDc9@PZk_$$ z_Css;-h9)|*PbW>c6Vo_)4?#rq5_cM1a(luplCvQC}r|C)!Q-TV{vuuAP#-$s(Y@# z>c9J=N8dR=efQkO?L=j@DuYRzwV5?#G$LjW+OZZG90Nsx3zUEgq|P1vBf2{=k!f!- zOUpKZ2)0bACIbY}-UZ*UXja|HK%`(HR{#!!DM&$G%^hG0Hh6+D%wS+sGBq`ZQ5V5$ zSi%5dz?TVJFz;@mwk-O!^L|2i>{b8P-RT5#Q--@M{Z3ZKlJVnR)g{zZw1t?uIMu!x z;L=QpM94Uh1wm0Fh-V}A7$p)6hyffU+c1<XiyA!Q;bb_^n-|}IXLY@J;Eody+;sJy z{KdO&9)VLHiUv=qT}%!h*sZ7LF`AST#2Bn#0L*bz&r_?-pjv<Afz{P(Q9k$H^wsx5 z9PK7#Z9&5rMyNuQtX<^519D<h)|@n}CRhv0-6F+}Ox>0vYgT0du)QrQ+!?+U%p1^g zzl?f2GAvh={qKgCj*w0OF9VMyxD>?ErEn=Bg-E4b1gV^(a|w=4lG<csVWlXC&Q#NU zR@&@D%-5}jFWr9A*Y7-X1SpW(`cf3E4M#x8?wPCw0A^-JP=G<%O&|%V0SC^{>Umt5 z6*0BGnA2jOn?+_gJEV0_O09ZIo?Fiia^q^qg6z=LJuRtMjb~Hco2T@z$xhBr<c3U8 zxWNGzxGxi0mXCK}?_&K{I1>vlZ)KLzG5sqtfy4nO?Fm4D5Tp0^WCF7=OYjhd#f2yY z6Oaf3c~RKMtrlXWP<bd3DufaeV?dD>gFG$Tsm*uV`KpgVfL!tGCBJO+X<!m|VeJ|K z#y<alANvi!K0X`pEA)I${kiqc02#587zZHGk}a-402mPB0;E9Uxbfil)R5<ki!HTn zSZ@(wAOl+<jl=~wQxK=tD7iJ+vu8(X$Uq&Cg)DSL1)>aB>PK<rPUt|)eF?(LXm<hn zoKeT#Mwkqa-;RE~-JkRpq|`m!U<6|~vkY@a_edimGXueu!2)K_0tqew%tpil<Uqnu zHzqUg#iPt^qvc>YT#c0L?N*h-!O4NBp|Zq`2DxD(kdp|pfC)f0vxVBi(1hqDgR!pj z!kOvDA^x(5)<1v8L*IY#y+3^B<>Bbab}H&NkjFxKpj;$l_8dy3XnUqTPHx7qJ?|NS zT|1h`auf{((~=_vS~fiBv8-cY)R{`c2|_Rj_mO3N?r9&i2@>kSo$M1}${dVJrBb<4 zDj*@XQ}McBRC&u6=MPo5{=n$lU-|tT4-b!Qpdx@UoJ<6xyqLkNNQl5f+nO2`S5|l5 zz&O%mV}QD87TcG~P~18i-*f{Wx#8i*U)%ovV=q1N`uiVF&&=D+78ODZ&kQ(|IWph@ z9D_#&f@v@|&VU8C1VliQTIvWxCIolO&I*v5V(C6bAV7%VbXhq8fM7i%#6eEIJES{| zhyp-P2J>#`;FhVMDVtmOS77Xb_U#&>R|E9$o{8VjD$QN3&+hG9o>a*)OyP+<xn(z7 zb^>Ou1Y7nnSk`4m!~hYN(p~D-gS=E#iZh`n;IUIcF;Qb=XIGELMM34rLvYE$Ui=yn z?g$YQOY#vFYiZtw+>VF~K{W|qzWcgA<xBTJcy)=Ho`4iFz+`vY6vNeoh%y(%5iU@8 z0^qPVn}k(k)(mH?6COT@>%MaG_a8X<AOG~#w|95X*R}`~9~8;U*_4}kn#2Oxk+bBa z)>V@VGDu+V#SFa`e_4XM!3cB(!;pKgn>`(P|6pF8Sa-SlYbXu~5x|ZBE~u;WWng<n zXDBIDDg{d^F*=9g%1UbuMJuYD(<R@za3JK9EBwv7ZvE<=*IYXRsc&ESh{thtG!*1| zwi#ojVn~RNn85}!&8370sAoeo?-`yujczrzlNi}u0uu+~cD~5lyHyb=HI$O&<f(N{ znv>_miIB}zFE2w}U6s5SIKbVI$%vTUotPaADEt!)%-==+??yYH1YchEGQru20d|1k zPRmy#C%E`BnwzDIoEIVnF@#AXVxUMK+{F+=7C|UIMvtXbBQFBSiet%KFvW<nLK@eX zHbS#Dpu-gn;IQ183-{^8my_?s$qnQZz~T%g7~m}Xb;UmR8-RU$roflee4H2#@7n`5 zD!ikZgL?M{a_J}v5QDFk^6-uF{<}xtdFR*4yGw>>JW$FV2^<pL2yO^s+!)tp>{de@ zn!yAuo!m9UxSK4p1vhod?t&gny}Pp+F*`en1ACi>y@j&lcfuVV$kD%hbs%$7c95$> zNtN9C@xQ4v5ex+LPGAsS2o|715{QURz)mJ`CP_>|B_d}e^280Pdy1^(pa`*WoeD`H z2cVwS;S`7@06C)|6v9Oq5rR1p%>khHVZp<ISxUlsa9CaU;K|S3dey)G{l`As<?|X$ zM<tJ>kO;}(8qx}NrYqd-cFdI64die`*UC5y@Ff9>`$64Ot_r|e+?Ac3=@UF$7$8J+ z1uvYPAR#&jl86u>Od=$Vz&VmJAp}UN5{!e90ANjPMHqT5m(KG1%*hr0+U+-e`R<#J z4>2MHz=1ZUCO1P0RWY_%%T)<R33fCDGcXe+l+=<isz_B3SVFsPK`Ji4ebee4H-7$? zuio&3CtiKxjrY&jO<7jF)e<SLNUt&>4{+){L!cz2VxANXQ+1H0UKYyg6x_fr&Tv;I zUee8+t}vqNN#sP!d9b-Fz`diU3rvaJP2lX7-4v{D4h2~Ob1^6Mb-nxVPV!zh!LCN; zWZ0tvxqDZx^{ut{_nR5{QoXwOG+2@=`qr2U&a@=?fIu8T>?B5n<q`lCQH)?>l$;b% zITl_F5P~BSrw|Gu2tfoPGCL<*96G!%x^2_5cU-&jr+@1kU%q>EC}85KhGNs%&U9Lh zS0^hgnJ~+c5DnI#T{Lxct*VL;Imm9)#<D7ke)%#4t`Qtw!BxM1^DkcA`O))lymbEk z3-zomHaM&e#--L-+}W5>5F3%yBF-u~OZ24$szC&*9vDfL&__a%e!~99(V_b-Gl`Rd zWI59&5QxP3h}q~Az=5a$MdyKY0WKi}NVHH=h>(IpuplIUvAw|5j)H}DF<e|YGO%yn zbMto}y7klwiYAxyrYL#k$Od37vTCjd18{6nOhGeuB1AAtk-CNzx?EuZK;txTvKy1z zV$rnQi=aN>fWa{B?s#sXHEHXb&>cBha?;G&HKk7IPZ-@rBkKrb+|7uH5gY~>but<! zbKX-({2x%J0dR)*%9G`CR|w*L*UiQtNZ$#IfcvSCvw(vK@eoi1kE{|bMCTH*L>wSS zD=QL_Adx&$uAB>BjBK&O+b61UY%;v@;OOXxhCpi>PE5jkX_zER<jzV4={TtU;Ot*J zHr%f!_Oagp?Bg>4`xsKht=(C%HcAExVv6Yki#DlaS~u=7N-^7=9*<R%p#e~n0Cp#| z1YPCoDC95u*0s~=wP$AdH~;XN_qVrq>e^%FVXz?7#*jh=6KI?2U2mooOW~B88PX17 z02x@|0XdV4WrbyAQUK-vxF7Ee2=3XIxvjmq4}m23a?X@A{~ADGrr!S!P(#~dI2>X( zi44?Qc+Z!BIXX+kZhESjkUK%7o9*c@MY#J40>RB(plVE{1qqBA&*Va;a5cn;M6kjG zP;e+YFH(~hJTL$(A$t<xfRNw-?;6a}2w0&B!y*i17-4O0i-DvTT(=`>M&2~OI|+jm z<MDle+UKA6(0=&ryHCGyZgakcFjA@(CW!_lQIjAql#60ixWqKwW)2h*LQAP3HP6|S zI|;{uYCujfff>BBjMTsY1h&U&VC<Q|^d%sf!@(e?5IfDI8C;dauOT4>k1`c5$HNe# zf><P0LZms*i?*4>R4g{vvHit6PX4K1y647qq_(Z7V8G#y#w7)z$N^3~C~cn2I8;&= zL$#J!BL=S6o4%s0(e6UPQVsK5q&!CBZ`^X|o?8yR^kM!VfBN{(fAzFyE33$EZEJ^C zcvB%|F<cw$E`qmWD5}9Yr@CG2fE|Tk1{di#PGkzp>;iL^&?Rd1-6K29&CPqIyn<kE zOK&SMu`_xP8B%iMZoteX+{`nSVF1W2lVt`{-IN0lAxx(WUKuQMGZazp=krV1DpRLp zhl1>~BUZ-+a?dHV+4AQ%Sn8<%v@|dM7zV)6XQS@T{@oe<0Gq7u1VX=Al8;Y91*s4s zf-@PHKozALC@662X*yY5aUcR^L|`Y(%VB7nOV_WBzW&Age*b|J_ngE8Km(wGD3>%T zS52x+$ObrCMJWsv^E8`Og(Ct0yodxSAOd47G%upqK^jb`xcZir&)t0Ak6+*Z!x!Fv z@$7pu+b*gD^OOszVx*j;ZGt+8ivS~<nl0Qt6wwGt6NOL|k{twNhr>D+lw}3L>}1sE zqyg+ozL#4_%-qLV5kUfR%vpp7gd#b)N0Nz`6)1Ejm7w4vp(=k3CTe^)t~6zsRkNLy z`RsEikNhbQ-}~?lE9()ySP&(!E^S~DJt%RV+fbAXl)H{Zh`_rSrq>-D16%-Q42B#L z6u1OTR@X>BvU-86q8_c~Hk&%?hEok~J=IwoSZkVKimb?qwew5J9iyyEJyWyGd{D5v z00bk;ZeW5sl53}HCvc)T=u#AzIRp@>i_hbw5`~#W1Ox|y2zhVv#vH(b#K_TYrr|K^ zRW#kg1z;m04v+v6Fu4SiXd!qE76XbA;s6{WB?coIPqeLxbzIQeh$~8*wkp?ytl$3J zjW--!yXElcAY<ey+FYarhzxnTA<yIrQsN9aXfPUOhX5h&muLIfZvgi38G!@}A;gc- zG`TUPZ0>;r%CfA6>RfH^ECPtV_ct(r;cyTfnuT&nzCq&&kOr8r{at_YJ^#ZmPXGL| z=Pu5t8rRH2=7=!Z-P{S~a8Mq~i$Ocv&dnk^XjJ7z<C4)8{hZt~kh*OET@jk(K<82p z35);}2t&}*a)|acm-yd+p~EMw+zH08-aFm37e|uuUTvfVFm(ejSMG$!E&!7=v5{xE z5E6C4QAEf9F=vxluql&}=S0W=0D%P<K%GACM^C(V;<}rzK7tsq-3ZMVhlUu3l?%JG z_3<d6fEnspDJXSbcn&f;bXC0b*tI`@`NSVR_1a7Coo}cZj1H*BOk$CeN6Tt%2!#wM z-ZaDwNQfCJ5rY9^Qp<2hKfcsnu*u1ZVG8NUA^ZuSB@Qm#lOnnVgg{&<h(nB3MKKZw z3IahE=CzHTrUugLsEVvMJr_g|j|!V@#@(&Eu0HrDzVwX;u8X4<#cX<DR4&jcD0GxG zW`fr`*Oq{4xDpj;49US#2(UfJp&_!t3{ilpKskoCnC@aSDajd0AOm1<EUbR+&ihXs z{crxqpIkV1HrmG32l>)2YM>fKTcq*I0ZmoAo3<BCS(Yn@kL{!dwl7*N$r$EjW~Oco zQ(}cVsOx{!VdOC6eox{C3UCDlf?)}FrQQgLK(sWQ(NB{i$kD-<!Q2M)vBZF(hyNCR zyMqj>zNEUb8(<7L3>}ZfI-UI|M43+L!P0Sl`t$z(l$nDugTy7EJD9))R@b1C>t>#7 zq-?<yBq6L+p_qozpelj)FP!ty;c-d3?aq;jfBw#2kF@W&?<7tLiVW0>G(~g_BSJ`O zyG`v}RV9d_z$W03a(r+OoSW}T(;i-5t2j4#x79jEsaPZsL4ellouV9{qLr`RxO#Yf z{N&pgAAj|u*FJdu@Y+>%vzwC;ia|Ay%sWlnEN0_adZ8jj-gkO=F>O+kAcUyyfO%$e zav>1ZjEDer5Sapj$N*629Z{D<=+17Y7z|b+g|R4DgHRkGRL+bbGOS`*g3QvavFUg? zI<!icW^cf^uQ_z^Pr3i$Kk3d>r%IF!?7}v$4ncqj7;Vle8#qWPy%=8vE@jLZiLkrC z)6c#3_Uh=H_uotalN&M+dTyr^auOw^Eb5eMN;zcr)OxOwlIE7JRcp~N0Wy2$ZaC5f zNO!th7|fOdGCh%zK%J7j4^UZpRXOZ8<XBGVK?Vpul||#dvr%UNs+|CUdc{|#^i`OU z!@JKAIf9E22V*f77m-+a2*qTzRs{+aBO0!G5dqTFj#fwBY**Ncbqej)MrB{R@9uAX z;l@d@gB7m<rK4!4;1)gcwE|#EyF8_j53mIBuFU~>-vVeK`whT8J}da(qmMq^+4*Sm zLcKCv5E`>I(`4mB2j@21i#v5A6=VoAS0nPhD0bM=4iBktFn41?T^XiLRDbmsj(y{< zWB=2yUi{e$?<|r?G1*P+@YtbdVe@HCCM$zORq49BGo5XQL7BbroRBkVbjzRynpw0L zHM)0`N^%C20|>${&H+LYK$w}$iT2t6LI=a|#!^E`OTL7=^+LCPTW#JkC;+COo=vor zACN+XNDSN+bKEroy(^JBfwGe$5KHnvD$J(25i~#~6bg~dDkez4V{g3o=!NF+)hBPb zcJ=yI94I#$fW2Os6b_xv=bG}U7>8KGZP2upx5{xvaQOCk?{&97_O|}`>6f2;?VV6; zI1PkY9Cg;5GP6{pQA>;*!L7F<(pX|pL(0&AEZ~F?U<ON2V+&@+Bv_I{x}vbF$~%v3 zXE6>4B|`L2P%OBpxF|S?I;kaB(-=}xtgaSFso5NHeQ;n!vz^{Qeb03#e(y_Pe&n|C z0FXHj4gedXUZ7xe)6}x(z$8U1rDz7_d9zJm)9~SkZL>&+*GEU!F&<!7F^O<sx1D=x zhGh|o62$~yfFop}7Kv9GC$AabdwhKA(82Hj@Tb1G$O$VY)(WhS%lFP*<d_t(sLB}2 zl$xFS9MN&`pzrKJBh1xOPgHY*DLY&VWU%a=A)<0`0mQVI8PM$pJ`H#EJ?ACbtHlX^ zg*O!7fWozxox;&$Z{PLF>faoDs$K;YZkLxfL=MLu`ftd49_szKWp*$T13>S;E&!24 zqUaJRNN1b`VH1HFLg3*_B`Xw?N6J+wBkz9n{>h`0VG$j;`rzRYXIfwS@V*;v`Lq9| z`|h~z(2eUD0@N4?s2o)Vx8B((R7Ic+Y&tH?vR7f(uvLQt)`yr3C+kBfkY^W0BOV4t zUN{v*qon-n*6zsR6-Tpz`3*F>>X6*Fe)zT(dG1hr=I!?`d6;65dD1A_whTHP42HQr zP3Y|GjR~<TolIvA!XEV;WMH<;*2zAgu#WF8z0w0<W)KmFZWZPvB#}5;95`YIDKkRh zp@0Oim7}U{7s+NT<H2x3rrGK<slIUgk;RuDxb<82J#fRIS_jww0*_Y#AbYO0CPNXq zDjZ<}Try-v6L41X^z+l#UVG)jJFovKUw+W~3fdUNFo3%TfKuWFq*l}|Es!#@A~heM zw5~0*CCjh`RcNN1$ Mw%T8zf7s@bHstYKtQ-U_MB1$J)H2{;pjnxCAimfp||!2 z1S}-vt}YG`nV{Fg_lgvQ5C;vxMO+Gms4+TM^;{qoMx!`fMKv&XMG}}U&aZ^UP`3`n z^!fWwe&><9Z#*~>Z&!&5C}|9-fwd49CN=L#K1;U@BPat7-P$>SakDJTg0$3jzo^*9 zegm+N&jvO&HVziWLBWAThuR<u^?EloDO9=K^~D%P<iT{>!i=*CEB4TH0~7$kqAL@# z)q*r+?0{|=mxsT3`|Y>g@cpM=d+M$8v9?P)?^e};YGcd|<?Tf~Z%Q6)tXG@14MgJB zC3#BF7Dk}#Zsg`_dyac>0y43)2j-x%=d{7SR*Z?6iT3<UF565Hbw_`PW2tE)^l<GB zRhAn7vrMjzJxM3XVdTBUjRUEH9LT**5Fo}zEhQ4N4B|}gAZ8K=yOXPGB6RXnc0&dm zyP$P!aq-GKA5GuAaKlH}e)0Be?mCVW5gSxZ>v_pO7)~OPf%&X0-OE^!x1rf7NY=vW zh5^R6$no_%9=QFcKm7UAmv*-1tx7ef;dr``t!X{qZDKWY5;%d$+m6*uo)gp|1vJ4D zOyN<~pxIKRFfyklftOgi&|KmG77qawA%akVi&%{^klX~!LO~?P=!2*OvH7KPKqoc= zZ*8TI-o5?W!{7YYS0B0a)JA~{U_(&=4rHwt2~<_FDykB2&uyJ-S9mJC#k>n#0AARf zKl<Y*woh;WdZ7Q^uU>QAk=_y~hf3m5NNU((J{^}uAyEKP<(x$V1CjB_&687yfB*Db zuNN7^0nRtzG(E6ZEeK5uH(`=;P$&;~^9~kMl%=b?8L4<ySb~{*a_g292}bS;W0H<@ zzodfqgda8n_l5Xn_a0tW{lDpr=nU}k9(M1zLS%h_13S<kOQT*xU+ybh9B?)0p4TlC z0Rqo(MqdazgW(SJG9EC9WN)C`O|q#IbAyQm2#^BIB!x>L2?z`h5J4dTjDrOsX7yT| zS#I+6$2Ja+^Dt5~o2`xplc0afS0DV-|CDc?T1#u8j+l8)#y}iEDKDBZ9D{kG*iLy) z<fRxPjKePQ=xgbJ`qeLY>-vFv@B8vy2X84Mz(%!^=NH3(5rzagdwxrJ_2{u1fn7r5 z+LmTz9E}2Bb<2S-+;ZTjFK#^k`iD=xarVM|S{8`qMj}^LW3U7#OO2XaU=G!Qh&;8< zq;ST-DI3_m6SzB>Ih4%ZFPjBfr<dU1;BF`B5={zaQ4m-V3mO!mDi8$Z?2EO5k17`I z<lWth^2y^zZ@K2?Z$EtamZPhyC<#_C>arZh2pEt7Do_<Mq5-DBHhjDFQNb^6;pGpT zvpdbZXD?hhJI`}(P&xoW+?ZHkjLzMZVTPp0>e)%NYvXEN-EW$Z6EwjxTUJ$QqMTrv z%-yrQlIbVfPGVwr00w7vpnqPuE*n`>(5Dx$T|*0F5IzCw0Wg6;Y)mZuLIB=HEI9gU zRA2pfN);3FSRzJnL{WGwm@6qJS=q@_T_e>}U^3v9p|?91j#T#G9an$n;al!Lu`)&) zVtYuGtw9c)s{kMb2ngaV4*1>%fU?sv=Xp@YvIrpv5V_nhD)zD80PN$lf$%Zn$IvJt z88|CEsV<r{ubT!AC$`MF<)G{!bRZbOLAfMia)AM^0oLqp9-JIp0I6*sI9}d){LUvn z@*h6&;)`#doi!Jl#g?bCiY2c^Pn1=GLElbf0SS}<LKe4<WufNX(i!9+5|T{DWXv2u zy0nnsk3qdGwa4XLf!_-5O<A-zPC>T{FkF!r26KWN8PGFMy^mu8b+b}!;aJKIGO-XV zDQ9v|N+4G@g8^AdjnrXRF2u<)P!kq1u$9&AmLGk8`_=azy>>Nz^_G)gy5-=}YUtFv z_>rR+6>c!i0~Rn>aLRMfgA;)c9mD;{iU&?U{P^={9((TP4=<f=+sT;6JS>`O)MPgy zi+!wZU-Pj*9jeF-6_~=aAv;kotz&g887U+Hf%ixtU7UVEC?G*a%#;|hh-FzyU=g7L zXwDA@R5hErbLpmo<=4OT#YgVE{=`Zg1M}H@-lPK?tAUVO)7Gl-ngyt$P0oQ3VgjbX zdEh<Z$Ios)^ZNVq21(X0QU2)3R~~!wwZHgJx&MX}lcO62adgK37=puaWvV`KlmrRF z)cfKWPHc4JI&QrC#-?qCD5s`3oIJ4k`nlch3mXS+8mu4Q+MF$#c`Rj6RSUF|gcWY8 znh+Gq$OacTcLs=|8Ll9A%K*U$a6tQ((G_qbrmp+^q%X?S!wTjd=ia*eJK_y>)rPw| z8KA@tR$Nx^+A;$53Qd6d<r5{C5%>zxDtyV~f^=OS_uq{^2Ami@*Pn?)zXYJ*62amU z5u%6462XE1DMd4Kb|sFn7(@(8S&ez!)BODVhgPc9VXJ9#!qs2@=Y8wY5QEef-he_5 z+=4c}VTob9l7U6WJRyZZ5mVsZIo>&6|Ln=P&b53V8&k>u(a&H0&;F;KuU~iS&-v0F zk6ax`!=sw(y4fv@!TO<t;@F)c4hj(t%*g8V*&q~EQI3I)+mGFR;?OOp&OQ6~#h2gP z{ovxJ`J|{O1VBnDgqc%HY8gf-3V^$Y*-634nIQ@d=0>jW3iG88zV*KbCgq+21P&&_ zC3uVwMkr!chO(eQ#2P5CuasWzO0zo-`Otyl##2{)?!LPpys0_?Senh6X*nJhgUW$9 z5Gn+NI$B_wu?b8AYEWCylNa#IXU{(O)|rM&<6syE8qHM<ARxHGJg_fQr3or9b`y6s zg<FTzP5s?k(!{E4nN+C{kINke2=4B^o#%3c<ZkTUnBL(;Y-HSN=9Qe>dGDF|zblt! zIlf_LLqF4D7I<JMXJmC^Trrhk;^536_7D(D#1c{<Miiw>8OkA>30oP#T#L_(G#%_N z9=h)E?|tds&)>2>bd=4`!7>)`-RY&tcnz^29smF`G}po{aR3y{?w%Bs00&vQI$2#^ zU0E4Mpt5}v(0%MT0Q>liAbyPEe}QN~A})#|duR+H1QB6pOBvb*Ri;D$uq++ivP&js z6w(zL6u~?iP13Ao(W|R!4xCp!beQh@Q|@@?&6|Gp{OiAX>ecf*I$SwgP7W?=+u2zl zMmAOw;sh3C1_hS}S=k+GaCN6;4VsCJDT+m9hAe|OiTV<Yq)(9f6o{5Y2s1MGB@<)m z*Y10OJ6!uaVP@KU(m~xBfHU_M7iDK>2XTLGNC_+^1ntzBfVp-gVdrej)>Uhy1Yv89 z7C=pyCaGm?gTbQJ-R*PdHZNV;p1$(#`1c;V<K&@YB_byb2!{fQ(W(^$af5pqgTOOr z2IRRvut8US{^<1w%O_rX=b5+8zq>W#Vq?5AO1oK!31Y;~9gT;{BH9d6kbn{_L*YUI zA$C59fzhK+FOmq3EYXFXBcf1@2vLf{Ohe$JDmie<ZIi4@>BK7K%@2>SmEU~i?yuZ? z)5%qgff4MZGw+=^dR#_T);yo5>em>T>QKVmQD=h)fD6E@m+<-}{AYjk*hjOp)3}6T z0kOe`N<N*NzvG|&Hy^qGmT!FJi+A3#b~qveQvewofdFV9TuX3+IlGO>>sfPXG~8X( z0pa*S{>(q=oA}|A&%ZUjxH;Xbtt!`;2b=SYxokELADCUNVFWc;@{}wKLMBt>3?ion z%%tY5Fo9+;!xSJWzz!!`jyoM-Vp}pB&>dYHaAo-JGW!BxH`4Cwm+LBD9)@ldYDSkS z6xL^_+7&T>a9W0{Dua4vI1z{f0EH8H`PU&1LO1p2KoD?Xj!Mk2GG>wzAtD40kvMQv z=FEkZ)u1efKrP->lvbjxliqUoO-ClomL*Vzu0~wAFkd}TpikVO1WH7LfdUHv0Xd)n z&SX6QE`IvdGf%(tR<e}^mpervlSvp}HLI)t@yYj|e)9EuPaXJEzW%^NcMK_1=jXm5 zSYw0=BqdNffr17hz|ppp^QfxsUJcjYd;HGpkN@nY3y;0@-kWDOx9Y9z<D3GqQw)Kr zZQ-6c1oAybUm}Sn>Y7Ni=f=UX(DR01=)vGU8(fA2aP-J1147^!xnyv5vOrpjw$rUL z?;aY5du}}b#rtl%^M->5A_joW)0pGxXsFN@snwQ<jR%=|X4pw+0%n5qhPN)^{Y&j1 z{^;qcRcWw+YP`9%+itb%iNj!`0Ks4iW`PBOdRHkn7k72H<RI@d06QjRCRaCOQ<%b% zTZS3AyLQ!o?n9&Z2x(o&wzG2=h}QEe0d;r!O$#>1{|*rCy_ySg-vgj?p9L7vsb8`Y zF*AdiM2HIy;#~s}3d90M$r2h{3`-dlE;{41wN~YuuUftFsuO?SpM1Y8e6?*47DZVO zQoU{NE8_zIg9;<C0htq_Wibl6*8l*{-D@VnwQaMeYzB2T-ERQ)vEKmf<1>OLwRL}J zhN!~K`luF%8q^e?*%B<VDPNvjGng|;0|;V3M~M#s(JjO>O2%xf8CK=>6%uf6u7|EG zZdkqjj;jwo@%EW#-@W+$)?29<53fGhY@6i35<Iuafixhs$N?$Am9$edV#&`TqTKDY znFLG-AZG4W2tEEcXaD`D_tKiWTIv%Gz!F$S2js5OQjqM8Z;1?M&TbAiCni+_M^y%s zI>A|8vIlo$L^p)o`<P^g6K3LF15hhXYuizm(dz24HMAGsxcJV?&%E~2*Wdlhy?1=) z;Tvz7fPme)VX~D#?hYvcnl_6?J)=m~U~u&?zI*1w69<o<xPATZo7W$EBmd&%Gta!Y z^}*Ioh-34p<Q#=nC<F?@Ek`lWs=4*lkY>*UN+1z;g0VW`GLM`QI7F3#Ik+$+A_x@$ zA#xD|RD>YZYMXLXmgT`=IF>&6?$>Yo;zM^GUcmqu1B7;Kcl)ZNCo_DJatK8=2@Ir+ zh2=S06N?;W3wU!IkG^u@7tg-?@_U<H9@<%yS|<dot(4<x)bh^Ro%!Iz13!IZ^XD)B zH`gASeDR(ezI4w`x1B5x27C-P<ODZj5R`??xLvFVhb<;U+1<UQgVF6Lk4*l8-+%F4 z{14xI=BdZuF|H0B*eFMSp+2`*Oyh8j%x*>+oTG(=+>)zt>%!iWb0*H@;#s?DpBOL( z2(AFZuk?)Xsm<WMCn^JM{pXg3w${sVop7b`yaD#R(=C=R{ve``J=8TE1af==P5?>w zow+wP2N4+ygAGI+hyzm~3C=OFNGy#bNr4clC=i4=a7eK*3KF<d=X$XyY_YP!*B+ky zsb75H3wInVfa%WG+S(w(p!uo;!+C}w21XDJfD+hs+ibE`MFP$wJpSV1=a0Yq+B@gw zH3vCTayb}I>iJ^(;w6mNRz`<uviiZ+rSoq$|II)D-(7qC+Mn?!zWA-%h771-jr)|6 z)?h9nK!D&<qNo&gLNeSu!LiRBy#Ky~KX~@tpFI7}&Z4}qX?5L%vIru?Y!Wyym?evn zK!k#cn&pBt=fvb0*2SnfdYF?i2V(KA2M`vH8d*z1Adluz)s4^=ktY?nZXUSf`Y+#e z^BpHQPK>e2h-iJ0BM&(O3ZJJ^(r_e6+tZt8<NDz#SG#4{2Hv0J$(Of(`q&H4z4pP% zv6D>^ND7HnTe7U=_TtXDOWTUcUaZR%242V}$;4dPO`QNX>ohG!o;hc>mMoKIQiYni z!nEV9?YT1an<fJFmJoiqkA=duKX-K}K;Zb_gT5;UsKZhNKoF1-0f0m{0ARqF14$R< zEfxz70kQHJEEI?(VgbS0q(rls>aAeY<12jMO-H}`xw{@bwN9Sb2B8FNGs}xy4b~w7 zg>l<tvW&=JsS<JGf&k!hNDg@hGNDU?V<HLx!G+!Ti;8{hHvs$iY@i4+mPIHemSThg z&=?bl4HUz#Q5feYvyr*)O(K;z0K_08GEqj#$c9K%vIyWUgfSVH0I+C@aAHtwsgDoR zse?yuzWK=U7vBHLGcUh={!G0)4aG6z(kX*UICuuY&e2$1GsG;X&Va&98O|Kt#bb05 z2mlfiV$LKgqD&4!4>OSU{2Wl9d-NN!OJ1JfH%_>FkL&v(xLKd_MD8x2E-hZb?tp>8 zfRYizTUaMdb8~RV>h8qFWPO;tGl&(W=)IM)2a1D;N?T9vL={brgmQRpr~Y^TyC;71 z^XLEEZ+-r|4;(vOl_94>1V{oSa3}{G<*0L-Z|dpIM-Mlaw;DYVtFPY@Zoc`%&z?W_ zv*+G<`Q3{P3=)^-?9yFff<_WoRV2|Mu8C5CoGB$z7w?tdmosmPjfI&J1tJ~8fnuO2 z$q9r&2(~D7F^qcR;PBR?<G=Vz4_>?8TbP(OA`r;hWPOh85Q;?x5@3J`G=vW`=D@iI z&%JT!r_a9e{F@gx7lC*KP05IHKvCFJv(wHTiHh;uV_aJ;y!mkV;(z(0=U#Z_ov(lX zjxXJF?Xd|;NChe35hgH#GgDEO44+-NP?g1GGAcpmwoYHScI@B{xbxb3p1Aj(|Nakt z_WC<7mTQxv8{_RoN?Im~q)J(c8cI&=q^`yeu^3dzN!+Xx1VhC=^$xR|xm&3$4P~j1 zuNJrf1mRB<{04xHxsPW6QTOBl8^F%}qq~DXsjlpU*BB%)?zJ(16T2&j9ea-I3UHTX z1ZV4-0U{?M67fh~I~~NNAFn!z6hT<PLQy;h6a`6yKzt@zvu_8-WLV$wYv;<Z-SyoE z4iya!l-S)mx4yOpt=*i20knpqgaO+vl7mas#IvH915dn>e(>mv&%OG=?mULD4k?@3 zK-}ay23Z*%G%goAEoELgaP@S$9oG)Lwsrm=`#1l)@7;Ll&-(g9U%FvbJ0=-Jfisk_ zP!x>H5d@qu3>YvjB=>@DE^y$%Q=h;4)PMi|)33a_b^7c~y)`PbC3O&29!W_-3Qm+W zi!x_qBI;d({bOAI>i~RdL+K<W0udJWQcN@k6v2Zn3e<<oaC990v_JWqzb^f6SVIMn zwgb0<%p-ZmVvd3lM*~nbo$o9nm+RMjfHX(=Fypb8&i~}mS6_Q)6EZn^^<5eVM#Zd^ z+}6-~<mOI`x+RB`0|W{Hr0?|lgkHB!*6PT{>Z%6KP;;nRW>>huvU%TfT0etXs!;$e zqak4oF*rLZj35G_W87I!PUAhlP-Pfl?={*9dFj+FOFOpA0K>p++!=5=6Z!}}h6D!@ z*a;>KVd4Nm2+;$3G>@JG5S=0w(n@n)cTXQI@yOlRefN=j?mIbJ1<)>5i(vImR+Qxs zlMyn!H4{ozu@Ex?1q>h+isZ=XS9%I4!3le`JIg(lF92+5zo^*9egm+N&ju{F+4Ed$ zL<B=hZr(bV8qkuOreI}m0V{J+)uC-14G_p96B{VO77H3qnut`w5YBC%Ke>7+1Q5Cs zC>uEkA;K_F17zUFF;0E%>OXPs)z7^0?yp`s^Su|(t87#S1vSle+cbg7a=4n6cIR_d zEd~-frFzHGlo8wo9+gWI2}SmR2&fSahF%2^E#jO30P5!CU@;J=_nBS}^aUi&V&nkt z(SZm?-ZQn$KZY610AsqMdoXkAxztVtoI6sFaSQ3Zt%;OvF^zG>G$Xqc>Slq7xWItO z%wDP4fZ2gym^&_P&jy7st2S98vWF0l(4ZJzbHkbQ@B9=0&iDTNAFup5zxU9W?mB(| zSV0j`7n%kTGLcNd<3LK7m24ZOwy0}_5ru<y$yaW_{*BYu|LC#zfA#D;)3z9_9coc+ zPj{!OW@d^^)mYrM&0e?EWDXXyOD1s;Q43pG_Q0VKYi4B?LRDJe6i6i)3EZfv3eqC& z4)WG@V}In<tG{vot@mG7t^i0mHx1Z1Mgu9(z!y$VBt6p>wL=xNfL9GadfJ|N`q|Ux zwz3y39S}yFZ9D)xyP2D-XSf5w2~MtV4GOOgE!y!@7ur|<hu8j{|LOTZ_3Mv3bo+tZ zkDvm@Ru2{^(3oqcRa2B}M_3Y&3e-2Qg@ny9iX$?*_H%gn<}d!@>2p7Q;>EYmp06;L z$$`Z@H|;Edg9P#{<RTnc$hcJ@br2hZ)(xh+C<C&<6fi<To+%r-QCBHAcWiNx5QmN| z4oHp?Vo4D_!8(QnFPQ@fS(}^;ML?gAmf!&-g6VXMSfDjHy6kRpb|ZkvLT?F5sS9ah zX6p0;#?+_gkuw`bu=LJO79)*_LT1fkS||!gU?MW;XfTjaB<CE6MkN&kc8<+#h=r%q zht}e+N!5SGckekC;I=z1Q2^!I0A}hVaHU2D3`-a=11=dFK@FU%@%ASE)BpbI4=&8k zU22l86meoyni2(@Ba^1=Y+0R}f&&pX^AyFAbW*Oj93Oq=qi0_H@4o!deSgZAZv5O; zSObOt2<8xnGt^+*|DCTEGz4m34Y;bneZPO~-Al(FeeU4To_gt(GZz)ZSgyAe+C>5v zTzo7EUd-y<OOjJr1fx>j9jb2bWS58EY$0+ir6^;J!co=Q+ztnWtc&1_u{DPVcH_~t zuiSR(p_@*goD_#k1UKZy2}Gd<&zr>%VK9s?m^v;c-z`?B0lUB!%AY=a;fIgD_|8YO zR)<_(U4)ga6`B-aA`nTzW&@vkN~RhJ0Fn%uIfJZs<V3bbEGC-V(>!FOtkkrUoec0^ zJPz#Ls+o~>Apqt`Zcg629yx*FOJbU_2V*jTV1<)9GN@CMgiyGXgrYT*B5IS1K`?Dh z;vBF}abgG|peW{%O9Lr&mi|uOa4;cvcZ6IgDo3FlI!o^28l#jEEIJ%SiIhmKa4va) z<kRzmbmq&qU-gZL?z#Kg!$$|000Wp5W!vVmSTRCtV1|^Sf?I1Yw26yx%Q(L~ziARB z*W=8I3M=Cjm;y6+o1u-9vxKN*#33@G<r4cYK>OHl0QT|Ofs-5AQrl$Y4!ANoS$Cfp z2v9=i%U_}(0%F7pP38e_p3kReTi0EC@X+d^_v`71!ypy~v4kKJT#*~)AeA5jV;}*C zOB}uP#I2`}-+qUE|It@odF72*jMp~~Y{xj8xj8F1j@E+ZwprBkI#5|vMTj(C?7(B@ zU@R_R>S(ONC@2N*M_mvHC<C_VTuMtd<R0~+H&XdsFeh^?b(uomk7}XLLasyv?zuw- z1sqQB1TWwQS2(jd+z1RfNI~%B7?xbfnScneAvuy`kdu%?mB0>Ca1lpZ=Z&M+6-N)h zf992c{NMa<es<S2fAZHKy7$_RRT@kL<cNYI0vXM`4IBtyXha*B#wb=$9u+=y0;k4T z-+tA`qc6Sp)N5~_-L9*R!`EGN)wv5h4oPlpR(D4z5yu0LX=|#a=v|B;>|Sz+ap)7v zDS0-6#~2EsKulO{eh|=}n8@evIPsnPZ+h_h;VL0*ZY=^;F_dKqg1KhR3L=pa6?5QX zvIRIsWWw2u*FVC4_2dVypP8ROJ6DY{R8W{{AVy9dy;v=?`JU9(SY4SoDuU6(Ni$LF z?Z5v&KJnCx>tDa`#xLHreri%|s#dCHEEsS>QVxnzh=Ia#@OBhvH*J|#H?CKwzJB<@ zdk_EMXK(%JsaIb(^F}c|u)Z-Y!mwV<=DX@99HgGjg9vg?(*^1loKO_lIDq*!$e{wL zySb5bCUxdW{ixraA`uw{VsbEuj97^QTk`7wA_H^3L4pC~pihy1dZjT00Qb*xVHYPR z>bhK8J_A7jn-CiSCMK{^0E=~sUJgL48!w`8RmDgtxCf%h%vfJv-`cvA>)B*=WjF|n zG;QYF<EUerA0FWI_uca+efy!C4xnwDdUx~Cqzaz1n!5mngwm;(CTuNQEyP5;!VGx% zEPn9Vdq02fjfGZQ3#wDaRC<mur>qPET2S^xAZ8+vlCTpMgJ?$NJREHBfogZU`NL;E zc=?TYfB)VCf6^m&Tz4Smj4@%z$UtPktj(=9DlwEr8GsQmb6nh6+`Tcl`KyQSx#=rE ze){cShX%ZL?$U)h*4D35E<~M$SCmn|wuc#FsG++XrMnwxkZxo^QW~U0VCe3UE&=K8 z?haA98wm;NKJ%UTJ?r}qp0%FZd;jkHy7ucmx*E|FKw(vklkJ(AwcC<b%D?A6oT~y* zut}gfn!ghj2%=^b(9-uj+$Ii(`t7hbT>E7NDBE`i{^$qLs93K=4blz~%h3_jhK<^! z1Rze3YxQ+(s&4*e>*$Pl-S&|Xsh>NY=)E|1Zb)^rA+<ZWj6jqW5|n3Qd*_r`md*vB zPT*Yprk1_iDV&ucQYBGdcO8i99@ct0K*4tvO%;UOdK;SSt$6L?bt{JC=<LcmDg`i` z{t=e#Y^mRlGeGmlkCi7Jgn<~sDkjE<=wglz<YzSJqlIB=V$9cT9Jzj!+nG5UF(JC1 z8XJS=>?gYEC@HMW=Sc8YsF6qb-wV7B#Gs7X#a2|HqEVM<eXCTRAwf%nW~`Z{ms+MP z+r!|>&rjG&s?wkcm)hOUHzPQ(RMpJ_C`^jF<gN=D`ky385cNZ)d4(fGCP^na4Vs66 zKjz${WX~x2d?Vle^}gs>T-4(%dtt3kJRQU*N>7DCibvaTw>9fCgq=4V=pJKhS=nZV zY1*=Xnk!y^Bk}Sys5jMN-T(dbX3vev%)S)P+c<<^!MF6R88^SC?t5)i91C&q1;L9; zBQ1y_AB6X@&&nQ=0d&}3uxHjIK&$d|oH!!k3V`+B0At0P{UUJw8PRMuYBnILT`V9- z@<g8<^J(Yu{bkhZg^?M>$i$j<1gjC+{vP$LIGj)&)beFBgN=pK*Y-B1+5c(81fKGK zF_Q2H;hDLWg-l_^mh~!Ww4)-)oiip{(ZnXB7rYJjng5d!ChxiKam?{S>|y-dy6^pS z)LB=(yYqAC{pxbDI}T+fCrahYnzxvKrk6=`M*8GH@*K!mAyc|9eq0|z)*)x*Z_Q%P z&!>k^HzSol;4(c2&kt_UMri~K*n%EKgQT2VK`8*4l>%Y^*JrLY3|+cu*utj{56ZYs z`1<jiG!gq@0RuNjWF&<UOL>&D<B?b;|15<skVP<PL?L}JB7H;!Pqgvoq}o?!!}oab zAnrK>|7z0#g+FqR1nQ81Uz^wielux+vlAYYV2_JpIZ#DIQuSdl_j>ZU>#6nF@BB`r z`=vC;XRnpVjcp-zX!JpJ)P6ZHi+TX?tw2r;&u$=z`uz%k-`ov!yRKn=njMd`n(%-m zJAh<Ca)2Jd1MN;C>kPh1j>riHybf4{S7)MyiBVnNg95<`fmy3xUU;RLNu#*h!=qpd z%I`JM-=wqfYhVt|$cWZ|{C=IJli*fAX?uK5t)0lV^7JoT;OlV|*1G5L7gWv~!{mHH z;kC62b8=l7Sh4DN2QlU_G-LhUR(z=%z=s!XiLcvx!ymjZpC`SK`)wVg%cz5x16b{* z)ZxNM%+}u0>8$Oaqf$h+37W1qy<VKe$!6{j{F&KZHJ4|vTRt1FgKqvu&D}RYzW%kK z&QcYmX4cmGK7hR{Xj^q0!cCW&;QZPBClGDbn|y(y`=%W0!{cwJ^}9J9r!LQnNz(7! zRSy9%22oK)B;4fWi#Ge;h)2O|UQm*zyg9G5Wu$&&osvKswN%0x>xRb{u?6y%?QA%0 z;Sy7TYA*<gOjxO=B}P&?X2VDK<K0_DgFrApiAWE*4a{Mfg=$m&edqIH)Y(@r+nkQ@ zIYS+l0l^<gd-PMb2s<|5DNcbfJAR$PGZ=ic$eyx`R$_$pIe%uYmBe^yYaiB^47Pv> z;uxIS6|H?Jf31=QnE3tjn3jQ^8%at^ddMQsVv7iqGGn77S$%WNqFG}OK@Av>U?T)G z%OMp^TM==Ul=Y*06*N9^OexVrV>uw2x44;XKYOb0y4f5}Pz}WUDZC%~^4zN-7u=N> zhWrU<zh|Nrv*Tqw#8X0)r*{9&S0KA0^c;w2_|kK-cET8sA}AHpfi=arj0IfzPy7TD z4sQ9ykqiE8IoYc&eG2b>C$CC6=OK~yH|_Kf<veWm)f2IcUQ9j01vpbH?@iqM>D32x zql7=w6_Dmlcf(;07O_p&%n2)F`(bh{3!<(^Q$}jfTlEKi4}B<3Ii29RplkQqpYxTZ zi?Uwosd%V51(zzQ-XqY+bcH2ZX321oZ)zUMBdXzm^F4Ziy5~NW>5PmV*(BB0W08e- zbaHKQGXL~*k<R!pB5gAgsP!_-bA-ep?WaW^3eA@G;}nFnKc0Wr$|yJm^rudpr>zcu z&9}ykz8!WIFHbLz+3}oh7l9|F*2Da-j#!+Wx<605V{Ld`H6_&rj$#OQ`y6gsfB>L( z(YrWQ-y4c|SNphkLlqajpwIJU3;s7JDDOodUwqE|1eviQOy3P{iZdGIXk0jJ?cW~B z4Jh@3PYcy3w_!LkP&sKas-x3U_tyLK2T!Umn>XdUj^YiZ@#Ny~E8ALvS?SN;4q%(Z zK!vDLp?wxLNFB8?rd@n+1@RA4@#gE7Q`*VT*kS!sXDK6z-ea6K%0|t*N6&xe77_G4 zi39Q|&A|v0r#TZSX2$p~?d$iWJWky=>xWFIZHJdwt8SNX#I*-V)J2r~=pizQ__pgc z^)09_wg&o)Dkvy|!adjB{*#x@6p#16?c%zwPBRaVCYNF%kfDCPA_MfsEZnrnNZHZ- z($WJ<gEHiW-M58HsuV}~Sw&1SB3kczt<42lsAmzjow41ADW9|qlprmy9_a6wPSGq~ ztpUr!1fX5=w5%^E8Z?Xyj8>@IxII!KeI*lel^U>kj9?UFNb6gLU#t6MIxf3Ca&70a zPTj9PYt2uk8xK<sOac%HPC(PU4-LBb??Pfmg<%HSiN{b**Ubs@;(<YE4G7Ll&G9?E zhCBUkv*Xy|=b(g4gHYD005k-Y@r>w|A?-=b49R^t6AY>ca^bh*i9scHJlUUk;&g=G zvamo(t8>S%C2py{zM@D--08h8`Trww%BO&4?*;umEZKA+V9?dEFj0C_SMF66U5-63 zDG%8>g4c%jM5-RQb~q&Nj}8T<{dVct=3|YcEi(%fHeIlpVIqXW!L!W0Jb@_9BZi0} z^U3==#1O2@Z;stNy=1W)Zaa-Ahy{6s6S`;`T$=jGT#<sz<Ug02NPYE0vCLJyuEidg z@Hiwc{-IErD8=ZY#I7c5*NI>_tnD_%T3E6Y)*CMA7^13hy74@kIsv})_&}?xn-~sj zUn>&5^-gcM{s7XqK3+XAhXx^7yIF^z3uE8^8r!(Ybe2Xzrp15(XK*%gCRn8*5NFQ_ zHJIQ4zzWUXNJ|61pBT+Tvs8&xw#>%*wr{zR+=A-(YW&vt@xb@Fw>?gMPj@eaNBb>L zF`%1#c*eV|iD#z`tOczf8bs#ky5C}P>U7!aD>A~WKJik}MjOFohi=x9@d2e)No;Ok z0Jrd_+y9Q7D|B9W$FU?jF*)M{lJmCNPXi|?Qt*3;QPV_z-9gs{TbCx9r;b<r&rjHf zr`LUV_&jrjzh2@*qchjkix`z6mWBY|RkT!$X(9k*G6mWW&Hna+T(^(I&N}zbsl?nK z7MwbNa5yxHZwiLnk*$8IR|r{g7R=hOO{mva%Tvc=;&%Rl8O4rh1sJD^f%PB?rY@G3 z+z1j(%_=fwBPCvlY*hv46#bRe=N4w?v6^{@-fm*XFgx83?~DsTu~WJDpT7w`ROP#^ zjT}kN5A?pR<=xOtZXDX3Xe8K62wI@bbj<es*LiE|eQO=p?X_u#W&FBXsh2IxN|qEu zvP?6=_DSyDc-JspJlbx+bRunNicI;|14qu?LnYHo7*)3SYhah>mbB4<8Q;|frx095 z$()u>JIGzr`zZ)lk&k)hkaqfqjDwoC-|)qE)2_?1N2leM3vA>xo+&9jtyUZqN&6V? ziC*AX&uV-YuV(CB$q-)kr2o@XCP&u#gN@pXu9v<H!R1#y*W<EN$0asvU5hcBq|5|( zBy}IK3b^{pJ7%wBn5e)sZJ%Xbi5ZpBySywSVpRRId2ia`cbG3yegCjFTqPtZ%#Q%d z4E<@Y!2IzIqRGVMrI)cZd5!l6>c^6dulE`MV(s8IrWX--HR!S1Yi~7^XnDy#i7`x6 zC?mK-9f?MHFF(90ov*aa)|Jo3W9nyxtm8MlKq+Z@s5Jx`0m%xXzBUMq%^5VBey*tQ zfAv01%%73={tg-+7zDT7s-572PX|<_AwfctyUwR_hl~SK;UH8aFeQ3g=DW8;mc|Tk z#ZrxxbeQ|y{j7vLonISKUUucX{@t&<r=Tzc%({PHf<&X>M_Mfx4@J48a}#qRi13vF zvE+<;+KpZ|o}d2yFcrI8HafE!wD}Be;mYFpEIe07p4NNRHjk*K>8`4n6dwPkN6pz9 z*8`VxazDydeNcMwjX=aKgL)v;^|RUU>+(3?hL$VOm!#Ky83C$S^w-_$4Nol>8+T)n zgKKRQ^lb<z3U(y?ehl|ldx7Oo_aLur`ds19kNut-=Sc_aFLQQOzMPpcC@A(0jiXic zDhRS*>LX^h^inh4+Pps`ll;qvTPgpljNXfV?bq@DMG=P8Pn`2Bi}#x)&ZE6el^7_1 zc?xz&tBmpCg8%$UNc7_PX#oD2Jb143W*@&u*t+|9gJCtMrXsiW9XH*eOw1B}bZ%s1 zbkyhR%m$FWS}Ji{^qSemV$5+1SVy6A&1H32n%Q_95N4{YS_&pBfnA<`FuQi{=|Mz< zK`qEB0t9PdAt5S3Tv;sE3q6#piU7`EN6RBXCxJ`ODt<`ykB&v*%hLx#p|otj^M{ZA zrviSjQF_BP*hH6R1X92^NX&?ExsaT+mR;sMO=A8Y5t3=&&2C7=*Mo^A<xFcf0Th0S z-f--=Gbc)XWuyuK0SNA4JO_Xu*uuDa7OP)w|93)Nk2s7Qya98+d6<_7zkyS8*QZw{ z?R%=sS%!IqNAQqs9-pQ-OjrDF8s*P~-S3WXH_q>kAjT#ISr~Y@n>pMIQ&ReoRm2f{ zg7KPVo}R~`B+!O<Y-TKl&&klo*XQ^Cm3>*+?F~u&7RHs5c~MIZx|Fd1^YSbndF#-Y zL~I^u)RrU|B4UrSU>dA*;k3vmCgRKKJ`*T0l?o?q<Z<Oi%Tads^bd5MP5DbpKl#@| zU@!S+?|C`EO=J@!_;ePYs?~GjCT{z;z*k<%$x(dG%4b|L<Z`Gvm2~#0z0NNgz1HA* z73JWA|1H+*`N(;uX~!*GV)~_kSwWpsKb{~YXbsxfRR2j^t)v8KX%kw(MIjbk{(AL2 zt~)SST+Dy(`|p)`UYojvJ@WBd5mZI$Ad))VM1|$9yJgtPpTd^E=K*2WLay-F#Yrrb z4rJ4Ags+6n$x6l>6cwmXjoR^>Ur`C~1W0wVdBxxL`e&S@({n5P@{&Kg)bL}?Jj`14 zXbCEpU0>GrBWo_6pctc{J1D}&yD=hsaIR;cyzQ5Pv;wmgNihSmrScAu#HS6R#|gJ- z(d+y6s{3CcEE69LyrCLND54}FUz+@!@X~5#qP&hAf>QYxm!O=t?W~Yo%yn{7z~u6I zc;j_W`OI-z!j)1%BeYJ|buVC0eMCRA)q1bOakO5Vr=Y+NdBV)ZdZfYrU3Lm~I8gDV zF0KcGyzPCzk3lu4hq5;i)+ODKD?5I`hVqZS(tu>&(Pxqgs!aDw`~xf<XECjvQWAKe z-ltgj7CD9UhjHfQ#~TgV&dXlDut<r$a?{u6>Ff@VU^M2<-}n0u&a~K-*4vs87QuZZ z^tUM7QV7OMB>`;x)j5xU{2%V?<GSjWekw6T@QqIy3vKaQh%txe>EElirx}%zd_e43 zb3I<_SXhUJ$CQ3V*n3w#X&gx$d1nV+O(H4D=G*MuFIxK~DD-))^S$pCTuDCW4>zGM z{J%9)->7?*VLm}}C5^x}r#^U)I@Kn?1EIF=tx}VH)a?GppwS`Bz0zZ+*2B4^?$kih z+tb6!r9;hm>;-bmg)g`wwWxM^_LHoC>?P|#<zJsK>`prlch{P;+T6oG_NdouR0S&I zQwudXt~8B)AMK59K|cYCgAc@SI-l>4MY_FCV}9g%j}m%2-_6c6eve9R@+6cFVQ^~% zL{=3pX{u!if;Bu;iyhSu93$g4LUN>0g3h)CMk5=(jvD&uw%$JQhOr$mVO-s0?NT$o zPPQf*GbVmOwHEw{>dGkv0KzBI&Tq12J9&3rkXVtiAh?XC*%(F+s}{Uvh7I4uzj$J= zl<PS^*8Y3{Jm%T$(Qg5C?j$DCh7_hxVe7WV80rc*(Kz!XeL~erKEQA??)&KE^n4Uk z&*9&)HgRBwA|N>XozvE07KmKKDU^2O<tdizHQn&pA0E4Zh99criecX~F-xxg{aWq( z`;3PfWIR&3F`U?oV2)zg&-$ol&Nfz-_R|Iq$5j>K`0DkN9p`uTd$`<mdZWv0ItHaB zZJ;3BS#KN{Ja8VJCG&eMkF|P*Snyx#(#bMs%hu3#EM2q2!`Ka#*!^<#J=x@wy+L$X zIno7m8SN_|5}%uZjUK1rJ8~W`b9=C*1KU1z+r-o1)>G!x?{)b}vH*B~?kTcutR2r2 zo7`Cd^x%^CdYXlB27so=)dwR4j@MKnaB4AIH}i|6+j8flA2bcI93OulHLhLEreRco z9sHd)znXcF+Y0Is`SQHIpZ<CnBJr@q;=gp}d)+3JR2~=B2%}cFkRpT5pzN!p5B4}R z@J(sE7$DlO2DDdoUqmcmy_|#ye0cbyvfJA$L)Ly7LWf3B;auNWn*2$>SkR_g1WqlS zt!;l#-gW$EOost2Z+*!)J$k}e2NhQ)m@I?W)PBX8*SfSwCD5%0uH}@U?s(lLqsrNs zY_BA)>_a=@9T9RZ8B3e&Txo>^=4az^HILtT-u6|-QPa}VY7yep;I-zv<3=J4n(GQ2 zhe4DLOqSQw+zVz5$@Pja4>o)+zq?h7zO1(Tz&AtVSgT(a8ZkDXPEURcB4^4kaLZ}W z<&o!At^D<_6*db7mcYy+uF0I&j^;L6&yHT7u>Ae}Ja2z}w#%n+nMi0%5nh3Q?s4PR znMN)1#e!c-;2V`Khz=t#Ya}~eRQ;@_dK@|L{WTB|U-s${v!^bVHV{zv`Q~KF0pd#N zii=~_;xk=s1=L4{ax*eXVMENNdZ^ivjo;vW3sAOL(OjWO?c&<xTzMMzdrgqIXA#KJ zf44^rz?hvh=Qh@8@ks?tS1zzAa~V@v^rEaRYB%7C-a=lEsl=YkiA=LUnFW2fdZ+1R zq|Sc>ewV}6plJWbVp0hG4PH8l>-YKRbyQdo4F*_$UT%l~$81yCQpQjld5}6{3MVNh z7UhSA>qjC_CbESed9QQzPS3l0uTS|aYR~Hjr+0m9bEv&G>Nv295(HX&hK_f?1v8Uf zEY;bdZhwRat2eki_A-2Oy)K@Ib9^o)<HT(cG3A!p2-lXf#R!rYJ+UfAMz28vAAHYq z;QJm|S6_l~NlVGM;UhIAwayJXc~Us#*qGiw8siA7%KL@RJDc}k52>D>QWmV^8_iv1 z+`RyseW$FAYyqK2Ow-H7t5!B(_QLH?Fr3nI1Kl7}mWk9QoaphP>dlvsk*AOGw=Lwn zD8o#>h@O@x##>{5Hf48})%KWJpe{X!uGd&UK74(-*c!+!29Yd+r_>>ez(HVHD6PIW zJNa$^&KA9FXr3)U7Wq8#$LY$utJowm)7Hz34gb4cu3kivw&S0H$dVBk%i6txU`{Or ze*LILT4P|2$imazAQq+X^GUh&0VeX`&`iJH2CgVuF;VlU&YIt><kDb_l872W-D-TM zVCsGH^RKC`j@<u#VO~vf5JlkJ9s&p#q9n1DN(9cgr0ZV5ca3+NyapKBn)YHSq=hY9 z**`9;O}^fqBuRMh$4KlLnF_f(dwm7a;Pk<(-1ugay~(84_Z5*I7WlD}o*gf%O77z_ z<+<H^y%JxxJ9EV^#~u$PRD>;-u+5r*oh6C-;ScmM1q6r-E=WZZ4g1U2GL%1{pf!Yb zx=QYWUH};}tHr509Vb|A*6sdr*XObFTZJC6KkjMwJx(tI9r3CpAT?3M&0UYd)gokc z>><G_wfHyNTcAGY#yb*A?XvyV2gf85Qg4;-z4yi9{$CExUcbGzPp^4D!+SM5H<`K+ zRZh7a$*^<D-sk~Y(LRb|POPFfK03+@%s+ojj+>2dH<PM!eV?vxHy-{}Fd%;`!T_Pf z8WOtr!b_s&aiY$bF~jBMdXZfJz#;@KFajB+%Qo@~XGu-_=`EFaIGn^;IV^hIpbt-A zi7%(mrd>}jMnuQyx{@KiN?fGsY9-bfNge0+t4XctMOhhyLJ=~nBibvZ&fJy)VYoP( zfL5*wXh3^kblRdSn0By;$C?#CXl|}If9^!TFpF<sbWSU`^L*xp><5+4&Gka}!%sHT z*4O>x1^ELl-#lXZJ5i37(G=NamUoAxs`%M6_{a&aw1Qvpn<<CHm?-Z@e^dFs))K+3 zxpS#xO?BMka|Qf6fJ)Xz(%H#)f;Ti4d7%txz4#SsQ&t1c7G3~hF7}>voaLTvC?J+{ zSwcq~75I=Cl}t@fEr2U1g1$OxYcQTrdp8`0gN<k+#&#kl4Q31n<Ghnno00ugR7q^5 z=ajraMf%$4KV<50jVMpMxH(D>3n^hGuNaZdQ+I~-k)<FDwuiKYMj72Xy=*?eUg&Xj zb+7U7nf(YS#3qESiHC`L+d2HEW-^21C?uutS6B)CU<6PbIRb){(*`4&rp^Lo%gUIQ zbv!TCQ<7-;|IRk7rT_iqj30K~?!Jz+`;*OR@`kGO^L~-Q`r|$3u-|L`3RRo!o^!;I zr8cb~HGs%jQ@P9mQfmAAOYJ&P<ouYW?dGMNs%`(LR`u6Al(;Uj>#W%Zo)s6Y)0vfH zHOiLTRJ*h8zvnt1D*$xV(r#r2a-&=9gHU4X^JS9&b+<(oaSr4Un-@HAx$?u+j#G!k zZ!WC&hV1pyNw8VXm|~B{wL|vgJTNISJGJM?a9C!dl_rX%Op_((+_ol2TzqpesQtFo zg_?C3f7b(PPTuyAAO2(bFs9aWyZ=g0e3gk$-OU|`WKRuDjwenRQVy;OkW5%j8$iIv zK;S~R_jEbzQKFfL9{(katMGkv!}8tf+F4NLL@rrkWz`_jASe?G&<;ey%>w|!c)<rr zxeiZozW?Jyn8<W@v%8~O3FKS<XdbC|-Q;1xCcLg*E;T6D%S6{qo07)_B*{z?vX$U- zjsNKX)cv1D3eD9Os+B9TByF~VAQ#;bGi|9$aAE~-M(Na6ICJpqiZ*@<5CI%&wf-er znnaODp-6rD*Uz8j<yitBHnKat%?{wTE&sa|ICT=w)Cb-S?f=w+!JHrmCQu-t=OwSA z7Py>L4)|(m*^+2QRx8@Z-F1D;)P2!2YTDs(6E@xT@^8gDGH^7DOH;02E*_Srtw5ai zmXk;6k}$@coINRPHI<hf-UyczM@DhwD=q<Nffn@(jI59QCuH&SoV5()HU+_A#L$vJ zdk%!KfE;w$PMenBdw)9x=1Y+<SM&E-WvN5Bl{N6y8Km(?m)czU`#tTL=#YQX7a%Pr z7!yrNQJ?fN)}kg@NcQuQl1nu6Jf3~Xem%*iT60<ZbKB+oEO6Ft6<s#u2qS{VxAaE{ zOEA(#SI&1}4uH(+xY^-t<q<Ifa__%Ehj`Q7wIa&j*i9;aTpJ2?9A+G!c0OmUyx+<o zh(?f-(Fc>ts7Y?tZ6e@PPZ&)AD+)=RQPZ&Yif%9Nesf5?F3VdtH8jzL_4jkq#+JdM zJ8r7tx1#TDx2)zP8U7{br}MV&XW^CBz3GJ>Ii9xR)7RyzED;QJto9kHT?a<dD)HVn z_?DVXh{+<l&|-c!+2f41svkCeJr5CBzq{9Z@4t0Q_R`=amKMOp38}>>L7;EhuOr8y zp)O~y$maS;Z5C**8FJk1`ZSJ3{<^+%_Pm8x-Q{~2M9k!3>06sO4<1xcYgBdQk<FJP zsxStUjwseQqT8I(x5W0bkw);SqeTKI!h1)V70#hnfC5f714&340yK4m#;Re6TxJ)0 zV$FCWBwc~NrGHg2a_a97XB-6>ODG*Doi$4#aa>5kL6mffIp4<I;QW@3&-qQc-`S<7 z=;z59zD2a;ipF;`#_`%{j>bH$g_~fWpTK2Wc4DnTq@ml_&B?RZe}kSJg&7N<3`11M z%+lc<`%exB$+JnWQwnNtYD-%)EW^?*J$0Btr<kVuB>)QV>DF+h5mr7$qi;R9jkf!$ zMu-FY3S1+6pLl}NYPFHR=JkI!5`ONzq!PRB%e?*I|I}{!^$+@OG)JR88#VxjZxAT& z40w-bRtUghutp6Ap_JKCwY{L<n!eUsPfI*s!OdXC3aVNJdkz8{S3ku(*S%%9fXFZl zj7|z9^m$&ZcJ2ZMTK$+15^drchI$9~eH;#lo$lwQaS6ZuN;e+0j!;qJU>)o|;|0~f z^Jxp}Ay&JHZo1q__61Wwvv~f|PRWrR1Q#4DE1gDhu)XaPs`{-VNnj(|EucATQAO7E zd+|{*Oc*2847q;&YG14Il^Z4dC%V~awtgBsk(EH)TkTcTn;w+zZpK<x28C#BAv+?V zkoNxhNh5*Yve)yyw`FY&=X%CVUE6G(J=oq-+rBx5&q#oh*#CL__C@h_<MXjpG<jPm z+jq3^JTM|mzej<@JwPb{iBpHSk8192#*L`^c9v|~Pq6V5#UAQ9F@`L%g=GfaTnd3D z&VkXlf5LKr-grW6=_;XtaAshQuxq!mn(BNi(r(T#KkUW-P|f5dPj;_X<_s<J9K~2k zrtmkV0iXu_9<+4WI~?BH(vl<?Yd>319Z>|!UP1`!S9kZX+r!mazVJBM4Z3IU6CNB( zxBf8zXS(okq*fOL^{W{_+p3-}Ru8GY$v_E4{SwS0E_!}E<<oTlojg`$$G_hBX-Z!g z;mo2h>e@TpLlu2+-ZYM`s11Vy0V_T%?;U@GB<e`YDISFm>Ae4+s|y4{u5hVssI!1& zkhd}vMQfU+U_JCgU{mjx%p(c>sabekfd-aKO)8FV8GQTK&hCnDKQ(ePHX;k*M%2KG zn*pZR-%7|13@O?jDPR7U@V)34SbrMbiR*s&A?~_BbS6j`Fo7*S3i$apOC6`MvS?Sw zN`5^=u<tLPvFGs}dh`0_Hp}mCAHKAv58B0<`W~n*7`tJh0Ci!1Vl*mk5Rfp`mRKRu zYKx8<-xdk7kfvBX5MTGGy8Nx&Ty7>#=UEv^YokY$$M8o6>h=*Gj922~kUu5UGDv^Q zk5J7Yd(+yuI!dUz_WVy43wZSKJ(hBvEi@d!=<c9scx#g?CTF9bph7T#J1nTrW^Q9e zl<RHx*!lat_{)ii|7q^s5Rv0b%WU3y2IUHIwH$qL_TMi>XhDg=)H!BoQ#6HUCH$)I zF~%hBqnN5Y_wV9z{PrTgZM-=9g!Si--sM?ko~mqpsH)5`SYGe532u^78)5`*M>a56 zd4dS4ih{(r7khz>HG+@77KdwsImA@#g;W?A!3niw#>9-LKv_>qegRJpcMGeXaBLi) ze%T!8+8*uVx*r8}IX};6j8%zYf2+CTSgq|b%qHJ`eZL~%e{fMwTX3fKv!HZq^Ang+ z(r8Y&NQ%!MYBbqV92jYi+|eA<JU#dNm+JXw?RP!8QSgxhxLh+yt#fHD))GD2XKePZ zot)-WXqK5;l?BP^ZmU*`FgHBLeo~h%Dg^*bkyzmL?K%^CJG*kn+tCA+>8G#{)V8Uz zzALH>Sz8%Nc>6v!x=B37by2;Hb>C$k%cz7BqsG|qBEsnP8~#d1Bi0sZdiBU6%SuJx z)l-UJZ8n<v-7FpCdE91unt0Ah0;ct`m;;EZsS62Hl~B>uRuowvA5oFTyO((LS(&zq zOrB<V&R%D<syp1Pat`u8_UV&AhT25lO%+Box@d9Bc%-$ur<#+j_qBfXeuEutG79gm z(n(Fs8Dn;nAu=_;(gC@U@ztJ9rsRB1C{Im=dgVHPaGF^;|C#FjT=dGFV2pzfK*F#I zco*gENFx(nCY5|YHJFm1oscoe;AKeht<+Xv<Mq#cxg7kp+?P0X6Ig4F)RAoBM@Xu> zx+Joxi~NKk=g>MIia6kE)|I&v|J@$d@80lo<9Yl3$HvB5A?mzSU^F$3$_Z+#i@RjR z#3D1p`$_;3u8bJ~B{V-Q2&3@N=O+k4+EV)euM5D!#rHng4^Tg1j(-(kiibe~A|OP8 zBT@j0cX3vF${KSLi?@}#=D`FG4Xn>9!%g3AW%5kye#q{u<FUs<PvYO^Ur#Cuk#h}U z4y7=8GKM^b5}nXv1rp;SY)~Lb02ro*Nh!+bwLA4u;(ibPz4*m?M>f|y4`y9RR(S~8 z+hTn|Da@r$2_|7cJB-%4D<*R*kHk2vTfdM=wO`#aE}z}h;hD9xpn_iFKO^<dLzLkU zE3a%dJFfZ=1Vm(fy+XtiQtiohWIzVOyD5NiHb%i)eZt3HMNyPIP7Z=)T0{l8wLoP` z3YIbuQPULs-ilE9-VME{?7kv;vTdd!H!A{^C-4Q0;NU_vEAv#H8UKx?M2s<i9C};h zx^{QE<Eh6*N&XW6mULtbR!cTa(Ut;?QOlnbw#J&VjM=`!%tG<|$M`aA+VRz6h0q|L zNwb1b15viJe!e0!i+&-4Y+;Dkh=1DAfm>%cI7`g>COEl0fj<AYZuwsm-jaSPV0@kD z<eUD8K~^DjS%vSxq(W^qVbH<F(Yy~o>XHfY&8*wn>)ThX9(-O)U+>n9)Lt0;r*c2P zmR^vzEN)8%fb4V-$<^tYWhI4-)F{7VE6WL)leaJ$`&`AgSHr1`jla9U`nEL+5-CEe zF^&4CPK)_MnQ;TZAlC_r1fkMnAmfoE*`n4cMuo?|f~-=RX*pkFzD#f={Xk$m=I)@E ztXFmhVIzdq_tx1uEz(N+?D%g9PnKPqId7~9la27p5#VJUhV`2t<UdwDPxaqQeExkj z3Z%>XN$3!j_%MfPv&>%XUWUA5#@E`gn9@t1x<hh)L;k+A^KzVM<MDd&wV$W`CoXX$ zR#d9Fod#Y7;fhPP-Ko;6%BPW~xd+mPwN-Xy>yb@Gv4l%YJm454EhsH~B038byGB@p zkrqWuCa=$gwO=W&c4k7?CRyFy%Q!Q$EBoR__xV@%)iZ~v*LZW6*Y=POE38Bxui|?a zK6yL>0ywpiL7F&uF=GlVIt&H!t=aDxftyqwn=|*|t%5yUPcVLIs1^K|jkK)6YIv7< z`37s)#rIq-h$-jynZ(O4WvATk8V46wSIY*jT!Up>yBvZhP`2Atjz~ZBh`W6?Eq{IR zLX(^SBSH8*SjfxKB&fAbKkS7eY_=BBUEqc+9e`of)=5IH7f9YEz(T`)*57_>V+}by zV1)mPrjcj^v2oI*r18P#fVA+UmGV=?eA1R6V##1I9j@!x<X7V_HEY+s7B&2BEtgwU zOP=pP_|6fDzy8d<xG#@Gv`;1mfk1K}(?BXHL)3zt4hb@O#QQytYIDwYNTLt_247E! zI7Dye_t~qDH^DaQ1AKs8!o*%zZVUWV2<^r4a!7NZBrK=`@6><0trme~S3i(=apC_c z=15musUqfv=GDbTQ-{Ffypz?avDr8AJrp%v<TDtPRr@gOx{1_pn!LAFx!`_{Hw<&1 zUF=-88ZWKcr`EgEKD2C&5S<EnT;KK3|0BsBE*29cjtOG{G>qZ`({$EW_<JBkE;1Gk z+n#<0vCUL%@YNn%Vs&$kW#LR88*1&j|Gl?ovzNyQmskr;J?PEX)=);eyd6;_E(UWT zPa44WxB?#}HAz7Zz)mFlDgPybt<r~>6DT72OD9)vEX3z4t>C`aVWnPi;@@oHiOJc{ z$KLurBO8#XX1wql)BQ6>M%_pf#u`KdSp)&*VdqQPyabG)sQan<AD$m1;JrP8>8A*% z_3Ic83Srg>O<d#rdaExwtw6-I{1P;0DQ3(@Qg87O_?q~L*rXn80qP1#S=b=OZuETI zKqPzgL(%0o$lnm-e8XQ4zj1UwP4SMBmc{7H@`p8L&ARpHhgjPYB`5tLEG^1nw$%Jl zVKF6?`PQ|+tPoWwfsr=MZh;9Wuah(gb$@M-hua*P1cx^P*_@l^S2#H{7~Kwv#b%Bg zsVjiaVQx$ky<m|gu_{_GF8uN&(*F8W;`VIK|DbW>e(1odHNz9Z6@wxHd)!4sH`t;T zo{*MqjZXPqwIa$o)U4fd6HtEEdU3R}{>krZfQ6&$U+N;%au2%Kq54Kde_$Lc9UXg= zh)s){o~Z?86OL?`m&YFf(nxco*8fYHE*JaM1cU~1a`|k=UTyFJ24*%bFg$cXT1>g_ z5n$=Q0cSg{P9ai)usDo=pWD~Hoh-TA_V;7X{2t+@Poq}LcMt&GyV{a1w!j_*RWby{ ztwBLT{gS_oF+rpFUjC8R>uq<J-!}aB*DlYT49W=@7XV0v#lHv5yNuG~Hlv%;r)TY^ zj)Zzw+30Qw6)jGYkFpN8oRQOMu91^{cT{HCylgnAq7l5Tk|gOPf=6Y>f>S3Ijec3Y z!9e~#@9HS(RwyWmEkpgjbz8z~`-CG`;<<;7sq6B*_A!ozCTDUo*dD-Ub`p^s!4OIl z9vd5FXbpgj!UnA`-w08WU?Md0|7e2H<dGvFdtzI)r9}u3-*ftbMW35q&TAKP{qDaj zYo&VSWnr+5+9wQH_TUINdPKSJkLJ;niY2k=V^+ZsmP#*v_VF-_&>A#M&9n5&@Yh#S zznC^76un2rPy8;j+6w`J_k9L(#h5GuIS6_nfD=|gKw<fHFOUiQ3yKk;F_(h*DL*KB zV;>Do9>-Q4iTmK4$?|D}hVhKBlc}&FYuDYmYHs^$*JD)?84{iaaKK=0z;Zef95|5H zoW|%CLAbbm*L!bjdVT=E`*u{53|O&t`h3ym<i83SwVF;WkVna>L9|3;`<0(6Njb0{ zDb{dN8*cf}QCS2$Th34d{{BaHfMO~kdZ#z-aBE~NIO4-0wN$PcLr*6VENd@20^{o0 z-9@wcu@T7d+n#YZHK@5vsNMP|Ra9t}O(Q8YInRMrplmCkb!9qd>ERI1N#f;S0>`@l z8XbHA$BVJ!+yXF^FT1o+x1eqW%kGrv)5zp3IB4O|*^W0?RIgtgtldv6iNIT961S%! zXF0;o*Yd)uNGOg>Gja*?#$dycH&Ex5%z2&wU~L^@qKfn;;PZ_eavB|=tN9H|FODSj zToL9U%Tw&6#k!kU`uhWcUP${y_}>|^dC39zmYvfRrL+|;I!v#xW#SG@EN#1na6t8d z<R>)~Iq5-?J=eP69s8ZOH=7?Z^u{mb@Q(DXs5&lkpYO18iJwL{T5iWZsZ6c4&#zr~ zJ}146(}_p8e!OE24;UVZ;rL{dwinon4;hgBNer+;!OxiiqW3%Q{$}=s9e6Ik9?lTu z`s|tS*!A}&2ovN4%B&hP*EQvk*{~>t(kob?mL+B-hNY_VC1o)Es*2P8ho~oQ#Ut<Z z-ckRdtSyo0gKjV)7oltG>L;Nj5!QO{U?IE=p%}T^Gz+ZLLei{(Y(0o^yS_c2!O@os ziKnakT#3uRg|4Ub+^1`wDpMI+#2(BF-aPeD&MFLG2~UZTx;EN`R^)_d<yfuHxJY&9 z<ES;i-}P10S(abtW^Zi@CVG%^drVE<+bqH6H;t76h1hlnd4F&b<N&n!7+{1xT;Q<e z*q<%E7i&dBJlxRmQZMH-!~$08!v=QJ5{}kjoZxhQ6$JrC8Q%7yze5IMvr930F_f*Z zP4eQNkENK}J%G(*AxnG=QW%CaODLZOQ3f_5wiKOL_h6J0e>WU$Z@vDs+3&D2*t6Y+ z|8dQ>cdX22CC@#9bliPqf*Q5BxUxKfsil>%#C?}tfR?TW<rrmA$tw9<0tJK?1|CBG z>&8p0w#KoHKzEuJmBpQ2OKOStW-U#~nK~|KP8&7HY_Z^?M&FiR;(7lh2!1s6#r1mp zmc0A5%(eYs%(5@5gl!2{YDLE`hYQfJ8vWV`-UMs)pb|!*)qV~{a4)}<b8A)Wft)X* z)W5=~e17-;P>8I7>);@l!Sbe>`+4?u%rH=+mFE}spRot6mg-j10WqSN+~vwKM*H?7 z@fh5$pk$S;`4I0~|HRS5=)E`hO!bgaV!5iduscKyA7_uIy;*6=rmJd(8W{0r)r04o zaMWGdUq(!xC{RSkBSgT2uS_|FrVNI`3*ZB{5j%4+o1>Dp4lgbJEIfu(ieCNn#S(S? zrx1b5?8%OSCdcQp&HvAM3nM>PHneRpFahKNBa#^4adPlG`xe*bZ|1WcI{Ki~KT1>9 znKS9l&oVNox|S^ynL?-`(;J=eS#e~^fIyuX{6}^a`>GlQM^FspL(+Ps_D>)GFR_Nf zjsQ@{V#Q+Omy($UG^%@qf|Q)C-1Xvt>G7+Htz{wz%WVczF}CKvH>XlZ9GdER$e&4% zPsMZRqMFRA#>}sxh^9KP_Bkkh9)dO=w>z=cL=8Z}>KK6t2;oR*Foc%gQd;0Xlea!g zajZ|=W@z_$)$oTj-&Z}3zYReotG`lzC)aaJ_fY$Q64&R<4@3I~2!oT~(MDVjAIM5G z##(Yi@M?$<0B2*6W-%jzw!nLT5{Nt&@X1sD0#6*FpbHMP`7Gl3rjI1C(r7BP^ycgW z5f&W{!w|qlvNW^8oxSE&(bUODmEjoU9AVSsS=sx99Xbs6L{>88K6`e%Zm9Yn<~}p6 zxfir(?|2ay^<YGWq-L;~Yh3cDr-jFT#7=(hVA(6q9-g76W0L(ii^BtrszvJ1+QG{8 zy4B<8Z0&*8xKapcWSSR|PZGN2xp*EA(Cnw0B-KWi*CJ`sxgCMUt4@xVE92XKnU3PM zwic<`uO0J|%Rz}(M`9Evmfpli(83UpphpyH!D}SQnpM&hB2n{rEd$UHQ45cf1+Fyw zfWd7^^TzVav*(i(_@&=ZKPPp2{Jm(jd#`O5-IJ(_LEM8hw#q<I!uc*C*&)>(fA58F z^<l33tmAYu&hNTUtGd(2>`PV3I~sxt?NA(_XimZScj~&ZczN1@ns@co;Rv*>1GEjS zX{oku1pt#`fP0Eq5^9!yK|q9I{vwH9se(LnAS@lkq7`XjTPu{>RJV4WM%i(harX6o zOXPi}cF$n;Bz$Qs{VqD5c?1>arp|6hjeyyLOujfN*c|ox<p1UH?{A|s-_L%ANkmD+ zjLXg|QyMHk>loDBOW8grtQe@dadRDuIgP^MS8mf5-mQq#u8f}C9{eBqh_Cs|MTCFR z_VS33G3n7TUP`J#7|_<)E?DF7$blX|<m?8}*kuU~K9ZPgXjFJKktIpV*@sU}b$VM{ z*N;w9RZ+J6J<msg=$M5J;n@<5HjXMDTz(NXtSplT-o`dKm~aqk>Kfz63+j|pfTN|k zE%5H3WboNq(Cg_!g0D5d<=;Dt=awaBkJ6l?HEAvq7j@O^kU{(3$0jUBzjv1urP3$D zQ}W~>@wKIjdV4%@n_NLG;lg0t(-}`;ch-K?E1O_IRz%x=)K|shFs(B^WrTrvFob?L zStOAm0!A`HucFM!Q;%%|pNC+)4Nwe05Fr%dzlB~u<O#J<o^~HSaEN(5UNc1?xTt{V zYzQ2*oc<Q;pF3j&fZPBGB>LbcSe%vDi^J2OnQwj<Psdtla}Rtn?4BO`i$W5V)s;kC z92q%=sCuJvqlFi&lxqqxYl}Qa$lRiMNMPpW9KosJl=KJ+_Fp8jXL_&y1vtx?diJ4; zg|`K@)fu!9u%?l2BL?1j1ZRQoT|qsV#sQK`wn{d0hK?~j1dLLOqR~-7$@ES>JE<lm z#BK)87ItNmgIDmmOS-A(^@iBjTX+BM@>_T~P#?)$jSPW-xo56nbVwVro!1APl93x( z48iQZT{ol<yYIRE;Pu*{eZN!>xA%UYQRhlFC;pl?fM4S$40f*8FzOP*iE#ZUGo7Ah z0t6wqkdBPn*cw?oPN|&+Gl1=1L{3u9GxPR-+|XuYaC#cw`#EG&lq6)9Yq%=*4I#UG zUhfuC8&&N^Bs0?$QtwJj_XS<#^V{)s?hY0QM->vJ_oujXu4Svq=~1*k%<D-A-!?yi zUSEQ4H?FOpM{gJ8U1V#<nB{R*5Mh~9N9vfeU|5DNH+P&_Q3ZxKr43gSXVDfz@GW_D zcC%;m)1!pX=uUwCdO4r^Z{}e9mHX{JFYJlBrm9oNtV)G+Uamx16lM|8B$-W`%(u3* zrn;|=f4)kHiOj05jaDrJ(u~e$hu_8vw&LD%7XlffX+koSDrtf%Kf~OUOzb#1$jFop z@>u8g@fFrQ?O4>4HC4%0Ry(h-UdCU0DVj~L8>hwYT1BebT_}z*K>Mmm6>G#8QfX%@ z24kOinL$S71Peyj4SBr>YO#*u_nSM_YcE0arVowd$|U_BQ3jd}`EkncryVUOCa^CM zdZthd!Y!nPh56i|kQSidAX}R72R?mz{J;q=>;y$ySquRyG|-tVZd#hE0-b?vycJjC zQ;+J8uE!BE(-t#djQD2nHn;IH<XJ*n{>BLcf_z@Dm;vS{!%WLm8sPanx&PgcC%pbM zZk^fdG1*F)ByDJBB73e6%-r+H$waE)vzs%#)QyZM6$r}c$8d!8;-^B>$$u%Dq%2BJ z?OUBv*T-V*5)uPQdWIm#10;^KN!*J|i)-Kzx6hGsMP^{MT4q&+$;#4%eXfLLOXe}U z?=!TMggozyw1Y}0iw{-=I8Mdy=hJ20wLKnPPj7rVnvZ$wg(HR!qJ${9*>HzycwA0! z>Dm#5<I^DU+zjmYU<is0W96*A%zUrzcv@Zwn!7%Z&05W9Cfex!(?L;g_RlKen308} zm_HYDb$+NHUCVPPRvY#AX6teC$Pxyi9|?Dh!B$Fk{m^+f581;jZro2pFVNXCd5dWU zfMV|r_=fs-S8OBfNvYuD^gU|cDYg}j6(JF>iwh2p2F?rdA43F)EL$pd+9w$m&|5tq zW_+Z@@jLg)qoa$2r<eX_|HFq~z{ne{kC7IJj~$eRdo6}igEm~b#~n0It-`sOX6|HO z`)toI)23ek?r-@$UD+9v%B$A1=j@xB>L?Rc1)4ol<aQbjT#MpKpdaVrJwQ!sBxY%g zS~a1a0RlCV#F~OOahFOT!nr^vvbcet*(SU2{`}YVl81<*HN3$KL!FQ6BgbI&h9gg` z!t#RHOfeM^kjQ1_ET*i=B6wYz=ikd(6;4nqR|c>-GXn`Mtyq`&Cyg{i^<2DYL!K_- zD~f-oujhM@j&~0rfert+A3jgGiV;S)fRR`@oig>`e*`mIFu20xd5eO3BcDP{1@C{o z^W9%sTWU8V&<1d82O?KUj^`7=l11B@2YLe(dS$bxdPjpL?RTAB1bQ9?Ipbt^cV$ly zJ=Zb|gm99xQu|p0gQR>abWhtL$RrQ9=-rx>=c6m^K2#7-1}%M$af=Stlv&?W(MwtU z)$C*_hCn>(yN`}GIg2GV1@Xolgy<>eHNs0J$4%rFtzmIf^Et?xAD*wseha*$yx#P# zL{^JBuN^qGxPWZxR9A;Iqz^(9MWk_2-Y_eiiH)ihVhCmk{SvWef7xEb%K7paw@gcQ zM{2B$bf16H)06z~k&Pt3Q={se0~G_htZY=;)PEn;9OQSMBN5%4YQCv`I#r{h;xt*t z@gR|#9cJoDAx8#rK{r=f{t5PUetRn%l&@xC*0o5$J~Rg_FSzMgY=xCsP?2#-Cu0ZV z%O+!3#BOt9!extVzQ_H!Pj@p!U9Qs(ajU-lm|-=#x`Ch2w1c;nGZ<Nm-8VUjLqqsb z$`pYP^X<obyCMRZXC3<i)*Fhi_pf*LaaJvP+9*3^WBFxC417QOXe<&Ywq&JcS9MGV z<_7^}!x+qYCRpfGc?0VF@j@V3cAzyHk_Mv^wnj}PH9j`lZl7)&AurXk`5%#H)9#DP zu(P{u6L}`YYHMaL`q-peH6l$2${e%g51WIL*fbm~=eKES9raPU;v&ym->2bWnEPyP z8;w3%0$z;#k>Yxxqh&rHrS++Nw%Yc+S$2$lnl#~AD4X%t{f>+oN!jlHz6FF1RPs9K zx%-(odCQ7oE@NUsAA=KAau&9A@<}DYM_L4dlSbAtpPq)$QX`ZaYGF}dT&!RjoNUQe z!L0O&$gnvy<kY^Iztd{7$k+&ArMqx#BP!nQZOd)IL1(AjH}wwCQFW{mGRVnr5{SQu zob&a5bvpOU<LJVXf!5HdqWf}dn&uS9nwGbotq}QdpC%qg&>!(!r`(lP!HNB!vZ(>~ zsY{6l$cS>Go6eG}>6;U?438cQKl6~yd0cn`Z_{1$dV0UfG>|B_95bmrly3O_vt0Oi zq~zCf&6Pkugb|qsh>f?&htimPS~1o2fD>ARlj%c*11jEgLInY?p)vFgsYySyhh6<% zyjV|L_sirRB`$u(q*)A*GJK>*R)r~XF@sq0T`c4o%PebPDjE(bqWAknRALuHZXCJd zZZvzwkn;YZi=&(SH!)#Szvt84xK=DUKPM^wcs~v;Fvku|O27>=$W~+%v_=8weojJ# zfo2FgRBzYOPzSj5p+v+$jn!)A{{q;8lrIgEG<hmzxEfBbY2S-YP&cOI1Rxi)D%nR& z2GM|l(UO6Ao9jgNQ|pD{gfS59pRSH0hB8fsm95REt9%4#b|ZBy&b^4V=JANMV@jco zaZN|BSC39F0vkT3WV!7-$5?AO_bX+Di;fPJ=QQ|c39Yg3LexREFcoa&U_b@JFl40P z)X&-FVhG1B8b-%q__idWMRn0VIbnXN!)AXEI?GxZ{=LAa9+$f|Sl3)>Ig|4(O}!m5 zs%R@*z%!>xv0ViaB9Yt-_v4Zr2=19eJWW&KYIQAPCL}S$PieDsLn1%NFw=%}!-JVI zxI;)bmp`c$x?^N%Dd)JUohn(JPtj-#i9i8K{fhVw$L7%Y+pLZ@cyt5AN`>ZKHbul4 z%!&XcG#Z&7qeSgj5--~!Gt169n~f-FLiFTHjt7%Nd9q~)*h%qB4v9j81z`BSP6biZ zQORG7)b50Zg`Kuky}Try`L(#)<|K~24fr^SfV5m(^M@os8WK1Xv(LKJ8lnpN0j(@S z4lz=Xaoo0GhYOyzM~XT5Z0N(a7`1x9imMZtFz-JG8jv0ZcxV{WiWVWFzGqZbG8sCd zQL1RbMf44u!E3Cok)k}nMLL|2J48V$JV=>7U9iX`8{R0JcdLGS@_!hN+IU`;+3?$4 z#F2wP+XQ{;9n3V#Z3Pkigy3@!!8=v}Idfl(z@XFmRU=hb&Gp91_WgmlsF4w+P8iL+ z{Twl+I(yKYBHf9x9?FkEZYF27oYt}?`0%43RDKuWHbDArJdc=q*9JN0Q|);#RNW<k zNNX@Kl2%8?xg_%E)Q^w@mj=NV@}vF!1*(@LF)aVRsU#E@Dq7S!UG-q(S!&2|GLIo0 zCz-{*y9{Em$)<6PskqMtmfyn@%bBBrOHVmjGH+c!?(!^qu@J*N{j!bY4FAuQW!hF5 zI%7VAPkC~j8t%;At|rK$nTfacRv%F$<<J1p;=a>Tr=1W2we`n|8nWv?avGW_S%xI+ zdM!=KB|Ld;0wo&_daL)84a9`sFF5BL24~dun?h#2!>t&KF>^LPe?2c+ak}qw(5nRD zpl|68(R}1GwjLDyh*+Fl34>Lrk<3|?DIl${Nwo&%cGo_hJvVnRrt1i)P6W1Qkh0RS z*xCtsixKhYGfs}Qj*^sF3|xy!e}flx>!|>ZR?tI+U-LkAO&B8eEwytv3u_Up(6<2< zPA^Ut`dKIv01+sozlDYnuqd(>QuC(gbbRvzHEfk!J&Xt130!&nw;_ZbrDdi`EgKAu z7{aG5_n{EOK#%=+omMGL9Gr)1WJiePqEUb_^wS<)k1=8(q^bRu9QB7|%O1LCwjfvq zMiZ2XDx~C5`pL%Qe~3EEwl<@6-6p}^9g4fVwgh)C#hv2r6n8DfU0aG5cZ$11aY%40 z5@;!IC+pg4@ACulA@B8OX3l5c_ZU=&2<^yR0_Q(T;gBz*pFzOawb#q0+u2!3v9>W$ zVh=c(wiE(uzTBU-sm^KaJgM2VIf`do5hsk479auRlf1#8(_WA=|G~OM9tJ`f7i0iz zhr*;83YZ;>c}egUO7NyIPdL~fiT-P-vvIrG{hmM~gi>vEWNT|Q{Ncu5bTe~&#zj1D zCH<>DaMl{hABwYPjtSaF_f;WA$V&+~DrTH<6I`iTo)3H*U`q}34I{|mAR680O5R32 zJR{6Nk^ct2vYOeTHuk%pcI@?-t<3w<L_ywGLKyL<AMpnX#`KkxXl1+>VmLiQSUues z`w|!tlVxgMi<F5*^pG>$9!*&_x$j^st)(VzRfN?45EG~P9WOQQzqo8^SY%JsxEoUY zZ9P-CH>D#=fJXdB5FU+Qb{mg5whteIS>-qZ3LdIT@^zavVvH^LF(Z*ZAWO`?TS|nI zhZ&_34=;sW=37TSTH^N5h`A5#Z6Y|?>DRb;@zf;`dRm@Kdq5*`@Lhy$knf|o*%Jg# zk;MS3^CcRiWAw`*Oo=U(D)<1k1St4<v-RKs&!6YHUGP9-H$1DoHPb4TO(|cKYpr(b zZAC{!La65HvbNF3`o7t&snUSCN3o!0VM(kuSVK^VI5ml|5Q^^)ZUY`GXB0+oCVh9> zC}6qGOj+h^n3~1}MN>o=%%@`Hg@LLGrqtr19OY4YVmd@gFHu*%ded?xI50$9L!7$( zU2Y{GBAA0;?zS}o&%**-^}FoDsfyKmw1`0_iwQrFe$*tgYXVdAcMM|9`ReZq#Ft_1 z2P#_u54$1H3*}~hr@!kz9amM?7M+?4Y3$pJuqKEoimqf9?4--$2dI^)<AqA|Au6Iz zusHo*U_|60+MEA30Q*|`r6wu*V1GA|--w@*B(-%Vn*3K_a`_5%-J6c*61a->q)bM@ zgPN8<)sasVmkBY7(^#Y!$%j9+{+Am%oQL$3mnV6*<f+m9lrn-4A+zG5HhsuxDQ7>D z%h58I>2caI&YIHdf>mR6W6J_W*VXoBQLQ8i@Y*MiVikY#5Q@3g*xdB%saC@(K6p1B zw~DF`z`zql)6WO%_f+vDjw28>@nl8pNH7-7c<wY%x|0$7X>Dnsi<DsXZ^6uV{qhTD zQjQ%2%M|bRT6jQYnJdnTU>*6@pF|l}tD*pQ9(I|*pKR7%?n}7%-o|D8>G|w8O0T=d zuKS3x(0H7H?POK1Qj`7P#ni(&o9t8@{hLxALC;%;Tq@;d=1`IJ`~W1yi>fm9%?&I+ zM5MmXgE*<r90O65p@TzGt6h;ap#^hA31+Ma^hV@~Xk%HK)j#+1y;lf_hG<SC((&>! z+z?5U0j&M+-qbNK>>o&obCjS~SYk^UP!q2vO{KZ(5~GIF8tLF5vw!Xn9dt}{g>O`K z^{C!q#)jD_#a7_*fCco_+`)bKKFaupmFtbGz`|GD*FEl{*WYQ}+=0y%X!fXNe7c3> zO&uR^tdDgM#}45fqmS|=CQdW+QK~6|eTl%nVf}nE8XkZBo}Yk7bw3<n<Xg?hd6Wyx zf)tcF9w_wxZ&~&fzNjU*{jDNM3+>n)0Fe;#T6M*3&^pou{(^+gZA5dq{#N!CZTB_3 zsd6w#AzGfjsa@quAh>b(Xn~7TfzPg^dD}Ndm_M1db$59VFB81v&~Lr`diw?9JDrkY z$xhO`3MKup*RPD!mu84Rl3X#*fUk^?i4MHQe5P4|@(biTU0RC`>7G*Ld5gPRR@d-> zXx&(KS;e%A%7w%(l+(tb+vz~Uq(vNBlhtXZ?Gw$Ia72I>0B-D~!~eRCYsK`HJ=JwA z3m%-gE4aiyo-@<@*97*BdK_gYTlV}W{slWcw5u!(AX1qM&LATGtPc&ZrnAQ8j6$We z-KCMb${yzCKo+h^lvjWwjoBqb4!1f^lZ-+x^1kHjCotjywNx1rLu2!EJ29>JL?XyQ z>3zK0eE<@jmyMpFbMd0C8yxC@^Dl*g76g0kK3_RUowYjY9845Vnbnr3Y!`n2<QmXK zGf>s#6tGnCo7uEcKY@YtXYFAwU0;71we}&>RN$VW<2T^}ghPS2O&x<sXZtV*D*Lb1 zu2YpHs9h01PVwLK=cH2fW6f}Jb&zXTdpa^^x@*>O9Ey1QJPs%r*-GBQs~{bJHsHsd z+v{d+H)qnu+V@L>x>o+4^AGt6nyT45U{L8bYCh)O!W#*<jq9zzr|W_uiN^<wI!O|R z7;MaypOiB{x<%AbWvlo8lsdJ|@-0Oz>pFbx`q$j_)mv>bWgAZm5s_A_wY9dvG{bc2 zZ+PA`pOCI@(r)<rmA09L5Vl$SbF?cYWaAtqp^EzG7hwt>@cres=qH4Md-+O36Tk*C z;#62sckJs+%$LHVG92z1uJg>;%Ebc3UnBeHt?UNclj9zi&M8LCoE|cn6|;4Mp~fvb zZS5@u4olMzzK%}T!5@yT^CZs!{k=R$KzZ5XLUK7b(nyxjaH&pI{qk)Ft~CaGn$Ppn zKvsGz4EE!2b&<#_4$F^>E41I~v=9lDqt!G{mzRT>KlFINPT!gYEQNvg3SG>;a_rc7 zkm#8YT8tVEfL1N5WQ+k>4ifiIQ6y#oM^8}+Sw3yBm#4Q9F~RLQK2qO4Th9sEyRhcj z(@kr(ET%e=cpr&&eB`Is`*l`(`4M4zVzW)`c?*OlHu05L%ZJ1a^eS$Sc>4L_Tn8_C zNPRh>FH#ZcOWSVthvqlx=b<psa3o4&Pz551EZ>GV>!|T(Y0AU?<PmxUG7tN_>tUt* zIwdZYR6cxv)`18M4e*3L<4{0dcdfN-u}SkFn2;>fL+8=Yj)h_ydj6v&qXoQ*Wcoz& zeAz$(pP5r!<QGkM^HfVApvy5zH6E3<GLb>xYq22zsUfpBZVFxpij~iyOS?tkIQVdX zyE_<71^0o$Pu{iy2@gN1T;0U;Z<WsI2R51PTIkjMnVIOj^*Z+db!s}NRdyOo<QtVT zeatA$Ul(fo!Gt{n3pm7IjTme|<g5<ix6;**{>aaGK2&q^wrv;_)0#(=wcYkBAHO97 zS11QQoRsDLruI!^ncqnZziY^y<lBcQEVBm)LfdBhr$FaMv?;16OT;&5h|0?!cB3&- zX+er)vK$`;x!7zcz+G5{&Q}m*?e`xWei%gYr*u{T$%;YlL!G#mYHMA$sFpDxY1p#! z{@X5$;^VmuNebSGtl;#w)QXe?JwI<l1X;?u+I!~#*%Y@;eYIFTw~@7)00`l6Cm^a{ zF?KvPVw{z0<x#%hcu92dtG)F!gDPDpPot2hA=oj$SKqa)f0(H#7#3mn^J?qu-^*uT zsNdPlH+`aJvMWdpu>e=hqI)ZXEI5>6+nKS4*gq-Ij?wsfI#2zLD11+{=^t=qyld0! z;h<H%$kCkhVH0_^y+XP65DP!e-NzkgKXb`&Z&?aG9N0*xAIr^+g-76RHC-zjF6wa+ zx5bV;7j*1m@~g$jc3CF0kL>JOG?PFVhlgK?#>>#1-bzo{z3eOMrqB<(-}P)U-*%!C zm+60hFIaee#wqfL4eP-<MH@YTJ2uqcU=R!;nz^=>R#xvsPr?VP81$EZp;}T+%co4A zk%xmQM6NF<uwq~#utk)u$F*-^8$;F610OyFehji{4cJLdjG=N>N>$J?b&zwQC;C7m zg03hP7RMJRBtKMWEBF_7!cvDbu_%;~U|UB%3(tkjWl^_Z6{f|kggLQ(td95KR?kLr zAXH5jrT1+4BxZ|2OXT;U_Ov4D2a9Us_HVg?#VjC<)`@p&<xAdbHFcY)P4FJsi$`F+ z?f8DSuCG4ExlX>`$STmqX1q4f8ZynFBZleHlmDCsx7eBqRaksAjo1V0C5z4TWhG1P z;?mQ~76XuILeUBKx4Fh;z%+{e66WND9}*{MWuhP+8_haQKR`IhVZ;gbp1)h^_ay(^ zbBA1KMxdmi2vHDJ54;s48R{PJ!5#mYTwg(@GgxaOyqmf+zEUpfe|G=FWOJ={Qe-T1 z0$q-&yS+lQrG!_(#X*Hkw1c&>pFlf2FUN<2MmVCXE0@(k@-arVp9-B0rQ%ER-{40F zOv_h>%%n%mCzp1F0Qr$DAgUtLJ}#XX-r`9#_Ryi~P&}AHeO@#aBlDQA6jxDscR=$K zr8FA>5O39EU9ON?<b6gfsesTM5?OPFnGSPOgJiHWCL-X6zdE}dAWhH{vET0}LSTDS zPW7MllXdLNCvm@jl}Cj^2S3_oom^ImJ-nSg%$Hdt>M_<KLY|KJ9v}b<q=fA7*qhdR z2p1VR;}*?Y!~gYTb`#zdP$U>7TM?0ND*dF>Wbrx>DKnwdW&Gy<@X<8Uny6V}Z%eF9 z`L$>(EO}X~G1d7OHeuLBLSOdSVFLWteS`%W3Ky%XB{^y)(-r_u8PzV2H86nx$U3zk zN<^C@zhnACSJLR|w?89m(@n4EU(7x|ou9+0bO${fwLO2T#??mMc#6aH^W--(Q*(0O zl7a9T{onzv*hoY$niDFl{lV_$H~WzdwTrrfV+_S!t2<*j2@PE?=IYX{TVcdETkkMi z#t$S*HE!p~nP6$jFDRX)RMBY!p1rh8Dep2`B_Vj9&@L~cA3e^tvVJ~m&SktG_o{pF z)sSt@8kS%0HmVl)4!6;4V@DlQFPp)es?U_R7{NWHISXSwG7v|VL4GIJwyHGv_Y%$= zk6NJaen8QHJpG-IaqT_~gHLXPF(WjW!QI(Zu`)s}3<ZWQbht=iOXo0U-q_3Qk=}sE z5j_~>?)T($$lsXWz}pCnH=~34<Mr0mcBdyJU^^0NC4&NfX>FP&KQ50CBD7w5#Oj=s zi%V=(E(80afSGPv2juHtUZ62&SKR|1K1O04CVXLfI-1Z()KdAg(EjP{sJTjX2?_`Y zlQpuEGj=8^`v+w;7k~}66mqrRn)NmGcMhCe5PZ`_V*2ol1m?fpV^nMQO*~#^@T)=d z#HRE>Da}9k#%#j(LzbI#>`9q-&!?B4Pt^mDO1`~bYXo1zKWA+AwxiSM*vW&T{{-!J zgoD&@E<KrEQw$^ujt2omm51UH5QjELMg)lH#o7%=e*d;{ygELa-+=WTVyx)mZ2Ihi zNdehv+@Gr*v@wyg%JbGrl5$rE+-5|a6={F|!+XiQc>A!=encUfJyFf2h9`t=oNrqw zD3|}9Ucb9itRPw7T$*3Pc7NGZ+C|Z5KN<or_S}A~6z^zYl|YcMeQq57;kuvM+uohb zMrY9%*ZJ7KGRN=E6HDJ0p#zLBM#U}$_5X01SD;n|Cz{Gp$X3SED`D#<$xuYT-}ta; zk}iI&h9Vq%aSM-;o1owT5%vWcEGC?(;xnA`2~|<U`|1<-H>3N1`=p>RhEw<M!XHb> z{qiv98%myn?3x;yS(_$|qx#i`PmW>+6s^wT>__TLX(eP1@FiWYm&SYAMV{*S*3xvR z2{qTZEtr2B!Kpayd8uyC5OWz?FUE6Gntw01zzG1j_U1K4F?+|_0Sz%(1Wbsj`i%4? zC^#ye5`_>W_1HN5n+)4LAXaIg&yXXXA#3`(bX)w-E<?&%M499~)uX0Aei>jX{XC)Y zje9!ul5_}HMZD+k^dgruBl{^_2xRiqCi&?!=RbtL>o&uKKPM$SBklHqzRdh`lk2S* zuKYQ1dF>qmx0tfrTo<C2=9cjjh=Q?JYvCTRihW|-HpZD?0?av6#{qL6COUKuBo$T` znkdELN520eh7xJolsuP9i4u4S%nddet}TT&pz}<qY^G&qoH@irl&`n9oz)%v(6#)j ztdS)sA^f7Op5*VW${sc;Uv__#3UZthP#4`ogmQ}bs-OUp6mzi7N<k^sB>3nWd<XgR z1`a$OncMQagQ2*R7f@RKh>g#lOBO=3u|PtdDhc3K=r;1iJTMRRNR-@TUx8i%UygHp zga4cu9UZxfDyQ(NM@tyakNkyjES2Pfk$z|k%&HrtKq5Xlj4!>n;8fj4X2FC|G*Y<V z_L@^>gHm{gln@dB6)Nwm-kC*p1-xz*BF|BjRu}|yJouU%(s52Qg(~KM$|0wXh!W|n zFz`}O2H?QRCX%=1Yok00#%E2}#SAngFpa1S@7)3pj^Sp`z~e!j%})<4S9RSFGil5# zJ^ov2X6>hoOV#>hiSl5)@H|@)(WpWK8(m76)5TYoI&xLwzNpB$e3pwlmEMPokc$pq zp@rWVc};{B`dRg<+iFd*4Gccfq{Va$;hNcO4j=<+o>DZPY*A7kW*hHNR77uE=F@j{ z`YQ-)n}i)l#wppXDdLIwL9-G>yBt)stE`&b>_i@(imq++Ky$T`gZ5KWZ6WV+mK^I& zqdIER+FFygrnkYcZk(<4rzQRi=eJ%9OTUw<YmGQZk=DiZGWFuaLxoz@QzDh6bwNSY zi3P@6EvBZA<-vb?#Aja~U-$NAdoL6Ij0cQTFwemDag_&f-;2@#fh;`iVJuO=HN3F! zO8lc^tiJ;1BX%;jrcR%OPIIf7;U}JztPA7bOdeS{5~_8aVsIx}Mam&>t)3DvW}dN% zj$aRG4O?luJe?ky4N<EaK^&wvY7(jT6qP9ETHS2+DO9%AD_BX-r9*aITw<-Zm&sLv zQ$===r>VwceqPu>(^JMjPf2071xo@B3SqOzB7Ku9L_Vj9ofRufgz{&UQb7EEMh0p0 zdN6uy2`*x&vOLjGbYs~#!uEbk&4%}Df6KUMsA_(-Fk?eKmf#&<Js2685G6fGyR+Hb zLZSkBFXP@)s$`c1U<gK&UybS&h7S83O!ME(zK+73LuZrOlq@*;?e%#GdZv!hnUjQs zFY4bwE8ZqkBp*Ju`@4v;+xzJ3FSf{Esvgc^>NTpucpmQ{Xopl|v10{U$Zu(AeZLpZ z+4LZG?u7`V^Z}WT(QLza<FP_1L<wRGnlA<(xGj9pO@3bx8lZnuq{LJHk}(u6J*CYB zGAfqZw;%&C|2mhNkg;c$g1?A;aZBHBp<b4Y7iR-@KTisFWuP0x5$;-<RMVB8<qj<| z+7<C4MK9BsXI_q87r4#*LYDuw=NrFejn1{VZS($4_r7C%ES`y$kqHY?&Dnv%GE97G zhf5t0OU4D2q@=sVB=J)AVn*Jc0o*fpRc>zlh|vk@wY@Gal!945Y61SsZSF5l)a96v z7NNxj>F7o(^_{p$m|Yvk6r4Y_$&Cd5GM~BG44Z4<ghH2!b2yAXXrIT6uIIhS1HiU6 z$MUC}M0gYEY;hW9{Jp((WmeY;mKQShK1@WQ=yZv<{h*e-dT8SQ8N4D0FD>=eIg{1B z>qt8O=oUwdf{OsM3>_0Znx9BX7Z8jE>M11F4yRl@!n*dhL#`6cg6g~dZ4`9)(SL>+ zx3rYWi5nR3a<b^pkfG~b3mJXTJm18+M9kbq<Ju39>-PRht%!>*Kd%H1QtbxkW6sFl z^r{0-{AUAr=tbyHJ#KI`O4p#6%O<{OVII_y@-+1n;^Oafru89-4C17+nm&wsWoT$~ zYQJ#W{u~BS&ye_gd$HJEZ?a$1{h+3-#Y}G9ygMF<p?<j=)u;`;zw!<Fz3IrEN)<0* zjc)g~MOqbkI$2-s0}eS)UV!rbzJml&gJb*7Y|rVuuusV4s-wnF_m`<!A)*RH3Q7^p zS(|(;#qDrRYd4|^^-UyUPB2!xysyE-zdH37J7^LD`WRorXSBm-!RGIo>twZ4mUE0T zh9!p#*j9SU0~Ox{^2oCLL00;qaD%zc8-vNuf^W!WcT;6JI(XQA@7^!4?CpFT)x$36 z^!ojayRhT(3Bxwz@4`{=dCe<SA<4uf3eib80nea6pL3W;Ky${ynPA+q__{cYhyIG& z%=dV+_eJCBGN<5mmzlfg>fyU%UC+7p0$-D(g{cS_90vsn^o^u4M)Vo-#_fZq{qQ}S zbeuIb-oGq8y4*iJ`%--&1<?A}=4pwVQe%Yvb~36dRE@5$40jkZ$>h95A*(AI6hFGg z3Avp7QDCEoqs2SZVFv)``JkvB;>(sU6x>^uyVYl0`8&I~kQr3wIXGhI+MU*x=G275 z-#7{A+$6y>{yx=!t;ty?uXeuN<S@p2Gn)Qb6E<e4W93(TTCZt9)WA2HP;hbBTqr9a z2AxD}_35`7BWF*G;yk_2=V7NB!KWo~?VXE&vU&KDkn4tn1PhMIdEcY$>>F{9G4tr3 z-|Q_)8yZ8YE>VUjdatRUE^T}L6siW@ulFUi0$A&?g?+dfXGGgNw&@rt#WCMo=#i{5 zczWwr^b;=srX$RS;^(AQS2waRf{_>A>15_-eq`ydP-&6bF{#5i<pg%Z{6vNBwjhAJ zzeLfBiH|gB^f#NFdKFgd9jSm&o<y|c#$YSGf8q)WNFrcmMZ9=zE4)%LVKpU0c^k+) z#Wn2ncxUK7-9KLR?*}*Z)1GyAA0QTd`WY8ErRk{6`dvJ1yJQSVlIIk$`z<l57|n0z z`XBtjIjq9nZDvI%ulJFyv56TRRbWxol$byCc}bV3FmY-fc{=?2u`nPMewU-xht9{` zj-GCgXQLTmL)x_9I{zLwajy3Pko6mGF*zh19HM>1EdDRskmh^(M(GdTlr-sB2_pyp z2K}k>rdA7@mk<6qgYHP3x&mSk@zvj|KXf168AjWL_ZL7RSqVYXSp;bG(ZEm^m1xEl z%PR<|frF`9f<>}5-JZts&478g`uSd6;N{H*T+I0-xb-y9eY@G%^A4R6gphv{?@bq0 zf?Z8StBlsn8NL&0-X2}OGUB^+H%%@1dV}*O;N|n}Y>RWPpVdbR<!?$VN*TI*LnhN{ z<m?{N;v8T;zJAh?%c03O6H8wa_pG+}xI?jVtCBs#uffLmJqvp3=z7__pVkHX#}`uo z<p+-)w<@7rB<SjxJY8gRzEKI9h(kZw*--~@dG{-Y1qslb%dXbARwPpTQRP&ph`;M+ z^}F$kUqK$THaGmwm}k5H9tA#5u27Mg=vX9rOucy&Rz=_`5~9sa1Ad-7Zb3W1ve9~& z!Ae7MX@C7A{0DA@y*fTE=T`OgY#G5Pv_|D3;_E^xX7okte+W*iYsW^ueTPpL?4SGl z5E+yosXsk8YA8~lt^gR>92O@ffIyUhK5lIe#p?g2$rzxEMHaHsZuG#8gMFI<zd2I1 z&0!aE%C|zR`us=J(^2*DHCYkY2J1ndwtwngaC)DHJ!4)=72xAJ=d^DJG!!Fec*>g5 z7}}U@(r#8waYMiuV*BAq$>+k1F7@D-5Wkb%*Skdmit14{mQ~{#iv<@cU}Jyd2rjst zE3z7r+IBs2GeRTbHris=d-WiWV~Lvm%`LsyK>}2ac6h$-hRU|6bLbIY|M>*}(lo(# zbMUq(@IH=YvqYjQKH^>Sr+J%6UP9eCh$=J<CRA~hu8oHO1%9oXZ*{_E_$$*`N#}JG zMpnD&`$N^*iDwd-Q5XPQpA`D!84||dDMt(-KIuLt8&cn8C^n~jykxDUL6Qy)40J2T zoeyZMcay@WxlGo~RxF&IwP^4URE6Vw54S=tle#p_D=t+$v6EOR<K1ggX~}Ti@5b<u z43DR-R2ftnkR+aAGgfsy*IQ4!ambE4b6B|w-USKzDHf-LP5Br;3pObBK0A;o`f8Lm z68=?79<nY9`_WGx3&aL*g%Rt$hyKah)W1V6nH*&5n?lpKacvL}t90}vlXpQxxZiBO zTv&R&Kn9-8!RC>fV#9OHVZ{~cQKT?rTm{R&n_9wP^dnR}LPim3P`tFv{Mruvo!eK@ zSqv3~=IVo|#rgTRH=S1$X6-IC`kZsw{02&V#i`~A&DoKPbg1)mto3_tBT=MW*7|*? zd3P5tmzB(KLb?qI8IzWBHZ;i^@(!5NTKmCD^8$w4U>cS68K`IMR4M9NC0<Nd(>LnZ zCeon{8qUPI;aY=e1>t)BOfhrmFE38^(d&a$$Tp~2G}wr=*gv;`Xa7?@K@2%vih1oU zFJkuawHD;ZpiNKYBmNj0$>Zp$l__+wrAKI}<TYDdILsYcRh2E8m(j53KfO#Q#^${k zqGp{_vU{i!ix3LRo$k~!%c6BXS*MFj*B$Q%ZfyS2SLDF`+L6bv`L*Kx!MA&_(;OUA zzoUWvmcO%iX+1ZWP<9lgBxQ5#dST=uCaMV@P-zF-AV5gfUN9Q%sY<-=dA(re-Ob-M z>X+RNJ=0g3qkcb+edDjzPISD;z7q-LY8aNRDh20XTQomo_&5_+<`^u0<$wkh)TZFA zO3`4;$<dNxC^5tp+?EAl`r=xM{_*AbmK72pnY=W0vl#@zs+A?Pfqlxk+zLWzgTPfs z4oq%t%fTc&hpOh5J2O&L^5bcqo0Ugbk?@g*aIH`(*9iu-u6uTyk?cg6K<sG5&|p)- zT1?$+@bzJc=Mffj@I{zWkH=(5UKRQrn;JW)nT!|_2t2g&h*xburI!<u-KJRC>p89U zzlR8hT;6R+2Hs4o<uQ<b;<d!?)ZhQjRY^pdxN4!T$bwRdCNzzk5FusgB(tXDF~b2b z-RI>s%93{F`i@9K<qRh{^C=IzWs=hfvU9c<1q;;O=soC@b5aM0%okLdXxw>OWY`eH zMN$XD6j9w9I^u9;NIgga^Ka$3;<W@FHOeionO*Z=*Ct=DW!g+1Z9|SyVqE$d7E*AT z#*oOR5NwX5@jTE|Ch-N{PbyXuGM|b(Eg@{Z41_UnR`tFnn3?=^vyiZ^J4J8iXBR@2 zBNAb3PO^|y!ccb3$&-ojn^aqYYr4i!zKkG%6}uQ2(doZ?q)0`gwts9zmP?@}F<OsX z!rpt1H0!pJ3_Q#r*}AvOWK~V-tetL5wu!`TkrQt#J8b=)FRfh2SLxqcQ|~0(zs@Sr zWwXCH{j$SWn``8OG<P8E>mszs>H>ieiyw=*c~-@0MH>hrzE^+58lsFH5@iebjC_xZ zL}Ly_QWSn6A@;ab6w*Y-7?ZLe`#8MrGy_+K3C6=YmFrsp+pqw2A{1pzBBZbnF?JNC zh^WfgiLEV=vPKp{p%@K&9wgI(-I&>;m;Qyio<IF^k@WR=rwp28<MXX!*NBxl8pAF7 z_cQ+nW)8_lrS#bkRs~XWeK+47)@LrRW+?-Fy^gx)LRj~`&F_7ovvpPsp5V#_o#Yg< zYBDlwrASZVD;HojAk0IZ?pMMInKOp3CaU^)fh9}IbfY_JB7QB{$KxviSrpOkv!W$x zly)f3r<K>xs&FR6GA*sl?*o0N!=>lLg7zu}b@f4eg&Qw5uJ1fHcpJ%eWiKTxP$UA7 z0jYf00!wl%1?CZMpThk6DDPtbEW<%<lAlhPdq45EEGhd>wNG8?r^_kp+<{o>S(#<j z?K0k5sk?bIxC?4@ENzmsI|FRL!Un3)Vic`aWT+$91!ys9%yGwZnGW)E42XyUOzn9f zAd%)u_O#8^e4G`bUSkcrjGLNscd=B5+57)4HkkX{>`aWs!9Njw=r$>WpI|K>uLn@7 zfLj95u8vA0q4V?e%py7_Yg=3Z2yZYaM^wbtzCfg%A$7T%L1Qi)kxM=2ZTfpc2KJV6 z&xsB3`=Y0|*DlGcF0-dY8RohTK*XuUt&bs=f?P5phB=ek2LC>xo`M!Z*K&U}3pVuA ze&K17#Px1R(aYZ)X0xD@Tw^13>?P-}AbX7Mj25grKihzf#u7H#be#ec3_Er?QSz*7 z4qvQ3K1u`Bk~~?lgeFp71C;tr<;M_`%;!)bP3KQ9n+uqik0&YWVgg$}4Pb1#AP)X0 zxcm|2(S0rHL!;KD%*!#4&ej${g^rFkJiHoCRU?HMY#<5JtYQ{EfpJ#u!eHCh?&n_t z)W+8>Ms+<$Re$|jPQYFtwZAej5VBwoL7V)&;*(N&coIn?21(xq?v^<Uy*w&}P%#TW z+WEE(7qiJnTqD>KtaGGz<mG;<HIU)m{yZnt^!|blv-1R3*~NjX$ZS}go6y?B1BGQ? z8?e2Z^>P-vz+9MLMgt;C>HC~tKpQ#;fd~G?;&KLdl99QN3;YlX13ol}O(|lf(qe}7 ze^~zF#LYE-lD!sua~L)H67_nwfwOsY6nHw5hhq*M9QyuM9|?`ckS6cL1OQdLohX$Z zeK0fvs0Y=8wtw1kbnUqsQQ=mb{kaA44&*V^1sQ%R8>CAQT_&-dxHS$qZ+r7|@0hI? zpAun0J$4q|@$m4YmWiQA`I_H*Jl&(i^F$QGKV4*BdXlIm9ydKN3O8Kh;;k%5m%@)w zZL?FwzB8yzs&Q5x3ehsFtW8a=P8shMnxi}FPwOffwM}I{BAH)kAGp!?nKV2xW)t*d zon0304ugsx2We$(PmUcnho#(hIA)LrMin@;u=_#$xFUb;1Q`C7X-%(<GinlbI}05p zK&zK0DPR&ewjtM7D|J{d#-rpVUYZx?85_+kBUZSs7fw|}^M07=N9$8^tI<EZ5=OTm zPlL>+{%4>0b4CwFrl*}|O#7nCEQNecG`of?IrEF-yp;Wgmo_x})F3JRVr=OjeLSbB z@G5X*cuo_CD{hr<81K<A{Z{(I=ey&>sX7;blZyf#3+mqVQpkdKKYB<5Y&{Wt?I93v z>q8R^ur4Jjime4PNdqY!2ozyo?;eVHb?>vl^+8Xb*Q2UU{*#a8Rg7!z_3X>x3blx6 zV)ReDWt7wt6Jk0WKvbMK9x5i9T)}!2QAe^wAJ-+s|LJULLDC<#)FfWXndFw=>@Up) zjIt$K30>bv6jGVV=VxS`F3VBPNax_D5+`ywGXUIeHV>QAgaxz>e2&Ka;$}rEJ{B^H z#2_-4gV;_M0STC$dja_MCa(UE!hsHw<rVzIln9<2%@#jy6Ts0+Wx{d^a{4?#r0H>$ zUsH~7{WkQvN=SazoR*o7&W(vqkCE7R2e%ka)B~3&Rmx(#5h)X7;Uv3}InN=_`_d*E z1pCcgbaw(Re`&nf457o6DQue-%1TSPzONF)XFsfuH$dQSc+1WlG1r`QZ)kv}^3H2( zXQS?ZpeyT4@}=LAyE~v03Vqw&C}nKi{x7A?Q2hhNw04wcoRE`NwnVBZ(yU<qIMH$9 zT^z2|S5%Jv9L3HtRVL)vKOwmCxM%&8=(jI4efj2q?L#-Z6Ke!n`G7U4eREoC(%3cd zrdCMQIA*R)!2<SAdx{M$t8Z1;`=~HRe@0@Zi9RjO*!Cg!?p6QOf`{GvTeBd~hq-Cy zHywN11<duzeE6($gm#F#;fPg7SJ##qKxFhEWQHE1qJ*v@%@1Q#IImCN3ohQ?9I9M6 ztDP?X68Sj4?%&Y#?#+iKKU-$ut0<mP%VXN+D^><Df<QZ?ezbt58@9{g;yqu9&I3H# z8e^}qd2TtleXMRl<1P}QP>IWIt8;Fto|5(O?k0JgUmuVG22y~<(cIm5kfcjk$kEBP z>Ej8wiD`www8M9Oe(k(avDYoh*Bz_6kW1!}-#xQ%)%XrUgf6C#ZctB<IUl)he_nJu zAQV%>A-qq5$p~wws#*_b(7VICLHQ*?Q85w;SDPFYoyp92z0=`)`|Zp|Z}8r@kpd}5 zMggLvC^&(n%qv&Must5SA?4kv#DXG}==xFOg)R8$4CTV5^}=~sNv|U}Qol8Ue1UZW zadPZ)dGtwio)8CqIi-iZi|5R~!*lW46#w_=&dv`_1~xhuW0JZ4ImEk@1YWkq-DRz> zgkk!f{k=^9pehY74{t<-XESa-hGLjLjchHOBZVw$G?97Nf{Gj-ljEsz`og`cv2eWR zCqvHrQyj>@@}TETt3)(S(Ac`e<kV0tq9K`6IctMnwM>k$9kC9%KHdyz@J;y3_8&d7 z`|SZ6=QW(cQc+3js1oK@d5-FJQ0Hl<n!nbko#lF1=ghA_Bki)%fkQ<bGMjo#l=o1v z0VO8ki$u+7$kMdr?;0B~gQiJX()V0YFNQ3X>(9ci1zI@Zj6rt!7C^Zc7w%0)zlejY z*o88xT##Xo&mzwT`g%87o?yd|ELQ(Pex|Y;acQumV{ZuV8J@lfzE3(;raAH<Wxy`B z<EY|8IVqi_v0{+|gf-Zut3=ywEv#^Hz6pAqsx$R}99ZL2#nv%y5#=m1wT@><Cuq6a z*4a-iEzQxE{$OXL>x;7ZR{W>1IA0WFU))$1T(y}GSu+`1gg(rDyweVthRU6a5k^ta z$OeSHVP%Aa-zhV7Q8BwX3~1Nu82=lwKxQU25!x-&=-<AB(p-#u>Q;JZj(+4a?pjd& z$>uir;Q*Vo1jp*kpZ_hVeBX(=urSD-21}EXNO>Sk$ykZ79!#jhrV<ZVj~cVLa`$v! z?>x%n1z#2B!TaPS+L5H>iz$#4qcr7W%3<J}KK*t>0>_$y6uv(b^4?H+5%-fYGYON| zeUdNTS36|rdyZdJ%Q$_?nxt0^JhT}#wQ&D@{lRPI#_Q(m;ci!sKrG8l`(+!f%5@e7 z9U2O5L!0|sr17@1>n2!GJ=Cm0&!Di6C@aK1-c+n&e|L;V+SbMP@GDKWQjz`P%nS`! zjV~8UmRhy+1I0F6#(FzxCMR+{8=VeYwIsbt-!;N{C4t!#8hm=Td+nL<=pu4=uz{kd z;TEbg@uRg%F1d;{G5VWvIh}kT*roFO9Cj4aFgkLK>!aYo^QKu(`}JV?R?vO7ieQ~8 z_K&4JjKBU4o`luQA96ZsPlp#PNV`7n6KfCR*F+&Q2wG0iD88D)tg&$i7qjNkk8`w5 z1RYd}Cl2t_A)m9yGe}_!XSryq>n+5fQ&EH=)sz3ASP>fgEruErOp+2RF@>>{hwfpN zQX?oDr9Q#1ft-+|$Juue6L4Oa<bBiz&X&6(wz^QOiLfsh6;<7PC#YpVRahUGClBV5 zgc6bAF4}qf0X>4Yp67icE(oH(;6Q8Ed2~aeLDh}S()a}-%4cLv6L$h1IDr6asVE=A zNIX2)eoidkTrS_*3_Q|?%YO3=Mk=sn<6TlIB9PPR_rFjV;(sTvlzaS>!sp?mqr5hs zN|roNqS2b(e5hWiZWA=yE383d%uA)8*_=Fi=D@T!M=;GQf>IxfIK+gBJrw2bA}NK- z9%*M23ygA;#jTp)Lry9&EgddF7^H1MDZQWQ{*Mc${m%({Ca(pdro50kLzvPfFS*FB zd0E0jSDr;Z`9%L3+(7b~TGIC>3a8c7-&H|}40+HU@2AP?SK6t{kB&<olLFpFVZ`-J z_GOUv<z3O0mUbi^<sWJNsW~ZmIfF!*CSAqr?+D2bvFSYlll6qBd77cytpW<(^r#R3 zJx*~g@0}M(J*MUzR(pgZsx$))ebV-srJIj33^TT4FpH2OHB%a<yxo}G2u|lZPi940 z&d?&wQfmqdTX>o=a(x<!XnSVGDH4&51w#e;iQk}y8d}F{7V&^-))M?Cy&L<-!kToR zcDM^a9saxN>I$}S_!(R<Hs&~)K<<nk`n~l>8yQAxRNGp>gh5dqgfka{rRfWzMC=<g zM44k|NF4<DSc{0RatxL(m^NKJqdy3c(Ep>>aSbmA&yYF%8Xh$2`D>v1$n?K*%J8(X z2U0VRova9)-@-vBX#d84h0Jc0cP#}Y6vGY+$EPI-ASN9e&CtBzPR%yIbE_2~5FLRM zy>EEDz<6hX&aDASN_iK&oZEtkMrmnKC?0g!R}T^SWGPWuwX+KNK2|S%)$aktYt{MH zxH@4dMy+qr2uBkrqspSS!mBR#ogy7CB_|p|$CHu)Hm4zX{qUmQ9^)G)<AAdhl?`WU zJMH;qrKOBmtDS=}kE8Vzsa+lv)c!cM6h@IyTocqGE*gt(uk?g8bb*#{+S?oqTmYd5 z*NCKU9M^Tn;nGs!!7pmd8~);=X~s5QNQ&YrPGb|u#r%Vqhv_W+iczHaIijIX>wbwP z#$?2Ma-toJ&08TmQ}C)HJfW@E<24#rw;6P~zEg@y(DKQms+ANB0HN#wV+K;_Q~e5j zXQ;^PsL1O!|6Q&Jt^9c2J%F11{MT<p-SakfjUxuv|NVh%liVpGQ#A@nLX^FS3zW?c zqq?87^H{y2$!lH5*Mpe`kC(Quv!qz&HoOKpo+b9atdO#%JE*FQzk|%3#yh+Vu$Dtr zgUG1o6V--n!Do%sgx7(asEb$aZmPd6XTd7yU0q39msHygA5=a@@#k@e{M)TFy}vZ_ zHM<&fK3%Dsm^dlHFx6XZBs!yvV+#|B93=mNfW4ZMp_{1<yr#sp9G`}9Vbm7Z1iCa@ z_TlPdz0uN<%6?BnV{Xxj<U*UI`K>eZa)K-P-`|^A)Bmt4$}K<o?VmuZI1TM&xX@kS z|0s;(7U7m?S!_)=+FzC!6rde!^oKcx3}GE-b1ru*bF4`qH-0DUV@{LFPvqk6&qqD( z4y7s>W(Y$N%c(;Z0i0=r!&TyFl0m$5#JJJlJ)EOhxotM~EF?ai(HI5XKu}PYQLHv! z27U;?u5I~U&d9`~^*A~b%-B)6@K|Zp0|9NB+-0m88RM%=jyl`jtS^^w7`>*d-QM%~ z^2rhSmG#KtM(z!2l}HS2z)Exe@|*?C#ZJaa<=i0-O+~dyT#sdWRyN3-2@7dQu8l_% zWQ`842i~&3EqE)%O~B%Az_EX<(RXZ)2!q}4BX28Hd_NdKN_qn=lFte|)vm`=1%kqg z4|^~R2zdNi01=9$A4*W=nM!%@PAaw`C%Yid!!~Nk%P|C;;FnFfPBIn&EMCCv(bdq3 zoc^P&>3z)CQgsUeqMH=9mlNfl)_flqTT#&=JTPUt>QTN_#ZvjBS*c=Sj03sJtJ1}1 zV|a!ISHQ?YY3au`m%&=2k0;~pySK^PhnN>6AO^UCCU$TwF@NlBGJG=s{nr585ureU z{95K-g;0imDi7e{$2SIkduIBtCDMrJAJ0j3NMBsRJLK%dZJ6G>n!!RKm1rOu2hQk$ z=S@;VNoYUjBGkTk(VahTh%;QQI(hCuFjcGr9n2Hc&&k@3UgGBYt0w*fP`lormIGBS zjUhbr?E9=w1R>o)ZEB1I_Rw{^rZM0H2p-Xi=5QbWs8vIo2x{s3-fFsYqS0e}UQ6*( zdhz_UME&mNuQ+wj=G<69##cjj`81}3)^S<mNd1em)M}%RaZjL#v<5MWy9lT&nLh%W za~Xn(2`JW>;LLQ+X20PQ*`}gh>ZAHyRFMCfj|FhZMI*uof#!f|_>fsbt$FKq`tiH? zBc;;U_lKlMAmTIN*c|%NR_`_wn@D}8Xj`cL-!IewzdyHa`5!FpnYHgN$_P_+*nGDv zRu`+0wV14x1wAwbwsg8UZ{`$<^N9ZIknvh58E>H&4S9gTRHzGj+w)F_3B}x~0Sx$7 zf)0Z9xd-bK9WAwt%|Kfk-j6H$<gtxLlQYNwd6ya3$Ucn6YgU2fS*WVH>vlM^1A)dH zH8B}M$=ue5u3ZO2j7UUGBQj)cOh%p<N7kvIy=-77Kvr9$&JhXk+Rr$B+^esnz8s#R zAek+E9vm$SbiamY!>=%WF;^<dfk-l_9Z_t`fTXX0Y{T#A&DNZ;=Hs3T9(K~Ho=9du zV74{4=1M0!{<r!t;y%@QQEMQFrZZ?ZXzt~1&9_kU?bdf912V2dR?hWe@??5(BX|mD z8sx1b&Dyri<mk9>U5JIn!i%3wi9TuFgQ*(TAHW@=r@s~4F!;2P{%_Jn2p}#hlOLD4 zU{D{5F=mQ`3kK4L(@V>;;DMyU^DQXfQ!_r2zOSCPJcZ{@jLoRF0#Ev;M-@VTWl`Tj z1RW9je7xQ(QA(Y%mKwdp4G^vOjn9WxLb5?*tGp679?x5^`#I&NlD$?4Zz!d0n)w-R zU8Qq%_?JGh(WR4}_YocPmm~f3VVJi&Je#3B5$j0l$g{EFU+I>$mZ1|oeZeg8>VUoP zn-7XS5CnpoS1!8{g1k3>o8AexzYEBE2nj-%qdxwMxHyhW%9KO+CKk+qX_?IHNklY4 ztEd|a6(n#ZOFlCCK3iv+g5uhBl~>ez)Z?hf78>eFUC{9`HZL7*W0y-<O-DE^t&?mA zZsYMNVKLW@u(gcJ2JoIOe_#gU$dk4$AYTz)(Rp~}tt3o4HTAQsLQ;0BY~lnu7#kB0 zChI~lPa+7(tYPD^nH{vp`{uA+E*E4y<DCyHM{5hr9v20GaPe%K0C9Z<0HZOo_i8!d zzeFqS9>inezs$dVDMD{-gFlif>sziNw+}2y=#0*vp=K4(z$2Su({UM~vFUI8;tgqM z9S7|lxc)v?z8<bkIySR2apprgRCxY<4GiknfxaY1VF=;Z{cL3?ae}zWeuojBG3u0D zh*|4Sa@n$&R!G$~4FddWxELgFeNFI)6>S}RKQ;d)2|ha9aOu4t)#!OXR=FtLYJu8J zM3D|VAzxXWVk?x6t4)b%*YT6SnF3hg8pB^kvzW`S1_fZ}(++cAkVNJY%wb_OgIU3h z;jG0P8gr-$L;ia3X>`8BIFG+cyl)f#yj3)Bf5c*d4!dM#Lx6!mW(s-wa%8Vq1d}y# zaUJ8Abxe$uC@GF};F1E#%(HFC-9K*Xkn@xcm%E9#ZJWMu@}mqN5?yvmgu#ybbCTt@ zlBhb<ylo{b2i50)BoMsd*QA)2g%$3n{qOJ?^I=N?v|uS?=^BAz!|2n?0L=Pl$y$cW z-~HvPj6%oVp=|zYMhlmI%+msb9py4N=80Nli;6H*b*~)b>)%}2V89SGZc43!DqhwG zOj^o71`*2^Wm8bFe?!HXuBtp9Zqq52qbQim`4?u{mamG;z9+R`a8(|ot4}tfN#%01 zN5Z}A`aGZadT;fV^%A#HXEI!gPl3qVFN7kB=iEY^@CP&`L5V9Zt*`$}2>!Jx{{*%M z{L!YQ(y!DEtM4Kh*_R@ZL@tqY>g(!L=&L5VY_b(L^WQs1WUBldXk({0;&|05DDUBX z*d?@)SZRPJU`jSMQ`uJN;iKEK+%4pwnEHv`3CzT-Wr>v!Eyyup?OHSCUKiFW3fIz8 zL5l@rg8CMP;e0pq-}#J6$|SVdGtw3SG*rBjOI%IF_%J!?(lV&vfVH#0o6e)%*1X#1 zWdz~pdtbF>07C93F;YC09iA#h)lTd|DNHRzrshb_ZS903)7#fS<r>d_?}dF0S(#Bj zFzpS`-0)~yt6kR=sFPHF=EY`S3OwQ<%w$fF>JDq;@kUB(m!=}*H7g|^Qw{Yl4QZ>D zKpGpHGF}53zp%@Hd4W6}@pym6Lw#;JuiL;^e;p<2dz-yx0G7sw{|-<iQ6XJuX}B_q z)c|dhKj9Gm<Vo#ic`5Ra+mXEBi=8e>-;HA$b8jPke)13B_7u`AcvZrz##8X$_s0r= zkqOVhAS7H2U}g%YR;Xoc=lmyy0-aI;ha7&-JONkEe?QlVM~B?AoBzFU@2pJe%1dKx zQ!R^pCyxcwm$rBo*@E^zBPq1SZZ7DsmaP0`GY0UKnBm{@AfO@QTKXi5i>|sO-C%+L zM`*?$6|(d1o@6F?KQeQ^`Ub$8oQ9vi{Vy*<J9G_-8u_OCWof6@OLUC*lD&BlW|PxZ zl8`F}G`~k<CME07$Epn~BjBZ}MUKV06`FA>i#x&sm3XB{n@d}|T=}d0qBLTy6H7t> z+ZpgjMj{RZxjsJSy+UtmyB`a=gI{i1=<<<l`W!|`SyZ_C3QL?#5Rq$S-@T8_^+>q9 zM1y!et#d=X&%YD}?qzZR^slt<Hr~rv)yLF!pDD%sxE%fC@u*&>`HVaqfx#N&fi;F_ z02u=OmLuuJytDP_1Mt&X(IJ6pfUAA#h&+h^kbCbpcWD#^a6mVyFB{N`PUb>y$H`in zCxQnqrPl**uNAWj+MGCO!Z4L&!~GTN$K^RYIxFc~&V_WeGWbZNEsB>pgcF!-z279^ z3}p;n*}OzBZ^8fIJ<WP9YPsQUF%#i$i0EiC17qDDBy`EuRmr^bBIq6XEwHQou8{T5 z3h)}iwr88^>o>EXmk^b5Zc_*cvO?WEcWW`nf`aU&RSs|hW_z;s2YXuJnka@X9sP}J zZo%*p*eM^1r3&c(%1r^-m@GBIHYuo`Yi{TF`;7)eL}EuhTPu*_3I(}@BKIXH7BGEd z6TB)VRb5VKtikFM$6&P!`uNtd+pdNK!;p-2!{%l!@MiX9wD<0MU|$8URG;J(8_>5f z2+O*xV&PNe)Rj{LzpZ1JqpV|UvNjyC#GjM`L#>NP*5_E;P&o&fco57$rk!vCnnTFL zQw~y<G1ZJ{+U5GE9NNzonz1<%vDLtD*Zz4nMn(xLS}RI}e1xpN^90cCEe>DrFXG(y zEDmMzIhmi|7CRm8_vU;(X?E(#%qoiTwf2gYiTu`(T%SOL>KR(!q#4T<X1NoF7e}YW zfM+{_!o*l^vH|(ISGKqHbRrDvZV|&)#cas&NY^65T0TjSRZcP&QgoK^b&)0R%iPtD z5SARm3BG@@n*GVwM9RcG$s~Nmv?9*fI8CA^&OFV?4_Z;{>JTSzRhlM9kqb*@&B>!p zZefLM031mSmH?qs&0n5D+dMP@<!>x_02e+by->Z+b{F}z))u=9G@%bzDs_h*sP+4V z4ID*FyE!IUHi%{0`vv$3Yn15709$u#^<AK;eDP<e2=iUF@hh1@za@u1<sqjVz9zz= zq5z7T$`zCW7LNsiL&}7H7Lc8x0H;JKo3XMTrA=&N*uHXmC}0Hjv!G}CAud;Z<6LG- zZA-0+8gGkr2c6%3j!=_ILN-o{lwf~jfX`%r#`|K&S}tZf1am!nA5UgjZF5(HO!w>d zUPM6EZ28w?KW+mEB^?MgmdY|TqCe|%gc#2EAol-@6oC?kIrtAV9ke47zImlH%=`i| z)QBn^woZ%EVq>(C4;`W+B7o>o4V3XC>}>$*Hg4y3;?Pz?S-_M4XEl0ubr*&2sZ%%t z&o8I+oJdxY)!4X*&g29g9vy{An|V5qTBQsMO&+%V1SCjgYs(sBI0bD2z*mZwxYH-F zSMcd+koxCC)5@>sHq)!=m}P9h8?naZjCU9i#MG(NP@bQ2Q3737hu3|hBAb5B*WVpo z{r+vzzb?%d`TzTT%ZG)sCxcc~X=iJQPNi=`uyj8CV<fQ}U(SNClw(~2t3rV>=6zjk zZInLXga^c5LqA3k&Qwp^Zunt>5Y-sKR8lIt%v-@IcD}}*;ydzH?^o@1km$zS5lU6e z(+{sOH&CK+yUKGUI|vJ7+}VL7uTYekjx0BfkvxoFCS5GZM)+?kvGtEsA-WXSSQT9Q z%;OyVK`jf?O^0i!S<hY3>uv)#)cx$X*ZtL`4U-$toc0B0w*mcf+1eo~oK20eA`-I< z!-xW#x#G*W&eO6#BpQLRth#0R{Rfm}tJ}~0g?1F*t$kz+W|yjjN-1Nwh>Bn*mq45_ zqz3#reN~dkag;bhwcWEG&WfL+5Ya`^aDJ^J-P1;Jtfu|w2qh=`WawpULp^5U>|-H> zoeDK1#RDe~hvU*EpV~MazQ>a01>^bfvm?vlebnqIUnZ~g<6$XVcsRPq5BfbYEME8a zZxn?FB%ne9O~fgbFo<g&OKq=&5@{b_ofiOaFi9ZgW<{-}^Uu-2I{PgWF~}qXMtfcl z16&J>h$A9I`APOjtA*}oV1e@$Zq|M4XKM0k?cT~rkBGoE^REs$iKGKebD=f0c<A~b z!Y3~<2xiXeFcyzhl&FQj?l?EWb3x`1kxYqsL{?~f)@7<DD!P26f2>@EY=q#lSU}CL zxkQd28Q!4M0r1KPXf8skT!muqJ~%%v{Lc4vg<8UY8kG?<n?xXfsa>f9pyA7<_5m4F zU_Bnww(mabTyv3@3)maT`usG$QW*3nqExPx2*Dy{Er=yd;HV7EX3TnAuq|_GI-J0N zewd<32x?dKw*T#E{xq5rh1|IvK+TRIrHOSLc487-Bsyq*=yqYds<-|)XUch^`R~ti zIJV2><Z1r_hh#RQ8}t98=`7fy?AmZWK@2d!&>%>sG)M{3A_9^kEkh$nj<mqQNK1os zmxOe8cZkw3v~(%bwP)||-T&b^)^o3QU)Oo&1(Qm8vci$(yT}$wRuI;oz%&(k7H8#i zxS#-4w{(RE4oWCgELHQ(Z_gK8quavHW#)ogeX<R+?=Q~ddz@rGEm9pfpZ`Fr*0L?l zFLrNnN%jdvIlre23BsO|C7UFl!>$kb9!mAD<KOK@N4o#NWtppndp9;siO+#R-bDy? zQu1`f7vK`PL%DTRv2VF@6Nw$keE%fWVPm1%N?+);<@eHVvZiOZWKyrdgH1l{1l(0x z&co)wEv!HZnx(!jS!Et57QQ2mT|fZ{ixGqMP=FwT1JRK<R;`*gfy&vn%DQxM%#d}s z{LR_J|1eZ<Vanz_K`4RHC92o&Y8{?@$Xp75l^s66mt*|6>L^~4bS%eD?fegCD5I4W zNz1<xPz9}J4(S2xn{;;pyr%_=J-3aH)kk}sQRD)y!;G$>81^Th(w^fU4kivNgcr{` zu391KQQgl*0|H}r2axg3mu@d07Aqc3wi)hT`2WOITnhhqz04es((vqd@$hM&D^HPs zLm;n3nT?gNvQJPGL0kH=-TiKJvzY%*LnHH^fx-8Ftmas}BDkxnYXLH5j__$=Hbjd9 z_&oO0g;9ZuqEzefH`Ga62AxoVuaS9Ybt6_!<Pw%|yUd7CC1w2*S!Z!{<u2BvexmJ6 zh~*KyL;m>Xj6t!f+!MI?Qu^SUGxaE%bTr0DEVv8exURX*2JXs$Dyo;2e~*Z*ktBy( zgf_!oA}BqmgVb_C%-Z~!pH908obGJIR(v<I?l~}+b0sWi_am12+$V%hLBX2cAZQ;v za#d)NPh3@^-7D1M;%$Se|0!{1^S@GzhWF-xQjpEe`6>Q7RM#WhFvzMlvLW&jOo5J2 zfkaznP{2)(IZy!@=<zsSB0<fERP^w7dElxuj-dBsZS0O~_i#HFO+X5hv$e7Yw=*h2 z6&S`kDVawxk?~tugpTdkGqH%>+LCa)r`G-5R2wWWYr~SZj4&vL{(o%^_0bHsKSc(d zBwLwDpt7yl0mdldFKs%^$R9=yRkkSR0K2&uc0~6Ezv(rD>GjE#mvoJ{W^|T{4%K?$ ztJlxJcf+gOwM4w?g-2e$ZtICQvK}r-iLp7wY5S=s(Nc<V<*YF;mJ*X~315N#bh`fX zEOz4E3FzXl4mcoLd2XH>reHd$<Ou+^I*0cRUAH>Ws=l^h%rWnj<N1tUO4v|A7qz7Q z7N9pZGOM6UJ4U;XRq?M}bb8P?ZCwkhbW&2GrZ&v;o6hvNKIA|)5>Ys5g$v!QC}FDE zD0*U+r=9$!lcsI|j%u7Ty^arvPE$!z>@PqsN)l?ed%2oQY!Gg&Ay0~324G@<q0zZ# z-qEC^uhG*`$E|rT)SI?b+QTd-9O@+q{(+!>naB0j<7^H8IEX-J<1w%o0tX37f-&|G zI!06XhOMPDuwqKMVnLPL*FLBPlQn||`>AzO3T|ns+i=UaOt<sLogEUVhHWaD%2vdN z+spgjB>Jm`HV*Yj&CA@uh(Y`yiEwcuq0!Zh-SyP~7m)fy<$kDz<*HhLi{#}ogU{JP zpXx8-dOds7T73!_3~U%Ej{8$~9ZQ%+<aElsf9fk-h*kEnV?b>LhK~Rpsob=l3et)J zGa_1AMO{Qg1Lj6UsaHq3hL)bEw6&CW7^=|u>3Cc1I5}{=1EP{4jILNr=jp;cY15}d z2ljyfc7lNkeF<?_%r?5_+ng_oA;v;>uGV_Sz`cFt2NSGc_wIQ896#b`D{f&#JDJwm zVh|g_@vSf8w4a55jDpPHXaZ9t436c@mF)QHFCr^G_Q8Td-?v`SRwG~LeYm>)bWwuB zeF*Y@ka<8&qx_GKeGg9?UXO#*3UT%HFe-;|<?ls(m`5Y5!Aiqe947Ef@cltZ^z%>q zRasK!=NJOQSz^s`EehPT)~IikGLcFw)==u&SY5pyvB3E<iZIPNv8S@%({SpQ3J21e z4VwL&r*HNsEB`dkch8W<u6Lq#R8MK&>5>-RT*N5}SJ*AHJB*wl<iKv#!PpNq!QR zmV4@NW!=EX^|I@rg!RDuLvC*Gy1Bdw7m4wg7H=#bQvQR&#K{wkAn$aY_E_5Wl+b^H ziox@Qd`!?5AU`~29xC-wTNi3+{q749XAFhc<d=xQ_Y}r=eUbc_#cXue!%p9YSeF0I zdeh-T0Yn>%w08Uu$+YD_AC*DoGTi(_?U|}(Hru8wo;k@7Iz?Y@Z+U<zp1Tv-m82JQ zZJ4_cp9i|*^w5n0(gKs|x_swbNWk5p>IK8fY&dv4P>>crk!KsirN%G=I?%J}7)XvH z6?3RjKBYKEO%jVlM2_v+B@)q@8bsh`6Fo@}!^08Q$A8U1Y>kgC$kUDd0t3hcmYbZn zilRGC@{(43UvMNvp`Dp1i-By0Ihs)+6gn6p|KhgPZs_~3?m3v2KdL526Dt>sQvp5X z-N64AS3*!QpyFwM$IpbBv5J!%lA?l1V!VK`>yj*k){Pb|03HEZi;if2z0+iNg191Q zBd3Ly3ule3!(v^7ef)If5J}q6bsvG4u}IUyJ??$4*s)Z7xEl@&?hd??Z#6wm^pv`h zGpBR3O>lYWw}6V*ze`Dxciui1NfRCCm#WA2hCkxHsBvk(3X>1o*$KQ*m*Ch`OnrrM zDsoKV6<Tiz*ecCFX)NL9MG%jEnWXV4DVX8KtY$wuIxiWeaIFg9N?ZwLgJeC{mu&R- zyBJq|m_bLK9AjNO7Ld76*~gpl?GAngt8BuBpWyx6qo<^=!-5;FsgvVRHdlkgYZr*v zr@MOM-%RX9XNH|#bhsTynm()_qkVtHT9oPo0hairN>E5o^~|Z|k1n_r4e`50Dbx_~ zaUbQSZFthkFy?HYQDw-KNg_ZzdRl5P*My~IKO>&_IS}&sUP%8UaQP1j;w{DILGD5m z$9rpGF_R;yNHuiAnj;bQXfgky??io+^wrU+zci=K@dARuQVy!G`YnZoKp{xzNbJ9E z6O9}X4r)!M>*?XQ^*w8(La13n+E*r@<EI@)O$$Af8^Z{XBJM4|8ItK1TAr|Ez|yr7 zZosonMb!bxpyRf`smLib2BvMH;9q!WlGH+S_Rg7dp-l4hg+))7XIrw`@`|@jwfAis z`XB%8fdA#M#c2O+ZesK&#jW6>5ANCd)ttqg`Jn*75F-wiY|4)*{j}8|_>Pwgb;K*4 zhZmVX4`H*IQYgx!)tKfxJzm~quKKn|QBM~@fRcm+KbGwow3{*Kw`CY`@$_&BCE5JI zSJ9+(5xN4yC-W_#y4f7?U2^qM-GYN?zJxX7FkLjsX5{mg+Q_0g8{^#$aV66e<i_D1 z<~B%XHDh6(X4ds?)&M9S><f=Ltq<H?^Ba3e^=9!*5}%{P!@<?Xvh-;N?s4lwl+He` zOXHV3AthNVkyzX<Xmg`-DT*4q=i7U~cf)%n=G87(97GHl@xulNc<Of^`KyS3yvQxj zZWG%OpH7WhjnHd<9uM+GD=3{r$PlAF*UW-4Mq#lD#5S><g_RUS#k~n!mhG)tEZ*xE ztE+Vxw^lUwnP8-`ie;>OU0RmrOjKs1FdI_(x2#NQ<GRyN<&B5CJYiVRY`64qKV8kx zwj(xlFX+-VXS{uC^bI^f-g|0d6>mZ$R@Iccr;NC&<**`Z5$mf9Sr=%h<p;utW7Fq1 zxD^?T>FPa}pH4czW!#v1aEQ4fUjPl%U(@!jYT|??6Ql&dqhv{Pd)2#!2oK1aF-m$% zSo&vb%eLlfvA1l7!D<Gk-?bZ>!kt|yHCLdOxO<Jix+&+_^h3v?NDf^sb;I8YQgt{O zry#eB6#bjRh*JjoCp!pCfCtUL{HK#w$m~revVYRh+}vHjpsYX9Kta2%liV`Un~~~q zMSIAAspnx;(L2B6CF{djD^hVo`x7YJ=7B+MJO-%5%psbW{tBUY=TQp_@lwwozY;sU z?<j{V%tQ%or9R7LX=*N|h4_56#n%g|N&z$OUnF!0{<V>hZolSW|M9!0OEJ*uVq#RU zmFM3m_aYfFk6as33n)4?p|?-ijnYg|Mc0wnn$FfiyHBcgqNC=~K{?r<{fke3x{TD9 z-FspoteviDgF&sE=7=h8(vZGN=wRo0?Rx_C{r#3u8^VgVh@^LyCua>48H;Ky&z=yy z<DE*#;e^No5}JTeP6%8;D~ZM;za$laN-c@Cdf`qz1*fswG$A#~b?n;SDg@A}L=pK& zAQ(M39;mbE<nI`Oyd5;MS>$GVRXhqJoG?z?l2NygZ~rCxa47dq-!@P-KZBft-YdN? zHz>%;P9_QBHZG{(dFtQNfrVPF)R=#3UO_0pfyjMM`r)1Qc<8qVJ63Z7A`cwpPDMw> zdE@3<qsH^T8bnrzm9O3(S{dzM<KgBI0Zi~O;=_<hdgH>J<9^~F**X8q;Sd?$T^XO9 z^Tmh!iIwXDvOMfhg?rX)ApsEJ(&H$Ru70f75nc{2Ri)kW8;pI=A{gG?z0_#^^J{xq zs==pO%30;DXuXZsmLiej+YN2aO5BFYpZKAE9%Ox^_+|oKvaWqC?MUd9#np?piwlm2 zHTME`YNG9Sk?eau7Biu0_2gYf9Z?b7r6DpJK^;@of9v}07wVRfVQYEP(dMi-8GUrU z^C<05xSYVcZGRK>2gi5vy5H%WC-*V3jw}qE@Q=;%)y^JS{EcJN9%8m43DBe)0ENS~ zN!3z#v1rtSag6d0SN|vq8h79{(94`J@ea`Y?~c|ueY#w}I@~qJElo`0tmaC4!Hhcq zi?wc%4dh@9sNoO^v~f-X57T_jSei@;dX!w8HFe$#02(y#1O$MQd=k20DS<vuiL<*& z0zl-UAWrX>)u1#O_7;RU6rWsI?JMNHm9d~!yvN@o$~<Y<wrR)Jp3LD)&qbumpd1&A zXOmz`58>2d9u~3(f<KZ>M*0gzw+0V}A>CoVvHaT9#-<-`y*%jK>^|=Jdu|;Tnfh39 z5DkPxKc)^&c|YF7qk^qb<Upa)+2o9fk?0x{mdI1xAPsTrB~ci#Vg?habspiEcSe4? zGG^bc(Q9j{nku&{lI20Wfs?~PAcZgUC{HLF81+ph(G?hilsBN%O^_EK|K*jXJ^*gI z``WY8`mj~8gjk(|B=!_8V$&v)Kvt0nU&IrzHX~ZnruQa!2fi}ly}N~Vc>n3aoIS(4 zs+dZ>=$jDS-<&q3`-VCriV2UKUc8;aD=t`~y0b)2H6^9Ek5Rn`SqX(~-$(b2nQiv> zZu#=0CSzZ0(#%wB&<$%g@|v~-8ZwWL=V~-rAfKFia0f`$;I8JzX4>;@#+IZpKS+@< z7Y4?iVMu*CzM}k#w{e0sz49re+!odHt&kTq+^@76ye`^GJ@3za9Iwfum;PY#g_Oz> z-Zqmw>?k<{C}8-<7g3_%V0|!tEfGT!jW}4!?|OYAOZx7wJ(WiT%&N|?&Dza#wHuT# zY}Yf|=7L-u#0Sfw<(xZOfdDuDH$HfHGaZ9QqB@PS)(ucqfuPcs^Vd;VzvIwLDKdih z9>)_86Wx#*Cu+LjrG9UEN?|C=(vt)J|38QaJXD{Hxi8iyh@ON*P_C*S^-u#|VNknV zM*R=$*rC$>MO?BzJDYj!SSIt-`oW8dE9rxyO$?W`-aQmLF*+}6k3_e8#Y<yLeVm0o z?l*A&fN*B&>>p*_q$I=X7TVu&>}4hG*K^-LT5#s|J0G5JSiaf$IqTT6dvdb*XS$9W zYD>sg#z+fesVjU`z^PzNgRt`z9H;_5ZhX{W?ACKQOaFl4F!fpMiMBo~qkCK;LM=Y9 znu+x;JY1CJJqQXn23|*=<1J@gxOE6LAyE<CVcwLIRU~qBDWUKs0=`xoxc^Vp&+s;a zddcJ#S#1^~q(WdL$(K<$4bC^uA`*C@;jC1Q)-0eC%BlvMU<{_@+hP>vz|;I))(;|z z8D*MLncjrIo@=j!6YbL$)tB9`)i~Y!TC8Y8>~&_{*Zuh;_mP|RX*QHr0N6Cfg@qI7 z^8^JAqkP6~^^~vDg{54=^Iu^pF~;E2Qqk^l-$OuUh=st{C8uXCeJV-U9Tf6)@|g&8 zB*Fn?DUU<5<Xz10C3G!w2)y)dqg`BfYrMDI+59M36E289I@#n*#22K4B#+_Ljv*fh ziBrQEmAHHH*R{px9BaO*7|@Uh<y-F?XCBk1sFh2${=Fey^51}nCF#4xfS?>5Q{zq4 zU}oP$2q=Jg?lFyWKVi>Wjs*>#VKz-j_A=kkf}ZL>9OdyoVve3xWDn~M(k@%0_LSXg z;1F#s<GE!M*2iV#MTTuG>d9Tu+$FaoHOB)iHfzdCH##yw+!obik$s%X9-#ofmI?1! zSmi}2J1{IZMtMa~7OR^lCR;F@vn(_e$V2_*N4)?qj*IcDY|BHs_kLrc8g$E->)-~z z?by5`9BPng)-!F9Zvv*Z+aBRvkUY{Cmcd{I2W=U9Z;A!SMji3V%I)R+fa#}}-+!bC z>kM7+-<PM>=8He-MIRR1oGmePt8sBS)!1)rIi^f68S3SgS974)E}+RR)e_3DGT?<_ zT#a0{L2QAfwZwCK_Bz6xUCkAT8TU8pNSU!q55r8M!zwPH6pFd7@%7&2#CuqvxQEfN z6{MMgjj({FNu{0TU*>^tN5lPHVTd61r&P0^*C%Zp9XFk0nCWs;Kd2QU2#t8f6mN&6 zn~g&)tMpM3dz`&Cs-zR-=@jmNiYw!F*uDO}rr!2to_XX*WU)%i^DHK%i8$ANJ0eX+ z@<N<|ya9Rw$QEM|H%(9a+~n`E_v|B%k54(`ZN!51t-L8@M`E0Wa3M-CR}W*7{Llw7 zM%UHhy87a0ULxtXM3P3yB;VdI+%Z=EuP3aw+HrlwFRgr-_Dgj@z$D-O4Ix1Vx$f3< zG-Y!i!J7|=8}vCwF`2NORv}mQ*|h&}RGV3j8)@^1qsP=?rw<oWC;y%d$cGgoku4x% zDcqS)`{-)m@}n;1monj4Qbv>7wE6@Z;qAhtX+@cHa3J((EcLvuhUz}b|6b<)_VKL$ zX)G>%`^KDzMVSzEN%XYu<4xxRKFH_!Yl7ZCDm<UbwW`u?zx~Mao;W#=zqsA$JC*Ud zJD`=M^5|KR$ANS`hq$i2?)nAP&W4iTxm|w$i<hhM6u=4>Vo(04PVda-(Fsopg#zMf z;w4wH!~%PU($CA!<Lo+-ZuDQV8lbTBK{`7}ni2tQya04$`nfCEJ3>xC%N^$8Oc4hV z(%C%?mXKAoc(DQqRk2pk?#Ygu^p=x$u&JSAEt~yyo+37$j#hX7r1_;EX_7oPtF$q{ z-u(?~Ma{{|#EC6WI-BGC^Rdn|7(4fVqg_UYr03x&L)pV50e@>plh2=Z=HK$4BFjca z-fv8=!o1FZz$Q2~OnT#tl)pafScFo9cFm2=V_V-n38Nzlj;)E8s0IV#v4Uc-lz(d@ zSzck1>g2t^oP26F2my=`TZ^gqTPwt{GE}2~V}~HiK}6Cf`2F@#&prlE`IkV9q5a8f zNoZ^jZLJ&XNhA3S64HcNJVq7-J86M76F&Cnt1gjMMhk6JS{)lPew-Xnc9fdli*)_2 zNdH~%!<xpsn@O^XDM_1+fKqPqM<G(_wW(@=Z?b)9t1~Ts*lppSaF1+f7JMvOpk>et z(vS;DP9&OCRp#<|SB4c$3E;`@BsC5cCc#U89T?}y^AuW3?ac!NC7bh*S;zijd@9`$ zvzYOUBI<kOeLlbRWdUwQ#~LSqr=Bm7f(VL>HEHlwoQud2xhjjUAC?&S@uQN<S#)Fi z!adqpOrot=qvPZ)#^Y`gr`%N98J}EKsNRCm;C=Hd-o{FAB&@oc&C*RnGlXsD=hP@g z6Pr*nsYEeKsMsSC*c31MR1R_BnY^yT^q$|#mHFc~R<{$jDLuhQhG+5d04QZ8EDV+Y zS-Eq4R4s5hHSR|b0M}DPnzfVhDMc!dEs5}pGc{$oy|ZdZzE+>HMvUvndHY!A<9;1C zHD`Fjh#g_cAk9}<e0M5lJo!HIUHL6he4rE9|KD87!>&!VsqIEoq)<iT242lm>(2`W zFV%Yqixd|eVshcSSVNsq;Go>r<F8wj);POwDD!79ookvV?rW2lcq}o`3dQ3^0ATrH z5#17fOZK+p!DbEFRg=~fd)*{#lV<I*^{;7Z^w*K~hyA-|bA}tjPHAcIT)Xqy(s==K z!+6~krLG9!i_|T&iOHpNm&F^hFGO*tMI{d!T1dZvsfUIipUVe{6heM)DlGxnH9O2I z4|dYS^0RhM;x55%W7&WL>5w<j&fj5=Mmy1ZV`<M4dg3gl01`LjtvSkh6sqakf4{Pr zhk`xEw;=Y@lNg`uad*VA|3kS>NXN}pOS|_(RXl~c#5>*)uETIz;u7)I`pja4L8NLn zb<C5!&u4^7{|Xc?RzB@)I~iXeXL;J=lEo(m>tv6X_u?glrT^J2Q1K`Ho>!O`f@+I@ zUMW9l5-P0RId75<-P|;<EWc((*tmsksBpy4Z|+b&2_B!uRY6|J5#ITf(C7~dxghiO zVBZ45=-Qkqp~7Y^Iu<OXxw4D`t4OR6WDSDx)n<Q=CgS@kvv#Pw3naSqWiZu5o1dSD zbYHmbc(K?1==qTS0Qa<#YQkznq1ntU9_;eWy{We^zA)1iD@lRMvU+(rW{=t)B4jWU zanswsK^M|<-y=2YF|p`rc?5u#=bvHQ0Tf}^X7R=dz@Z<EuQmqa>`ByR+}iT_2}Pm8 z^r7ZFtk^CeG3f0+Qc`6QD>Ecalko`z+l!pIHy}MFG>Ei-GGeSz+}}0yrDNk+DF)2A z5o`XKy1;7}6k$m@9H?psY@}i(682=l;egR}!3e=G9mBxycOIKTWQVLuQzFen8T**K zt}gAkI#;d_)7o9OBOm&r8GQeZiCKN}to8ojW24$l-HX9e2E(e5ujj%fLZr`qieKzr z(y%MxeAJ+4M`)TZKKj5vmPGe~kqRe5)!AIxW{*LLnkkSV{%22T1W+Dm2Gf2X9jB*2 zKdiR%Gqz`K-?VkR#kBdMpO8Ep9tt&}?Rix9wK!%{xr-)QOc`2?|Dx*qoOUZ>#_#Vh z(^ikIb<-QM`{Hre`=#@RSa6Mjkh6L@SB>@Ls0541hxzY8?4l?dBPAQ%bcBrFj9MyM za;UYq4tlI(VP=UhhLL*}f4~`Y<aM)n&*?0Is<4;-`nz#M#~DO+)(rnBCF9O>*kMb9 z4H0E#clnpV`_UAW7+MyA?yPBgSRercoG~QiikV=8ABF#R^*z{sAy)48c>VuwJ7G*c z7TE&iNZQy?Hc&tWz(qDvnWPXRss6eXd%&V%X60rY!QXMJwci6HN{yEKVwU(m{x3B1 z6)G&os=;e<G!^?Vj8z`Fn22+$wzat>JNvP#Ef1U%Z)!jL_N>)k{(@Sep_3JX{IkpD zFXMW>f+YzM@Z&fL5Br+Zw7;-6tq}5-xU3?Qpm?-@^I_7@tSb5r2hQMs`$y03x8yNz zq0>YI5!$(gvpaV@uE#t;m3LW6*k}Eaxac&!79jilI!Q*viVFZALXS$|x{wUbV8sZR zwxnRgk`Ke@W#)yL=Ae$y^<}~y<ZsG`QZcimJuGTL2{}1HxAuE@cDsZbv&Do&h%FNq z$+)bF1f>wqOI}%kP|Rae6~3k+EtB+IQrGdZKrU>N?6QLF>ADv+r#rMZre1d)H<J@l zx9?4TR*fzgG*+qga@m*&05}Cb+o?HbFijZ#s}t);+q0OZr!>A7_qcxler`>?yIxgO z+3V_*%AAsNW7nn1fmq4{fjnSjNpo{dsG@jhzaY|_A!{GUJp?%=*DYsKOiT)67Zip` z01DNe2oWGSQRnD|l+vdPGvN>e6|PXvx2h@Wh!#$Z;wJWm4Hk*y>o7K4WI7goD35sh z>osJ+6dN+Ak<pB~;Gj%+OL?q!Bu+RD2TLo*eIY6$)-V(qHu~sV?Ecq-qwD3K%vH;Z zgm*GA!7B+_yEit8<N*Zy!=IOtc_)Q~Uh?hq;fd9ay8-s?zQ05;wB_#%&#%t888Yp^ zMRJGe5Q>~D+A1*R<%Zgps3Ah@9SFC@IZb$H3AIPC4Hf}M>*e!J7LC+{iuf=IVP)iw zHX}JbzF6>+;cDtAPGupHdd*%}q13|QKHQ$+ys2WoY6s}>ZVEBGm-q2Bt^eNk@$FvS zZye2hatGj3Wg>D)f_^}7a!wuL+x0ga>EEq*IUVaG>dfJQ98!3RVK_kGwL(~s0^NH- z4(o6&?8T}vTRnv);M4F4hP?gzgNeI;XXhB%&2C>!ksi)Ip@oN8@lfx9A|s-{^TQW? zMWS`C79~-Qh!?{uRqL=<h7B`DE~?8nK5>VMdTLlqq}D?cd5bX+6tx^9P+PyrIt2zI z?#~I8u<_($)hi(S7TY)PB6u^i?erk*_n<2FxLElY6YEzfi&GdUBUE<Ddti7QC;96f z5aX!xJm&E`Tf(hqzdG8zkS^Q5KJaS2Ti6ZHZ}SxV+c^ETrZM%K9IXcL)8g^9rdbTz z#!8PZd7HBEB-4?|!>yqFU;aTMG=|n~ngd>FX|gA}6=6W5P?MY&eZvAE>gc{Wh~Evz zLKb`Q3d9K1#578#cY*MFyCgnt!+})2m@4FF%{P%)EOGjzV)KzH3O3g%srqjU$c6Pm zA^6SJqUf-~F;?*{D&HHF{o8}1_;{I9dsB%fKE3aCEU*@six8_am+WeSMVg%}o{K&> z$?yaBPryV+#KU!n#`E(%+}DC#t8Z#n!^)`)ZNq73+F>POloGTQ1zO>8&-tbDV4GOm z?|RL5c2coP3ewpCTh1{k?~OOuWk%iNqu(V-o4O-?E69+)C|<PIqyRU2cVrbuSMR+d z#@PdC7_x*<>BU4I9-;Lh7Z;t0gUy6UE@ktfN7nJEeLa)s^bi-Fifd_X+y4y<1ld>V zlp<S*%!wgx9y|NSj25;(-f~S=;n1E3l9M9bC++D7N%Aa^gg3$^yMrPyRyb$zJD8{T z<JfKsh?6O<2TdJJp9O!Q1*$8JD4T<=@;=DoNEvRWD~#kT4Su0pN|=*+Ca$PtWrXnh zi_Z8i<N41<<NIyO%H7||I!{|;a#>)6Kp>3-tt$Z#j>vb=tP!QgL{tZ~9GB|+HrBd? zkKf(axs2g%*QW{8YBfj+%0d`1^_XN5>0rsgh!-}1$@#{~egnoF4Xwf8Rb&dAJkpIB zm@FyRqRrsQD9A~YwkYJAm@ez{2-WtpCxtJ>03_h*F|i5wc=hY&yI9Z|0F~bQ0CHs$ zI?uMWR3YtD;=^L9Up3&2sq$vGcsUq)1T?v@ag@awtM2fr$~bnEzURNg9CMp%PEw!7 zhD6HxwKZqH7D^i7&JazH<qkb7>(<1YT;u&|{`1Ge<!TPa(#h}rqn5MgEGds`pXiR; zQG1Oq(do=INN|$8fva^aGjt$VWcru27Kg4l6D1@d%mhDKd*HU-N>XL791g-|!J&xR z(PmC?5r1lK@!qW5Kt8lb^UD*$Rw09t%<aYP5oO!~w%L|n(bCsTV@2)m$9JYJ-=%Oq zr)Z`22a*Joak7X{y<VJh*zBt0!QJrmqk2CWc7;-8`1EhQ0AX|7aW%sdpU7mET9s&< z`m3K6Ckz1(g13kZ&;(YBq>bfF+hTWu-u-^6&iJIf<b(sQz2rOc`~khO_^?rtc?Uo3 zNnA5DMz0F!k1oD{%O4>?o=Jc)u<VJ}2@sFc<3mSv{-%@A(S*vfBQt6g23z@CTJ7Tl zYn-{@^?nwtkaf9EFhQQV1u8UkzFwpy&!r4Q2DlPBjPks{@+rTn>9{Gtb)=2}o_%Qh zd$qOuCtI;eo~awMm-0N;@&vn9lAbo#WHpZ~)6@MtV!+f+TioC8tA}{5?ITaucTaOT z(<ues3u|3G%MNq3Sdce*X+E-?lIuOPwK+7lnlYzmma#kwKun;?s2n%--xeH|V+ra7 zR?!ZI4f@k+{LGNsQr%}g=EeDug?RbbO!iyNOyVl}mx2c74G0%w*NbFSL^3Ry@j!mu zSFaF&dhvN}FAS;71B|HW!@-_UFWim_z7DvF`m`ND+u^+5rJK)GosEqJ7lFw!*QeE& z;1lMXRp!|~Cd}bGS!Tyb0?+Fhq|fEYHpH9WicAU9P*|u5my#5Bg5D^<5(@MgS2K|6 zp;$H|#q);oSrmuk_{^Gj<zRKDCmoY-ZdpRbTkWUN|Ei}2A<zFk^v4xP!<*u!UX<HL zQjSNG(bfGwB9I@rGI|1(x)YI})=d?(-EH&TaK_}1Lr>XXZ=PX64HD?XOF4{jfICqi zEe}{guS^#^yP2DkYRV>clw4FJEX0mIv!2T-52Y{3+<`f>(IFTX;8a|LbElnlB2GSz z9iD?Thk4;<P7KV_Szu&!-F*M&P0hB<?a7eGLz<KS)xDG7T56s}LO)9(K4dc<-z%7X zY*;HOP8QFLso7`~y+2a7p%;17yjPOsBz}Ks&meue5JI)$pO<?xB!^>;315<DFE5j9 z2~bv|u#u|H|0Lu6D2P~G$4%H1x)YjJ<$iLP%=7CAJ-htfz-#mq+j+hz5x5fZ$XS1d zqVwXz*FoDW!p5w(%@=2ac*+?<oX<)<{xNMt#V{^Bd!=bTA|OUQud4hxK+4OGf)N># zms0krmXm`v<N<yB{0?RM`~uCtba#lWZqgEkH!xktVkBv_&%NOimVbCY?k>V<&hvT^ zFDZE@K%S>(n|Lj?g5GDf(1Jg!{gUC<!@o9T9Rwzf=h3w=p<v3Fz#{4yMpV3<O+XAo zkP&HJy=b!qQ<%`6^&GhzcD`&VglSr27>F<1iMb4hviY3!E{L9<xwuU)s4Pg&rh9EP zM|Rz1wXC&dbsTO!BLdo1l7@~5j#jpy{-nk?IP;at82~=H1Q0AjLQdo&gbCmIZvQmm z?~wlBe$;y2FBmZT7Sw^h?zl9)ZNOZ?&kz_mt4WydYAVHt!~AZW{n9)VTcWJy$XD8` zq#Mes1Xu&bO!uufdL7O^Nm-s7w`5MO4^#USSx$|{l0wuDYDNd@Hl>1CgGk<FEpt zzu#u`eN)o3{cO4Uh>3}#5!7$}_$GsK90U<m<(z7<k<fyYe@=;f$tkuFB=^^{?n^?O z1liB?{>t|I!JUcQqpW|2J{nO#hrcRJRua`u`Ddbm)((z8-!wv}JC%hzaX7=(Jl$|* zK3(7ba!S8H(O$?1G*XQ)N4lI88Xy<SYS77Cq0M;Qasg4_;_d6%x0?}qd*;4tL(@yb zlB;;K9k@Ft!P7YhL;xQjRooxHw9c{GLAbtw_UelDQs7=R`a-ddkrelbY8%a{ItZ!X zNy5Vu<TmmA|5grUIZ2v1HU};sC^Va(a54oWV|63#Qv?JE>l^-|;s5X4ZuxpEL+>H% z#;JMV*5$)08LQm**LZ^1%2>%>ITGC$X>-dT-fXBanPG&F3Q~7_GYogPSE|CB&STE5 zb8TuZ!mq=%i!-~^8_nfqNnJ_h+(p=}VVoXRDxHA4uVN7^ZxBtSZg+`2NqB%P(fH29 zPXkAvPy87^aLozGuK9TLf{S(dCq;AbFb@Ie7@hPdQCLtlBVM3*7)375NI7d$XjABT z(BwnapN<?{$q!elpRDe4?`OWQ#&2UGjHB=XAGy*ImsUJ=@2<m~x)rCg?zTP*kuS9U zlKdEOu>7c4@=?*IGoYv1ZegK1o3lwj(#&>&GZhoTYx~P^zsB&~duQV6j^F=23QS?! z`;jMjK`Rl`LjrMDccXmL7$az3DtvbCOdU-$P%5Ur<ZOA@qxYWt8$5s(<?{RY`ZBnd z<)RwgW%4)&3wW|}V&-N8QX~ClQQlY@@R)Cehuh$px##xpbycyr-=Y9O&+c$(Jyj*3 zp^bCW(M0_KFbC0OcG)aApG`4FcjD}Cc5E$Ej1?}yKGz*uu!n{{N{VY`texU{+QrO? z><{^#d7w`*i&Nyme`oY?HsOCYce--Fgf{KC*wdlKpsh_(j|#o(+v|l4=acPA5?@Y3 z2m$=Y1=E4~q;&0%E{uIw?`iK3WW4`k5S7nPch~DFa7PmB6cfdNZaH>=gKHg1zc)*2 zeLO0oe_Y>+?JXyeMixLIfKpLb<YA2MXZnhbrT(N#VJNu1czfE@O22Q;c<H&nBTIh8 zip$?cV)T8d2uc?)-&n5dzJ=r?^>zb)`5J>P79((oEOkfj0-ShHc8tzvw)%u^RtBtn zZ*tCDYbV9~M~`Q(4i9&AY{p~XMrSU!ZJfl)TrKOEg_gcG?;V~wVq<&sh4@2EEw3VT zT#Gp?`Ro1u5G(Qas6~3IkH>Byetx%|WSA)1#`@8Wx(+3`i(7V!4%51<dhYk4gCVFQ zXUHc0SUH}7cX6pzwPm@ZuhNr%Falf{fgW~11a-J_H;m}b6SgR6noCZ;Jv6a`&w0C1 zwErQ3*zay_k@%$=U_zwsyZuMJEpyVuF$+b(kAom>6n}Br4+5J%qdtoht%yIn4HJHi zItofLYqsL6y}-&BCKF7~rS?TTP*h`hN>AM8OkFVhda@9q0#!*}S&rKP(4Dl|Gr z*2criIfk2#$Y>^e%cmQ_4AE)u24A2-p^SH$c`N*3;PLJ#wwFN}L7X2W$<oUfvy?yb zbz-y150_sT9f?wsGs`QoDq4imD=IDlg?LQeSdsx1w9DT6U8O|6S2H&cz2J}vVruaF z3+<l%szErhE*uASO=a?F>cCba!L<@B)e%(muI;kMX2o|c^0Y3B-JS!V-ocT-HRE-O zpt4Px4QK*@cqADZPiiDq!H5+qK}PNypfMlzxb;&<<A;!8G&TZt0jD12*9iPZB?ilO ze&<>$ZB@Ric-cX){FulC_hPF+)0%rwC0Op4jK5vA>D&L{TY&UVynJMCG&ZOQO;TNu zVDc&eGWQU<@z9=n=C@hljMGEmqw829bvIVAXYZ#MOhVUwF~j}A5nbdzpq>KUULJ}x z9$G^D{2)PAYGbL%E(Wk-9BC3%afoMoM4~89ZDs$KXys(9iQwU+<Ah<^e<V!iM&rKU zL`<VlXGtg+_bHxRTHc9sB?)l0kd&`C`0EEjLYGR)5*@LqJ+cd@WTjxc2OSbPQZhW3 zbL6Ku4%I{$c(wbjrA`rBP2!K|tyyE>&F9ZocrA99h%IA!T9fX&hwxaF(n2&?TLjbb zmNMWeMM{=!oT#!1*0%@0Te=g~(p%ynO6sfa)m2gCa*ADp<cu+H?y0t62~AI5ALy=% z+N#p<iV-~VsNs1^)YT%{BB&l5LM-iZf1vYlbm4z_Iqkn5;UWELB)0S|yZy#1p){)( z)RyqnD*5C$SXjW`g}E&_WqR}nXvM>IB=Pdcb-fDTf4`EJeSYV8L}IuW;J$oLF7NXh zS9Kb7?Osh?iR}VxGt-l^IK&7H$-)^3YDC<}noE5YVifk#dL{BC_Y#YD@AZ62MfI}t z+1~6?)9#4J<CbPw;2T5x7S0h+4q#~fsGAY>N>_3#d|@*9Cx{PNakyTmdRdn=Rmxyu zJ0J07qfhQpIWK5jELrJ;YG;551{f9xUAf&^Ds}R`oZS6&;gAr$^l`dvmhN2&U8sa= zKVx1w$y<TfQA=MqP(RxS9VD}I=w1++iX$;B!@V_0^}E}G8jbcp_mWg%+bu?Ut|l3} z=s0h7swYZ4gJ#khU5`tC0PucLrkdF;RG(>3{7an*3{wVG1v9#6#)Ni7@;FP2yQm`4 zOghc?$2T_kWlpB~(f&PzFN5tnbK9pZp9{R(7-}p&t(`R2cMuz=z+>tmYsH>GniOV9 zx$jO=VIYa$Rg*}?%rwbStm_d<kK6S(y^kWA_ykIDpx+G6mzp_rgjt-1D07AN*!FGk z+j8=)Jlw?eWyW95Lg$uS=a<symT~QAft{I8$N|YIJ1Uvz-}9lzR*!S-*IJ~#iZN4p zKAE29!0T;Ux(rlE<~8vyrz{$WQJaSohdkgj8<H&zf+yUyR%j@|NC(tT7#mNj;A_7O zTBL8c(+57y2+_ug*LBO36#J~k$Oy0uEyp7r2B&pON}kVQg4nn74J((n^=U7q#XX(R zE<Y8fr7em&fq#f1#wGU37ouX>Kw1U=*J#627%)WF6)73k!~_J9>umu5tM@@B7r}B+ z9kIYeZ1o$`%S%o1$wYdx+I*z^i9c~`Lt{{mzng_QAiu!2566|A_JE4wKU}!1KscYA z#J89*@pxQo7_(GU*fYq(MK)EnUmU2`L-p>?_l)@K5yIyQ?{SEN@9rW{HKUXt2*`Rm zZSbfe!1I-hi<_rAfwf&>uo{sY0^(XDq9dLk0}`+U3fTN!+mub)s*=+0TZ^yA^0~^o ziDqcsuCI9hNzeE0@&}|R6sDl>?N~JGkfCJtO<tE!1s6ILK%S_Z4EH4jnyRFvq<l6* z3geMc2f+EPf|j1e{w{|$WHJ(nPcBoiu#2JG7Iv)u1}^-p9HL{4=T2o2?hG@tY<r5# z0Gy6{q1K$Uofw__>U3oRumrU)LdpOz!Bj@jTpQW4Tn3k5*AUQM!I3f8viFsdTS`P- z4<Igv;*{<Y?*|V-n#iuc^HwD(0V%)L-vpBU_mck36UAWvnd9ew&u+w?Y<X>g7_-Nv z%WU^nXJRN5E&1}v6Aq3s^IB{kM~Aze^J4M7lepJqbf)KSir9*bkIRU_t9L>aRdmX9 z`Jz7VEau@y<JQ(qI+VE)gVj)=jv1XS36tv=^888YOm0Fo51W3PwZpiAU3C9>N#y0e zW>bZX^H?#yLZ>x>5?QbnB)twBB1jpp1vVC#!lIxSz?QZ<8TA=sz@#uOjx&uu3v#}( zFYP|$Ic;M1OOD0S=g}mpEEZqscPN_df7Mobwqdj4<*%mE_ICl?ka4>J_CU9aJ_6)X z_6Qov3vPwV+1Y1JtQFHiWgopRq90f_5_7&>V`<2gy4^ukNMH4b*z6znbBn8TzKnmu z_1;}>RkTI2I3*l`6yoXmA`-*31hlpZgbBue&V`GS5?KkzsfQ(xbe|p^c3X$cc7q$x zx8EmLydDU9C}hjpK3=0rqZz)cOnrRYkVA(t&;`5762Pej8L>?O?;d`bKEN+J?s{y- z4=<&Nc@o_0>utLkaXRZ8K2@o{k8*dUL6v+!IDR|JwM9<@H7p7K(%jH}jmaZxk$ms| zt)<&1&1?U=Or){zao;eV?23Nc(d+a!T-l}Xf6o;!res3HlAe+ZApu9_6k01;!eL%E zsZ&=zq{`10G+qL8sh^WW*aiX>*qAg)I4OC6vEtNKp^79Vol8763D~Phf=c>7dUwm) z#OgRKvNnt0Tuzey;xTdpTssB(m{4s-=9bQVLV91To1zZyy`b5Zl`+96qBnVj+g(8y zE2uZ%FrhaY<CHZfD#f98QX_Om<!f+eZ4z@Gmpw(YGCm>~00d`UW6Zv}OS7Z&>7IMs z7sqK=Y-|Y8wc_Y);xGS|Q?Z*4y!P9-)+2<nvk37pRRHze1mM4L9aM!lXrSBT6<dH2 z`Ig)g3ui9mjfCDF5%oQPkAKolwdA!>=8qw~SF7s(!YU4At}VkQC2s$|?UFJ37L8e& zdax!hvm4gY&UOhuBQ0vcaWxlq*SFtP=^|K%nGC)P>J&8*r(??2kLE@lUj4h7NPqZU z>hF1Mq9^ldySM_4xJ(5I=g%K`)98(;C=3pzzQubR{t7Dw4C&pe(Yqn-1XzoIV;~a> zm`eeOGbK=b{+_o_2F3w*rCjqPtS%hCo6S(LMfrhOXF_oPb-nZMb2GnI+=8v)^Vrxc z`TbTwx2URrjZ6-u%g_ffx;K)=7dL%`lE#!GwtjL|W4l|u)fnQ6C)b>D-x`yu77m5b z9B6+HoIfH$P)D=d&1I+$z2pvYdf3G+Vz^6s2x)P8hJg><<h*puD&q`R4k?`jD21}A z8axBR2VV<2`I)>PU${ErsUTwa?;peHC~r?HG9}MYMJu1yp}w{DufOY(Sn%w>(3zn1 zFvoMYITl|&`ikc~A%{<D9o`QLhsc@B#!O~^%-7F`ylq&F@P0=3*}{I>!>M(T*5jSW zMpppvZ03`AC~Y3lOKpt#tpd<}!M%QN%XN@0!-W!1S?amhcgP@pHB7+Zkiq}b>r6mC zESEFvV|#LQM^)Wr*ZZ<aLD;90D4DzQ5CWr!ryuwX3-)oN9=D5Q7$1vNrs5B#t>-dm ze{>iIcesKI>Bd2R0j4zz<rtd;NVsO2%+Wm-ZzUB6Q3&u=`UN^tuUuZWI9_}BU-!2x z&MhsB6|<K^e_D?fe-CEC)Hh}=B~q01t#vU4=?x4Jn*<NR$Q;(CD*>YdC3lVpl}97e z-!&iiE391J_7GzP(2Vf98c}XteF<+;2g9dzA=D*i=1-$2xAa+mfO?8IdT26z31l$J zMN?d#pg-4dj64VmCu>>P(1j^uIAw(qq>*;<X*99329cwv9-vrbbHlt{6<111OX;QS zpJ_q=(J@}|OmqnvP4W1)x?tkn<khawA2M1b_qW)Y8#)4{)jNI?+}tC27t*hTqvO4- zFqbHLP!LF4lT(T^CQza4MHdr{0MCQ37XF)&Z*&wI(*z56yvJ3*+;2f!s;2?*64p*w zgDEvj3fI_Sgz9~ANC!Fa2QUMMwif-f<IGg19{ssFjCx7HOsm1#W9Dhn6TF!t9%~&Q zO1d7)H%vw7t6Ie0&sLgtU5sul79Myo(|089ozI{7U9`_h%F;1jQaCBJi|s#blJCa% zla37BuVCf1IiHO@0x%QXf@gn5+FQzC{Rh9{76@_2i|8L05Yu%U6X`al8!yuY+;QIh ziW<Dk5V)2RH)cW|^BN7ETRT|ZW$di^Tq;Hb79=52_nJHOO;i5D_{(thtpn@KS8|S+ zG1X)Ou~`2epFK!eIPf!b9F|Bj!H^~niv9QZ=BqW~?M%<Je|Z{@@8hLCZe|^`jGw2l z!fT3gt5&sDNP#hiJd~?n^xd1aPe=QCMj1i)@W?bbH6zd;WM5YobCb?K-UsBfFN3QA zW55l+b5=!~43O+}q#Qogx3hdh5mes92rCbnVDT)O@SyC`$X8Hhn`6ZJmSejZ+BJE; zI?9DwLc(Rj4vrFbVIY7qufx9vK<&duIRk_f)}B5IuKv+HcDgCo=$L&<GyfrTTbJ?M zvGLNT=G$pb1wLL%A&KS9#H=>&>#Ny^JSS=AjjS8YbDN)=OYw{xo9;wD{*hroAh{LW z;nByZhL67!Q>sK-s9m0CymV?h-|@d#-{LpDUp<?Zv0YI5#M7_KBQH2=edJhpV*3@% z0$?QJs=|B?$Ye!UB~lk#N2)U3r277v{b-Dz%V$LFSlU}Jz{Pz?6k=RXNRxWntyWO7 zC9Cv<nN$GV{jpKh>6fJCESZ~sv`(#Fjy1f0FH7_zt4Ri!eoL)nZeK}#!L@P6h!SqP zK1rX=xSmHW{?a5Oc#>iZi+EP>x3hTcsxK($w7BVHp>KBl_SVQ_>FUr&Gz$Am7e!-& zZAqNYnv|i*fO(XD0%>F@Hn{5&srJ@olfQM>hJQUNTIS+tcWgnZFVPr^wh+6lEh{%4 zwq750uA{Ub9=9A<3IH*YlE{wo9k3POn8Q-1&D_kf{b#cN`dlnK@9b$|qM^^;^sOdN zYzq`IPTT4RZFi2w;;FPACdL~pdmaRRm+?M0v{{krm=Eoz_+X=4h7)A_)5~F=MYAxK zODD6XuGm0ryAC<U3$fAh41UrYR99(fUAaj)mO*Ddj~;T6xb%=8koGX%dN6i$_c0aH z>uAM7-Z&}dq*Z|y(7T;hzkDbIse!EH0iBALy{kXjWJAM3u@p^+WtmycndI?%hs|HP zAYreilr80vN}g8MGhZ`-oTzyq`04hW-nGd@W^*REj)FR4?3!|Dr*=c#D_bNlhCVer zzTtxj_+q4TLpz=`oqRm~&a-7rVX1hLvk`EKx8@5+jz^?rkKQ13c{YgDc&a3OAIoA} zS_w08e4NWWB!EHH3$gZxeZi98b`F}Iccq79C{~oeypIw_x%kV;$N%pG*{$xo<z^sy zO<jFm5#aHYlNlKqb8a90zdYTSY-HVABM0S7!AJcBl9IZD_=LlNKhS!d7;5oQHZc?s z?PoNJf&@I<3gOT(cTe_8dd*edIk3&RV3CCazzoEa+1DM7BMUwg9YHzulN)d5&`XK0 zcv{F>lg6}OYEj{)y|giT8av#ni3HK4Gh#6#E8kF+GL;r7&U1;xP5A;<%V@S*PE7zH z5b$7h)0q|FDmG%`9-wFuC1@w88To6$|L?ybo2;8<VkgOeMW4=&a2*W|_)Ak}$<_g9 z?1cF-Ymiqt!GU8soGF85j4#1zSpI7)VhM-;I5gTV`>q!*FSp2B@WUrxkhRcKkLJMH zg&Qp80|vR8Qw)mU@^lW)2$W$PY0TT89z8{^mRG6`-u~f*FxJ2d&klYBfal3aHI+EA zh%ADE*}v&NN;EHy%pTZ3a&?Q@KEV2D&;&R0U>62+w-Tm)rnAkEd{O<oRs{0VZ(%eD zEGsM0rdh;e7Rri4Ng1-`bx4ZO-Y7wp7rEh3bDDL3dv^T%bX=_c_DbgWzL+VMGb0=; zK{op*I;Ohrk)WbAR(bN^4@@z9pZ$_srs3X)xJ>4LD&Y8Gy<m1lQja2}j821gB-KKf zG^8-4H0F&$SfW>aDgjd}W7l)?oF}TMnzL?z??i01W6!Kj+irTZt`l3zxnlp0+tF9x zP{M$PbzR0%1csjSg4lfGcJerUG|Th-{(nZqR+_|R{2fO=!XhZvhe?_74r@1MzXr0O zHibdQ{VLPm5O9rt=q#O~mI5aXrWa?vZle1V5o_>nYK)s|zu{r$?BN90$p2o<$?I|} zPb_MLlrxct0xVwH5?Kb{>Qwl8psWZj!!`|Bam9V$YFIg&8~KHi+0P)HvPN1(^(9*C zFo-1if1^qX0cx93F}bMHZ}im&R~It^0f2F0PWX3t!$|}Oagyo%(wJ$}MKf(kC;&RC zl^_TJ*ouGlVIKaBu^D6kcxKnV|H|*`(@p6>md`PYphcv?AUQ&|R|_6Buco6QVW2`V zc3`mB<f&eqF};gH6Yp2F;W#iC&u;^a$J*FND$_FtnVWjZx29S~JbVCF?5?oE$D4CT z@~Nq&Rn4v4?=lzad4~g1iEvN}2?m;wAAD&x!MNrD!cvXAXYD*VNUZKv2z}${<>z%1 zSuiY7oIWHB!PEBW6dq^s`}11moBU~^@Vfoa`V-M*z5Am5fJYbd<N}ajlztvX?}6@5 zO+}!KdKjScfPGP|>&XX@hF|Ez(d4Y(d3Tx-!H<)@s@L*)U*l&|d086J_=6%<5($Q? zP>2e^YkB&l>Er{CgH_7VJazWe=F-j_kKz6h2@6;@k59h9Oc9==L>t>Jf)E{Y{H)Ho zWOPnT(u%MP<ONTfyhd;|wRfYb+n%7?W+SS4l0qaTcJL{>mVYWK@-(c&_ShbE1G!Xr zgkb?!OA-3H>|^hUa8iwuhQYFcV+8WQA}okQSg12S{Tp|6Bphlj<|2k$wfK8>`XO@n zzKB8T(iEG9md>Y=TOF(OH<t)?R)2N*fY7T<pnIjM#GjltrJ%d&{N(9Z!d&rBn!1g~ zQ$~m2chI5EO(+bth74n-UYdSPsy3a>RG_S-YgHqD(KfL1>1cY^|2V?qb{PW`xYw^+ ztPL6Ns-zo5=#)@aeY9nEYZRZ$SR=V}{Cxy&yq;*@&M~UEn&@~Kp<3}`Qj4M!_q6qC z*H@!@VeplkB|m{OqU=<hIwYW|k8U2mm1;8f#d}->A`rsokUZCgL*$I&_!zH-1Kgy6 z3P>z+@JlZxX-z1ptNuil#`oOpF;u>blgpOoM212Nd$IIHLA0X)s}N+%8PFhUB0ixO zTZ{-C$DHr=e~5Yuzo^=9ZF^=IdPKUrk?xj|QjqR$lpH`pa)w4)x>KaP5$SGeq+4PD zNy&G<-+uP~{)U;g)_q^sc^=1y5Xo2k=D1y$1<rfNwb8>X5@+U|w8m*C58tJHp6t|q zo{<D>Ustbqta1)UwZiuUyvK|Q`wE<TTj!Fxw3BoI?9zMI<Ky{aS5xP{E@Dr;-zOfB z@aA=io19-~U2q1Yi_ljJiM5#Hzi0Qf32jK7TN+)}tD@1Jj7||*>=KkY(NV=F`IlWM z3lD4is;hp466=(Q6Puf5-HVIkvxdarNGw)staa2Tm{Sj-cVO&b&hvpDcZXLKnTk<R z#ao?F{T@-)Udls&03CaD1nzK_%8ThaCH~ArG16CueTOjo#$)Z0LB`$`R)z=m=SO5v z&t{wA<=XSv`@vX3iQL~}$3us&W;e>NEG?LOyY;`|f9N37c#jeO(eJS7{EhI+)dBlc z$Do<--^SE9nodvQfAlu7@}iV%4Ud9u<k5Pokhe0!Vqz4oFx4`3m)w;8i5G*4NQUq4 zH(tj6+jH#bWNSrl$<jAdGXJcQ@+w%#u;SO8q=_eK5KJ6z#b7_>K0m}XPmE9It~w>+ z766NI({}r8hlaI|T3xk%=}IyP<7nxSE;E;lX(wc2oHqPL*sq=Vg7;ur+{&76!mKM~ z3J9oC6%Mxx;O<ZV>6hq})zQUixNliDo>Cg=L|-@F&@l2=!VJa@>4M;FfGD%bz*dU1 zI6=5fINl=p_DMZ?yC9jQ2&K^i>N?`t1Ir6@gH`Vn_<fc5neR=7JZ$rq5m!Vjnlgtq zp#wTRGX9H*p7lV3dD6p$@Wu04)PAntW8n<HfQ3%jkq+rjC0XOJrrY>X%>HqP62FQG z(YzvgUZQ-I7xnn`Sf7!W$Sg`LcC<N~&R=!|2?ee^^R<iMp|<BQZ+`d!HacW9S(xf< zZ~&r|tDG1}ss!BA%M?u<@=THU+~|1!WaZUHKai7E@TOv2`6xi+f5LmYytjj0f3Jl_ zDtuWGxiNu5r-s+~;0=U@t%B`pBwhO}BptX6sP4s+2lb3+r6|q7)o$-)isy;{qWODu z)gV5Y!ivnav%~$V^ZuLyc{c2BrfEIB`RV;4IW0SvhCIACn4Y0g*RG6G-dYYl^Q#t+ zaDuKK{De4hxLJ8ZuCZ@61FyEtem+eji<diBiY~vG8cvjroQ&Le^j{EF?hRPJ&6sY= z$uite8kXT9<~6)4!0KI@lZLwU0Y!hbTYTT}?_`Fekxr=@2_>AS*INFGVOZT+Ux@^U zd-zh?Nq=+!DXs`p_`82p=lA4CbA1xb6SeayVX$j(%FNU)@nA+TPssdQhmNL&t-Oq7 zA;9(0neta-<3Gg2JYv4{D)-@dA6fV-H~aBSVJ7Brm9|!n=MnHh8%LH=AJ**g?gG`l z8(&e?K~tu-x5fDdyBV^+`>6PQP>OuRUsCKhuNfP4j(lqQ{IP5RT}a3>x_;R>R<E2P zb?N$n<FhZc(0ICd<@0@aB1_<Dj<1wgVKkLauw@HQRk3(#*;`Zv^EAy|`FFp>48wWJ zHyWKDc6RyWIv>~2f7e^19+GQ^>FdZ3tCqf>2dy=mh<?xFPvDP0g$nEGy_p!o-0LV* zF@Je%%Y{%0qU|VGkzrR1yt-bpTYsWC?Rd&qzkdieYq5o#^^;rhN{MjjDJ0@;q)0Y@ z6L06K-es;A)G?rBJ=o#=G?|}icHcAp+<lYFlO*`UzMS}d0wL;X3vSLS){21}QgV%* zjh>6+XWQm+RQeZAQT1=dX<^O%<POXV>n|X~8L>_`2MUp54y_pKj7Y~=$}D;w15VBQ z)N;L_2i1Puc8A&~7|_ZKTH-8!`2K0wV|*_Mzd^>?f^3<Our;)O4>EdXna{>hUVcZd zHwCe6@N2bdwwbGfhO-s^PKIypsh(A-brHP)+_NaWJg}F&QTs<upnm11PoJ0gpnwh! z2{kE7P2@|EgPQZ>>JKq_vr6<4VtsM7d7Roq%zk%j)$NBR*(T=Ghzfl0GUaw`9vau7 zC=a|7?);mK{xXI#)GC6|xF6G;v>uKJWG;`|7_h)uMlBA){?g37f!^tNe)W>8<KNo+ zL{L<V#$8EkUeunYMvMKCQ`3qp!ADQ0c!Cx4cM7(jhr2EK1T{VRb>0Ns{Sp{7SB1Fo zNFQ|HT18GY!}8WBs_^i9*GI0bm~o|{*bS5ft^e0qPw)1sGW?fnc7O2qc=hAtu;rv| zc*J$dKVP(*kV&kR2Nl?#FKzQx4RnX8PxB{9I;lxo7q79tM7$Mk#j2yX27hCnfDfe; zZ_5DA9fhpeY`h&aW)R<2Z=R1>0-i3#1OMbc%~h}RtvJ>ApZ_|)D%%>tZ6UcR>rRJ2 zTX2FKt}ONZoqpW0tb5FHHb0fF2VM>j=G;Or3U8QwYABOG8qcOUI2ocYYG_aC%ASQq z*jv~-i@CzpKUzDkVFqHZ?q$){m@X-IAjr}5411>A&rhaJQ|0V#Y)sQpa8490U}R#r z!Bg)+z|h*LDCGqv5do2*r488UeMEkltu318PV}t(M7kRvvq*b_kvcOU8i5gp3PS96 zy5NPp#sKN4rC-GFH<O)#PyNpaic*2sW$Vua$bYuWm9(Hl<=(|=<Ex7Px(c*!=%jhl z*kf=yEQL$YLJovUe}47qr+rSApEtexNGDXe>YrP|@2uMUTux0NU2iw=3eQ6;(FDXB z41HF^vR@+F5NBS<?ALv)b5=#op)~eo4%cp;{%D3QEvns~?({2`?&vApoY!$?KRox+ z<0d+5b#lvzEKvJ-Fi1wg=eoaj1#R>&<m!P#t@0CGJAFTspx&xEd~R-Ys_KX7Z0~Gg zNx|{btTi%k_Zq}r*D>c%`#*1CpFVc4F3>z9C7P>VCp%EVpWrc~+RDM2gpf5?UIrx$ z{Ji14akR~e-fgWx9x}<Ziv_NSzgJOq``GMg)B}iosERDpP)y-<h9KrY1tOf6TOBM_ zpKtGakvW|MnXLmsI|4#^GO9G8sHXJlYSpZ~v*q!q^FP`0t(vo44kTxVb`!6kM%rC+ zmsWC`*bC?4vm-(a$;Pr~SLQN{in9`pluJV!q3&uq1PKgwX%pYut1zoF@FU|XS~IRP z(vfUO|35MnwjG-<SInJxKx4_2wC=|rb;&;U|BAkg9A5i7bM2fB$DdFgeIz~qdZWe+ zPoo1_)_CI<OEc4}<WH&Zs{8QDQPTD)V^dH`yeqm`QvGvM8#6aF{?IENTdks3ez%tC z@<6bD`?pf@m7BotRH1pjc!!{1`Ya1D0~CxWuV+4Z;`nzJmkTHr_;J7UzEE-f;e+^Z z=?|3|DnSal9}V_D<hX6G>8lQ<3$!;54ZnX|-|pElV_H^wb#C*{dA3mp&5g+l^nf+R z=YRI>nVQ3tVionw&{A>IKiKT+fGX0a!`kgjrQa+ePiq;!_!{NE2x~BOS!>Y8EEbq8 znthW)lnY1B)|)vd?~Uk<F)dFE@24~U#FGGKK`O(^#=sUf4<;VbXbdQ`QXUt#Zm3+E ziA0R9ZqjbgHD%7{6D7gdTPcSEzIVay+z(dI^T<BcdG)^w>ek(^0o`AMDViFX09FwV ztYc8{(YGi&VH|4epvf`ru{q~l%Abg+-1|htFR9z$<~6D8_1FIATM|UOUm$ubB~Ijk zyrS3P=*$dn@sq~2ICF+AW*?6g`pC@jTY@ECl~ZsxMv$THb#Z{1iBH!Lr=I`HAZ}ye zRR4Atvq#U7%-4axUlTo+I}pBLJ$L#N13iOM^_vDQhOV|q&k1|By;<&unE2$7?BO&` zt<>NzD7zI=P0kc_L7$<y(Ku_GVGoz+b~*nRo{loBOr9TIR-R+f<7m<xXS<4xri(Fu zVBsB*v;0ch?!rOMu<+41D!2KxTDut>IMLhbZGTg{zuwN%S#!4O9i$+KcJk?dWjVe? zQfg7mYjAE?7<so2UZ4@>Xux?Rnb}Ml%M3U~g-DRb(0_|w>DpuTV72XH+Hj0fMDp)$ zDQI3lU$>fYZ{O8+kG!kgae5`8<?LqUpy^2*FVfpkW#pwep)Sv8XK-B;R`H?!J6H#u z7FJ{D3QwesK$nJ0(2_Z2tt?AKWo?hlA&;SJtA1C%s+}d;u37vypBxr$2Vhq+bF3w$ z;Z^ZzqyrH^m4wK!sifwfmCgXS$GdIxQxU;{yVa9@sYO4R3t237i<Xplw|9r{^X{ax zsB#va^xiv5ww+&zt7b)fCeo@M$QU!GlZyu;r~lpNOepR*t(qwb^oQ^KjvJo;?%w43 zoQ##z9Oq<bkd$wuSh*BeT?oxt$B+r6e^WUedRLWXq`#H4kv%5qpi0Z4<K{xlzXSFl zX0dkvX7huvdox>~?cA+#ZaM%E|HpKMJ7L=9g4eB0C8dxZ#V)ncD)2W0fQZ)Q{`i<? z{VNK!So>s;K^F*f<3nF4zx$L(jmV{l950gC7hx_SceH&t1kWGmnonKh3NoqR^2*Y` zzj&IhUUQuTHmkIg;HWC-b7!2m+X#k$X*00X-j*CG+G6Y*I$@_1-FCZ^JZI)gUW}w0 zP%*o06ieJlcsaGab8>Y1U=&1dUmrc&X7dZ8T+|w+#ps^ale#0d6)XD=gNNmhF1yN4 zMG5V&8EW~9xNk1ScwK~3sTZE2nYQT*&I)@#6AJXOx9gL)oo?gPk8c0f)83eiP{4uw zS|Z}`O_fn;uCT&jamqly^WhNqIs}FJj`O8ec>CAVcF_iQ2K}oq4XOlPL!`%$k~ZE* z8B+X60pam)e~hCvD5<{A^%_R+RpyVEgzX|<*Bno0=c&1$uS=y)Z#o}X0#6XOdo1*! zAPgSGf;H1YjLxd3BcJ>My%!5{(uQZ0O||sGkFCP5AH@PL%lD}RcY|-5_dGfdT|-;k z>}q650Wx&{52*~^B(wI1wvJf#N}>A0b3V59+=EsSH)c2wzj%6WjabM~k__zEnnY#d z8&K*E*c$BZG9w2Gu6Gv}_K0ucjRtsVF$CG@g@IJ$^7qZihVsZv2vhfnopIb4SX>#P zw9JB)oXQY-Z6cj$S-D{>YzHH8EvTV^)RvInU3T2-hsnUZ`tLZ8Wb1cZ9^qdcSSUx` za;D}_^wY`#6Dde?DM@OwevEa^keExRQTT3YII~wy%VX!=pV3MGTZFgG3z>;5|NWi( z!jDG}bL9_L_lVoSPKs5p{86LmmX|)c+x&<v%la;VT|kNrQ^uqlK$Ae{me$(v?@x4b zl6qcCM*{QTaV>0*oXgbCH{~yZm3hgcGqdZbtl$4lqT0%vHFP!-Hf)QvQ<v5pbo-S> zDEc{5(vF$MmY^=l1cR<EgBjg*=K#NXa=e>>+@;S#yF9b+blff#N$z><yj}BOpne?T zL<%M6cI>;CYutjF6(fau4RLp6Hi<0odqfs>-S<-dcFhUvHs_QC+>P{`{q(u3jG9@x zl#SnnYEv3g<cPU#?D({JQZ-Zem%{Kb5+?icS)sfDdbgYjI}6e`25i>Kzfn^udr&tj zvAu5|9?(0zpT4Vg2#xOUOqDhUA4Tnq7jXS{e4m*K;di^Pm~T)L<w<zOQQK66rMB}< zedc(lh<xM34^5}5{mdokN-SNn=OrYC3V{}1-^$$#1mi+3DXw|f-s%U8?xeM|iCcVJ z?IrA*&=y0b_wpo8%R8#X12KBDb^{69ZDA2qFgdI@ufi};2vPd*WfTf6fBFZ^o07)0 zDrF{Go}ZZr2i`~ByoQdJsGCnyQewPE6YF4<H;7dnQU`xai;TE;y&pTjv(<7+Iz?<r zJ<{af_70jU2M6~bHr9_TXvo6Nfdi%QKen47sRkND{F>NWd^TE07FEs4dzGrZXe{?; z89bpzM{B5-Ta6;0$2E>Wg1h_KJGS@EIR@f?ww3&apN~ng6UbwQCLR<Vc^wt`Kf`WF z?6V9)l0OGkGV8k7(0}#8;0^c7`^tmz$>aH6oqTeED^=Q-x)%W6+V04XnI^2@M1BHr z-x$!~=tOzLBwDYhd(LlDg_=Z=XzmWP_o4H)`$A3f9+B$u`by9L1hKnb3zw6@;VrR+ zj0E$T!&eNuNs}s2g*XGx2cY{gUXmB{oa^_yM{z$t?Oh^t3+CidzL`rvLBPG~o}sbi zMScdB1zqj@VNqG5x*g}8iJa7+mmt2`G!!jb%qnvsPZm;{2#DU#`&Q5=gBNcbk}$14 z9)i1u`&J_&luC`{VPhP)?cyB0q^cZHejS}q9**|Xwsc=?VFu|)edA%ae}nRY_P=Lm zkyI62kFB9!3^6aO63-?OLh33wD|HSRG*a%@)8C(Zx!3$>yl7hQ^E1QsbV&Oxfe{Nc zdt>he%PcF7w7D~;%{u_q_*?-3+={*EaoZVEH}hsc0w0kA=lbegao-bQyU*Fg0<tMU z;w<5TODbeUv6Rkt*gpczQ{rSCv<I$%NH-#8q*0d8RE53W-Oqc%Npb>^J1H6`%SVw9 zUq5U6=xB)2nmY?+*RjOce`OYS+8pw@E|$TVZ8pFW5@HH%PsGSH60-hQgu`Hq1$C3N z2)ENH;jb6L)FD(nIzn?aO_QxKmcnD79G?&Uao>@;7I^$`0U;4^KykDBH1$3lhrb~Y zQymQoV;HmWcxScq<wAycbRUgUF?fywA$fM?`|{x-xxUl;&!g9b6V8|JIrj1!nm8}Y z<noap6XWDv00CNT)~^1T2x|!gCw+>uCM&IQ@z@!`oX-yDmq#>@m&2(J>@_~)N?{ov z12*y5lY4UTZNR~HUdmZSq7KgOhck_#Oq!u~En+qw=xrwrR(|&f2^3<RF?fo2(5D2n zozgPYuied8wy(EOf{s%Qt5dPeJdNL`_fg+keWCzh1edVfgey_g;&}29v}3|Cc!RJ* zK*mAagNi`Bmlc$_@34r%Bc$;;BfhOFvj~s;f~~%Ed0l(W61dHdtkxf!V*=m7Ip4YE zRc_*00Mt{aloDVKDwJw9*dy%}yHby4KOdq7bK<sx9TZQ0)|6kRRN%z9xH$Lnxvds` zmRwipFe3g;I_hHwM0Ic*bv!JyCM!lD$FwnkUN?h-y*}yY^HFD5ExX5Czz*%{YUDF% zZ;DYCJBTKt%9}`_1zUV$1+}s(jrNDx`~O0pFC_<mcSAKf2tJqIQ=)`TijX3s`E>4S zGUH=;OGu+GV$g7;3aS|B0Fd_e(X+L+3g>+bVAN)i`B3-W2M*7}Ez0)0!&gY2=Z_0= z`yp9x5Ve<uO#bdoKK@-Tx6S|FTUd@v#9|a-dq)A15`5*IgI#&c^C|RwciNDmQs?J~ z@@D_%T0NS;^WfGOU-jO$2<nxNSu%TgGW^XON_WG4Ut9^5CY~Eozo~jc$j3nVNKPry z-$tz5xA216?}<)*AF0h!KiM6Y`Q4~Np{1t;;3^!~U#}5kL<g6tFwr33;%|U-{xWaP zs+;WsB1$DaBs(<vuo#$_WP>X-mqgHC2jSiCzwCi%4w(<R{t%xW0*NN^KApSMbo|{z zzcCHGMH>9>&Q8MPVrjKslwYyg;#sIWh43BD$`K_~iikL7dU{zL1t0z_k1F`_r+2jp z^7KtB{N)?PA-s!PKz2qDgM{W@U(O;wD^RcoFadDixCE*F^g-xxcb@NsQf=c6=n*CM zwh~oN&nhhANW?q5i`gZ%RC?#sR002Ht`WIxi_hFe+AyXrD3VytJ~lkYiOv!vE86Z> zy**^hV~K5S2tjQo5w2t%=q=b>bo^d?u3l+fziGW#5D?&gbE%dac-T>nw5RU<j@#nl z0dEa9qd<wmzw!T~WTt#GT;o&!qCdvs<d#zrDW*;^>u8*@meefz9XIqIh02P~v~ZYp zAP;{|8VGnFEWH6EKev<}*C+Hok$4I>>$sV*TNmj_{s1L)?fSB^6W_r1y?EYpvnnLI zBIBzaQ+OIt$n323NXn{V$yb&jph6YZbguNg&=f?El)$UZgN3i_5lc~t<Ie}cYm>)q z;SESv7p+w|-r_KZ%1)mu$P*pDyWK0nqZE;qW{iws!%_1OC;+9fxXEu&3wD$c1A6Rw z?;XN#oTAk(XAfJMgD+n^M@v16uRrwYgwqd+AHA28(d>e&W8twLBPPC_hk-CZV1Ptw zU^#kE_fNYte(G_bt}^CF8yr%w?LXf4{2BJ<GaLI<d-4HmxI|*Nf5MTOTvSxsVt9Nr zvM!z7i)3aM#)LZ5b}RKAGO7+Qa1Zemyv`B3rP!hIybDx9fjw`N0~kJaMDt&{#g69k zhFwm0ARun*zU;1mhECvr@hsxB^q>%2){xbYFY>A!lFLf93{sqmJ7mXKtD(!aYh(mG zM>Nt1@TZh#Juz&&r-doW13o7jy@RTnLBY;r^~<--G@z>*1kUM{niGb}Tr8L;IDNV) zNXF&w8?=Rv&q8-2((R3~c0AEuu}~g#;0Dy)hM%X^_RR;0pw*xrezz#0yy%Fa&u{4W z@?G)Crl8tU99e5-4d^dF{k$g52GMRb3}wiru>x>(NC9yEmT#_*iBef!b1`rBRo7L{ zQ?s^RWOdw~`{(EDZ1*S)57vvFEze(I?KkS<DD*leW2<gt7Ezx&JZed`og+EwnfR?n zCA)QOY&<%K$)n1g_T%%)Lgl=e=-q=8#mTyG0cBWx%LF08?IV%t_rnKu9<+<Uc(pCC z_|h`TqVv1Wm**2uzqo}Ie;ng*Fyia&UQ5=%IwgfLqS<L`Ii!o!@VMD~HI4FNMH%vq zibC+P&H%=rNoRGloje0CfBmsD^Sw#YQv7+59NzhPo!lZBcTSmw4Wo4j#0ruYb*m>9 z$)_92?=8QwAccZopULe+7gQIG(e*Y6Mja($hC7L%2to&zIk`+1`zMiZh2zm`=SdwK z^Zs+o8X-ebfov{TJR64Qq|B^YcWmXIvM5JUBZr~Zx%u%t=02RGxdqD24kAor3q)D# zM^QT^fU!G{OvCUpc^a(@NMoWHTkj=Zd~4%GL~TVhnSz0T&LLscwE6C%=MzGCKj5l+ zA_g5T@TB>)rLB*S765cAMPr%5Kn#JRY@jj@%N1X!<Xq=G*yp{lqwtzAIWbr*>C?&O z;^C`o^8?V0OQB^<E;3UeY$>0+IYqP2r(-Kx#@pvpxC!R(zbdp=zA@4gCvi&jZK^19 z9yoMf5@@$A+DX|M$XPWM4y7=!jc=<eRC1>HpsZe`4S6-EGOA)`2C_z^SGfEIPMvZ+ z-az`Yd<LRW`s8St85{L+4BeF?cA*I>ks5M#=)ob<)??-h5%CxpUtT38;wmn&+VPMW zC!3;q!~lc&<OF2)b;<^RnF^aeZs~R2CL_yZ_9)---Lz-5E=gJ62~^_m;)c8(*<?hq zjR+!EH^&j_89nuDVMyep4#th<WLp+0Q(L_J)mrktX5bUTw0zF?OGQ?e`;Fc2HuBHR z?w%f_qpQ3G8j~>IuJpF1ca%_R9~5?Exw*p02q32(8uHT_2mY6mjj2Ze-5x?OZMwCU zI~ncqdzD}1X{?&4w-`pATBy{PmRO8hfJNXIT@3(7n4b<wl0iNdPSK+UXY(qJqXmFP z%F@+l!1DjdiV4$##5E^4OdJVNUugo~+A$10moucSk?+O*dk6+RQw6*PV5mC(Y`8l3 zfW+{Vu2`&6!(PmLiEOFgOnjK0vzHzY;lnHN0F%7H7^tOXNSum6VI!{8V+*5H2SKoC zuX7xXE7WyMg5Tuo4Zv`*AV757sW9hmvoNbc=xVP20)I8)DX!D|JTg^n;iHfFmHyxE zc}E$YhJS?8#$>+s`@fB#rsA&lUKjKY9?C_aaYmIYuqOe|^c-z8E^B$@n-EBc?*X6L zQc5<t?`b$X%1{KjhCPQ-_3<Bd=)3kBp0q@6hYvy<BTddrb_JpQ>EafmI@WfUEc_7> z6bY;xxC!x5jVfdLQ)w1CtGEmiY-ls~7HiBo<DSjyi%6ctU9H{1(_bmq)APnn#sVNI zDIqlPqn9EoOcxjIJcKDG&DJGHkkkcXW)Y&d19hRJeQ&m9E1(LQLBkfA>_?`eHmlc6 z`~<GTaCF0UMRAS>NZzadW>d#3k)axH@o>&I47z4hTpGIJQmr<#Q)E$re?~VB)AAx? z>m6RjfL&52L%jHE*qGw$<mb7bCn6Xa+QME{FjBxOZJOLFehlHJA9g;NJsn~TQ~K}B zJE+F;sJMR5iR~)X7emJ5gJnWfYtS-YRk6QA1Ha3+Q$~j+7g+E(kyPI0(Nk@|p#?<g zNCcuGosc)FY7#fy{n@%<<Y;@}K3qB`C1r{gHGQD4cW|bdk;^Vv&`dSJ883R5VPGW0 zVBPZ7#_L2_dvAvfv4bWY)IBcYe#*A)RW<6oz6eM3KAYsd{@2JKN(XEgy}5qPG25?G z3k!A!17&Efvw2{s^zrzV;SLT_V*3j2&aArf1_Sy9thP~98A-kHkOr$6?BFyP$yV3j zf`iXHE`CpaGNRgapfOw*RIs|Pfxw=1uZ%#FyVG<NFAit}4Xv&lx$mKUv*hC_`IU{* zIkF+yTB&hI7g>2uV|Ev|Vr5|ewsY9AA7|T=!QR@slw3-;(?NnS9t^QwR5l9tZ=3kZ z#~${4d(u1nBhKd_FhC~GCXXpScqLLkB9x4>$1Lz}tJC|q>;HC`cs%);M6Qr-%V>31 z#doDuzvVOO6>`gNhpBSW9&6P-OxO$o7?KYo1gA86o}sQ&n&^;5rZ)pCHCg0k<YFya zH>)u!v+uLh+^yO5b@*yg!KA_1`}n3^g|B>ZDw5JgKk48H(NcV-KbHGlmOR=+R*dVQ zOV11irpvo|>dk{I`~CS?6(uM!X<D4zW=ba|pAIK(Xng;b>Y16$3Q$(0_Fjn*M)lKk zdMYtiReFyYU9={>sh4e#$EjgV*-%(ZBPJ|Nbi?3+cO8Q*P6wW-H^6$rB5b%yn<@tk z`M%uw0Za&0b7MOEynxq=Jf|NQZB5)~&e36N6Q{FdNeQbfA4Q{%Mo`iD(=lCPuinyI zy3sQ*Z+*}v=fK-bf9K`;D(`U2w6ZLkn<Hb~>zC1KuKz`4?qezPa6{7BRfvIx19)S- zzl;lp@#&+%z9Y>LE&8^Nc(CISWR-b9Pq>fMC!s=HW6Oty&L2pVmMIyH7_z(o50@8& z2ncXzB?V^~1i>kbR591ODDpf-DquYjYhTri`Bql3#GCf&4JwQWif*dqQnq^0bOL?p z>D9O6D(~azyV&CE+0*GL5^z<Dz8JrPU|}+lwb+Y^=Q@vXiIb>Fc`0;0bzR+1erps- zN8to0zGa1hXi*wM6!p0rvG`~~s3Nc+cy>*@enp(3`$n`S-B6dZ`0bL`snp}vR$=|g zJlBh|?cU8Ar{8}jR1J+OQ;5EY2x+M1eBCc%D`zg;Db8^tnNcpDg6PPGeWcMkDK(3R zHe(JcIIr~(v;(om{e1)f^(^iFO@iok9n>X~-m^f!kmHRGZv&8cmVVYyq&^mdm*v+W zS-5%+j2^}y0`pco#^%}+$L`~c4c8H5j3~o5q!<6>C|{Z4SzotwUf3VpymDI`Ya;-l z?@Hkiq~)jQA<!79--I#+bANNPN#bKI0+#@S#De?cu>ol)TTI^=OBHna=NdLv=<RmM zGsJZ;ZAggtzV<oGwLu%I&_)lI0iUvoe%w5`a!B@%0WB|iaI1#gjS=yo-Is$iTF%2- zb?o;}^lg-1KoOU}RryEdigoQw7?TQ$n#|PyyR@P8ZbErTwRQRvf_3C&s(49zsx^q2 zYK6|?&P#RJrd`;7KCd?dJAU*&&MrP{UAuek?%!p8d$pVgKEdGHBimEauS$NwxTDGl zW>KYO9<f%CD|!WGm63+pp_fMi9d{50u-o%ZXP%L0Q7G@!`ZM>F^2>me@|#tU1$|sb zkSMLNN7)zrSWPe=B|UvJ56Hnj)0MZyHN@(sa>ehlS1RBT8I<?`bHZ=Ol_kY*D&ABp zw35C1uK<l6eX}koSj7Z|F}`U^E@v^Kk_iv3?E^phk3?bCEFy(HTBENGDsM^6gUDuI z(7Jhrbw^eWMI8LoA60(uPv`Ks+Qxx#_tuhz7){5>tx*PT<BQp=Ot_L#ofZsF1KP!h z9hnKQQ-?;}(kq7~LlsI|N-R0PF)Du;Gh26jE)Bf#eO~2WcuHFDe8%=d1sN8hSfHxY zzp>=e+5o&yiD2k6cS{FZsw=#h?GoK^>ftv1aT%4W=29&4`qP51_(}Ji2O7(uUyj2& zT!jc211A8zp|cUfZ+%fw)gh#lwKSKi*Ly?1=!Xe72(N^-*|`(D@q0j}tUOT{v&Y_( zO+bKsAn^p=Ec4?UAq|d*;8#I?>OA6K!x@CLq}w0+T4&Ur?4;T+cJ92WTdu0Me>jN@ zO$?z*1C+WTJQ6Un4w8?k1a?TQodJYM35L1ma&{p+`FI<uw|+<KWTsDs6C3-oO1OSC zdwlh44PGDi+ZoPZ$7}|=X@3T5vfyYbY+lP+3|gn`8Vn^@=jD4mZsDE*rj_~)Sz~-3 zTu`J_|3rO~ufc>rExg@?<!#^9695pLZs}QRufy;n`t-8^mP$~(EdX-}K7KclQYL@< zjvuv*J|QZ?*U~=No1>^~>~GZsx5_)89k|g`Lv;WmpTZh^P_TKBVGHIS!KVbG>BH?s z9L-5OIu`e)52RmYNqU(I3rhvgye}eC2(6cM#uVHb$ck}460L8uFKo@P$XJe#sq^$D z9Wf7OI{g!;w1dc4b?YSQpeG*4^VdXQq<UokUQXZ>Pmtiw(t?;I3gnov9s>LsAohiu zfzhK^sk*+tYisU^)*<_H092r-L+BCyPya2wTM@}F+x!<tY!gu^llUWhcV{k3Axgfm zY>cjbJCQd2d7|w(ZW?LOC86!HnR0oqrLy*q9DxS+-s2kIbUa_1?IKomDpbFU<MU`7 zl;P@$B-DTM;Lgk-cPM6*jnOB@UgaP?j`U82CiM8?(>$-mz3hCrZl?aXMWRXx`0|Pb z{gt&el~a>uOCAOekKz$KpSt;B8cT<jj`P3eMzi+QGwz&#$5b`{+r4`lClmc>-ItX# z#<^UMhQ5Lonhs}EWc8$&2{qW#j;MpOZ0+DwfSzSb4Q2xW#?A^mlg#LtdDk3}*li&e zrG|wm{A8D#$J{rYNW2Ys^X6PYrRmMeYPsLDoq#UdC|<9n21BT6C(u|}&<XU1`{|Z- zhTc*|zK;)99z~g?HWs~K3CffYXDu3l*0~;r)+5Iv)z6B#?T;I|NQ%X2=N@b!ieXos zv}{SoDw@z@jgdCti$0W@f%nxg0RcSV>F^@(Y$a;axWeN^+a$;M%x5oIL_u;AWh8q& zipPldDq1_3Y)4sD2ByGx<f9V&i1xl!SljjR@|G4^+r~OMAXvuc;bQSd{wQvjek5?^ z>zd0tHyO7Y`&d+TW`4oOjbM6Mc<)Otr<Y+CCkGxYjuKbXN8Hch&%2L<VR0+aGqu12 zp#geXAezpIO)n}Oy<`K8TV`vmc?e2~y4STtmUH{ze$d4q`7BBKc_B2ZV%QTm=(zXB zk-D=eiw&5{`;#le3{E?KEk(Cc`!n4Ny7%fHf_(C+v-wzhZx9irSg3c!8qs-V8&!99 zXp7@X5x`Gzf1(yTR7c2s^@)oEP?e{CwC6!UB9|y=K-vi~y`=`rX3we&gbfd-4v1El z!GdC9NrOoU=`~o(KP=;ar}v3I%z>jhi5L89mh!qk^}j;;^vq&0=cU;yArWp^^0b%$ zaZ5L~iLp9>$yAcfS4HoDShI&qJv-CDtElD`zti_6Kdj!!@Brcg9yLBn#Y_5BrR`JD z6AA6e*|sAUd+YQHRHiPI`Zv|2ji0vsNqK$lUW(q$+Yj6F!=@=9d1^WUrL;7vDd*Pf z!54dLk5}CQ+ylPRKW<fw>FpWr@fRfAl{wtKc`-jXY}?E<{`Z^2&dy$bayN3fjPNV| zQjwwUpmtIGBuEZZe{A|2^q@r!droDOMm#Ithal#WaO_bg?z9yQa}J#}JxBwUvbtGB z2CGMg-f5p}_S9T`urzhnYWH3N*P&`kJbriy0KyCwQb1`4?iC`FIDh)4`26kp7JFg+ zR?qLkD2{T_j{tq48)UWSwA`b?s~EH|w+D~H<SogbGt{2zC@(ZZG9*!&SI#e3%<gx$ zx&1z!%Pu>G4%(11>cviHXU)pUf^At*@<`b*ysULCj&7@0*fwU<&3F6<s>R3(xzEXV zs@7im#Zb=v^W*of4x_g`^yHr3|IRgSV#zUW#A<kRT@F2!>xB_qQF?_Zu(zEa?5zDW z!ICit+x!Kf@+z5Mtysx~)(A2q@Nq#!MV2j+>y;zj@Z?0bj`OFZ>c_$LmYY4PEB2TB zku*k3m@=7^n0OjGk@?VYe&Z|)!iX|Q(KBJ^pBFiqrw?(a$hFtq61H(H+V=VNgixp} z&POzK?6iWeJS9;(CNw^YU;#};+gmiYYr-R{q1SXe;FLx}$B#|+Fm9SXaN%g&`e-wP zGb<t=#MRZ!3TvNaE7`<Vnq`on*m(O}NuJS6yut0y19~dg#QYo6bI-y&3LGcDr}<3u znqU0A($-Tc6+jGJLOh%lQ_!JO*w~`Zj{t?hzkf5OKL5*JXmS!;VI57jEfZSJp5RVV zL1+0Upzmn9va}lM?0A@>Q{U?GiH1M4v50ejUfUv_%K4EYpKJ#QW$YSaFm_)xNQ7AN zPy_Q@F#~Wq9?;)Ex0}+yO#9xc(3(=qLG}O$daKZET#$G)DQ^vc4g|EoVCzOLIndYS zNJ!WGt*b++z4h9NgDWMJO0v##d>SQiH}`KN1A}ObX%+svJXSnuhzF3BT(;bB-w_vQ zs|#eI*rWJ`#dQ7g-we0p)4{gG@=D+-$vz;MUAIJxPSjrZg|+*_1lyu$WOG8j#!*(X zSaO8jMaC4lVK5g7$Fj{g(de3nvjTSXS2%|gM0!D74xeMpP1^g8{l{);q~g0*R)<`d z(1)sL(N8%KDCH89ljj;^8n5PH>D<@<D>zw_u>)!o_Ujz6J1Owj%a7&{lq9>!gw<t> z2OQl}UJmj>ZWAd0HwcD)7xdnSz@lF{rZFX_jt_3-+X%gY$&OtieC&Gu%$jZ$z7jNc z)?fxa3=UPxd;yD1v1Llr2vnvt?Jw{=Xr6(%Kkw2;7=st(=k3Caz<a4{n!u|Jhvyy_ zsZTmFR^c`HxMiT6h?Qy0O;}?Tm9QyAWmUhMmtk{j<o0xjVsA{~FDJ9l8%;D1hoQNz z&+mLwo1$LfgderLYgrX4F#_-~BbKtGG%YuCL@?f3^N1$$0Ihdu^@2plHev3m=YM?D zp<rPXQ)YUv%Y-iTn%;=4l9%&09cJToZ3R!(OMsTv^7L9SLN<o9sbm?6UoW@QRu<*H zqA*&+@#I45VL|F+I9y%9a%fzJSTb_BNBsz<uU)K$6h1BX?C%5qE>DQ>2VAB;u$gVo zO)FqF2jqw<K?=fFFcH8BK(~6SPML$u<yL>^-X6vCtda8rcfk2I_qw-(p`&q+dF{`i zR?;KgxJit^S+$Bjc*q77BLx><C7ZIkBSrXy-*qG~QY!094X`Y4XDueH$+s0Ko1cFB zg5W_JOPi|IZ2%GV0O6a~a*T)q<98Gkw#6Vh%bfZ~qF)akFP+ndmWy7ij5Bzd-k<n( zddf~YI#o3@O_QojWJM6tGRiteccjwTg*REdV`}xKZ%Fwc|DlmMZ;Dgv+lqJ2u%k{; zYL9F<!O9M|ot~dD5Qyv@_Omk*cSZ8a=Owz^m2BJvKQL<v+ogR(%1Bk5Rl5e8{UyU* zZ;<rSqGzQ?-l-D7%(@@`oDI7VP)Ag?5YdCga+G;2ZJ9j_02T$RkY4;?3h~+yS$bKG z4Ea<ni6A*B5cx5Z3%ac#$KxDpUbQP{cYAy>Nb~Q(-|WZ5p?H|SJdV=*pUlX)j&ajI zO*%5;#KJsjs5!-L-az%*Uz*OpYcF&CoruwP6MVJWFDxV%nF#5$tv6<6_Zj)~Vn0M@ zawLT$m7q4tt1MAiI^{W+*}C_RS*Lv1#2O|_?-FOAMQJUtyYdIg<@!-I{eOi>hQd+3 zoU9vag+Pc60B!Ym8E=Ulm=^^qeRJ&$rZ?D;M+*fdyqfduEco9Nv;@0(0+XHl)Eawh zI@5Rz9v$eI)|?wZZAoVsz<dccBxW>!aOsr^qYir(uO0j51~Z<GAPa%8c8kEt^T3S& zQv9*S4f9YD@mU!VBP=!KnZ1PLKnCgtA```<#Oji<pY0)?I6yZpfTB&sy<p;@@EK=G z+n^1{?E{+9Kt`=CF7V@^v{m6OQj4D-&F-sde(rDVpLXo6iB}nN;^MK?(1CxJ3`LcN z06k))6T5L^4LmWyi%yES8B$lV=+5o`0`HcPxnaM%9$U#0oCZxM>2ygR0iIT)FI@0` zR4y3?aq%HGjK0MPK5<b8Fe<;5*ESjs?igj?s!H|tIS)V+A!&c-jw=1>+xks1Uf#nn z{ODI>^|mKPyXcr7w?lOF?E45xuD-ouSa6>O0)Q&ZOw2;1hr(1O^v&1^g>g?)nvcvm zDL8@ebd0!+kBmAiF=y@P<!1khky?xpsOxb|O~w*mQj}mNrt8=Q6SFxlU^GA2-8}n@ z<TcWQ6BKy&>!_$d+!co$hL!R)S#aOn7^?0ijVjt3u>ua601nMXx-ouYVrR3tA%^?t zqEa%d*ji6m%PD{{jHi4jN(j0R)k$vxzxOBr(7(viQ-*{{#-r2Y5nKRf=HaiDFs)|d zdC&TN7EN-USA7r5)&mbNyebM*OvgwH&%w4P)}e_MeBB_(S!*Jn!Vr*6hCrg5IKpLN zaqp{c?8NU)N4xIVS!X3{9bIDFtj+HY#~ku4Z3NzV_@1vU(JPGFSJlWV?NmAhF=@t= ze+&~fUVUMY_GU8vFkJ%t!EV2wc5rPr<$k=VcPU>#=uVf$q`o=C0+ZPj+R3=HJ4%j? z$155fVd--87KE=<quvI`VAKH9)2oQ`q|wQmGvjRqN!A#&7mn|Z@T`75I-d+gT;C%k zT<6H=VRU`~mNa|5_k@hl4br^~x?0pdT3m>Tc<*n!bF=52WRl783H`LN-rg&e6G!)D z)yfh|017<M8X8K0(N~#3-mQ{kOt)u^sH#d=88<2{TFbC&hVZ-RKaGf+Lwl(YMxJX3 zt`1G>o;1aK89rOHM-;6aYjpn73@Qxgd<ol}kY;A(ROAJSR^*EEivEZr28xRxYuUPV zVu!GAK17OV-}`3$`|F%}Q!I;f%fe)*F!a8#Ob$av&iem<^1iSZkL=)oHr#I-kNr}T z>#nCW$NG&qS<|+#POh93tCftA9}Dn<qwU^UX$HV-`Apg~Hnyj#_p|?6E(`(CIQ0yo zR(}2FhV5|1;7&XpKxb>$lM@-8&O<t@g9!%90zh!h^87S>V#qg>GYKUORF>_Hl39xi z<6_zfG7aABt8?kY9T){!t4B`m<I8Av*1q(}#YjqL%e{fBX+eN=H<H9O0FSrdqI_4p z1MGo`F&5BS%VzVU+fhYx5)!k*(Hu_9z4J?-F80?RU2+5dOi)xm@&CNqRdl9!)uL)4 zscM)_(qkT^uga-tkwCAW*d%NTu#AEp40xZGq6hxlnpevSxS7_QbZmOBQL&ttrK(le z#M*MkqabRzCV-Te`3uhRa}<9zzWZSj$_T}mg<<1~vtg+ZqVphje^kNV%vq@5vS#8( zt0apCQ(1!73Qg01a*nM|X+XW3u4o})3}8mP3TD?h<N#-#{ZDi>YcSaV7Yv4x1Qga} zL6c|k%xDKI;nCUxE8{Vh)7^gc$Ld=0s`HM-X4%`4ql=TOcca-jI&i-FSk8)YO<Cd} zdB=3>^R)mU0~bI~TVB68@Ksgv)8VMF@zur6#6!DUhwDcu&&3CerVsM(`CM(?okx1) z_!{444vf7WO2@^>XN{Iq4x(^KA^sZgB_p_EZqCw-5o!FQK?53D6;ZcSKupEB;{i)m zh>aIz#3Dv#4GKS=ZXk{5q7?m%*K5u*l2bn)`cKYsY2u?@ThAxI4=;_I-A-Q!uee@q z62Xk*)Jb0e8P(YKalso|{IetUjI#I~n$!m%AaOw+WsogEek?<KvaVRn*2SrI)%c5w z({)u{C`pEs?kW9u`j%!bPloZm%B$i;1?QaPRqsje`3iAfqqdtg?t6C+0NBe(OJRl& z8!ouZq^BXRum@{B;v1$HxodMfZ89RqMK+Fq)sAGzNrSB{Ni>M}e=*W0ZD0t>19f>` zC~Oadhhjo#ZR|hbjQ0g=7$j@N6C0XQ5?yt8Q9bXGApFiI7+7%fKtZyUG9?qW7!jIZ z1up(Ig;IWjE7g8%v-%1Wg72?&#nJd~m!_^~{w~4UmdGKrtW!cyKNR5f*R?3LhH)hD z_W($NzucS?-QNz`zxq11-#C%ZU&LEBUT@1lpwISd?@(0q(`4>p9eXT!nlwxtS@i`2 z7NwUYqgwKUVuElYg6+5!Z3di0sVDd$7(JXB(%(>COkMARa0GF)*sw__5SFWF15<x0 zr{SBiOp8EcT_QX@xD3cHPyD*f4|F?ognkH<o&_B%pj{@C9~O~3N_kBSsLDrc2!__F zE05J=v7Na5r~j!(L8~<jIAKh~i`aDRN+uu=Lq9GR1@`<c_o30SJ#%437vF5|s@|C1 zeik9^#GY;U(em;Q#rB{lrBi3NN3q!j;d1~i8?-B~k9Be64l&HtrOZ7oj|596a7@0| zrZOi(J>6g?l=DO^T(Apjosl7FGV3kcPd7FEeC9B`x+tHBNGy7tVT6I@m);s5thLvV z*P+5sjn9V^H|ux%4{IIGR2X)KlpMN3UP5nw$296heifW+jp2oWFuSJW;$(C-jJ%Kq z1IrT%vzGhLyFwNk|MPL?Se9M$fkQ^h5rY|sZf#!82XZDZv_x&li0q;D#PVn5>-rAL z#YBzc>ur;16gO6n9n&;?Ef-4{EV|RHZV<B<u3R1(C;}dfsz${UnLSM83vIb3j#1uZ zp8iWuu#y}dk=2bD0W6YYMI_?OjbnCi#!4$diS0_1VZ6rUeOdb18?qDKf&kz<o`Mo- z`Ubi8g4Q#29FT|-!06PHrEZ8wM4@H`YDOiN--3cjlj~NKuj+$vT+ZXL7B?Lc`_Z6Q z)+{ZqpnQT`fulKAFkf4(efg3=Hzs`_ttE;$=1><fqGt9a7NCoP=jDJxZ^+CLsijBC z+ZrTCi}SVz16YfZ$k!aRr@|X%&!|H7Gp(8T*2kbS+_>?Ar@e;wugOAI+fCaWvo?=9 z9Kr*g3Q$*V2?;(H8#|1TM{goN=nJvP@52lwGJ2KOAoqpz?iWid1fMm3r9f)TCz2@1 z%J#~##yPc|&A+U)v8VU&IfU8qTcMPCXj1ZBO{6bSo!R_(+12v>><UbPI&?q%dOBI| z>ghDKT}$}rkIvXZd0-IdwhUN>_IhoN1wWF2z+8m`h@T#;%oxdqCr=uy7}Y=KMlmY0 zYT3{x<S^c2PuHsn%Cz@4B^f^t4o+OC@VjR>6Z;H>KI%9OF7Sfn=y2%ANJt^T-fxx4 z^sfyJ^fp#3+p;B92O`f`3?8~C*B+PnT^zYu^hL8O-%-Y}&oC}y;O{Qa&;zzw+Z7-Y zbUZ=4>Aq4!>UpjWG&IAdf{dY}S;j-r(Tm2bGEEEZryBG!5ZtRuyx<VJ`NTJG27g%M zE7B&7C5g&F3TO*Dnkh~vDS3kMELxpCYfv8X2ksTcI9V>&p4)%iXN#d+cM^emJMULR zszu=NfO<RFwpXu7>9gw%_J2eH6?nu`Gs3LR=2=&y3a}kV5FL+#-wW_WDpd5NSs`>J z6~(m>>&o;xW>w6LO~lv)LgCR!$E#fcvtw&KtWvFxF0H=H#KOM=WOiqM$;9J-rzy_W zD^XrX#y%^NY3J4QH&5b6%O{Q7c%th^vyO{{?P|a63$KUL^)`2*0eJEi)?$-kX638D zv}i%C#IJOYKKvGPV5l`lM)ELN^pHFb|8*@dnx|Z9|IJ9RwexPcv6Jy)2Y5ZB+8npG zwvL%ieQ&(7)Q1ZVU8m0VS3Dc5T_Tu|`32%Yv1Z5_4MP-VWX!pY3wn|B`<KocxP9zS z(F-s(_KRS(osE4Z1zs*`l9`$g(I=*V++}e!)5YZgx8MzR(FP~@qAhN$Jj-rE_oT^| z`jJCN0y4bdJB6K@$s>~u<0MpTDt(j@VunGbmI5V?*kVs7r0Yh}fYuSPK=u?C9``WZ zO!aS?p!(_IoA88CG9->`<i)E6Lko3<GNWv|$$kQ52LaSP8*8GpE>axQ-gn-t0`+g$ zN^qo6gfUl$KP+h}cSPahc0;hR1c*VXA$)yxFJ${XEvT9PdaLZpStT#Z=+-!CpH=dY zU*EIW{(LMue{9bAalcnyMU{jO!?&%8UfE#`3$jsHfN368&PbT+retFuE=66uGz~n- zPaIUE&H&f&^GXA*dVOZHI8lXl!kHK%E9}d1=Ct#d+zYZyk_8e<(=%-Jh2A59CdXvO zfE3K1Xh*r2$514Y#*F;FE87C+lbi9Biy#jzI_c;)dc6Gmu85x9NI)d7xcnZdZ^9D8 zfS&P_X}k(GX-|6p+>D5BieEys><3J~*YV9VEkIGM_u-#D@}y;pF|PaV999P+VjW^3 z;nKBPTBKx=JfE}$KE8fgyP{9SH1y57J>9L98vS<n_ib*#`HB{IAk=ojkop|DT7f}G z7_z$|V<P@grMDf>VQZgLTF(x>GW9KVCM&Lb_c*#(H+@(nc_ulEz8dxCL|%((vDBP! ztahf`m-gjS2<|KsuP<&K7zj3xQ-Jz4$>4y}R$!g~R>uSPX7B!Q{Y+*|H^F$E?RRYv zqB7*qgp*JDu}iZ}-p*CoDIplk=8NrgeYtJ%@s{HwU|JlHm3v`z-V0T^Mf}7dx>x)% z%g8+f4mdN#?LG}kPxt7@lPGV`K>5P_(ZESNL4vc%O{{(H`01f>e@*OSF8s9RX5Olq z@=do6$ETqr^~qxK^4{$oT!o4+MM`fwuK0c>^x#l_S)ggVOQFDdzKQF6iqcc->=gfo z=f=?zBFGB*{AOP1&$gwAvG=<qeBlW}Rx;r}u7M;hKDbQ~a3`sfK@qQ2G-O!9_cRPk zGtc6UOOKL|jW;U+Ix E4pj8C6U5|&bn*|>ytG@u&)~Mm&&Zsv{<B95Bw)_!Z#<J zUJRi05hC7MDq+fB95V&prD_Yd>#R5%un8>@w+#v0MUShb?%Z=1ru@lfsiZ&VTJp7y z6pqiKI4KXo0j~VG)~#kk?sJF0UVbNglO|qB4#i^BWcKT3ik-rb3dV{C=D5>fj=Y?f z--_zRX^o6PUpLT7IwxA{LH8=rw0aLVY_U5BWi~#0Jgw2L03E8rsG7h;kA}&s#7kOT z^7-i3gwZG`=zUn7#@TW9LKXE!3W39oao`!;=%rcbYwHHlT=+{;dR{qicBLWwg5a+j z<J$a9q;`C-RlJ{imyW7`EdF>r)R9jY)(yhdPf@c4KntsAJ+!>Su_O#sv+6%8ysKJr z|C{yJXmWVfoNPWL-6)Jg#X>nsO=Jv+3RjsX7y)XX&N1MeUbLn9-+wPu_HkkXPAI^* zWBh>}f2=|ATDfItSX}bL`<}7XXz?3csskak)FGm{yAYSCgC*3n^H+!31gQ=-g1<8q zR)1XWC0D=xbg_>R^P7q67W>@Q082#o;zQ>bO^WZjuq37Qvv}=btzuKl?!7M&@OS5) z`-jJMzwqR-fTjvgb(|1i%iBXoRfKKTVHxxYFvwC%GGB=psp2{L#B|UJ&kx*m3m0o> ze|k**SA;4%d9X60Btj77^#VpBhpHZAMSQ+N8O`un0N<{Ol@MbKBaDj|C1jFkOzJKD z@;d0hX}%|s^ksW0O2|5JfX1xl^f5aBGLJd9C>j^9->RvJ&dL(Z7xDjiI?J%A!nJMB z&@m$2NOuh&IdlusEj7{#!qDB_-JR0i-5`z9jdX*gNPM&3y^rtb{GQ`k&sz6=UFT_O za<RFM<ZVC{h^~Cum8O5BuJ>=2?AB(<JlPIIswVv;bvaeZ&W9C^;_p1c`3FaC;x%?_ z4gNav^G0_eyRp7_M7f%5&Ssyd<ILEetFC{xf-l)}=MTRP<zl1dlyY>Wt#=UDGAzGi z7Xi=<!e~*=WR=fcl8&cncceDEcCO)F^znmDpWnqqDs~H|<D^o&SeVi3)tZ6*Nz6?^ z_CmEFHcZp{8H+-3^0{?xfer>H%(;9+3Se!0hkFgiJ&3=SM8fL_y}o2ns|FW1s1NqA zmrsibi-V+m)*UZW3%FkcFw(aE`gvaW9p*HL<;vcg_~(-aJp)PutNS7jOCYyyN=bSU zeM-)i7256P!*s6CtEZUnHhcqf2?vjFv<>rY^%pP0GtzEqXlqfzZT|hOYzRNm)LWwG z9&ZzO;0lk2hL)ec{~js=Cy$mrnlp85z<pFDwO^IqXVawTN&JvbNEa3&k*1DHW2Q=@ zbwn@gB_I|Y34_kzcEA|W(X8nFkk$RhCgSN}Pz)1wIufA|I9wd)X&Ngmoab2I?yGNq zSGaCmHhIPx^9BGz%JNBq!II)*%~q{!3j4%kGE+R)3?U3AD4lh^J2h~3&f)KlgO+CH z+>Vv3-(YQmxpu`;03_{S^TPbr!Y#Ya=|cafpEfB_48_{HH#y6=23?+0ZVZdv@gX>m zhgJc9{}9@qPr(4T3hO&t<35xK3DtP5Yg@ohIgErZO*~7Wn%!f+B=+}1=|T7`m)4$& zVK1y8K;EuI+7<yRPF1ZhxI)#TOmcD<>5Gd!`S8iz@PMn4^M&F4y7#|reY;+ugfygT zx<*S%12-Y|Eea^3;XtO^l-CyfAg~YLp?kQH^Szk+aTBH3V?AggBoVKIbs)>8ofjE9 zf`*n%5le!-Bg3%d$hc$y`wr^YN3dZ0@pu<|;T92NagP%-m6NeA6{-9s;<-ATizXkC zES^s;f`l{{&+HcFmj;$OQtrdRq4OG+NOj#g&3oqlUk45IAse2ycnzlqJaa|4n7M(O zJay*Mks{6aC6#)CAQ)ZQ5+1x_G_LC4=x`5WWF#P>C9uR6U(nOy;KTu3Cik1eRG3ux z(=NKCu*tzswr-(QwvdYU_SWz3!veF<6gfV3)|cn~B64L4fkQbUo5IhLsbX#~$*+$G zExAt`-7c>+jFG`0S3g8#@{QdPa%#UNa%Ks{e3r3cHBJ{SB33z-871pQL$RspuH}tZ zTs})(=Cg!z!g<y5A5+EdY>F-x7dzgG4Yd9Eu<7#@Lp%q}uj1*3_gOEUuA#@DO1e8~ zvF6+v)y{*~vng8T?P{4m4r1w`Y>k2Wi)~Rppj;#aU@pc+T2N*h@FU!}5|)TZtV0~b z4Y1HX-aF<{4HTT17!^gqA>kPCJC*M(ps=#H(*6}|{CwEPztQzPy0UoQdG&%<*nYy~ zICa~fXApr$9xk$<{SAm!^D!&$+UsH)c9QEoLMhsCI}xg{(gW|3F}Lgm?ZgSd$ZLf> z3l4|H=WNjj%YW9JrA~lRP?K=XrOgJwZSMJ+jncysl3RSWp+J*GI%!K66jaqMJqQ^n zqC9Wu9D2XTGHoj=(7Jc%FLs1^pYv%z76`cZ$ds?BCzk}J15>ONWPhqIS!|do2Q3o1 zZ4dlyu*-Hos%lupOaQ-24sEI~BNl@GsOOT4D+ECid(VrGPi2vQ`qUv#R;O#0@!xA& z1u#$zv~N3wm^%atX5Kyda2sf|lC%NWo26@(hMeC}d#@Nxd^uWGl*IZj%G#-NeP)Mj z;5R59*WWi4FVKoVg+ypkhfNL7`t3?i75U>}50NP3C@v<mq=smq9$sSj?sc2y_S`pn z+OeZs&9AzQ%`(gj6!-~H-#9s1Vz&j!pdH|V_Bgixy82H3b>B;!?!0~}zT3K5ZTUXg zrue3i0*Pe_VWN?Xg$)VwG-vG>H)Dox;%9jslmfDWQhkxM`aq!%L7p|GM(?@~o{d!b zVR}>&bJm4=VF;~?qFC_#fF>4UgmUn2YBw+uBl^euRltoVmmh_~LsS49eOB_1{lDgb zCtumO;tP~uFNB*BUxMC{pWJGM5g5CpWl&SKXmLMUH<Gy3yfHAdd;=dzxlURpZYCr? zaKbr#Tsn1AdtKsu5alvqOZk)vl|=j$!7s%RZ@Z;md_Q}N%hJuo_1Caog+G7Uaykbc z)=sTL`N6bpzxneLJ1tv|+u1;>(ccTWG6zo07$bVu-B2I)S)z^!y=hf4E_|(5oOe=i z)XE#1{qw=k-|Y^te?)d3|C%dMD%_OppRaxdpYf!wU=~LA<&_`nnb0;f9h*%U(M|83 z?~;Nt;>ci%<R9?9C~lDOwu71PxP8z__0l_Gj=x2lD-dze|Bj#{(ZO0@QMxdm*IF1E z0q357`i!7;Hi&5wRQz!s{ELj(;jSzy^u6KIOLKFcUH%RFn--^Pe$_z*>k4by=FUvi zU2V>f>x*J;->f}Ow&&sa&ebw5tWedU52wC|l`BPmg<}}<R8@%Be?FRlfz6+u-0!Q_ zz3DdEQjCSWo>z)7DNp~fMVY!&9cE;j%?cGo1sD4B3tErvqObHPiAy7Q0wU0iz7&J$ z$4HkV#Wi8r%3A)q)S7t#Thbi6_&?pEXR@XtM5vKxiCiLHe-2&Wb>434zt#5JOFD3l zvM>CEJj1ZMvHXc*q`VUF1C0kt)Y|)i=C+66b9L-F-TBfNoL#BJ#il*7H#}$=nSGzh z<}90^2SA0QA-Di4Q5uR}iv;^pi+!hWU6p21*gDKz=ye(htH-Z;TnE`51oV2aj-j5v zHM>kAOQb*UOM{Q=4lb>bsJV&pvO4$x6Q>hM5;~*muoyrfZG0;}lp1{y$fi7q+yRy> z!ZwV+ACdz5yNhuAupnY7(pRpmG=GxW>^vz)9LoJ0-GM+@wfJqP5L_974nV~P=whBZ za}ok_5WlP00BgD{d>;}SbG@zttJ<x+63jbSQFu5J<cfZ-&TtHV-B}6=*FWOwZIFOR ztd_Uuto5_gU?d<$KXS=#0~et_PiqSl8^H$Mm0R3hhq*;{s=mR&zBVYjtUsMNjifks zDu4rSEk^#mwWIH<EIp_RhVVSXoEZc}PoS?4hf0O+JrV!gU#+~`az**<Lz+uMgAG(= zg~AH}gJU+*DCz=;(r6qq42n=)sf=}N<sVyA;^=e5M=daf!T29b|9-r^nEWwgjYPch z>p2yl>hJFD>}GM^`C%a_PH;m0jq1-vNSEfIxB<$60pmAXIzMx6qvcMg&kfl%SXh(S z4~)}>US|W8n;vJ|V$b*IU5|k3PXkC=eIN1=Xmw@DiqY@~ameKsP{7cYjasf1&9!>} zo+p*(;WF!uM?2rUo4-SH>@4rJZBG?O2iwddD`9e`$ES2<xnMm1;IuMRr`ANgOcHkY z8#JmAITOb;%v(t{KabPD9Y)QhPPA-&SfL!*CSAVxGm#kNgTow$H;CkLke9-s>{hSr z{;Bi?NM)BEuWzz5RnVvYmKPOrYY7-M=d#|PG-(woxSBo7es~ClOm{ioh4ZVtZXmk) z-kt}BA{m&D@^SRb)5Q=R`wh*C6Jw#(Y76*d8S=JYl#>~CnEBp3t%|vCXTNoE9o_PH zZ=Z#{yVZmghk$X-N0y-2mxBh4v5=9)Cz2rDHK1j$Z>^V-G|B(EMNNYSon?0;bt9bk zd1|sE(jak{yjt^5gR=G7ak1J4t@KMUfeA4o?CYwwJ`3Hu<t6zbilxSR!&?jSR6io+ zow9ol;lKN+7e*QM_^c<47@*1pnQRRaGEY?w996e1KM-5Snl_MvdNU8j9<{dwq%;0< zCGmLm8AW4pB4zuB;g2Zc{PDoRw!Pw+l9SgPjHU!bl4;Z>_2LFgIXF+5WLNgo4;N^2 z3TUjb7sSPsPYculptm9|6(1Hr3=jlV85^OsV3SL1Y>ed5I&m|sDdwuE$Rwxa({t;$ z??|>dU+|0tgq?=J$Z~uM_<G3X5P%~<B^V{&mp&tzKucB<MC5uk@SXGN5Bz3v^>F+| zWDAt|4Rvnj4crgN3asPJv0e;Tz$L{FQkwT@(_mzLbQ+E*L@m@Ai{so;t{!|BUTRz! zjx)MOq9}<C$**|%5a38hm<kA|`z=G1{w6Yj7zYD3wELSbCs-iC@#1VVU<v!`mHPji z<{SLQgjT(Zeyp!H-!f6lE9x~ws-gh_JRL0*O7rWQz~yndZIEd#%Y=b+{Z}nb62)vo z9qY`#sPvB6hvdHYxy_ecX_Yp;gbz0EKZ%kah;6BK%Te<UkhPaWk}Q8sN*EZksWYJr zmD;e=$1*9-EIDGXGAQFVe2H9}YztQ^O`Nm`^XS$*oN<IE3X&g&%<THL+ecY2P?wga zf1oaB!M%cj$+2#q474WXS3^ddzWi|Pi%Jq_!IFgQEdu*Hb7c0xX><i_!O1)P&9{@^ zMW1RYz3)2Uox16lsr7q<V6Bhp3OjMA@NIGn54I$^RGdqOe3V-JwHIzA?l!z@coMVz z=WKfOPvL>s!*&B__n+<b42<H4$|Cnm!BnG^AsAz0q{Y7U9uyn;r8$|XgAJH6it9jg z-)m!WyuTlJxI5FY)Q5t=)hiAC)n3kGVUfo+SdWXB1UyR)hK066(AL?3FX18poHCNN zD#vf!4Ys<gClFrO_iv}N&8agPzim_JfqOsl7CO_>EQ(qyq^nti5ZFE&U1VIjffq;x zi2{F@%VN!Dh&Ue&Fut7RK3T@rydJ^RBNZ(lu>v##q<_y122iM1@Q2gg*?_(s1Yd^r zQ&?}e*BHDqo_D<HO#5D5ABaA|7!7{f7i1}HOGX3Au^IU)tW~H$!{#5Ti)Fd!?FL|` z-5uftIE&tVcI#@O-l$omk5JamvX$k$Y^^WaEA+!~DxLde%Z2aZ6kh0Co)C0ZB6Msc zw*3fUQssz%%;x!${DLeD4u4mSZlq4HcRgNv6TfP5Uk=rGgbQFc#l*o3t(nZEMZF5l z><Pb3(*lsSa4e8`26Y*DUHKe;rBHtpv7A(;owQxn%BNVB`@AeN09ru6&~fNs%e~($ zwU|t8&oJ*>5hMJ#%nly->E<l6E-ua(wmm*eW9W}b({p-b3^#LwStQu(p%cn$?wfIF z=ndd8acUS_D-#B@Kz*%N*4s*u$x8Qqv-Rs>>c!um>pGMXXk3_|plkiQk)s5H1yb|# zNka_}_-T^d;5Tk(flm`;2QL-5olZVe*V)5fP36PXnq^HcuAl1ta1WByt-GOg455Eb zxQai|4Uw;Nk84D!Y1IXFko9%#{Idj@VfChhc_d#Wl(0kHxOpvm(Um~~_vv%vT*#Oo z-V<Kn|70VlvCjvVx`N+b!@hyZPeX7~sA3`&P9hVxVdSfa9p*qn;smK66HIU%?pS?L z3zw`4dzc$KWBbIPPY8#0v)+df-wyeOyEae09|^5Lub+*m&a0xRD=-70wR#o|Y};5D zP!wH!8eJSUwbJ$Ne>7YFr3bvSp!HBpjo)&=UOj$6<Z2LT9J*5HAQWb=%y+R?x3cZx zB2|b}v&d7nB9q@n(y>3@vqf^5u13&KD_G<eT1#y-L78Yrksj;_DN-3R>)l?9UOn|4 zkahkN_-$$zY%1_6EU}{wk|%NzHW)^oot6*7NDt)cV`Y|u8wxjkUiR+0?O&aJ_ZRJY zPA-Q*Zub-Lett;B02gG^g|j}i@0bPjP2{bqYY~F31Tl&Yd2c>vZtKAmUXRz=e@w1V z<9693ny5Nh6#53E*NRo7dd&9R^;wx7D|3zl1UvHqRU7Mf6G+Ds#%UBJW3UJ;2XrKR zF3VOox!~V1@7L@QdneWfdu5eB)^hyC1fkrtEPG!36=%6E8^d5EMgySht_MR8lVc2v z0ud$vYtZ%OjrWbAt_Mg>&14N7$h$P2vmVLh^YQa@2434Yng3B$&F{Ew-VpiTZ+9%h zhVAo+54|!6<@RdvCp1hNKIp0IA=M5v{Kak*?VI&f7KXu_<VVYsshsmQ=Qdn;Z{>J6 zjz4i(Zxf7hZAH!%WXl$PAP5=gcl%mjs)0!u6&i=3DL(lDiYci-Yhptb`sG^pa>w-P zg}>YL&*)eaS*W%jP*vK}wYTyc>Og*A%Yma5aWpHUXxhKKI1a#fBDcrvqu5;c>%T2i z=AR4=dltxWVt?Xta}!2S5q*-&Mx}A=#|05*W#73SoO^#60v{K0J)U9qfmUidJ6-dS zoDskQ_R~-PJ3IQ1lWol%K9bi806cCyoFEAh7F2@2V7Pv3=X@|*o=zaG)eo%|KqTEK z$bdZ)$`px>YGHvV$t#ZSI`3jM=%JpH%ye*6mW=p+wVUVBGFlwO-s`Mcp|t@fs(P4V z%cP0K#K09cZgYlgaTY=<i1KV}$d%9cZdWn3=ki?gZ6j%%BC+N823y>FE8JSC?PUXk z^T9b@FN}pKqkS{5<C$P&Zi={oc=wZA_-18J_CH8nr#2J~P1lIuzBYJ^ZVN32ZMN7? zTAGYpsM~6_BwK@wi%AV1kv~HvRyjn1pMH9Qf!-1Z#N+K1!xLVjf6|D(d3X7Y@Atn$ zgZiW~|4Jz*kY8o(%n`a%q4>nx^IH6UBSYkN0utNvI90%A$q+7yl@P6pNLrNTWME$^ zQI<)Hi|i(O-o-ruaxzDpVcg~M7as)TW(`Ul_Q~$DMbLA(qD!HoKE~4_p8K&*jB-yj z5%Bqwxto{;AncndRMIfanwI4|G4}$ea0-*2vSVFdcNA;HUVf)fuR9-SzFoiUEj!_X zxpeD)?yloT5;&=xBpi_`bOe+uY5P^wS5{k8Qua3G_M9&k#pjCLuDm`BFm8IBq!$PY z2|5-1c%Q8_?x3nY=kUQCyWd3gTMOq0K|kqfiTClAeDn%tS)<uQA_5fy*u+1>CHnBC z2hlf9fartJP{F>@;L-JH`K{(8vj;|egj5QJM-5B+2BZAL;}UU{hK4jfOK&vCR(D30 zhop-$yE$cMPIZe`vx6d&cXQ%slU`V$#n?@~!>L#!x4rKwqSx7+Vo#|r%=cLcHK0Xw zD~B#zD_)xZ3=7C0i$sFsSHt<V2l4RaLIF3Y=QhQMWwJ=Q&Bv`|Ov)xcCRv>~3o+m9 zTJq5Hbr*siiXl?^nv+h>_4UnDL}Y@-1L{E_Y({9nyjrH#2kUO0v|JIj`OUU}3m3vq zz4-(zDLmIgi^pwdMEo2k87d-#^RQ09hU-Tl*-ypZ!kTZQR}&`}-i<tVDE_fX#@{%v zYKaj?RR@GMeii&MN;G#?k3*n>zbtj&AT`c4`BlZDHFo<NA)KEsGyxwTsE8}aZNZ^J zTeg>*f5uEN$9<H>jdOwi0S@pkX58S$SRyT5Kq>#@uI>41@eIL7fZT5ca%yBI><?;5 zSbl~G!BphwBn;|~qd9M@qOhtpuOlgWi8i~g@8GI~8sC#{eHC)U5j3mSqFt>@v^rb$ zA$l~~xbo8SIDf@U$7>64<$iCdhVYfc^)E(axBaFTjx&xZmhs^Lc?swmN1O&fma10Z z0f$l?2{|AnzEnX03Yhy&=LKT>?6=k8Cm%NWK^zo@m&qfZ{h!D&#RduR@(*WGhsPSf zCO%vzO_lVH=7V(OkXJ<S9t>Y0XQltdg=wIP21FQ{TrT1TeF}!u=v7gPSEUENrs=$5 zy;77oD4y<h_pUkjNUr{0*Y~x?&&KZEV>&M22K*bGhE2ZQxTnt`;B|1AlDujs>b%wC z@p#1JoSpS%Kz!b-TvWwur7b7$&BsAtI(53RfO%`Xxw>QX#&Kt^SVsrKxio_}((_Mk z191!*RJ;znZC5{Hk+pn^K-u*yyiBh9>sb(82q_6(QhGqCIlqi*5E_xPF1svo&3u{n z`FfQrNB7@5Wbf^mig)eyUOVwW{1{T5ax#}|SxmJ^J{AFl(cWNlcPe*)Ddp{1G#RyF zJ34lc&exYGA1g+Ty$){n-NOfN3BWCSlX{b%+43uYj%Bn<G{|4B!C_q~x})4U5+n@Z z6A_)I@X1Menh$_HpCNrt)PN3i%U*)1a|~RQUVLTg*80ICl}AT-vyP8DPRO2;&>Tf$ zUwq?D=DgAt#dOfDy)OXabGXPVgOZ*j(wC5?62DI&esbJ4Cu>DA@Wis5UD~wH>vy8f zzw_31&t-2nU-uv?>rEjNrOm(Cq$BgNJv($iU;3#lmR%Vnf@)cOrco%|58E?s1#T)9 zr-WY@7M8QuOOh+JRc!dr5W+_%4*G9@1ny+UP!OYJWOTWdeVLx*cN8yOQuSy)3dTDj zK6c@STnDelyt*5EKisJ$5po3<S(BspBP$+~sl*QSDepTrSa7l7Z6j{&DL&Zcy1jHc z{&M`@;)H`)9a4`w@HMW_BnMPJ8nIH$+dQf%IWgg-Li-hon44;2QN{)qnD~!-rcLAe z(fpmErQEMRif2ar+D)xo67m;x<uK>m<BSiCCtp~AbN~s-9(cFA8+iB@bN0jI8-Uhe zJe|{7I}phckV6{=7o`;K5-Zv^?|=W^k|liU2{$ra6??)-o!F*SfbzBo*balGW%v-d zDGWzp>BpD8Wp`D?$j`SDk&L<bxuTDMSna&rK6^IHv)P-gg4h(DVyWtF&LkZXCkL^3 zS_SIj{Y>n#tzo>nA?lQq<5c?9I)F#bgI#Iq->PmZSEx9TT8t!k25IZwN5s-VPeq|H z%s?bIY~V;YFpMA=p{}TO3WZLVqwNg=&q{J5G4J1IjnJB|<6h@Qcv~RmmP-oY$_@5L z2{rNzk(c%siyW`@z3E!s^mb@8hWvNS^cpH2GEJWK)$M~8wykUPn8~-S%QkEKktR92 z?vsulkK0Mh9FOO&h652DTm=$P_*k|!&xaP^WtIfelo>h)jQ-7Vi1J(OjekE|BO(Xd z-nQae0#V}x@M@pp!Vg`W6*eM6IwaK3Bey_Dy6s(p?KmFcmH7v>@j`HxnMBxZnfk)V zPgR3Ij$y6cs~p|0Yr%5HUia13i`};~x9~zn?-l&PiAAO>8_<l1Q4~Uq4^kx<0I<Ym zeZ3U`IqZIFyI)z&@p))|J*p$haeKL~nhY-14gNW@S5SOZz`Nhto<sOXlb1f3@9PPv zUZVA%sn2T2yC4l}ry&CK-@UjLuuZZL0aVh;phXa_B_qGn+fR1@ECcNXFP8Ypi7fP1 z17jib?)&_9T(-ovOhlaszklz<?FC;(HQx^)wq%j<F_h}b*L4f5>XM*p>Jv>Jq*X-k zus2bD%Xw|_dHOkR<o2ovw|otYFka|U@cNk!?_*7B2cmLO;l~9SY$G(Lh9E0Ly<nye z_Xi9$2C<Aekn4WWRm<khFIm48cy*b-ozDwr>yn9jt@btH>SMmI$$h>2UE)Y$TCn_n zswGwhm!r$^WPV5NdHUg8q#_Vu<9q@uO16PiJpdsHfPtk!42^6qE-(nvMa@Fp(A|p7 z>AI0q5%cu<j-rFiH>^dFIohyLS19vUU7<1@FK?GQfe0THmw2uz)r<-+4Ehu<8bOd6 z`ltgd^^6f*s}Y#{3>)IEAAeRb-*eb_+nR}2yX)f0D*{wTa6pwnum_{L*&$MG`Gk18 zzolB={DMS8M<C$j+cQC~7=s)v-XA_n=Y~x=_~|6uI;PV51k?ES5s^PvC`c<0;L!DE zau14x!SdPFNU9)d)I#v{R9XaG45XJ;-|Z-S=&kSF@qfVW&sJncF|w%IEV_`EFQnLO zq>GjA+ihyrpY_%S!#dn@l~B?K0B&GY9w&FBAd!1owr!*l0vI1mj>>_}TX;Pjk$iU_ z&<30sjIgz=KTsbV1k$VrAa`A>gsXa}!Aj*FO3gH9NF(=#&QEVz|E$JRwm&b$b8dM4 z`>``*6^4j&cIVZ}&DI}={rd3F<R8I;8CI+D-_e&8iitriKsP7ie`klUHNBS|S0g!S zgAHdHax&OP*&up9w%GUBJNa+O|2^HdRDyDR_696BI&P-^x_@1fX0f+Hn<DAoN(mBV zY~GsdC-^#JM*ev@8@i%YqL&PnhSGeG;UG6au!jlQQ{eyxdo*ab&vio36Vof=E85~U z4kAjcciXd+@X%E8v@8qF;DK8vSrb0PIgRNsKt2;0v(N4C(3;MxyP9`mPwSlP&zBTr zs3->c<ceQlMKVTA;XDms8lFBGq+O*<m+zBq&QC*$t&cMl_eP$l2R$3eUT)ikm<POC zGHs%y_`e8`qZ~jyLDFr!N|j9qyD6hQTy?1G$RE?9qIL79^0!n43SGZ`c5&fGzyv}0 zb!HOw`?9UB@wzV_=pH=}`D<884|;1MbMl>;;*Oh3cb^B49^YFEmC?nXs%q_?s;aQt z3)g-+v&rF|zgiir_;Gj6HsauLIsA9w?}3=`>r`lL&(nTK&wX#SF?@OS!{j|y7@)6l zQfZuK0tr=k+24fzvwhuizN!%`>&V;f{m__h_vcy4ZkNYkOrp*4)KUtNB!tAoAWyRr z%upfV>~=fUvXT2Ox1#?vEeH?wOnTYt|H6lJ9_T9W{JO;2h3)?Cl<vh?O@ubeS=cKk z<`^5uQzSlj<<EVE(><3jZM&a4?Z0-fHa74@sGtzYEidQT=0JFKvv)bRCwbxEl3HMG zcgyivEmTt0=kFtH7SOq;fd0f^g+kHPk2O^|7nXP5)g4gQlUODtwvpmzW0*f(mnTZY z4l4zL7+_EfFc(g1>_2lXj`-q3?w+)8#AGcsEs%m<q6UX4u^fcY>g7i48M68CyU7}- z*c606s&6S~0C55=Uz?<~Z8>n0Xk(ZG5U2cryq7N=IX;#z18^G6O|UE9bQ2mY_eN<1 zt`a2oBI3Imb-S+aSI4jGpW-me21e&K*ZW8jaG3;=6QreWV3^<#nK)ykDgy>`A5zdo z(!<(fEtQ1}SRY1A2gVsCsT|A;JO4}rJ?EptSF{AW2EIm!cF(clU={7^f}}cpz#AUN zy{_k7dzk#jO&r8Bjo>=EmHrU5F_gIJAc|(lp+*f4pswM1q;*a3(&xD+_8A3A`Ra@C zdPRp2zcaHE!cZh+sffjb@kU;2H7ip^rHZ0`?{3Gq_3uNCXsvPQ%}XL@*Y!du4~zCF zCUJwq{S?zjFk*v#2x*euHp}^LHHg+}(A69<EsEAr6&K7C*%yu|9~M4H(L<4Km;gzH ztZj|i`jM7M@B6vyjB}+UB1pCL9K<+CPmO-4l}ZYzRT7*Iou>*>k3RkaA%2&(0P(#% z>=5&PjON^M9LRlGk#b!FlOpn0&g7A&U|CC4q4OY!W7G*vstrn^hF}@2C@oTNc)a?1 z*1Z0yF%o@kkb@`NtA6Q6eq+%YVLf3e%+@<OhB|-AC;24#^=Ak>I-VdptAW<XrSPP{ zP)W%!nnV0d8nq>K1X^0-@(N_{0Yqa904E}lym}%RhSv8=xK_iI&^ch_ee^)b{aM!D zU)PMVWocno_FH!F^vBF?EA`|7S;r3RqI{UG%l>?6c}(t&#Z_d>6x_nYN!fZe2j4KA zy_}R=V^sQ81O)Qu@P-N0kunVh{H_ZtdgHZiP#L?sgtlntcsfEE)pI|5Vwd$VuR2qT z^(1t07*%KXBUcVoov<SK*Nk%2i08t{{W}t`qxL4=3BPO1_vnGTAJJeE5@=ceF#uz; zQG_LwDa2Gi#!dOx9hDr9yS=yEA*?5IazkH*YVbI5t+O+ER*7)&&2)={jp!^<FlnUF zsQoDngxVnY?vp6TbW0nd`_3Z{?Y=UIGuHuIw&&8V4jwC!ES!NgqdvXK!3#OT<3`W) z<lL6=^3bEOBizFs?ZmJ?kVQhQU3hOleip(9DD#Ji>Mxf2?S_ql?q|wPwbfOz)q?J) zj|20YH{V6wz)*S`z_*UHDc2FLCYOgp8&A*o=|RMZ!3+ZcREr296JS<b&`56A&5oS0 z_e(SnB>YRQ$HORWg^h4>DA)sgpIZHwExUR;y59UG`CP>^g=EGjlz^t)i9B%{{3uhU z-~(Kftu;);l!7^x0d(2y@b3a`t{r>{)rWFDDm*CuefwAz5mWgs$_e5UVTg%voGBru z%y(d(ZoTwpeKI94kI$p6JNp&y9-o}wuC=>p^a>?RPU+MY%^}5d6A$FSNus`rwLIF) z6?pP>Mii&P4NJe*=>4Cg2ANjimI0=qO6Ay-7|H|SOR1(id)EsK=<^uyxG`>>vnPe_ z_H<$2zwE-H(1v;E4THOvtYjemxaT|M;A^`myKHekDbtC3jE;;B${v8NuKt(VDKg`o z<MGAIH{X@leU8gVj9)H8RXUevbkWld(T63Hm+_@*#k0bHe8}!#dIp%eAaZ@|s$oH( z6T;MuLLQ|!fs0{rMnNJe_GuKLaki~<QHPL@^mazq`j^c~3nV9+PY7uw`H?)%rgG(P z0uiKF8q3l{X9Y&7gqor)DYdP?(=8Qp8oOP=qvi`IH69Pm6)$s~8*XM{$q3Xm-1h?x zlgdVed85mTc>;W8qhM>;FH&W%mzjg}hr8HZw|lwRp1b{{v$HmHTNV<tT7*GKlN>!g z`M}b8Y;5+xEQxr!K!=#}V0R!c8ZB-BHcwd{p7=U@R=XaZ_n6<<qb0#rGRTL<0q!$B z5|c(nNQ@_Op44I<-UsNJXaxArHb{XK1@dfvRDlCnni#6vCdo_9a;BRt_4UD6_S{iY zd|x!m8HV<Yl^DwwRL(i}H$Bf!ukDOGPmZI-?lbQ<ov;@{;5_xx>d_!^@cV#K*kF=l zIX#;RSCQ`AmR(NT8tivB<A(d|e5x_USI?-EK%^XTf7tf(&g9)eb=$sUi=pcdv5s7n zQ>gc1={tEYv}B+lH9c&$Q8P1iI8wVGp%pEQr_&y1)A#huSonFYGJf{4X=drP@mqu7 z9WGVj+6v7wf;<`uO(_JqL_I8Q`HLRr-=9w5pg{ohs00-_DehmVfu-|G;TK@%V(i&^ zJ!fW^&kmx%0B2+akOzU?T?*=O+?y>uPfUo=sERHvDUn7(o`#t+)=Ss-IL9gAdY6Mk z#}O|h9EaxYJ4m);&m3k&3xDbTT@9)J_lMS1%<YY~zdx^u^loB;S`47qxv@EiXFmE9 z6ysDJVLyn!<*MSK#pfmRz{qoF?JlZb3uCG*UHPCc!G4!-GIJf-0VT|EWw-!c;zvTc z5N==Vc&lHZI2Mo#nZfyf4@wj8LwcQe;IzIV7{J$C3OR`ueKR(waGFi*@#UY?gshFX zUpQ;L<2F7(5&)l1rf%ViXdgc1)5B`96JXVGs2!1>)jh{>yN}B>MI*NaI=&U=96q3h zI|U5nB6LPfN-RJ4^L+7U?fE@%?Kop@zy-Y|whzC}-zE#XkG5vsLZ2x4CzT%tPntP5 z^OvYkL4Xi|W#Kcy|Kb~Ua%@sLQ|z!w(os?=41_oaBxa1V4ASJ}ISx&wV0HhLiLLn2 zH}QJ@pb5w9PLj8blQw;3ySdO)pLUYN4{P2!y|tq2KeB;0zr-1FTRS)@kDpgXiDltg zJE6C=Hrg<-<cl$YNMQ5_k#5jZKha7-94#mS$nGapJEDs;j8QAmdVF`ex2p1dWGs5S z>2)!mEAs3RQ_<<L`=l(gX((O*)|l$Y4>0?&(hS>Y%F%blJ0BK1rIR%w2g>=?0m9>g z)OR(}k_lM1#6jRtYz5V=Zds)mfI4=TCL9PFYh#nrp{b?I;Oa_%4REvr%24`2sU$vU zgr^ItqfM?+FBfC}Cg880_nUX`Sn_bb9%>PNx_y1g>A8bsq9YD_1ht@LXrtg*vGGs5 z-#Uz|)MHPgcUUPi(ai*@c%RMbT!`HcvO;_x#)*8DFn>A_d`?OywdVfB(F=2V8zVd& zi7!=((n%`FFKX?yS}x6+#hPs?g0yT4j^Khxf{xEI#(<RoVm00Oo|Jmh7`n!UPTzEm z_sI~kU~=oO^rnlTd}YzkCD0NCEXuS81O~G{*Xz?u4=ZkBY_zgS;vk-OPh4w0&JXB< zt*CbO{I(e;H6qAI1y%Yb(BBR0LB!#hO2MJH6^T4&r%%=pG2g46m!~Smm!j#-mzl}= zZPgEBQePJpB~;m5B%&k;P-Iq{1rw!3ktz{K{5z`K9)GX2=1lUT>`71|IPQv_Jr?@z zJL|;KgaCiTh9qUhp{0H#HrHQlOwerd*JRxDzqPPG08;(rHhVd9e6MGTHkC^!u++lN zXc7V(`bMwc(=VD~O!rNMwHnDv;0VL7sx7p1K`?!hbVfAbDrgHT^AQPK)0I_iQJXu= zWQ-m8s>GS+<jaWyxHUd=Z|$}h)QfCuixlTc`A!n%$4U0u0J((-IkoGC;Z#<N+xX{) z$;>ua4dS@Vh$g90Nn_;2QKiq8GDZ})t4n;w#)dB7u2K<Zt;S^(?!aEz7k#cBTSQ?a zW=(!Tacv6;q&P57CQgznSc}vxr5LRdnQkl4@nNsQ^7Z*bq<en2eM*lt$zL8y$d*{n znX$lK8U3}|k45+cciI3!%Fuk*^x-Y&LIV^(>%NOg$CO^2Qe3c=LL_JrnGYn!o(>Wp zcRK@wp;N{Eq%}9J4ND4+^Kh9)M+wCnMd(PxV@4iD!w4PX#;3+b<y07C3H=FQ5$fUY zeVI|T4s`p9`<h_qbzWVeT`hv~b_oTElv*!Rms}wdS*N%b+9FHBptWS<66w%Cj<r59 zW8Ma)%`E%m;$m6Qo0UCBq5S%faQ1oN$>BGN&~_+Z*pD*1h`X6}L^?)CZd%9Qx*JE@ zAIEe_Uz6(o1QWz3><zCvaF^qem!eo_k?O2-vj6W=2hb9yw;`I?RPFJNcjmV%xBXzY zk4GdyJPj&tkT#CMfu<Vs1Jz|MMlKK_H?Ewh)ky52Tc@hORYZTjEQ)-f0QIIET$eBx z5=5!WXMaGWqSEZ0$d5T?DONyI6CWbB*=iTN*ymhx|0DJim@E8vypu+5BnA`Cw>k## z@J}+ce&voAH)lI8gRHIj#SC=cOk%?WqZ5b?JjO08NGZ2bfu*^O&afMzU!}$fan2+y zoi`|2t=tpqfIQZ5aSRheehlRh5OeS8yR8_G6FHEiEK)5sQ~5`>s92ZGU+CXAvzs9h zR|D6lT~f5GpCfd*y-QJH|6(TJx12FqNKQc|2(-cN-g}2D2i<O)XTFy^BO4H3`|nrL z$y$5c#p`Da-?-mRxA3E~S`V#A7^-&g-17|;=<2U8eR^+T7Cu#g^ch9+h~^yL3`+8L z`nAr1pDwN(p5-TsVpT?O-U|<q`I!p>|EP$4$l?Y`EPt4Tg3ZU*^tI}dWl=zv-7Rw| zQ2;JH9Y<5e378o;X${~wMa4y^;h+;6Fd8;1;71#wZhp9fDCT*4V}0?YV%+wxUF>QI zav?}c8gy>~sW3wwG3{+>aS69_b{0X<Z&-GFkFeE?0yERxV+t&Yss&ZWWp^TJk%n!> z5H9J>sUxdW#SIjraSfASJ{B7;r@85Ue8brp%eX20Z>fT^^R5s19XUAK%wLNQVkuRh zh1VETR^e<vH;e8EK#>KkiI9GA;YQ5*#COKg(7;OU$D#E-O50#4Jqtb6^6wgsuc%TN z%+%5q6@Od?cpvgf_HZH_F#1zCM97d+Z5vJowopYzNrRF`_8PikTY+=vSoBpLf*s>@ z3AFU&f2}+|0&zDsHX2>(nuW>{S{g9P0x#Pjb}wC=8?Kv5SE~LP;yiYZ3*2$iQtuJT zm1)TR{uHhcjhW49-)w*&g0VUSg*CbVE_|;hiY;0*r7}quKURNCe=o)J#Zt03r=hg1 zJiU(jeMebG$Cnl}gOzpei74VVtwyuBy<aOuub(HD-~9dvy7_8j`Q1p6efT$_JVBcV zkf~34X{eFPLe9a`0T}|=CpI|>gQn<~HgGu#g0%F|S|;C{aLs5w+|5Q`R&j1TfA`s2 zIiXn~{|%Nh({KY;9Vk_5N3r~t1jfqPT2}}s1>bs<Y@$0Dpl^_oN!-6&{(I{Sd1%Rb zJr@CxkpMS%0na&47~0qu_MGT3^-**-;@U`-=;qY!J=Oo65{aE#iG}P{mN&RGTYckG zWZvV8T{Dzc;HdhMDsqvUlnj@{?Nn`YkLDRT=FKWDTQ$h?0^|mv6HvDx#CKZTz>r>I zR0D3Wz2?5`Mc;!|PQ%9wpU2Z*7oCuU+gcB;4p?acT4BCohjmBl@eyHiaY9|-8#9)3 zkWK;<7Z(wEy<mgik^mWmDK8Kr{;(M^Fq%C<k=i!5kK!12>*I@skSUl3Lc--22Qcze zwb~PMe(YmF+pUHnlgwqfv*KL%!0z6@tiEm^n~wBc_6FXsx%?>~0EY#|?|)Ph0li0~ zuJ3Rx@JGN9a6;xL-Ck01y0~R^&3V|bG4i@+RO!5YO#h`_RasLrop_;aJs7Bgq)wPG z5M>@89Occ0OBo-FOy33+6h}RA)<yDT!wV{<jw`#>%O*#YJ>S5aYP5`HBHt>e=Rae< zOTqLA4fI+@AQnBMT*-a1O-m<9XEtvs0yodGK+Cw8+7Q5{4Nf^Ss<(q-m;KCGRLEgr zrelIBiR-&PcbeX3O^fGU+vPQ)UenLtwVVAMf5`5KF7UBX@m5)XA`6NtadwuJ=87_p zLOh1Z;(-Z1LK!cL2K#Pi{3zP3{zw{@6TEqk%0ag@yz3OHvuRD~do;;t<bALn*?`Xw zxb4q?nUo)qB%Ik&&MZNu679JO=w0hQ6hECZv%$Vc3mZUQhHUxrm-^bMFghVdL4E$l zre<;c;!GhS@t$hY$bEx)EG!Z%Ab?!5#Rj6T(kz3faiW-01Ic+Xs=ma-{~>u<<xw+7 zUWG6%`^TRqnpiR9tuZGaK34<t;p<-O{$eL8KD%>Q+q|JB$UN^GvML<F(m<W}D~%CM z>d~K)I;{8;XU(2~mn*2ZJT;w-E)QE(uGwD4^Zdr{2i}xM(I7rY9+W&39*x_i(dhRB z_4}tO{|bzGGH=bque;LGC9-~eNQok*<>m{lh0MNcM=Js#NS{p9+~rk^L425}?<Vz3 zsWjY7m<G}sTi|FoIwl>j#;>2(gb>Ga#u_^a2@yM-iax@r{5u!kd;TYHiEyx~2J|$V zo8MH$CzB4F13EgU)EQDF)Ea|GcefDoSf6j#uU=WK+`YdD?mp5bVozY>$iIT<OSG@g z@u_*4TZ(7mY<e31H-=5`x(6lDL8f}UC%kIPSEBTKJU8^W$gu?6R03$|)spTR=wwD& zC2=BD<s;%G#o#|YYvS&W3giQ*&~WeI;3t8LF1;Sp_Kxz6@sIxh$}KJIF3`mBhag|N zOV6sR&ySAEs;d>Q_wK!y?C(yOuOrVUCzY1r55BQ)e}<aNV}x3&s(d^<v>Iet>x&cF zd-Lww7lp<O&HvUe^WULkz{nHdj~yZ%yea#pGXjn4vldv&|J0@`J94eHq+k^j3>#v6 zyWzB_<8#ob(|tb&;mmR;yQS9Ce@p($q(M=8<SVyO<2MqdhL0J8p#8omF4d)UlJ~V1 z(epClLEv6jGiy=ebLA2gXDx2$@m(PhD2>nrCD2RI{m53?ex!V2at(w#F+cv~hY4so zRUSUtOEvxl`m$gQX}TSQaCUo@KmWMqH*}qkM}?n{F)4vh!7LyDB^6I=;nVQ(%0pcj z-$_gKqxGTZcD`#d@I5nxvvnpZMXw4OjYXQ=MQ2LGn+lJT*4X5t%CV~?Gn?+!tVo;f zOKI8=IPxsM;_T}sy&*X-jzc#iZe!A0IYBfyehs`U#2iIK&~5vKIa-Tq2K9aQ-+But zm4tpzCnM1$_*%k(HLbw3LxN>#N)1NxhuT(GSu|~-p;HUQL!vY0J-C%4qf@7{ggX8{ zo)F!H^1~5(=VaB8{t^F0ybKxFBCKCr1D^gU<6UiXHDDS5dPa1BA|Re@?{s(+gr}YD z%&kYVSSb2yd0~aB3X16VXfAy9M?Y5V`ltT)X*=^Doz=ntvT1Ro?WcmCxoq@BQw|PF z79>MC<0uQ!f$1b1`&a?~?n@V`OUkpHlKU=kWZr(mJ$*kUq*H}Ne_`JcO$iZYTG^-k z*`tY&?I%Yg$KEFV;dwA?HRvzwcVgwwLyTKygw6%<W3`{!pcHX2Yby8p7cjvu>ip|! z^I=8A`0vduEgq8Du*IL?Oqi8NnmI;;d+B#)TD{uzy2;Od`OyNoSEGrUo1TXw@LB({ zrRZxqt6d*vO}CVRUhe0?lH!7k4EB55WABS%#5{$J^@fV{3jDX&r5%ZXIr_5K413Qx zl=r1iPdNsF!tc>ZX2gPpRBVBIOoC)fR70?=s8)GDZkB7d-9hd8>iHjI!oSukl7PC@ zg33}o``0@=cmDd-f0L)z{?=t;eMF0y6K9(wpo(Wv$8-^Jq#A7grWUINzGx~RY&+hH zAg2m=i?i0Hs=j=GR}wOO%6+w)fHhFtRCm=dUg}mdWRvwTrt0<?2}=17y;oH9M!^2} zph=y#4;y@o;eqmPo@g~gUE~6+1IcV|@9wv7;c>Nuwt==3GXXcB6JU3H-=YAusyPGj zQ<HvmJZl~Ed(^ER$k2$Sz9>tvFcADh@A|6<&0*W*HS7GYqE3|Ei(-xM)<Q-1^`QQA z&N2Lk%En~>VAX#d;rXlMYc2q9a!}-b9Si!XJc+cj0TcddKh%L5Y*o{FGmV)3_|vgB z->69bvka|OSr%H}psDmA9O<LbA)aNh{yPu16h!o0T_TkFR`A<o{LIW@t?A7lcb}a) z{(e(VvBy7U(`$~uh|UGQCh?Wf3=h_B{h8o7Q*0?JDfLDGjYed<Z0o&;f#>ANMbF93 z=JU3On4`eTM;B4OC})gn`EO#=DHY|m<$-H;*k7w@`T&GMvuFtbd$S}r25g7?(}W5L zmvG`N44e>{q%gCSCov!$MlKCgZ8LWu7T<;a$?kn65-VMz@H0drQR9n?XLb*<<U`$J z5T|nX4_s&Rr=`JWk@pL-5L(Z$vn%n@jApc6wDou`)Y%tvyQ;G`_W9S4+xi?y32}0c zzSXq@lv6aVRwR}XR&Nzyse|Y&7*?1ISlv<REdZ+1DUU|wGH8NZl{;npSA(oXFNg7# zo5Ednf_99oq1rLz=nO=BgzLeATBc@F3Uf_4p1WAyn3FkgJUiP_h7r*PFSt*G*5P8k zYv6^N@et~OIN$s4A(ivBs8hRBiUr$Su@ZEFTPk|Y(hv^PSFQLf;0K&?r>SIEE@9yn zMv+>zK+N&{fS}HP^hiVn3w99maH9~#w`_OQowfaS{+x%&8n3?<xk4`UNW9=p0iGO9 zYI&(&Y!cKW0TH}Pfl+#r`uR0nh(;U36_$jt!hg>-rh8s~kJmIuo<a84T-^Re^Q_F1 zdhqjVjiaaVGESps1Oa$h|8`m|U3R%>a0hz|mZvgTxATl<2ekPwPoz=U60hN>9pOf9 zDn9F*S+1v#9Xdhp5;oCslBEMaW7(4Dq^B*XPx)0OUs(x%>5W`o>!@;89x?UZY^vya zIr=AhT{oa1Ir_|0AIL{^@HVPs*YNyPIV}^w9`C$1*pzJvX+yMyOUP%21cdN=kGoqc z_nH%qV-lx!MsRCG{^&_TkhComt901gS11=t0r9a4UY)OVIjJ3J7DKF!{m;>(^l&nS z!vybnij)!4fnP0Bcw7znGbahZ@z)8Z4W!6)D?$K`kVQzA(6iJG5Vq+Z3qp&N-Vkp3 zyXyN?s~vjY{=DB|3vru_w~w}eGlvwJ{tID^$6iM3yq(Fx%$Z>8%+@7~!FQSBY9q7e z-v-|G=JQp9N~gPv)Je`TCed`rQkcIWChGp6$!;xfT7w(Dt0Na4J)b3`hYB*O`LA3Q zo!0oWvOfH3F!G!B2wQqoDh3K-1T!X_thNqZox$UrEhL6Oum(xX#0EuL^|vXQPsQeO z(D9LETNz_Y2YfEHK*l&NeEl@5vS~lhXxIIFSV|2izIUJ4>Yk(sMC2BPI*M$~&OcId zc|tkBSlw~mM`?U}nOGxwyT5SM>0Q1)v5|llOZw}JGJYVAUficNr4FWBD|}{deSix` z3sz0oT)4qnpV_H&Ey&W+k;o-Z?St>AL@h3(B^e6x7%fC^n^O_E;vLgBnRi|S`)+fZ zzP2{Mjy`q{U7RCJ<f3IVcT?5m9c*7Fr^A=cUN)%+4J{XZuLrpsWVI80eWVn5S|aGV zYy0=EwMq!3@`JaTL!*>_2M%yqg81R9eOx!HxL+Nf0Z<&AZ6h^hF8FK5tUu9iTOW>w z_KfX<-e#;I6*k3Wx=69p7kusH&bBiUS2!ff5!y{@k~%lQYjkrVuvbAqvF4Kx2QLRN zgNDJV?qyh8L_^rmJQGK_P4t}6$Z16Fm?R_+J;9|Ybh?S)c19``IaMT`j+91n48f1O zs_5!gC8)v?*GSyXnrux$3=6YWCo5-%hL!64J+Rf}lb%0qH801hwym}ZCrz1lRWWk6 zMIoBt<Az&Uc@Z7dP-KjN4;TJU&YlA~^1V#Vg)82PrgMmX&lXS~h<?kt@CN3ZH*c+w zA$%#QtWJL)Z^23EGg^eAqvJenhNZHL(qe8>L+|HGm_!<dhqo3E_3L7^ExG5Dd?WrL z6q6iOp7hm(ozRnJA5exjWFDLwot~zJu+-4>?oXJ-+Vpq#oh6p@j;jZeMT+OD8UrH2 zG?(YTFEU%*))WHVpLkE8C>WSSvU$i~<x~N*!miXJH%q1$-G7cZUru`LpX;vh4>1#? zM5Xbm(i-|)nZ;Av%Yhha9XL_w$_+!EXOQ{i{Cq{g9R%=iNd<6sm5-Y0voC|4{6i~z zimRad<jQIgZHeV-GU2#EQ(t;nk_y#ZU|k>Z$H~^zw6U8MyF_l0zsmh;zUpAZ<1zLf ziT7Ruzp=fI*8stGxgS@kP^|)yTH-Ln`>$396z-&QIYCB~Bh>FYEWIwAU7rtw6MJ3< zE5zK-vW-d#=Xc!o3ozUX%jI!V8Z?L-5(;p%WHf_7bl>X{eM#K<>YpyoQ%Ec<b`^7C zO=nEZR=G-?xN)7O`4Q1+(+DKxZd51K*V(c=zz|O$8f}?QLzH@neOL47YTWVB;-)+N z6U)f!Y6$+FwWr~_=JYH1L{3&0?<;w^{JCt<Xh>1D^g8uBPl9Gh@Ho4M!SiyH%BI`> z{X4PSr=y0qxoaNYo^@1Qwv`oxWAAhW70FRCPOoK;lgEzpicIJe7()^RwRjS#BHZDD zcYjv4y3~y@A+EO#xXRs*eH*lbM=;btg+G5@WJbg&Z1+*LH0~>@q^2&-GJd=nh&03Q z<3XeA4`!j9b8J>!hCANPxTAN_NzWaQ=l`WwE7csW^1Kzfg;$$9ou(;to>wd{UQVM= z*tcP}Sb{9Px+rSZos7qRq{YvDQR1Z@EmK|+P9-Ydc*<n&yv?s;Dc!HG4mLy^%+qzK zt>2UI&yO~=tYS_yB$g33>+fQH`P@cuG9hFYV9pf(h5|nIhjM(pfu1XKM?EG60LLyY zM^I)sb3nc5K|oph7UmezQ|Ua18N&WpKU#&eTp9sCR(WZ(I5Z1Jog-ewc}+nrVLb`I z@$%7(lJW?xC<FWN9=7Bh<VF?Mg4~aDRj%Gg{;}RqE3yDdNY#7I&l`5p6}-A1BS7-V zsJOMuu9lDQGn9!4-udGA-Xt=<^SKMwQOVJ>LG*#P^CjCHuDlpTvVTneSIKjxSQFBa zVcrZPPP9H><C!Q!dr502fiktsh|Gc|*4svh+pp-=1u$H}XJbNzH{Bb?TFdlTbf!as zT;{6Nm0-qZ;w1@^r1bE>;4Oo;BE-;=^@Y{H{T-<8_N(DnMCYw9*14U}J33Wvu~#fK z<t{nDOt{|7YZ1&^!b8e<@|ti5q%at9AKk9=m)O-Hp4j8|+l;>pn>Q7{dT+vr`nZ1t zy?q<;XHHopl0&36Isz7yj9<m189d4*DL*JPT2Xs}^8WzxKn=gJkNpH-A0K*@{xUNM zk)o|x=F`l`F5(vv>@T1_&-@U9?C|=uN8Uo(?j~CnHWAOx!r4AQ`CotQzB{k|@@GC_ zH$W<kyas#(2}aStf_hXFV5+2Tpv1n_gt&Haa?Jx*-g@(iZ$J6^cb|OYrMF(0&@rcq zP=cjkPR1b<sYoWJ3ZAk_4;Xo-GI|TfFUSHKs-(L?>QL}Cg`2tVp|Qh=NCiY7V~CN% zh1o$0mLQZ(&8Q4g8UZjP8%<ZUqfh8MRZ&4*SCjMSHv)5<93ZWpe|O`}-~Hi(kH7S# z&wlbt_uX*I5sV2;aMXcn0R&0V!2z2K*ONLpG-uR74qb~|uRQv~*`v3-KK<_VPd@hA z+ov|puusO5W7wK8g+QTjAu2)@5d|4M2>-y%BAf_ptV9H7H+Cb^OeE%++zkmZx1tE| z=E_6^!<%T(2>syW{};@^%nW*QF^6U%Gfl7rORkv!Hv$Pj%mgM^GtcC3RnzRLuP3W* z-)T-duOSsApspju#r9T^>FV)yRQ<!Ry!FV7|I3$dzxgl!<lSGpX&Mx(&Ws8S6|~5` zcT9mX9Bmm`fG;>UGR{f;)0Y-Mc<P0pKL6$$r{<cPdU9-K?a0D7n=iII^a<IR*xJ5Z zY`_ww-g8UZ!h84f=O}AwcND6T5`-Ke0Wy_pv}G8RGpV~=l0Fge%a(B+fU^+;JKqad z0>DOaXA(G53H^-)6u=b_z%^JPf)HIIBs#N;rbw18HI2^~T*Cz5AVQOs+TF!wXg3<1 zzw&7O%qOn?+`Tv7f8&v<paKXzBL#rq!g1cVTnQp)46;xO=&HJ{>Ytv+gAcy(-3Om| z>CLx#6ROu}JoawtZPjh)nCr#^TIhV%b<j!^F-%nzrc`9`NmUbhVsm$eWtfvGV1T(R zJCv;G(HKA^?BrmSdla0o1Osp*`bA<}Frjvg-CLtT#L5}WhRl^XIhABWRG5tWz^$Hp zecYe9_K<w_p4)%@(;vI*`1%;=+wE~Z?YrDrXqwP8E9ilwsA8;Q24)%W8qU;s%kbPQ zc;>~o9)IfD?ag!DBHn%Ux<khrB;>`$cy+v;3Cx#&>HeaOBiTRb(za^^wsdPjxq3=5 z0&|#|Bma{(9@-Br_OYJ;?Bm0ZBK4E|L?8gn3@8y*0py-iBC2igkRR=>@;NY=C;1XY z<nUcOK9S=W!d~8|!-)vLBt#^oR0m2asX_pCtB8SYAO?jR+X_q%dKz`4M){jRe&IV0 zJ^Q&kuKgRn`0-DDY)vrLZgG9hxrHhuz=2F0Q8gj3&fJsab5qn099+Bei`RYQuIrwB zZS!}&``kNcFKo|xswU2(&E8ujj8{ye!YG2sAq%3mqBw1uDzF1;7KuXOOuqB}m!p-- zkkbtA*rP;IE;v-8cr~WNlCfoOP-xTS1a}3qlaM({Fw5#jOw42{L79Y!$lThFvtiLG zgEaMZh?}S0S&5vxHr9da6$PDb7w2Bve*Wx(|KqnF{7b)b@2Bs&@nhG<2!w?7h#E1^ zd+XbJ#E2O>?=(X=R+V6yHu?60ICAXjyY4&j*lTb7<muB-Ki!{v^PSpc!g^rZ1Xy<M z4Tp~&i7(GN2UDWVnFJgl$u+{1G`nTX;>5zyEU7XqFU{eMz;I<yag2~C267T2hOmf$ zXgG+8%}gpO5;mjJD5dS3GXptisU#yaY6Y0FGM;$407K-^TWiUnmMw`J%*4$vu27lQ z0Ovep9bhu*Nf;u;qMBL6q=qUg18VfJgvy+%(6^GT!T4(TBR_n3`<Z8d|NlI&`gi@M zU;E5WsCtlL0yz4LY|))ttq*6=*^Iekn{Ybg(O2-lefLN2Y`3Sj+mr%NuWaH9Y22Q* z?yf1J%SahXt<OlAQlh?R&u*<-g7)UgJ+Y~0B_9$*I70%!&H@A?Hzj9tN=^tAiD7Ob zgi`cWAFR}vKnA@CAP!@cX0nW#AYuq!l&pfVLjm&PNVdV)R|o*R69%P!3XlpMFD?xn z2vr!3I7m`6fa>6NZ5C#IzkdC-DWVQIaeQ?#+nR<tvQxJ?9=D&o>$<<>tM}Y}+mUsE zwI8`a*)=j(EX8r8<%Sh~Mp!^LK@Rl5TMPWh-+u6s7f-(S(w60hnxkmVTdLy3b4;^t zHIC*RXS(@zQ={#+9T6&wNUmfCQ}e894uvLof&nnn?Cx;olGOw5ATok1<*k$u+?@zJ zJrgSo6=np1uobUoj_^)Z)j%PrYLL)DBg7SxQHbD(pgeNYjF`2js;MH+`dJ+j#47Y8 znS7p8$J?i_9nXH{ft$bf>AP>b;_!O(F%kixu9TovNEzACIE1WnP1(;|=mIEWqsRB3 z!EgWg*=JrnHSZ}lYjqe`E8`1`jkW_K#tlQ~fhPv;fEbZ;<`{F%Y^4(d9!`n4#Id_< zDY#UkbLTm`&-?(G83{47x|iL}%%vh@S)qz@D8dS{C#zM$0&HxyX4W*LMc0WqGq-J9 zH(*3+=YeHEuGq(Z0<e#dBna;hC;aK~J<lY3h`<m51Fk@Z^h7N~D59Q@j$W<v#Y4}& z`|iuH-gDa(U;LHNedfl|TZ)4X1lY<D#zcq_H)m%mvSwU2EYUH~izbW?tmF3e)!VN9 z<aZx``$rG`^qsTkT@I{I4@QJ-7=j>C&dy#3;fjM8Ecwq%foM0@CjtZmxgCa~`b3vZ z%jxbqKxE6*OyR-~5J-)g*vYggEHa3p3}H7-8neQ)dg{yUfUvMh9f-_LNqL-OZJ;w6 zw-@O@`QLx|qbFYY@&osM{+=tZI|R>Y6l={Sj%sL!)PcPoRRFSfn;Tne(<@W&u<hfu zeEEi}Z$5G5V+S{${^`3fKl4h}o~v|TbK??)(W!N+RcOF2ED%O8O_FoAoQc?#ORe2Z ztq8mq-E=pGI%RknAO>I#CMKc)CXhH2mB@4tXb<qG!yN9#y9!1AUo$L26D+wqJHyS1 z;WTiu-MR4fjfQzy4hYG$BFmn8l9~i0?3vLsz=)M&((&qMTs$}H|LOnafBMEJZu_mT z+;Ph~wxGe<+-@HpAM9Z#XY+0{-UOaLkMI0+@q0gbWQLgO5RJn)Gz`goUMv<^%mXv$ z)_e0VQPPW{e<ID4N&u>Ey;*{1cyhQ{rloHx5tBJ6vXxFu;pm$Y(b74U;lBh!&rx7t zTka@07s8i8F@T-O!2{`#3E(06r@D}T!f2Y!0M9wW6fwk69Y+mKN3+=m^n6x5ege}9 zTN^J;t7<i19Ql@8j(zcycRp~}701_5p+jDbq$VnLd8CD90wNHj!?)30(9}`|uD5{i zKYa4P|K=aR+IMF!^w@4tjRg^&$RIr<0m&$+YoERA9W8pet5yVevte|{2ChH5!VRY6 z>aJ|=up*JP#|y>C;luzO3W$*z3B1sL7$762Wz+2a4r610QBY)#dDi!>y0ge=0w1ee zVwFnz?t-A3G&#@D*y6&C#}D5B$y@)@k6(A=k@1y>)&fB23C>`mFwZ@t3K0ZkAcJRG z%?y3SyBW{?bn(p}J^B6D&z+~Wy1sfc8MWQq&>MR9P8~`BC6EFm`~{Hz|Fragi2VIF z+NIKAc+dQsg8-s^{?9)46M%hu6u|Gt*kRvYu|2V-6AVl7<7KR`K=G=<hZ2kcCCK1e zrk)d}%rIun?R46#tRB>j>AUZ~`Fjt(`N-RU_&;8={`dXOpKcaduW>x00_J&h<hnW; zsX{ZWkr`LctQMKa5osMqzI4R{cOH23sn>q^_^U6x^Rm<7$@B`;lLbc(F?Y<lb0Rkr zGx#qiXH?9?m@{#JICMv&!pPa#U3b)k7=U~Euw?m(nmWjdjD|@{5EERSn840LZq8n+ zw3>TQJ>^V6iHLLL$eE!c7AmSH>XI|s`J%JchkknI#aF)l@T1rM>KE?*^gU}=)G$CC zO$>Ep)82a(j)9xC)d+_KjM#vD5I8m(Uw7}JFI;)(i7O{3Uw!7-m@4E&RuQZpIWaxB zz1W(;VX%RY5MpVwyBb+`WoR%{SOO<#CKi~vX0VWH*%|Bxz*#^94v+wnflB^<(LXc) zX`#P)v0{K<T&yUzC-&^Bu<T~$C2VCMayBCn3LA?FOwgWKC{*A`v8NDOf`_1^+BtG7 zl7&NKAs|qSd9z99k^h@VfBN*h&;C<?*I#)}#ESD|yt;Yj6ip9>$=chF|MB57zx~Kd zZ*9j;4#GyvRb#@v<-YH72hRxP^X<@g_9si`q{vDsA!nGfsd<JfyoY7L9g4jP0EEQJ zQAAD+>ch}86U<%lOTwAF#Qbz|-Ppk(C$KXBK>-m4!5@bd!dU>9+JAj<MJU!)3?!UM ziAbVIB}SZDXPLwmUm5A@2-E@H%QxR}^T%#l`P5w>|MWdKotUBqqMLXI2o%&Q^{r*C zt0-0Fgalpyt;Hbdfp0%{;s5;ON1lKE>`ZBEs|9M%I@>syOUj%Q+noE_Qm2^rHgB!l z0=BRqx9E{f+}$-7x<B0AGntls$Z#_CrR)#()UX{O$d3Mu!-v@zA`omD!4`d_;*0D| zWbaLAOPO4XEpWF{QKS%B=9y|XLx@~gwwSN4PY(!%#XHluee1RBU-{G>pS}IYTPIai zz>pQ4F<=rb2!eMNQHCtQ=M5c01vA0JZ}bm7{LEwDd-mkn)K0GolY_Qhn^HxSSb-_J zuo1E#u`yit6rOwu{J#&P_f)%Rxy3L2MC>AVH@Y*79K0X??_)m!*vCf&uk`-Xx%nmX zXO7F^1ceVgAM9XhOGOxNQN+DJT-d#G5=@aSsdlE$#E!JNIp5N>D$V+#>$}C)OYhE~ zdh?|xUw`AT`Hj#2#sep6pff)bRwDY1?akHcfnM3bb+xn_?#$9WR*S2``tie~tG{sT zO;;X$^!ZbdzkK1PlW%2DA*?pdfgB>#Jt-)<IDQ^zFPMqQh`|gKaE9$(qTHygEh#__ zGBYft)18)eL?;G%xHv14SP0|}5<p$u6rPjjj*<*j$dLQaRYYSzLqtu{VFa33kD6+A ztK0b5r0EN9zW&JbH-G6fx8HjG>R|~r0(**TV`|1y4GE$;k7$*~jLn?RMxNa;I&$N+ zxbwtyuf8-svLZFGVV;2#$B!~S+l(qQ*BnyPoZQ%10t0>DyE2#{f}%pB0h&B1adrx1 z*(np4OdT@lCzi=kl0t~`fdzC42AaX;*duy7i~*EM0C#dLA)R@KXE*cmaj;;}&Mb@! z2bi4TWKPb)YAzX`Sp!MbEGep69f^g70=$koidy-F?)+6Z-Dc<GlP8~S1py+N(5KbO zYHr2~obU0}+wZ=7ehVwttRKE{cBTz2c;4p4R@ZO4FCfP3+|Ib~DP`_6G$Si=vYbfO zT~QS1m%5YWMwH1h_$!k;O5O;V!iZoFXE*<)r}OC|q&Vi40>87AnAY7ORCf7rTRuA` z2*3ms{!cTc0VF9aaZ$!JsRCC*Vw(HuXk2lKKEL6_^k9t`@z?y?eP8<Y{rBJbu`8yd z0C=|4w#_KOt)F$6G!`N^6~i3pVXfiZEXhiJw#8F#_|L?YzW>C_XBOyqwcXz4(cwTf zrxokWQ_I?u_Lh`Q%{sFd+9yj%0W-I(o>+~Ff1hQTI*d%+mp0OFa4p%CxnocFXm9J) zoi5j_EFum759f-Dz@8uUVG>@wL=O?f8R&=*gEWL5OyWWMYKpOK)&04fj@Dnj=W}2C z#7$S#9CQ{sLQf_^YBVvZm(;^XG4$v*Ql8PM5A|8#@z?R#OK<+c4}Y|Ab{^*S^x)MJ z4{mHF>f7mfRlQ?27I!jrWI_VVr4!?Y`uP98bcFA{TwJR7xmS^t0lzd$5n3AHEM<E4 z2|)YUPXPAu5diz{%H<D{qrd=Ku9PB`0aCV<zyJk<Bsk$igh3y&ym=ppE-(j4?bapD zT{km|Am-_K{XkV6fAid{|JHx=?eG2I;BS2TjxXMJ6{fUGvNk=k(I*0hfS$n$O9;YE zGo9MPa6Y2Bh9_6vbnxyQ4*v9o_R$y5{P@|oHnr2PZ4p8ht>V;ErtI{=LDC?{<g^5s zKupZ$0=6<h=x}l-h?iC4C4I<u%U9(JWf|lsf!AOv9GpwA!A@?-;!X-^Pnu25oZ)1K zq&<STMYwA+NFy8q3p$^5eKndi2PSWAo%t_+|3^Q3@r6&^{WE3N>u$O7@a=1HrHTun zn`7i?0z8&txJ)ssA`xJ=-S)E9jBdUDsOJr;!nCet30JN~o1JaOYs9q?SJ}HZQ!>r& zP7HF5uE7iU#u%(%hAUh^1|=}Lvy%cw=0*%6X92UJSmzc^OWKRF^Z&Gb%uyD&0|r-z z0=_)zZK(iAa09@*1Kw=J1acDxyBUzFysR0kX%tHYE`mxNLj{XjA|kX7Z@zo#sw1mM z$2U7;OZ|8?!TB>-odS{p1Xzrtwe^Kmo12@yaO$k;`=GgowVJzjZv8xFlU_Be<y3rU z-7<N0?cEh-WSK2fnMNf86&gCj8KhL`I&flfFkIaOex8Ba<%|v*P^L1($iRf5Hz(xg zX2X0u$&dhu478O(_u>lNuvFj*Bvn%z!JtMtR#G<-Vi>!vMw7fv>Fk|X9z9m!V2yw1 zZ~4vZ4;~HRYzs{^j&(I2Yqt<^wR&*oWMD&|kqxdGCFX9We&t>KxBu&t-}&)#3!3!R zfvuEGXtZ+7=NE!$Zd+{=*^EOb>#`<-sdr=@tanXNAQ!2~9knin7wc#xn0hWX6E_7w zt^nXW*2@aeCGjLL<4od`(~<~C_6}Sz2O?7{TZS|89y?n|KwO(@$9><5=z-CM#Yua% z*=pzy)#={ruK&utH{5+iwE|R_MF9|%;Zl-XWQS`Kw(a?LvvMHDkbuYE#Sfl8{l`ze z@$AcQs@XKGS5<Z4{A^CSZVpyK()P(XBDNMZC(b?;WyX#KgkgN#QF3f|5YhiTaX%52 zJ9}+pirJhI?1Qa>dFLu=E{@<32grH91+b6(1YjTkpFz2X=p_^&2f_CUcx%~maUp!T zU<A<e0;8%ayNVbg`xp_;nq>BQzsTL(jYY<5C$zor@Z)bk`{=Vj`q=e<<<~!V|E)(h zG7dG7fY#tWf<puj<ebDY=1RaB3q@?WK6Gny&y82zeC5F>-#q)&n`d7?yOC_lqsD8q zXhwKnFf*uNH(>H%dmwjME=EX1=1k=><>o|QW`8kMZ4Cn)1NBMZ3U#o!m14OY84-b; zw0G;ut}zX6isCa=#t=Dcn+-k5Jj58JaSn+snX6V9AGWr7_Kn%g?>zqCqpyAPj_bet ziM#H+ran?(+91%9r(DuVBVqxZ8G&@(_T#2%H@gvJ!eNbZ+ZFiiT{k@O;>p%1DcppF z0|aD!wpi7wYRawx6ElG(WF}8+0?J?}?cte3$kfP~#0W%UB*Xy{n8=yfxy%RreASV? zVS(>uXe@PbVFO7B4lj{^Vqd1mER;+00Vu^qEvyf~Vd4%$Phc`*M|5pL;uX9mnFu&+ zZJe+BjowSQCt&r!h4W`{xB+n#ber2cpF`#bLPxqt?V_!6ir$U1N8k4Imcg1-bM~xe z3M-=v-M~W8Ov6SOxVsvemq5HIjk;c3;5(r|lt=&r*)L(w=X>sQST+<1gNcQ~9JHfO z%-}Gv|D%AZ6#khS4mC^dL{&2aJ4cqv9VzRgO?gDNHqxt(Hdh?H;Ws{a=M^=AZeMlq z5To7No{!?Vsiy!;p%hr0h=sU?bxuZO0Gq%|r}6Sz=|B0ee|MH9ZGH6IR+nb;@qsm| zXzRl1Dz}<ldvjG#Yuaa><($A~nt_a*Bq8=dAK4?Z71CI-@^C0jotBzEZVqMNYYT2e z`F{x`4AeC)EvBIl<|Ir6DiC5G+F35R3|^w#hz*BLCyl$Ot#12`+7`#A@rw0u$2CXp zzTx=&x2&xL;?`}Q4HcwW%>osuLo?K!$PucJ$X7-iz}qc;`1FO}`QbAUKKJ(dHlQ9I zT01a1edcFNplWh>Qa7&c_CjZjK$HkGM>kA?aLot+zh@50{VzZ^x~vZ?AD|TM?|H}^ z>O>Cn!u<1n4$waK6M%jEe*^ShcTabqEak2Nw%5Sr!w4rK1AIx}L?X&e7Nn24Pbtl! zlRzbS6(Q{XnX_Z&V@Ge1Ko7ri_9y?&w;s6r=C6PDuKRAOj*M_X&{T+kAOY5ES_uc> zW?fggg~*UR@lX?f<DT&~SB<ZDWAf;0Z@#(Jp6@TrQ_d3nPe}lnm$f{CFS)0}WN>EX z08(Nn7!_iA;hA`81vnspeURAea^;d~W0<-rX>XeJPasULPRvduq)OfcIRGLeS#lM( z$i_#HRdKShG4qWiqXR3|39|IgYZt!x#&bV?@Ws1szw(Qpy7lfmj;+>^Zhl2AQwR`p z=C0Q&Ff}#Tk$?_}<4NwjAi6H`x)uIg{<8c3_aD9W%IU@HZ@#;^Idg<qRgj>Rg@ja9 z1y-5>$ubKIoY)l1(9A+mAt+o26%mxZ8i@mhtu$1e2~_Y4dS&ch+LtY*!IJ@Qa1??N zKrqps;D$kK$l2fl3=qT1=jG-Gw!*1L&){rGN}W?6V@+zUYqxRyhJ(_g%DzTejo8>+ ztW-2Qa&!Y>mQe>BAY55jTjsOAQ@C1}`Yl^5TvKIvl5?GlGP_%LS93Gij_+(DQ?^8^ zY+AxpP?^pxVW&8;ArsgMOB)IW;%@n$431v}v;;&P1_TlZ^3tA}iBQy&42Ap?21a`o ziUtvfC|q-Bm?8<!+ZIA25kW|)?X+E6pI(1>{PmArarbqHZn^sKwd-*NgIO)+tsNX6 z1~_%t?$US?rHKl>efsT#2M<?LIq??o<~Dx#EPh7!|Ka1$VYJ%MFVJXo;EGk9&$l<; zL{2rFvS}t$B6g>)*G<?Qf@I`s6&zXX4&x4!Mdc(Kl8XADK*_v_RIz(W&zIIwJ~;Ok z<<q^SKJ1v=$;Bm<odcqh(*jHbct^$!1w}KUtis931GYjl8&9W{M*VC=-4%`Acg@Pj zuRip}du~1~2*7-PzUHvLddR>hH_uO2g#jW%$b#sI9dH5IP<;2X`M19R<g>4y-k4d= z^+*N1UO00Si}qkOI&kRV1?t{CeX@?#kt+^w%+Hx5=DDILM^w~C#32(@E)zodi*t{0 zz-iAd2AG+%3@sQUvf?h{JLA6$n1g*kaM;Iw0<ez{KL~(<)X2&Tz+9O8#7^d9MrI7C z3qTH8TF&HRgMtC<D0dXj*Z~i>zYrMkomX=LEi(}E!QEyFHo!qn4EXZmxjUD<d%Hva z0T^I~8>s`zOakNJEL;UA*sSjtGs|&C2V;{L{e|-#RZZr@t<Qe<kvG2o_zPeC<Sk$P z#0{Un>%h?n^AxPDMH;CT9GqhWU`Q?cMd12CJ=Pv~9_AYlAH4nMgAc#><|EI)^y)kB zR<k;q14M3MFWqFL=s@KTz&I+S=Ma66`(Y05=2YbT*$oab!I{W~+}#wAB?X8<fUEBo zQ)%y~U@(9{2J^yTC3AOjcUMzOPV81{knU<u8rTA}5SUc6#?@wi_MN#$9vz&l9dzYx zZlnZldf_)tZN7H$u^&J2<R?CH^H;xo{{z<_*Z=?sAXQyeHNn(Un`W_|wAznDmAjtR zf*7{*Cr?y2{MMB}cn;tBe*5&xTicy^lvYWJ;Y3WrPz4DjJ9r@3NOt4o(wmWsONpAY z6~?(!aE?YnLjV(tkwrrk5+ep!_X^#@c8^0`+KK@{UN*6ly2G`oxLEN9c4s%38Vq2k z<>$f<H;@B^i>+G)ad(Cbf*~Y<xOC<L252vt;`-#wTkjrUm8*|lJ=;cG<M8Up-R9^O zaT<_;c9GAV-pGX5tmU>9%|aw1L3>Y0+ga+>IjE_tLVI|ECRh(uXeLW!MT1h8hm2ua zh<0*<GKrHJoKe8A610+`U}>4;1ae?!X8~RTY{UXZfioMk2SZZ0@i0m3#DF-&5emhH zIFvLE!Vn?~Bo#?DOi?qhOvWkC1E<QnI?S&-Slxf`jbFb1w)?M(hXoCgyP29!>I$8a z)NsxQj~LgnHEeG$VkPTGt~l3287DXJ!zZ@B_26@lzkKp+&lsOjAxvwxbnfKa=oXV0 z>x$Z~c^OS{bj)NlgU%soR5#uB!c_@Enpq2RN}V|GB!}h>g(}0{bodTlgb}eb2nKhs zEmI|e_+VwuRCW>VPDs;5uoW|1SAtOpLNIf71&jepC2!!R3&4?sE8T26%}!mlVxPS8 ziqG71^uBA>uN_ISd9)Nb)Z@k>UEdkP%Ibj&X*0w~poCDO|9571^$h-}-+%P^*Dt*C z)<&O2JX)VbyDCZ}_2|ILIMe3Y3m3SRhB@l_jWdWWF774c+r4Tq!HbR%!^+|3%degf zbbMoId9p1p0i-ZCQgU)Quxx(57dzJjT8>lja=~!x45nh-Zs5zEL#W(Zc@+q#P@<9# zJWC^Uf-)d(`$GWx*iQiV@eu&2adPfK$<e!I=D=h^8Un{AX!J$jY6v5#Xxmp}O)csX zWy>+JlO$Y3Mjc`mt8UQ>M|a(!2pd351-5(u!0_l$k|uI4^6i5$S+S`tmkI#`MnufQ z?8F*_a4lMUs1O|i&SXvmVqps6gx)-ZgkYc!AYcqMKuW6a!qoP?xRPe-`fLX3D0rj9 z8S}1#hYZr*RD`N2aou|NKY#zJ??3j`r#^PgU;5?y@4a<8k{GhB1{?q@cMfAWiouM9 znaS2G%D@b`Z;FrKbJcI$eAUB`J@LdNj~o_ahX{FI5Sd8R0m2xWP9)5<Ubv&0uy$y- zg;+_3=u!-Pami|`L~Lq|;2@~&RHpZ;xt2({gseNktdj!@B8LI49<p-&8MGy1rUYeC z5{Uqe3`Ut<)rdpRN}fc7;H+Ccw@ek05D6+uBt&c3s~691zVhuCzw^YI>kf_o{=ec& zw;o?VdI)0R4l5BWfu|Ah`B(_<Qct(%^QH<1Mj&7UTzxCPa^uH-{QT|TdgO(lyzow& zX*8M67YRfLS4~Vt6^jR_5HXejqds|SzHsx@C-hxaF}uUXC}wF)Dufy(LMOOYE)_yR zAm)Hw7~t$+GJ;SMsj&<L5Qv!rX>Y2@EQ>igTwM%qPG*4FAkH#01emfr5tt+x7+#EQ zK_oyBhb|U~8Dd(bgrsjWyT*QjdU{}yx{ZzP)qn#Ly;~p%>Hw?&rxjaV=k*h5JKBP^ z>qD2M1$UlQ%`(VMH0MOFFm>&r37W_fo5B*Ak{8=Q)gj+Ri7<@-h7$|}QHPA60K)^J zq^=T;jnyYj4F#O4Ks}TM3=u}^*{q78fo?gn#K4(jwqQ9UCvxLnIV-VKbPYfS9z(`} zxI2Wnl4d2&7c*Crx~WGiPTU)esMl`VNR>C&c>bk(ul=jO{>eM9oucp71Ps72swUz{ zDLa|Os)L$H26_ODdOA|zWWw9PAAH}x^SvLv^!mGPj*1whf>Sr^;Oe;}bx}!un{p2| zGKvJ(&NKy2aHgJh(Zy_<bM6hMr?)QjjCpL`I;K$S#9r$0<|QCCU4B(v0A$)3LS>LR zv6m-OAPOuMAfQNy;ONX{=2x87#-q)y<(0L1eRWf}KxtZ6A@CNkP8dZ+zoA-<Mpa7~ z5mqm}aYf(XdTjbLSFg|CHaP^;sv{)f*k{ikf<yqBdLbtW$LU#1odpWA?RfG<{lf>J zeeBsc-agx^H%b#ChiSzW!0?pa=WWu|WK<sAnB2svqPBsdnbf&`tLwn4$ciAa-m-8D zpA#**4yZ;|&8bH&#@jGQ3JeaMoYk@=H}k#Cjinqi_L`;)ZsPD|o)2dzg9^>aVhmoK zMh1szQDR|n!ZHED5b+bkJu(-%(#mw)R6)1<Dptw*J|`tl3}rZ5j{6zFKK2uUeS8$a z%;1Xv7kf$ZrJD~h456~Q5jn(m37ZCZX&C_JA$Dkah)hsm4EXSLE5FN`&54-JGdsH* z3@EB9aPl493L@T7xifO2rT(Dzedf?>3ulxvm$SJsQ7MWU4Fi~7O4}IZ^u^yh*Z?L5 z$W0k=59Z`U2ciH5CBUPC4qkc7Z1dFb|M-QcUU=n8_uuv_U%2<SYnlkC`G}=P6mk&- z8)>$FKB`6vuOO=+1&&Q{<tOg=+_lHY!)`Q?f)vX#pv`B~Frv}gEW#nkk@GyHq+KF5 zPep%5;c@VygfPS@v$Ml|r=aKtma_hyWB`S+0v`AWJL)t>ZpB46Gb<^W161KmOb&7; z;s957A!K1^=B4PR6*_XLYllFhaOBXa=2M%Ty8fT~m;RH#{A&+<?JJ+T@-Ws$7=e3m zyS*{3StNi0gh*<2N8e9EozvVnUJ>H2-XR~m^|l{AbL;PZ@3DuTdSz6vqH3%eXB~B2 zm$NZr)Kt8%+;?5CSpkX=P#q<Xb5@wMvmrQ@;$ea_0y~0JaAIO%Ht@g&;=S75gkcNW z2by7!QQ>sJ$c;=u1Kpe4mp|xi<;9gC3ImssfeP%##uQ1FDH|t1;b3<-b%tyqBfAT0 zd11{I0Fq^B(oyIrm`8S}Y@CgHLUwb@UgTwrJP*8oPp}@ANqcrDOE7hJcDIt255wa_ z1cg$Gy+nnEmVa;AURI2Uzm?0FC<B1N0T;M9xKP^4j<yg~$&jgpVw_0`6r`D|2|S`4 z6-F#kDw@w`Yex^)^=NZ*duuTpkH;(HinODCd!mc`@4WJ_`1&V5dGol*ecfJIZ$`;m zH}RBXJpw=>ke~+=yoa?w3l4w-XD{G|Q}{2x_001pw@;ni$ks52oUHHXmbDI%b23e3 zNZQq0&9od;z%V(T$rMG(6WOf?;7~J54y6Pp2k($u*bQ*FI&5c91b~C#1LtH}uiu^b zB^Kh~6v09gO3X?@SRzYUv`MOQ4_eH(QA;zbV%jj%(x(L!P=OneJJ5E%(oX&*pS<g{ zci(j7I#wMGVI=IT^S*6HQw5*f-V%|?XbRx%?aj^5psAJd@;UtRk6-!DL(jbU`h_+L z!YYiAm2wU_LDfA2?v=Y&Vy+-_adTrPi{v9X$P^~Ntm}hNM;;oz0%jh*edZxBIR|26 zc6N7X%Wf7zD6JG15;ymvkwBXAu4Ly$_+Ht5cM$d>rQ`@C*@D6hdz>hZmb5Bh7*<(+ z6&MHvMlrlpm>bNEoM3<gc|WSy$9@8^kB<Oc2o;kvMMe~mgBcJD0*Fae3C?N+_+AEd zStk$;cQ1*Ls;Uwsb4^*C$=qOrvn^XT&*qs--OQ{6o-{<HUS7#)cxfl%VGRS^6(KTn zMPiYAaWGTS&VeyRK!qQ_)Om31ie=*xn34}|30Qf9${2Vf1R{5GCx|&Y*@cZ+q*$*W z-AdcP_x;Cz`s|CJz5kxi-FN3LSMdlTID%oyG9|>2Qa`giBY+Xqp%A0E)`Wvs9kCwK z!6-2%D+qu%)~BO-W?Su+F90_*BTcJWx3~f2j)+|YX;GaH5Fs+6#7HFB&=EPv3~t77 zU+y!<60~#29kx^nH7_vF?&|JlL<X1=8NhCE5;&O|n2d#-jfpuB2NIB(djM%}O$i)C zVjRUPv#9EP(N#S8um8{Q{_#(q`Pvsg^OaBEe&cZ@!g%#?GIMCx&d1{>R-!pIwK(8$ zJh!>E^QIo%EY*pR(S0ZGeeo;z{Ey%I$un=yUOv5*Wipx`tZJEWZT8z6^;$#0L(|kY zCMV6Fb5_rmJ9vWk@GRN~pH-?xp|94BL@bg7=3r312z)U1`dj}TH*5Hw4w#{Y`$P^N zO7ew@J&>2+Vuj9SW>gsV&c1XTAakdsB{T+x_z;&YMM!p@Y?@rND|=S6?4C>&TCB>{ zRef-w%7vuFI|XUCU5#G{0A_cC7tK!|nCOF)4cXpj5<U>a%M%FYU?URFWNAz=ab5ND z+hODykOQ-O@0b%OmWd+@M+!WiOt<H=S(m5N)#(aryD77Ct31E;==iVw^)LU*XRoM% zHeocX7}X{K(}_sxQ`!I4&SgAG?IOpR!zcqSa6aLM*YLd`KJ&wepFX+mTggl*#+t}- zGBT@0tnb`1at}@Fi7Z)8umUGnS7l3ZWfanvxfz3CYF75P0tC$iKit*#82LE?uuGG4 z22jXuL=0zunS~`nB2jP&kO-*|BSJ)|T<Yq;!MPz(2;)h;Rz+-i+pdmB3>XLqV6DIo z)Pz;v{Hq?g;^QAberyd1=n^!d1*J^W(Q2C(%)CBbNx+#dx5k*R67c97_JfCi`qXo; zzj=1PId|oXs!BMJF<jXtxCVj%fc0z)5)&d0!6|qMK{!}8fV~{Wgk2cGFq9zNVP0~r z5CkG3#0DWUCT1c=*Dc@*&2UvycyaB`5-WEl+QZ~$DoK_U;a<|>$iXr!6a;}aa1MlF z<0UBsVHeAxb%=n34GO;qWtb2Ehg&q=4=nbvp8)LRLk~4L0+0=2U?PDFn++P>26iTA zz&}VHfi4sJAfnv$mXh|Z=iYK}mdO%n5^|6a9ya8@Y$Y%eoG)%tm=hC0oY3bUCdA^z zASwBUi@*hL?#Xk20;&$Ek%$gee|2}~p@25vJ$CUsvhGy)56GZIs%lQ8MC7E-(OKOD zEMT`lol`wo8BY#&vop`UdGf7uKl$-fuYLO7TkpB!hP$qn6~VcLS<VM*o>UXhGX^+N z1XoV8)OpS!)Jz@$kT0zl1VCgQXk>!LmPv}EM66Cm6^*Bqw@Hkckjaw(ymSjzrn29_ zFj8{Kf`LanEFi$?vR(iIZazF_16&Q}LsqcNPaFWN8I!QPz*L<;tZXDE<|amF&f=y@ zq&-=sp$Z{}stO>PCm*d%Ub`^+kN$_>``(Wq`}Hq>`iu8of8_xjjNE`b)RjX>Bp4I7 z+L6>_9)(88I_SKnYI10N{UN&X%KN|l==}E{dhYqRH@Evu<$646_~3YZeg;m#A~bUA zsn@ImsSq2Whqtg9lSa!mR6&{HV3di;(&M@W40pgBe7TFQFDEW{wiN7^7~NeBqyXT$ zWYDma!MU)Wy>M$hJ2Sw}nV7*`4oK`2EHASi-5ZmXw7A63t_B@eyqG$}OciQSvz*A) z)u0KQ2N6{_FA1<MGnPwI#HDPO1Loxq9lkl{>}GBtL&@Gh0Pf5EChSTehO=@uVK|U# z<OpSP07)prTK24*LjYH9L?EWXQnPfqs<`G}XPZsGao6>SzHry=zxkz)pO|6=Q0;`A zP-jrDR+E(|8m>@FDGO0gG4rSe-tO@5bDQ7#;j@oF{pR_(hib~TO(d(jJ5t|UuYoy= zblQ1NqzX;sJ*-DAR=)0KzgZ7c@@z0FJ4Dr)VWkIP82Ty>6kS>!^24Qx@+EyGCUPq4 z0wNSUFD4e3z!IFJhYF#B)R2lKBGwkFEn;uRAaiI14c1X^o8i+GAV44_4qL7HiZ!|C zy1R%p*(_yhq}j<j7}ms?At$%C<}~JM*mS(Lf&cvvpMB}g(=WX8#@P!qMeSkCGK#2D zn_R&;L$j(v)m@#e(@ZexgNk&a2f@rD3rl5ymt1qNjIOymSrIw_z%Jw<>beExo_cmo znLAi#nn=5<idux{oTRAl<YWfzJJ51gg=pxLIb1u4!WkjJ4dovJ7Rj<}GVPHBDOx|b zi-Sr420bN!hNhUSV<!P%X7}u709(;5^_`5E_d|<)>?Z*G_^?BP>})RCD68%@;u(|; z%-NiX*q8ITbh&v-2^7hhxD?LW1Caz)WmFY;W-?J;Y%WUm5w4~7U(Wq0r9rdB2M!TP zKosj5EKI?ei6Tqn7(7bP%A~?z0SlS12qUnY4K-0{$uDGwLIeoP9Rn50i@IjZNsORI zrHHELrbCjz3OBfri!+1RNtok>jrPKs^D?Rr9KEf#{MhT~UOe^iPhNWWfxB+M=f=ag z9LMod=z(t0O=INT2Tv4ZAYQG4fdLiTDWFEDl7pcpjH#d4>~K}BPOHt1w`SR@rWvoL z3kD*i3`(E`CXj*PrZBSXAaEv-kOy}an4#2<3zbQSk81djm%n~zx>^T;7bwh(0+|6G zMNnR#gi|n3VE{RZAO_cqw+>O52-O?{h%D!9N-2jB5GBj%=Ju?r)(#v#_R9I$zxUsL z^P!(!`?XKsb;IGw%~!5nwc4l|EHeW@Zo8%m<Osx&5!gY<^KEVY)`KfYzc7B_u6uv- za{A8CW&@soeIv2d2QWH-Y`Jr^;9iMorHZ3bePMRqC_2=wadLA`DoTP7-5JC#>`Wws zQ?C;)=la+(X*5E(R5Z|sM|T~UP!@8sQYqIGGJ}KwDmDNhf)>+OHZq7Co2s+=#e2*6 z$cX4YjvT{y48VXEzJAF!EUQ_uD=uvWw>%6e!(f@rToW`8`ah;*3O6kE>B-!OY5Pm; z^WX{ukd;4&V1O;VNyJ3#MvlwDy9t002a*VKaz{z#9VqncQ~@GpOj%+>h#{)f!DDn{ zB?2*mOsf&M+qC)i%?HO{zVFVjf9lSUT{~J6^s~*)&8_tVtBq8x&s=dJG;LZ4kCZfP zCK4L2b_jhP&KrLB2e1F`51)MHbho9`EjrXyRVMcNsbGCM4gfdP)U|oO9RRY7+>vGW z<d#@XHMs%Be!vr%m3=}`H+Rb*LFwd_j{pKF0CEGln`3~XfXm0swyamsFi<T_;vAd< zNo^8cY7aF+g%A;H#LBD6!zfc&J$#^H%iV>_=0`>x^Jpzf0LTSYf!HmPXahdJUe%Nh zec)<T1xL=FquDg__UwE$T1gyuWu*sRo8x;=c0YLhg{Pl;$-E*tTpc{twW*zVXcNSO z3qb{X@z$8EWY!`=pb&+aLkJoy1QzTPa@1Y1ix4Og7%Uj7@Jw)69Rt|vOh&FOZd?i6 zrAw_LBPm?X4KQeiWvPbZNC8tQ&fjX}L<qr!z)Uf42qXdqv2marp%qz0R53@sG|k=x z5e-`e&ScmTUuHPF;Uak73Tz+y3BW!+0!RW4rcmRgoE$>z9FjO2m?RVTu0|dK+O<R4 zHAQ#FfE^V&ArT48u7I0b-)Xl%H<!F<>IgAsm>M~mvAerv6+&5ulKIa0x9fW_fr~0g zhGe!1Mi$(dvn6maV|XmGj^;)sS=pfgVZeLVy}(S&X=!XJ*x@<Ah~dVTP`KSL#_U_I zHZ?*-VD0S8h1^V6Mu*n7<|n`R)N7AF_wvWDyYlPz-}(8wPTX(+tD|uSNJgofA!iW^ zRop4v50N7m20cY!41DamWAB_iJ3IAei_Iz=npWd&6EIO6fryYnoeM(%RtQ1eED(b@ zfGSvaHA05<V(L`NYC}=6IM?o~SrRjR2uB^{%i8o1LD~@WmS%ztyabd&E}?LPNCFDe zT?1I!zO9;ZtQv)z5~)KysV1)D>T&XXW;UBt)5Av&Kl{$sBmcpF_o-V>{3V~e>#zID z?Z)icDzJhklND~wdrPKZk5z?A#v>Vzaq|4xwbg@nuhBL4#+$CW<CZ7ZzxT7~<jprQ zK8!3d3Qb*y25pWeRSb1sIanPo!KIMtvlDBm!~#q>2nPWd1UTbTI4)ukW%s>#uM>>G zd&>W1g@6+M!xXSW^(NA#rip_JH-X#;%!9+ObFqenXDGwicb&EhP%w~x2Hpe)nvfaH zxqQkBSEE6a2<{jhe@$UMOyP-5%e)7Qo-EXzO9^u)IVBY0vymxL9GXGCv~(y+rg+~D zz;3ai<X2=&K|qn*iD-Bs2#R^FF(JYuS0m8KW1<R~b8iXUvhZSSPS#$z9zS#M&A;)P zkALdU^@EH6oICmE@neTqCI_?i^Toz^G#UlZzB!H2p|KhDnINGLcxwZ%p6&m~Z~y4I zcQ)QQpE_EdYrVa#Fc0J43e6eTyOEnwR?gWpfl!2!+<JE<?MV%uy=WH<I<p2>f(}am zFn1nOINRZ!+fMpDcux%<;~;wqUN&G03zCAfFa<C>l~})lR2C{o<*}yNAOw=gvDO&Z zjvQ|DJW_vjRYsWmg;R}gT(LT?%11^KK*}B4BGd+^dG4za8I-+c$AlvU*>p5Hcs9|N zVT<wb>-g;-Joo*lUOl^|hYnud&KBLgcUSSiLT;H=12UVEE8GdjMFfh0i|c^xjKZ6l zvI`N&e5U~mGQv_R0#0fsr4Om9o;n1FWmh)s+`FtT<<@hOP|ii{a2aO2*o?LBumfUn zDndytHMmGHi33n7p8zY9MYo>4axx}kCI~U_vHrk-vdOT^DD{hAaSGYF({e@+Ce?li zU?2Mlz&<|o(2%^DyY|*BoaP1+2-R8G6=SMq9=F^^&I}6x_6|y3o&YcxUsg`37fqIW zRdur+<D{*vO-ilh)-_>>NF1I4z%Q;tVZJj}z)e%;;S5xsW1gW*6*GD94uw0EG{F%< zB|#_<yJs__o#1TO;RRII$>7T5#4hASTpl6=MAVF^@RT4h01i`UnKbix2MyChhbc7M z^Le|K`fOZ{!`OT4pM3rF8*lx=_a8d^^#|_x{JqBykFYL0YF6BlH31gD?3oY%hqFUU zfDnK&@P&_ErQQ6%i|@Yh_V%gvR9zi1j(wjbR0d({T-l90x(9=jCwFDyP#Pbk4k5Ch zbPLjxIjK2pNC04NMzoA#%SCXPg*-4iP?#4m0u2lkzyY!%Bd+8G0yB{sT#Yhu<(v(S zq}d&oOEe=fvb$U0)h5jo*e0VDHGT8!b_F}Qe&V5LUORqh<*)e4?d+&R05D5BiNYXi zV&n)yuSh+rz#-t+fz{6E8}r3DG@m>)z4^;meDan<KY9MtA3pZxTj%q}V%sPtX|nh{ z*>>VdJt7P4b@rTioJd=S!<bZ(um%L7AS6N(Nd)f)r?On)6Lh(Qm=kt$03z&C0zj}~ z&5WEuL)U->Y-Q+OVPa-bgE_oF0X5Id`*0(NgTTwr%y%9$K+WCEOpIXJJ;T*)S%<bn zo*iB$iOG$SOGV$|Fx^Y@b9XXvI5Cz<h!Tmz;JV}e&C4La<U+Vqs23Mege*yfJh(W) z#a$?pnFk$&e?2+~s1l;n2;zo5+qP3Hm9Es7VsY0s$A0xwcYXQ3tFM_t9M;W9=-9Di zt)@Qbx(bs~022C5?Q=anwwZGknhk>rE+qV~55E56XWxABRQK+-oZB*3k{BbA=Go%Z z=>sdloV(PgE<=rg;0BoYiL8g_VeeUTGqX(Kp>5(zORpiC1z<t~*lwAd2z!Qo8CXtm z2moR-04z@8AS$dUZk)t9pv?P9?Qt}e{JEl7Y7miPg&1QM;BB|@Hc=ZxHL|UBUR*Ja z*B_XU0Me4CMsQSQ@m`5MtStbynRSbCV6bF_a|u?5w-rBne*XIpJ^Sd(Z*OGrYBE`? z&%Apc(!@9tv%a0#d;zm6vh}@bW>Z&lTUNl$d-OsoIl9KoEgYFRlaEK!9q$MmL>d5s z8I0iK1O(zJp$<V~oaG)l2ctq45~dg!;CbJ{4cP$AX7HkKs}zE}?vl^k0Jt-WEjwCX zewkY!%f#kLWgy!un<k`|#KLH0mnjN3yxav70K)KM*^P)<jHFlIN}PlfS95COerU0e z{RChiA8Nelz74oc9X-nmuwqakI%h}?06Yf9pa^H$6=p^O19@<_Clm}pGp($x)@s34 z1X@{Nd5&&1y5L$80Mm}V@MyD{4V-<;?#{l9P?@@}cfb)c$Q=ge5IrD~66z+eXQ?)8 zq>6+CadlzaL}ZxeG<U!*0wG{8yi`4b9YyCd#N}WiXgRMlU{b7bVdSLXw7q$7WzA!= z*xFWVr_+@%X%Z4g&zgfYHPdXd{o@x;z3}EA{BM6a`5XSSZ`^d{=(?kr5QL%wHC)VN zVe>O9kpcunfPpK=_)9-`%V+Mn<qscv=?@-${;jQdRYy6jx8MXQLD|`YY2`$g10YVO z?tl_Ov$GPMl{&Ukj5NTC4xd9n*<nOOeb!2pUs4Ccd*H5ah5=4QW*{bW&`{bfZdVFd z(g@-h0ztj&vl@|bQ*#JTYG=-1bv262H@2L8GMUzu^t!dOete#&2ZE!bkbzU1=MNsJ z#uc+d0T8G{7<5(AZ0p?G+Uk+<qysNJPbeI`qQ3LU)%RU>^^c!^>%k|Ve&hV+9G%y- zRU^SDtFQ`;+zh0|23C;5dblrjRK$fzE*}CW0}PkIi!vxsZr=kd#4#AkLJl`7>jlPu z64;^S0#m09Vhn5?Ek6SCWgIhnNiJe{GGH$TaY-w|O<A;Xf#Bw@#cr0Dfj%LV`?9a4 z4ukm~Mhfq$^zH#;7o}NbcwZR6yj&x~z^#HHFi2bgrHTZUoXpr9$%x&}00IdrVin54 zGY4HA*|CZL4S&g(K70Fhw;UA#(xPn|s_M|CMV}QUO<e<+TW{HFSqal-8>4qOXDbJB zIw1?r^!Vea-}>eco~RFAC8Gn?B=obHF1jXAMCyF8INuRDnb%|nwXE9rt|<^;i8RAg zaZN5{D$q_5TNzGv$v6bL0rq}AQv~vI_&9i(hg0!MAQBqRvZB&JA~=8qQaS)NLW%n; zNTezV2MH{ZMRI@Pjq8t&4piKoeeGbQzxl;a-FD@Xk6k?p2Fox43qq_NLZk}o!3u78 zEsiDzKAH2DR&Bt;FX$gU{K5~Per?-gXby+eYsz(1tzC6ZJL|i}JP6jND?DzHI<bUW z;Ku5O1b-21>?_d&g;8Er;=1Wla3Nxh<_ioo!sWA_Y$-&Ch)~xUkH^_oR;2Pet~XJv zA9X=I_w|gaA0;Kt#-wi0>~7+4Psqt!g?5L#24fQtfSj#(N*I%Ka0wh53KhwSs>Yg$ zR->+Na#MNTcvH8Q1!jH`*hLu$FkA{2Lv7S#kM0r~PSt*Nv5)-(U>_f9{8#_oLv2;R z*>+Eze)nwD)vGR$$f#;Yn8vtH^}$o~Xm$-V5w_hscV}UdLJT$t6DWeVQS2$j%t93` z830w)+_NULK6?r|cRCl#q#bDwPdvyBs+kE7(ay3mUH)M-8i5EDT|x+vBucD2z#}m= zBR!BfZq{hU;N@wp)F7Uvl*Z$cDnJmC&W(u^pb7~DckO!tx#gS_dd=Aq&6pDBY-X8) z5iiyKjNA#u14cII8&1(egw$Kx8=!!Y<0yM@ixsLS)CWRb-{{lEnZ-Z$Z~Qm6U485? z`Qj&j^>fFrX>cZilO7va)}=Z`1q|p7&Zq#*?I>`?ytWdKe)YyLK5*k>FZF-;&@(@N z<~56x*i6mPwz*5{#-NeNxNfTX<|g`%YT*&AZLMz&B2rT(RRx)NDKe|OGpZu{Xi#&< z((O`Weg6E$>dHDKz~@H7ZcOZMm*`&rwk)Lqj6v5Wz{Fj_0yi}U1(CoYPrYhpj#>e; z4PPJzqF7nqwWtx|cCVSFH;fpaE0JJw;9vRA|JT3aZ~IMRRE{xW0&Aef?QF7guu~y$ zV5}NUanSt=q3cfI8#iA0^rx=;Uw-(+?>_P3TMNzActMreD7T1)ii232ySb=I1r@MF z(Fzol2oi`$Rhy>C4weXSiG#r+q|Y!j5urfE_=hfHr;(y?A`Bae%$>c=04$H{feT-V zBTVi<E;3Wh=B~nx`Z7XfhB-MgBc)u0NV)qN00a>-b$D8;Z<(R0DzsY?SFKynGI<^z zGjmOzQ!#t?oV>)Zu5MX(oXd77KLB85_N6HB4yk|{iXx2@z`&rkyX0~p1Xj%=K&KWU zBz;a4V@`;%Ch1br$czvjR>i7u*4%Zub@n)|Lo-Re&$c^p6`(?nHXF(8n&Xo%edf+D z-+SGyQ$HHXfgb4K^F$Wih-)%pBbcJjJee__<Do$D+(!NA_n&y=sptRpzvr)d>1{mz z(mU1aaivi=%g8-)ZnWcWL1|uT*SV|HV3Vxb%}6u3dRFqZEdS@i>7qf!W)Lre1F#*1 zUG*G7AR;php^|E(eebf<J~a@5xa>XiqJ1EcKpd#_0XRBpkRaA!G<J!qh7h?Kai~}V z2VtQQxT*rPlP?ZbGdcg(fy3i3ef8ci-#onqTNG^Dc0It*NT<{g(%nc6-QChPq@;8W zJ%n_3NJw{gH==ZxptK@g?>ygqZQqYL>p1s)E$@>WMusXdkk7XoJzVy0B?k8SHw>0g zZXfcMQz7JY>FaNfcM`p~a4_k1rtgpMZn79g>ohZ!%~`y8c|A6!P0aQZP4R5V{9bg+ zyBp?Tm}H6cc${&KvzuMfufCq3B}FJ|J5VGhdT{jad$#7nXp6~I;$R2|x!SZ^i>W&P zzuCb})@9WWdmLJygb><OrA=2X;@r!@nH{Icv8Xg*NTFcbkr=CyB5s-CB>oif@Q>+a z6?EswXVvo1uA|&H=3MAuF$7$<0B%UEFHDo@BPvD|hf}r0)dFqe;y9;s!Da%-f0Ogi zO}1^V9fAI>&o^03Bn}^R=<v_GnqoanmXUR$K9|8*GpjF~sT9OzsM(&{2;N#cI%0k- zk3HL%?a9*?lou@LTV6$}mOeHo<7ywk>e5-GT&uA9iiBYa9YCPK1LA|QCJHt8<=Ob2 zNnuzJI3bG8ZP>GEG44o_2-o5Uf5F@(V-QfbsVolfoMkgsWUuawyC`X7axmAN4^Jb` zI-?g;`DwV$oCd0AcQ{+k%~bMf#}j;A#-Z$bN#k{SMt!}a7Qefjhub{F%-WB3cHM+> zT&v>`fB69=&Ht?mT^jVa0<?c}YYfpjI9JElZanw*2)@41!CiQxT}K>j4Etdxj#cD2 z9VcJE>bI#E<Wcn&i?fj*sUO`V$02=YEttzKCdegp(u3`!Pb^F;#`KmzKax#B*c%IU zXg{oSFEtF>d6&N%v8hY^<qBr%hKY1!y;T8CIuDOh^-DPc8OvkhR49(8S#%jJ;T3)W ziYb$+MAP+;w%O--iC43iCA0e+vo4!8M3Tc;)={faj<x$w-BbV`gV0;GuU6bTyC4zw zMT!!n?Yp}-f+n|c5YgR!#$0|LJD0d#P0fMqmUu9+Ow_WT<E~-XJUTC$B7DPj42=NI zh9Y!RgrQ!V{!Jj5tReXIoeVm)=wIPPPxmdE!UbB7WYd*{)3uGTK1ITLseC<kn>cw} zG0xe>?bP0;Ji!f@)$NYtdABP{haO#=SqWK{%e+B|#><RirsfjPm=lL0HJS48{dScK zxzbXSrHxJ!>Pi~7oY!5n6U}1NYU3}k@RE}&X+e5(wBVBa^^@D9E^43aMNdKRNm)+a zfW_#rhiR@l@t3dVB}qd~o>(v-(#PBPVMZgdQ0++X**$rj0>9_aZQJ7a=SD6r-EP=9 zl*A@~oleD!q}-S2?bUoG?d9?(b|RvSvla?JRGgJXZ|;y~hg7FWP0*&}pP3og|G=iX zp{*35km%~P+8cJI!)GLSXDp^1;&kOgS3cUWd`tbyKkS1ufrDgRg#*{vdo(&=!k$W= z9eK2TWBW0<{q?4+@6&5uo0*t60Oq-MYuHm;&c%a*ssz?L;n&qg4*yZ(M^|zGmG>@> zy8CheNUeu=NKQn~>q~f0*U4;2A8zLx>z}T$YPzW}fq&vbQ?B%9o8ub53Tq*g6niCf z%Lx-H9C_L_fD(-yV>^V<O*@p(Wef|Ir}?7e<N7Mr3icLf>kq|)+U$<Q)^hfh-1T%m zM>Qm5Si1h3GXx_BtKMb}15<H;YlkZk29g=Zi<mUgNZ>Xdu?y7<n<w4pKKA>0$L&4# zIDjw)AQv54-4eTspZ~3$Rw|2>*LfyS@*hHJwD0CN@J#-^&T02IFUhQ6x0huLGUASy z`=DIx(bizf#lIYn5w?b~1}p$Hgtia0_oNLm89X4WL--zJFH4bhv?>aRCIeU~IOXgR z9O}f(Y4YcDw3jpoKBEEp2vZ_(&wP)Cd%XQGcV&{QLCz&Fu6|%flbm6Ga7J%w7t!qI zybY%uk5U=jBcrm}XwSn-9_JsYGVw+u0-Zud_B(KzgVMbNas<XUK$WJQ`usDzGc^3Z z_~V}6&>u$5Jm2S;|Kke4>24j55+3WHh$<-16aU`myvt0?Xd_ExvMu{P8D85?<!vGX zhfF<E1)Zl+Ki{qDoB0d6%<1pXn=&+g#3>nS`k3Rv*?@lXqdKRSz3fu<i!q&zftNNv zqYdvna;6=?Bs(eT9Vr&eBA?KT;%eUbW&n(KO8rd{GtPdj9FUaRV49TPT#hCk#$tQ8 zGmK>w=1NQy!Mq|=p?$7BE5<AZ!0Ra7pC=>dT&lf4dab&6@{VE%KC275iEUHc;*aB{ zrmQPi7YcTLZxdge7Y;2$_+}=gU6Ww`HT$aN8vb{DH_7PIck4|h{@R5jc6E@$$!Jt1 zhdOAzX7+0~SGWmZ&M|5!P5^-`G)DthfkV!xoe&!}61>epf@Fv&;tnR=vAMW&zEc|t zxWxa-=yf4%S6JF1tTK^FS$NA7k}QnAMREvSJ4tIec*xlHBFnS5eJ1_Y!$(bPix?XQ z7P*n1rT|O91u#NPQ{O8u!Uj}mu|m*>qsfXYkIOE2lK4&>_xsN*OU!alTDJ!GHrLgv zgKpwadIN6R3%Y;bCBc%c9tQ{IbP}+aWG}>AqWY6Ygl0F=vTORuBgrmj5pl$$sl{#v zjTnzeW?eos-qSiYf5R$p373)VG`B?mf^uQfmD}X2$IqC$CgI+oL9X+(n8sFQfGhP( z>tk!n@oEJfuSp#VT%`w*S(`>nPVq94xD$#XP-v`G;P;2pprQrx4CBcm&~E5>QkLS= zUJ#Shnrc>zk9e>P@tAZSUruh{!7*ZG``3TCf%QR63{@upocdFxLrq$qM3`m`{pE?r zxPhr?)a#*l{>yWenbN)$yz<%7@|gudSsmpGv<0T1`^zoIu&*re;~ct;^b~P@M3Im* zC3eKhM_5eViFd+9p`e$WfNiLNLo&$_nd4Wa%(>8H2UxNi$+Q8C4DJ}_2;uKK&6-_r zjPU`?HKa3;EOh_F!;BjTfbu6|O92QD0*#U#NVj^lLeBKFC*S-$OkaQKm_<E%%Fs1~ zHH?`8IT<JL>A0#+#BHZP^9|kY*Y)5gYSYvIud^FPky>P*^mvu^?w-kh5~fg`)kW3R zx}KZY+QD0M%5@k4zQ_Tzm!xu|YVvu9D(q;K2tdlgX8|ehN6c9_5VG_ctn4EH_W)C$ z87u~Di1>ngWW6GxlpTGSt$x&@ow+gwnr4rluGWa0<sJyIplUzSK7#)<Z;gvs?hvw? zw7JMHnKAO=$6ziqpL0YsTH?U5%0Y+_ZbOrBNJO@V&7lfd%MSHeb0pn{&(v{rvE$0+ zdAEc!f6bu#=GZfM5vk3%iviy&;LuZ%nFOo&4}$<*Tv$DlHzj%-b;o@yb>F>6@V|ez z!FO=xtUAj3di<p?WO=I_)6cX^l9fs#UiAx}G$$z)N6EVt<p<Kw-<9}~fc+G%da%y= zCNQGH4t9M?mu1}#aX?ry5*3OS8*M58fRcJ1l1R3a7bn(_H4Wk-*JfbE717V;2{FJl zqC8ZS!3s~)pl;u5sR6St_kFr~>brwOXV#agAE$bKE&`WFRt0JeMd}-RW;z>sTd~Vy z5Bmg!KiQo;O{864YoaZ9<({mQQ#}0(K|Q}a6{HS4dsOdvIwj{+^7!>@pae7PANlj> zC<-M$R|D$b!a*t)d@njIX4<o_Mf+OBTp`iv0!0Rv3P_WYMFF!YjP*F^wwj(}??9|= z=d)Z=^M%}}vWhEq%i(BHoT<h&brI*rN{v;cFwRqcQfOlVS(mG&`%vknlp^ZmUnKVA zV>N4Y2CsBW0z~}KZ?4KR2H7k^xedT*F4|a4E`elHz>nPBisrW5ubT#c&aM?721zcS zr}Oj!Uv3-|kmycMWNBkr_ZjpTkQ~^JYD2k%!deNBh)vafXMG+hUhW#25_&FgL~Lzy zK5|u0Q>s>rc?nBW`1(udN{wqsLcDpV4#~1-n(W=Z1tN$ibfQ>_>ZggAj!;e1AVawb zrw+tO*u1n1?t8n0t^0?{i1Gb}iN>NWnm76N4TS!j7<ja%`KN>X_D&9qsVy$+guLkG zX))z*YWNtIqD1=+hm*{nk8OMZ^sfOc5Coe<>&QIOTyKLUzbER5bkK0y?&Oh~ZVm?D zZcF^TY;rk1kP!;lzvsnt${Vu_J;PMEitR}vUdm~*IDprcN^JVt`+24@@1u74GNlR5 z^z^V)u)ap93Sokz@H0bmGTh_2Fu610(kG%;vSmTE6!hU>Q*Fp?e+W#Dn<>}v6I!R( zHX?K50Do6e=IfjHgXiK;LtL($A$#WN7ni4`YrVwBJLVq$413fwIsKx!a;oDbDv->f z7c;1tXuU1>wa4xDqx?ngk1p8f@^=3n-ty9<2>fiM!|nw1j8i=h&eM3|dS(003!iMe z2E0<Y<p0efTq{T8nxlSAA#a2n$S^A^(IUW{)ef-S>3G7hAD(|ce5hq4Wf8O-cI8Pg z&Gz}$Z)aKPwlF$WQCCP5t&^zq*c&UUvN>K~veBq)RNQEzzb%>JMyMoMIIR&w&My7> zS0*vz6C%K$fk@u;xW`9AFeb#2L~k#5zJol|F!ZB~nO)C&KEtlP$OUInZ@<TdwqV!W z=-<&IwWiV1HvA|IK6-Qvkx<gTG=gD1$B(}i7N`5E&4$>6?<vi?ALB2ce!+nk4-X<F zY9F28pxIyb5ouROB!}xwD+|WD%<pPfvWlXI3$xfnxY-gr{U;ngEwg0$xq{HyK-e4z z5NPLPqv%I}$I;%5omp3XSDHayOcX<BMh>k^dNA9g=Wj>rT0`Av<|8(h7VyT07Figk z>`f=OV{Aly?zf4g3-R0Ygn|bN3Gc_WzMK9Uv%8haKfjv?{z>)CUo-O&ILjR&2)hOt z1-`AYmr5bdIXYyNn~7eWpfu~exoV?&UXq@Bx%(|R_p#;2Je~uCk>XKmIAR2;h9N!C zI|w}8D@R9xGUne8Tu<v_Z^OM&vBAOO%?r0kAK4KJ&F=3<U)2pB#wJbALtB|?nlv)7 zgo*5G#V?BmM)q9xoJ3?uVtf0k7oYo=bCDs7SCfWJN{&zArbj4vJpi16oT|bCmeRi1 z!ds}*gA_m>*eS0YXxTaN-2%n;0FR*agOCpr9&;^bov&r;8?8Y${e+vOdAFE<p}76c zUstrKm5tFq7mG-&FF7bRsA)eP&<9=qix|rfKDuAt5^fX5(NZmoT3h-qDzEt7@raz% z?fbo4wcJ4nA2^IG4W+O%nE~#fumO<P4%OIeiv3Oga#k9=;@Z2Omw=jaK+H8{zRfyF zkAS5BparlA>s;=M&~QjmFw5*6@4fF*s9;PqPe-V7BwMu5=}4^mY=8AH$2UpbckZn3 zWf88pooyk4QtC#wyN_snCR_S21<}<VQa0I4Ryz6yt)YV7kRJLjw}UuU>*Awal(X7q zXNn7BE=QQBXO*+NZYr}s$I-I+c`XY!b0Q8n+i>Lp><Xf2@b-4C(Y$zEU1{4+C%MAH zR5J-ru^0tu&^X6Hq{3YoDr{NSKb$HVPQPHgPoik6rWXb}6O`6gz72c-4m><#F>Ea- zbqd#b7SfwQ!zT?USIO8oBx4F$xS3olj{UyOjLTU$kA7b`KM?8nZ=gTEzw{j}QBd7+ z5^l-=5oG+|P!C}^&W?CySVw0wFE1OnxRBRia-BS9ZPwh%Y)=e`&Za4)?8T`<W=o4c z8zN2rhCa#oM|ar$_aHQJ87AmCKFrQsoQWt;k(4VO8*SEE4xHh49P3=n5CxNp#xmwb z{jg-IT&N^sdgZ^1-DY#YIFUw)VM98w`aY9`@o}7c9Hg1#D2Pk6>dA;Ns8CH=JfUI) z>yU~09A$n6G0t1^+*sMz+Paw+()&U8_4;a^67A<j{M4YU0LfRZWCX^9VFa|?!nX+1 zhfP!`sG~T>vE;R#=aDB%!IyWj2@<al8xJG724AreOpQ>Q562m@8bPFAlOR9A!kVND z+fjEx3P@699=r{E)hJvF=m$;*?=C%0`#ZiMs{uV28Cl~<kU39s@;5Xrm3iH6oRZ1- z#!a%xr`bF)-D}8*m=J6PS_S`B53qV_>+lJ$u~$;}etPLx?tRWfT@F6;@D94!kCI<} zs~a}(9a4a;ubCxqw3*2+Q(dd~i^RxiU0!dg&pqJNiJ8|$kKpEA4ZK_Mu;@)9o>g7j zwyGGeeEmML9!406f!1}|cvpKya<*G8Ou##|n$dQCKD9~|g*(K4;ovn`k1A(wds?jU z@vZT$`vl2Mk4nC&X*3&~wT7V+PBa|%EN;JAKP?~Wec}8`_>tO`%WeKk1`hyGkD!9c zK!-~b?D{rR!Y)A)AJ0p3a(h~GT1F_FX+xGts;3K_UuXQauIo>Bm$T5r?*tRiM+>g% z0a~9ikh2`uXz}{m*4CGLFIQF2I=DPd1=|E*x;<=FS0>@}E9*l1Z$OT9x0g?|pU})Y z=8?c#0n=%ahl$hmdJb!q>TDK^BH1dFtv=LvcY;65`^%)Xd5*n(EK1vV0C2VT1s`E{ z%KEMcWRVHLg6#DdB?jbviJVf~`lVd%kpY^XC6e;|bB~9g`_(>Mc6;CxUrdS{CB0$3 z=Gs>N$Bp2zYdEpkU;O#cNu8-|(yjb<ty)=NT{Z<by{n64CY}62{!YD&PKXQuZA)0N zz|?K*s{Cqi@V>K_ybKKPT68I>vjA1VyWr9)x^IL#7<5}=p=-6$$hncm71Wc`*j5!} zaVCq*(v%ocWI4Fz95Nw7-^}^YQF$f7=D3Yygo<L>(K3Q`C@CRyZ207u3ymE^8ic_c zX$#ZrIf$)KkvvU969X7XNg{DkzdzE^-frBSCWUo$c6Plf@P*Oe{n+u(3My2nh>#yl z2e(Q9{==XmFM#(e^2p1QhV#*ST0Tw^YokW0j5+#>X6J1QtTQ8J7~TF<De23g{{7XY zaO#);7b?Rd4reTH2GX#0yCTv?&K}@RJ-HW01AyRi>-Z-~_&jw+j1w7mN_8<jh6yb^ zFWqnwABbzkIXx|!@@7=5ly)RtA;m{8@eK`jRTA%;5eZ96209N$cdK|U*5O5ylv^=O z<$UEhp2{$-4;t%?3q%Qwgyjyg^T$dsP=9kd_%b&Sq<exV6XEjZfJjHhDst|T?#G`b zJT;frob>XOA8;RR(Aehf>mPMJD&NByThsR<RSf-;PIzlNBe<f|WMa_+xqK-oT+&~B zhNVh!D$ArGrhgL=(S=~d!CbVcXIgcn2h9X@d*9!-N=x!t>*|PqS21Oxfe@OXQs^Lm zt1eqjG%>V5(MBZwz%362LOP6cQ@Dtv^lGFF7wwlPsyw=H4(>1d{yxLa(d#ZjKbJ%j z5ZE2g;?<8oe;(Ow!Am%)Ets=iuiAgR50N!_R2kLR`@`80czwt!aouCP?fWY$!&J!I zj}S+gMb3c5n|LlX8<a5zFjjkRE7c(4?ZPwZ_AL9p3*gN~pu>7JPdFE0r$nm9Jj&b2 zr?`lna=*X{C7+ac03l5m0f(?}ddCx&-uS}s`WVSBOJR%(72mp|qmhUhK+%{4sE5#E zEPpbL61wmmDl{d8Qw}FL?gI0mQ}gzVR%x@&+cJ?l(i%jC^^*oX8Eu4UURET6x2mTO z6|@CY|3>9ps!G`I20ZSzUoRQqq70>@kjmda#zvFmIUel^()_AM9bLFqJSGaqvU(~u z7P_r=Z!LJf^yVv&)W=WHbaNSPe8w0H%(&zQcCB3P;&C9nS;=DVLkm^V@nUd`m*FEV z;MSx;i}=O1^9x_WAqJ1ld>EG^8VWL)=CoTgC7(}1n%Tb03I0vFOxbb9A`Sq~q|Kg~ zlQzw?<*^JWA|NyI<sIHTIkJzwH(1j7d<^^tez)V$y?IMD%DQhrS9*43?;oqW>a>(q z=@9BDcV5(EcOfiEe~;^wBNB-$iiH^xQryZ4LSCpaU~NQ-M}!Bh%`G6OP~gz+h&cqe zUq>iNK`gnQ2vr(F46)Ys9xF|`wOK7a!!w*nCIbps7P0|Z2v9@by^j`F*-W9yDRq+4 z(l@QYE!jTnKC2~RIkj{&A~E4g3<v$6<>G%;D_1M&zN^`Ekp^U1ykgw;uM-rQsKU1& z+cf&^FEn(}$vJv(&*Mb#g(Es43SPXJU(lsvH&6#`DJRpKv0k#WxD(GP<0YLaX_2m0 z24+=;hpT1Kl5kmo1kCtUO!}~1^$>;RQYVNj1Q97*g|y!Qf^yE~!B0pd`OEb_YJgy) z!dOm8n)(2Of{KoT6ggQOzcK?!tV~VHqH#)+RMBv0Ypr(B)6>(?f1ZP$EyAwDQ0eGw z<n_WU;twDe|MW2JHIVSRv{=Y6Q89`n5h>*LvXQJkK2Z+((Jcp`FU<u!EnPg_MMwnw z8d=^F6RTX3-!Ieu#}WDVz-dw{ow+`n^lOUAMkQcCHC?R~1K+CcJAx}pRaMAF;lb3D z5ScJn^J>N<ueFGrrXGvq0pGZ*t-Bk?KssZ;iMd|$_`AmnDqelVd7}bALQ1dvdTU5_ z@5RjYZq}lKDBty(9d|*V{DWCAMB`!nN8iI&qu1lQZMQ4G=Nm-*r_-V@koUD?o<u3v zy}x4m$D5PUheS3yW2z)P_h#X(u8Rqh*SoBgnjDXeZUG%AcM~Z6Z=M@OJsj+cBw~Rs z&|YF)AHwvOgrNCg%6><3J|CT-mp4eco3V?17mc+0M>$Vq7qXSWELVSACfK#iJu}&c z))TFtX(h);1jQI)vV&DGY$v}quG_HhINhbVnSa5Hw=!d{oTcGbnaes3YnQ7~U?E{v z0%I}G&I%(C$-5I-Y9QjG5z)btm}v$`=80MJaXz<Q^gUP31@7If*EwS&y}@n3{R=qA z2fsn&`PRYW{-v^|d-15(ez0ghtZpaxWr&eF=%%J4Qcqu&miZg=G&we)<l^C8>WD-N zNxi2M1C6=-3p68_pb|{0Uy*FnRz&&x5YG59z%V8jUq4r)S_2${d<+`bnuYp8fUaOA zYGg!Qq@=8=a4fe^_^wO@behH7N%aw68p1vY$i@0hzx@UbmhDU-tQCBHbsM-p<!$1L zi%LoWs7$-|BuaYla%`#`yKc7+xr)@&l$AkWJb)VE7-)Sq*DerYM_V20z%(K|v0U@? z$mW!jWcqP<(;Bup5sgkOg-2hDW;dnpR@c*zQ5nRL+0pb>(|#@)d)2(G_<IR<X=6!l zRH#_}z7!hn!)YKWDg}RfCv2uw0ZK0aCl&paiP6pm!ozWtO{;h!gPmO8<~cewK`{uR z!gf~hwR63udMg@k$;=j#hYqrJhd}$A*^pP<$-bl8N>#MicHki*B-#J}v{RI1#ftLv zv%_$yGACfz4a+%N+QN*`ZLZMIRKFH2?LS3Gv+v?vG-hYeI69V<DxIA3cUwi<SV)w5 z*0g-&S7$Odklj7?1!-5nvou1IGcY8y;e)V%H+bV7_%YSTUtCdvfT7Re!~Dg?P!G`M zWdwS7>^Q0J8{&_!lLb!{OI#!*-mTPXebs|z-fxHbvDjq;tawN`)AqE7J1SC!9bR@t z^5jX;70I`1nmoKAS~;u64j5&Yyln!8#^}JeSwr+pe@|lnNx&r$cl`QW9>~~8J(e<^ z_(dD2N?6fQaED`6FLks6??*iB+P&7g?Wb$?t*5-Pt-Blb{D7C5<@c0=`zN-%6ZUw> z(<;?mX@IB{fSM%{g7cT-GR%LmkWQZMwXzi-B&QiXIs6HCWd<4aY;+VPj7LEjJ`rS? z$JyGO(Uw(TjUg%p6Sjk4(l4`0fh+WbR>|B}`y#DL(uc3OS18oi<!ms`Qc-w%WdcSB z$iWv?!*=?&{(65Q@%Is@?~=UlVX^O}ij|+sCW#3{D6}CGGEL81J}$R|{+nr{2u3iL zjT#?xx_sVy>_69ibIDt-Ub^V_skp_i=}flE?h)B4dmiN&(P8GC1|LKbJ)D<G8y&VX zESduJ)=yV~9H0ogX=~^~$xyfu_*6_p>i?PcbFmyB9uDtd#a2`BRTv#s&!&IQPV}!K z54A9A(t;WiHiJ#yfAowc){U5vp%qVUK()VdPkm3y_Vb6EZSmF&0tDk+Zi;Ih41x;d z8W>5s!Vt4qj<~JkxEh7zsxdhWV92=3;GT5`{Z90QIJfUivy#ch5S=B}F|V6bviX|* zs$TrLjldtfb-@oIj`6jWpVI)}%iLg^a&mSAsUZNQowqP#ugZ_xmu2L;rGkIDwtY`g z6S`f!P-0HxR8uF3zGUeLw^@tjG&1X2DD&%;oSDwK%wSV_g-_a&dm=4My$D_bPbdX& zYgKloQA^pnQ{RE=bJp`g$%Q(n3gB7xomny}zAzgpe2d=B_h;{i>yxFaqvNJai?}8h zDnxkoY3i+)^LIUG^df{4BTirqepbQBLviHKlSk(djxUXM8(yLgOS*@6#sFgLng`^r zgmz~(C!xc20~4;pehQ(UXmUL~;r7z`Phw<<+T$<;t<Tvkvnlp<`G#Dk(~x}k!cKK| zz9gH>${R>@vZShRpb+Ju1sGAB@NS|)RLUBF-~hEL1GW_*mjW$gPS0smwbWZQp?K{W zJ;I3S8X=Y8N&`|1Th}&R(rIxPC8;wl1iYC)RUjgCipFbhYSwDjBGZD@$9#yS@R2~V zh-eOKtLREM;PBAKeIoje4u0-d`>i=l#rR=tn2e+FOt`W#TKKR7xw!1Z$&tAIjv}PV z<56<te@8suj?TZ?p?<kSC!~}6z+CW~_5jw5n_9d#3zUQJR-|1(R@CR5`qLQ!v{J&} zoUD`5vNKA;*}0;m_sKbDa;Cu92}&JeEY|+N#9cdiU9$$gwp)RXA#oXv8ESE*-y@_m z2B{g4>_fq)&Q5!$Kn6W81a3)+)7~H7aCt)THVS8*zfej>-5w%k84Y0WzW%-KZ43HY zW7ct&t!@&085w3Lca8W<Q64wcOL+0HB^-X~jTevDV60`(ZTEaL*8Ayt%(-tbA?Rs* z2#z}YSH)RVXQr&<Vk)%k+1km2ZqbtW(RNm3?_bFHw5aXeYMyMxLYE5s@7f7yXDxu_ z^DRq;=ILYy1X1=&e8b>;j&-N?=&pc+RuAMzN^cMr?(iBM_&mLe4&t!(V49vL5~#Pa z^AXePXVgv6E;pnpp;$H(=6y|gZM%5c^}a8-%jxxc{NrOD(+rOIWVb+C)FMmx&t7tN z-v9|p(~{ltc)ELSg%ejR%>6omc|;ZP=lbdhGNvaF*Bh#A5NTlbiSaPUT!qVq;^C#u zWoE91&txjbAt?gEgrA8VeytY?T4EG_dx#qH2ZSMUr_?uPuo>{d2nGOM2T=Ck$PI`; zJ2Ie?M^>k`T)ov#X6agto`BgAfe8c#1~05oH7vlO+G#}`BE1w#@h^N3|Cb6~9z;4W z-r`h92C@*k9|$E;t{4a&|4KJKm!OkSGkR^X9kh6N?x-Gct=(1)QXfFX1jrJjU}bkZ z+ZAPcn=XE#w-s66I6s#Du{^u)-FtQH-S_zIt4Hh#1%<l)8lkZvZ;CLprk)lNytdV4 z1M6h)6msYBmY>zY>|j4MIV7t*$H4j*^!I1XoB6&j4tcXw0K$cPTlg*l6(vB{b+izL zbz18!)9k30igT4iXZj-1ycBXWtzQ~luHE&HB*baD?a|AzxiM6sQ)qkVX@w);X<zW^ zXWz}pqlDKdpzAhOrIZZja_>|b{@xdd6@bR(PX~ne_P@w@cm4^(pJVx^4d)lHqk(E% ziDrHW?Zk@IRuPr{409aL`9%39{%zA`5IGe6h_3c5vK)@Hxzx=H;9@_Q?qE2A(m58n zT=`V#07V>PiSh@7pN3ellHqL>A*1mydzA68tPW47A>Q=gsN`UgVYZ>U0aqR?!G3c! zX8`H9-ObF5BcVUvZzDCSSX|O5E<-HjE!kA0>sEHT#$IqQ|F<lGyJ3~Q8{Y8T65;YY zl6&<>x2V?*Gq=@EoFLwx=^P$1erCEU61)NEspBox7fv)`=W)brBc^bhTD7=F@8+%s zd95P^7?oX>hAsI!x2fb8q)&e3&svTP9QUF<C-E;uLcH^3<k9(Yn$e}}K?%Ln9neZ; ziIxOy?gq82>8t7@e8h2as~^aSpZo|1AL(DTU$s#O9Kti#f%`RAj*jw`*Cj_B|BhPQ za2fF(_#@tFPz&La6)z$<^I4u0@{=`{gA~-TlNHMNn&-(<s}Foy35p!h`IJu}<sOLM z0^S_{bYV78Wi}{!SYFQp!^6|>TEJcvm8I3=L!S_Knm^Uks++jvSFu#rQC&_ne_Yq! zUcHlliFp0BEbhH+23N9lUNK=Uu6vlIeJYGcm{>K(u$l>6r_(E0{NvN~qw2)ZPdjkv z8dcou<g>c??e`N-I9RfSarxqrohMO!V0Ap27s^yYuWwm7NkwBAM__BiD?kt_|1NO> zayVH}b^a|LMj`S5lcm(ZO(e+7ie5$WR1nIDQvx#;^R%m+jiFHk2ceXHNPyEG*;SRF z!6+iR{UFN^@f%z@z@O+}5ast2wD2%vQ<$WR0r<8S7!*Ls%q+x3HBAIe8{=L}ISmSD zP!sR9liTt~@1Vo2^^2aYCG;rhB&#)?OYDy8E!2R|djCaBApYn`$PuO;G*#aBh*}qT zTU5R++QDt~Yw{nLo%^m-4sYeW!?7)wpmJHB-N{zUJ9mP*#FR4ZY<H!D`09Fz0oUY7 zj49|KujcL(pqB5SL-Vk^$bldo));?BO1(}bS`~n9V&|9BWuvwtkSk+{*8De(XN<g2 zsL|LLww{PMDB;NQp-z5u_{3T>_w@)QGta2*F(-bf?%^{WE@9UBQDq$c2Mks=xArb4 zepEM1{5GaqhwSn^;`2rv(}Gdla_i+UxUA^zFDv7=*zIqlx<#5-l(Q8$pWXhPU-p1X zSW)lCLH772UzSbNLAnW1HuJkSHV}0gL!48+`l|n5uR%4kD2?1|Pha<!Z)ShJUXpt# z^r;l`hc-)dqEelVEDTq7bq>+vA{+dzwiD?7m$@nl*&GzUp#1KhcqSe)!O8iX08Iph zB^}kL!ghY{?}ARM2Mfy52R(@jQ4~(4L^i(P2)hUj&@dg)LI)nps;y_}S*i>xLCL$` zDky6botj75Xh5^*hE|#kG*{+oHTv7TOE(2am3(ebm;R0GqGD4O<cZuDyi#vJn)N<E za|Zl=DOdzhx7StzJex6NLl?7=p*onVX~QiTR$&ZiR%<)M*ZW2;cf&Yl?Jo(zm%{{e zJs!?iXPQDfl%mPp_5>=^Vgn?rkZ<C^N~ud3B7bX=;=K%eNP1po?s!`CE=Z8$d$<hQ zP<&#kKT-xABn$j@$NGaG`z4SBSDI4mlZ*%YFaWw6kpZ-pRhrP*d?>o>Nwq*Q-Xw+k z3FaK>RkAEK{9($gdpX(;I(~hchrc~n{ew>6o(bOw(u08SYt0ON4JZvTV1=J$O&R?a zG0}b}hW-{*-Nbv}D(dodh@5e>K?{h&v{KlZ5`v2q-3~;MM3zLG+)IrE7gOb~U~!Fs z-&bT#FQP%2g)M%evLB6Sp#jSf84-z2E2?;c&`JCK2|S^wZ)DgJ<%R%tN!+{(FvLP= z821-oXtA-Qu{6WZTiV%E3K@E!rJLndqA(9j**MHn6Bp6(=P23FajNVOM1?tiuW#hx zsi%1(m!9)q7}x|3g^~JdwX)1j?w`P3T3-*Q?|)RG)+&Lgev$UwYQw`|zXsaWT%7ZB zhU9@xF4o0fggI<mZM>5h+6J^AH{V}V<*%$ZO7Y)Ps(36X8)?=Fs&cWQcldh=%A-ur zRPaeDeLDH@HcsS-_9m}K1w$xS8i0Uoiwp;N5O9+xVVZ*wkn4qL+bDE^d&XHZkUh5W z{z<G|Khd|yN=Is=&ig5CTbFQr!^<M7vuF@V4IK`Oct4&*P*yV0tqQ}Jw(4JR`h4)A zjye}%E_XDH)7WSK^xk_rz`u3VlajMBl`zV?g>@>ikw`dr`LwJIJ=@~gIX%TUlp%AF zFgwaNbVu&cc{O8R!o17Y1*$OVX6)<*zzqO+#r})LLFb5lK}{7WOF_8VA|oT@r*A0j z#JwSoz2SxauQFWW1qkpKAlVU%7@G2w+0w5VHVJm_DBbyc=C2(p#mwBc@_dE_?vvrQ zu-7pr9-9lx3h8DFOI!t+V8G7{O<dovtHg3~SN&yr9v)~&0~Ru)v$*mWwiWPhn1wxs zkrzLE&W=U1-%Ixl$+Lr}^`{Y^CFkdxA$S&Hh%@MVUohb1eEs}><rB}LuiWy(2Wf3k z49y&^;t&FjPh)B-Q2y<GOAb!ZUL@!9!Gy=Q-(_h*uj@;IM2g?{w=%^FBRY=iUzM?O zOB7mA%Rs{nZ#R?)wZD^Rl6S?rspI;f@cK&qsWYjRz#q=*2SU?Lbxt*SNTD{p0Pi`- zq_|Ai)L3GOQ$%*sM7m1-9=7CpZLF`eoGuZ4&e0bW=jaO0WylB0zQCsSr;C?g(eUcf z^s<ESdR^end4dUh_*bNf#`0QpoyEOEX94QPeT+*E7e-3;WB6-A!gGK0jeMC7f25K* z^nHjy(q`x|xZ&?$ZXIGrJ#u2hay~-lk@4}+P(B)7narVFEl|Hbjpy(8JCY$9AXTKi zp*bS4?HJD+*Zw~*AS{V)5*>io<SdX5*Mj+d7_IbgxoIxWz^b2x^dccByRR?}X$L|K z%rIFYA=D!bDl*M(3_aZnmROpmXjHFRFyg~I&##EsF|TWk&LZx1X(7H{(c+)w_hA5; zm<lF<A;0&UJ=!o4cCOFrH}0SZftRb-=K*;$q1CI&o7|=BeT4j0lCx11U{#gpc;|`` zHR2F~uh+@6pFD&5`84q^+41F<4g!?!PkE^rVLj7M;9ZQrJbjYlKCj$PxJb|;O?naU zStwtC>ku2K5SWDvYzYJ1fGz<vXiSNyO)Lli<OLNACk+VAE@Y$qx>u-R{j*42R={<y ze{aBcO`CCtd%aYb(Dv;2ftD~@$u6vtPP`eI=f<qi<~6Y_gCm*G*kuo6m%Qn!&)tYO zzNWM)<=*sc{`xT?U<DOfpghF!@Ek?k-Aenfb-Ibigf9vWP~BQd@06GzgyL9M3(NEd zbnm=a_S7c26|=Cu)!$hiEK>`G4x;arX03y@Hm`cZuz&YJQ7mlq-Ere?hhYD$8>sSG zuppJ^t;Ms}8Wd^jzLIA0XlfC8b7u3Ex*WhBu?6TnMcs`0nKAm)1wsNv)Qeff-n=3~ z)X2nLAahoeDI2P1%#5DkC*Tp~DuG8s-rFFFkfn6si6mLUNHOC;MQY|V3_6NV`07R` zPM#z$P20~CO?3s&dlUZW9ak%#$J~T)p~9aqP~4B#-Y;;qS`&>`#;@nNbcM4rjwNgd zUbg07zfcGNJHMq0Jj=r@Z+qO3Qn54{16|^FbLAU`D#W#fPj29%ndAMfj+nuknZ+V1 z$6}<43s(BPJz+0oZdaI2fYE?dT7TS3c)&|5)X~n`orr86K2S(H9%+ri-`IVkvva7? z|E+v$0Wk_!PM4h)0y&PQ3N-mV7L|K<eb)5)m|*Jj`|PUCxZ#Dhpyz0fE}$6QIAWn( z^D>e<Tj%$n7lkUe%3!5`!4W<p9fb(rA_rz1j2nxDXTT6oDwUM*l8wp&hAn^%vLw35 zdYpwnDA<OgW%|<^24OM(YFMXZBi~!=J8z={a4IEL{Huon494+N(J$ttU}Vx$NC=zs z9Sf8oJPXC4m4#abGjn_bDJ+7%6HN+43?Zh$km3fRSw<KXeeJGvb^C*hY_FtxW`2s* z3<3<eI^i#|&VP#hBC)0*18gq1rYHxwReU9rds|L9LE*!?e}MQ3Pa-^Szw8v9c@d6{ ziSe`U|G975wr42$?ekHmrg`1S$adD}7@h1m?lgVlaqr+`?diMTxqSQ${@bMV+Meu9 zShwp+q>{vVJJw@*m>VePOl%p70Vu{N;t&B)fFgGi8>?7B*+RIYdQ`jIG46-RD|n%D z_R;3UJ2B&J0&kt`jByI?S2nlrrrB{e8e1{ATIceFJ@+p0-scwQL`vR1HG%&k-C z)5_D=LgL6S;oSe;$6v|`qU$X)L|3kSI=j;yg5R9SRAxTSc=JbBSHA~fS(oGArkvpy ztl*0dC9m@!eEalAv&3XK@TXLWw~-ctBpZ<RaX2so^H`(Zylt#&8Spry`PdhSXzj|e zr#2X-f{XR@)r8-S9P60Ubz9oT`tX_XzXEJ1>8vI8h=0Qu!W^?vF(#v%`lCO#MF65F z2^9o))cMC-Rxjq46*va&5r0J!IfVTO1JBzJ2tYKPMNT1M5&_+;Xn2pwH2x`Bc$)Hy zOw6XBZe>T)YTR$In5k9mL+zZgA-`-URo`>Ays7_rl=@Sh_lE18VBgIId=7P7C1<{} zbo%t+9sHvUw<0mS!_|dRFG0vjnWVh+dTsId_T$Nz#BKEccF?bDTT|id!_~7NM}iM* z^!(9G+<3VTF*|<4Ge8aXz<KYB_4sK;UZHk|y{)wN=ANm7i!At$z~qYg=V_Vn#=F9| z@1OE_ao0|kk+3F8R}&|h-Dz>Al0WX6+4Ps`F5U#TDfDoSX#|P#3Zi1Skf_aNjX65v zXSdB2_#MG5YdtN`ms7UlzGI$dJ+J8^b;Eu{B;W$#w4({7aLz<fI=T0;KW+%yXy(Jm zZ{akqKw#7Y*c^{WyOoq5rkz*FF(EzUE2$!>;dUWRzOneZ#2<Gmoj}ud3M;ImXxkpp zPc{t-P5mo@Lm(*qOAQ2FvBN!m1=S;6%q)6eJk)F230J7nI`jP_%jD#cnjX0hk+R07 zm#HSqMC<^@r0Eh#eXIOyplPB_iASp&5(eBy;;u!m0~iKnTcbseba?#W=iUTepwsyj zh#WaoC&yWE$XWJd`FxB&n%ny$IQPsMeEF<z8dz@HXZi80kUi1X_vGn!S__hqQO?=@ z8+0vhhfH5=rw*6h39*4i(Xi^oIfc)vVj@|7$H>ri@RS?YSS>5g8mB;eU{Xo5jOzr) zwMjN{MmA?yq+T>IK`um<M@UM3XOgZzUPunO2b+FJPZSE{?Lf~gOQWd9ef<3B(zhoF zxAx5i1bCVxKFr9R@d-rXP@jk$dCiAw)Wz?fpE>3Cm>LD{hkoRGWXTtfcs)zV54ik& z)ON+Ro9WMwS@Z{Y@Cy~$%wMP8ON*GuxJW|?vhn!z22a-e1yvJXBDjD3puj?@>~c8Y zgovwcfVw99g;WJz$qot~DFWE7V!P^NaYa2O{x-u#I*^t{;0aB^arXAt5Hd92fsmmv z{%~@VeT9zO2c!MBY}V}if6l+oMTKCA1n!zqUF^OZQ}yDU1bel=O4Xoy^RTmadv_O! zDj|AVMiMk&W8e*4mL=unXwjey*fCQLZ~(|wl>dHGM1rD2{f{4>c>iTtl@c}{Pw+O) z-%ZZjowYPEzCOR6!`+0J1KW3#fo2`AkrM}Y$V@y(wUKd*Z?FXBQvEA!bfx%zM%XjD zFLN8ek}r!sJ`hRxKKw+5^F8u-uOfb0d)86FR1p!G@GY&FkHFzf6k;h|c$n^pA*nDw zp=xi}231@koZ&soDlFWTi<a4Uxa8(CA>$bdXU9ujLn!%|JVl?pb-fv<xV-0_j%!Vn z%HC#0jJvBHbC23<+xJDpq}&Ji=UB#}){ZmxG`09T2>AawgX@kq9O28Pb#B}9+B1s# zGaUfy-5DaC0^AHBbuNkGKF3?g!kiC4RDnjfSZyDFRf|*`&RR5N)~Mj)9*9Oi_-^<~ zU(P6*?v3o;kF>?lzN@lBvZ;KEq$<(`{r0Z=w7n{Q$2_C2{<|4(A9y4KE*f-?)A)q8 zxZm_GWEqFzlXKIP@<!kq_78H~!KfTQ6D`v9k^WJ}GFF7KB}aIGJ`6mWH}g-@K@-Ua zK|G0TUuwZwHS%2jes4V9lt2~+-+$Yv=bA=$$sMB>_qs`-3OxUlv0Xf0S-t(8@qL@{ z)mev7U0rqFx+o4nYHgOp7taLAM&KtODj@`$pVzjZ@*US=J|NR?)-~d7?nWAHB1-Zp z<SA?*K36jSodQaiBNj$V;jeHh4D?deQ4*3E`aNzT-9kJj1A0)_0@aR%jNw>=9<$P` z3WR_CPjp`9PTk{TUEp5&bq-FLO3k`y4Qp6)I!i6sIKctstGz%Q1S_fSu>XCZKg#R+ z>(lo(D&Lob!It-HMPGf1#Q#z}s8p-$<T?rDATTX;yAlc#Az@WRAaJh^Z&sHh&1-+0 zSVvXYpkIa7?0HtC<gYx<iV%E5=fF%>fb!+7a29!P115PkfZADzfUw_GP|=gIxF67U zRw>k;vuciry><ckU+7vM<>!GeEeB*a@Q7kuW7+(0W=7RvDOz+?L58_BcPgOJ`efh_ z63hF-ci?cblj&2N{kb_-FVxVC9^^Hn4;&X1q^&;OZ-*McD{_$!9)oj3V$zd>byubC z{}u)_t2TL%OpRdL3{v`Ifi}Nt7`v;{pL2PmkRx1TxSnZ494%|UCUEx$HW=unRI1k+ zd>|z^z#RzbPw!eiT&M!m;D!Zs<>~K04TPn~<%Qa6;Q8q;^@6A8*OvtS*Ym#ny3S*B zPhGShxT63h{*WAinWRI_#W7fQ97AQ-5jIv^BjI_*E<r~Q$EfQE|GS&2>+RxKwp62J z6G^RC_)u5<@tQnk;@HVwvLw2E3#`JIthCYP)n(@7;naN@spy+I3#VZhnUt&0nGvI+ z7b2K5Y|rNlV$xKEl1}fD(G*_z-zuCtud*Ad)f@i}36c7e>+a5gl2bBcq8o<9Qp>+^ znA(VhaGm`@BIO^vDK7DFaMkDkJm2?^6(`_Dd)Zhx5{x}AgvR!<roRKjTy|E$WKjn& zO_&A4Mb;k7xM;6DYt8q2F{w$YuBP-mkvitdP76D`5oni;V8M`CXr0b|hu<|&gc6%i zVDCP|WyZ4vxc%8C1p@MfGf`op+AvLvga{jlw=6jd=)CK$@Ujy?Tm;I%d<p>Hw2Bvq z4pi{7qNgc!ayLPR@cD69eH4_|lzHHt7Hrlso<8ZAIs5C_q~&MO%ooLHFFHRvd_`Md zx7|rPRB^X6-QW}3;A?{)%Uj4=?J4rRF%BpWUxc%n3&~Wem)PRARDbnTag&JlMQ^|U zIoW>s)8vwSELNSsAm|HeHf)aSTy9yj^a#SpDvZfZ^l#i^H#*;R|ARxrIY!!n4+h%W z;hFsH<yEak!E@(n3i+t#^fK+U^Kx;lxklwL4MB`f5h8FKF;;2B6*AqRN)t*E!Sj%* z&}AqDe6(-=pssg}UI|Io$*Es^XVVr*too}?`1{i&k|131?cDA5hTtF3d+_J(3qp$z zn4P)w^`S%>Wy33cPR&9tcbnTmzu{Z=oe_C$iB-o3-D*DF{lKV&p~f&(|KfZx<ON~r zP@zHyeHxs)eQh9945Sm#p9@U7)=@n;E_241(uiP<-00t2+-Mj=MhuW&O5d5qjyiF* zGwZIZlxxj6w1ZfqfMqhHP79(l&OgWvPoJLu6ej&wnF)(b;qBqH{}D4xFrS~!6L4z? zQ9Fg0M~bAIL*PiVJx=>W$WQCiY_VG?djAx<e;G}u#HV^gBP0LYJUw^w!@s=)P}H*L z%l|+}EVyN$R8kpkAmm*4G4*{6%7P~)V~Szh8^45!3WB74o<uynmtslj&=4~!WqT@W zv@@WQU!pJ`#(1>3jMO>yJLm?NPYnCfyF!^!^TG|pp&u*gF$0W~zU9G#&SK0-VVgzg zXvOTjf|?4O($=N~@)9m;99p*=&n2%L!7p%`I?3zbx~%|N;B97m4N5Iv%?Q&%J!ZFb z7w(e%JMG!4?#%GCdX5rxWACY!vHYOxe{^%*PfyA&H}9)ht7~7JvYhAqquy#H$Ojf| zB2Hrom`%@n50k1cul0Jo*}>vv&)vz5=^(Oz{%}<e3l+F<E%%~&mmE7)8uT40&YZNG zYQr4b2|>XMbNUR|`mSJQCDT<@XmTl}O!S9W_e_2AtNtK-x$*nz;>ktA=k8|{&W7iY z<qNYc;U#ocW8oYDY<$JkRQCgJ1t=3m6<0gB4msd#^v{fb@ZP#az<pca<Bztv+>Ybn z8dTr27GCme>ujCwqtrzIQoEKoD<Vh^`FXt4H=rdWN_1Ap;CDN(apte}TH&!BKy83< zretF($a<&%WvwfSITu~c)eVo)i>aZX5DgnT(a&LwWk=)g7Cl<TDCg8p=D%n_L4#&l z$W#_9UA0JxDe<~C(D^z%=KO!U(oJs@<KOjfg%Wvk(WHP8X$^RlZw$b5-pQq9P+u9G zr-SR8E(zb`d6KQ5pPvMk_l3lQ%-#1kjE<xbuMa!CU7F^aI5v25lZb>R{oUWe)!sAB z|ITP}!+I)e-}ld!fe^6-?tGxIs2BRQRVv(#MFemh0E(Vb5u(Xuxd*V!poJ<S(qgD+ z%EH39vV;%~D^^(3m88-<m1X!OwFPVCh<tRSzwO;s2D}ioy*`j!+^wL;Asnme7ej|4 zs?tzOwp^WgYwAXUPL(c<C#?2lF2?;;<==x}*SCGo7WOvuuu6v90;W9{IaS)aG*2xs zNYH852y81FnUS!5)f!HjyJ<10`^UrI!SCyHaE|W|x!ziT%hh<xfX$ZjsNAJ>0l)l# zI3z;faTwVKtY|vDkX}+&IZ3WYVVnP9{MCsq#hi0KM)<#i!aNv_W|XN1U~rJCla~o& zg2IQ_V}a%H#&3eld@26^ohuaWHKCs~6s1(#>_!kQJ*|#(OVCPJBy(spL}f3;nqlUC zbW5JfWP;LUp^&62Rz<4pZ1OF(JlEK&f<f1F+-dFh`9?3s;BoFXhx&D=OZ|0JU*b>N zoT+E`E;gwmpZO#Vh8O~D_Hb&=KH5(s+UIcPHQcSzmlHJhnBiyKYg$&L_J3-*eybai zwkBpTTL1kpH#wH;m^8=Wk4~4S;5u<zWv$V6Boo_EGa6cGX*=>`qq@{|7cET~1_K@} zZ*x3vr&qszOY@v~sl|8o7Y6U`K;8m>8bwq0TZ3H06@OLpVsm^xC6X^S!lb+-D;y8l z{0Zf}-y*b+wgc|YY}Ie(di?H|`&{=wj%gs!=#_JHi_r8roK^USqv#>fT<*w=6pL<) zd+gg?mvL@hW(2)NzCJ(Nz8qbMdO1@$x9^p)|L`yhRAOfuzAnlC#9c5$;-OP@iN$Rv z#p0KUUTZz_gRN^7>|d<)f@-`%Cj=&(Rt|ls_nw?A#Rsbuigj?DSv+|}zf8blcX0I8 zl;|OHwEcxn`)soZMJ&nJXm~WB1yN!1bxi4l>#(BAE6d0o`6b75xL4<#zO|t9ImYaH z;p}$X{Qw3+)ICE0Oq<7P&`xf#53f8-B9>t5>X)FZF?N5#*nas9C*<6W#@2O<U1%&v zF<jHToOJwf(IFNh*NWQ6xi&@nl@5-{O(I|$i1D#0sv(%%iJs?~pbt&9Z9A3W;soEL z{tbc6LeD7*<W6mnu?De4=7ixLGF;RQFf9mSJS&%_Y>mE=J|R*8U&=)FQG5g-DB|UM z-H(<`;`(m%xcPp1toC)P_tSE@%g9@rf0$+1K!rDzd{+UxhbGl0*Ng3o(saohjP5+U z(fWTxBz*qD_33Gzz<kT*c%f3$Z(g2tdvE_r@q*Ka$JY?yyo_a<JTC!v6coWXmVjPV zo95-s$(zByjHKybScE3+KkD;uOAbZH-C_u4EVI@DNI4`||Kb6<xSg028e-qgq00ET z0z7$ZkINiDq(9qxsCE9kHX<o{Om-+gcRThRT0$*>{8+q}!mpO|tq8qXGB31}NH5bb zX#L-@R$`>-EudY9Jipkm&n`moJ1V<4C?k|u`ZH7%a=80N`mDd^@pOmV2!a<sGjURE zNs<KC3G-!D*6aOHBFfZNwVm7@(cijHc&UQNT7JX(vn~EEJ=ZH3MT~4%EhS$08U)!G z4Jivl0}k_R*c?Ug8UDn!<-zl<1cKBeK|_*Gv##|Hyu_ZoGe*9~`aO7fhD!oRAnv%b zHE;5d#STDTgUCbt!Z1>mb2aA!f3kjKCX)Zh(^+su*|u$a7zP-6=<Y7*PH6$@6p#TC zkPhh@q#L9g1(A{(x;vyrdg$(wu8(&;_xk?BwXXB1ecM8_fP4(d@E~-oM#yj+IT76{ zUknT%6%EypS=Bl8aubF<R#ynr(jjeuhucFK@NgvGI9put;%$vtrLJ#6>jJhU9y#x% zeeZsG=6bE~Ir%*jnE9+m6-@80-d!@>Y*b1=SKB#ahx}#WVeRHD8$I}qt09+}*D*03 zUqN|q-0pRg<mvzDNiA`&6yGLdwwozXFQy%JG4@q-U4``5=8>D_JX}^hK}M_)V8H#g zhEp^6<<;&~ff&*f1G7J_ZbHZ&KdFgcEqz*%O`Yqh#ov+9)Qt2&k+T~DBwGlj({;%K zltKXL5k#`J_98B_784$e<&w@&{8r;^pQor4=Yv?ZcE8ydOUq8_L4P{nZ|-<W%3gC) zXY6N)FG>c=vaUTpi>`5}v0JMThK97~)f$PJ@BZKUBO$uC2R;((Y)pm8vSaIQC7G92 zIiEB#MOrfW#2S{}(C_%wMw6#=iXk$;6YKxx*O|Wd;J@DL6f=2^#V3rFc=%_4++H5} zM-~#SQ;`Q<9f-l{vYV8^ss$05R>v0c>Z6RM7m+t-I8h3k7@c8Hp|-0j=6E{XIeGZ! z-w=4EPDvoZ#qOw86xQw4zT_S=Y1xZJHh0MHmX4R~Y!wu4mK}Jp_LIi%I97+BmO4dl zAao#EWSqFZjcl|(e{k7z(Mqj6J4X;1-4?`FG8T6&dha|&)?P%SwNJcdB^m*LILEQB z>Z0@?DDeL@QT+i4mEnC+p)|=$oTvHKO+wJaIUZ#&G8hCg<r6B}f8&;?S)DO2eLfZ% zc-wpT|H)P!y+sv6<TUZjZ}B=0rfVCpMC2^;A$)&wWf^{BAYS3NtlgY40_0&E<6%p0 z03LxF&kL`aa$V^}xR!#4(xiJ@;y$z(D1Cvm)GujiAY)m^$+8JGX108!*M5t70U%Hk zI(l~yT8Bg2%TuaE5&bsxQuA%#&757}zg>-!rsq_%=Relcfy0x8JgAK31wAUOmp=05 zmj1(Z^0FV;uDRT#(WlLOk+0uRgU4oX4v$!J18$c*#~QdUr$0-KADVbNEH7mKNG>bI zsh)9sEng9pjYpVijzw(AZVKV=s}RIN#^45$F+ycMtiRWg!Xe)zq#+@ln?kK$gY745 zLu#y-%^3`}h_o9a1hl90Ly4jkb{@Z>f21^Kaf=|r&3_lZzb^|GFk)VeewZ=3$9*1l zdYZ(=eYotn+|od_)?+lEXBzv$RGf3`Dnblfvgb|iUd1UY^>6U+jJdj>9=nU3afBbY z>`lbydSCW=zAVbehTN!_r(fq(Fvg3L?N=LXSmYwJ(qS5!OS*m$6@X=Xga={&<psJq zGvoKi9b%=w%1L!O?EEx$2sM*>TWsjh3x|u7$i}2br1|5%R`1;8BnDc*bQ53@JO<fV zLnO8u^;ytTYM!sPfA_4(5+ZOo#q54_Kq?@4KxTQFai|)HH!g`i6rzc}QP1<CMkXsN zwF;2C*m+H}<agL)up;4obrd^e5P!<5TkbM>V4u~ji&Xvf*Stsl-<`wKZ2mh+AHgF= z%gbfK9=;Urq^1l}dzMu+nNDX6Aad~4;n$z)a{Wj0jN)>0A?t~qt2UNBsPrfViAk{e zCT(<1A{Q74@?)@<XmXIr3yTsiPt^5UH<pRY@SEtv4I@p-8AV>((eI6c_Vc>MO2aPF z2-N+tf(jWyWyD-oB*x2_OOsZY4w(cb?N|PI+!HT-doEs?oiQp_^g{2K2soP8At7{| zIgEZ~>p1v*8*zmdj26|cZ{ec@F-$gR4WN+2O+s?vc$3t{YnVy`NCOwJA@Q(q9EmB+ z2cY-lQi=0r;*eN-K%{=pRqwF2gq=z8gm=5o_k32;Hb6tG$a10De{8h)587JQwMhly z<oq~QT8iBpQWV60S%NFy`Kl>T%8)!_F!K3}gNcVX-baR~n5s3|22PRVA4gb`6E(3F z>LFcF8`h$uH6)_AUoABs`3S78gMeADRWuV?ED0AmtP9H{VUAOSY-0Q)(R(G4;`P%8 zvqdWAZuj;(Q<J~%FvoueJ`O!!HjN|PPkzlJo~sEAVmk5oWw28UqTbSyc=c45THrns zcs0|@%Tb~|2)<Z(F+Cln?+%TnefGD6$L)*a%7%i@ey7XXlQbR96;bcBhcZVre>D7p z;i@rGL1t;$m39vTWF!Qmp2;&=TL^*WqW0;LEopU#d9Yg+(1hy$^r2)f!CU^U?t*|6 z=_X6*z0r_(wq$6(I%?`f$n8}(BR|@-ciEf$p~k4G?ZKJty;9Nhhb(yDvDy8JwC~Dj z;HYrB*LBKYcM*LC`G&ti<jlOpTaYZ3mRuuT8bjns{dk6u%9RKWgxAt_Ui0Zopv-6g zXcT+#oyZT}t+B#V^Ay$Z+CpQpnQsa%sY>KV1mWCG1j#8WCUYRdbUiW%DmGv^ZymWR ziw;YJTHj{g4N2`oh&Y*eGOdDtgkeO6oP3Os{4<e7-|PMYkwqzuXaS;98#jkPFDqY) zj<b1Rr;Zv?fG&)?Uh%M+oTQEcGZB&_Lx>dWO?-lc*IFOSveKJW=^$~{z37yaVO^?N zHZ}T|DCGB#8f9fRZsH|-J9v@`0za#ny)3b$IGWvCBX_hW16#a{M=h|scx0z@j(6g_ zW(EZ$RZ^JRF(d4EN7~;gOb%@AAX36sH8*^8m&pfS;`Jyw+7dkaq~ZiUByA)H{MWRl zh88b+4eU`8%zfhU0iTWPNv^V+tf%wwJP{EiJDw~DOL$!hoBqJAYm20u<WQnychFlo zT-_MVPKuq=d+C6K_<(<h1R5QX0XwD2)-##xY)NV9d&ICwd_Mm_Nn;DX0>qEx`-%#R zxxwiN`Wj+BVsRB@8#d?(1h!W7&7gr$ls0&SPitH9_%N7sVeIP9Ar~%(O;ZxpsoB%v zZyKL)N@T!FTe*k_BdbieJHL6PC<975-3eyU@&EMaz@KB;0oLu0$A0|3^dgDmQ|$7x z7{3x3>6s#fPjFX!QCaA_mArsAt|pG;GQkU5&<BhOnOA^Ys5k#-tgD3{3W?6&RIoXC zV`|N*c2+#!L=e(GmSb?H;%{=-1P2_#^m$P-?qsU27@iEZG5frr;f4J!WIu~~LDj5< z-m}0*vxg@JPm|jhlQzPC2fN`t++!N4oZlxOiB!Kym=Q?s4MR?yc&|AoKT4&9W8!P+ zx0Rx#Vd6dg0vvoSnH|f`+Ox0D=PB*KY;|y}q$kYeb^XHFfJLymiKTruQcKywcmV|K z)UVCaS_pqwSma*#^mmY&&O4NVjJpKPq{XDcV}>*NN5+<xZXD<eVj81Fa>0nxG+uJ> z%&#Dy-eCW37BMEPmou-9hD+mOK00-F(>ujo``p#i@#0<`b@D&Esym1)*E9W&f+3v8 z5><t+D+q-8&p5*I-j&cpiV`|D<1QB~?+`uQdG})*P7+u9M#H1~`_-e%qx0^fMila{ z%w@?T2njaMtS@0R5Ojk{xhen#T>@`nL}W76B@(Yr(~@uJNq5HFe5=hw6c5RnMyCoz zSb9zdqam1(9Amxu3er@{ULCNpIXYmVgtg?eGs9u<TvO@y#P6AF$YiFV{;35hT!06$ zUd(9`;3x<fvi=a905e~1C?uhkzI&;ZFIKah98X6SsitMtg?>3D)m|tZTP<gieqmol zuV~w3eDj9CrfVcWA8XXv%^i!d#TAr%UI)xb7>WgN>LWadxN|`CNT45=n{i#=)idTI zOVa6J%IPvt3k(GkJ!M1o5M^zmBoOB2TY-{D=8=&gkt=-31m0^FocKy<pVO#1zeT+= zhMQjl`)uNuSyPIg=Dxnjlx1h+<eU=0RRAk8LQNzmYrhNe%7>Ge0!5Xiuup)pEjDsI z=cIKpZeP%bsA)=}(qTqjvLQ9cbU%HRaNpiBId&R>MfM$pmhJHqh5~KK;R_R=bZmUi zrG$A1<9mFTN%M_Yo!ljn-RtxF-028n2z=&<Mt=XmfGR9~T(^=vs*y8aELY<J$94Jt zsSbcVM!b;DA1$s$_|?CenR%|amx*vpy!tb*zd256){3t<faLYiPECj_GmjKF;8qSx z_+jPC)JJYXSjO)7`zIG+Gz?)6YhZc#p*zc|#ou1q6&D@UlZgcMw4PO3j-p>_jT^-U z=^3To`d{AZ!}Pl&2!0~2maUHQsPNQh#(dE&RCdPmD!up|^*N$UJG}qh`L47(Uv)gb z2-CZ8sc-+bH3VL|T`#%F!S&67F|;~B<jGF9L@`!5LyOQ+Z$q-kY2orI>^#ZyPJbn8 zAD^?F7g^=*RHfxV^V(Nn$#4<!@s?!~9!yuIcY|*&HGkUL_&0X*dw&nopp>zQvrs!= z9GeW{sYS`>u@IL13_>>VoUrs<$A2$IWF4j*h)k-0GYD1K3j3ZCxgn$Z*_h&QZ*zrt zrZuJo?rYt$x|HAx1q#_M-Msm~Mp(9=sxR;S8z|duqlVrg8-1O}e!0%aNTAc#?&D2> zO1e@|mbv&XzH?t+4i+}^J?+ZNy<O8V^SL@oD;Aw}MK10N2geMVMii78LC3!o7Rn#1 zuhXk&f+N)EQRuADu?k;9l2K>1nDi5XeHHUIZ{9&!NTFCiqj@YYb_-D<N_|x=GTkHc zV<X)oL2Q|-r>hb2LF6+VN?D)xo2D=CW?wXOX16213}Sh{2=4~hZII^gE~L(7eRAkb zrN;!HE>kdpVCIy@*HdxA4J6jqO>nkQ^2`N=)Fa2t4?OOMN;5_$*;E-OZsJP6leH&* z3Qrv#iz>O;gq3zhB6uukPVlIl4Ip?;@KSzkOB^KLY^3$C5IocZDS24(n^2h^NVA&) z<b#XF_JScN2xC$%mi1Lvhy<#$r6ObeckG|&&FGiHG)A|GC7S1c5=T*yevGYpamf+` zFb;aU154`O=Qg><3GSNwL@nSuT9oX)(}^VGj*BIwJg>9A_3^|~aY@0GZ7a)PU%izF zwT<n-Z&4b<WV9x1-*4uYY0lPhVZB6Gw)ZO>UqXQ<AtD}wQnlI6eYwtgP&us*L|`5c zY=fS3+xP7{)v$GPp!OAiHutS%wx?)9FbA1966sTl@rthm@}?#*I5_ARWa;MFLp3cY z)}s<naimAg%*UMmif=0xh(;M>8aAH*usk6$63qgm|GoHrFyyL<tM{OkD|X4f;{92= z`9JZjAkME!Dq<7x-rWZ!+irUlYlA7I-XyZ0%jpI|cehu$YqDgz@K`d=5tvvyDXlQS zyKCf_q}=MiWqO~I<@Y9YLu;LRLj0W)jj~7P3O(fs2AAvWGEFsb<&pUVmy`uZ0rI8- zFFgz`G!kbILJxsj>rdqe85t3;xGym2%6!J4Bvzx2R`TLT;mKyry6&F4f2eCD)J>EJ zv8tCQ-{+Htq8uY(>Y*a=c)%YOA=Yw=y0}KaG){Z{=~WyWz^K8P*^*gg_++B8PK;3b zl9)f`E6x_6tnt2EXf~zT;`Q@XL+<0_3qie4Bk;jMD)2dHcEctZ#EErKULZ!-kU!_3 zLp4({GI{rncXC@F=ltyKrs!VLtmR$@_vv5r^M&;W3U{km*WJRuQ=oa0IU$uv_$p>i zz-to?{eB8Kv6^NmSA<)_$YZ(b=Wj-y(T+H@I$>3+3dxM_NV}A>{tC<DHbF!M7mgV! zk!B-(T|D$m`au*~sc$f8TUr>z(L2>MSmBs{Nbxvfpkuju(Ki4zMO_S;Lv1C>1VTdH zeIX%|@4A1u7<ESle*9vuuq=yd!r9f!5}@e=thcL<aPnq`{0f-Vol=KmGIuVaxtyfo zK5x-TzvRWto@r=Ay=$hD@qs=E4d)WUjV0x&<%h%yP1>m-PVFo`hHJ|gZop-=i@Ev7 zO~_s6J4~gJ_HlHcLEtU`nR1sfY3T3r5@l$Vp<D=S#9B9}pvynH-4Ci{l*MG?gT!1Q zyE29YtAcm3t7>o7z=fOc3#~o~|2+fg+fIK^6L(#G5J7&>SDyqT)6XN{;{II05u<XW z^e$mqDneJUlwn~O*l7{3Aj|2aR{mGnHKw#bOBMPyLLHDy>&s`FtQvCNG%`h5JU$kC zuiaSl(N{|~$dT%Y>Ay|emp%@zaQrO1p=tYfpUZ^@6^et-M_<w=OpnQ0%Rw5MNE$C8 zRv6BTinI&>6@@j0>1yk_2q@}!R@svUX@!?!G@0r;qU}TOj!GN@&Wkq8T2E5VyjRES z7MNr4UBeGAEraIh<kKeiLtxaJwEfDxm{6qbqq72*vFDcua!zhM_uXI+Pa6^8#*Fv; zoX2d!SDWJn>IFDk&(gHGrvU>9f4}jq8-FjUQk9>%+(7gss|TELbr1~PceU>pLI9b1 z82bSv4fZOTeX&}EQl_J;R#uic!#oDU*RNY?Ch#A*2~ayxLVo0uKvnte+?a_m08HGm z$b3BfL6g`1dU~RA06pB-sNB4bDLEUt_qwXe^i_oXE{X%$*?=(2tXs7EejYb6$K_Aa zXA>rc^g7sJq5|o!T{}U={~|ncZnKGY^?W;JsME8fFyEmv<{vGJ;1r2nA8D=)>J7wa zi|~Ea^>#_PeF4OO`i~ie*3`t2l_<vlO?Ws{ggHDB&zF%=he57OGuIr#|0*bWd7!b@ z{&U#Hy&wpygL4oz9GI};*3vWc(1FR(&=FCHLNt3*BfEv<0g!9SMo_h|x+A`cJGFGj zF`4pcTj`_|&^m%T|7g$44<~i?f{KHdQ1;dBf0N-L$M@Tr?(1>&x{!vCI^Mr*e2z=3 z&2ATVj&G;OSNu-2{>5N2ua;t186DIGJJbHP$EXXQ!keQiF&lZw(?9;Wrf%CPa`L-Z zsti0p(`dV!$r4rj$uW>z7GM<}JKtD}OCwe4FXnmtr56KMBeNvx>zowDl!3};#pLOZ zXB`gi$tY$_#u;a7;&Z0sCcwys_JUkU0jP^SP$;X~skw#^`de^D3;-p`&KX=BCLR(S z^Ebz|k2Hg__f(SwgUZd<<>M;75iFW}QIJg^07R=OXs$0EF*o^DU*aH31OQxA{5r6D zgy8tCWyS~IWj=4=t~~UdNH^x#*LVo1GaF}o{rhRTpmaX?RkOlMq=f^YX-3@2{2a*I zz>OIfk1q2cqdun%nwG|j)-y<^Wq=yQ7_zJBjLl4fWH_XD-bducC&19#AFNznhHRI4 zAM0VqSJ80iL2l{K_s4N^l$%mI;9o99#pCcv$98|uWuzV`9|%<Y{jGea1TRK(&St$6 zYfrajj@c+$j|x<(>52;=+zleOL>;&N)06%cQhW_M`I}^HF*?|`6DN?wZelu`h_){Z zuFz+7RoqlmbT%E^<ov`AL&ps&q8Q8`=?op%0>Q}o1!D5V^A%9^*a=|6+DMaHLEqgR zw0~7lAr70{PiRfvW)_iO7H#`uOL{;BWTTdv%Hl(~m+ni<?hykoEou~MJ+){s8-%Uc z@{#V;B$0|RAxN|vkw6;X&hvZ~tl@XPMl$9(x;t@sn1q=nDKsuDh;}rjCnyL1WHD@2 zq{-*b;)&Au*~cU!W0l>OhZ~#El|<NeQ2W^o9W~jjO;@pTWb|Hh!2s6QDu$Y{#&@Xr z+*pV!)AC*B<3{cjA6FIt8jKN%Y$z2}9ZeOA?m@jwTrDy<N2*Bs@ymJ|Nc8^R^V{AZ zX23UuFm=7DiG2d=1rthfXH52BwrL^}I*Q66&VncMe-E#uA3C5^b2=NYB?R)cPT)sw z)_uCQi4dL2Tjhq{G){!P(t7y(+;QQ(JCRHS-QHGJq9zqBmv1AZG|B#JG-4P5X7sN9 z;a}-Us#nnL_<b|rAV(+b`8M!AP~vJZW##6<-|YGD?QG?GtU~^K_42nnpH%-AjrO{! zna1gbhAf{i*!)7nYIH^Exa62c_+ASJJ{0Uc-z4tjiQZeqyAWj!oiUWCIysoEmUB!c zzN&BXiuxk<7hRAs|95snuvO8YEnxx(N$JZS8UX96+n$cKmrUGMdlT9aWaExEXBy)d z@hNpbB;+-a=J>lZEX{r>$7>bgYlV-8JeeSb)%cLl3msci3pWhMgJARChIp|9;px*; zF{KHJeE%JC8-XYfs`Hg=3IqQ=0=tgK9+sz@63?;A0?K$#v9P!EN(_;I(nB*m;G+_= zM-CNANZKg+79q{bZre5^*`mo%6$HIz0f{9F1^sJFkz?}iza@MY%HzPFA^Du!nqh`* z`~AJdy)}+pK7BR<VgZFme{3FU6Re`)Xgv2Lqv0J-C5zJTJKq>S$kPInkp$g{fN%!e zbZy*bz~W#99pm3DlNSWs#<i(uACZzlKPt?KRwnW$VOo18d9+6S(~Ny-Nw}5jeC>7i z5Waw^i58zAzl}$z+|pnolx)!1gSFFH@PaP04@a&N4B?Qe0)Ru1%(v-G2nuL%42Qle zcLIqMS7)k}m|f8OH-p@;AnmY>^4=6H!I>0s&KC?a^Jwjom+<%)jfBYE%R={Iw9@~) z{{_px_;W?nWi!NOBQ6s{Nrz+$ZeQ}4Rw?M*L$MFZJ?$Ym3w%10t88_98cm|e;{TNS zW*ITJ?3MOrW_E@+i{H&{c;YbAG%1s)<Nd`oBS0Xz+LY>ei{=#buDs*qZkcXXmHLPI z<G7bq`=O-YE|g~1y2p2Ret68l(~SI==t~#6NCR3P2mn^a#{+liRc?CYUe5%K7rZ~_ zO`JR?`jU2)2*bTgyWxSMLI*<kpSxseT29w!Jc?`o1&q^_yM(ob0N-7)kRs3VcG|P? zuJH(yjtnNF&O5HS|8_^?(2bl9PITsViH<3XQdhQWI%0GsV$szTAeX%OU9yw+ocDBt zHv2eZc0N6h@bq$U_>3<?Zs3!x3P2koOGL`Y`R0H}9)flBSuC|BetmzXaqFqY@oAfZ z`^jGZrcZczY}D2s=d^KB$erFr0N+NlAg26#gbd0M48LLI__#N6PzH>HXJG}jNvBny zXXT}o4;Cg*y!Vw&ijIDPXS~gk8By=Eoa>#>32W_oeY|NYyIGa<hUitOIrCTZOj3P9 z`fB0hrbbTi^WF2QukgynkjApdKl#pgT&VvrY;|I)MPBJ?F$$qe40QXsNQ9AXd(z}l z-~Jk3eyF}!d6*p5XcPO8V&yZZ{iBWf?RJG;mF=cx5v}7P-YY_mGz>bq7$6?zU{sR< z3{6CiV-w5mB|0IWuqsglk+EgRACl10j35XyrB`yN)9C-b`5ui71-G8BbaM2^O6%J0 zjqq{X!R!l7r=Lw8snA~1r=l^k+Zh#^o~#*VDa4W95w#iWwZ|oKjfi%VxSi_R@ET8? z=0y(Df`UQ%*X4slk{L-HO_6r8V@2qqO{I2UtZXdwJVP^$g*b$qHw!1Qv}M*v`Px2C zbO`fYF5$a=W@(h6=PxE~L+J;xkw4qZD+V#*4=f;m0~)X&CURkv!aB#2=f(5jMK8#e zox)n>1{$)!yIhUH4a{r*LvmuM@5N`GsYnJiqEZMQ=_)FF3{8>YteXP<99Y_qy5l;S zg~og9Z)(5i*hd^CFBOLs15qj)<#PC_X9<hjmomGs5@Y7kZ46=Z7;My~pLCu=;hFH) zCAHvyy}Q02o`FyN!(xx~-vdp)Y^})OK!T)gIBsi<UT^wt6GPwIYg}za{U;?1PJ0MI zQV5ISfkQ6Fl*_ymDOc=P)<F;=sg9S6)+dE7s!rcWjMbZqKD4w^gl9pLWGUGujbG4b zeu^jFrVPB8ArG@DL^UHY11}Q(g<qfrR3vj4eKh}B?3dz)##c34YG9D;Z;{WZ&6$@k zo~q~R=go%affecVTaBfceug?e93q-YW>@h+8HX<f#!k<YqezC9QRc|G9j-XVZK~8@ z;(n3jX?lGWo_E_tP}$b*&KH9_U54g%Rbj``VAH?<R(5QeqMBa^1aSW%ipPMA1!u)i z2X)ehf*4p6Pw>HmL9!L!wQt;)nCQ}R2^I=BVf;iv%*+t%M-FzKf+6g3+A#KnG>fy% zO;y5IeLv7)NSLc8?x)gEGd&%Tk9XY94?jD+b~a`DZM!GmNUo&EDj}J(a!}lX<8<BU zD9w|3%p9ycJT8JN5f70x60y%4i_+c)BUzYg#Jumoit7?61jt1>@4k>x((|gaQV-B+ zVwp(&{V`h4BO-%d^pRGHbe&qBVw?(&<`!1n4??2tg8ls^z+u!atCL->rr+<-Q0IRY z8yv2$UOu_w*t9l#+;X-oXNXc-|G~+dvA;hN5R8dswLp+#QY&V(2lIsGwPxmeJw9AG z*|$F~U>Z~zQNAfhl6$ZC9K}v67JA6W(M39l>c;feQSy^hQI%S7L3SpyYiLteb92ui zK-&wo+;5$=EA>P%p*@CkxcF;u#&>d%7MlWb>eu&h6d`kZmk1Y7q#G8Y93Bv(>qCx3 zY^h=lxLZ&$CBATAz1%VHedKMbod&|=G9_?2O*-&EaLOfiIpNR4#6D6Ovs0*7NG2X> zwvVAKliHV86U?Vm2Iu3l&nMCsGvd*Wqh<WRCd$2Iym^&;U&$(A`$<WAZmZegkOM~$ zFQ3*&KDj->p%^tdA|jX@<^7s%zt#5BPj^7}s|?SD#Wv2)^H-)<A<}O1PdmNWwFTz) zbg-abo35<T1yxR}Vigd*P(&60Xu*A1<&QD(zc}}<Ify)4z6*<OfmWb5yB+xpe`3=8 zxOH7spokdY`GlD|O$YWnDzFN={1t}TkH77KH}^R2YFuC3l(;uG!kb@sXbB0nat4Tg zJgTodAx@yJj;rRy`As@I#ZMyiZLjkV3H@P;WL)aG-}8lquweGI_o3sduf;$i1~15s zAJlLeMF#zs>Kf6?ZZ7t#C18@dz4=qzGNDuZc}4t^>rq3%`JV#rJSo9Ej@VAUGK9Fn zmtB3M3Q00!j5>y9<lLM&Nw_G5VX!h|=NhU(Cn<G0E4(N2p++OsKh5600zet{hX~e% z&By~y-)CS3a<I`JDprh?7h#RzV1<pUINDmZB%&Q{H@AJrVjewX;BLD+m%gWYYFKG~ z`rUD5(D6`0aS$sSSFV=6mf7qf{&xiH`aL6$qHz;ugs^ZprO4ujs=-E5;10{v{mM)7 zNoVmTGV3$xN=oz9r|pPsoLGRY#Z!|3r~_G}?FOPl=!iY>!!2p)fc2ENmh4|RkVG>} z*l2;WP+Urc2v0KCTie<r;x}#Wd<(}`*6+RD-RtgpvBQts?>c`vwVV$Nms0`Q;eDY~ zuNli@OyEsr9IbAkt%;-&%JlM9JFhc|fYS%@74L@>gE6jJ(MBQB*4_GYa;E%Ia{f08 zJTdh25Uj#g`+N!c<bLF)zT{e#(ZZ5+zpk1z1~dMq0!|*UHwzxtz8GO#KX`{WReQMC zqoVrc!T5tEhg{W=9Aq6mU5lJA${=3k-mcOpxlxxwI(h-{_Ja2c`nW-<-(lw7fTPG& z$~fXOL%hOF$1GA4P{fS1diWx&<S1ZwruWkRV|WW*jC<SHVthjraB}AKc$(;t^LaE8 z^OvX5M~Ckh%kU^(#=@hkfBpU7B})Y79ZoKSNI&MPrUj?gjWa$#+seu<7&bi}F%m2u zle5GvjhprQH}10u1_W`oBZJiZciPdbZde>39@~hkGo2?@Ou^ZU!&972nkt`mO(yeS zGd!?t3mMUzL16?0&n2q<>nPM9eVw-Ngp9Jw5HBr`vKxFhJPw#ssJg8Yb1-=jnO6CC zlB%W4L#67_f<=Un`Z0m#z4Y9*e^zt(epsQE_9rk@^7Bnpa`VN`m~uj09YOEE2fLqv z+&PcG(@qxOL)$Z)M2TI4X%R?SStpe5bM)6urGvF4-^Es!+-K`Jy{X*1t8DZ<I;J?j ze@e1$znmM^=xCY@^J)30y1S$xpknK1&bjE4DU!({ArAEZ!iFC$sD{+}Dk-aL#JBF- z@89oR<A>m)epL~!7v~@r7W`Q(`YMqisHQL~V`nzF_Ma_3|12F+71h`2zCJ4WFF)IQ zQmWSd-*%3Ed!q(VlYs})zN>K*PYWwI3wm~qR@gd`+LcsTCUgUct2S$6$%$U@rbn0P z3eTsC@|)TN=~Dy5U9f>hzy%Ap#KZbL{GzEKXAsGhV%$_lkddF$8Cvu%UBRdrV+4!G z8UuY7Lv*+cghI(9)SG>vKFRPoGp2+-nvt-WZm0OD__*04*p-|hUY2BLSEqsM@p3%i zfqzyg9EN)IaQFseZK5k!#)Pw3GnO?%mH?s2R)w9dV#xC}PU8@8@$KgeuP`q(b2eU; z-|?RRqCEPLOS43Qny{Ll7FB=8UKvNIDl3x$;WHz@kS35H@-!%!k%|N3irpMU7)8sD zEN5qAd(xXIp_BDRMtEhg;PXd=Bc17(wN7m}b;$(tF{pnC7=)<dM{7oK@`6<@aoEda z4VR_FOG&PmT>FHjd<T9?c`QY~A!UdKl{k>J#p@eTeI;5SU3>G(8>hQ_AvCeS6y-gl zYT!jKEdBVzU~KBY9B*RCXv$gYlVY+k#gcVaE9v=qkqbvx$;GKz|GrT4dTWr;fZu)C zam-O1KecCtBh)v};_#r*nT@LZwNGBE(izUfjt*?~iO$)DuJeop#3DlKyLyrYgpl#$ zA>&}Yz*yB4qF~p-wf`$_PJ6Cp(YFr)Dc-Op7Sh49E}q8wXQy!3b1fMxC+r>#rdbs} zr&;x2)Ywd6LM1-gktnYAnsFPIxifKS&WQBi@r&SEdEZ4aH}lhq6+ud~R?mxE8vkRn zPsEzBF+BOtx9V1Z$FptkhuwRP_WSLFz$2%}J9icUw7`_|{fpdhJbLSsAilf<LCHX= z;xSIV9h%TxZ8Npg{lglXqx3`1&e#i_AaLKZa8xwIRRA}H_B(z|8K+=VPZD0&mtyuo z9Y%Bsub&ynt%WX&Ki&y5t^VL!Et8{EW;|Arcf`R$br3Mb1)Jn#i!^=&$anyHLmgzn zmMV^$eQqN;{^KlXxonQ5nM18kD-sQ>L)DY99Jo1B&jo=O9S?^CPEV>*ZYwN~Sm8i4 zXbgl?-C{|^<TaTd>1*O$p*QDibKr$aQ_sVzgE+~X^(N_?$qSA48})tRjs27=R5c<p z*hmE>BMgO^$I6;FE-arZ)2&leUW<^2xvIrd9)$@~-Ao#RjF(8SIhWhv3+3|aC>Ap7 zxZW-cyx@2_Ve>IUW>$93t=^gJBGS|xMbDosL;?Iu;PS$(?WCaa+7fsgSn=OYnOaH} zGCvAq{%zvx<m;mIVIwNYaCRNW;BKnn&I{qj8Pjz06#5u^@O9QvCDWAu0D7V3$nzmR zgCK=-_5uIRtL4Z)VCO1+QPL6CNfONTp^=P;oF9~Wz{ppEUh4ut+eTPvXE#>7QJ)An zdiD<<7rUW?|50@Ol7HVUb>jux)69K|-Bu=H?!47BMzLVJ$U}yzu2Uu&gfWG(_T|T0 z_h=DJzl)NePqR*v56AsJKLzL0>E{Mp2;E4Ac7DFE43!_zo^3#%X-R@55O{|*wR|N~ z4UzaK1^@=5L!3jzu}(GB!N)Dj%~*E|wqzX$<zwGW)R1TE*CDt}yOMUgYG1A!N&lQ9 znB?cUpHKc<##`y@rDUWeBxM|F<kP7@f_!htk|jPy(p`#v1cfnUs{uf=GBG^xY&S^< z*EEz<ApDPh{_`S{Cpm!onrgVE$K$&>W+z=?vf>7Y%q$X-u3kuXSeYsqg4c))rnBi_ zOuT>fTgu$(!%GOi$H`UrZfl1l`5B~Gd$Fug7)g`@2pgo7kD&Dofh24LVoRHi3$uOF zF%!)Y4VrGFpbuW()FxySSpe#4iiP_!1O<3x<xV7H89#tN4uZXjqt>r9>8*HfBbuD1 zL<^_fM*RMT<36i#{u^C%Y`x>i>v&G05qHHY?)Jex2m+&H8!OKG7E_2QUkEs8Ym>#} zP}@p9%_9fi{*-#|`PmS-6Rsis)GZ!O=vDjY=Uun#eT2`8a5DOrTNQN@k;`}%wUSOM zyQnRF7z)&ZsF$7o&|b4D0rVB%9?^|udyH|7k2Rl=^@L8U*dk!zhMz!i<k$Xt466ZO z!A=NRqaAuqfQ6iaOa}spmKn&(j74l7*(V)n6*cSRXVxaUP|`ea6FB*uoIT%K`<-?? z8PME3)M?7JR#2LwzJ$NQJNeanlPm`Y-gQcjkhqo4r*5->cO?c3(gCN{C(@U5dP*mA zhi&!hrHSZHAMNNyy)q@Vpwo_$Lh!!Uu0quOW7)Rv?v~y3AJtf9m=pSn{up7N411;_ zh9q2z7W`c9>Oa_Z+%|CsY%G5;;2}qI#nk4kdF>^JGGSY`j7ByJ!z9BD<IO>%_71qZ zm-gFd(P%5UM8{Ps$q>`)vfs?rArW-HAbc@kyAui&M4{)(d<6H-PmjQ@>(<RtwIK+< z;ydF=&!yN^9;SpW;(jqNw(VUUc2CPsRDA$BQbxu@d0KTILo>Zm*-sMG;tVqz^6uHx z>TKP%r>yy3EnYEwQ@{|^=<jZqTnr%C>#i;seLG9}Fx>vs7r*lP$ldN6sssZNTS?9y znZN~E=g2j0e^R&Wr*Th|J+eklDviX|)Z%fw?-A?cm1lsn&s6>AY<IO1>m#Ng3BFB@ zQe%+_M9zpx$qHf=ZexZIAS6y`!s=gu(tl}8?2_bg`TR}Ih!xM;5O3|bB{{t?wyR2Y zshdji9MZO{3ZbX4-aC&ugul{ZQ2Nr4Lq3#?!jY6z-!~*|1WT=Tc#chyw4Uku?EGs? z1cVpL<PWvthKs9WXs%p~@@s85ZtbLd@0grOH(<#9qt@_Q@#o(>PWy}}4M5&Xne((t z8UY0pvLRo*u-#PPxfWnv9+wr*YM}LIdy?2gu)*6ax#<5rPGFdyx2mcviX0dPi!=yb z5t*S|x-n1fDUtBC>q8&x@th8t&=Jp`*O>7s@=42rnKTH{!=p^wZmCe#lmxYg#m8u4 z;WwIe@mFg$mDT`u_qBQieaIZH%%8@tjDO}mXBbXI_LRMN9`1|>aEHFpx}j|^8Cq(G zixl+<(fgXZ+1SouQ8*cJvgqT)7mK;f{%g;Yx<r!}y%b-0-kYlI7@l63<fydg6@yo! z!+qTMr;AsbCmJ4A_+1@xEH$TLDdp<QIl&acy+i4Ph7s^A9=H*iCa&`j?VAuW%BN-7 zq9ow@@yqX+y@tI46vQDqwaRWBL9l;#17Q6dW~k>AQJ@{AXcPC##dGajntJ;!&7)KN zvhRi2Q{SSKXowq`(tc2B`}Cz`-5=#(7fT2v2vrL8ElSy}0L#9(w95|mbKmprMx+{I zVZJ<$V{}c<fI0C9F+Po3Q4z<aB$?OjF)4V!tMTO@7!1h=u8-5EpvE0H<p}0av%iRc zt&S`f7eJY2fnNeIXWLKt6Z6VoDTmXCKocY-tMYQ*fg|rU(n}i!7<?g5jY!xKAni}k zao;vT?RS?lD)9+tWnrh^yVnH8ZH%ojB%75*D~RtzG+ZPj>7|k;H#!`N!(xK8QuYWX z_>C;JB?OYfvQ7lo^J}_~+d1anuk%}2xJLD2;qP?u1%3GFNIi$%izE{U;AMhQ=uXix z9231^P%RgU8Gr{Am~!eXE$JOJ?oWI(d+Z(vcvQWnDeWPBPuF6bF9umPtc^(WfiG1x zmoj~(>u`I@j>o--l5oetmGa%jrS|(*=c)0mr*z!7A>$svkSi&^Q%#%2;x<|y={o+Y ztI7IkC_ISfjQ(cJQl*K5p<|e8>v$NN0}7$D@<1XRBt>;&PEYen0f41WTesWI3Z6Pu zVaV!fS#77Mj0;3wbE<|GD?5+>JxtiX-ctFhyR3a|lUJJjXp$bCPtv8KcO*~L%LXa& zsu7^jtS0;ziKY^~>XYASqTgcNvYLrlI0^U|FncjR2-DG9STI>wTm8m47H;^XAHCUs z85Qzrao+CdO%6Od@FDNfspIK~#=|~|Q}a1bf6@Ysi`Id=f;2v1h}f;+eJMtn5-G;P zj1jg?|HcQi7h1e;$I~k2ZPrTQc^6CWMPp69tLB?};g#2?Rn7RBMdH4xj1Y7HFohCE z$2m3<vI<NWMX_*G>Fr`mYRovi3B*Ga?&MD&LG8Q#lg5H}CFHs4tMBj3#r19HK3rZm z;5`|72{Pv25ojVL0cEw_uFT7@|Lh3U>7gO;^z_4c$IbNk(sO8whMynGp=O_ru3+)s z^KqW2*CsNS7%m|&t<Vn!m41i&DH_X9X-{3(dA>K_l*Y~)OV5YqZ?Q3(a=ip|IkZ$# zw#A@zMUkV4MCOtVj9x<L$%!UDC9uRkwp)yz`thyfrQo_Hui;4J3W=+<fV*u9{c2RN zhN{13Hdx3};)d2uve|!8Tc?_%!wnNx(JJd#p1L$>e4jRl96sHqPun>NuZz%oc-e`* z*)KUL%l-1E5W)%3lv3qp;A9L{{Y48~O7pOCtnd~+_=>LLh#D#$7XOI^fB<*1<`whH zeB@ks6A^vj>}>TFfX>?gi5G~2Z@o?$ffjG12>^|4Q};3$$&s_G3uOsJqh1hjOjiaR z>vY`K-B*}}=F@!8?;4U|8n>cWR09iw>t|v}lut(L>oR+hIaq?i-)Bqy`*$Giy?tq& z8;D6go)f>Lv39s9NKEIWk($8&3HPnlo;B_8;2V>r8Y5=@YKgzgT)uQaiMCdvNq_IC zE{c09&O55xJDV2O!Pt5tc1b907j7{gL~|yjMl#b|egVEOagDVLto6Ldx<<pr7l9Lq z+Xxc?01LB#rT-28L8#|g0MD9X+du6B*^DAx*V<MxsB>HOQBQc7ch3*aNXJh>shEAn z_|Wh_6Q2^#6R>9=a^j)I@vlZ<nj>FLhM<<U$-h|=y!TA9f`-71&hEHSX7GS551Un3 zXJo{irnmmqWN+#WtjJithD<QOb$j-FigtQBrg=K8ydC8Z+=Clv*b2ljOilKen__ow zpxapF)|r7|-#cF~742RHO|FR-`JFC1f4<C(U-A1t5%l@L&?L8{%i!=oB90@({?XG~ zRK(sp_{JjdNAhJDNuG5yo%ztjBaw29VB#)3o_r#RK^c=LHF7Wg!>XEgVWfQ1S1`G0 ztr{j4em=B}mYR-ul3HZ4R3u>r(ytgJ_#wq5KQCh8ihirRb&vXw6C9Nt^|wn(W=-d_ zFBZBNw7M9%b7^1H{iIfLne*DeCOI@*tk)r#EY7P@NUL|`fdd9kkLL~pfjeE+PrH}! zcLOPBU2m_23^zHOaC0*|i2&NOq2X^7#~d9ul-ub!@fC{(-(4@d<k}gVxTQP2oPlX9 z`R*(k^p^!;@C%2?jOdLK7s@iw+HC&9`8n34QEa;_@zOBdEYV1wA0GUC@8$48{O$U` z(l`FjGf56ypV?(jQjOr&JC?iy7_qEy`d4nuJ0|KlWIUZ+`&d;JgQ<C6$VRGLF#*Hk zpXcS7vG1g@fZtC2fXdk*##O+JdnBC>i<tz~BvJ<7ViX8r(3i+e*Mne8DupDxJKk9y zGnhGFlPl0zaht95yCU#>KdgghZHk^;Pok@!>uxXW>^S`f9HMY6yfCB4!AI8d;bsVv zgxYWY2g`fEjqdDM_O)~|N_>+jdss(d0^iUt6spQqC28P?MT1n{`l|LAs)a`7;l^Zd z%$O@xT10K}gn(Q`U4Zj%w84L*={&+ysYYUk*H{~MOAep+cJoqQr2;-dAI)2@{7=EM zL!jlBDH%Y%l~rwFSod|o^ZyEvVmqYC<%2G$<GQc9ErvlSY7S^XiKaz?_W8mb<lS}p zyJJv%{@@B_<)cz^2F4fUeMd)BQp8nzO<MVvkf_mDY_DHN&xzh1^xt0#B&8eWfcuLM zp+6Aw62@0i-RTil7rz(`mIH)xZb_bkpSJ^_g9`$;%<iV|PuhIC8omG6bKQAN#xmFG zr0>ad(iE2!QwbIjL6^s@B60Mm%-ZnG+Rg?mmo8II9yg~?q_6%iUd-N`DE0c(`tZbj z=%5X!pjCqaAR&fH@<qErh@9RfM6h;7851(Un%e5V>ThY8T8@q*te>xGtUSTK8JZc$ zt3g7RwTGT<Xo_>M^(WP^f<Nw?0yL;0-wm)CJbfG)VwLRd3|3qm1C9fIZ$h1({tY?# ztvz+zmE|@1MrH5iz;B)3hU3ua9=#c)WoMmM(9u-f++0`=@bg=8^1rL_JZ*_@zefxu zp=G8_nNr8=@7tVdTwV2B4Q#+lsaY&x4Ca(o?=E~i_U@TI7jnsd9&JqTrrO0V`;SK& zJBfNUc41W6k`x<j!b=gBYi^>(MJagOk|OzKuLUndgz?)il5Rbz{WgD&OOIa`+Q!9X zO?wYSk6zF!nwq!2+3lNF8>KHx=ci4^<41>3(z*+8&>?BcqKY@3*8X1Bhqrl?9qsv$ z1$pjm4?8kO;;n*sqMjr}{~!S{MMN-FKchpKnHiLzA3P)9@~?qmBK@T$DI9p_Cz58+ z++URo3j#~d8+Vm29A+uEooON%j-4QRYM)}JdVHt(ydEM#@CMkV^Gi-{%8I~i{q2L( zO5g*UMr+liQF(v)7*)4@MboJDSjCbntJPKVK{}$@-qty^G{aY4^;9i)P|(oo;0-|r z(3v!QSpI(O38{;d066J7_i=vA;^ylEvTGwbz^eZ~__<r|2-ktR%JWCeBt?Et5Ucay zr5bd?c^_IMYtA_wfbpNG<Qoo*TdNf-<8^z3g`|8Az(WiGIMRVVowx&bB{T6qe)Jx_ zV)BZ3n}hnbwnY^2f8)(xn-=nNy`3PAO8AFFcG@5^9Ug6Z1D<R!mW7*4I{ez0j7x+! z!x>AfpD$CkG3y6Bry@pwMji3*B}(uV{d^pF5!rI`aA$q8@7Qua=cC8J9VKI!;Ve_P z3n-OU0Z|QzIF@2rLiyMDS)4b7D_ZuV_MDz~S>ikVGe55DjteiMFKQcw3{$WK=_WD) zfF9cb7gu*8=T%5pP4Nw1uR-HikShn)?v^6w(gCWcCCmJ%)o^7<Qd*&%#-~edtZO}q zB=JNm6?DgBe66{K<NgiixU$>Uj;b8Rjj*hOL?xqz=gVvAmmA>R$Ak8((2o6!S%eoW zCnZ}!96l7p-v~p8usu=K;8V<o*6$^;^b6;RJOz{BzOXT<r9^W7)z77m-oJ3Ds5DEA zONeq`10f~=V-w{p{@e_kz)>WG*X|rkMeEayU3_*UPzROHyMw7(adp0Y97y(dUrQ58 zFoD69-${IWs(RCQB6&SA<&>TEBUnkQzD`oyQ;NW$+GZ4pwt%9Hl)%<G5C4MC=Z&-f z{S^*7R=|q8`=Hz(#bc0#FuN|7Z#=3*Vo-)(+G=|U+{^rf^PW-^0YUipYp0RbPJBFi zRa*4^<3s325A+hUx20g`1X5NAU4wVl-CO8JX~D)g!h5N$f%-Xx8&Pt^dG+X{*GHb( zsv(slwB@!RyKR(2Dk37A>fCjD{zl@a_vIiqIGiSMk5FUAU?$!+ZSm+Ry-`~o?yw{x z-v4bPH#Eb`dDK~T5JsRTnUV6KJfz3f6O)5LuYifOA+AMeE+!}n)u^-44eQ~r>i)S3 zUmPCG0cEb*6``ziKLL0_yV^@@NFRUMfBxB~?c{+6IQdL|&Gz4n{#omg*P3@A96*!v zC;9%l%`%4DVFoTYs@jSv?AeDyf!X{4=FT=ZB!l7l!-BaF6|I^>2EacOJOzHcyC(U= z`}o2n*!Vcv@ACAw-#x<qgFYIS9@?8JjXd#-Zo8EyZiCy(8`X}xgS@8oPFF=npk;<U zI0cxAzeU-H{Ec}Lv9Dk9w7(QC9dIoiaI?Rj^`e{KOB>UH?!{86K79qmz#w)O^dQ#G z?Q(Tld_=6o*B&l0JWgXgo^Q&IeVnP;YdGLyPyv%|>jS(fXt5t>?tS3*;nz5Cc$rg2 zoE26?Ju}5EO33Gzmw#Ki3zn9;>_bue$*2Ae5*fI|b)K&RFYaG%)+e2we*X;E3d*X; zg@TNb6bEC<2Z5+ywXnve(J}#Jidgm-l$(^S?li}{f7iL*_bG118m%=huN<Plp+zY5 zL8uT|f@_O1oIgd_fJVys@h+&PGGp2MVKpcG=K;{2)@k<e+dEPJSC!@J`)u?HJOp02 zSwVyxBrqkjlc)F-iKo>Ml}`0~f>JNuw;ka@S9^;%Eo7e~l9B^SV=RIT8^YM&YElA2 zGVep?uvKxn&TV9OjNi^*g8W%xfJdZWT+*JQ7fhy{V8Dud8#c}>bb35-be*kU!u{_A zp%4f?nt5b@a-T(h1lENWU!0%}qb#p>eE{K6=VXd;rHJdZ1B=x4*}-v>tG`9PSSC-E z;fU|ssiBAuyV_;F-Fj9cUx4UyYF;0ZJFX{6oE}#*(#!(fB{Hc^Tbdm%4oBe&Wo2)O z>~b|nQX9U|dvNQ0TYG}e?C!qqSB_&`Zn5^f?7APH1|S>J!Xyaz0M}G2;&p%AKcc2m zadm(jp@u{Q#{mp?`Q6W3gtUNrLRyIF`Gn)ya5Y-UwVp@)lBKm7+UNge>hM`(RhhIK z@%WkuC{&R2{4^pn*A5#I`F+=!3u0KPuvh-sP}&03K<=*98(NW|EA8q}-UkvBU(ilJ zewEkHZ8BkjN$&!oAf&4DocpS7Kw2Y6)72*)+A*~pjTA+U)(I1}+>t!2+Ym@bBW-U9 z1vLAaeeHSexLFUMG>26qSIJ_y>Lid5L#lhiGOwwhRJ^~4;PD0{I>&%0z25+QCX~H& z%?#JJpXgi|@g;3`+WpsB!Tm|oQFtQ)?u!nAj=5v^H)eMl9hYc<eh-y*DdT=mA2=c> zEz9G(CB8+0Vakjep-FP7v;8&9=BQO0(ZX?#ZQJePdFmRHcL<7jX|3B^*Z~+20@JL) zXJ+CRvY;cTrvnFP*by`~9WOQXRzzm!)Zhlr@s&Z(El|~ZH=PMYy7>5%v%%C6AcbQM zXfFV(7QRRZ?SaCSaQL-lh%(o_+n4(D=s>DVe(kXE($WvbEF06Ya1s%9-1iq}4Gk+# z!cXB&fzLxE0he%3|E*jOTr^R@Cr!)+a^h7i$2y8xcRlOz5|u@z^<EkNxyqG*zOqFh zk@Kme`D*LYDi|Il2taCabPN8`6F&2@%8AWuc7F_61yosp+Xg07X#p6<k|HWH)`OcW z-$EVe><hg2WM3L3sf(QO_fqai>}V3bw}?<(P8*NuP*)N^BvT$%*PI2>VqW@qATf^w zYy=y<P{1VJFw#?<{MgnqjL{LGO;>Z|mzDvg1t)fqGOD6QbSoErtS3g_1hKdhf8g`5 z-Uc%$LQ<8r<$#R%;sa9hJfTo+Jzg-Z;`_Xhq>+M{kJtH7i_^pYW5cpH3Js9mFvU%U zt*TrAoAsTFB>q5gaXkzZ-7Q>CB<(af{QXn#i_Y$l$n;+Uk7R0%JIQuIsZ_Ho&vnUx zc1OCC=VBq|up|M(T0U2@OeZY!Qhhsj2yW=nV0!n1mkaaGzGX@eM7p}2Po*FfURJQ# zT%U~xEPx?wlpq9S`PZH_!lbF1A|GG`s3J)e$o1EM(NGCnpdGdGdp+6xOpyc2El;X{ z66}Tfo;w^QK6T6$#7Q<LW7s;+4=Jx9$JSsWMaWU2DBf6CyjzOr_#Yjc0f1{RG)ycK zZI~}*M=z}C<ZK>k-fpu-2}L?i{RYX$$|c5OL>3Ls$TGY%B`JOdnwHh&x}-(IQ^w4p z`T_e@Z!c-)Shrg{`{ju*wRLipQ)Nr5zvdG~Y5J0U2pO4;ERP{9IgM_>(P?%mBfWU{ zANMqU7sxz}m-eOSk`Ijx2BMaO)&=ZY(=7QxC6UTYNIU1oyYyi(U#6F+wDo9(U>VtK zF!N8Ay1G)>KmKUUWHHxc&GHq$%hs8Ho33_`kJMSdser8f`vfh6KS=EtS~>&5+u2(v z2tEII6K3r^-QpJ}qXmJ3@0IjMdcsh}_*}NGi2p~_S+GR`ZtZ%2p}Qmm8HO$yx*McJ zLAqN&q#GGRTDpdk4(V<fy1S8XY3b(hoxQ(v{=>T7SWn!{uQ16fJ&m5%HTA)A4g2%A zU(F8(uR`pT`x<XMAZVX(AINQ4Apw!J)P@52KV(MZRY0R<^u665uk^&+&i!BGaxXnL zz)nsuQcVrNm+@78*-S&uehD5kKIgVfMcbUTX(`@r5vzSK9t$Bjw)yB@1&#&qFjk6f zszf18gIVI3I@DRyw~;AH_<mzzqJWS92xh1$;aFtyRu>A))G8tiXaXr;F6GLauYfaX zK$+yyUth2E-eU!MDiW3F{q6kK+U#+3NA(=tul4=-;>Kso-%KkCR1Evn@J@|d=C9L| zu|sHlUoQRV*mSso;~x!`W%rBZa)D2K-^;#f6<5t@9clEEtw&s+KKCVWT0afBilUVQ z%uwmzf<Fo{&{t`is2x@~#;#Yjt|&YnM;`+jG9TJb#a0&^=f8YVZi)lv#tRK$)=R(U zddUcFP?x|RNPJ@_P>WBFF*&vzhk3{cT?+{0!CYzxa}B!@+I*`FZmyelWSao|AOns| zgaC;5*ba#AHLyL_AzwN0?(_1GHgL29erO6r8t(%w&2~y8((m8F!#=HVCT+JJ&LDGI zA0Ku%NbN;yuZtf}Z<n9k^}YGaxitM_rQ*SwI?P2dg20sD3UbsDkv~8(t#$BI-<z_v z=M$-lbU`CNRBR5l0HG>pV(-!8K7n!A2n)58?ub?4_&3YGdLG}Xk+w8JmlQy7*DJ`g z58_1QOcnH!VLZ{gwQeh<FJamM7No)A<a7#r+hj8olM32~k_X^ozn6`i+%q7Zjlu#V zO3Mw9NrM{wBhh-4dhCHxcPLegFp$&m3Ag#X^6tO+z)phj?UyM_nb3t4ar1RkWh_Lw z&>jl^A24yHZSSD_u#ju2AUKHxh~ELmOg_0j#aAly+6%Hh3SgBj^6b~m$Ul;6=f>td z`dmvdg#g2kRcp~!nxn_T3x%051%(3;aVTwa9Ei2m+3j*f%WV#!&;{=Q4|FjG1u|SE zIFD0X96IUp-%uAFWQin~0aFnREoN-D0cPlKc&(*`rFJ?tpR=ILXND>9gsW6^EFiep z0O=~3ch(si;<~xFZq;?+Ta_jI_zjU`r%ivB6VhieijL=kn;t?iV!*Wh%D}&8hkJO= z^cYQ$1V%>d5jXoE4lLyNpCv{S3Js*77Jt`L&=?~>J2P0kpA6#Y9xw^WHu>tnBU_(P z$93FFT6vvl4iBUC2xat4hJx1BdU;HD3;woTbiCwRQF&fBRrs8YRro!ZKa^))qd6aI z%4ot9J?V(SH^tG?N`m#=mVb*=5tr7R|KP4UoViJ8@`E7h{Ago?pUS&~3ME?V*D^g- zw*Got4cza-xXOWa+Q#k|SeOH0F*=JYXuFm9t_h|KA$@rxbhyq8ob_=n1Oe=O0k7>J zo>T6k*380o)g~YMLL*~floQ<AJe>=(u+SbICmRvzSI(&!MTSjsF%QdlyYq9#%Z|60 z@4>Cnb^b&9S=A)zm4KAoir0#oIZ{cDyUu62IbslEcdz`~7veTSh|PdMsa=&au~umR zoF+Y4)h5#f;Lb<!votWMbAN-&0kxuO6;aUm<3DGHe;NIT&l~X-txitEU9ou*Tr^xP zj+#Z_w_nD~Em1x@Tg3z*a5-*aIhi?|sR05$YK{$&1yxUDOM_5)09p)mDYuZyliEL0 z7ycVG(imo7lz|_?6~g`tVY#{xAeuLvbDsn<?XhX_A+2r>Vo2HhArE{KM!)zb7Xv|; z>t0#dp?^cjzWw@jN%)OIj9)}>XG*5n7=j62Ooz!W0Ip&vzV?m4c?{d2r=p(cxKzH^ z#eCzxRCAnqeS~C@zPRylh4^b2a5;h1En+NF^7DLyb&d?cGheKi5un(4qD~XNu0-F2 zrgILYl8Hs__~RB4I9;im8~b*`b~1CZFpgEY1yHcOz2Od;cTJ3Qh{>12WR*ARzczrY z#g|;-LR3|O5-vJB-y1^2$8LMqfzEi(zfcx`EwMnne*IiuAqLAfShLyQ8OJYuSNksj z7`un`pt=0_Z;eqYH09DaML~dSrz-HKB3Zn}%D?Q8?qNyLjTr6=JId|2$?|4$chnFz z_PjY=zgm<lU2t;f{9;`~ZL1yYPqN_w-=X4~1pFCp%$v;E895tG3w+aHB>Q(+ylczL zamJ{)ksso1ElF0NcBzE#_q$bBoDX^Y7AwC0Q=k9owf=L|zAdbT*mf?vHWGL!Vzn7= zQQ8x`e_+;+-3HPSKbhoS5Ou#-b43<Bc|h*$&YM!$Gib3UX(fmy)e(MM9X5BSl)gaH zgF?f}Nz)NZR}rz{kfS6GHZGD5fZ%&`$YiyVQTxWgGGOtY7)EK!ks2a<;O$NOT_6G2 zd2Dz0cVnZPog8h#$&3dv`RjF9mz?Q+g6gjSl<adieY4zLty__a3Z~~#!~c!Klht%u zzjx&!J%SRQs{oP;Mz04QjhWjL6a+|SoPXyvELkV>9ShP|=A1wziE{=b6zV;m{fl3F z>{R`Jzp3}OY1i^+XXc<&L1eX}0atag4$PVLTwMXh%9M}K42+56jtl6H|A<17Y+~Hc z7NQ|;Y=uR}6MstCsefLVg2115hAWRY#+;{QjDl>5Uk;<m=5YABMPx#=%lwI0(1pGY ztz6ixdv|btkhh#)xcSN^J!O;XIjzH~-&M=V*(DL6JYb_@AHdj`Q1(mfla+>^rCwiI z53ec8<5^YNEBbshFuMKh1oq>;r^#NDa;x!_J;n8GssyBcoi{M3oUtxIy*E>r3gF2F znv!;+mY88}W@3y&TWl8*wGe$m*6R!7Ady;l*Uf)UC^rnsebCM($q?OcZZhUKDd$Q8 zKPKgOI(UY@m#^ZN3w0F<fW&P6|5?=L)e5vwcg4xyHo}kZthqLrcN3>D!?kYAkDjou zK)O^MeHKKrF?K_BDZIaWDJNffAKGKm0xq*apb&hF7FjuqyTI!tqOHu{Z?IEElUqiZ zqsBI!Pj~vIRHMclQ<$e42Xv2k)3eaqqrdDtrNI}QVp$_Y^vYGuD`6P7d$x8wpPheh zP+f7oNEY)RXVaSh69qG+$a9>bdnN>HZ!0AL77bl&bLCZhiIETz#i6gw0vTR+kIV&z zH27=;^<34`(TU>v3GoCByPLV&Kr<X1tI=`=EdDAcfVcv^TKR%}iU290BP}ErO%8-Z zFp)o294ID*@Jft0wJ-nBS76z6Q@X8CAf8=QT!j~l*QqpWFj~_LOcvjsu1n<R>X{`w zpc1|s`yZtO>Bjfb`B&@lE=wgdDMBXRC&S`O@;n&t{vO0CNl+T8S&3{!DYqGcj9P*R z?=x0I-jcsi5Jqka{<urMaykoW>SFI~ndL36==nC`c)L?JAB@6iYcS`vjz&ko;?q_s zBe`tSO3%v5E4^4lTuMtmL7xJGjKLDLuyMK(HNC@;<V+^dhbVytVn8h6iscs~^e%S9 zjTD_UNK}=|$3x8dC`BquPRMNO|5@7N1u4OFYm~NJiN4--!+2D-|8-OE*_)_Nf!OYF zQ-^vG_E+DV;P-FF5eO#|pzJq9@%Zlh>a05EmB4y-@^rUq$8#H%*wb8#-U@G-QiU$= zw0+I|D241mDsdZ&F^s}KI4_Ux-{ByqzWSe?cTk$NkE@B7Z2F*<MotO=g>nZE*evSE z^^(V(3Rat~nO5bpWU@@HbZv#qg|lO^SDaCGZ}4Ea0aj@qH3BJGnkH=_ZA*g)A`RWj zTFHMro0EXp3j(QI4}5=oGm7Z`&&2O*Jyq?(aoMj!;|Z{thN_Xy6hlAqi=Q@3T7M&l z`>CY5NY{2dusP(2RB8OZ)XOH~f}||r)JgGUto37tC84Y6dc0^D4n|~ugsP)=tZ(ax zyy8<6(<La$2(52pOI0As1(9&(8Kt?6+By!|=)rsc#DCObA>-dN)-p$p{2r>PgwL0) z#9aHe+FfpVLaG3LC`g*Kx%ENsc#wx^<Vb%~81@duqFr%=ko;!(L>tbx_A-4BmxsTl zAKgzx;`UzA{DF~V*t&sWH(8!p$j;!)2_UZh5o-@jIG)*qkCKxCRe;b@jevoGfcg!C z;feh!8UGVV5-KpFw!dVVXQ`v}Q#iiZJD5vc*avC}R1t8N9vFKK6izh7V>U(=vT%yF zS~p}0xNcmDeLs;MZ@(D)Q}L{GvAxysIRtEqWsf({#DpxN;D8*YvmA@w#Yk0Xn>5p% z2<+)gWN((Kr~lzN?pn^_-0DV9kump8>~Tgl)AKIFeY~84zt!z*p>%eUl}kpoZ&BF7 z+H^FpZSS4UZf~O&s*3!gJW2?_P|`0Lz)NB0EuKtQ4!}jN=R%kIDFPIaP5HS@A<VzY z(WxUZJ}CfYVUSRpp#;LwxOtU+(gy^GVTX2Zl3r=I*%0!wWz1tXI$li_+PCc#{L*24 zomY%>j=*d2Eh5QjNVd51@QmcGWU{1hR`>?@+0382kn#4rkm%O4k(zJWf&*J6X}=HZ z<G;DHpp}2Q$Z+>uN$?srWWLdt_TeTRxmO7t7`-3!f+H|;CN(v;Fm;=#Kx%+mPLPq6 z^+2tFmb;kB>8aH}%VF01c{hT39ejiiFA<t6i=PpiTdVG<zab|iB3@@yap+G`OLy8+ z7ueXKx}%4QKVbZKf%&m>ak@~|{%g9R_ir7&T;4jJan~<MR{}OFna6zWjDsnS&9%R| z)u5uflu!e_r)A7M!t^8-K--J+vpxYdV0bos6^RP1LuLD<ndQZ5(Y+c?E{rU6Lyhk> zb^vy+mY`hAD6K9{^>(sQXA~fK8!x0iI0F-hfZv$Y;nuo(;k@g$wBR<d`pwtiwDza7 zj_~c?+RrXw+?T^wd2p0U<Q6u*{FLl_>|aud7NAQ$CSV?7DV~_X$m|3Z8sYv-LDslO zF8aOq827bF-CJzZ%BaJk{nz-X7-29jZDPFtu9`Sj6Aiw35i)6$#dsKxfK_80nHw=7 zOg{1lUMM9i5Fdzl0b1`wq~5!EN+8qdDzo6+u!mi4Zdw*VoVCFJy6QN20s`f#_u!L* zqZ)YmndPYugX({b$tw(|@n7Q`mx>inuToEk>&s!otL#~oRt|TRfL;nvVGsi=shNZD z{ITTZfSBMci~`1K0T5NR)jAtDrm@t&$HUvz=*%aW{PBgAm9?g3MPpg`R*l}VsoB^R zg?@&;ea1~`9(t4W;Q+zT>c~Pajs!E>2c#ZK6!vUkB@-n(kPlv{o2gj#l<nXN>xc=g zF$s~msRTzNnIAbTU?vNN6)hYOA6+A`A0GbcSOe9R{_Rg|{k;UfX3W#M&wit`A@)t@ z14d4#3@1(h)@%E`kh9)W_gNxJ(>akphSe~`KYk$lY&0yeK6-I`LdgEAFZ}X+m91;u z=ZKQ`_18)X>1BOw8fRn8Ysc_a7;JN=OcCA%jXGE`C{xPfH!Rm>;;sLN>91rAY~ZM) zDlFp;I|Ld5i2|9)y}vBq<&)dC9!~L7%<Oje;o72RrB8_J5`oT5AU`RP6&>p~G%%ny zE@mUgEAe}q+DgK3TDI%J|Hh!K*U!fBwp$BnWN{pmYd)<M#(p-fszd%F%Pk;cTZMYL zVZYCbzuKLg|B3g(PvQ9&0{@fDQB;nzpU&DZMGp+Nn+**&NhT^z(zBeh&`-k_PCW0I zvho>T!;~LXr12NS5OsKmdk}I|0tpIO;^Cv6UD=y?dKZ}G6tahhs8Q)6es0I`Fuduz z-r`=#ezTW3sqvTX;`x`Qj%_}B5yAFDV0q{?o=p~CD9w8(%iuU!NxV}h1(+0@7SQJ@ zlZL9}ZeWXD|8|w8LgaZ$KvP#w$mu%^12`X0JixM0bjDO$kuA9-C1?#kmQOThR8I{2 z0LI6p4xls#1)TEgk=6=LZ7leozGJJOQRPPIRy)!+2@`IyAg@Ivlm4wB%?MW7b!bG1 zgM88CW4HTMT5u?v=+Q2MI=l^cwH_DwcW`I5`nYu}T<vyxto1A}wSF*rNMA><M9o81 z%$(jsW;uZKnUn@k%lP#*n&Pke<&d)(AbfYfDT~{7JHz!YQ*`$04n)v_I9jXrRVB2O z@N9MptugS}!zvEH&J=1u*25jQZ_}GBW~F2_azjTh1yP4`b&{2DV_Btq&+<bAff%Ui z34+mk<TC_f{Cm((>>R*Bahzm`Md05OG)Y4rJs}u0G$9&j#EsQ>a@z7zX9;|J7eANy zzG>s$tbFgT@cHXMzS=B^@<IG0e$<;9Czo8G$#@%GP8>y=R$O;oDa8F%eH|zkdt6mD z^f;c;q~fHEG&xwk{jt3_PJJ_)_dBh2K~Qliir&?b)fh_8N7FzjqJ(@@Y*D;Webu&` zIg-8DDdfDpO`0$<B7gDe`@%ZTD@}?K6mVZ1`xghy^luk(GY(i^kWyzlWL#*-y_a$H z+{;T>88&c(RI)H^jAiWvo}D*!YtGH%Pzd^5F2pK8?ZpuOlfaHf<K9VcPVhdScH!o& zBwwy<0|+eLwa&le^rF%fM0@##jD)pEdEJ3KLe)NF4tRbkV1aR6cToUL<WalEq_a5C z>ecJPc&%6_IJ)0a2u(t8dvI!uGe?Pb9bAV8M)J|Y3I)c9uUb3317mp5++HiCxuj#B zpqO(rW}@BK@w_SRG9}!(-H7S52=zV7m&=Z8BcHofq37S@YyaSEsH#e)GTS|Ur9tSq z26pnj5{)Jr%F{`X8W$||xn?(|YwrE`G~*k8#J)dQ?HM6Q>jq^i1zJT%h1nqg@CpJn zp~@6UFJoA7(!J-=W&c%BNu;=_lo6l8Wfpxc41adk&-qe3EM0E*qwQ-R%5Znph7zr0 zZNeMw8{n|Y5jahc<ab~Q`huu0x&H7HIse#uJ6>fole(Mh-uMW2zSr;7mHS%bUcKs? z+s-JeqngJLZ6`EyENN{?DskY!45b|{W*>bey4}D&Z2CU1|CjG}A$!Neb-kNwPlD;R z)!*@Nm_G)sd+%F)PY~-#)ZU^?cn`Jd(bL`>83yPgrzFLSI9I{&-uj4RrFI^5nRm)a z>|Q=|GHC!fAjxhBn4Rg%*(#=?3K*QIp)4U#o4r)V0Gr)?rLLc0Esy{Ze=luZ(5F1Z z^F_16#~&@C&p*ePoyUKUrUKB3N69?(e^z@H+1PTW6vYKCOYLTj!O+P(_6%O>ACG=_ zCtK{VE09Z=au<2g^_&4)Uu&a-7k9=CjV|lh`2A1uw&3gKzQ4Mf+AB`Mi)zE}bm};r z&Zd|^XXOMgrNI#<F1z`;d5Zjy%>$W%Uy%q65>6o~WaA=nqTT2N6evfUIfHA3k!@5@ zFJyWMR35yHdjv~YRqt!d?s60hi13iOk3+2f^KQjQz?Y^~2&INN&+p#l*cMMwP?Afo zFXSoxw$U5_{O~iubGlu9E{7#LbS{7ShUp=n%<BI1gvAtARQeLYEF#@AGS(_&AlpL# z_(RQ>oWidLIXkE98VO!&M5R*d$d;(J*9v!0LtL3%VSj-BNLg7Kfp@PuxP@+~mrT;` zEceJ;WrRYw5L|TBf518)Gd~)8jXzRx!7Hif){5(s&T@q7JTwzgc%XEDLJ;^dv7_U; z5O%RVX2(bb=o-?S=eRzOHfa^x5Cyd0S2Yr*D}|LIb~c&uTGh3Jic@+&Wx)qFdq)zO z<Cc*ACOn^o@fmqMFODyJJ+i+RFN^-GIxJ8x0%P!U&85a>1zM#P)>j-lB9_S`fe=`T zqkJiDmVJiPNbK*PPDQV_Ss09jcpALQ3MXM~oVI<_NHD>??Ks8)43*WtK6C8#Eajo; zilHb45o)}9awAIk1nKCkAnKgv@;x@3xz3A#KyzsFMyXZZ(O6xJ-rO>SCiaO;guzPI z!HI+BW@r5yASc)gg@anL)F#7VAR<-DBKE8IaK5RfdM<w)Kgu88E7gnx!{=SIm+sT= zrxkaJ>^?i?EcQZ?a#^14=DMhPGvh+W8f7t&yo9^(rpPi3_RRj5vsaIY%c}%-nt7;a z)3qVUy(}9bchWo4at9W;(WSHCJ6HOuTAtUY!$~XSq(vke)s)8m*9u5LC|MLXsJvlk zY5oDx@=X%8_7&y7>vIFCG0l0JuZw`Vl+qG2=}(dlsG;ax5E`0-->}+?H;YB#1aH+* z7+(z%!QvXR8oN_(-<0d+)O?)vdya2-qWksK!(gv3^w9)S10Cy<ARY{rj7<63$tjCI zYh7NvCHV0O?c3<T^{v-Rto1@w;TubKmcbA2v8&}JYq1VF(kkSx7mJU|JY?Gk_LtSM zN{`bM8;kC>uj6=Ic9vz`j(3+vTim=k*4})W+lB<5FhSk|oGH0|+{e6!$=-oc1hDJX zg;>c~-<F;1qKpXasc`{5)8T_kY|uI>1zvxnfIyBI7yj{tc!7xR-T)02d}VY%;;R9O zq*$TRyBLih_bGJc!cRbq(BuY74DP>Se(mfVI(*0~!JCf$qlx=HYILGRDFC_UM>HKu zVe*dcvwklv7h$nR-Ju{D2odh4RQiE$6PzdT)*tcJs0Ma7NAmf9m?AI;>g&E(Crgc` zFbhx;BO(Ij+>kNR+}Eh49M6vM#sCb*uJYZU+qpU~N&bB_2<H?<OF8wiks`9pUs83r zU3a&$2L*r0c0l6ZMjksk2+VAYPZsBeCnmtRjZFiFox)Rkd(e$(J_318vHbNzS+pF> zm%+k<v)iU%Yx*Mkz1?pw8(S5kFH^QR%Z}Z9Vh`~CQ~m|gC|O{Tn_Im}PC;=$wzxTB zW9NV}8qa24=WM^@@wb(`>E!aK>*!Z!>|(?C)k+mozuvd^c6HFtx%5N)4H0hMNNv6R zsVW64yYxzf*pPpnZ)V9fI6m&YkpoxplX*aFX}T;HlywJNM+}jEJY+-I0|_nH2@YfS z{M)`NF$1fq3ryWOQA)fu`8_`jyvH)-a>G_Q5=OKIE1TSZdy4kEeJp8s-rYOB>$%$a z{ny&L3jgAIX$ZKECEB39V4VPUC%HYLxfP@G+WdKZXZf4wU9>Ar*hT4h#Cz92GnLws zL#ul+;_^%kV`KuIqowZSQAgz<Hhg9nd+ux;$iLHp>qUGj+V|`(+e6vEDR1a~cFHR| zRzDI|EW*t!Z5}sLmPH_q>7c+AN4`yU#ax(-N85$OuDz;#SBv6nRO!#>`&ZEKJY}k3 zgJcODtq4UA0j)Q)=vbW)c{<o+-J$)s4o1ITM)uCj{`$3t)%y}QZ)H%#(ErDC5h1K5 z?K+)s57|~$a3W_NJqc(7a<cl&>7*6XwGu%<1WT(%QabtZn$!8g(!^!gFFTjboe({W z&~*ZQ0aRODDh7f_;d)ycvhLh|!w2I6HNKTIqy{~|w$R>8hWv_?mVWO1>hI+6NoSFZ z+7j^UD!j;FEjC+2{Vy~Nyr7PVs<uC+5$8Y5;5+R6a<sSDM!<JFy%)y*HsneyFh&gD z`eqFPNH)T6Tc*rpg&uqUKKeID{n&xy1dl+D-69wUF|4(z?rN5+TF@kSU@#Kgg8q0` zML@<YkMKCHKG#d@VgZ3FDhetpAZcwdV_pK2_W+1)M<Z4%h<uJzz)`tNeBy$O5;gVR z)l6$VujP2U*S}@=irbBCF8AfLpQ!dJ+<5rEk;R8>l)AR}2Z@{N+PQ9;$)dY#h;P@+ zruEA2dZgHwpHOi{ZqA&)*^jGfvDl*Gj=q98ue(gH8na)id@ZwX+2mnwS>xX}RlV($ zkqn1K4Qxu_MQ||-sSn<VzK=FSD7dL0YHnucX73ho(~?ComeMTfs&s-k38KcX*3v7M z6YnfZ0>G_K5XJy-N_^$8xlixypYhgzM~dUV|K`kIw%6{j0(0v=eu9r>3h;>fj9PPh z(Y&yph~1Pita^A(uchdOm(bA;+8F%Gt1%W0uR7(;Zo7fSfmtlJ4714uu-m^Rtvuv7 z136dq%=$RtRsIxDnec&RmQw`Wb0+;|17*^Ym~{d?PAo<{p5X4`1kal9MFy<(4P!LC zTa%%5u@>|cVva{gu=w^i{_jPGVY3^K_XkJ~kGu0?-$Os<F3^uSeWFJPAI$bC$(C@) z?U%MyI?idQ)@|v1_IYA`jZ!>PiJnhQS7ZtbsbVIZdpbVbDbox=lqcru_>T4UW`7iQ zCRWFiu^7j$3~tDsh(H+ck-QvxmuE-NO;e5UHgoJh96_f}-q%rv3!E9U`7yZeWz@`8 zA|jd#eAjKi5u@@RFKw@>7h`a^OF7RE8&cb4VAQAFd5<meay~%Ee{2W{_4(ym7ySe@ zrlOJ|W%s=av)*(0fP=7TQB81ZHOA*Nfbbnw>%af9h)LRpy3j;TGjUe<057u&;53GI z{My3b8pl=vwT@Sip0p5*YzT+WB)t7+foFM^A(+F~4Y2xw=}ETB%{86l^o`7cvyrZ0 zTf@bqSE8G3I_?{tgG}}uY3G2Bg8bV9G-I$;0G?3pZ-8PLT`7o{q*UZ(>@k0St;ylw zmFz9*vV(2A#T-DfE)yIcoq|q2aHu`|vGiCju~8kHFkCCT^1D{!?vT(o&&ONb{{gRk z`}K$4vw*CuoGLY7bIyn3kG(;WKxOJ~8A7>2(#j|+GJg*n9zQAKD<T>raGLBw1r-iJ zaGMhMqH1=)2i9SYo1gr4aHnCQzn!{S3dLY3tE{J?Z9z_9)7e@~G$5BLMn=^J$jA+# z84&+QlI2@+f9HEwr_R=ws9Y?0fKyKS7hiYXC!)~E@8<3m?W`#)d)Ut%Pbc-~-gI?* zFZ(o5k7(Q%^|*C>AlxpY#)6Iw-zK}Fh&b@K#6Le(IR(Uh2W^R!!09oSb+I-b8K9M^ zWefxrXT+4&)F1PzjlvcrjwW4}ld1$WNp;S|FM90&BIarHHeQmojaI(Z5_P_LHSX@( z7KQ=}J(Zaq921)@qi~$gXseM#Vw!MJRW8@Hc0D$CUaLBUR6EY*9(NiV_C&Pe2OIJ0 z<`}0<Rmf7kwf8igp!KBQRf5ITNDAh(Ln;LcaD{S<`Pj5%UuzUnrWT90Z&==U2+;^C zmYi0PK5LLS<02X=o>_bp#@0OS*w>x}^?M1RPQ5HgC{ZC)H7cIo1F%qqj|*Bf?cJN% z%>kj*z;01w>;G7&I4f`Fj@=&B1_5YjXJXM@cMyX04soj_v?v4rN8HdIzkf!}S_P>X z;>mmn!LE3rc4YGi&l`ABOBP7+cja;e=hV3tcd1F_0s2MAN+`L)p)EBD9x`l+=;)j& zn5={s>$w)@0bL#px^Zn81A~d7$RvDegk<rT<v>JKv(ar|nMn$awn{mbqTgP=7GHf` z_P6_3BHG835CF>scB6vOuP(b^xg%+LtsCvLfbr;xH2gJytJ_=Z<-1uaqt=@mF`vtP zvD?+@i|><qCHiGQ51BP0lu#VMjbtd*AkUA`pS_COktx;j5CKAYlYg8k>8ll{3L5XG z3@H0nh<W+O9RdU3mM})7^$p_Mo-a5tu>lf*&N^v-8*1x-7Gxxg4@9}ftnVg9Ew{Q^ zN<suOR4H?Zf#u?o2vL=ZaBL6GcV%VlwSTKkxsaXZVe#SJ%IZSj9*!|^)Ug~pU=}yh znI_?Mu^B7L1x^mS@3f@btsZ+ZBZK3Co%^cFNN6LiT;<&(;4bQBOLw-o-=KmFku_IG z*JWv!V@sZJTNX3L2u!OrL!;uT(z#c<(*vLAOIS-q7Z7dngB$`(MjVhsbBTw16LnXw zP8+c>HpbH-(EV~dD%<h2MPewX9FD{-SkH-_u;=;kTHbM7E+WjuT71nIR8(4^i|G9^ zCZM`AG=q4N3C6%_<mNr1_)b(ij)S$uf+#A6*sIyFobR-@Wz5(el`M(DuummAHi@dA zT@`kDW9yITw`!AJ+avn}v9_f;d3)=m*3N-Ab7vI?K1DII98$oH@IaLHU$eiscq>aV z+C&t3euw)zH$ZU6hMy(I#CQi};^8B-$as<Lw!^pYWtvf3aSzPN2_3o~Msa_7$&iMV ziILE`KoO3TKk;L!wCmj=bq+6O4(=cAo>XFmw!p%4c;9}Kv~sK=n1GeUC$(+RX90K` z8wp6ucRS@CI28{#;ETH0xq?w2rXp)J=vx5>`xng-HBd4<ILQY}h_g~L{qJ~}rt!A? zDmj2ejb-xS_CA_&ttV&1MmtjDT?ya!$AZI-n|Ld~vxzN+@$v3$xfO~5Ry~8wk6fYL zmUN1Ci)@nB>fkpya;)!<jtu2QX{8tZyZ^RP0;s|pw-<h32eI(oOksbFsX~I#uy*jq zW#M?ha(@t5Fl*{90@QH2z(Y8^|A>l2YwIVRPt(PmXJ%L+XuimYOZ5hkHbBd+x$EmW zpPFH4*598sKk5sY!>vLZ@&+|lVn=6{5@+P%Z3CEE-oy#&dot9cj(pL2ttuWJf(p5* z&1Gzu16!03UvE@Iu!*J{4s90#MUQYJCK)~#iIEL~DOE+qc>Va5fe>YcnyBA%*<U&P zwto|BuTG+iL!;K0V0q+AOkC_Tl<oQ*g`v~I@UdzPi``5(%M1cat7|4b&wE<o>&L(D zV@!M@%_^m*8O}S*3ah$9Z7pe?HAzJov&ugc2Qr8XR1}M;P}A-9qZ3mmE_(IYEGK0` zNXy%SDAyfEIn!dLr*;3xH7l177VgH#vG)Y-^2wsJ#6%V-O<i7`Lkq<|5oN736A<3U z;Xva~eE<vbNc`A)p^`sXo!{5~`d{!P{*UW!oK<hn#@6JA7eQn+z!Qu~TpFZXE+ATj zbk^RDlH8%!Z6qB2C}zM(3IH^>zDIyKAtwIZu1;&hu98_aMus9`sNbxssiTGo7^Bb= zI+0Wodd0+Gb{d3%AdUp*Xl5Rcai6bOnL;-P8dU_1Mw&${_8WJ#*+&=`<+4#wkklZi zH9H>L#qKH;x?<nWT|hJXvy0p{C`Hcf*!hb>>y^CZ6*)`#c6E#Mg(bh5gK<k&9alc1 ze!uTZ6Z8FdJU`x=R&s?DqGI=6BO^PjNR8L5@vSx@SC9ZAqRE~_%=UTr!zYfCY>FZW zeVp@+;Pf^cDi`_C#q>^@J<b#XH!Fz{ov-{7HG1qLiTL>WDF)Wxzf;GzR&$D~^#fT6 z-e6J*@YvdhO}Gy5P&5mc`(#HfzSd(5M!BtyH&CJ@(qmF@mxshziX%*$N@0#4DU@$} zGFrAobfb-Jf{2c;QYndSeHfTrnOTzSdVEfOME%jbkd1dq0gVwzO87*fNXGKcXeNTX zlzi<A%c0b3?rRx-v-4sX`7DzF8*9=-8Za%A<TO8^5|Oe~5`Yf{rX#(3{5v?m#(#It za{9RR&Bts9wCZ&{vkUuanGs}~HRSb2_j2_>u7D-i!Q>)Ohx4;$CBa)ooN^3QSl4K) zbCDy81y$a!A?jS9dxI&C?5^~#JyZx5j}Sa;>dShHXT3+gqMQoy&Kx<-sDOxnZ^D6F z?41pd_4%FL4t#{#4W4UZIp_vICzEyuhWx5~B7^?toC@_%?*-xUGj(bMEMh!3_8OGz zF+M_9&=g4n-N#Z}6Y>i4HAL^&%`;jw4!Ow(Sn`n!5t$sAl&fkK(Rl{^74u0ktnnN; z-cFIyhw%Hup&+D5G|gvmQ<^baftV8Db%tfAf2V1lML*Vv0T&I*Lh*##-zkR>3GI6n zxLY+Ayb1~BXpbPot<Ey3%$!QD{kpRNNvXd3{klQ1jT0~Dd*>FqI1rc%l6VBCKt@dA zu+zb!Z>%m(4TzLOw>tvF4#zm7NpXcjl_<~@dQc!egP|CXp#uXoaTB|JtUbC1Uj~@i z-dLj1#18n=^eU{x>!hWph9R<NG@psROiJDOZMHw0wjWHO(GdIqkj=;_I)0KcImSw# z|FFdqjR~?^ZjVY6^W1zEQt>&B<$K=m9~bs>Dp~2uGd!GNtkHuuzHPF=bHtON)i@hq zwey8oGAliGo=7bJ(5@ot3P3O<y*RQ{IhD$zap!fq=%S>CFDhp&|I9$ML^AV0!yd&9 z6iSYb7tf>=5zzk3s_95%s^Z(S!p=Kx;)9n<Ecy1e%e<Xaw`>wIZDq5obri;u<aW_D zAerwMVAvwvG@H=;-U*^^?KYgZo0P4PI-1B9U)+L&nn6+_usU7r%<D=(qyh}5_!-E_ zh^SH;sifvc#F&NU8cLHO?@F)b76mh)jp1iJeU{V&qX~R!5eyR*ORH!1IUloq2{(G# z6ycj^5zpW-fgs79gvnzA8r|K)!v#5XjV&7?{eQ{cdG1_xs|x#_T+S)7w>lk{8MU4) zO~T^SP*dfxszvlzo3S@+z%<e6yH9^dF)6&X1IQ8v06ayp<ihb*H$c@7gE2ojks#!x zapk~37Pk-dkwfKRRDsjJ5FyIMn*s#GIQY)-7*p?h>!W<vL*VeS_@b$l|Frj?U>vnC zW+&UVh_q1lV~&&Msm$YWTmVA%U=KUHG6V&ZQu*2(RvSP5DA0}W=k}M^3G1sQmi7=6 zdwwC>cGeUAe@DLvO1#DY&u2`W%N0Av;Zqufc_Wi&KE1YPM!k3OQ;~@{C1U5oNBlS9 z#CZ7%@&ZmO!5Ur%-@~FX^wCsKlTqN-DHyf+8*c>A3XG|pCqVMra23$dNZ-!vXD1Yb zpEf|S6T)n;u>&<+7V7m!y$0~cA@W0Ui76r1XEL%j)I??(S-DLNMxne`KNiYW3(^6p z@M@NoV^A<=dIo79URJ9gxPai~UzBy>>lH!%$NN?zp^hB|m5$U3G03E`N6cgaNoh=x zQ?!Mp)#C@b_z@f=^aYS6<VLsjRp*kWBP+-`s{R|PoCsRikte?Yxh5>gL>xlT2bWo) zJTjMlzeJ8c;h!>rU`M|$4nAAoZHtRAzgWmOJ|;~J>+Y#lUJ79rlxwt4by%Im-wb1U z=X-m%_L3piezJk&*PAT%kRM%UVeDVoSAu|{4bvI_kQsysuG~d~B84zCUSVpz4E0yM zy7pdon}6r2y#B3txzK8rVDcPO9#MxnI|LVlqL^)Lz(xI;sp3^&8uL7I0S{0J2eTw$ zN~swRu@og1epK->a8qT`KL>Hp#`5gwL_3ZT(gQ?sb7w$@HVe*};GhGtKgVGRE0~sz zEIM0!7<y`TvI+f7dWaN>vX8#JkRpqD!!)TQUSPW?EJH5EB{TA;UR6yhnC?*d0g$_l z%)?i=EKy@SUT|ifI-GaT8N!N6)WSjwv6e-R9L!i&$T=a)6h}Oe7hl$zY<5%MCk_1+ z@WBo#BTKVXj_9D8E|g!gLjPx~R|34O#PX0-0QiPap{ag#ETicv9LaC=rFS(Apy+I{ zXR;=+w|bHZYj|XF3jiPx0MW}qOltbHAM>OKm+S^rw&`~GtA@i3iWLML1yp`-R#OV? z^r#GJer8=%8DiG^SgT!KI$I#^7%vwNL^}aC0%+YH5A`ey9#)-IZpV)^VK*Hw400dA z2z$P+C2JX(J6A3@F28n!_8v~C9>?Z0L_gDXF-RG&krCv^k~JSWgVDKD18=Z|;K=I{ zLbvOMEe~QB6INn3MXo8Q^!f37Zs+@7wx5XD#tU13zp*VdcAL`V$NYs0=dvLo#lJf_ zVT3c>93!y?Trnn1r=t~P5J2ETXktd;Z`YN)_tZiOY&vwGRq9I%!IxRXWD+P;kJOir zK|C~nHkRkt2;~;A@!W2BHe!1z4sZgIuo4cXs8T@Ukb%$=iH#3O=7w>c=Eeb+BxaR_ zfxUyvp|G}_@ADDs^ZfA<4Q6b=jKz5;OzF~x$Me900*d0sj>u3v#O2Twzz>)s8bW2d zvjIBi5J?`734+nI9h17T$NnJ?@e^H?wcKY8{Nz)atWQ&BD$?8uYWT60E%UBizf{u- zCKHg2L2=^FcyFN4whRiXv*Os8PV^pXX_U9nTxmFd6a|z<SXK@Ev<Wbl{N1emcar*K zsK9Q=>2IKDWN!4t^oAyAY@5!egJ_a+RR-?AFqmyQYi_s0W@!I53yD*wg#Sr5sUFI4 zRt5_V4QU15jC&ZB(LId@DzX|;Akw@wwZ|f`5~oNoL4fdMn=l7rh8l-gcUlO&rhS1p zn}%J4>$C3w*{DV$XJS4i)fNQs%B62uH5D4v>rZEfvM&A-<}QuYN#+27D`%F^nJCWh zHH|sWwD8$cAeS9#PL&aHNXvxqVObIh1W0k<4>tahkNEg3O#GNt*-nI-c~Q(o9~{UT z&!LI6SVY!MqEz*F_j`WNn~Q$86@FJ4d`1^E-<tOHP8Zbnfc98CG&9gIV;>gH63P}% z`>-ORKh5~>*yh_dd*|C;rmfZ<CdYjrH$n~v!*(wRBfM8uT@IvKIr<drw&j;R3Fdzm ztS$)_^mr~_|G|-dAnm<0hR(yfM30nGnoDjFWe#Vl4NY4h7R<$Dc%5=4Jw0k}j5L+r zyQNr?BqGg1I<(T&17n>aD1JgDT)Z4)o-QXCbyVfPFSnSF*R-5C+^KG%J}oViGMAt< zSf>4Qw97Be>4=QXDvpXatuiu(a{vnnY-=7GC7VD%2jFQpmcv*~t;iyDMN*Zf$-+Kq zQG;C`NOpyU;*ASGIN7AFU9Wt5UgcZ;{)Zk6I#y9OkRkr}253<IrRCeQf^;a2l&k1l z$z?NPk9SlaAm6j;XrJ>4t4z@js?wbF^LF(Jox>&>d*=@<pSaL0Ef~bPbWr(=-^__B z?37~*Q)%)Yzx~>z@bBJ$473oJacT)jdQ}o|$tfk<p1y7yNlbU+a9>ah`9$38gzZJX ze$<^zTs)q#c{D`3$czmQL`Wyj5%uy}N!7pz#X=5@FafBR;-0^-{C*2|g^_1DMh5{~ z|H?mNlVL!s(O*J}F_--B1mogBPWas1bTdxm!;TL#ReP&|z^xqW5t`rSdai*(kQggo z5}8k;V)sJAN)P^eXD6i8f1m9Arl@qV=CGBdk-PX57dz~$g(W%)>#n(W;=#MDYpx9i zNa08vqs^&^kY~Bbd{WQn7#ivX@mOGDmV`Dqg?b8imopr>r^k1$fuG!hVvhKO&M_!A zV9Gvme=*nFXt!k0^e>X}cVzLw1mkVZqXAB1o6NFHv5$c;i_f#?mEx`(!{JlZ_;{uE zxB8qS^!^QQ?@=a-2g8I!&+pngUUh>LzdMqSo6Zo2q_f72upki-mn-M-W2<R@tcL4c z{*x!)@d#ES*zh}s*nM#P%TsjwNr%^i!T6rDs+h;A&)$*sg+`6*PmY!n%!@oS%C*h1 zpG-%8pV~(3pn=I>im}WQ9f8bhv~iMO&YpX?D|1ni+EM|LYFHA^%-vtfD%gg5YkvHU zH_>hW5GPP8T&2A>4ObJc>2)Y&q;N3$^5r2BM{hAWo5f<SVa9-+jRbVD*^^MUnT7r3 z{duR73q66F3mRhpA|swmjxhx#-Gt319uzgzSaM%~H)c);778;XRaJq1SdD6UTo@h2 zW?yW+t}9e+|L4i@yhrum-*G0=(BUz?Jk~5aJ45k%aHRU+y}2&W@f`oVx8I_-!h(+b zmn`4V-x&6EJg(Hd+>)HU*5ZGk_ZB_-%Rse)>6!PnI>BIcHVY-tVl;Uof7wD=C%$0J zDcQMNxIx%mIZ0?bFF9$ECyn0vJwXQ!-Nh$1?35NSu_kWu-HGpwWs`@B@TK<qUwQ0j zSC2VWZs_+&PMf%Glf~@VZ*6uwIe=p!X^a4k-S5`%K6NHqBS?OAPXUn*q$-e7Y{|u? z60&<OTg0mJYApH=1uIpjGaC;GNxvxtF#^@b00MuPGf?uKg2US90rdBoi$Bqo6d>9h zdNOdSuB+cWl`6r+?Ut$l+Q4E7m7OFhmFg6^FSTww9K$=yp0m&~0L>U0*(XMbzZyRC z{E)MZ=7=CYwIya}9wMf83Q|y~WHLw^c;MZe91?-<uO$i>1kfOQcf?{58ZWRSJ?d;D zu~zE-O*V_^;F-6}Y%8Mqa$<{8O0`|D{Tugi&^teG6RDAWMBn)o-C8#;%g5hIW0b<M zzme{W>79YzFE0}z&(%|(&Ek$L!j8*^=eyID7vQHK{haNU&Y2cOB?pgV0+Mg$3N{_p zd&7Ac4x6prQqSVHZsWhT-*r4WuU!;&Jh<|Gt2q@Vn_3<GNHLF9`*mq;`U?Zumi9M$ z%NP^JJ&?Krx*SxUc1FB1+X8zbgHj3V`9hDF@+h8-<%8_Rf?&CC`h{$6e1*uSS4r0K zmqr;$jP7U5(i=~@m@DjbEX>l@2-n;7L^hNWhcBkvyGe`3l`Dfd0kL;en}>ltM6E{% zZ`1(j@Zc=8UOL7<#KzSlzJRbIXHAUk@GHisev>IVDYu+r)z8(j1^wqIw)TSmNM05i zo}N1H>su;HzQOH~_8OYL_E4naONzkmaIA5r%-u|k*lF7VO1AgC4~1e^r&PCpUmQ*! zM4$IzzEK;uq4ZOdkw5tHNFGKhcLfSHoePVplJ-*d<`r3#^`_q}>8RxCVpKm!sS7V~ zy3^^^zcg%;vL<E^JDnj!E=1s-@#wtx4V*{$c`(jFB-9AB@t_&Tpvuc8byEi30Ist7 z>_{oCzZJAIx1ZtY-__y|9SFx~)6tQQGBP98JD5g}eD1PMpgt*tReDg=BEZqR{r{Q4 zSR{v_J+$`YC3K`-udPjV)(=or5WM&2o5s@m;gu&i@pQY>gNi;f4(CBh6avZ(AAzoM z<4E`o*7*4hhH)2^lbvN)FZp8&kP#39;Q9FV-6%7N;59dShNmBZED>o;jTQ@#>;X{| zAhM^Wa)o>s4@FGr>>23+onJkq$6TCUy-L7XT~r*82aTz9lVUqKb;vVH$-JWyTbvKg zSEst#gb-qPO$&BP%Q%lWS{}jV;dISV+xLV1iAW9(-L;CYBJyvj1ccgR`s34#sOLK# zV_To1R5R|<#GWtwZVLTgYDgfff_L0!=JQ|eGiK~@k7drAK(fZU;akj+DT8{pg@pYg z<Aojffep`BRK8odt>>v}x1~oShI=dWW$|G%X6Hk-;0ROgU<esB&O#i$XR_EyBWqt; z!NG(i1&);1D3+bh<u4cdO5C0QLM<f;9o5Mg8So0MKKf;v(2Y$ejLY_w7u((e`As(^ zZxHPw7H@5&QR?$BdaXNx@#5#f8oj-8+wS4&<SPUA4O(&=fWo@ptw{g^LKmb5pKJa@ z;*DJrD^whlIGj#Ro$qb@XxZehHhuQnyOX3-mFB{zzgrdUFux<&lV_@zbC&j-+0ie? z+-;;cH@ST%f6ORUzsl)QaLmP1x~Ps_XO5*ajP{1!h=%&zM?^pMus^O=bi801c?|6? z&@asZ)9OXj4(%)r&J&#f<kvg@C`@RXbLM2rbychssC8Df`|!I`I&&k8t;(Xh)kC>I zX@Ssyd?%gHJ+Pv6&FMLrr`*C+iQaC;9c{Ma>PGwQ%AN1oD-O`DpPo14i%U(4GC9HT z1tULD3<)_?#=YcZb}1U<#K~zrC|U9-Oib(uGDExLLMUlw5=#eWz0+EA-4Sy1tT1zp zv@Yvl3oN>A4{~ZD;&XaPGx9heDF5HtO}Q7tY@GbmS6G@Hcge<EWt7<d_YxKBkuVmY zaPa=meD@2=2Xr3%WX73$1|h<f`w%50wRIJY+p|POdC(h-Ncari?AT9vi%$Yvi2i6J zw1@<94g?VIssrs5$ygpb0$rsy&N-P+j%r4cZNjXB+tuef5(t764}9z;Lm(k>1}4j& zP0f~0Y)EslmQyEFJ$2C>$wht~kwe2n5TjD=#`j`m_J=Kj!O#0$?KR$RtH<9c#Wox- z_ti<p^BqPh-A@Pq_W#*UUb_f;`Rn&GFLuXr<M)LjNARk4t}HTMBSSa&&k>g_iE)sA ztlhlw&sIMZ!Li%1KWAF)H^_c}TMXT9e&!y^>W+@d3ARjbZ~ftrTUrwl>S>l>+&JEB zhs&ek6H#ceViBUoW6F^p^<eF;YDt68@UIj%KPUf|Xo5{%6f7Wc1rXn4-EL&9{*^SE zI7Z<qA{;V&dzozv#hJbCy>#cPq5fA*TauE9BvG$jjzxYIAk`u3Hi4+*&mX|z;1U&s z7QT*#v5tnL?IAl<mkS4aa=bq8-)UvzD0oI&T2;Pix4jH_ylk9$E!O#Mb=;11T<;mZ z<{$d!QS3m&kCFyj`d_yV(lTnw%Tm1v5Kqb7Agld@ZZ0c73hox(Js<nt`#l}BiT%4c zecaSpS}B>FtG7MwEk0Ha9JL+$!aMDjscvNuk*<beuu-sB=X`8D=uHKRb<3mFJLq@7 z;W}s5QWs_$59-`vGn0Av_gMu_3<00ANjsfa(4ntKRiGM$;EGFYX}`fk67~^I3?p8( zbi{1Kvm{j#ZJoraiA#x0(z+$yw;cg!zXT^To+3c*bdO$aUgIY?#Zac@FJ}mvGcAFx zwiZMrO<BUVxnL;G|Gng!kmx>QkP-1S8WRz9lJ=RhuA)lU;aW{`opJtzhnz4zE6GFK z)8mkLahgq4+#HDEN}|&4bMsX1?{u~3b2v>L!MQ`BT((JYFfCiFt7)SYTw<W}BuT<P zD%;3C))NdbgXof!42FfGW8n#;u;(UKvoq}c9LGR6$=OK{kvC#%17s%?={b%}+EU?j zL0r}V*h`KWP7KuUF>hKDm(i*;q~kG(r<#~N7juoBbiaG}Tje|r2#>306nNFv2?%nm zWPE@24~fcX%>1MLC(Y-&n1SjkAGhtLJ!JK~Z@%?!BHw|gD=QdL-13mwDTH|df7hNP z=r9Ty_1ewNNW5|D<XGt2Q_|YYaxbpW(FLxktDDugdD~14PupCKR76RatO{j%HXZ=& zD`LZUARb%k9ZIx3VpEHNGql+`7&B%VhTsk^$VZT1Tz_^s&rVnZ2<?A<8%uR-A&}tH zTVwbMYQ2AA3NtzRAMbxRC;xFf0Vg=H!uClpmK1yLW$2Yz#qlPnQd=_y<CD}I!g7#5 zt$A@m&Naqcl?f=38ggOqIW4Wrh3@#TqNiQkF3bwCXUdBEBt4briVhS)aR{*sP?B=W zkR<K6auH};km9;ep?)TyQRF!G?>YM9W$4srzg<;yZmDnX%Ka!k1LMd3yOj?TOnHkw zdtE09d6p%@dx}!=jbT<`C!Rp|EW5?BKr1)r+<YMoABLDFrj~e;{q@#P|E>oy5SA8% z2n!&E0Ow0bbXjnFx!;hA05-xYTo~Uh8vTNSM7dqF5G+tR%6fM<LiC)cnjL@?Mr5_5 z-xtZfc71PW^GQO(Iu9St&Javx|HZ?QXrb%IG;S1k09pPa0L6v?qRap-Od4H5LLMsz zxK|W<AW7S*dD`2}B!^1((XQB6D!78o1(_!)GqUmkaeLjWb>l8ob@OR0vr&z+J}ai_ zpy<SWX0Q=cIZi<)JwJNE(E)udF``kUr;{Jr!*5956A|*`o+901(1_E)QAPnU2>;*! zDO-8WtecOgTe$)-`4pL6ihe(WR=xFng?Z9zS1==oFnKjMbrCO3FTd98_^v?gtW&eM z-SR0-kL||o$OULl$KA*MJS+9;nt0L*{w^1bwt22(G&TLb5v{q2f7uQ6+xyjaxMBo< zA~`GCY7G%EMG<gHzTRCil%nuY-%G!)_=CZ~@UCFb&<#=ScIlYvfw1Df=9}-RVnx~J zs@dHU$=0LkD-)*@p$~%6=x!DYEa5LlPylr5X!PVY#8H}3qz4cRq00?9&B~*Lj8NVy zV{k-Ln6qqtyhEmhHkD-i!I0VvJYAXRO>_7GW_&Sa4VOCYD@9@-har{f4wa7FmS!9n zW0Q2^l16XXvD$%g`)CTn396U!P-wlQ-T4t|L%*k&FHhTH-{j4z^MlcCyH@*getdFf zfx6ru>jq<d93;lRpT|1a5tP@Y#a-OS%yK-};MITfj}<THG-A)r9Z&w_8MdC7!i$Sv zkZ0+&(u|kZ7DX<4p2wyS)Qc0cauftS4{DEVGYZ`1>eQ#-%&~oNI$Yq=3-~_((m*Z0 zc5WSMN1D0k`6Mq5Qq3HF;V-!|%w5X_=!L+5RS|H1c9i|h-unP<&uIOB{c!(7?JjTy z7lN;5E)!(=0w<LD;n>Y#P<i%i1zrBo=}KHvrlnW#j3Sa(e1QX2HWGd~<ITQY!!E%o z8bb+6l8-F3BOEyZM|iGauhYCp;uDYwh-0a1BN$c2)wIiQWM(O)oU<F2;Gs&<9n2I$ zVCJ6tzJM>l%pwAS4*?5^2#XLicm)yZ^T=l9y%H{=tmgp`UJ*>WpBpVXOeDm!{k<^& zpkai-oo3~L(RPcdTqkL$o>Y^q(Rf_d!r~@k5)mq{MpBPtGzra@$2itwt{Q~erE;kd zYU5}w94nIOBw%q8mPj0&z(LH6ncKDvAtY4_;<QR|n3?z4iPb9iRTV+md$b17<@ox! zzhw_gG3<uGu!um-Y)NeJ-ZphN&#u`mn<mTs(A>cc*0+d+nwyn(xh7Nftd@0wRO$hU zD2kM?895S=%YkNQbLv{j^QzmE`9+ytl-Vw|Gg42T?aaK5C+YaDkEdhr{_Or={QE!s z4}Sh*@BADdQ|wUOH!;v8#*N?sdlBtMkZ}x91u!1h<96>_$6d$p19xxy*FXH4ANzst zc<s%n?CCFUTh2QP4p2ZcayB3e@_g2WPzAP}5U6Tu4gv{~;39~X$408gtIDNvio}7q z0#{z#MJiUclQ5Wkfn|)p>}^{B1!m>A+X6AhuIt*i4PXE~*d9wN2J8}O1*ZiVg_Q<( z^+PZ?g-9Vn0tp+7OF)P&v7`izqp>(w2$jeB(tsdVs3U@)iuI_9!mf$PMZ~axDO76& zPSZ`nIA5&yAHVYy|A{xh?63UE*Z<i!J@2+{jIFEMi*eqGRb(5KkEw1Zj~&5A)Q#{I z;S8|LczBL?J&3>ellTAApMBqN|NfVrIO~p0gbhd)m}={MzN6EN!BZ5d=ULZwIce&4 z&z;HhX(a1ryX|~GgrW1VErw>&?2Gdjma)hNTpC*HTl#toN6&eKl@ngw)E1)`3v(y; zp<vnwW;w^eNU09dRU-@hsyJL4TYlirAfrCG=$EZj)$(>*U=>SoUlQ4wz|3@&YlsYB z=CUjZA#f;}QsKp1VhmMvxyt(DZ6O3A;vgJDe@9?i-U4EbM3ha5V1TMJF%91DY=)|; zRFxLMu&K*CLijRbEDtyYDO<%X<>4BLxgSKA?JE{pzmLcQWepEl-MN;6&C4AHEWUju zB4y{yI^8&VQW|7}NrN~(GAfR6L;*U&a|89pR@~o9PG@JB>%(O%_|OI%5e<McmC* zjJOb_mu&$_9S7@x;m#l@HDfbfpmfzh&YF^TEi`%RpdGX{JV`K9X1Em|gPE^7drANl z6o>97(F`tJh3M{%LUMqyweA3+Dc;Cs0UJ9$*)ZhPPNm*DwLRIIv?+V%-DrC&n-WuZ z@m#w<CEKqeO*XdnchxBn6|=z12!;La=EMdfbLZmsILyF8WB}7}BP`AUs1*IOfqIEz z$XDOQ!yVrsxRWz_FqsjP7fzPL3G8lUHYkVnTjmNPkU3C<Tw%sSfH@JtU<zh(fjN_5 z;Jz=5Vv8lq2ebO@Od1%0v$`5<f@R9B_skqIVkJ_D%E+jOH&xvDwcq{ZCm#6x4}SZr zzW)t3-?l9+#<g}60VA0vS5qPpVG>duRaU3-Nbz{JG2X<9JCC0VcRh4WuG^|N0zrY4 zAtJ;95a8HkRL5N*;(EN}mfD%Q*IV1|#WM(%8<zGwq8Wiu!`UtOA;iM;@wEdwtY&u~ zss)BJTv;|!96px|sd){AwH7GDYgRSKeOl%+kge4-GRTTI(o4vafEf@Y$inV-DP{4M zhuTB%7~^=;W60z%#eCYbH%%h}qbNZJ@^fr}j$vD|u7MlIy#0z>zWq%vzwHF5?R2+2 zxj8!f^kdhYIti+0yE9d692+Z9=h)ZO3e6Gbz#j16qxkK2-~XNuKX5K>U6>jYp&3_J zn<}NQake~nHMLGXb*{<b&Tyryq#e7#I!|-tbZJ0|df7blOpC#8<km;fR}_5fm*yaY z4}12Y!uOEp9F{%Ioew-k-w3hWuPM9OT>?|riK?c=IkRid+43CTA+@lsQ-vkYW|lGN zbYbbbE~|mfTmTo40nt1gNMbA-)4#z?RUJ8o5)W`3++{ut0Db63ScIXabFSyS$mV#5 zl%Op%0U7474(hO^?r^oWKKv^g8IsIGTn?cD?36PJz~(KSgld;yk`NN-h%ALpNPrMs znS3<-?%X{aLNo3%c3OxdRF&hX5zrBi9DpM{M=<U5!rpB6@u#l8=^6>aDbMEJj?&(K zns#ZPnQVxNI96~TtQx`sLwwptqfr%AtEiDfZUh~txus1>GtV7z>)Jv4riW(crrsBx zDu(#CgPUe#U{G`t5<!R}k(e#Qxh6W1rAie%peFWEJ=LzYH6$z{Fos9u;Ap5tdtP!o zYBqOv&Vz*VWHhdu(MhqG^G?!C^~jApC(pr5kr@c!&P-hy#O98kAW|Fv3<j}-$R&UR zC^`#VoCQqa#f0F*PS1P`U#;<PPLY80xd6B`hV+CF@i0QqxGgMLgA*;Q7%u_KHO0nq zXDYpJ90vk&Lq2@~S@cwsPb|+lB~c@7p&4pM086Ie!b-u4N&`gLHnvYbeCFwY^3%Wh zJ0HC12j2SnZ+q3T8z$8$V2p~WB}!GS9Gnok?!pF7*=(D~$>(!4qln`#zTxiYoj6rj zo5JWaEI~#BL?AdCPNLJ<ybID)0aX~yW=Ps0*2sj&Kr#ZkIh7)c3eGTrWhjHqO#wEw zfi>4x6PJ@=F@#ADDq8Ts2^yls!|;9#aKGXy#18i>72NmIzTDHkysx$g6H{<v<v<)g zMCa(S_E4c}5MuHS5~(W=9AgZ16{AFwn)60AaF;^JmXf3fm3#MwyKZStKL4f@m;hC+ z>WPewUvuru9GYdLu2?cKH|!?$Is%viANeAF`-7kSz{kGurKe|8t&lnx3&$-Fao*+W zG^bXCx|~{gf>~b=Ay9(BQ%3IKYI$beT=U$u>qWcaZVng<nWt2x6PDKhVxr_jZA^bU zTmOQxd`2FQJDvgGOn+eVWjJ$;!Av=DuGm#m5T2;D$emjk&0s00n`MO>N<RRl;reVq z2vzBn01^;;;7e<QgmJ|*s`CkpqrDNgH6&Cd)y|$S_o1SPl|#p?B4B1Fkq~6kY{ite zi9^mC)hN@9RNXpFEj*LCc}ME71ou+lzPk8357ovT!?<U41~!QZF~l07k}$SVQMHk) zI>p-Rk&kOM)!g&4T!#)@|L7%Q6t1T3wz+k@Rb1Fb<ro9O@{v(-gd+;j5uO`(=%I(s zoH=vu+_?{Y;NJT_`tb)J{M<udeB`Mo&+P3@RgI{xDO^PvuS8%aawh{j5zXiGc7bkz zG+<o|$q#bP*)OL)6U?=6%8Q?%&<xFLsq5xl*B$=+15M%_%X-_K0i%(~7U4xV9ec@5 zTQ?oEQF`Kr6STdFNu7z3YVOPvLgtE_5mjFv6Vwf=+Uv$+WwEwUd#pS(6e<dp$4i6a zf)Nx7eImG2;EF^@0&xHr7E*9x6bp|9PIy*fVEeB>K4?dJdBI`bfMK%YnGBQRD6hKU zmk)7vD@`z&TnI~eA6*m6Y?;vo?*z#xIVYu@BqeWW-tBug^*n>l;2n9V)162-efoLh zQ@4KfOMCyv&;0iP_S5(O;s^IWdLEA`TCV3ZJ~y{rr51>zW36Sdf-Q7&*_&0ZpJd#; z*=$x+iGdZ=J0%gQ36!TBjctucFo)-+Y3lLFNKlVaO;FXSYlPrcL<oohF(L>;fRwSC zyRfr3iwSvO%g!JH(_#o%FvyIdw>+tcixEIz1_S-Mt&RowGENA}=F@>{9ADCdApJSn zi)Hr}3*gE)LZZjYs>Z9@tHxu6szO;-5kg>y5Q~wwX}&YxKNod>yP{eEH4qF{PEJ6T zyO+P<c`rN(pZosV$0AbG)G1pB>bSB{C6*cdiTU)rfoj<Se($sT&wuWLpZr(9^K0+^ z>}MY7rnbf7)3UK0N24)wXy?3hk#^39y&azJSlUavXWBwr<cyS&9i2m4vP9Nun&;Gd zN&~kixv9BAGi4(+x5Du8g4Jn!@Jt5a1F(eiWm351W$RCs^Z(gn{TJwfyg(X|bJhiV zrH%or>Y7!P_fKV29W*6!X|Af4Evw~)B;RZ{A24m_?EoKeMM*CQE>j}uZz2Ph8+owB zt-0A@sX<ePn&+~?mm}wV`0IBIv~5e~ODZD`9X|m$tra{|NqJf}edK}9eCWP=-}Al? zzxRC~c+dOZ`>uDr>&U1$!chj`2+s|C^dt8@ZrxVCZfCk*)g#FvQ?1c2B;M^DT*vYD z8fo>JZZKqKmUB*B*Y59Qz7L&UT6X(v9W;5G!xEYHvPY(YX}vq-5Ed3Ua-yYmLLw|; zLLL}024%zs4I%QB#Y1J=C&~Tt=A<AcCWCeJaoBv@Yj3{gmYY9+|KlIH@BYtCpOCPD z`m`dp&YgzLBV(Z)NX$ejGjb{lIIav<Sa4EbC7K<YiIm)W*)b9)SuB}2ILIX!6LA2E z^E1)(*J=IB$sawI#(I&QD*xJ{UZ#bO!UWjz^*!^L*2pUEW%$}db7z!d0FXJYYfdp= z`O9fveo5wL?9QwV7qeW597vg^a|w{HB8zF?JL(#Xqpj-rWN)_roA-U`1D|;KRWCUC z=9l049e3Yw>n4Y$Nd{L$q~oI#iWz1Or*Rcg(Hxj|Q;q}*h}?@)0}Rx_q_&Mln;6;@ z&t2@g`OKX+w@*%|dnz4L0MCI8%J2kYAVLY2QM|sQ`2`~?RixbSJtiY^f(Qf4F8hP0 z?OaZ%fiA^7^bvBbuyV#$ZO)Af&}ZaOYS3NW9n9;Brw(=|kbokDdk-Xz5JD+~L5K)7 zVudK7s?<#>Me-11Q-vTr;%40KZ%L|9Tgp^d2m;iAjboV4_Cwfg8WP!np-ay7=F|-& zyXa<lR)-C0#^->~Jk-7S_aFMmr=I-ygHP{k(`;WmnN<7T+%D|LhJCi*P3P!Rl@p}| zWXleeoSVQLnW0#WES_K)NUp8r)~$mlhpPe31Ib5WM&^J!sbA*V4ozy^9g8Kc?`Nl_ zH@tF~iv$RIcF54z6>$7fgAM^-5ewVbC?!)(ZA+;o%ek9bn!-Ee4xXS&o`bqur=9_K zGnlVPO-w|+%i24!5;#N;?18}JS`~5JP6Q2?{!w9aYGAKj8SbzJ+(;F9KFeLlJI-CV z&pYP(Jp~93&oJ-PKb97AWu~?CFAweDn8T=K089uH5h8^}WlLt%BQ#qWjWL>Ftfh22 zHZ_?SNBN4Xm)>*iigJg^v8|J*Pi$26h&1L|obDbO6-PMA036}Dfp35Fo4!2W_MLC} zkstp4@B5y&zV$o5{oCI7`d7X3&RcG}adUgZ<B_{VLB4+OU9P;SSVi<>j8#>|HG~)u z0w08kls`TI-Zw!9KyFOV0K<mX>4kFyV#bguMhJ+pS^$94K~*WZgF%qMZ0>sDnhLME z5r6zm*Z*hV^XgYVufBFPrTr&#cDAW_^Z2QH^OVZS>oHX$u4<|qZW^w~)YO-j^$2yt zRYO(9q2?GN6+&dGIYcZ5OC$-jn3D)`APEq57V47#@=S5NgOhIn4wAd*AnnB6$-%yo z3-AH!b0@aG4<h*j3SVMPKh<HqpU|rZU7k%c^VWQ>=&X;~A~~tCX3;F(nRFiKInLU+ zKgDzw5bM!~DlR<!cz1rMo@`g+6Bl;cci#KpPyOoq{>jh0@8>`8<OAn1WvE~#@f>&` zHAY*~j6ng0U>cd!azY0-M0Rm3Py;t!v#srgvrj+bc{UkWF-CU+ajZtMo^U-{m=O)? z*pC<ytA2#ASVl-hNfQM|6c2qP9by6XRyg&(E?GJ5Mx_v=3<t=W!0WnQgGE~~Xmz_` z4NKu_lEBPZjldGYfkNaMIn)v>#OBhdMyMOqHLAt3uB5I#ury&jZYCQ|6$$9bb4}@v zn@%6EO&sKE4ktvK7y@9TiIPQtV+6;!hXkrf6lhUt*uDVy*e?FxcRuug{=)nI)vw=o z-^2TPbp2@i`Zi(z`~}SRno4YU->0)YpC`?UJV$iM^KRy;m97o*eVI?gd@ppnRkv5? zea>_8#Acq8=DB(2=vBJRb7`tn0P}*w=krxFUFD(EmBar9wpt12XB!154hRd#01g3V zEY~bBJP;0aX^2RmAieAbqfcd#TVEo!C=`w{N);E0ql%kGnr8i)aJc~R!NjsHfEdHt zt%PDk8H<hL#pabdULqzD9w5X*YjY5;1g<I`Zcm}A!ty?1zT6%L=-}HGFs#0Y163VP zpE`N#3$B0Ri*9=1?Js!23vM|wDvogE036}D0qthUT`h<NO{#4hfUsDfrc+C;s|{ux z$ie7QBporp2j<6ofv)TNbS<zn_lfAR4*=IP$Q){9My_VYB_g?m6nkmlNi+3207It; ztYMjZH*hkTqY8p<kJH7*^!81>{ngj}jlc9m|M?HS`SmZq<@9!Kp6AJuG^n?^YNT$Y zs-?a(31!)Qd5p@O>zb>YV#Sw6<XB0pB*X>PHAt*jA_oDHGc6z>@x{Qi8IC2$5454| zDc&@w0-)4S5_~ZsK43x_UD1%DgQv<BgO$Vvnz`&L?<bli<hfbvG|fCuoICLpsN*n~ zdPeosWXAit@#F>TR8C)a-SG`+pZJ`efArdGPh5ZfjbA!9{e|E9{eSpVzxt1U`kg=f z-p4<27IWY+r3+~0s4c{WiJ0BJ3V{UL$J-6;00Iz!J8wJvlG|^-;hGanncOBD<MDWs zvvH_6MyYD4YHk`HjWHf!JVC6es;F87&Mz$^RgtTJAQS=@B|0ADb$jhnMjwpt6^v|< zUK-d4Wn6ZWuh0E*@6o}FLBdYL3y_56kWf*O#i?6y2%(A+7d}9-`v=E{np*0Lt0;9< zkL!9=x$A7YJD={vfNM@}z2yyeU%OpFTN3gi5D$najia#$?_S(%r=6qL&`b@}4$0t- z$Ijyye(TKN{wMGKiC_HGhaao<w{Mwl9N(*S*Uq_}sd0WYUugEv)omM<5kf1p6L5ib z7dp$Gb-9|&H>dl@_I9@B=eK6($KBIaz5tuT6`r7-rp|LFGnn?mc2@coJBA)Uhha{R z1E+MK!Ra03!{EihA&wBk9nUg!Ybd0eg7sgcuYrm@0{ZfOawG4r39DVSS~}<eKs^q6 zQwJS@<zx*Ql&zQTdO~SH#B$jkr0@F!EXVMZIqbPPyhm{@N~<DwFNy1}>sG|nRfOVl zs*<5x{D|0RdpnlrLSRB*A60T>R2<>R0XV{Q0Pmf7VIzkC5~!wZnFB%%jvS&iO?9Z> za(QfoRgEgI=$o|c&e^Lfs^y$D<rT*?>pBJ-SpY1>Q-yqhEs$+MZx!jK0dttCUm9dC z4)S#o05Hr9>VWWMv~?<Oj@Y6iOxxR-zW>G7{Wm}QiXZz^Z+`PjuRB%kM?Kdx9YsSV zs#qe$z*VG5LI{<Fnq{;gNKCY<Jk%E1Lhw*QYLZ%{;vfr<NN?LIp@<7OF(8Br-~-|I zwH*lOep%o|kR@5xv0S~H+hxM|PQ$z`p8*5|!N?9vIy>00vP8+t@FG!F!0X<EIr%^m z7}5yh2nI1YkQo{3?BXVF%P(SN#k?p9A5cagr_E)QGshPL8I(=bIp>fwvUbxJ9JKAu zKK^LCvvX>5V|!z=cVXwLvwKpX*t-73`{Cp}?tSRTfBH9m@)thv@9x`C8SS8Y5_n3{ zjRcdR5~kg(0x`^x+#Mc@RURBKKY>5@T`&3b-}mM_uir=)9}Q_|dxOU#4x)iIh=)iq ziqsP8O6m%A@Jc*{!k=NTnQGyNP!pnY^fDyc;?23VN(6~93@bQzIGHm;2|gSqFN0uk z5ESm<UVsAZ#6<n>R1&4J^4O?xiVO<y0A~;dp-_8hG&Ww1wXgTBC`Lp<WJIP4h>(i7 zBK9O{F7v&*y>MOVzV-HNf9!|e{P+Iyx4reHx1B@<O9(^+Q!G$)w+sXsPg1jS0em)L zhjBsh`SbXtcR%?Le)66F{O8{Lv4{3Abep?7-c7Tm<l1_kdAAqRl;*p6_X5pkXj|(# z?^?7|bY1^Ha$@Z`b*!D_mTbm4Bb$-6?45anCbeYN=bhM;P03S{cxLaFk{SK!2Ul_| z=U9MjRq;>0)@$j?U^p$7{0D3EPtHb%bhs8UTz+wILa|c`$P8t$L;OH)w!BFk3@r6= znHkFtm<z-x02tPr$XH%=vmb!EyDjNJFb3R}9gZUS?WE>eJJYP{DI=?wi$D6CggDqQ z=hbj8CRUmdgSiCt;X)biYMyfLI&E7mtt0Z{$ZAqm(==?SdI6Mdn8L~uCCThw#<H%U zR1TELg%B|Y&w2eK=_ugKycY;pjl{@|tl6{;Oh<Ob5sqpAj_@47-i7YevF(SSc!UM5 zIz~~Gb*_oTn35ZS((PDh?czp(q?icY+}xO=EQumixbkMSqA1V;v2+<XDV;Q(+0B-A zqxYOjA`-s@^i43GP@*ivR%~S^Vm3E|M>D9+9ZvntEI2g~Ggnmv7=sKATMj#c0Yt@k z*SzMa857i@!!}_v;>MTa%`dv+<4?Zu-`;!wfB5L<+tCg46e4TLnbQm@RUGTl=7rrB zkt~W^a_d}MIFm=1kU4wHu53w&;7DW;2(eTV%p7W#0463fm33!+VB5>GWRToTeBFIe z8wUEc^e}Nkzk*=iTky2n^UQ}7@@YM`KXfc9!msAJssh}hD$Kd<cvP#~>Nxh5u^C_& zfito9o){C%y|nEH89+XGUv6wlMoyk8GJ!MLJvvobBu+-ygPp9RW(|-41Quv?i=;%F zp^B8L%g8G3;s$eb?fNqY>TSizW<=!7Y)X4Gg9Hx~3DJq#M2-qgbHVaEKJw(dKl0GO zy=mizzxNGqe&w;9fXDXq+6~zNNP_B4#Sj|9C>tR{9b1G+O4m=~t8T|#*S+$CuekH~ zAAJ0iUwZ0d+8;HOh568#WjLF|m@PQfW4DYpQ)k?1V3RIEEwU-h37O4gFv_T?&xSfh zWOzl!LPVCbR9>-wX{Kq{<}*~G-@B}U0w&n+rf6#4NmND4u)>Rz=pG@792A<YHIxkV zXw!<oa3WG7ubS4QSB*3iV>Zji2z90A)hKc;8D<exQ-?sLc^o))^Sa%6{_*DR_uTdN zH{X8!1OkkJ3XTvEm<<gLmS-LJv+Ydh-ZaK?HsfLj{L4}Qiy!*LXFvIw&(AYcHSU}U zc|01;+bMOKQpa73q&X$aN^Y97yED{W-4&LhSzNQuT{S@oWq-JX+|?HzV^al+vcEU0 zs@ju+N^jf54uUcAQnJu`%aq_Ygboe}cu}$bS9CSIVpL8fYSLoKmgHv$0f6U3d_b?z z&C7iFaf49iF!F;}1|qCr1Qs?H;((RVt~+1?6N;eVRCFG+xQIeT2nrJrz!jH#EB6#L z%bvw@*5sZEeQRUtW&Sb|3|cNtm(~B!TGbMP3IIql58kmk85whOW{1FI$jF-#DYfGY z1XL21aSeyn!aK8ltHhx>cOY{@N6w_2T>uN@%ut2eGJC*%Zzl!V-G<92dO=}^LkR-F zsrX8U;t+x^%bqbUUf~e<e6~;K$q<;J2I}<zK*WG1GlQ^nIU|I<S>hTIA<uU->5*M= zgd+#w2+sj5Sv^kuP=XGTEFv0uwd++<QAVrqFqapX&$;sd0vw0njQ*y(`bP$owQw>v zI6K=i;LQ#(z(GEQwaPVp$^3B`5F7;5%z&oOy`m9I1OgxmWaEI13Ni3j#OP+OHed4M z7vKCF@BQpk=jJ;XcA2@}9($tMG@qMy8z)Xq=WU*MP9ZjdXxyc#&-YE()W`x^e=CFw zQvf$0CKfP*-C^WzMmQuVNdRcA@E5X}vlGa9u%`%$b(C<gz#JeKhgwm-)c(MHb@2Yf zmktDY`1Jmt4_mwR*x(rEWna_kyRe&)kef4+OV1fIWMbvwm_Q6-4nP?WD2#f-1gMxZ z9>@VV(o9|o5Hp#=)Loq%=3pm-lX1$-WGpD1Z5&=~2L?&u*0XysHe&|Hk6zG!^ppSQ zH(z@CPyfi<Uv+If2V9u?4dZcyvF{gqP#D?4eJ9Ylw=K)~WgC3+tLj(2=$7|<bo0ZX zdHDVZA9mESn()T4c5ZvSb9KaK+_^#(l``iLopZLfMOMp++^wfc*pSmPFcAU~F$ps{ zaZhg>cCv}*p(GeEti0>tz%jY4Ric8y1mj+fm;>0I#jVO};(=jC9I7TD8mgQf0)(-Q znlNt2bJxv~ZTt9k2t1qaQJc1!Kzrw3c-^tLyymrUd(AB`Jb`G?or}S8vv~pl*Z?7e z01jl}3r{?L&2_hhK#%T&CeU!HzvnN$<3nG#ke@t1oBLKXX=13YZQJ?0OPy$DQ%VV4 z@|=*>Ro%=~8OCO8YMxz{3S-dK$+J6^E6Y%5?nvYrMsVe&kOCZLL?#YUhTF39*sv2F z!_wX8GR<0mP+-H7v5xh^fUgtIIFtl%5FHlTbq0nDF9AaaU>!>6L)zsbW60KFz+p{; zLG|xzN4YYq_rGU0h=UEiYeoGFc%AeQU{GpTg0l0P!((hjgBy0)HoKL{!B1L>E84Js z;4pyMVQ^dtZbSznBxR2~IrteQoEdQIYmUoB{>ZF2!jS`Tgy#Zi00Rud8kVxYc(%e9 zINTA%%-k_-e8|`oSg<b5_BSVEht=X}0_F)-qX7m)$9017srsd->hF8;$@hKu>EC$o zNACZ^Q)hhxqZ8OZ>ENe!cdD94b+qL3`P|hJ#?|(yo1ZgNQc?}9jk~}rM<i(k4vx&3 zDKpJM3B-g1G`Kp9R!7GO#Ovb51SemtgfSHdXuTek>>IZ8iD-R3Ob)!}sz>eMsnxF; zR+1}B&9xj(K*`lKxhdS-l>j#*hm$eHNsLSIl3W(gi%>8ag9D@&u4WKZ_2`+iH=Mrd z(_eh*Z~WaKfAx!B^k;wQkKKJEoyiEHsmV0uiirrG0LdgQ)d=uvw!@uW+cYO8;}_g> z@@=m?`Jpe|_3uCQz<WOW#n~Q>Hcs-!R%%l=<~Ea=d8d@EO5PC04om11s+@@vh0K(l zm6WX;3s}e^5WrT-bBV=Bz(fO^ZZJx4SS<oX%;X#xPSk%<5R-d=I`0;rCV5P#O94lK z8>o^{g^(#EX*7%t<5>$-QBIw%iKe@I(bIJslM|z^v9sUy);r$#>f7$R>3BfO?QEmo zh+Esa?Z7nn;$HGm*(h_k=DOQ=fDZ5p-uuZ5zx40l{lFLYd34>AJM#>wqQJGCPjlNL zX9sDQMKfuKl#n~miBuV8ITs!vT+NhR-F4{uZj7Ga&nV~BV!aPS)UYz#ffWti2~ap6 zx_YcnuJV)<9dSJVV}QHUl~y{Tc;LljDXxn!VF5qLzyuL6ROt{11RQw)M>ui-j__On zuQ6Jg!Ai?cgbWgpeQgyfgl{~202~Y0C18p9j3%{EH43dO@+|LpMpJF1kSQPoW<ZMo zY&IAZg5c)Yoqo-W-u646IQQ!xe(>Ih&P>xB<72Wt>e_kN<rsNV9|NeJYuD|gj%H5E zoJn&atKpSXg;2qbguup<g%#Y2Fv!TkOARbq(WT0bhpeR4S4%HM-vR6Mf!wQWYraPP zFzWI3`Tz&k!`-o5E`T!DEq=N}1d-feCB$neTn5c$xEqS`M~3pr1k3KEPGT&i?xGL{ zi)*AHBnsn80E7s{+b5s*<nCFPYIAb^M;|`_5B}-@^X6CF`Q7*2*=={XY>r}7vl7-b zro<w<``u*JRHIl~>+QM7J2%wFkB#c)w(4bf-1RN5zU$|I<0GH^{3GLI*EHkNg)_UO zu*DAL8q})KL4?5I8oLS=OC|(yj}CE3RN~&jB?4lsi;Wdy0SknSlmq}@#v4m=4k)Ju z7K1^~JzRuL2myiMUG$b2$tzF<jQ}x62dxP%2o#8e#4$!&9XE4J*kGOQSY2Iza>D!P z>iLted+7`Q_}jko#W&Cx+F(CGEm}9b;5@188jc=R3~*$ig<Q<IXt@8g^WS{mhd=i4 zL%BXC$8P@O<2#edq!Dq|>2#W=GpK>cK%QDPrIe8qrH)kHvYNUk2guDVlev2b>kWN^ z4N7x^^aN$VZ2^=LQeQhQ4_W!E>&7!%|3`-1f3!FpP9kO^(%~sA$(BpK0vyQ73LyP2 z@yI_s!jS`Tgy$5BN!nu&J7gmJYP-kqH?hN=7vOLP0PctYDd6CGJjFbP3gk)|kqD}g zKp3gPy`H;~&GvS;x3*t)EZp#h6L-GwTi*4FCw}{5pZ~;{p0MT^ZHxkKAS1Pzk}lfZ zO{VIG3Yihea}cf2TX$9VR7D0Q4i+K^UIk(IuWXAup#=W>C5DFiBp?L|K?!1%$w7qx z!7`M%T{UUrS6oS;0Vv~{P<A!Z$_Kcj-M{|&uU7fEtTbo1y7j$WtRqWqi9E9{+leX) z>0@9<1Io-`@7r^;K(pt75GV+kAwr9a?K5X)7$2K#Zs<t&r?c74&O1Kzz~?{r;D7Sg zyH4Hx;$sxeJ0?W(7?5=i4jB?r6Elsf0Q0<$cJGeK$)__;y%cYG$t&M;AAa`N-uH#a z9=qZ6&F6M!UX5a`$hlKeB_I;qS>Y<86pUalj^N<n(Fql_HX;k`flS0$oXLx#91#j! ziG+K)2c&lz87%DN9GIP%A(kmHM>4Ppn+v-UDF;vksz3ra9#tu~DJLhEN~$I_RV|?X z^mH>yBV24;?|Jo&Z@=gDci%QS2~1#=r(!8oBTzuasnywj*NiLl^{58w`9B@t0YCrC zAN;KkJUpwmX7x2^_N?`4>(uivKK;l>MMNZSMY<Pl=j|NKFy)**C*%yx#n~fOz{r&> z!yTUC&d9ErP$=+)q+aAEj0mn7Brqdi)2X1P3Po{5%Y$dI^^dIo|A?_tE_Yumn<itz zVmQHu`j4TGm~=7euhz_7>X873gGi1NL`OJs0FLmS01xfQi|r@H{9+Oy5DUm0Uo{z& zRvJdoZ^X5`EWL-hU6uhL0y}DkcQA!-;gP8|<E>f{0S;imVd4%pI75huCdW4NbZ`IM zwB9`N`fHlouet6;x1RppPe1ZI_kDIpY1($$f|Y9G5ST>BHk}yRdTxS=yTI8PZe%qx z7$L9#P^JJ74#5B?T93%Xv0NI8T2n5^X~j1twgaqF2Eiz^<Ew>#&9VQ(v>(SGkODL$ z%~v3zp(m`m_EsQD|CS*wK&27@+B+~1w@f5v3^KO>ijWLSkO&huab^=S3#Pnr{Kma* zw!gPKQ$(5sp^M%8@e9)jzjXFnUqzb?7zY6hKt}AN(O7}0O3Ga%jH)UIIT6sN3(t$2 zGsq6%+Pm@kJKpe)-@WiF@4I&oU8iGpaWFZ<7%r{^3M@|Oz}aImOWDlGoC#>$Dknkc zAY>9<dKqajgK5S4A4UPA9KIo0BuvaMfhfWh<Pc{YlY7NY$CYx#r4c|hkC8;e$g3zM zX!X2KF9>(nO>)4_OK&;-J>P!!8(w_s8lXWQ!&v8))IhcS<VE7Jaq>iL#5zp|h=gS+ z&roCg*e=daeJUGs+CJY-FHQ|EEhjO`^SK#Zlc=$(X*SEG#GWiES?XnaO#y{<gbZ^+ zIrI)!^voY46nVA5JcE+}W<{-bbq1PY5K40|EV^RZ8R&=tbVLDKtu#Q213+Ye!LJrZ zF#zN=@PD{mu8(}hBOEyZM|f_59YS9rKwEf1hO2_`&Bi*t#0<1Fn6x9QrjC8!m+$@T z#tk>zaQxJb$8d^J0~L&2dj_*duvj|{lks(%HDEK{4P1TqE%j?|dH&08I`RHbKlXu7 zeCga&H@8ksnyvZH&XebM!tom&%#zs?EW0au>am)d*K8&pf^h{CgTTWxDglG3Cod3z zxR`f?SS%9@xh>`fz)FJ?r~~vh91dE|7C2<|{J|(d1?v=`;o-q!bd?N%yDO}hhF~jZ zoVw*@2EZ=OjR5WaOd}#MmK+I8iOn-00hZyBOo+vWO|whbKYuZ7Zeip(Pg_VcI!QE} zb}7kN868j&1L$(D0+{&XY%h#9M2KbF0SeUc3T;gZ>0(ecR9ihcwSnWWId<3c-}p-( z`S?Q@r;j~;;llZxZ4$$_Vw7_Tp>n88XErlT2~(nEAXtP(cnvTjAp#*#3_cKnoR+O2 zdEH-PKp+GG30*>Pa)@|#7j|NJFb_^+fFlr?Gm|pqC?>%vcnqnLsv)FvK0Uu(+x6Sw zB+tM9ZTGzGTV6B)GA<I@fT%zv8?#wvuQpF#1K{G$+(|dKC;J8lJ3;_413plt1NIZ0 z+3997PgOPEI-c`ZclO+*u5C7L=bh#RHPghVk&)+fSY|b72Q`%RfGMmUdW))?k~!P} zgJr<rN^rOjNg;P8xR$|ihGVTuy<;^Wy80YZfQ~RUu^y75J``RV;0G_LHpKkH5UD9l zS^=E=s7?D3jvRm^JU74&;GhmmiD&StB9k3!xVoCV^EV-Z3&Pd!*#x*}_bFEa6+bb< z&;HJb`Q)Q_-g5h^Z@=xexA7)nlR_n7Q~?STn1D&Z4$sKl2-=8mLADXDziadLFS_GH zcii^wdmp&>QxBba>Pw@I?OSer-jn-*y(Vt^>M-{rHDpdO)+m;PvLtqLc90QYl@inU zVj>hUK|#gzC%U{)m|)IpJy*FWJ2(UOwNk3e#Q)IhgRgW%+`lR+nge7&uQcYSWJ)k9 zR-FzV+@TDh=fuOo3<5b=os~!&HWW=WQGhX7bZb3LbIwS{<3LiiopnMKM_bz`Dj+)| zlM~vM5mhBvJ)R8?W+YSqfz;tC#~7)S%018bD}>v(>zhtgx8CvU4?J-8J-_?0PjpXR zoRNlc!emN<5Zx>F03SXM#l#SBBol{Na0n0uK|pLm;6X$Q2MZ4m6>(V4UJzq5h!VpA z7tolTg&fd|Ig7Ax7lg*Orq;bpc^12;PSpFaxb50|?s)zWzv<P-A_Qi-yTNHpjQ|9h zSyzoF4(uB;z{i>lJe@!h0#NUqlsN#5Mv!_$u`vs?{kghD2vldgJ3iZod&LBxP03P6 z?5vqQL5);V!vF3-Ce7@*ujsWt($8+@N^TD0LjHjc7bk|fvmc5M*g<EN0dpr1mN;Vm z{Qn47Kg0$w^%S7X;D>bg%#}exC^$+G9pOj_><G^dsA>qIs;Zn<4;S)~sH)1{i=2AX zRLscQ73)J)L1tz{kG*AoYl0Iq`vS~d=1V=`m9pb7XXYzii-!*^?=`~!H}f@MO~9W; z+O~}`GIL5Gz#L%5m|E^G81^do_6?7Bqj%i@*gyW6cmDl<@uA<kfA1;a9Pq>p=d<ky zI>4xd&EXEI5w{4VD(hsrcLVU63V-Hh;jjPkm;BWqdi|U3x_(l17tTLk2W8CJyC4?D z6>2a9u@DfV*A42C)s0DQQe_bdvDix7E4`Y*h!E=vA_k~ip`tP~2Pr!WzO2nAcY=W^ zFkc$Pf?+JyFyzv3rsXg~nXIodg2T-$E@be_F$f{B$X76Z{3__T6QCZ4G7QY%f?n5? z2nIWl`CyKfSjyxsBDw&R_k3=1H-%+#<-!HZi7l}yX(ml%$#aL?LT9Wk=R~<f*IJr+ z>O6Ja&a1Q+(;j#GKHvA0$d!z8vbwGlAjOOZ>hT0JdV1D9cy@NquviVG#5Rjafh3Gh zOmnr@)hZj*OrlV&)8nu^fj{-4lmEkye*1s-XTJMwuX(}gjW*kp9bIhWELGVn_E>o} z3H7lUjsat;8VW+Osz*(%D=?fXG&SmqnALr}u@D{x%xqN++<WZ8V1h6OF74q(5XEDp zx~8VacrugmwAyM%Ti7@jwzfu_le!5NrLCyrFso)yOlFV0>ZZ|O_`ZAo+Mj;gfBBYI zzaaXxd43}4HP|{ur$*Qc*f0cQ*~9KG+H>4K>fINC$AL!-|KURqJ-!D;r2v4`*=#mj zvH)|JtZSnyxBI?-A*6kpw`A&F*G>1k*)DQNn!KH&o1<&7IDDR4&2vpN?Pj<%Z%sSX z)~$oKuB}}fooffpZkGm3%UCuE#V`m4m=C~!@}s~SXbtXu#ix7?m;1fUW(Mhhv*Ym? zX0*V%X}G>-HD3dUv5sf1iSi!9c7lluH?mx26<|gPp$O<6`j9K5e3#3TA!TL3`oq=h ziOPI=&4;R4|6^wcp$GNL)lT3AF6$NM3*hS8sj62zC<orYEDl?{2d(eDvQk7+N<<_; zhH?nyLfz{P6Pj2BV#~Q#m4*|6hVOf1R~+Fe18{`r0G#PElA|v*eus;%;Thm~_CkS< zFo(?o5|AWx7%A5p`Tj@uKmXVVfA{03zW<Fcd-E+6z~|L<e)0K}nxW<)bq4dAnVCj` zu(vxRiuJ~53pd?!{G~6t=eO>A<o%y|<dY9SJg$#zOd5_npM%^z)L}fCD|P0vYCPt^ z5buzTgA?KE8Gr&9z)WT!195P6utBW%0hr<Bh21dZ9ROX`^#V(!p=WJeikWd3EAz;> zuP(Qt?YE-W9POFkC`xH&z`#9GWhP_>6FI<{EJ6aT6iFL1L<y9#!nAg+nHW$aWvtqh zJD>zdoYDBlfA-(q{?fa@^<}rb@FcckY)zmVSR5RhkpmZJxfYsK0q#5J9^cwJHVMr} zEhk^H{k-e8pa1D|zjfb(AARVFS>E?*GsI1i=sDz$Ooc+Epn*sbSwg5a3p;zt2~}T- zNKR`9k&A8Zz-r|%48%+-Y$VPRFymMsKiMT@O-?Dfil<8S#E8y6@tLh!Z@G4S&nxbF z+w1Op`3;jXkY`UdaRgLC0w=V{s)=%nN+Blj6ugIUK`=Eu`V_wSxkn!O(0!xP=-8dt zY`8{*QO()n9>9)X8rD5{hUS>qb5`w4GiiopH)ZYI5;U<nBfFb>CRa9dD7lsX{bY__ z+*QeoWUhgX9PZjDkIVs3pB1!qUJ$;a_yz@ozy5Y!N1JyU>|kqz!<<GMQsw20>vKsf zRWc^ZM|Q;#jvRm^JeQ!0u?)KS`rV6+5QZ?-Rr>H0{sEE0@oYj~*eml(0}8;C7?hig zaTm9y+CKWJr#}3^Z@lI9Yya4rUV6u^^~U7bLpx8Oo@|Vyks1N;jK23<T@it`vy6?V zy88s4_Z>IA`DHi!)<+(@|G~!|_{>M=*|$&JIN3OHaqefHxG*_=1Hs%v))YvII+i&_ zfc-KuN3VLk#A1%+t`uftXLc|314d>9bM09T1{5Z0xkoVxIj!^ZSFyB1aQbFC00%3E z0Rl6_`D!_OcLNmWLn9Y+vvU3o)T6;%E^+|O&JN2UA&+o?JdhJ7%A7Nl=ZpwW#3?`n z5Q-%^sLSqf^>Et$&<7uW$9<oF)os^($ID;%vggMW%n|S|Hxhzidla(f>3kl9woY6F zH_WE0JZUC(oxthWpLp2|zvc61+n@QBcb=KH=l0LG+Njm=3UShmH&Q+)aAv40h^i(! zQ3pa0W+ozA3Q;*<!KM;+32;(kh`9uSAnIJWW75vfV6urAQ*w2h2-Ez+?CfK&xF){g zu3O*wx;tO`{NvjdD(eCxjJ9D6HEZ`(RbmKD!yJM7vDr=@ZFRtx6rcEF{>&riKl%A5 zAO6f|PR`H0r8QxKlVuAmHPZ!ifXr1@T@$0La$Du3oqA4gR{FY<C(=wgxpnM-XEt}w z=D9TY#HC3B%6zeek)!ndSr71{pW4vpr_>L)Yd)a6N8ecMpXeL(zmAwEf2e*61~7;* z<e32iq^u-@y1_0Dv%vu%<|B^A5sn;yBRm)21OpVljDHL=C|L4F`uHmu5goq6`2j<X zi44ys7`OvxgtA$z$}oVzqiSn=cXzjS_I&nTAAj@<UwZhpuf6pRuetMuCr)1kb}}T} zrtntm1H!ZEd^BpLu4+wfnl*u*&wTAQ)s5eE(<fhi!$)r2{M2W@_}G~Xd*^3$Jbvx5 z?aTy<6xkhSopI;Xkpz}OEyjoY4G!`Fguvv*i0?_@;v_`bnW(pNsmx(Q06{T)CJ`+^ zd1d-P`ye8O!w$ewPL&OQ8SjV|lTr){a<jZjahMZ8ATvl&M^z;c#ThVmWWWs)8RS__ z#g$>TsS&bU8+mX5NPDShU{08BoO=8m9(wYr&z^bc!w)=h*Yi%i@y-{#>b9-tPr|GN zX0yq-3c{e+IT#_BhFEP@tYQfq3CB+3#i#2Ro_zazKl0i4-22%_F6`#2LN!V}b~1@^ z1gSZ6$stC8LZ}FwnJ5T|N!KkBcA$(tA0SN3@FG?eNux+$aflGRi8sf>eD|!&<ix4t z-QLdL6JNY_E8cU@9Y6A>m)&t9-g+XAD50BMYMp{|kg7&tjt#>U=-|7SceB)^tw&~; zO#l18@btZ3c=CyzZca^{To3YUv|WnRp&5Y~CPY0&%aKjRGixW=kTO|z%Txs2G`l6S z<fdNUP-Gv>9A@Ul5u=_}QcQkzheHR8fA9cTbB8Ms05i{K2KR5EIv!|&Z<1a9EM}t9 z3V61HQKAGxIUK;N%3qLxu^2?`=ub≦@BmZk<P-*b$B#fFnEyu)0qeV7|V7dG}fw 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⋙H&HV}E4&3z9cggQU zk=*#wAZ2{C_pPs}h$sv%tXbHC1{+l)7}cNS<J;r}$rlQ$(ZSb_MBb0X_G9C6`qAiI zDlBy?6dwkrP6lJp^V0b1CudU%3(2I*CmdJ9d0_V|Fgp^Ap$rge+*pVmGc&_fhoJy& z;gL?xI17)&4yDTHQTjE;wT8np3oQ~CJ1zTS{>KW%o}^!zKU!DNPX>1^%nxL|A>~96 z6UYV8%^WxHW&9aADB3^bdV5)@w&cB%EGDq)vh~rW!?aMB+DQIiuZ=^#<KMHZf!T^X zJc5~cVQc2qM%!KWl65trgA&IJZ<o{0#oe|{y`8n@vRGGKB>(?Sw`Ke<H)MZsVXW}0 z7^#8Udv+(+p~bH@3(ifOVa-o%GF03gr|el}adE4ij_By%=pU&9jVVgvF8}P?y;RCx zG&K5<J*v#AG<>@=x$yesdH3%g?v|6>o|Yri27;n*8yMUIQ_4p`G_L&M(fyMu2lb4K z?aMeDuPX!Av!Pd~H^nB`ZPQsk9iJb)84}3&+T#0Zu3~&OEw7Y3LasCdB#O?-WruU+ z8kKTDIOUm}EMBt@v@!z1^?`_B_ck!6q6I9(0-0=`r@|fsa8kt~I>=m+I*Rx(m`bC< zaV1%$Gu{g-2wJz%mm4pKjWm}*Bo)B36Lo{hq3&~Ix)Ct<U<)fWf|MH*XAwgA2h$qj zoCby5ou{#~+VU^~BS_rv#j{?C)QnD9e>>RjY6@62xvG-A=uDSAoR+!By;EG7J5UX0 zR4QFR6%`qqQ6eHY<(y<HbFgL1->G)+|2N;WyKqs}e17#~y8lP2=PB*_+fFG^-qQ;2 z^3BkE?7N9JKp4J3aEF-8y|E!{a=<zV#SkOZW?|*>x}5+O8H8K5@YBO`RjDYcxpdt1 zMnjh?QbX9P%eC>gjLJxc4mh>CQ(ozrOQl!o1h}|-Cy#joC*j59>(ZL@x!dSIVZ5$? zVIs+-!SihDlY^am*_vxWYKPCSFh?XAX_so1Q6n`uo_P+xE*IM_b-oC~6zo1t>n`Vo zj|>WlaR)ULk?Iue4#@JzBYREbik0~$+7qbcP0cIo$kw<;)3x6`l};;ieQWjY`^jru z2=aVK;G?AFCs2uiumN^2k<RHk8>I;M-gL*V{MNUP;_oxRjfZ;-T22Q}11@k(JaRSW zc&la?FE6)$rgZQeNBD;l<7c6zjuCP-C}wz<YE2xPGS?^v=M2mt*F`35O5#Cdh^Ym6 zd4q5Zs3AO11m?)i>T;g`YLCjoXBd^!a9a6i&<eu$>#tDjvXu&fGKl28Eph&UDTK^w zd5~bNf-0rsgSnB<>=MIdkCua!&-P6AdEI;2&*NF{Uy&tt6rs<A=bq&@>0DB0tZna; zU(3ZN+s%qp5o@(9_}$i&E%_b%Vx&v8uI1)oefH95+M`4x(@CS~u*ke-x3aw9ng_?a zFA@I0qs1msPm@Au=h5+frmtdf=h2#uxI53>TPJy8o0Fb=lO@M@&C>t<X0|N8{x+sX zE;`&i`pb5sYRXlR)S<s{FuFCvQ1O{Zq2Viu%qD@_zqJoqKGg)Q5!+@Ix%*X#k9!H# zzdQI&Pj=mQW4l0Km9p|{<tDUCE6ZnXCi|q?cleul)@ZMCQ2}7-;!$1ukYP})`{BLK z6?5N5vl+2fT`N`D*?yY>*PYX{$JMv%r_F~QbXi|Fs(<&?lIyeC!9JTt$g^tek%c<v zd^R$dd-z_E!n49!tsxSkLa$8q0D^1_fv|H1Vd_A7LQjZBa`}Jm%rJxK17Q#-I~(Xg z_!NYY10s$2m3y7l#PRWAA$aVZ#M&ynNDi<NESG^@E=Uu+62h6<ZViS|VW9D@krw## z!O3~AlUTCyCnjx0lYnxH`+<%~M8(DK#oFBx7p*V1yO%h}LEW_fZ#S*0XC^+Yx<92> zgfEu$?}=F$k%`am@!W}FEU+L`H96`2^(t`|kHXRKqD{+xr+6XYc92!}c&xC4VQTeL zi1m~bf~2nARE{Jq8c%ti3I#7^qen*V)w?Mzb3f#T0+u)dJMJ2a=E4YxqwwUF2!roI ztmOqS%2LOzn-?_Y=S`~k;Z~FPoV3aW6iR$LVm!JEo>WRJ#fmx}brBn!(AJdgSW}Od zS3PGa>uajN4vy-uaa1d(B_zBr93EvB@wmW9&nG&_C`VOKc~2w|84+(`3MGK-l?Q$A zfMeoK0l6sboBTj%_{t+nGukY?`-2?Sr3KsT;zBV}MwPh>E^f{@hKI`=u`R2$w~dK+ zwgHYD4F$YBeuDd9{!&@RA-P9CJXG@MHFivc>^jGtI&qcYI$W^tA0u5#O-%RsN3k7O zLkFkf%Eoisd-`NCc=b(N4s%8f)j_pO%!+bklTp0iYc|EO{V<N!2qTPXFQO!)loO2R z!e4&FfbPNoL;#Us2=Ou<;k73#oyxpo=K_ku{{czRcQ)t>H&sg-C@%f8Vsq0Bof$UD zIZx%2<auzLG6Ubm$fFD|n=PNYaEi>i^Ff?;SnYlGEV$96pz_e=H(6QUG&;=yxkbk8 zi%g~|^6SB0o+Mv-yHeqFb5tQ#)ng_Wl#R46I=<?({^IJOG03vjVaHsV{kZmESwYL* zA@-3~@4K}dTbFA<^pAJrtfp3;{nY1C5yr#wH~(DP=zivx{ol?+b~Tb7B=u#CQ|wE| zsck@0QrG90e_l5Bq+~8okHX!mz9GS$gUfFwSAAQ1lDF0>KF7Z%yK17z257^_xfL5m zzuaq*DBt>Fps)4P=eWfeN25CHz4ZV6yO?#h74GiRStKWt2wZ9^m-MN_3A+Emod<r* zib$S1Uvx@m-#pbax!nsmYj;b1P%LHlkCXPrL?yGt{fc@Iu5s(<^)YO5SaUI>0xWIY zd@23=pmjU#q7b9x45@N6LE8un3{*e9!Yds^oX8Vo1*Pf25X(WpN~&l8nf5Hg;!1sA z4i1s?oZ=4(iYZ!il}J~Iv2~$43gJG0i{yBOV0EcJeI~ot)+CmcP-D`%WDLf}!wIJh zk@!p>Vie2{DpMv$?Obx#jq{H@8W;V<V5`b!{CcV~(nCdBi{)N@z_q8z&HI4A8!cDE zSHJ!)1^n`p+?B6fkcy_?>5kKG@OaHv>;3Vm@zjf{Poo8O&NrhcY7}p`w`A*Xmi+$C zvNm2!<qp1<EGGWh)vjvtWL(8&qRaf_2bmOg2@D`bjK(;BmB>A?u;Pz`s<1=QL5xV< z2ti>0!H&``p~CP38OrPk9QX*;T88cl$<YwL)Z;@CI{mdynAR?#j8_#~jcHCYLuLUF zohN#$`PU=f#OM$k*1Y^vnNk1MXuow_P`BdJQBQ$S)UxKpNSpAk0yD8)B(_LS6tbXa zti;Yc30EFd*Fj-O<K4&b$C;6?!oj)lyC4MaBjrs=kSoNNURdpIMPSEfK5yz6|7xY| zZjaK|d+9fu1~LaTJuEYQMj9i388muV_6fdDeEq!{MAjOoWDvsT!tC{>qvdcZ;JR+Q zs`=`||HXUmjWcnjojfi*`st;&uXODU!geocwls_U2YDBjF_C%^MjY~`EZSkocVW3u ztP&)TN)DeUAp*mx2k3;B!l^qENC*U}eb)>Fs~yLKwk||t&U?hRxNhJit+5I6@)b%^ z1rqC^JL);{R!YO}!bV)6z^@+#4I>#kjjqE)0Zw{tOc8y2q;;&4a00QSu9x#;8t_Xw zSP;1M=rKdZkCio>Uv#WZd$qE-v4E7I<U*?*z-*7?uc6g?`cQK0bEi};K(Zo;W@>1q z@I0t65b(PWHCTLnZ>t8+Et)8N;!S@ziE!&hQ<;HI)o9A%ZQ$je_j32wY=30SW5eeQ z)AdW}Mf<;V`LkhL7Mp+h-G-kY2ygHn{oik)_8#M%R!@rj+}Hu~$m?7NzOt?fP6gKw z^7m5|#9|uK$Ql1SzmXA0WSo9-TD3RaEv&M|kiel4ZxuXwy^h^o!ex{K_S@}R&LdB8 z82pVAT0c{Z6dNM5uWX$<jNV0Y5s%OQnd|$T9<G|~NABPvCyBR%o{JY9tc_>?w&>n` z(|Z3-W7-dA#w#EEtPL$-CsKiaQ7!9)!AXfk8ou~Y5Wp3K>mXqrV0K`%0}yM&E07N| zWdk6w02D=&iKUVQ<m80}k>UI|5F9@VL*$vpZmk2?HiP64%LfGl%2X%}_0dp?bKwYr z5<!h6&<%?RgUWd6RnZlN@1d;#WQ5EE%BP!4d{<dfVgzCpIv%hqdzLSIH8hlciVN2N zBIMz)t2*6!)=~XKx94}{$aa+^PjNn<D%0~uk?g_v!vYl^na1nD9@)!D))$vmEjJyq zJ|~iok4Nm^yy2+r@QHwb6Z=z<THmOekVC)hh$Wym1ua6r1=h}OylxB}036D}OF#|5 z2Xyd}5XIbfUP>%!FD9qD9TiXW;F*h%@%R&Fm>tSWRB#!C0YI<tpQT4BU?3#9Q`|nR zK6j&^N2PX}2_B(iVP)n0dF-~GJ1@#a5J8k)o^D2%I3S{vIVcbz4UE~)D#5!Lkz>mt zTl!#NKD{+eU7b5|L$_>k>bia+A>;GIlUT=DcVEd0nf>)T0l%Y__tGLVe<C`fKg9m* zUcoS4<TZz_wSP+!AS@3IeU<D&f41kpe-d!i(9&Y?Z{=m15Z+UzV9+Q9%H>T-`O}>+ zvz=@HW7B7M(v^b4)rs*7@)&X#^D|0y@5^JkiR2>d&tY-=oCp}ZVh9@&4i;Nq5X?&8 z-z_4B-%LX>7Ry6^@Lp2EbUf<Vf&oRkn7v8}pu8WJ?JJD=-c?a3mct)oB}lJRP<l+2 z_^~?+{UTnQk@uC$_scN>zx_7ZojciA15L&hVl$PkX77(dGq2pDtmKz%r|B-f(-(H8 zR=MZL>XTK9zZ7pxq}#7ZUGl%ExEr4KN>GqP%h+uz+yb}92^Z;}n$JF)$^UXEZ5vVZ zy?Ohx>*a%mh-wMPcZCO<3=URH&`i}G)XC^G-=j6J|MI+-G7p94k1nGhQ=U+3gxpQ& z63TZIxIc!SwA?8w`@uH`@8LOoGdfgR(6x5G9;<kNZonn<v@m7UcS`-y-0Oy|)RvQA zx<#4G57|EZ*F6t`ca+ttpQ_h3tTQMLt319hW4kPb+>DRHXEVa*{#0GG&&pmWzHYf5 z*xd`j0oZO=dscSr{axu7CoKj=IB1^MP(g)OX(SpUxL9pp8&zD4E6Hm(ADB;90e}U8 z*rv(Y;MUX#JW_&4YEv{UBnAk@@hcIKk)@|EpVQP*!g6svSZ%IU<P%-WAfzf4e<Y)P z4oW`nId_gKfu1%D1_@pf(n0UAJ%M9$bno;7AWL|Cavqh^ykL2_o<PB)w-$228S6A5 z57SO54il?91+E!eE|+9{{taIaYWeS9VF@3_rEnF6#s9TRqBpFXz#Q%*LQ7ct(LYsu zuwC07lJB$5I<rr@C~kfP>?a1-i)pJSj(U(aOjp{@e_Z(3!uY6;lG8EAwBUz@QgC`T zaTZzw0u`s{4&$XvAcC<W6XYOJHUvx%nSdc4MG*+<!mv$Jd<-SpgZ$=fFe@`sJ!ODo z9Us#MRDIGJM<)=Zh=y^gnXN`pZOY@>qG<B5w2D{)J(^G#JT5^9CJrl^YY}G!s1UwD zSQNA+SmSc2i`F4{R*~#M-ve`S1%UdfpPnpf+=CzSUTM=hw9J2-e6kquXPnh*HPTn< zHO~y_4^-0%%UloA#?z4ut-;fI|2&ZE6Tt)U?cnKyTQQT{He6SkSZwR1oGfTgg`pTJ zd+*|>1WDeZ|B9IJk=+rprHIoA6Lc2?MLi_i%*lfnU?94x=uplOHiVpuL1YF0hV+&v zAAm+9kYF%=2<J)wNiaPs4vLABxEIg;cwLAt(>-m0=|lR4RdD=X9|+piPz`{_(i4*M z!%%7Q@j~gD60zM@`eAGS{AD&B`tc2A0oU2rq3@-=HvM?MeG44LFlG>>wUO!h<^0I{ z`3z`iJ!TmHy+gBHe0kPpyg;!yAK+5;oH@hsA20di0@73Jt;tRPu%?4~v3DA^wNJKg zmd9=;6DedLFSNNLX~<7#h1JF_Bvp8%GEcs)Rp;&+)INE#6!u^2=5{@`n0)z^HiJe3 z{f6?ghKW6;eCpdE3OlVPiS(W_Jw&-}cOLxsFvXm-_Oj(MydTCwcHdw%=?Tr2$DP!v zgC*JPc42{*8=SNo=NZqg`wL-+F*bcxQ|bX89OHD-oS-OB4AJG@w2HX1KkguN6JPOO z`XrR~YCTZ)tUIyl`FE+TkLABdcWq6_b<g4&lVntRqr403S#~AHU!VZQdSuD~h#}7q zvXp6sM8y-qID5I+n7AW2X@sb#gD}u=FllcHF&rKTtkB|t_t<e?a6B>`fGLqPZjaQ< z7ZK9x8ODj9L;MG+2vC!;A)t6&P#m$WUL0XTQwVC$OF7P{K}*CFxR-gzqDmy<x=}hd zwsOi}1ttA<1EW)yUY^+OZHW0_jnnzB9paV+0)DHVGpx2^m9(8^Ey6aB$h_4_F(6L2 z#K`8LQXX|4oMm-=F*f$8$pvfkVZWM|37Y<VfC)y}joyO6_1bVplS-UdqA4dRSdMeR zOl24Q;4ZDEPLevf(DTPHq$>gnHRnQr*mXG&^p+6-4BN&g2*v9VNkTm%`cw)=awRCv zNB)JJnBmioAyo7f%~3=&N;Nv#rM44B&$b4G+veEpKY=j_gffWTQSc5QJPwjTZ)HlW z;ZE=JWkVl~5F>=eAzK|E#hEJR3yHGn$2<`2*hts3k7+sT<anPs>%Xe*OA5!U)14wG z_G%ubLb2LUw2|j-6&k7<5c^+UTzEDgAF)aux9{@*sCCDFe9t&K(VJ^zz(pQa^(C~* zhjA*ZG<RBXBKN&f2SEyF8Z08mLK{m=qa>iWfTkzb4Z#Q^VVr{03H+uyiXm_aN*nWQ zK^F-I2ySYHM<8QNfI32v=Y_jZ0*_!Ix$x*9RSdfsgy@UpUCjC6W*`CjBc+OjaymV) znsR!6_1;Tgx1XJOJYt)RZNK{GSZ_z}1oUO!7_&-+Iq-r?Gsl<dxh{-|UJu2O;9a(^ z41W9j#v_)srS5jZF7@SNnG;$5f>{i_!|3b%dSor{F<_IdbvYC(+I;wBE^+#0{pZU+ zc7en0ca66Niho;Ci3?|I<?nVn&pQXr9GuO2xgL@I-=Q?^@6qp6xmomyt~%VOCP~`7 zcJI%6{8q^;?<Sqv2NkcQAK#7)nOE&LH?>?&EpGPv7*;+R9UJ@iNwDKXO8(Auu9V;P z{thl)F*v>Gzl2xJA{+3l<5cYL$0pwmJq#bE!%Gk7tc6H+4rlqrWTDaTtl6f+YU%wx zx0ZkLZaAUC#opWN5;}oKkGDQ=Db>~<K7H`Hxd#o##wMgDW!R_7L34t4-Crd(_S;6n zEU<b(hPeZAwn!p&PGwUd4tN>@%iB14`T!&XgsAMLoSsWa#)9+YAi%~HYmR)u!aEFR zPC6n2z?BAgp?L%`I_qyTkcI$&A1s%{8H~`@rKT1VDc7eJ1%bo`%TqegcA!;!uH1t9 z6JE}{JIn2D)r04sPn(x*XIf5J0}fAHuCKC>lLh?NZ=Sx-?3sP`1$<$-K!47gU&R|n z+!{xA$4e>FtXBW(B7LXl=IGL-{&aEg_H3<KpoyG>QL9@YJ)Nr(LWuYRKro1pM<1k3 zhlt|~ek>#{)09#b@Du4_g4rkupg7()8U{fIA>`QEz-Dc_D)fY}y~Oc#%eqPvBH8qG z^S<*SF(8Ox8<?i7zwk{UDv@%sfMFy~)$D!^tx8l}$eb)M+dORuKnVt6$m`hx$<;hX zi+M(Exby4UdLd&f`Y?87fSc1azwIQV=R<DgNdj%LSPzAi&!)ortecSyDLjT8{BEQw zxgDDL-jBCz+Z09#3c<iM-}V0eYo6O{+=XJ}Z+dMa^Kfv#KZA?ZZesm|{(5KWGuKx3 z#xjeiYNeCZl-f?{l7FbM0>B~xH{P^$!q$+RB5@6w(uCc6(?9{1I)qpSn*&XUMR+FK zgn<iMj4uxVUf|mS5uPy40l6suOQL-G`8LmtHmU&}l!Jc35%a8R_K=%i1=jfj+B)(f zjNoWBgb{12&mds9BkTGmtKoX3{cumR>CiafB>S|l=N&8Iqp0rfc0XrEbZRMI@mC2V zQy47`VQcem{(b%MX}YruVSz?3%e|ciN9#uq8Sq}+3%LP$4VjUI-jdmke<x06T^iQD z=*|j+ca(`Y){i6b#g9Jl)s#p-a>f%+`PbKJ!pf|1CgJ+O7rdh380J=rscJ?KHJ8`} z{f#QFC8R`rb;G9H4iC!Qz+v9r>`P|$PwP{G%Bq($OHH3!o|9S#f3WY{Hmx@QQsc5c z?`jxuI#?TU^)tC=Xt(jCGnh5N;_v9I8AoUiVK-nTl7m;6bnN=jDPz?B-$~)L7PBme z-OmsKKj+I8!serJt>)|E=Ie=igHdsFlv9SqA2NlPaZW;>M1hR=B<AmNDS#G|%8f?I zy4Uev4<;i?p>hObf^u>Yd3m-R00e?^xFjmDU%$E16m-S|t-M2y$YV$+d`r{t5Kggs zq`Redj)I@$b>O{7OHnRfK-u*>f<uFt4W>wgmcy7oqnr9A&rP~MwPjcpm!iyu&4JtU z4ye=49iGq83A`^#tccCr@|`Z1aI>sB|9ew&d*gSSefFz|^>$Kg;dY;BfV&ysUw#Lu zRy^dzXtNUy=ii~fcHZ&x{)@+2%`+r>v?QI`d~ijQYH(TVCm(9t`di;RmKb81^06-_ zj{c5x3=zwb`eX!{>uE>?^dTf)T^)<hE)S0Q00o&s5wK1&RdaG9Q4&I`Qv4Fg{M&ZQ z7-CSDJ(9+!o!Jqj_f&*t5TkuSslJ;)A7!XoiC-9EtH)KU%SM!knuoouO=*N;FoBwC zUpX_Lad;ZxdHRqGds2vTho^J358Nl=MvAn7(8>V8#=h;#)XQ(fQg3#fpRhjmKbc?M zX5z3W<_362Q{@YB^Q4MUMN_t<6fk)poxrcq+SA+Q+q0Gzle*5^%eEy8H$&U*<C^4E zEE#-Z$(yC-G&VHPbM8IFl5^<Ni-sIi`e6xd(ShHuZ|R}~A9}eXlXz<nP1rag052y7 zL<E&f!1ZVqJPiWaaq*WuQcwq3?gzw509S$#A=92<F#Y|&jmkdR$P|mc7$T1Ob?)B_ zlB74JV4<7?Ox*w(y?M<5+<PJ8y}|TLNtu<@fb+zbn}gFO*&c{>n9#S7O{^Ii2!9J8 zSEdo?tfXeLVggq&{rWI`5BFJ&{&BFr>C;$wKjmGQOqfEi85vyiwH1%nQcIn~REn}4 zS*D%?#KBWy$33Np#rR0&eos%n%l!|1x7*KTE<Q{C_X@rCbGN9vSEI2l{^-fh&$+>_ z%^A%66MQkL`>J){11jF>Flcx<ey$VFVp7{NZVs^Q%cy)&H+K3k(}C<!y|Z`8cF(X> z(ZY|a=Q53F;j-sL?|E3i?{z+5mA-5{^k4i$;CfW~)9XZ}y?Y}!??Je*<g1F*rs?q= zuauR!vo)=(^ZzMU(6!u7bTzH)*p&rO0*vqf!9{sS^Ix-PmQp*$Q5G~X#%gQJ=^BLw z4Mf0#+|hyx%AP5lK?s1SjFgyz-`aCf34`W~g8=mCr6vYm-Cvc4x4UZX)Gi7*-<b*q zvLKzSjDrN@RNqn13^~}{b~9o{NFaMzM39jw+Iih)5*&!Z4_gzepx|jl*m10x?=(v^ zdVB|6HW0oZ`be+;W6P;YI(;DH;KX)eZB?M9`ScHC%kALa_ErC1*?()p^Ows^WUZ5v zuU;)VyAdvPWppg^ckjCJ3(!WVPGtKm9c=tb-D~)}g7e%TM5iu#<$7?d5%87=fe2th zzHf$!0SnhK<4RP8W70D(R33gsSa3Y1low%!0=gv+JLTlP1W4#tgA2_=K-9c)oUtO} zcp%*zPq(DjpK+vQ9Ez5_H1B*NGeM&E0HjpAdh82165|z)X;26N3h=N9W!z4XCsWWc zPr^H&?#@EI(9<Fw@%Y|VtJyR#OOSOCrC@8IZhgg6(Q8kciy4k=FE97uM*wFzkF`10 z!?17Uof3^<UQ6@yIg2uJ0#hPf5%N;@!T+2`*ITk@eXE^K4Zd5n-ml-vd#qP(<J0~A z7;dKR2mj7rJ@)D3Xa0l{*DF>qp9^%a13^22PZS|YWBaN81Rj)ZKChSbwDh|Q&bhI7 zq_g~pJ;bv!)8kMc8Fsti{#W%@Qn_7)kdI+ozf*u?U6A9WSo*UyGOr$i?|7z(_5=5l z0TIsVDZwAl_g-8b-J!VoiF50W)NRzokdbM)o2Ka0*rN!j!f3y<T&AWhu*be~w{Php z3HRD8{P)|Svhj_Xi{<D&{MAU~s4*MA2*dnptBhU0^{Wlx!#g~&?YonDv$7xG{Txr6 zmCpYYyM~?Gke2Q*eOIB;adDM$t>f!HdE5KHu`8498zRt^1-fFsJfkA)X{-KtKZmx# zR(<B+o2^fqv|Jv)`_8tn8F@6FlDPbjnzFN)oyuuvWDTc(+B-Uu5BP?cRa@=2b3_=N zo-E;h*kt|eZfhv!FC)YMoI3sbE=vBKb!yZzzsSK=H9tnLN6IGfdX4>a=D_cBYTwp# z+20CU&0c4NtTMM(ThscY%QE8XqNy1+kOKQp5KdjAi5P~k&EygWy$FbIsyv7WjM7C5 z0uWVfP;wCz4O0LUVGxC_WDkfsH9+(*42Y7`)RP?!#egO)sA25%0KOcjhaJ=R*?4kQ zFg+N7RtgKp(?hI%Vi0WSL+avJl#*j$+gpOY1V|)J9yRG!Qi}P;7Bp;=o*v+|_&HbA zGF9&|X!TX<s7pfU)8`~9pOe9^=-akEzpawPmgBqGSKEZOn(yB;BYf_=CXsRt=TDKC zehR6VV16~h#6+5?eN*Urg+q-tUr$N9Nm`o;K>%?C9+Tj(GCh>mqFAm={m<ubaEmzY zMFmhO8V@22^CY$hW5AtcN+XfL0JU61DYBPSK8RlsU=cKWT2~r|z}@orV9J5I5%TzK zi_b<hAe8bb2!E;KNIMrFFNDMN4_lx*0Er-n;~Fzm)<Wq&To3L!#W898>yGc^<Yt%9 zdBiv>rycWd-7L)cJ0Umz-|l=ZoEh!U`as9&S4kp$ylUCO`#yDCtb=%#lr?FdaF4`M zhV{T&{j;e=-+=wtY^l><U3$ZPe>k?1MQxJsuI0jy1sxI!nigt1@S}s8$?cMcC^_H@ zsn@N5Mg)U)DY346C>1+t?mGST;A=c;upkoLiiL0nf)a@3<Y53<utc8v*pc{(#Vmq2 z5HxS!c?+gQE;F-07H!^KK66{JeuhYE;}lQIL1m;7s!e{5F~vZF^)UcqRaHDEM}pKj zNxOr<Y||~t#r;*K*sMeTZS>7ATqaX`P@4V@;&iK<EYQ$nOWTgjuzJRrU|Pn>cW(Rj zPsK~CE@3AMoblsdbk+6_v*DP#(9dU{qSPLBNKe3cSaWDd*4g&&QTN-1icymVW9z1m zdLOfgHHRN*iCF8WRS@4_NX*^ei43rHrN%Mp|2GxIbBOv=TM&89^k}P^ts-2n`17P; z@%)ALhDT^UR-rgy!9GLgViq^~rf_QZccA&v)h3f7J%){a?z1PtptGC*!XsZz;C{eW zcl52CvHxYN%uRLp`OG73ZxOR}PB^V!OQq#zsEo?E$`F>YY$0~yV{an4*R8@A+3Vc* zGUv9ZPh|Z!Hl`PSE<Y)d9W4yG4}n>`jfv=pbza!p&vb<*bypUpu#~aL<e->|m30a4 zushoouYhWRz;$h($t)#QjS(Kz_Ck;>m{T0707XD^<Oy^D6zWqyJ_bVe6~-3y{R=a- zI_N+%^n)PaQ=E=L#74qYh@p!Gf?+DEg+&%t&W90?k&64^=K?iuOw<J-cT*p5Veh^) z<7G1u-4@+Xv3MmMUpA?#f8WyZc)N)^+!7vZWp+%FU4L}UdK2Dqgd;wmRQdn;{eDJ2 z%SqBGH+C|Dkc`+C!l1?hFRr-flPBSL)_Pto=!gM=1Ph4JXxD<av_HmWTL!}UeY}Ok z-M=boa8qHOa4UxnnQ%OEF4frHRw!*mkghgfX&h{A7duK#8j1fB;5T}&tD0ld5mCf< zL?gmbQ~1S0f^?u;ot#`5AB%K?KmXKh9Vm`^kw;z!ZNp5jzHnd;Y*y3eqQRF(urq}y z?+@wT0gI^JAJGq#Im0?BjehODuS6e--xS+(1n*}PWYqdLW}Rs1G*R#-i5wGBkH@7~ zE^7PpOS@Ck-c6Jz>DL5t5Ca(o%}A<Ygm^*1Ol4<I_V$?2!2h&NtLd!&*h5xtTUYZf z;zzEcK|ibmX=8X_*VhcqhpbtTB%X{IQ&fzjxqoL9Q~y%nbSm1;TD}^Hh=bwO%{lym zX1S&SF_6Ov0<lq}fP_*&Fz168j}%1*8TF!Et<ha}*CD}^LOddlWdITCf5Ih5h<FUZ ziLf9;Ie_4CIpyI_(^uj0LazJ<O9hTUzY-s3or&w+wMm-V3U=Xt5imo?`%1J^oH34b zAi~h(!=(?6$kvnUk2VLb`iFL`-m3;Ou2xTGzFDL5ji(X+)Tfv%1lvH5#j{BtHZwKy zHtHW7>Ak(J2`)Bi_W4w$D^>xHZgv*?I70lbJMzs|R$}om>jx&gS24A8m+Mm+wLc%q z3bSOgiuF9r?CXB@?yD?w&zoSaq4%5r|E+5oD^>waZU}E9$rKb!7$jXCruvM2&x|EZ zbvna6^hiXh|NQ3pP*H(HPBHslAKTGYZSS$(vwi&`|96d#7)nmRfqADpFs!otrVDon zvHI`NR0aH78J3OLEIv|t7E|++K6cz1Wh!l2<0;O3*>^xXG8ygUV9ydgpRuCwdhUE1 z7u>+LFNy_l)`=~N3vRN+B)V`9vTRXti8<xK%*;E!%xX&=R18QE+_k+l2uykpCWj0m z<<Duw;603k^g;1KNbns_1OgO-zl_Fbf><Ci5GN``oE!++j)?Fg#D`I%;9%lb%m-;a zp+soBoCIaa5?=rjR4gqB>Vq%`c(MIcZ7gt{#rW|g{2mx_7ypSOO&<cwBm$3akRVxo zsW6lj>p<D|Ej^R(dgavL=lqzY<*<)p{<bXJd-W-Wsp^qvEgw-?|If3=Bb^<$lM+V3 zqZiMP6(r{nlo%XITn7dI{KOiXB4X>782<56(Zr6B1NB{wr3BRT8A<N$St<#dYz0%5 zBJ01Pf;pA*<CADY)LiM=b3VjUIS5)Bx!~is0;yyn7=T~<zA64gB)+yQvrZwH3R2dc z!{x>gzzRN~(f~Z*u_*>m@cXERevEUOM*ak1jd4(T-i$?W>a6>ZzO52C%&aA{V{&({ zT1v!T&#)_Q6u||_z(mxXD*mv~N+%s`^OwyQ^;^y{m&ma=>aL~pT64X^nei$N78iZD z#y&H0cdL|?n0WGgd?YMWm|)XIljP-*>kJ#^f=XlLurX9r^7>}?kO%@41q~L!cNKyM zK~ymora7BKG2WpOl3>_k8{phfPKy9v{1&ajHrx_Zn$GvpBB`iN5u6Emlq?WjHk5iT z(3y?&PY|BJujsc9A*mlP)c*~v#(&Wvaatu)Px;~<NI<DU07`@^6N6jD=hC*^y+%?d zajmd`n*)k~)y3Zw4$E*#-_%3i{JxaLhsQdi7jQznUCxib-P2QNHy^f&1@2`v{cQ2e z>Chu^3qtFw*hyeoBR39&Uu%6_m=Ra9dx&-4I_@<W8ai}&tdwQ-IK@TE&avE1l<6mR zw$#s&)Bmo1w}Us~0n2+APi_}mzOXU8dtAm`-NN9i5!-(6W53FsFS!SkMnbEUnwgqA z+pAaoLuF1c>ff3<)h#-WyHC7B?%D3t>!`+JQ$FyRc<l^Mzx3MddunoiL@0B!Kk?8H zPt{0kgHd8w?Dh7==jp-;7Rfi?z-6U{GgeY>1~i!^J@+&Zf2Gf!Hecc`Gq~73dURJg z&>?$pQ|ZOmy4O1W_tVCyc&~|xe^`mgu{|Z*Utm}X>5E+vRDkL~3)bfX#qrByv}rK% z05W)y9_A^a#bp)}@<HCGmP!VMzblor^0&cv{OQU<3z$m56fNq$Rn8y^_JH#{@*+JC zTSO&r>s{_Z!31hplr4-otJL6-$uUQ4SCg!%-Z9xNOWkT~^5#$$SN=-P4){m7blp!U zbCE0{<$tUB)3{VoMq(B~o8v2<kjfW+f8{2#rGW50MS1`DGsDoOG)`C66xQKE`eNyk zjqhg{uN{6-6zPh#y+{FN26GaN2VEf^6hvx>2r3}u1|n+>xz@-jF>QPNT~5#|_P4{l z`z#<Gu@&x7i;~`u|Hso=_C*!8dwXUWU_d$~g&_n4kp?A)?(R<Ml5U1>K|;E_1Vp+) z=`QJz?(TYK@8`bvoB06qTWej{8UN$ZAyo0bkxw=P#uLEMw+&Pbc2Kf*d45R{2hehR zI+>`4>Bz2%pI_0IpEU>kdB?evHb4i^q8v0AyjBSaM*pZrQa<BU(mwI)Lc7*Mi{v{R zDq$EB0*So(a-DAYG&_~-_V6c1Cq0pWPTYSta;fn?k9}GvcTh(QH3`UuFxwX>sg+8o zNh^I07%q&|`A0X6xUY#QDaFHa2pXBplEG`sz%yqo5Dp*(5ZKTsL?j(|+Z3HchBgtM z6G6K~TuRJjEY{eHt2%CGz&wCC5T}B`uYQ_xPDtBtLL_SPtqQmqQMf=DQu}WPmLcRI z<jsHg8-1}tUyhfGDFkoMyd~)2xJqFucA2|yb)H6D8LAJMT*l<@SR!mX%aQzC2!)y( zZxVRiR$H45engnW1^AN8R=3+um?zASj?UH~5-6Ug==g){KO;VvrZn1pO~c<fEBeB* zk764CX+-PtvEik@<8U|q;J@!fn_xQH8of>BvbPbrmh2E|DHh2$W-r+p+ixCo?onS& zI2PgZ_!brx>10t+QM=>V2f}f>6l5r>(g}NPl^1nSvIy?JO%(#HgzzIBZk%+StW5FS z<rB`zPU91gETV7;gMpoRmETonJOq(4c>Vw7@5E-4_SHy#)*f9PF#1>`MUuYQS9SE$ zPA3-!X+57`hs=f~UWC@R8XZp=7=jZl%>J1T!EvUl&bj;*h?9x{v8;u{n+Sq~fUtNf zWFVefvD-)Sa7Xm+76$mOAr4&ngbomI77S6(l?g6jC__=oBPdM7S(;FH(RaU?2SSM< zkuY&$AORr)$i-Go=Mlo!Zy-8YDO@M<cF~+O)owduXX<jWkmuzNk^6ew|J!ks-toA{ z;&;F9ytvVTlpZj9Zpq1*lOJ3&Tei^h7OLI}`1i&(Le<lk?&!-j6BlZe0P8^%7Kpfx zcnxcMkhLEd%S}qwLhM~|4o);c4PPJ62pIUGc~~3{Ujk1;VF8PBzsE#70r(|+O&Tyl zs>ooeKp?uAah^IFlnMX@BcrjB%A4bCeYi+tmr&h&FC#I@-{d4g!Q5iJF}H1&#zsEp z=*cuwt12|VmQ3+9jlbj83rl)eLCS=S2Ee)xS@cR<IBQhD`r~&*=3Pj!9WxK$f8c)J z<zw-Ak#uN#>|LJ;np^txS7sfVk?qh_i&H~l_Wh93E45d7>;=3_mTX#;0qBIK)adF+ zCQ`U6N+MucVN3)b{5@U?9L`th%RqH%zrX|qz)zwb1QLT=QUH$`yQ{%CP#UX(0K%_} zQg~RuE3+`*4S&zkQ6>|qc$A?60n(hcdLwHTdlI7Tw3>r&EqKP>z2n->Pm}Ysp3OS| zmFm*`#Pf!dekJM*fHP3?Hy}=Mq3b<K9z`UY&e<U0`8OhOD@H)P9^#iehmswa8xG*C zwm{1EriXmlu&QIM2PV->FB#=o((g)PYBdQ{1DPWmx{Hgo(jptX$!#odi@Wubp5E+f zX?C8qTb|!p@p`*ImVS90Jj;LeBKaQ#5#>$<ZZ<Y%fLo}bht^_GWLxgy$&m2TUr>de z6T;fT_j|<%nb_gqu;n(rMe>SX>-D`Z>OuP(`Q8NWNafWtqdM@#<(xpO*Y)5ZdPL;o zdEL1s`{j2~wui}OKSG1{0TfpLk^3iZjSg1-cd}JZ7UJN~fm~~Jw-&yK32n2bKgjj+ z^yv>Qh`EhNO3t*k-4B)z_V<5F(qz9jbib6+#~9U7=A{=7FezjOV{(C|2*f|C!l1Nh zI2duXk%X-1aAE2m@OWSY90%IzD7jY87gpFZh6j*p=u7&Yx&Mxq27?pE1I;1Dg#cLd zC)ANdxN}Uj+)I)KgDoNPjq@DT0H`E#3Sn>(X$V*9e6^t1V!;IGmR|0aNyMRf{!q)% zNTzq+-Xl|s=5wn5j{Eb0kk7tm$76`$-R3|a&$?6?Y%jEecW~BR6_XkRNF30K38o7b z+Q7e2OxtOHm|AYo{JiFqqVQmOZ?ayAnR)dl>}#FZyE?E)e<g`kkPP-DqZShwAD}kA znS??&F5C&Atu@OD5Dvp|9E5l32MdLM`P;2J35L^xk%EFhF{A=ROBw^fR)Mr>OGeVH zTB-t6v2nT{BJ3Y!&*RzCH9lp3L<kXQqUsrLC~Pbah$~rq&kkw)kE{HRi@SV4sL=yc zh&Bpnhr1=k8yshCmhHv)v7)xvpzRuQY4_Wnm#u1TZ*9*Wj&;cT_{C#fcF@H_3Ffj- zbU>)4tET!!OE&oZU?mr;@&Nj>W%E2kDqN-8(V3Nj(OMW2swON27XdTiD)qb2U!nqq z0Z?2X+;|8QR2>F}w56l0ai@yGVF2igz7A%*6I2RB04qY2m?$9H5op3^2IP!_VI%uv zV{@03u6X`;Z#{xsYPAnOu{9LF>4{&!gytWjuY=Xek>hA^?Fj4Xj|}f+DFqui=0SMy zD^|LNCD@n7hQIcs(u<OZCJd(m^gnnz+7Tk6^e`d6vq4==8zS9*8pmxFnyziwmEZVQ zSy$&R6>PbR>x(a14X`ndJBPz6Yfk2F)$HA!I2_VyatRk;Zew3r8YJHe#*+W9sqRjw zi>6mIGOcrtm7~I`Wn%Ndv#mwv4Mq)dvwBY1*Kd)<=!RH5We0tN%O5}aIePh>teqN7 zxIW>@jc{%a^m^3@lABZ$(9@+=WX;F$ysY)D`dXhvQMR5qQ~Et-q21RI8sS?Odomo* z-GezH#Uv4=zNHDXbaL+sxxBo%(y!#33_iTKqp<3)+)3SX``%;ipd3RZ>LMdx?I3Eh z$3^?In9x(C)R+nvkFgVo`<m{RR3fz{NR0{)2*;%bnnJ*P)MntjV=O=cv5;z+7$@}f zl@#@z^D!VtL`>~lBsCfcln0pRmFkDX+fPCUd2s^x@YMln7_eXxCRB;QPX_=+YWn=5 z1C4{+p?s1wH%M=s@3dByVVhqZ+3I}z-(JLDeKA=6GC=8b;mzmYYe8{89z;*sYQb)Q zp;QY&il-UJPm1fpWN0)7xBB<cQ+n^NWL8qPdObZ<QMA^tcGV|JBIiqeQZd!9|7jns zLX;z+Dn7Jex~s)Y&@d_56-SF&zO)vIjIYNElpx+Se_g>!6XAaLBLHyf#_>o0D*fN+ zFMMYdOLIIiBur2SfB{!n2Fg64x6&D3Q8OLNBd7gI*XgZhdfZZ4Z>INOLxBbkyOy@~ z%51^w&eD!emd6Xhr(FqjGtt%jC_heX43r!-Dd@~?3AMid5w=u*P1P%dmdL7(riWGE zgNN1U>)4hb%X5B4UXOEL%f~D&C0#nRu1PiZyGozm<{{$Q0XjL=an@s`h;V-CKaE#; zB7uQ*DH(t~k)$sV;2;qI1WLOERhMp*E@|||0r)=?<Uk(<c!1$8sY=3OND_GLag7m< zKu#6-H-H&uXsR~e8<(!~7$kFZIaZFQDa?0W8Kqa#!40kRx};4OTfGwU6m^6v9?f4| z`eUvVUNe&;@BZz7SM!F9g1_l%jTnC#&N^K$9f3ud=vU9hSR$KPUPw`N2J&D&-545r zISv!@Jy2@-s~*OdsD$Jj`?K3|&UWFt^r%vmteq>$ii1`&q?VJxbl0P&_Gq`@4$TRv ze$T8k%sQ9W$KHwH>A!t4|Fj2upx%BrM~sxY9bcNKj;4XWON;2tIBHy<oeeQcrAb={ zf5vER<`RiR^4ZnF5Yyl5zvWccm46yW$xrz7I^4pQyw3^t%AXJ{!{)}*?TgjBv#T+m z%QMAR|A#DGEcm-Y^T;9%vPeyB`*pNo`R%%cu#1>ka!hJn+TYg^=k2k_{1@B%3tdT6 zA6Hi_O&2KhUXfKqaQ>*79nZ!1#&?-{hqsb<tr1n>5o|4mE@FI%{*6j1QsfggRFn-` z5*N^oi6SE0&j9e@X~yVwxseC7aI_y#L0kAllEC2w2n^wCMkN#xNTgCyFod}DcS)H# z;dXdn?uk0mVW}7pBObQ&j7vOYiKWpr6jKNPg@GlCIZIuSEO@S*u)B<t-ZwVs^4T4` zd;9Dm+G~I770cu09>N~<&G4yk%>NQex0oFC9eJfHR*_VdEi?cwjl)XaJhR_5aQjR@ z>i4gvcGYkF)SJcdZep=~=Ys*s`SrpgYeL~P4F@@s`iC?t%&5tC?&KO8UehZ!5tAI? zln8ai239xPtHGn$Sp{UdoP-a7jpD(MQ9wfXS4+Qj0r6{<%f@d#Lcz2$U`%0Zsr)Gw zd6Jb*T`g5r8*@86y*l|qt7*>f%og%?ZF_Ae?f2`5ae9~G>7t>>>X}vNYf{BI$s?0g zW_m;eAYKVwrRNXM11{+aj>ntZlXlOej+gwC4ky=|3QtadpI`HrK}RS0eQR=_oH7$v zbrqrZ#)V^W8?!R~28m!bwO8OW%aTYzoX|M?EmWnq$HRw2z!Fw48W2<_41l1=GXS8X z)86@yx8h8|W7dF3UBy8-0H^us>$eky+gu<RkPnT|0Rjfx5AOL=EI*i5myQr`CpFxl zG)ZR-lWF(xBfbI5_M!Ju6qr-AJR1e194GXL+vMh7Q5=a=lz5#io#$b^+!CtIy=B@G zZg8$<oo1E48k2)l@d+QeG~x6&XDx~b_tzX%)42iiI_YX!4aYSrlCQaK4{k?mHWD`I zxgBUHMc-hRPpJkC)O?xrGPvL9{PM40qtTX>t<nTcoXtN$?#uS(KRsptkc3L0N9_Sx zv}HtTJ-3LU`5cL(u{O((7U~Sg^o+Uo`u!V?D4V~si}myh!}acT$t*_(tv&*44^e{C zqp^08`7?~xnzp|Z`mif%e9r5ZDLbwz9XcHUF=hMz+t}%&k0a-H`b;E~12GzpG&c37 zAZ?!MmiR_OvnIN6)N$M(_~I?(v(+Nxbv2^NLXZ4rXxxkQ&DhsBA8zvLJZHzJ@R*}G z$+XyIfhdVU3~?N)S0w=$bmDPXYKg2K5m|YF!QVNwh&hF29uSNX3;_yrh>!p7)CaLX zj(rouJ1N5{$$=8R4TuvFKM#+C!9*&N@~U4mc<gv_2fK%ZmF4Z#%!&EGEwwn!eWg#B z_!TF*8piZn1zokp{f_i!OrPn^KpC0!8>fY}io4}vgNN-}2jBgklLy3H^K4yGf}Tun z(h?9o;OhOd3S$S%QN%tdy*+Uy_qM%`2s2;xta*4s<QPYzh=?*O=hQT1SiO2nu!D=l z(F%L2K?$~%Y09!t;TdrFYYb8V9<|j6=lmex1|Kbo94kVBxRd9YE)`duE|1czC5?zg znTf$A&?UOXUOB{(-9fU}X$mynt=TkI2oE}GUi$?-g}&Z7Kh^EH+B1CGr75Pfy=S*p zNpq?@PMWpLpN$7Dm(ev_G}6FXYnKjztB+Ps|C8B9G)Y_E=LcQY*CeT#0P^h8PIIvy z%AZ8R3Ef}vjl+$@b-Wy51QNO3WjR#V;+G%LLjY=D4)l@onvJMf;m~dZC1hz>yflab z9^f9_dGr10?hgaU<5+d$OuCW#Ya0L#Bp4RR2|AsIz(4UL<1ayy-~PgU9{|?2GLHBz zB}qY5cdFY~JnIxS{K2(!rjglmmwRrcF6G>4u!7=GPpVN&&w@^`dIDWTscT|cNy%Gl z<r=!u`Swt+@QJr;sW!LyJ5_#9A+jtd>VK|l+`P5ihH{xOw7T@TH$3bS-Y0YK+SEF& zBg~;8&AK0b+zRB`+>F+E4NijVev$li_G)$AQcgP$iWK7iSBV%N=q&;~TtDS#3>00? zreb<-Ui4OJ>S_OtTK1}{P&~Aq)_M5xtEu2i8n^CE#<JJmmTU{^(@NL6m;Sk>GbdS9 z?cbi$qYKoB2iNBHrI-9-gZqUWzuUW;>=zEfi*<zj+Y9rMxX6zwu_6?7_~Sd@hB>eO z;JugbV6SZ}P!29B==36sV5o(yKJ8KZz0ea89UO7&L~q#qbvL%`z2N=j>Y!K|yF>Pw z>zGBqnqOLD?T-y*p;u)YRU@P5+d%+?b6`(7-(y291jJQ>h{goH`!a)BN|I|;W6*^s zbF~=<AjU!X8?nJ6w|_uzGj|bxDIC#|9BMU$u@c06X+w_#>4Z;S5m@g*=wXAfcm(Je z844i^4~MEpoBb@pDzrv(FhZlQ7USGU-Aqh5kYOJh?TwGuH;_%ZFuv`vU=g@j@W1GK zP<-C+qkLG}=zAa@m3NL<u^AUdF12E;)-&ecCRUnx-<;riIc|DXC3L-e@%N1K3483R zl(Jnd?dWXuY*|!@p?ZRt*c4~Uj`N&%`pQ_FS*Bx~p#>Bl0%fz$p>@~Fb4r=u_^CYz z9I)g`L+HU81I$9e=#e?J0LP0&&J=Hj0o;=Hl2BG6X<<A7uXOW7JU=0z=`)8hMF>5V zs*YR3PVGKug5g9i<KW4s@gaaiH{1I#K<H%XL}<b&AFanrid1Ws_=_1$BUMhoIk&gk zG#u~x)sJhBFGMdhJXv>bh(g6QAgI4-KBd9=Adga`ZdOGz@^d0#o+yDt42YlvHL50D zBr%IzDX6S0V3#Bh(TPQ1<a5yp0U;$JMwMJmu0!HZA}XcB5dh>|ba-GclvcP=9OUmd zioGH(9LN9>awdf##i^8)U)k2<QsMTaQ4d?9psWaYSHORP6^&8M;iurSes??os{V1m zsmByi!Gwf8eHZNzvApWkYf1@KqU7k~%ilhpmD>6bj}MfOQGOTBwJ3C=X0$o86;Aw3 zaNzE@PC)3sYw1ro^S3IfP)n=>zxx*7n4#Ck{kXIBl2PH0o6^g#;_D!e;W7IxZ^ZC_ zs#Y0<I){EW_`FhHCFD2eOMlLKY+{<&XT12yfrMMRc)UL@hLU$(a#i@hrTyx5yEMva zCei9OCu5e;2t?4Gr<*#`MA*v|e)S_`FSLuWYapNghN#iy>a<c8_3sT!GV56F{Hz8| z?cSLRN-T-<u{-^$@AbW`&{O8BkozIaZH(b_w`c;Bz+hh1!Zr9k)52LnA7k<dBD!B% zvlG=q$0~f88B5*x9oM^I$9yl@kLwLDyLZ{-oQsQnlnhbZM(zO&37PVVKbKm*=6)Sp zscmlOyIm{nBtH~`8`0JXe@r0^0jYmRUPlPf@<1UoMhd{-8~_p+!x0L@jt3dX!;qmO zct-G3`r>p<WAs2Zi1HVU%7Tp#h!~a;Bpw3}HUoZoPn$;k8cT#zD_D*JjM$ruD1$K} z!}4-bqBf69ByJ*u-CE3bCAHljypykg7<fOAXc|7xo^7ApGCfx$sD8{;hzkY4Bdwxl zK+CLhi<V^6uW2IM%*igoUY7d&_Gn_CT3(iUIxdz}U43lZJ)QKIBNs9<J$Gk&p3y~( z_!mFA*}g1r&FJK_Gui}9^caPUNr=+2QK_etEzg6|*=ZtfCcUff69|NPX5fX@GPH~n z$ib51IC+qX&nRQ;t8??(*M&@ho_rL#Q&_nw*o$=X^!U0}LrJf0?7p@?&iDCWY{dHC zW|<EeGmHZWIq=>=b1B~6^d85^i~dPr&ZWT$5%|~f@=Rvve?3xcu;^_wVf{0cb&%Xj zdjeJVN=04vcjs=tTO(UZMHfhoL5@m-fmc)*ocB{hOc+uYEJbCV!>fdw2xpawQxe7l z0-DRYh4z<?+k^=L$hZX1$11TEg|X<o338XT9*8W|2t_up6O2YH)!aqCeQq`jM&r>6 zq@N4{%jR^kt7v2~Y{hWUU*B9u{qnSBitUZs`f19uXp7y<RQ$EBeM#T2^)>=k@kQJ4 zfAAUoqY6=A2t&U_nx>d|1ICc%-*<MLn06s<z~kDsz-{)^RRnVt+o1J%DysaH`D?>N z53q1Jed1?}{qAIeedYrHm(}ah`OG`F1kwuZPAqa(Ja<w)M3J|c!82#=V<N~VM_f6b zL-#Mgk6zMH;Q!u|lLYKc;OS$CD|U1z8XIye)-tP}Hu<lO*`MyNj$&^srX4A{Hng{U zJ?h!y9Sj#*oSq!(+FSMBkQZ%?`0#%2^|DFp6BIPKsba?d;J-0*AoNJ|d@$y}Inl8@ zb~|pm`0NE>%FJX3k{BWKP=Yy=(Z$6)<b>sfMVNjE-v%B|UbciD_mW=rTZHbjsfT`~ zJB*D1+@9{mFN0z&MqIdE-bkqS=H!ZLlf0vmRVFqIhk?}tjKD)V42(!yMj@XVaz$_g zbigR&tm81a!pHGf1b|d15J2@$k@gg8#kSeG^4E$V3=}OB9tb3WiU*70fQf~1(BUO8 zz-tT<Jf;yU9!5ZFg-m2P&?O3_2qI|{x0$grKi>XfDSJY!n4eiN&_AVB(;@VJb>-*> z%Yhde^BWY15lrN>f>B`cFb2c8W{&OGG<mFzQ$x>j!P~$7+p$?w{*N=1k84SPXNeWL zzgD%(D538i`S3@pT=w{BvZa;HmI&C?utr(qMbAjriJ{1Spbf;LS%RI>wW0zcKJGk* zX{kMUn8pgSus}SyP??kgKshb*kg68ePF`&LEI)-jkNNU=)en8E?b?U2%(-P>8mu3O zoL3x_A76B{eO4_f_<ZdHQ3BZEB_aWYDMn(sgD(8eym`oY;WF<LEn2N#w+Q3Y(}HvI z>p5fR3i))`8P~9f4eD!~18*j#*sQu~II`Mj^w~TeEm1BUDs_o(fy#tkI)ouq3}OMs z=s7af$Y>C03A|h=^c}42flLaJ0}aN20l=VNLfptww|64HnL*M3s8nDu$x=6iVond( zdAy4Z5bm)<t`oRw`4hu^d~bf3)XbE|%R^P=N0T_8^5{d@tKlLmejU#S1}4fyk4f$g zd%onEt-r^a+d>y(w~yIR^OB>V&5XsSVF;nZ_OKjbO0ISLd<DF`lWUDPO%uiEsA<U1 zcRT4I?fB+X8r#Rg6}cVE?+32_%=O>%-zmJw&gOGJyi7H%C6O^|1EYuqgs7C|o2SHT zk~OUcAGwg3YMav%^qi)8$5Q$(lmDkkd3hh3K>_r5P--)ND>u!%aXvF+M*Q=Odj9Y6 z@*g$~cV2DWvQzv`C)2x|*SqIedj}5sJ_q{-^p~WZjg@)Kf)^wF*<uSiAF9;IA9)b{ zp>&qk$017Z!?DNn4Q$0bH>06y!V$AyBX0NtthAjINMFAg`9d%5Px&*wUd~Vz{MN~^ z+t2C{Ecf26a@6wUtV+Ahm;==Eo-M&RHquf~sWz{C5|nN)@rcuKC9nvbSX~a0*TzA5 zC&2=7LN|fZ^6nae$Q`RERbos4B<_E&0)k&$!3Yf>DFZS%+(?ShafyzKT1hmA0aer( zN=yhXMGr4vg5`tYMp$6${=mE`P$&b0ep!t~eZctL(yjuoXLLJA0}swUDP}*TITWA| zeY~dDMUrX+{Q`evWW~@xmw5M<c;8E<Y|$m-!l6CeLeclo|F$dXg#TfXEO~WQYQjus zQIpZyD#O;=Fi(R(b5AS51V=1Ek4keB{tjQd|7)Tpnt>Hv^DdYH-l%HE0U0;O@=8g- zivMoLwHAmEqooUhkfsD`BWy{%?HC&)+U!5DSYk<qJpG(^HHoqwu1iM-5DfFDD@DQQ zA<9ozYXo+Q%?o5u2g#rHIn0d#FpyY9=+{CW?UpTm>mDiq4LQg=>2s?9#cHhq&wju9 zSdj1A8DqlFo#Xi$v(=>NB_KR?<uKj!TL~y*5Jb8;35fxLCqaQj5MfjiLLTtj02O5U z5&%><p3y!6h7*A3v%b(voL@sgQjy{C2^dmlme?SKCdCNNoZ6x7x14>o98bZuM%mie z#DPs2iP&jso~%C01xrcG1Oi)CN9LKmIUWnURsH!k$Mwx$es>p&k9*mVbCL>kY@M=} zuJDO|fslE?H5>^u;q3|D>T&4gw(nXha{G(K&2-4J1q-Dfe+mFCebI9P<KdxarI2d8 zMC1J!zlYDm=I%;DU+h>KEhg%d62Q}@RAqx)aJyHc*?qq_o%bkAK2c+U&F8SaGQTQ? z=0CBr?1SNGz;%Juxirsm2loPTY@6Nd0S)D3w)YiS1IZfLL)AJbxv9~;8`2!<vHxx( z?$V>2?(S!d{bP(dtzvsBMO$RP9IoH!w_o0St(Ltg7G4_MuSZoqPfD)dq-VFfPn)nB zc2>r6r^nV%I99`6*IN+BAeKzZ4?f#8KNaHdiP9e<Xm=|wh^FHa*{b(__sSpF)aY+^ zOL?ix8ltqNywaaGfBg&3W1L=#5tibz3`T>ohvo(Yl%g5IW~?b(=4c3`3z+(wggF%k zSWFsWlr0F)7RB@Xe(VBwlwEVX7w!bNIDafCVGqK=vv-pK;)qahcEx?_F~UJALFmQG z0u=zXN#V5SR0U9{6dVQM`&zbSQj_H%hWBllHopgD3d7cy1x&4IyFcczbT&&G&ewZ# zreAiN%*PBbPB0AoFl_qXr<*NcfAVm(p(x<?Xd~pcSL~qYw|5owz$D+hm@x12Y0en6 z0K*1`TB)PnNc9_zCd2i1{9CYCL2$;d`M_=jVqz}c%y-X;iuv6#;@GJhL++QHhG?NA zGWgYyvGhtm`8F-LJ2&-g<yHFBuwTPr`zOj`$>a3rdwRj^Ke7C`?H9yA(tA48z9Yua z5antRBIt%02cV+a=|5GNmqJnoapf|DF2ufL5xF+C{GHs{olcyj6sw@glgL@Id@n-$ zit1Fu#~=qt%J6O&ETu$f{}#PSi2w!w5duhn@LVz|GPE@COyL!;Js!9lAg#94mYOWq z8g=VwHa%trqJ^LVKceMJrJ!PRY6X72ZL#Pkw>Q#o@<4L;2z*=k-ivjL-68aOkmgrR z9nEJO$q$u9G}*BN8h>YrShDA`e2$Um1)l;?{r60<myvREbSbhjzOrVP93)ERbZaUh zV*(mMukHM-B8pcHp4Vc6C|lb+?1bXz=XirAjZf}b-wWVdssBCLt1;a<@jjiKKbtl8 zwoPlz6Cxh;vfGv)YJa~V(YN@EW01zy=lu7XvlvBW@xZ|R#EQXxZ%7@#>Co1$LXNG{ zm>qWKVt;Y3zB<G|FiVx9Fqrw{rFFgSXPd>tEjiWW_uW(cb6dD;N5_84lD&L=k%NI? z%CNgaHvg#c%jy0B%aP&y%X8FNtJB%o-Dcm4|K!P{#FW;X@wM6Sf+QdHj$;lc>5nil zm6Bz%KMA&mc>5i#V6S)|y0>3HAq3XnSrz14!bj6z3(vsGP^mx3_UW(%=atZUewI@1 z#DdqTC@?XEGO(J4LsC-dFEGZ86k#soF+kFM6eb8dH4Fv@`8y#J^El8wB7M0e9AzBb z|6!O{!{T6oI4N|Oyht;(aWEPy$sRzACNo}bojMI&j0)4GGo$d{gk`FyHm!GQfv&;M zS_h7m2NLfO9%ibh{&2~~wXp<+JJo&ybQo)0eR{at&_#Cp*xzs1P86Hrf4V3na29j& zhoefry?KF850k6+R|MCm?l`>A=mm~=H9!|*lAQGRut@0E?<Htcs#F?@Gzbp{C~>bu z3&oWnu|hL2iog;L4b=Ek@{9E^--Hl8|2KktINp|HVwi-l3(>aK?Tn)T{@Baam{5Iy zd?4(ooCAVg9WU~unu4J-a}|!&*h;*;;nVyU03pB6Fd61XCM_~<Gx(s%(62FJsOc|| zhkzcJ;C8X15G1`-LPFm+Hx!Md?u5l4V&9AoHzs0gtSgxb`R-oGVlaplpdeD$KK30z zojn+W{<3&VhYLmSm&%W3EhbxD3*A4(kYx>ua3tA7k!43{sDpKrw3bywW!Ga=OgJi= zlqt#whGQ(?PYmL^$xCg5u}|2`wP&)~cl|p;*K>DZk)Ez+iNU^Y4l&`swIff}Kjc63 zBTWL-jF9z!28Qbhgy1zI4YjY!^y30;4*Yig-su;Ywx+Qw4%b&ZMTM;9oy$GMCSdd; zn)M$iG}ku|E1hil%tJM%$5&b3-UJof->)@(+LHY8^6meds9#Q8#u5Pr9VMj1AuJg4 zpTi4r0n8+g6*Xmb<)W2sVXL)li`Ej!+qDf<haGNTI*#>qZ^B-!k~qW)RO|f6gDQ@3 zUf^rC^h8zZd+r?x-4D~;Jf8Pa`aDwDTHrWhFyG@>^J^P>!i_^L!&D}?YhP=+-&n}s zPv%d>^56e)XotU?A1M026qf6&b5lF1Rr6+WHx`;H3uw-S=Zd{idR2}p^?DXqR?vkW zsZ2=4+M1Y1dLt%#4n{UBm@30zFFuyz2Qrj^LUlnxvbQ97v`7p}C3v0L-al!@;2`KS zFI2t7x6BL*j1<O`m{vOa9QSq-8Hrg>4IR@-1|>NUG=PaX@K7TR(v-EPVefj_LwhFG zYd~A0G7uer=Bwv&i`A6OPZynM^HwHUW|&xVI@G~#V8`81xcO+472#gNT@}CJ%eZLv z)3YMB-wEHC-^m}@KZ|$Q+etwIP9bcB)4evayzoDAKQ?D!+uGmy6OB+*f>YN&;058} zz#&~QqBkyMF{sR+gCRV$$?AD=Gx)6mpS6&jmA@J{tq9bySr3Aiw-kNWR)lU8A08!7 z__&d|O_FAPNfjpw;tboHvsG$qK4C)PuXh6o9WgzgygWA+W?ruSZ%;Z-BVu3nO%*c~ zQ>w6>qU`8Uw~-U9SD26&>TCS`J#W983Z!7awZ<$}5eb%*%H>r;5Z3|;0fbmOzoBaA z;WB%fS-If=B#4UF*i#WYJ8gWtqb>|;4}}ImItk$GM0UPUufn140N@j~C!YNDx02`` zmCaOKr<<IqQmAM=UXwA~-zECBzkfR)`MaGvBEx)6Ji?%2+QfFV$>y*&6lCstwM5== zT@(A*yCZZveqDn6<G9_=%Z7f89!t`2;sy?5kdX?R2$H>ZT}u*p+*G+a@!Lr)7gfpB zSu~^i6IaWVkJz_pNbhZInyK$8t<}XA^l&mg_H~c@bmIMfHrIegaS@Ggzdm%PN1ivp z%b=<9%Sq5qY&+lA|4g#|+q@Od9CLfwT;<{xyF=y)T&rf6RhGt!eqmLH8FLYkX{480 zeO2VHFYY_xbN=G~G`kh#bhkj=i=S>g(u;P{?h<w|LrrfV!@~0YWjVn?@ag;@`)=Gf z`|k7!o4gO~iQ%@ju$S1EAkV<6Wv`1e%apNb%{1s&;T0qF!b;({7WC4C-Td;rDCBq7 z-L)Wr<irJz8LsG60wKA=SWZL>zklFYD#y0REvSuzc1s5Yg0ND$Am-3cJSk3LB%C}^ zF3UIw06iE8Bz{j!2kuI5ix6JkbCCQj7MG*+E(ilhlwdWT4hK)X1Y`tukhBL##X*4U zzi<Ws3=&W=9_8Qw1&u&FKoGx}hXlcQ+A2n5^LIa$GT#;QlipeG2ap=m>IoMC_}0AE zgdUF-n|z;wEEIjV*DomfzYh!>L%!EoNaZ-C!vW|y?_`9n#z#36+Wenyk+L6q5hAWG zY{Ta>CKkKsdhf5OobmZG;uVkqQd8G)0*cZkrq*wto6|A7;J7@gYvJ7Fp@43sOxFJQ z!@n!gy^5w-39OCOqR_iBB$|6RE57;_Ty2LodK`S4%3pon5_(D&bQ}AEic3?`OBYSj z;}mW?;;}P_0{?@)VnX;4LQeWYo!>q8p{F>@bHB;r_1`ML%lwg1Vj8Gd*e5elw83zl zzpq?>ao=xsDcx6Yq$5DpVgTH-FE&4PmUeLk)EzDn-x**YP8kpxnTjA!gi6?GjZV57 zGZBt}B({p?IEH~)<r)V9-AD24Y2FCM!U2$YFiArKuxSAEyU~n5%a*NYwFt*#N`@KE zrP$C<i6-H}Z#uM+PR&&5PCw*D4laKmzDsS<!7_ERdKtV+6?|By_d806_1j!IBR_A> zRvL3SQnPI0ci9}U4CRbq$MEg4Y)8R1(lpkDCllQwCO|I}wGOSLn4BDAq*O)UIi{<U zhio);LWUHw7d&q#IQn8m%NWY<8ud@yDy%9_3sUFLf-g!xaddx5OgKet;Eru)`R^O> z@^wBD@Wb62l+Vo!+E9_O$G5pDM4J8#<x79hz#L}Gu>9LOvyP3TFVUOt=zQPH)2`$2 z$bs|X%uLWqVrb#d&#H2g^KF~IKUyzW`5*ZFFAwPjJyw&2uG+D)6gOPX(bbfT4r`Ot zY`U#yfA;=#N=cJv!ytC>61<DJ<`F!r5xO---08iaAI3Ta<{C4Hv64RvU@((bC4_2Q z&HMrC)Fo*DJ^FL?*{*AUmIJdlOBq~~7e=YTBl!iGS7WDK#*tc%g(DJ35RVjC5{J+Z zy8jqQ0`9t<5&&?3NN<UWAtDj$V6kMz$h8XG2x;|=*L6@b69#~C6cd10q@f2Uy^Rt) z@tf3`RfeuR6(AN4M$=-rH>%-`N1P5JAc!hJuQZfjvUKQ2YMtZZk1B_+gwegMpan?D zYaP@>i``38MSXq*jjield)04GHg@@D$M1RlMxG<C#kGSik1BW}8JN{i&<SSi&0E@? z8Z~>|rLPyd>zu_lTzqn9zdN*fIPi^`vv)%Z?ZWtxHdUf*C<~$O<shs3RYaPYQ{Ty! z6%%$9H=Ty^m$gP&b-pEX(LmcokSVO|tibTcx}Z$V5V_sSei}LxL){2wf(>yVmR(}1 zMs4#;SHcC$%RYVk<C)}fDisn6M8oDo7Gr3j<$`Ue(gf;0gh+D@OcY%8^6PO$bxi2u z`gmqPW|c>=X{G|Glf%6sB?kLFp2I0%GQ*BIC1fb<3|ifCtQiOev;r9`wlW8$BDwNl z>dLt2gwlx>!NTzn>A>K0>VHJ<*Xt6UDFuS*K3jAvLC3-9?rx<x_CHAx`Sq0bH?2T` znGm05j0Au#E(wSyf%83$)Cl6zU@KMeeN*1LdnrDwCMBe>`pYe`pfK03d^hLb;Hzpw z)#x2GbGb_~_fIG+VF^DM!h;YKM$v4K%}vA-t*28F_iGxaZPzz?#wwlWAi$e(?7Be9 zJ|YcYq0zqqlt&x>2$#+3?H-u}C6@J0%2(rx7Vm|5{=@G*_to!-(l5?x?luqiHV~wA zTkls?72e<fJ&o^_RF0GO71>>EL=-1b)=pS(_emP!|F;zIpK_B0I8<&X4&&3Ha(w&t z)A}{<7bQ3_B=3M=YTDM0Yh%xni{fUa%s|hy&VXFvWPmQ;&0@+r;>XP$CuZLVJ@2EA z``(MOR-bhm?2N|?zo(}Z=Rl0j?>+sY8eGkzeKa{#C^>kjq0>gK0gpRA1)jH?5B~1O zPxr9~?T(E?Bn}A8g#G8H)XLYH@9pGctHOG=jtRAf6;_=+w$kzfl`G>}QC~r>XVxWn zJP?i=ktFpd;fP>RAPxWmQSJu_1HoG&$N)r5)+r1i01`v-k6Ebz5TWc%IGR{%i+as| zrga`7l7RzMP86j^!=+_F=Tz62MdbDXG7`9W0&>71xR^9R^gV<X@DYrR2;(S0?%q57 z^KrBDzY%&`s8tkrI!D;s)*O89bNjf{m#=vH?&r(~6H${&*v{(@uD9)`x<RgQP|coC zYbKET>N{>H#-1NKF3$ZQGA-P0s_HjJI7!1ki|a7IZpw79R}7ebg>1{umEX$vFe<`S zf?Ew>#AFAHYd`_<@Elmqa>lOXGINx;81({MFA&9g@4=5_%QQXTt2(?bDmFXKfBWnP z0TaLM;&8Ub{ZX>ayF9MuaQ!!Gz;d6Y<w>SQe(L(`0ZgdtuVLBCQ-j|*LU5r+lE(X~ zcTeG<P;XV-121D@N{p5&T!aA2s4x;We-;$guMxyWEf!8ys-<Qbhpt@0DAkZ4lgkSO z1|p&ppITgyS9<JumJfkI+7Mj`J^+at0&h^D0WOh1z<>pB>_8V1U_Y2H#Rv>l1SH~> z1);g<1Zo$ksYa%ovi9KF22a~(e*E(B@-u^e1Dq>kl-X3ua%aTEzroJKt>vi7@YsFz zdDs;Dv8m&}Sm2Afi#<M>Sda+u8faum7(_UCf}X%LPt+NbRJ5_}-EvEr<+JBqrRQU( zoNP6C#4%!4n;1`K_;<j`HT((~udwWWxKc~6K)IL|+r$P$awVzJN!hI6h)p%^@uit( z>r;^FX!^u^Z~gH<f%KP$(XXDyIKyOKG||Bki1^E8PvmDQ&!qFo{3J*??mNr~QM>$Y zr78WBo8)DjOsY-dY=_yf-ZV+#G4Au{kn1~HO%_8$lCRkB-oocB!T;W3Y?UK`-(pNe z%nBqAEK@pwVu;aJ((5@C%}3Pw{2TMRMf9|v41I4xguISpWQT^`TF98^!}U81FiNfY z>~d$HbygSL>Ug!3RRypOWJtTI=Xm5yw`ZM@q=c0mi8D&#dpcnN^x`loh*WnAIb7+? zKn#F$roe*Zjsp#f6KQVQmf3wn00}<kr;$E+W(Goo89T)QU~y0|jExo2ok=PI25P}R zyrTv$lZPkLKJrWNelR%qwYRrdRLJaLpQdMNJzJ<dd0D$ch;39Aea_GDZ@x-6fK423 zZhhLnEdgtf*r7Rjan>^R#%x9MqW+6jLZ`afo@+uc`IHE6lHc{eaq9!QKDPR=!cCW7 z;e0x?1hOvV#e&AmMvfw<0lUM-AB@B?a)72(GylXfDp?Fo?2BtNIj>!7sCcJ?H@Qb^ zrMI3#%89alZ5KPv3nl%xXkrCDOxmZqfuMrI30k;#!-u-n3{KSLx-L=&bJ?|-NTxT< zC@;_cPYFaTbN)}~KW}?|d~6wx?gz({dj=fcKiUHVdD5Zp?AK$ksL;wF(uB&ygk@?; zjQQw+U}S1Idc;Xa1Y)qr0|X&;dn+|cD+BwyiD9^Fm9>EYBajiT*g6XEIjdQHbL{Y1 zd~!Gtik9GkBsCGOt<X^Kr7Xk6H7I{YEJ3o;921SXH4x92^vnAwWMbB~m5YS`N@Baz zR!>_-JEL`{fKsph@lloXQ|(jo3zy+@A@+(8+94-v4tn{>OahvIT;$<+37v`*h#6 zKY;?q#1|cRD<MQx<gFfOYdSoPN3=W~Rux=nX0B~wM-$BHBYUYFd^?Jis~LCKbWY-{ zxgRvOs(NuZriY!gTDH;1>}qE=E6of^-&9@-{P%(9QLq4clv{&_g9)pJKhUs@U>78P zk%{gSGYeNnYzrQ2HD-<~%5!Gx3GK2RQtA=Ej@rtjw1ax*y!VzbBICnut!hE^Lv^cm zIy;`T{WtcCV_*LG-zN(`mAoOaTy{{Dq(STio6j>_bWW7N&+nkV;IMiaiX9#mJpC4y z?YE{Va5q@%V9@5bo-|Q2mA+xMEV&#N-RpB0uHahDuun7l%b<sJMOEUfDg}ppoDKs4 zv|LW=!&?~*DjG9(JVdG-1BD486ht^*e~(q7Gtva%NDbQWyn?HpWJrJ@QtllY@PeB} z{I@wc;QOP?926KYPW(nFqfW5cIDcLzhHyMC6vr465ebP1he3p5QMm<1a-JP$x@`US zZ?_|YY?9mW2e+~fp03>u1z(sbz5ki+Tp*SvDdrAX(dBeuC0!W;y8r^D<{*4K9dyb} z#gnHg1T|6g=2`Jm=aj?A(JbCO&%)B?CMR?n5N>8I-5>-B2!Z4Q1gcRO*E&m_^sI2> zL$zP!=(_6%SSQ!!+odaWkn6=>U3puaHO2ZIYG!?W3UIEysO6X7Dq-@~Om#{hiAXP| zVGdJYw7;s>)DYzv4g2cQs*TuOe>`@s(q~C2@-bPmSB|-Hovh``d%X<6p*=22Uy%oB zt&p&x6XupNoG3gf7lP2maetTK<a#k7C}ZHYQA{3WoRiS!Zo5P<ntuicBs|B@EtTai zE2a&Ad$K0)-pk(3fj2TN6-Y<=&6sY?QDbPmqzMz}h+sv73@xTB0pCF2Zw;4~o<Nd` zF?)%_IcLm5hDP}-7QyC(m!*#LhL>Nlf=(ZDV|u=@qqI;2@o&-9DRcozudk~Vxw(<9 zWq1zj@1W}s$!9G>9@nWn?nJgd=2p)6XEojGpt7O1gRH@81j}@HdM^`|g1@FN!Y^b- zMZcqdi!s@c&bA>x^USPVn&a>AsjjZuC9~sZzcL8%^P-sPYQU66ieh}EW$~eh#jVGf z`5@eO_*2Z%PZuqaYtsZbJ)K>asYSk(h4Ue%L)G`8b-Z3OdpqW<9Mv)9v<!;uG|CS@ z5Nx2OT5pFJ(U(d8#|Xr}(S_du2cli!_39%^G#H~gFwvef$FummiA-sq3C^)>ZO6a- z^lbmlo>kB5HN~gh)Ez@#?~_SgvRc)}9mV(9b^HXoC2}QZl0!*Dj+lX(T5>5x-*q=@ z#zk@KLci6eFeZk>*f`4YAhqClFf25OtUsrKk5EJu3`{=OsTgSFKtV%>=I$@2k^<Gx z@L*DbVoT5nTx!|@J-9v5=Je4xCc%b6s#{nSRe=mn86FUoSXc=c2o}N3qoxMn_+#KM zd;Ok(F6w??vAvj+rdaLX{CyCXj0n<<Q1V|aSRfd*JVIw(v8z3muSNfOg?t+zV+6q9 z>GF~Z?Lu?b3s_Iq;fCHW8&R=-`(#!Bgl^j$o?LEpx?IY@+}m~|rW~m0uJ1?6x>h)V zZ;0W6WaRzl<R6rZI8(6-RgE$xISbA9ttZy&5;oS)P-A_ck#2mCBklyyXaHL|s&?nW zrB?AsC`RLhc_}+wl0(%i)udZh0u9e6?H9wU4u=#@`-`#D3mD~Ehm{r;Wb)~HyML9@ zt)&`80|BQNPH-r)`m{(=cpzCNW2CjQ+LEQPdI_UQ8J;|qIxG$j2dhJjaNOB@I`zRT znb>i`xbA@-c#T|m!f>cCgti9^VMlD3;sEem;=yKMOo_N&vS_sJzzL_fdkBH_PP|gu zYo`MF0=A6xMByKa0!u};+L{m5{A97>2lt;Zhe%xg)H=?KeG$<G-`%WtZc04k7E#M> zOzG+LzKIcXa2WVL&~fH&RyViMxM5_qP3fhDKKr3dw?&i7+WlA;Tg-T@2=k}QKJTpk ziqXYwufR>_vf*LnAQ1O6tEy)6RU;OD)#5Szq-8P5(IzK{E%)Q4vi{3|M_K;%^thdf zoyT1aRTIv!7GGYy>jziM%z;4jgkXL<^LcIz3d=X8R%tPrmG<X@Gs{6+#vOu}oI~8o zC;gtS90osqy*=A%DhDK<_lGq79;;q74IhV5{WofFP#mKzNr@*k3jhIm(>=Nc7?f7T zgUti^io>V3^xFtmrE15`vS#~z45dM%+gbJNJG#D&+;M7IG-?om7r+R!0pu`}#^#Ka zO5GWU&q<Y!2S6t1CRerszE)Pl1d9Y>5QwRD7T((<OVCJ(hqEfdAyAk|k?x8!Dy%>R ze%u_JqbnMKB1Ra4AW(=<zYV8S!3Ycv0De<Rg5a>`suYnL<*a0VR}qHb(k;n1es0oX zp0(bo-P@k6jyz~71gBpIr~T&l-?+DVnK<#inYS=Nn6Z8KUr`FWk6{!S_Zz*_a(xrx zmPm|S=a9CyzAk+0Xx&<erdM@)uI;l~b${u9o@q1I_T?#NXJu)bvJ*d_d+5CEwT|d3 zoef$lRJ=H4e0~53h1l}@mO;evDX*jz|LBIj)PW8D_o>>m2)l<t1R$nAi0{T$6#2=E zi!z2k=3a}k0^50tE*-EN0MsaV{d1ja)9p-jX81A@>;JNs%<{u$*%p=bJ(8Ww_NR0j z%N`}{zfrQLOu5wS7Px?dvPGB@yeu#0^-N^Rbc}(r785Q)=_w8&6fPB^3Z`8;TwPwe z3BC2?Q-I<5;gUe802|AT?^-Q7`9cI^Xfq3<>4LS1jj`g*QF!Pkd!lE<Lpen-xOli| zoIqr^7*^4G-*WV5@;5g}pL8;h-t*9yx;)tFXCc-LkZv;XorNC0Nq${a2n8;$*NI+U z%zM~4Tf`VBbuzZ11H-ifHPJ(dHL=cC{ci561a1~WCM)O`f1af||AHZ1>Nm`Zb}U&= zZC7|+)<`-9&C}sMCjG6d|I&I`<#c3WPgaz<NuNGZ%DHgH`Bt#y%l{ENoHpy5@H_pA zZHeiJqh)`2|M^k=3y%=rV#+AdRH7t@ZS(brL~XwLzpEozZ%v{hmBd}b1lWGy$ZTtL z+PH0L4}0{7s;aijI*aGUlgC?!=c$gzcKm!)?wZuxXbMMw)sjhTi{4e?;>w&Q<^*QX zy0OBMWN`v&yUz;|Mca#e$3y<A|9(irHMXylwV*)L+=2FTxvm{C_+yUr#1_g*XIgJs zQ6MaeF$IlFNs1l`YNUbxF`R0bPAV}Xo**z>7aR}=1_M@Tr6l6lTDrcg3Af6s4+@h& zBLJsa{*q;Z%j!N593!|(ZCErl6&wyB5%0>0WF5c(zeU3l#RE%skEurN4Qw3n{Ega5 zldE&cLk}T2`WIJ+xTduADXuzu-ozky)i2Ad{`V_}&vT|7_W`vx!)%K1onb*5jNQ<Z zKN7VYz=~Nmm*x5SM(IZ0wW`O<(b&=GEc<2)gO2COLBIE!GtJh5_CZh$0%tLhjteGA zP?Zr=BUOlJT?J>^Ypd4G`G<AtHwHpQ%Y9?^evhI%g4b&i*coo*$3Go<M+%D0@-Sd> zlP=uo0GkS|**cwsw0h1XK}X|G|8qmb`(*@2wT|oJ(ZyckX)WM&p^+97$G)|4avNrT z@L3H(i+~70PN)38mZKtoeepL824ccyfd?T_S+tBgVsWEH1qKA7TXo8d5Q3#9mzDX5 z8`EKrY-Z!|M!rvM>!Tg`VCjB9X9i%MGoApGHU=y#$~}%Y8PCy`F^rO6k*3QLNZurl z6r+=4r}Evxtcp4BTbkM;?GW>F*oV-!p>0$7$4{~3FXtAkFCjOp&Ma}fm*xAFW9Iar z-5R|-`fg>!{@8VfTHoXspa;@zRY$|a$jOVPKdanWSd5V!M`oB-C|5J`J<`<q?dWc< zxBD@lyN~JDD^he@p6l)VHJ5{@XVyFgvsHGA3m1MaK6}Fq%KtG+|F8Oz{LYhG=eRPz z!en1?EM<$ov{X3zO_+K4RoDAFb89m_)Sm%g>3;dTJs?@suePgY-R&J9?9wi)<XnrQ z@?3H>VMWMI+ip^|?R;8?C(j88m8H*J5BAeJeYVFfC-)nUB})?6#I@NWv1IJ-{Vdl4 zagWcjB~tB$$LS-g;ANNO3!-Mb+mt23#(Lef9B!$$RJN5?!7jex;$=aS6~9G*lh_sK zos$;*UQ8<`Lxq}{IQYH#Kn@OL83+o7;TZ>(xQlvpfmoM}8>7G=D7=%o2<NuX-H8ya zlY+yF$Ag3CVL`$QV^hM#dG|>T*|cy88UzW4+vnX1B>=#VTaGn>7GtkhCP&h@oZ9pZ zR#W5|2dzCFjh9pDdUkJbR+hZCM}%&>oQvDfOX&q~e(zzXVJ}?zS<92wi5a*Q4p{NB z7qMx)QF7BO<99u|e03vuww&DZa=EA3aj~C7b&pS0{90M=TfzI3ZeSi>Au@;!77Bjt z!8L2fj-h3+$avLrW9PefCW+Wk9H^ylL>|7k;YKc5{!^D_#XrxQV}ujgg+vowf%*f$ zqTkC=mF)l0ao3yF)4aQFw8-oe?&v_5-`lsb<%O^@*auOFYO52N5|_~~(ZNqXT+DiR zy9^$Sz2MSG5yq>P0vr$CAw#7aGj9W^&>HezZtM@pa8}+5-)e7;J^w>90)OdSo)7|b zSt1@`1QQd37ji)t4e#Nfi&HS4*p%Lu!KAj9Syyt4%mNu0M`X#c7l0K9tm-bb?6zmZ zMo%6QB(mr3u#-0TKr|WWj{rfLCW0#^`J65Ai6es%rheFUF7oX)-q^{%)w^EBRh`~Q zK0z{X4rXH%Q4%e0a=o7F4p-arao?K^p}M9|LzNqj?gI7_wQTi1=hhv(%Bada?)C1Z z+34w;$@F)-wNL*E-_yJ}b4#Ka&B%(-shHPuE7SaTS`zD6AXc=d%BPI&jbIC%0U?{y zPa-;E4u%G;UyM(>XBsrZYFz*68P5IM_!IfP_n>Y}ap~`gq2W!~%QI!$t)bsTli~9; zjsF6R?^+NaLnr6{z-BwfwM?by68M*dWI5etI|W$`cfd$kTI@0+lGv{2cY-Q}&<V6P zPBx}ex~EtEAi7RlY_vPKo*Tk!l@^`ebMaz`;n`mHT3yoeMkHP)m1BxXQ8a!+(P_2R z!8l?iE9AjB=n)X9U}V&ARv9cA2mnfB!bzH>LOso$xOtp|8!V>M7((^`h<eMgrsKE& zdm95rkM3?nnNrfDK|ner1f)Six*6Tl-6cq)(%m5lNK1p#U8DK$y6@lhyPoXfj$_BZ z$M!kT&-?v)sTBu#j5O)KX&N5A_?1oqm7B1T<DKEshFpMyZ2_dYP{H&BIA>_3rMnL$ zK>eAu6O;q!skyF0Q8HIvtXEpCq;^1HiS``3N}sqx+sN+XX;(8X;8?!%E|g#ii885u z&yx^&57@t4@tyv`u{l~W-QD(bzDd^Yo5;~Venml^@5ajTm0z6y8B@niQ9FCU?JUgN z%+BzqDfRx5iJ+OjDg4i>#K*0y=bCt<f^uygC#FJJm;Vmgf7$!rJjzS>tzJ*kevFNO z$+yEzZ5v@>CX7`aMN|d{`WEb1hj*zWPf@Ln`|czjv8SygXcg>RHjQP98Pz@_*htMx zZXRkx+ZJ9B@_g3l{pGSV|F4JwPX~}7c#^cMN~#ye!bTjX!PLXDgHbM(qW<YF48bA` zCnSt{1Hdhl+Q@ND1fjwi4x;t~7h-E=r0^*|4)olAZEga<dHSp?v`jPrEdt&giBGh} z$D4TK#KSN&!lDEeR64^*MWrl_@M74<iYWn(qPBn4>%m^cvwD1G%A{3Qt-XR0*C(gO zcRPdPck|8c?!N_KlHKLOMCJ^d7{e*Trm$Mc)@X0M*IftC*Dz}~<8uAa!)uJ5WwDF6 z#E>{hKiA`dN*j^V7-l%c9r>(X1S9iA-9GTyqDVTOuPK^UpO;wBGK%}|O{0Cyus=HR z%v3Vl-JB}g`CkqnbHJ<3u)P_oB}NkfZHFVr+R{4`3Z_EiIeqP!ZjHqTFX5h9-<IzS zG@ZUqUX4DR8+NR6Re9OPZ2v+YJ#k154R`q@kOfq80mwm=QG4syANA|~XhZLF5=`8= zv_9R}Ci@OI+HLM*%)cVIN?Fw<UK<m;$rLJf=6d`!&Uc-c{(3y%$zb(q_-8^x>7hH` zcraD3M#U-QJl0**M${q$NthBVNXJi!ncmYKm?EWC89)5W77MH=BS~6`i_m70W(1N# zVA3Gm#uFW8nI)kYk+1FzQA)y000T;-2uwff3&I74WHAI0feB3j_!xxA@<Sn9>1v;X z*8@@!ffVqeH!{1=cPvzfUW0MCd-R@b3ji_L#!iX-#P0W8bd7ycmjbbI68BaCrw?)V zACG_nxXhXkM1epUgN!VtnYEdMT1w6-q3WjI%Kgqmmc;cbHMvKP(Y&9Ta8Knhkmh2q zY%F%l=ck1r)j%rS!Qsi_SR&p0()Gr+_@{9>|0nKM!R{};`{nb_Ca>8Q4wMe(XtOe_ z@QO*>m}rR{pPwv~<3D9NiX&sKR)qUpzxg#7R~aE>v@4{vDpH7`k`(A^x;@_^X8e>C zeXT)FN=uXqg>WzfniSJYw4@}0^8zP;m;o!`1Iy}ND|^rJZFi9CvUsdHLXeU>kbyYn z2Me>wt8hxuZo||rn$&oGeQarm%;a~^gEEy9US$oJDXPp7#F!?^sU(Gn_d7=&H9j8j zh`Em+NF(2>ihSAe+fkIBVzAQU4%Z%<*W-6Rp>wal@cYw-FY1N$)SFZja2KkiJBKx8 zrbh@hgb`}50Dpe$EkbpxFY0cZr@k*x)W`MOVZN*+<~wtb^3U{T`*!Mb#M_^Gk+7?7 z{pml8kc6j{d1#k2B`2f7SQzKK2+o&qZLWF&w=zNnf$2-zX2@3ZStKpB>b6x&?B-$- z4mrLD@`XDN_1HL_>cTVbo1MSI*k4C)h5e7l8mr%XKl~%tp$|am816!o<}gN~i_{D2 zcMk<Uf@e*GfD{c~b=`*+X$RF9!7naLBC2us@A94=@2VfxJ#u}nQlg96LKBQSolSk% zRoRBV*3{AcJM|QghU<~_>;b6NaIpV&OG4tH>rwHPwhT1<2sot-EXElQxA25PX?H%b zF<BRGVg$8`q)(~jOJ6s0M1VYzKO8}A749NlNOMMYH3*5+E6J8~5&$tpq6~-;J0Kfp z<(Zo^$;^aWdEs<@od!B2@s%K37w%WYL(8@G0H42&BhvULC#~~g=`ruBnZSRy_dD-q zTP$_CPRT{8=9|rsPl1X2E5$ar1}B{7!Gn{ugM***0=8zZS|vJ`j*n;mIn%=FqV+&x zY{Mo%!+>)>)LYcacigYbuRI~_0fT`JAQY$9g6OQCZrC}CO(iO-smU-+^m23?|8&f% z`e71j?28J=&86wvg+%@P*Em?jS*Q`HUq~i16Z@V>lAKog2rnaBh+2%M5$r(hD6qt! z#n8TOl)7>*(C)#l7y=-6-B#9uO7Pq^K9%gyGnjzk8pRBWfKS1}_(gyTI5tKLL_et6 z1U8bG5&70-B7sP>R|EELB!N1!H$uQb!&s+cMsg8gks)s;F!nl*O~tnMh+rjM@G?#O zvacrKG;;8`n}!1Id3<-afefz2&bxUwN8Wr;<>WzNTA<xmzgzqJwUYkmH1afEFNz$c zatotHO6!t=SXOv>xWLx#`J$Doy%?%bJPa|D?&OZ%_t_a4FmK__`nI?z_wfrK`C@}m z%0ZHg#4SMLKYQt+C-<aCT9PU;blByWQn@XxGCnWnSDL{k4-U&bv-{2*svif>KZ#_0 z{*^uNZ)UZBIp@CWdDt>L7x8Y+K*ZLkk85v8UZnImc3~k{sV3l|ze2+A?#7De{p01h z*yALxKdnOVp85Be818A9i%GNkf-tY4H>*7M+F!gx6*o7jJy+S?#Xmh+1t5JKeUCGA zSC(3Z7k8jO_#Yh_45*pEOo!w3|8W;~wR?v}truMqg{pCub8;~;V>9()+al1_6O`2@ z!@1sZ5~HIl<3i;U6%cTcsWN~x1OkwZycPlpVxa&U=l~BDY{C-<RRrVwvQLa8lMFG5 z6a*ku$db_o?UJB-i=A)6`Wq@24Ve}vsjsx*a)XV)U$w&H6|mHjbm#ERUgbDS{CIy9 zu-`0b+<N=KZv6T#MOEDO>E%jeY(^Z)cxYJUiu#yzafDc=WmRO6oTe-#n~R?2cYSDs z5?4v|V!Wn`A%y7j24;LxI5BSmR{L_V=a~ZrFzJ1KG5fqjI-X;ptEmf^@G-nY1I}R@ zEiC3ZIPfPeP>cCLiRgAb776D0`8@r@!BltT#+^@R!F`yhTHs-2d^7#Neww4)H0W<3 z;qx&yQ_CNJEtA!oq!AGY*DG*|qhuV52cd$eoJP_nm+W}(4!O(|0yjqFA*UD$y2i)E zT5%F#UCR-Nbc2~WiCn1|i-blchZ5fr8CklL<EF0RiT)%Ol^?NAY&K|c8o>zB7}%oO z#E4DP58pH}m_5e3BbT^YJC%59^uL)prj8Av>_UXqtFQ2pVsH9ic>Q<@7rT|EjfxdM zlUkcW_dk|LHSIlk3|||%ewb<yQW<<j+W%oEt-e~5YwB?8qS*|&9B}*hD;q{-T19Vv z(7q{6!^>RzxKaZwp+A)SsV;oUoqspuX#K4J!$@%c`vf?b0Z1f#IpiR4Gv6_-iaGfJ z+cdSV$WhKxC$}&%qn(uJbTiuD8Rg7<-QaiDcU2ON>7$Fk+T{NAUz^gO6(N4h)~5G& zF9rsWG_!pxT2E$i$UD7u2_znOPz$1KGy3IBVOZ6C_9!NTYBmOp<fAQlS!7P6J*J=Z zG4J(f-cI*NGgMQi-YWNLUDf|$wjyn>R@lwg_iFUC!iS&CPA@BK7aI9qPb68gK9Th! zoD#}hRw&G*MuR&+Na~g^BvnaTSq9Wf)BtrWd_l1CYJ)7pzzeMgFmzVn3ye_Xka#ER z;BSkV3PitigyUJDOq|$PD<|rL3^I~L42n%kYXU)BY*2GjDU?T)ON#|v(iV{n3@TQ` z6m&y5U;Y69P=1!Ub#FxG`R=FGpqjXySCN<j=jX=(2Q>0>ntVq^ZC(H{Odjvj(r$1f z`F;B=`k=sPzrFjbuNU(qW63)RPz*1Pb>NiB<CMg0!TGiTJ<G`Bqq!NDYZpy!KTR%1 zF$h;M>(%0>h%QLA<MsUt^8NLdi(`93To30LE9w@43OyRW{orDb3$B`%`C78-A;s}P zP*PnFj(Yc-OEpGNBRUw004$7Wv`BNx>|u;ZfvuT>0G@X_6C#jaJTOC&47AIq91w|E z-j!WvOKcHCP%3mQNaZWC#DXA*7ZeH<KujY`CKG%Y{h)=hx?!48lQ901knDuB*p9J; zp@HrX)2|y#-yV#X&S&$LEjPOupe{;pI+8Xeo_MaujBl<_g(h$-s<OlTzuB-2F$4As zH&BtESbRdec_N$jO|-QcG2e%qqeY(gUjMqt1+>K@N%pR0G3R3T6{~%s?M~8v$y*(X z`5iMO53`kt@R2&b-U&*yKLr+t--_fIjF5J;it~<dQgya3(D>>6-(zc{8gIO4{4O4y z8&23_%fTXdAy5K47H##OE(qhY<;-#Z8MA3s=k}qaQ6#|UI8;{X#L^5kZrPEH3gnC| zq%D2=GIRTTBH%D%zozXh7De1UuJOBg3}@53cs;}LvL>t})j|9%p0%t~f$`@|!U((Q z7T&Y*yxwNbxTWu6q5%%CD0gp<B>Si~e8qXvt1&%AVmSm@JmdaU2rsX}8MSxcxj}>r zyJFO3<+aR6ZPrn6Vt$B8ijSODW{f&sJ_N+J?*3OEg&TuBxj-N=MhGmwRfjNsItTh5 zrVs>)WNcFW#=rn-aXHM04?+Gu6xR!qR0G-828D)&Xb>Vm5Nt#jWOnAv$^T=k{rQot zcAA~?;H>h_Ai3L9=XH@)=hY#-|HcFI@s=Eg_eHAE&f^?VV8gm>A{DT#+nBxr$uQ^S z&U3<5>8a5nu7MehA`?YdbMBVs1i62*36tpHco%^YU?$ApV_|f9%PT_H8`zz9RgF*I zpVqT@-oN`d_MKu}oyHHhe%#H(Sjm|GA|bQ9T!XX#%0-L21P^bE$3=sIWA!Mx0KLxx zJy5=7z;Z|y3nN60XvGEr2`N{QV(dbo%4_c1+Q+o;Hr}QwO%%@r)@9(og%2>zhXjFC zltU6inlmEh&JmM%uIar=8Ql&S-wv!%v_KmB;Oq%LYhGgWnQuNrz3iK90eG9>f!k@< z)9r`;&ijS9T;Z49U^kq}tuF5x8-rS@uTsv5?}lidB!jJ=%~R9*U)bKPMC*3kon1cD z74Ag73=M=A{Uy`U`PpvKI6qIBC;HvxXvODq-jelT8Cq(zMWd*7sNz+Qd)q%Rx=b0$ ztS2{QT%36Je_%{PX90!djxnF6kOX{ZVZ(Pp5PoHg678y>n2}lK#AdIt`ThOw^8LWw zS#uZ6t0m!@GnTlT_bbL}&%Wmz4wHp5==6R(5EtwJ=N)49;C-#R+IC-cY<zz)n0Fnk zI^G&}{yCYNi~k#01a#@;$j{3H{;`jlD*Mar!I*<d^5Tzun#Vr*c7yv4LJrMJ^+~53 z_Ln~UVU>jIpNG_AUzV{a+3ZkC#qJI372%spYURUc3Ja-h)8ENJE4Ag+BJ-8kfjH3Q zb$m&|b@F_MHo+g59Kbf8(7G5vpg~SwYp<80hbm8j>s<P^SI|z?J~vU!8RXq3<5F<G z7GxSAldr?P+s|Y_TK(ecQ>`Es|5QU{O9bm~!(PSWuiOp0@fQIXzjf)`xBotokoun% zxpSC*02D9P3IA1I=$|hB$D}1^PRFHYCBQ<BGhBP&Ku~1)-4b_#YAL;@?f{Mmp#eil z+nv%+wm`-YN1;y#$d0SC{@&rb@8_DO?nwN)rr%p%5>hU`y_)oKsT#kZRvOV6%7dc| zx_XjE(fG6!zGQ~mN-udodpFNcdLP+_e4Ywe|AMW)ahPum26wZZS`uI}0G6qi`tn*a z7*Kr4B8C<4+FKrG1tONqU$EwQg`QYgX0)q|K2dD0$uRdj=frLqyNrQJb3PTDSARy; zuVOTG4_S&Tc2b+`E{RaAhRxFL$3^4Ywe~@)#m`_F<LE+r>K_>BAL<VX%3B-H;d_C0 zX!tJvevx?{k*FdGDumc_zxDq5qt#|N<`vKTt|7k=4x`<xd~w>mV;T{cz5A_QUJ(%y zZrT^`55s!@&D%e7RQ`(BsN$?M!ZNb-P$SAKa;qo)-=nCkxBxq18&gI27_=<4tTtGl zQxtRdYC*gf^PuW(m_yM1d#m9K{2JsBy53VwcJZ?b>2M#<)3G^Y&-0YtnTo@@q|IH+ zcNj&X+XaJ+`dwGE`%hbUjseFvf&q7%NWc5Q(*>+AKPVX);sM$^KXjgR-74oSFFCE* zHa@MHn*rX6ihAu%x&-_{Zlv@oc`?Vyd%@*GaUoVAptHb!fR#3dI-yf~s6}+y!SnLM z5e$7vioy^Itq=-J)QFEsix>qz!zE0CC@7dnK`DX;;?;m?<&a1OgxCQ>bc{_L#9#<0 z@YwI&&&ef%0N4ooR2a2D@k)Sa2sqRoSq)~?o?uc|BMmA`fhxfnNjUr9Awy2?(b)2G z+H?I~$wV&C9M4@lUhD<Sx;@=?8=$;U|308@l8^5H1<ab24!&MsB1E?jW>ms|H^)AK z^>x-^w}_3sf`e>*SRKtGy}k_Y(L^Q7B;cKle;)N0PCDDuae^ta<BwdF@ZKxsnX?oY zaohWIDQ(z3`>QnOS6cLr4^O%mm$K1Z)fIt8qO5kPws*QB{wpZqh>1eITw;$D;ofR1 zD-Rw7;qk#Gj0LKJE=}?&Yo$Gd830-827n<w<4}|Z=a_1>-z1_8Y(gXrh{;c)gGDg` zK}^~<KfaFA^1&t{QMhJJKMgsDHTB#*^g+D7#nZKlAKPq*{`9eVv4uOldJE9|IgBUL z8Yyv%k_ilnZ3<1~^G=v@z9UmdclPp3FEz{iSiRQzP1=-n-b2(2xEgS}hB@AOb#>{` z&nY-CQsmZY-LP1&So71*bNIXE{`D^L_Bfry%v(Xg`rf79F}?oWxR`yq>Kh?mTGb*4 zZ0gvjf2CjK^Lqb#Y0%ltoY8a`YquA5m^O3i@8?&WnVGpvZIEK|M&OO%yl244*yMtM z{ekkQk1?@1-$hENlpH(!ERHoiJafeJ1gMXSOvf%;q|842=!_7oK9=y=UBG-B6Y$Ru z`Lq=-Hx&bwV{4*Gc#f>au2CbmHKDd|{c1Xi9Q=K8eCs0qXkdJOjnWrwKkmpoUSYDW zR(}nQy?d|i5P8^S!)Y9+bNBN%!PgAMgITdC?(G(RIZi^m>A<gz6oqd<zA@#0!rxfn znxMG=n7EWqHJm>cN9kLr;ZQ?}xfCKvfK25KFb*&nUW**%VV8seHDIy`4A53Snv9wp z!!z7mMKY3nRe?g4;h-O6f8Zl4LmKGV4nx`b1{ssZ1(hWD`?u9D=tT@sFa;o(0;b9u zjE`-}>LsK7oC<;K6+8_#oXU~({zT6s=7;hscM}9`p3~od@4W6SvP$UU{GB}`8XvDQ zYukR%@{U*D0l&;G+5RV4tr-&ZPrq}!dExZ}w%p%>4d?DPYoZrbr<kfnsI~LsMRVHK z9R&_MAKXvbH%N4?Ho8L>g`E`qQ$G7<LfTMQlfn8GM7t6&ELHyPw^pP$;jp>oSL)QH z-8RUU5SR!u(S;HYF{8u5OEFkR<06s)(;}^)aBTI0H%k;sK`dQ6`AR5V34#Ig3a88D zlkW3?mx$VIW-hHNHvvG`l8hTef+7pv76Wq|mU5r~T=$a8tiEqU5B>FUy7DulPv>Qg zqbhVNm@|I`s2ZE?%|Ujr{&1uOS6B)B-j+aqHGa63K3*KCJ8b9%nCIh#+N$cB#c<Tu zB*mI36)U0ZB4m3=H$)sa4aPej|0?MU$4J>w_}~Ga)zuVG(YEE;tE%Syp;XEI=l$u( zRb;WNe!u@^aaV(jfUN-DAa2$LZH?w^=idYMoq+%DqpV(cN(0ENYrbsE&%<Jqsv?4c z)A8EGF2zf=HfLo#Gt>34s{!Mu#8#h;+d7a}q5HZuG}G%ac00DDz!i_;%t_x@!&b;E zo_0^S<2CB>j(g`jyJHFDg1q3{#@O5HI%?~MKn$34RSC_}INRo|?<5b}*xlP=&CZAU zJ35~egYmYj9IKVKhQA~BEiZ{m!=F{ny3zh_S)CWoEyu^lhi21?6m)P`8_POFIVf>u zn0X1|ft1Sp*bJJ9GIr>1_zgcqFv4*;0_8%~IMYHyak^m?YB=UVC<G!%as3M>gUNuQ z2+3b3hvG3ngRF^y-!LJVaN!{3d?%b|&xs_tP+XvLf{TJT+5=E74fG1E;&&;dlEFA| zR6q+plnzkO4W(gNT0b228Gk^c7%kx_hJ<d%bzsf?UT<7O1EQ`nOM6cL_s&2Y4T-B! zWzwJIIVqCZv4q#|JZsoZ4V^poQIw;nvs4l{rZ<n@CH&6D1Xup-_dhQv=&`i`k0AWv zlx;fG<<t+c;X2P)W#B;wH3S<#?ps$En1WU2i$;jgSO^D*O{#ENOj`b$(j%9z07L?Y zdVm3-9+l~;0uT(~iR4_-9-wEDU9x0Y$ACES6;a2$3a5faE{rNf7Ajdfg=d+=KVxeo z&<r;;Z23q_R6hIDcbcw}<ZP$Xsx#Wyko4(Ot?|fN-`2ouQ$52)n#Do!i=8xyn+^g| zm@qI#jTay5fYwA{nI_|%ZR^nq%=Q<a+?3Ty$9%4k5z!0aYHNsNr|-kC?uzfj#tX|* zH7s<901MM?aLfBK)sK$H*`j_&)3fd?%f=n2SEyX>xQc<<GzNtx@%GXWl@$em+SACC ze8K;g1?3;}wlA(Ix}F)?o4TyQU@30(NXWScRT+0Yn^?Gh8mli~ZtjvpgW%`9mDdd( z2PdI<ZDbEr{6v2&#h-n=A`gEk32wfz<b4+9*m-}Y`aa;Xf+r8v(f7M9DqX~aVamZT zA_}tDK2w|isn-2B(DoGLUqzM<U5wibSIvIn?Q}Xm_T9up5zW5q&MA)V25R02EH?B$ z`tKr!&dungJKuXBTAlM%&iw$%flFv4Ta-v~wO%$y0w5DqARQcatU-Gg$ETMeN14rI zA_Pa=S1BP#2p~DINeM~>g8Bm!p^xNcObnrga1yTKvS8U*eZpWhAi5Nc*&N?nOTVeD z4F8NoUA;n=A@m)LH3-1daWPwWs2S_liL5UTxZdD3e*A0J`4}iqpAjn{DEBi+yHh*? zM#F9OeK-akUISDKizxi3<|_(Zqn@I>-UW7?j+|kRx808LIvRHPPLwXa6}%lOLoZ3y z&|6gmcqa$CnP|-x3Qy~6SFn`5V(9`eo8$xIn}L#PhUID&a0jXWC!LK$;EE~S?|7<5 zMWbIuE~&V6RpjJqjSVHuMhtUju<C)9U6@}d$d+PqdQE_C)HsLb#n@@}zo}R+>sK)2 z?|-yyt4kKfm)(cg$1ZfAamh^)Z>ug$&>FV>csVmjzk~|1JWURckJ7zPHOR*e_DQwJ zaPq~69ALiT&6}PjK-eLEWk0?=c@Ugi4cM*9YxBR{cyIjDfqk&Gpz({_mjYwEdXkrU zae`Y0$Q2Lwj)k{^@ZO_(|EJ%J72nwhZR|v?qtahnZDoxbgmtdZ@9a!n{`bB#&OKni z#v_x^Zm@dsk1x-93ng)(NbP)f%)8bfbZ;8}R6LZ~u$Kzn-w)h(6CZcFzC;cBJtY;G z``X7v?=mxsY{*KCT}N{**=y47CGIcI&UHH<cAArnABUI;95+{DY=Q;!ze?`{a9Jn# z?f1`7(^e<fzWV|F3f=Js&nL%#y`OpB_p5g`9gm0f?d?-b6}zX=KFhw_f4iN@OH^YQ zYmZuG>suxpGzLeU8s9_`zK_NRQFWEW2+2rfse!QS=N8{(u8k6?Z7?V)5Wy)7!>xk& z%$yO$Az2`g0;gaQ_OdwB|CEdf)w@HGOp(SiDU2`G9Qh>6(d%o;WEr9yeqe_{0X+zP z#Sscq=OjT>^b&@dvTkb=(gbdPHQUT)rcnNwFsl{M^Q!$-uk)&9l*`-iSVTlZ2>qiu zsXn(Aby9|@$EW8i?4Urc9<Dz?3PfYt^}u;}z{Q50alq;2GfX#Lfy@P8ioM(X7PR_4 zH7$%3D(UeoEX3DuWHRbi>J<*5kJ{>ZWq@8V8r&PsCk<ffDaNK`2|MY03xHtwcOco& zHkL{CpFI7>MZ|_gR1;7x7&uaSycR=QA+kjX78S3ZIn-^WQ2ALQ#Hx-GRy8C&K51St z7FmVuEw~v$)ta4Ur5fu(hhJ^l{8Zr6@U%1@aIJcGefs_LC&)fpa^@5yH5~uvB`k~8 zgK@iK2W|+irhWmG5btU<Za+CBU-h-~SRT|%+Wf+1aHKO=Rn6desA<OTE^yq5%yqHK zOjZy1$B5xZN2?P(yP+5TF4EpMb86|(aY>l#$m_p<vuRDGtcZQ>Mf+B^s~EE{GI~PU zf1J44J$Yr0Y!AzA-(5-b=4YrZEZI%nEW|dZI=*jdXk3c6<t$ye8aUH;t^dsb-SV40 zZJU!<lT(xD=~*;=)An>JeTLr-2^|IFgxp+>N6jyfw=^$m(o)6+1O(WJbtmNoK@Dm( z$-x9UqK^fgw}N@T#Hcj>)pBW`|Ixj<l?R8H9rMWTiAfw43L6;x8$}HLxrt>bNvYS1 z?Ql^EPj)KPU@YqCgHmJ1$Ar3$C@dY=SPro0K$G(U*<dKcCu*Q#G0Vv;A@Di_y(|n7 z6r~1`14Ek>iH2H>o{YKk-$d4PMX}5>;YHMzMKKn>Du)4>VoNY-0kOEj%7lEnT4h{Z zg(FcZm0Dxec5Ik);VWUM1EPnbzC*pM0gro{JP+&gbZy%xYV$=fLA|C)Lo*ui!PZuL z!n9G%=FD?+paxCCw;BZ?G`^lya_s!ZrOW(XjLuCXd?(C}Q%qYA0}pK^zXKI{Swcl= zZoO<xNn{xTp<3v03~fX{8eBm=D3O8CREED<>$Ef28nNCkvlQx~@j4NK;vDOPmW1EF zRs`^Y+IWW{sWz0#AHMLDQjWg*%}D$l_egG}M}7!zDFK(vbZB<V@`K4-Re595&5w+@ z@|2s(<<_&?+LgOCKlXq-LI2%3lw5s<a6oD=m0}k5fe%D%TTn6<8>7~^hm>BnZgXzK z6ZI+)y}9~V^SIOhQ%uMD{MvQ%dw;q0OV_$lJhRuX^TTG;$UKRFqtTBpAol9xFus$V zKONu6dJ8$1X`0v<UiKTi{hy7F`N{FeA=pVQEbJg3I8^a3Y$GNk>@~Oau|P}~zNnsC zct!t_xaAazVW0j#ZT`GAKhx8Zee!C<Hm(=jNedz8|GJ%LE{leL`C7TWvJdcHuUEQr z?C>?cSQ5+1Yj)g!V0UWBQB_r`c*6^nD(LQ7XnI~dQ|r9_mCuM7W8Ui5dSvG*vGLQ^ zW5C^IX>N<Vg=1agUaMBGGZ$9MyYnidzyfEA%2YlQ9#U}zTOd?YhwP1F`3HeXjxV{e zM1UubIbU%E2tfkSgBfCQ0l?tEVwObck=&B7NxZ{goQ#^J0)Ry!;7kON4Aq9n$dV{% z$yRBFa*>juX_o*%Wm<4K4Vl-3axUq-tTNKN$$_&&yc+a2OEr5}S9P;qhbP|jwyN2B zUps#IoSr4sba-1lg$n-izwtvpj41X(DQ3MgLlYJ4{-A9v`1x-Cd$#I*mU8@bQDqd{ z>OM6%#c{KiZ>^odPCYgDuYOKXXAg5GP+E5PrPlO|a^+C|;wTO+IDktl6rhagMF%2C zOoJ4-aGjUcPCHZlkIn#uFoniAEXchmOMt+wAQgv(>%<sEqSwAn$aGI)8<6^45arUE zBo4@20C|v+tMqn=ayS7>nUnV3#LRx`?||8I+RVy&|NgN^<0ZB6P5tWqea0PoL~qnS z=GYb_G9F3F2DYV7Fu=sx_7?p^{(`UuOVya}@gyUy<Eh7>UG+8-szMIuRtLRuoH92Q zU^ig*_?#o*x6#M;YLa&2WG%iv>n&>H9OkI8GYN3iXmv4Ls<<HkNT-ebzYD=EdjpJ< z2U9WCmC9813OYq@rB>1D-m?8si>w6VfrjN@vtqLqh=Xf<_pK>j5dxzQ=acC;<3Bv1 zIn9}y=bQGt1_uN@onANd3*TG!_f^~74iA_2$J^JBB^pm7!+-hjXywjYvI~CRnUFSO z3e5gjrGln_{`0MKF4cOY#P`#MIKTDPr{(Qj-^;ydM_TS4f~xigx~Rqmw?bDm+kASB z&bQ5t9ZF))Z3%EDKh`EQd4Gk(g48CcJbP4vx*@zRQXstg2qtK`B?3T1#0qD`YSBDQ zV(|YA2x@uuOl|s!-wuEa*DBYD;V6@3`X7q89X6h}b_EO|+06t*8Qhq5oXBGmQp#;# zDy_lCV=(xC<%)c|8A%E5_%YZRrheqEn{)H4E?oC6EzkF6BNWH+u=DcI;Nu2Q>@qj7 zvNC(?6yEw{AmFZO`)U7J!sC?6%=P0F!&2$+0Jnf?xe&h6!gBja_4&5}Sl@&J)@&}n z9%eEZ9z;D*AAya46m(F>_ex@-Q(1tDnJBa<-(oRBpDG}0J}!V|?~m}cUz#4YB$7n% zE(IbCI4lTkilM=x(7mLeE}xz-%DhFkE2nAOhsw#SI4A&_P5MSF>-!EWKWA3{sEpO6 z*O~R2`jx59MY`X9IQjSBYRihwdu>kqa(<9*19CDGKhV`A+lT`6SstY;0Lm2a9v)4} zpN$Hs>P8+L_6HzQtNEva{^j2$-bC3S7%<*pVQQRx%F0p~bGyCHNIG|6ADF^;U`(AO zm~rE^7O>x*5-9vU=v798Tz<KJJR*8KD*E45pS&-39KiQ9?^ajU>l`kX`S$JSOr<>@ zXZUV;mdbs;hzUiczM9>lw{U%M)y@5q7`^{hvz=p`D`QK6bfbRgrynl&f4h$)r#`b& zZ%0?<`rnP^wRzphr|IPRU*xX(e(+YCOpg`HoG_3<`<&_in&#WKO^>TGC5CG-idcLn zcz<Ok;obiD^;q;qUiImszPI;qx6Z<r+%Mcc1_UEl`g#m;dA(=C#|a^S#~6xMjldwM zeYM1<M<K&Zq-Bb)sBMmq$G`v~DmVEMiVNaE@i8R^bEwW`(xtA26gC1<9RSi0!om%A z9cWaPKBbsiU_Kn(fvMYsg0oaesf0#nJu)@YDQd!CTukhbc-_mq8rvFlSgur?yG?uh zClF!y<!@BQsHvrIi(-?_=P<vRigkStp^HDuV`%)mb>ZrlfR3Nmu{-%|y*W2N&T#ZF zG+ZTI+OXXELK3-JvS_OM(x_0BfdxxJJ6SCd5aX%<gOer8vjTZ#SQ#(?YS+f9;Icdy zC|e|~&8LVBWC;NP(GVh&PezgwlJTT(TSSxi3aLhk6MKode^TqA{ZydLa2i(6!2DIt zzc5DRQYa#3I+S9zUvFzLCKr5#{DR7CCAgqUnBvz9cb}NdSYRNOt&>RQJGZQjRv?;* zQBP9cf+2qs#=R#w3a5E_+;M+f5iXs_ZY_{ch*3xzr-2)O=jPV*a(LV0Eoz)RxXw_Y z>WQ53=M2BIPd;3*b`fnbrLdA(%IMW>@esX@>$qMoiW~V)ALH|Vz!?4GVZaPMC}97M zeg5fmOPmI;MKjSuu5H!?yPSY57g|`saaaMqfc+r7_tUS1a}l0)@6*^hk5&tFWp;~K z^cFQe{zk!QpFQTU_bPfDjlH&z9sIXbC|s1PL?Gn^w^Mod@W(P%7X)x*=V#Z8Z{{#p zmlD<0BzlRbI^)Mt%%@h=O2h|cCEV+_6%caQ1BqkczVS<;s^L(dHPJgv=$ejkrj}Xd zOf?e8VZ}wr$|`bTH<e^}1EkbR&=fS{CBt?|0YE5l$@|6qTiN`HL#Gvm4U8!jM7{yM z$AN*9lSzS>_Z|e+lFm<n<wN*mD(m$rZFkE+qzoZ&2p@5UOb{3xlHkA@A|t6Dh)w-h zTIHE4=WN>SLqX=t51$ctukV@`53?+_UeaY_lG+8EJl7y9Kf@m4rExv5Cpz>+Iw`D_ z5!B33YP!|EcB){Vr67w4RBzWx0oE^B6LO&Oae!yk&>6HDhM?$B*DgYU!g(1QE*t|& z$Wi|-aeZMqC*a_H6eVDX77Cat*N<4FK*227rAbIw&=@#hGa%%EYzSClei8{K!kR%A z(-9zM0%G*!<y!u;ILTnb7nmr@T(7|F8HB^e+WnEjN~>b!Eql^{COxT6Qg7wKk4Ota z`UAh6j-<}Z=D2{ZNZxJQsmIz&fKhIFBM`?LPRPLl2l{<ut<^no?+&<L7R+t+edsCK z-~SVGobMP&IAAu9=wG>A<I-q9zOR#id%X0WU&7t@2bEbs{d}wYgv<fo*sqVG#F_yU zT>{U?*~W%WN$HHP|L-rcG>6v3kAq^(^*lA3f`DYMr9*eOS7c^ozO*)hd;i2~Zjjnw z@Gx-r>+shxC35`gwoiV?do#bjXbKcfN4<wp!swhoR7)(2c<xHv+|u8lTpM4fpc0~@ zHGy+it@h6hrpTnbYw-&y8&fJzOq-X|wE%eMgX3FMR^lgpn*<NPJpAv+tlmpI&TOAx zW$A3WLCo!hjGtGRfKgGLKORcyjN@MxiRlg~zj*}(0>=I+9_1^N!T=y3Jf)DONt5&& zOp*-(hnv74I746x&UA;lnm!dK{}(G@$dgh8H4CAjTD*CX6b2#@1hs|agW+=645kH8 zLI|Z1t|pU7NJ+hH1EfeJ@7YRZ*>|DmhN)4`s;+=|1lKnx8Uw(V;&~CFp=`PIbp2ck zUWH*;d54VgzJ7V7Y@_8P$utBnCa6qJZAOcgkP#L24O_(VwfO<3P-Y8}$&f+-5fKtX zXUk3W#}+aOCqRh8@~>?}NSibUltp0@7)<Dj;t*iXj|GOC=dLLVQmtXV5ziRb_hM#V zitobxhwJ2e=DB&eadJ}2E$}62c<kp{!wNmJV(^#a{a&fWWl7wMOGh`P_R%}*Ss|{N zj;XcPUzsid!49edce~aAdVhF2!%lAOb5!#4D2-ffuh>SA&C5)zskTRVofDicKn z%E=AbdDJXrOHISH@bdJW&oceKzI0xfEs(=ocPaX6mF6FhYMj*nmcu^ZKlNJ60n#d7 z2?aU^+S$e#!ZBme`U2M{zyuMjg|{PZ8TOWM<qns!)Y}EB9#S59uwr6W3}OfPk?qL+ zOG$34Bu&+J|LYzJWWB1W@74HY38uJrwHSOc)Dq7{+H~jcv$a@kBiklNyVjeFt;2TC z9AD4-$vcVDsYVGD+Vrbq`^nYgGxC}jW~1&|;_rHO2vx57YS~KaJQAY+Qcy14&AvQa zLO|g7O|owQ5M4az#vzBM3?R7>JEa9kq{WCJfk63|;Dk_x6)*nP=fsMqM%TtHXv)}% z5Ws{ABBE(VDIV~Z42uy64a81>y$OZrb%BMUXV~ai(;(CqEKw-<$nt$<eKO$(QdC=$ zfiet4%nhhOacK6eNlDe;ME+(ZljhdaT|sXCA>gXm!49E{GVlQC^?on`Yn6<Y!Qr4F zfDwox@GS*}27jgl=;Y`j6{>QbSMt<<Im;4LCSkCn34{9zo(Cx;z}OAtP*l(Km<uqG z6NO|N_ELOKvnePs7*B&JX~_g1GttLvQXu<d^_|0^k<Ujyhs<v)#?L+2-EIPT7dvlH zRUZaQk2(Wzn7c?a&@y8fe3Nqk7<%0kz4!&o`hSc32EXI@Zuj?3)f{&;%pK0za0bFA z_Tp1}TT($mvD+lbTrv0K=9`S1t84I1HL}i5hyCOe@1Ku@E{$GJL~e3fERVORMX~Mw zVdV&&JxQ=<170Xi)rz}v$C33^r|d`VN9jo8KbP7x+kBX*?G)zd{y3HMwZ!GzjCw5V zMx|=R_UYF4)4a)w(+X}8N3hD^EY<5~=Q4@Q-bNn7eSZ|o(0^xrtD88xr?eLLbLJPI zGKUz0<F{C1jcF=dZdIbU%SjRsy8i1G<8=2PsM4G2`&M@^za}kD-m&J$Q2E9qJBz|t zs#N_J=ZVWf7c*NEPA6%K_(V}4Svf`|^x!Qiy}1IZ+%W5U4w?2#1dte|p#!4<Gk1!K z*<2=r*_a<26M&=$a0H-?+No5s071gY0DwbLs-$=Z^mIsT#i&ZCENf6*7*UwaYte4r zBxz`ctqcOu3)GR31sqAeNX48bGN0Cf((dWIk-EkH`NV;m_-f_wmaJvnOgIbjK@d4S zZ7xI<wNzkMHXq8ioTLnZeu$951A&!^{DD{!;ir~y1`0dNbqY}sW;BF@00OamON~#I z3P8gv9vucN!O&vmDAm+8LFPg~1OL`?3pVvqdj|DVH4ccDMy(Bfp+2-G!JJ#Ax#ID^ zULo$hEr|2KiIkUcenIc?7k_#EeMd(1ERk3nr3wmoI8CS5le*S3g=6P?T;Gc_E?t(` z?e8bpiHuKu2{@OsQ=#H#YN-xJ+Q0o?x9oFu?N{3PdAxm>+`=utW$sIh(4zIUvZhEK zAK8F9+jO4$$IYFo<Dvhh=ykdWft~EN<9+d!pN~Zf@e#D@G+WhugG>Dqe>N-29bQnT zd6av7(!TtS#!!6TZ@;$F9j`v?ZlJABtct*0chk~;V@djF?~KQLpYxjv3ID&%v8sM2 zxyT&Hm4K+hN$>>bKp-1%YhN;|U`&9i<+1ikn)$O8%C>QR9~~EPwTp9&T2tQZc0P^% z>wPxnT9LuO&$oBip}`+IYT~sdJeMP1XaE3q<qxFrg5o2IfFwW?$)LB|<!|_zSR_GM z#DzieT;_a|7_UGffrtdB3CYAq94p`hs1S=y3W|~}lN3WTz!CAqP%x(&Cjg2r$)t!C z1p-(?5;Q{6Ik^}Vfn_5~^&bp-gU$f?lJ)07;2$sqDI<8Dgxj3860FsRODOv?e}!U+ zMpj*hq(CEzf&#r<t)QF)Lo%gI@Q%6<j+ZXYNXGP2Mv)P0f}zGFgFzXz@D%m)>95ZK z%XO|wK4W}xpfj8W0Cp{{<k~p_Q^e#i)39Vr=2+H(nQ37#5!_izO9uAhfy`8|QN9MY zZrqIAwdyZ*?&hcfgf7oA@AJItzB~WTBvs#y+|6yobk)dFIc1z2brvL_fNv9<27}`n z*NmooCq^5d?{?Mo%6{vr|K(Yzg;Pt$mn770_i{xM$4ZTE1re6bY_@2F*9VtxGxMkF z!qqd^x8;(JLgSmUv}`ens!^&v2K~ubDLGX|s%@xa?*HFjYqqe;#!sEG=HtU6-dxJU zQ^M>rsE`f*@oUygc!yEWaUD-JH*=i*%ldqY;GCma!0GK``0{#*=}E3Y#xJEwyR_=` ze+$ER7*zo$zx&fxuOH><guHIhknK-xc^M`mKrGTBxNboKTk+pX&|%rK!b+M$BhL19 zZ|Uh!-rZ1*|6an=8M5O>!gqVu)cM<o<UdP%7`W2L%UKC=A2}=?Qdto3y&7ghvTk7} zq$w<>-)!Rp#Vi<^Ab|3CL==_ln?eW$DGU<`+$s!YqXMR5F>rQZJ{IG`WTD9<6GnnS zhd3tOAk@Vk3p1Em5gm_^qd1z0l%<z>)TAC%9Z|;hnTr~fpiodoruCyI!rTM~Rd<p$ z#Z%yi&V-i><JNxzGkN!oypvMzE#v@eb5JyXd4OVTmw|v<OEOT#vWN@~23!z0i6sP@ zD6<SuC%R;BL4%*Y{l>cVZ@IBcK@I%uQ?v;K08LRi2F9Lqfq;jLaA$}-&&Y_G%_sBx zm9V@xpkF(jOFfQtv|_#$hR@o>Y>*fJ?31UTcoad$@rv=?eYp7f^)D<2)QD;uX=#Pa zDuWC7CM$)4P~elOqMbCHOjDy+DOXQx8G_ZO-^O1$&+7MfyY(R`s8AF0necMP%H71x zIr5__ZJpjh=as&Ahu;U`T%T6{U$L6%SwWnKjSXz_^q)}A!~f^e6FPGlW&fO2eMN<) z`2n*5HtOg9+)1o<p98BRMhMtvy<_Pn>hMx{;q&iV)akSyXRg{<UqJZ#d&w?WtCfkO z8Y*8i_ZAw%r*(qrwyV*s<JN#X7y4#oaGb;Fz{L7dds5X+gcqMXKx$VOk7FcPRe4aX zmfoa4Ty^bHV&5#_m#+AOD$4TWYj50&dFL0G$s$J^CQEPTAsv)~3+C>2IZGZ60g!&n zO~Hotcj*T~FyKV-04yL33<6<MDs*ARe?rb!{AOTA9WYe*z{Mab8HHp3nsS#95rC6K zV~rL!9)OOfCmX>6&zK~XtT;m5K%h}DA$H!uU)z1jz>qx+YA9q>i+7o@CD4*~bUSo| zU*=!-mVxcc;wa{S`VgcS#6>v!v}nPk2$OBKxbow<C=d#7A|Q!U@dK?~H|bD>OxMYa zyQE4W!wq{)>zmhDa8%a}of(VSv{t4OK`4ikw6G#a|5{=s)mIAMW|vq_Z;>_Ix7lR8 z5}m@6qa59Fu-AXvigWB^{n#JpzY~qp4;I+-0ja0sw}@3|(ZVfalU;1l4UG;|OOsfA zSFamRevA8G=%8#$y19Pmf4X+Pp?lb~?4T%R&sWr!gTIcm#XQdLo5y%d;}Oy1t&J}_ ziG;HqvPIpTU5Y-m{obklTy*pM!T(~|{qKKoxPE@-?^8*`hz%L0IPd!Lfg4spU+B88 zzrUNr9_IgARIkVLSS$-E{>|(7Xkl(u)OUT?NZ-|nUFYT0&Q=WWudLyZMyab_TN~eb zI&b^T*d?A8P_XB&S?r;%Zy)sJdrie1h>{9t{S}6dC<rneh7le1U+4nHjV~8g?^Z5r z{PztU4LimE?pg~N%yFWKganicZG2MD;jX28$~wVBjg&fJ!pgS<VKhvv5DXw46v6-q ziU)z$d+<P#MP6M15Luh1;``%wYd;}!4CtazNx(0pOa+hvU5n8i3iygm3Wr4?5b;1l z(sEBsAU2bUU=|00NleNW(Y3~>sQ_StimgErWVNka8AKox1obEojjJkLw@XG&@_DoF z1sNew5~wXBS%u4qZKqCxBPq*|$mb%AV!)b35XLJ=X()Jn*-$8C0i$@06L_e0qKE7O zteyQf4ZJ}H1jsI#fEhI~CgEKHmdr2^#;{Z^EcjjeRN`nCw+l+o@jWJ45l8pO*UXXu zBHNKSl$<}Qm696t(OC5P)a=|g{`@_AmiN?E<9{$ou+o_m_&P$}Ooc6ZO%K=T*wSkj zIA=#+YuR%8;T^t>bIC?{4Z*7K<5}Fwd}otda?H(=;aB&)G`CObgo6!@?r$BkQSke! zq{CSZ25w|QfnKAixV_c+>F}<#&da_1hEH~h;=cD~J>#g;#AhM|>gB%1^%ZefwBJYJ z#TY`EZG4Dno!TPBB%e+47C=oKfAhyo&iC`FBox%n(C=_&KfJa5Q*NeWm9U<>&_C9X zd{jjlhKBFGHhu0^y>{gZ=&~NPjlG`G2Aw|Q2-Nj<RMuzm^2_~zMJBLe-~cFq1Oo0- z*E>9pPyKn<V^4dF68AN^{x|(Iul@)*+h%rjI?tCavb~@$q}-g}^;unNZ4g?lmVPHo zt~~TyulD_HuitsyTxM91J~;GEB;>W2k~Wbo0vN~=!xsUiJ<9KONykhVn^TLW%kBT7 z#Xif3V_855f-LoUP|1Q>bYGV<7n@9DPuhAa6zHq_M882V3JRnS0<M6QNH`$iF<C*S zcxW)=(nS7q@U(QH^{cDRZ?(IgG;Z2j%q0af4vVB(3GxU`{5ijxr7fGoxf$DyF57Zk z^!+G5(+dg=9L^|PNs_)Uu0jSbC=|ZFj4eUxlsO6U4&@+(@xnFgBPIY8dI^S#EDq7A zFbfvgR^s*iR>B*ZkPKP=5!}%uHI5)6MqV5;IdmfpD3b!w%uFygTY5P4H`H=Xj;i<7 z4xDc7$RRhSJ!Y}3IrxZb<neSf=~Hx7&X0)q#IEY!Z7e_P>W<g?qljEj8F_algYFYl zA7Z6UEF~-R%L@#u2b136&?D$LKI()uBJ%K)^4f?b{EzC>R$IJnI$to!XVy|yB=3+v z)DpNQasJAi_de+Uj?7t|7Yek9t1bjvQ>aeKeDA+pHk+ZdFD)gK`zvoHPyUDs2s<YO zP%nQ2!o#W1PMB?2Mk5ag1is__x}hLqj=;uZe8x(&UuU1?h!S-_&WFy`wBOtwJsvUD zpC@Gv>YaD5d~j@bRuUKMZF931t6Y8m@bEMm@R-8mzw<K>b<F%U`ezrSS0G_XPe(l# zg9Ufxs@OPk%@QuWDBDfQcnCGVKKbgh{a8WYaaJ`)K#+=xc-Dx!I?R6FtgR?YIM%N8 zrtRGBn7Mq2DrW%cAt}6H*L@OA-5&vR>)1NMUl*mbXbn*ip(R2YfL&Oq`mm|u)&Q6{ z5vtJ5K`|=3)QrZUrOrn2$pF9rf{-gSO5#d`fqhj2Fd#Mzpw{?aHooz_3L!quZ^;#J z#;+f!xMhf$7+#gj%Cg|-HpK+$CtzTjqA9~M3=y~rfC_Um$>vdW*}}rAP<2}ch^Cgd z92}@s4kASWu?YpWBA5W!iTycJPkkaB08=;&0gxpIV0)A*_t1iI<pA-M_itHsy1;M@ z1RpTDms1e{A$+AFM~QGEK$UWH*YPwuCeuyu(gVTcmYh^^=3nitm{VC@cmvgLfAbxx zrLk`f8a~iGkc;218K0D(2&!c6h<6|e3$&aY1gfun%YIIJaBHgvGYd&s9|Q6j_68uQ z_iGG|-h1EOw%~mED#)x_v{zQ)mp>@y^LR0gIsP$cCHLcx7x)!u`{8bm-1!JLIh8&V z8~r`sE-S&$)wifJ!(R>{3g<WUBq<IDT^rft{!Ukv)(e-6fRl0+mXpYmmnB-QF1_W< z`N)<<zPhs7{`-)p+Tqt{LEfK5iqdhy7e8OQPG<2mZawV@c3icNi{4P@J@nQ19?&$@ z##);F;Jp~am)hz#JVDr?^E6We=tqW=AF~JF`fd~uKP^v1*NENpM(2hH&t2&ti~LOR za07G9*dI&h-y|{G(iYgfj;wYMw~H)t{~>XZq7^MXO=mGyfc&kQvYx2MtOf1Ku}7eT z@_*8}b}6nL<h-D8bncN%gslgVDmLC_xuQAZJqyVSS!6-@BDEW-NKB_&-C{Q|k|L1M z71_3M7Bp94a0nDtvR*Daey;xpo`@v{i1$QxR*0}Cd3*+J<ecUq5DXwe=nH1Rq&co+ zNQ_eu8Ic7akPHd{GMV7&S)j4RI|Wl~1W}Ko_yQ(;nXT-|<Zt`}87&inUX`Y1EndE_ zWP1<6Sz96f{RExIxt(i`9Ty3j5#{~sC5JZyq%lP4KzSQA8bDze!3RD4R=Vwqt_t*V z!=9;{wuj$~y2gH+Zv^2fx$??1YFcDad!HY5?Jh@4b?2pLzeo-bWA<*lO{=8MEBJ`P zcEjpZ_kQ$3eitv@{_kKhc*lR%S(X`=qLB%N&X$m+Fzz9K&%A<&=eqUgD^OD}tvIOW ziJjh7v|P+yK1<`_;x=F-QmfE5x8l`LO~`559_zjAyfOB>Yh4w)N>TOSIj3K0@xY<} zEX9Z2xG{{2ov+aP%;EFPpEi2Wlg@gRM4xspcu|-t`Ei<nJrU!v9b$NXX98gKp{Jga zU%ma}qGv$fW~s9E(P^PBCxY}%86~Z3nneYx7L=bGnjBIl2U0^H&JT1*g`lCB4kh`l zlglwI3UB}}0~~m7oPY)oy1*d{HZV&hqJZ|5F%{T;7-EzSakz>=;0g{tvfl$)unR=; zvnYCe2-J_+=z^3z<j<3f7bSQipDb90B)Z>`V4>}XB!#Gd`c7`c29>0wz?T6qfxBo} z(z}J$7}gOYNs}=S%5PnM;yq{NPc_(@rP8a0I4-*Dal-(#zsCL~Wo?EZi9OgE-=2gY z$?K}?+_4YZXV&Z9MSuJ(qA!Uh1}a3K!oK;?m%FaA#;%KEYt)Ec?uDlD9BrEHQlBqn zzMLudUj}}QjlG$@f0X~F@@0O$tGIu{tX@Axtu*#~SW+Zi2s2w)z_q8(#iZ;1eUt3B zyxC8`?R=*Aasd?xZ3f#iGLkZlT7Au0nZsEuW!LPE@Ilq%wyP0q<lcIBeQ<RxZ7lm{ z*4$>1YDZmXYt|336=CG)zhJAUV8{FQsqK!lW_IxlC*ha9b$`v8=3YeOxqSFT$Lvkf zYV!;?T=(jYi1<}U<TA2uP&{DuO7EwGpWmxLI-!EmQ`_z@xHIfyWakbK2}<nbQ?r(k z(&n51p)lOhKq>HRKy-wpx|$K;k9YtE;QtYIo`G;hZMz<0Fhm)>1!MFQQ9}rZjNV1> zoghlI=%bI`TSV`ji0HkAAbJqJ22m2dpZU&tzxVvvzvkDhz1Moy{oK!e4cmcYcr$4U z+znvTf~~{sg^A1oJj6}+waU1V1d#kcv0up;!7i69*AvSwZOcJz^1$l`j~C|xP=zvh z80YI|e?gdwE)akV-Wb2;&15D%o;plFUEW#`lo4mp1epQMnDN~cc*BY766^*c#c%+j zbU%R&FOZ-;=${zT-jS*oQE4f9k}OHnW;$glkB-q$;P2c>{oaSDfIj!6J2y#>M;vsD zTT6WQ2pqU(EzY^@V_Mig?N~kWG6fFAbPTgm+v9W<TJYjYt$o<qE;Z@$v0le|_5uGi z+upcZ+#Uy`P;m8A_RGMX{><w+S8lPYG;6)|OgWp#sahh-2D+Ex+g5n8ca~y>g+#^w zl>n|KmrZ?-S&@O)v;OirN-sDBtiNy!`z?Fv1ko7FFi<4~S0^y|xqogFYw`OlOEd8- zJb?Yh2*Kc{PzjsYT=e|1X^EfT>0Qh2#YNy5!`(`{<n0;`!^%y6AsZS?GM5#@uVWvH zjq0vjQBvs<VQ@a}yy+m1i<e`I&vl$&s7cTMGW~DzboyB0*6L@jy)EsgewJp`IZO*V z1&S~?L!{U%s{=6bXbQsD*hA34^F=71pD`3kplo-`q|8y7LbeGhCJv_K(Vebm55j5~ zH<nFU(l8D%Qjd`&D33iKcy0SYC*Q2%b=RBA=&m$N@OQ-sR>Y}Y7M#TSItAH$|9(jb z(rqe&g}Tybe%KubFyUgZ^KTLaG+_O9sTYYsB*cg*5&m`o2Dq7-0pF%AEu+KyU38NZ z&;-5Cmribiv1}#bzbSv~mJ08O7~XGY9r~O8kLV|mCS)&+NVS|3oYrXLynlEf*vj{w z%tCAO!p67TfxPzOYX7utHSlzV$kdw_huk~P)50D|9xa|XgiZpk_rEwRuRdIGk6JSG zXCL5nuw!9}`Z*OkxK)NvJtz8*-;gDjEA#*F?1AN7JDstCkJ|^?6R$D#mr^@gE8n)} zSA}chvuvv_8WKfRTF36$ef+8xo9J=>uczms)t#&Idh71$U*3n!QvtSg|CY~PTybAj zCC+jm*HU-U>_u;{zYn*nuRb{X*d*=rla=Y-+<MZyAU*rJzux&HzVVY&tQ&dS?ZI?b zVYWu=O0BAJvg!RqX0F8Lh5)6kZhGZwGKSq&J_D}^Dr}LgSN0JuI%Vtyu!^7Hyst@& zEGbb2P!3M4W_&X$v!dxSt93%PAaLQz+x{Ob7-nmP_q91d5SErRU1amU^8_j(C}HJU zRe9SK+1>EGu{c$N3n^B(Qw3|kuQMy$=f^)xFbM{fnHU?Yg@Jh==+sJl!q$Qb0pY{s zfrDOb7Z8B6i#jq3gOQJ$xD2C^Z`2$_2ftACtP6J<CGdON!clJiOO~Hmj+M5~wK0dA z>bqs~&BO}^F^Ryt`IYd0!<I^C>66L{2GJVj<!P*9HZQVcZHpz#;^Mq>Jy}kA89Ti& z)JzWpb|apjf2&KLA1UiDP`j`AFfiQmBkRqtU%NjXj~%;%IxClZdPS54*q9v1_0Ip? zj@h_7zIy9$w|x1I!T;fZYU2MCKjII)IA1aD9?qTer}#w6X6%PW)g0_JB0ThMUgs3W zE?7A))Q0otluTNk_AiXx8+SYm{?c7t^xynvn3cR)IJV#eM;*?!)Bc;?rms8gOTR?> zkJ%(e+O8Lf#Q*&rQp;HwY)5O2W3#Gm_=k4;D)ecU5{)Zc9`Uhb8d&O$lY$O2@i`ff zn}O507rBAPf%~`5A5V%Yqh&ui&Ir<kdoIO&?;*jHl{yQe|HEXD;uB0TmtO;TX-R3L z#{d9cczHoQ&7Y)z*ls~UGcxGL*Y0<{j}nq?yzoI3FAcL4zZ3}aNV_w)IsP6Cjt6B9 z`g>G?*#la~#$<*TK_FV{8$Y^m0Sb4P4M_N%1x7aj+|(u(NNoiShGx6>$QO<Vp^z{$ z8^9-Qe(EY3Gi=c%q<kc(@0n)QjO?`RM|L5{&m^x%-^#!IIAhzy5it}O-*wVCgbsA@ zrC;gB{Zn&k(z`=OuW3M*d>{X3*|yGF-;?d^(ZJ!@fAsuESGvUaHlAPF?<%TW4ebf! z<?%5!@i9m<x<MEq3_mE^pCKUy@(V_fqKbjzsm8wLr_Gogj(99ojf_;C{pfOt|K<BU zML%<Pwpw#~3Y_q=Yw5VZh1JwXHpln)rmNvn)Yw4<w1cG_!rZ_@M2V0~bej3#5PWQO zVd}H}FU#4qZ|*H3EPeuDN-CruVf5V8XRYcmbDM`h#Af~bb-#;%%hC^HZd;KG&ED=- zla)Q1(^`78BY4%maS<?K-}vzK>Wm%ZM0z%b#{Q(L%%K=tlvfjvl8h3Jr7<V8DN7kd zsd9p~t>pL9%;ElOE;c%1b9ryej7`b+`*(-edvTYp>SV#>cFrc_xxR-dVd-6+Et9wX zL-hAE$(0R+UrB)B1!1_3?-c8z7o!E-@~}zr$rh!Q{l6978Zs2J9gE+#{rG#_;eIq$ zsIZY{)JkGWljy6_DC9n8M$%#<wUM;J3xB4Jz(>(bXyU80FbHwNFx0JE72wKq#3@zQ z{DUma5Rx506!KxR{E-m^BQd{%BL*|NSA1Du>=33EUC|*b<S#d8r*|0I2|)Z-I!r-X z2&RS*02>~|cgILL!64qDp2p&}U{HyyV+Uels3WNnp;R50C+i(85BRaD3Mpbi*(k3$ ztR*P~D2fsI*AtDfMRwysWo1BIT0w?PgJnI<pwXKLtvq2qV)lv^!sk(076_}EmE=Ud zWX2ccsoDdMq4>$cOt@qP;40`8fTcv9+fgfq2Ahx1{+aPU^PcSZt6djkl~zdMQ{rgB zRH+|V7Q&;KKX_^-PP_L4&lYZV!Ad-58sI3^Ku7`hp4M-<U$sHhX5??N_5R2i;rrRS zzC%wT@IBn8uLK+}ihN|L`ef~H(Fl-B7BkgZBwHqRAd(0uc>xWvsfh5!X?Y<orB;{1 z8}*j8K8sD9Pux}9@^SLq<ko5WzpsQhcRj$Q@}p5voK~{VqE>|)DB`zZ$zafI5||H( z%}(n=9=9q+^A4Yg=yGUt@8J$6lg@gNCXh4~jy#vH;<DAH>FN^5xu5%K61bi!j1HU2 zv^`$+dylXl74x9-;18<DgCWc`bX86izsVrRkbW7ex%$-0mtoWKD;*cKs{yCKoav3k zmv}7Mj%z84YYUsag;n_HKC@p$4*(V7;E?z=Vtf%hFbXdUMS}@Y2N4r9lVo72v*@JB z^CBbzun7~F7V;VX+(pVD(L;VHc_xk!0J0$XZ)qQ%ofQ-~aUvI(Mubogm7O^B*D2#< z1QIjI2O9M;z@{#bT0+Q<Dfj$s0Y_*0Fy2I7+<Nmk^(geHpiq$pE<&9I(qVXCNo7H* ze_OcCdF2g3Z94tfxo3UPt;D}LEch4a{9=3#%;0@-q$YWqPgIRAi3n$)RLBJ6QxsWE z@LMEF83vX-F<C@Z6Zxv2ao0od_gdoxhXjlJ=HUqCw^i+j%=^111OH^btWQ6@s1u9! zuKF0Tqg>WTk{096VRdr9SbK3A)2K8>e0`l7a7*~#Mf>Cftp}`d&*E?fDfSt0Oxwto zMOOE}WE8T};|eCO9#Irh5}h$M6cy<nzgYQW*M8E-Mn`Yx#0q|r0e+Vjwdd*m<@RFo zsyEfS!}H-RHvZMWzirkX(^*0v-M%5(Z$2siWQhUAQmD9C^$!%Q5-fd73|!ZGTyK;! zZI609xK=XtKAdv$PEF#mt$914B@`T0wey<0#Ihgto0#SbybAq*n5804g$c@P4yphx z$O~zhp8VcX*JKZfVR&|b9&yZklV@O>k6c;6S&yhqD6Tle7`UPHnT{VLLF6%Tbl}3Z zbjmh{9<nxkiIO+Qt-n(tHTzX!av{s1l8X6fouzOTRS~nYeK&SEoOm*XoCc17Gh>t1 zmr)4`H<=ZNvu&i1hnURKX?v9ISnheMt~UC(-vh_K{^Wl=v&_nUJn>h1RoAE}ug*u7 zxR0VqdufRs1QQGalp(>~;I{5x<SX+7x+W`Kg6BA=WL#{M$Lbq?8s<KsRG$QRf>h8p zQ?u(2UNrS?{=R+k&u=={I|XRpib7QUQki(Dvs~{sM(X@^-!>Y&1K2eh1Y#^DlOVk+ z)aAx4f3w?k!z#2#GD-We>!B`=iX4>DQ^opCmOj}Jb_++xKbmUQh%TF6OMx>tL%Vwi zTRNG7xDR=p{I;{u3w88Q@+5L7;HHmFm9U()m^P7=x*LGstsYvAQOT<kVl!TEq}aGh z_q2^@NJmxT@3+XV+q(lw*4gd8!YD`nrzM{?pN>)D-2QeC!drofUSXT8F$t=pP*G*a z)sk3=a2N*70u|P3L6ve*bC^rkMu~i$SSi@)cqzYmQ<dZjw-uWMj>6!skkXPk@xB^P z*oXs1HF<S6VajT0vabZ{1K^TtO<fEaP|X6OJ1^oypnEh)kkgGT7c?USA2%dpmY14B z=Piu5-kz)<pa<c=;0}@>Xcsf9j_R(%%j!wUjDCOgNnfHq*uM34r)kdjUp~%H$;WkH z$?N>FXCa^`GdNYeo}h8eH-K00rf{700vI>aq1({ym6zqivX|$|Qn`&B$3JTW<0(NH zg~1OgEFXgOFb|t|-rm;lGT)13juS;^hDok`SKX??85eS7ZU5s)^G<cL|0em}`F{^c zi<hZjB$v#z#vZ4Q)VnikMn=7<msll(4vi@<lOV*w+vA!m2e#P(oejDsUG0S*L5dtZ zqgz_t<-OH0<8jkHM~=5$H;21j4?AMH0UJ4L;_U%}l!TwbdZS#0Tl}_kG~IGX3)=Fz z{)lOHw+yz0!tZ;T)~&mLFrS-b`ybw>n}~M#ig5HO8Sh<fpUZrbAraE>$D}}o2^L9J zVgt)yNt`GU0+7sE`8fj|&Z~zzT7?7>qpDD$mv?sOL_UEWRbDw51JyVR<ieBLrvShK zj;SVGJMc?k*@hbOgue6C@SH-u{be2*`PJmX?UZkzpo|Whax;#}?(b5Oe|bEiautXV z0JVlKs567Vp}@Xb2m+dbI#4hwCC>s@9~H#MOE}mI4qd8akY*uCyXoDYIX0qiaXH4l zeWNCR^;hmV;6thaywcSvMR|(5B0MwWl{%(2k{<;jOXS7jNxiygyk8AG7;LJI-EG8( zpD@L#(h;h7=}uTKf?FQixT%ymu{dQWs7NXEN!dn0JGM$+u7ic&EcvE6ycskGCOrFX z-?q{;Yu|{GH*0@C;Qp!s;KVJ+LN0@?8j0`535}PfF=xUp$neJ3w)<4SVDDADs(-Xl z7-I3c$!^CjN<7_WOUz)%r=E(3&SCB=A=|HA9ux1~wE-_r)xeweH)>8SL)<#Ik(knO zZ7FV&aJgQ2nD%I62GpoN4Ir6we%#u2d$JQ^>isaNo7;6Y9!nQbU)mu`qZSOA1=HlO z&C<l>Ye@S!S95Z?>{^Ae5I7Q~Y_VEf+xVNx+z;tKdg0v@<p9r;->_g^b$H%NieiB) zt|FJO6#})i*CIFr3c$!bFMb7Pta6fq4K~@(%j-$z6HE5Qld*gR5)~A*2uWqE0ILUF z-h!~}F`mS98)Se6yY*0?2lbwl(E3yvIC;H&7$~K`KQQ(4;gVzEMQM$au)=Uu@Y^b? z$j76}=n0r0uXve8gMQXrONw|sTyyzSQf4SohL9IAjfzW$v@&zPp*-!s@OjI&`KI(m zCR6zf4|8O7v5CH@@XJ3b1NP~<*#}hg`oC<w&CGsX#-hW;u#q~I=aeh5s&d6N9@LC1 zC>KuX_taw1luTF0>7pVTIxUN5Ml_O(-w4}$3OAdGMi%@;&lyAG-i`7ej}ft{Z0h_x zDvfPp#nJ8jHx-+X9*`QAQxgxczwYy@rT20HmD~CgrF%ImuZez}LL}6s8T=qAWUAl% zJL~kqV1LWY-+gmB-tkpn`9t<`#~n^>r$zcvtULsUr9u2J#}X-9Cly1pp(5o<+7LVp z{Xn4uiMEdO0(Rs02A)4YWZjS&lXC&_VC<_re{qks??8aRYJ6BIV%%U!LYdg(g9Qfd z{LtKq>{F`1yBXG2EJ-Oq-X#VqV*zZ$j6h%kQ+hx!R*k;?stvPejz9<Vs$%Scb)6sc zHi;<_YLZ{BqtQ`v<;mVSyzI?9Z<1kSd7ge+bwwQ}bLVdI>kH)#Zze#^_(mCPznq_$ zw12q2bw2LK>`QfWX0OZ7z|xso1m!aED1BZyc6PkLQ7XfYM!ND{<kO$sglt>!rM~|v zK4sH4A}jn|+`o+L&{w8%)*cgHIeYWnGJ^!ERBR9oXz68tRqvG+_WDiXKa!MK&=mEp z0k3GM-=CS0^ZT7@t_WRcGVPaP%ncBntiEr1?k3l;kAAOTE@zrN&eodxJ)EPbC|WMo zeZSI+y%3!}D1nnsQ0D=6keHf^$)O@V6M`WoM0wnxzA0+6O=2&L!$~4Zzn#E`u1?cD zN(GuAwkRuhJgqmD#D(E&9r02fgJlJH2yB444ohUh1f<>C4ycFa`w!Y4jloijNbC;% zM#jWNiUixJgD??@3RD#thBb6$5gQrAz|*BI1wtTQaaJR-CHYlManax|48Z2NN*z$W zoq;2Ow@L0L5E%SfGgMlL{p{jW3s6O-@Uqi+fhQ;*|7N{1f0AhDlpUiV55Y?ulE<7_ zkdy>ODbm1AAY?Qc@Jv`T|CJ|Loxcd8O<=}?O^P-cdV4Wg74XIKagvZ!r1`46YJcx( zdGaLpzSlNKPoHuAx7ZRGSoK$XPyCnr1f4bChD%fcr_{ZO1;ZC55y_#Z)$$x)+sESQ zHY`p2@g03Oj{=WsZI-h3apH<s3aZsLE53gI@2I)UUg1kozNw+?<6ii~(m{5rsW`+X ztMkc^`JE)nuv&)}U{F10s>!x$%<xnYlJ;(~J{$L&RYz;&rk+qQ`E=D=vm)l4XCt!S zDQxkpZJzHjkBydpbp{k|cvAdYwvy*KpHh8E#A<9hTJ4p!TRJcxDROs+wrftzolL7O zU7m$pmougXk)Z>z!fGwQq||xf6KY`I#)Jkv)iX^mos-M;|D7DTds!2B-J)CKvS>`L z+p71$A*PHKv8XjEyrrDxF(N<fIL?|sNXx{i!<%1!E?v>0RCUO!E(Lq?T3k`~ZSgNV zx@Y^WGyCRXsRJs4C-5T2lrz=MY<Ue1B$dXB1L$nXb1NT=K&EhngBfD-@bDPcne>5q z6`X?4qnQ&S08J?8ugf_uIBo?(8loM{pQo;4fh4a20dD$KP_Q6pTR_?VZJHpMuTs_y zY8{JV0YIWMnTX}#_!J#4sVqWfQkvOmv@sAcqLffLD(cmb*CPMOl2l9TUl2%j1XWOp zU=piEQJGT>LWwO@An#7za=UfQsBE6Cs9ewN=3LJgUOL&x(=cneF@|H%&Vthw?aA$6 z7MMlN6pq<Nq-)hcQ~$QReOh#iV9uDsYny&6_ajT8U6T@;=+8jPxZR<z;kG|M85pW$ z_h^Ku|J2A@Q{r=7kRPcx)bUpog%)L-XNb3bnd%hyVo?18fPQpssSY2$kP3m2rc+5_ zy%5sI4wJQ@LYQMfM;Zsam5rI%a11Lumb3p2p1+n9V=q}L`5rv8_-e1lK+dD^qZ-9* z&t=VO^GWe;Zddd5nRun-y`3{NFW@?Z`bdF-7`L8~r9k$>_F_G`G@j~u|GMeb!k8`n z%H46`Jy+n#P4ugIJ(I<Xj{fixnbeH&sX-sQyGg4*K`Z+PEoCT7J?4aUc!5PEfnHCP z{0TCI1c(VrKxRm3gqe$=*;9@HcxEaS?l&$cMj#n;Xdc84ImPg{^Y!szCj;h$*U(`^ zz=_u2txS77zmw%0!zVU%3jp3jzRAP!@kBfr39YDbPYwoOA#qie6QM{F6bB>(R~ZnZ zzbaOlhg|D$fdNQ~1?nTy3MnJQwROY$?*Ceuko|T~*hWf&y@N|8>=_BU=z1q52rrK% zzMe;<r#x&;Ushcn8U%ynxnoGQ8Y_n7nJ<)6?J@1C8vCS)NxVIRo!jeAaVTp#TXj`v zL;M!b)AsLO+0<ISaq`P53r8qFy|2xE^>1y#WXMYVb+Gs5fe)c6?RiUL&U(#!XMLqN zzcNHWz;*k>trJ>b`F|qINF%O~xj}L8M>D$gP%NlMcEz+=Xw|+^R__~NVjP`EomG;h zeyP6M?S7BNhVxSsk8Ar4pHo(N!ge;oQJhfN^LgN2n6BxE>g&1azTAiY<R2?PkMVwR zjXHE~Ftd4>Wq^4Fv1388p`ZX6JG_T)3ayv9w_Cz184t^~U3a|$(E@ZIA9Rw>xoVR& z-?(O*7o0nO%@}Zp#O^?*U0^*uq!Y!zfkvTVDq>-MC}Sf~ZY%O72}Un|r$Q=0eY|oJ zC`ld&hV(?0Ra_ARqd@+qIE(-gdjQqFdOWms8z-!JLoEsg(7Z?9YLk;i=6zWGhYd!p z&?y2sE`I{#_b56}L&dxr5J0rA?Y#qU&@eA8Rq3ZPVkG;>`jtHXd23&WhvGpn5FaTb z?C|}*T?FMz8DDzS@*LgSu%+*C&W5Z}0n02*gjp%5Ne$=TGkV7_j0PP-2xV+y_)fB$ zqJ*2+c54_+o{ts$#L`5((S0Ic=t?6!!Hbg~qTS?b?{+x9Kf)h@Z0&L6lQYg(6Du&5 z%Jo<{NpcGm(IGiQ$_d!7f(-t5Yn6#VCjq1v@F&`u*nKIYHlLcAi((=NzU9^;4l|o; zbsD4Q(mSqRZq_+GT*^?bX*o*T@>lpI$Ns&SW$$Dwvzh9c;n2^k^x@(0Uz=&bT8`;m zc?A8_f(qr16E@$kPJV>pkZvG3KVF3;<_DQ?^B##r#|POakH6D9z0PTC58Hk2?O%w7 z`SF_0SPMC)i1P69aJ&qYLk%MIY9fsQrRtTbb};okRuO26!1OBK5XxmY>Z`O_!M9PU zc^VZK84A>|2qISp;6l0)cx4+DItTz+WCmH@<zv<Ta>Pjx3LYwn1tfzaq_tuzykJ55 zhuObYy85qGB^Wg=Cg^(mo18wc_@LzB2z4749RN3RZ}Yi`9wUO8aKC^#Q5lNi2pMnF zHxnqYfLJVkH@2T7qjTD?On>tx;E0Ln@s5q&+XeR}oPMgCcV3!0N2o#;gI2xi4Topt z&9~<AZ}cb2%L{JK=wXMut+KDF{6^tL5#43LFMC!byK)}J_z_NT-RgYad+%MnPnw?W zyi_5r2tMGqq|w(O{xhMdwrOvn`{_33UDn<IZjKZ#Nx0pqBf4uwR<a)j&tDBvS6Ysc zaG*G6MX}@R!78ZXyoj@!tsAG~k)xQYlJ&?8o<zGMD(;2RkIaiJ7d=i*4Hs?BPw#ph zy3R9)jvtD1TMmx;+l|fjHPsl;2_m|o6bZ7VKzz+)K|80XCL>ehL*d^q?`P`cmjeGN zt+xHUEAD$D-1Q5OAmX$nQ;_^Kenpujn8KsNY_Jzz^+J|QX*^FI6pRVM&~_25N(G|4 zIPF+tfg~idf}^bVfXE~yej=O2Y#9_Nm5MsSfYo!JY)-y|_O7zQfE|~*nn?6v7Vj<^ zg<!5y9s$7;Cg_@9c8~fvAf13zBY-?8@)%ze61o7d`q(e0-KZfb@65@o9P-MIEQZJG zMdP_hd_%n7@0#5Et7NsOrTAqO`S~^(#l1-BEO=TKi(b>oY;#<g3)8T9@Dq$$BWIJg z*311=+Fj35>(-be%uRsoa^3}`VMax^YT7<<!qscp&2M|F`>Z%`VSL<3=|xZ*%6lX2 zlfKe&RI-Hm!oSanY-NY1|0_xv9J{^Zvt)Q<dy6o(WM!leWewxWP%H_vA2ztEP=Ez7 z89JDW2Fz{^jeimew0?AXKQps9=3BmZBco5r7|v|i;j1%RJtn`u>U+M(<!t)U-&ZPm zy0te^N~|0oYd&A1keaVifY+>-!u|Km?j?{^Qh)u=>Cm6Pp}4@k>jiY=+FeUu<+Q!c zyHb7%yERY+f~;C2?0v-_d96I`$zC~77zqRk>2dr`fgUL#!KH$fu>bX3evZJWQfHnr z>;hNdVTG0TtHYu|n!UbnkVmMqLVxj8c(Y0->ZFuBvRfTX21!hAcHct=g=wNw2UrWh ztT1-cP<b*SjHSS<Ng2Wlvj&n92kEE6_>Q1RGDK52BL(9N`)bYt8ohUd&>4LjU0>ND z;fm#^`17m8Hl2q>HVNNL*{?~`T+Z?lEi4lj0V!-8axCGp2=#$i!pnT4^t{+BkyjVA zo6fHSAMP44GjjA7gH_O}tmtSW8baF4U%$`O@ZY7k^_jf)vtBUB8D$IOxpS15s2bXX zs-&M<vDCl*{#uskul{t}L$yvN0Ra6tm%<Kr{q8x#jW}S54k*a*dCtiG_8qeV9W5<o zhRWTmr$r&DZO20{me(5t8zbBAO#kS*kQ8Ux%y|+<XLyRnz3$&|ak^v^`<d%|d$7BD zy$~<qdAzu`LSDruIw+ke4ad&me=l)U5|c1tKCXVH=Oyy;;=^TT8~yzu<@39p%AYHr z4jr6dw=$VhKvcdd_R{mXn79pz6>gwV<S|qnKy+8u%!W~iKM^P*4R`_4sYu1*P9(4Z zdAl@E2eAd?LJ^E`;sW%qj&sw01UkM|`=Hxy>`V$^x!Z$CK)7HiEnEPx9B&Z30H6m4 z5NDva#?4?DR0zeQCQM}Lw;+)T-&kd5%OEP)&{GzX*EEsx_}JMsrcV{bYdlLa15dhb z{<WZYhH|zevDrd(?$Ltb_c$l+o@+s>!p5USZP`ZVG|e3D7{b^W$fh9YcA>|c%jZVF zDlLB(cMy=0bfM^Wca!~7o<K8R{h}dMt0s&iAknq-QHYIK;5A>*Do_v*R!q{4XR%CA za{s;5y%AlL{ri8_Cj-e$4_1J)5MP+eYk6_a*ciRU=YC+R!l>`e3R0So!sPYW@m98K zIh`K@+WpU=Gd)yFPd{z*tM6g<yV%M!_<6b3wfSG|JU+~#$GCo|iF>ZTrk(#%MlCK4 zR0PhD_P3HLg6os&<QEF{Gx8Yr<I%pR(Fl6c(?AKYbz0}+r$@&zq8)(Eejm0((jO(P zKSc=tfbp%_^?)<j(twPfQAFYj3!)bwW8>3w!xlNpN0Sg-@VNrW_dfs#4DDXu!$<Od zGZskRapj*>K(BAgNyrB{^o|;3CarEUg{JPp5DCFj1xS)<74+ExHp9YrimP0p42?5m z(R3lxl!nG3f&fqmEDwZ5Wv0UgA!L@24ij4cHr-*gTW;#O{deK^`1UT@OY%!p4e-?U zxv;vl5Rr!OvXQxBwPR@;U@WL`O=+05J4?vq*W~lS$KLD1y@&Y*!;xf`4>&^l6cpP+ z_BLi+t^A@Mj+Xv{RC*(1WW@VP@?s!H(vE2D-|EeQ)^8(Q(kFI*33dMWb18Lc+HT_V zaMWZHPYU(e-xVSygIA5%&nvJ-Qv<7(o@Q%v6JSS_;^^{>@pQP|n_ceP?S0_<8fk>Z z83Ns@iyNDAcRf2mA05@Zs{tFMi>35!yY+21S>pJ(g$6ij%E2Ee5TSOYdte-wWI=&9 zaRVN?^u?EcN28U$Y&-9I|A$S6v1iZgIe4uBZp1pj-E^r_j|6oW@MzQWVe^{gS5?qh z;!l8)@&oL^7;ScoP@e+%BF-4V41j7B5X1zNB48v*v<FauSO8W16_QJC$<zq-S*oy1 zlts*2wr6<iI2a=pIcVBX87%Z9gy*4&w_zo-Ce-k34$9g}#{mYFK_;`Y0Ll>S76CdG zirPX?nHiJMimsk<*Q|<0X)u^t8IQ0?VSn(HdV%~IjfW}*1O@>RXs2mtT*IF@un2C; z`@QID{&<CRB>A^~2<=yoF~%l=%DRhUhH6?uHxYWo(vC2<*l`ILP!28+<`3gI)4;ur z14^R#XS3!n8zSqXSrjF8wMi=%k85gev)JNlovZL~Ul7|7Q%-Asq-u0jJcilr2($B{ z9G17VICFpen(F$GK-l;o@ks^T)UL(epo4pvVXrm~N5xiiy%|fMcRBM|cVKbN-qs$$ zUM{ZoCA_RW-Q^Kr;Ta|w0VcKPx1QA3oc8duC=FO#X6<^JcDSDh2~_5y>07z&Vh3k? zd4rBMJjF}BybcKMS=>r_o<UJq^@vH5Q_UuNfcs>w@baO<x&35`b~mY~etU9G)p(}< z{qho~21X-P34vsz`f3)*+&|i+JH#o2)Pu@uGcs0SY2`O7FcSN;4MuQwH#a~t<h4?- z<_MEJg^TIc+leOQKjEos`>%p%dsQl~{-Wf25cu*l^4#iED8nOejkqENv9cK!Y2s(B zhR+%lb?~S48uh|Wer~if@-d%-sK|p|$nfA$G=3Tn0%^zlSVMr(8T>pNs{%&!&_Lw$ z%GGCk-B+!~mKQ+7UM^%eBaryHQYaKq_htupgjWZ+2%>ae^D=Ed>HXE#!1}$Ftu%S? zqhJH|8kgjyc@GDhf6MWF2iJG~Ko0B3hWD?Yq`ny^`K}Qw*ur-}=RVKOo7wlgrm;Bi zKN6Mw{lc}nY%Q6h)s56{&S0#j%6&mO<t)HJ=~KjeV*A+C#qD;?{ereMd9)o&U}bs1 znc~l=<_IRHp)lW^{OC9Q2G#?oA2mzO&G-MdxB|U69*g7swt|FwKg;1O6HlpMgeLVf zlF$&T0LD3Uu^Kr%@Y95?wold2P?5V|l%AbkzRNN{IHVWg#AJXFZg~uAL0N8rNL2ba z*_q0UvMUIX_Q@=?z#dFYCItssAo+uFaHT<5P#89l1GYX#nQ^tFo+J;rNAd^ZdhOhI zdDX9=i1I3~pzaYQGS<Kl_6ibWDq)U-3X<-serRVyN@h1jFRzY16x+i5sRGc_>`(SP z=@%>q{elo3c#ypM(jeS^qCWq5>~pq_@8;5MUuD%++s^mebbrK6VBte7-3M*^iOu<Q zi<dilDY}&>AwXV?73`d@AW9R-_7CU3%gj=fc|Q8s+$<MURfux?eX1C3V=`Evsi`7t z(h*a@vmV_UXn!j3F~_YO83KG#SpWUXaOhX-|Nl-_|EkLZI=y+-f?YZBrfV(qg)6y> zb-YKcx8AbvPG=jS^EU=3E#p1ByxP*AKRq(aOq-UbRTNVB^j88@+xWRCq}`HBvU5`T zqGr7IF}wDzF<$(-oGsh|`}MZRFwkPXa@2}5t)RPmhmcqg6g4&i6%v0MSaf>gZ`*lx zzv0#SxN*Kvw5mpWUWJWchk*gcwg=dR^V0rZDFY~S;=`FRf@by)W%}@dKq;6Y0C<j+ zW41%8g8-9a)mKa)Gc00|J88yQM?h|q(?*=Uq`UTWz)jFIiPeLhNCri+imD1wAqr40 zt&I`RNz8@8otO1GGBY+RNROm&6!Jtt9>f|%MWr;D<YA8=WB!Dd6&rvd1INJTp1@HM zFWsAra@SQo`|-&r@MLsndT0zHk6{`y@}o_azYk9OdiubVk~bnM1UoE`;^|B?Z=ZA5 zO1rD2-~EWw8`m_#H^RJgAX0J_;*uV<qyQts11Eagsv0jbI>RxIQ4Qe+R%QOukoI5o zFNpe8n8sjOjkEv%8|gYKRH6f{N@!AAaj0wDXeY@a28^PLCbTxWUog%j9y%6;<eV`) zr8A{7_P;&3*>-IanfmRMt+7dLrd5VPZTar&1~;8@>Erov*T32H<mVD@k8H<>*so82 z>nhuJvh%CH!C{22W3Cl#76CuW;`!zF?I$nv4N3l+J*{0533Os_G$+M1(+Lj7kHO5y z4DA_(O|qAFe^6I1(4&=ypFy7hX_l;>S^$74`S?Cwau{XUa4B^d99{*o@R4Kz3M`{r zyg&&21B3SO>RKYli$@-tId(iig_lnvCk9fM9g`UlLU47V2nd7Fo*XJjSaHWN)sLjb zXeTGQTE$S6&ebP`p-2FlkZu5nW^kVBfdx}!shX3-`8v*#cpUz3AO##T6zSm~!r2cC zm92h8Tr$C-vF-wHf7zpJTGn~9e;v7}E1&FMm`k(Cp=FIg>Fl=Y@~s{HJ*rO***pj- zrq5E3*!w~w$CRWXRQKx7R-x0JfWpT0s@_{k(f_EgItP!2YDBnb1U8rH@W;A-DtU?1 z2K{N~{t!Vfj%>kK&ngOSu(L#d>C-C&9NW#P)fkJ;uNo@vJ_!@zQG1u8R9bORP&FbW zQ2S@_rUNJ7ZuRcQ%jD`|jZ*Tq-_qeIuUjWa-^}2(_-BySnk6susn4R9xXsf)x`x?S z@8}K+Z*zyN1_nYW%6x*m*C;f31*nOiXiGDP*PW7qR-y;XFnG7}5sIK60Cwzc6uX)1 z32GEofybiBPKH4EmHuGmcys{(P`~4|e_>8Ze#S<k&O&T3f~c4Q;0i#wG%5uH!W4`F z!OiH|@r+>l%o!dFvdkcGn!T~AqQbFstvm|!;(9^+gcMB@F-rgd;p<?{IU@R1KRbu* znVq@JXYLrdZuWj33H^{PU@6Ap_h{h95#l&=w|fA4RWu&mw7ySOYHM&!rk8Yjl`KnP zgQGTEkaJ_d6IWU}Bs-+~>^VUUQ#Hlu=ZyTaQ#08Pzj-B1zR0UUwu8p!9slVq&E7mt z2VN=V-myI<o9cT))99^FsVFqKo@0qPJCf9Oe)dsMjebA=!q~(kq}Z=6=lGb1$D}!+ zSxiz?L{RQp)2lk2Q1&Y=fcnaz?I+af{OZka#a`fvWXH*tc-G@Y!@(&sIe4Z=6PLJ~ zYaj1ZbN^7q=An<U)ZS%0D_i*8#E^u2sb#^u-5ai_nP6}?Mp~@A`VgRj|Fs1vdp`h% zRlo`3bAU6m1WR*ZtIvEx6^%XxG7kR6m9CIVbs~Y0=s<#;Fi(zDmWcB)d`KVk5NC2f z0A(u+Y*EZ)<N!Sk&6Dg<Krm8Y0Y#9=jvF09#Si3T23jtNP*^$wEoWZ}sTxZ+g$pHs zE18Ma!Ej>MU}`!hqFnKYse^MW@VDMq=MnNGS0mWvm8}%G<2qBO00Fb{Bk9Q9)ttb~ zSfwAiZJm-F)3eoWM{UR1KWj@BA_P9VX$zBPkW^le?En6gITmpA{)y?_KszKha`;xi zQ*q27DyUCVlIH94rvI*i+j`f7ZonSV&?Ofg)lc<6BV8Qry8NRk<Ke?%g@q>h(B0WT zb`%a&>7H@fW5Q}H9@m;4f0t%E9Hv8t8?POwzK83l#S)czuS9PUQjlz@tNfc4E?xCK zyjBx;zY~bBmiQc=qvG&EN~V6#m0qaGiWoBri2AOy99M{x#h1b?Kno-wGc+8en?I4A zHWaK=lPy(LhR>g)$7N9?g%<@aU`JGJ5z`_z;AVE9hBAAkw0_SBg4s-46M_>?(j98} z%P^jEMeZ*TD`fL4080vekBk}xAy^Oq1OX;oT{8>_!VZFi0-nD`kR+6e@P-h`&xl%> zGbv;LL2ySiS(-b3q0mX-6-#*H=*OyplNzl8Wq+wT502#R{zgT$%Ba^3DE9#4+RHS; zy|zf+5EGJ-ni0)cyY4|&{r>**GWGT~O5Wn?SRzyL+s*#o=kz?Z#I7O%r0<zM`!F|L zd>$LXnb*qBc51_~)T5OBP`65(n3HysYcjm3tN-7cspV8&8c?IX_+44DuRTtCue7m3 z=#7+RvHX$|9|2mrJgqR#s?JrB9U4C}sjW4dUs<Jh*0tnFQWXWT3rcVXJ)0j}k9+mF zuY{H=?>FAq>IU2l3#d7MWDKWE!B3v+XEuwa?n$8003AoGeq<aZq_xH?Q@R@bIY?M} zEybDrnX{UgMRS%<VVbk<W6pEV3~cWrdwLt+i4oQ`78w;j3RJ2rV?LF|3|z4SNrIML zMiqgq^I+IE{<zFvD4+s9JyYV4-Aq-g{YGvKjxrlm;p^4o9s!Qq_hF1EE2^`yL@_5K z7*TjOh>n+ns9-Gx1zZi>4U~!%h9PgC0V=XnHf_Gh78rpIh9z|uovLeK4}Uuo8Dr1m z)#UMDUuym;<nvw%TEg86nb3lWLAJ8-o9gn)tMkc8f`dprX_rtUiuH7Vm&86CjUA@{ zFy^3{zDl)I)>k48QM3?f6Bbv-ZgJ%|I?8Q!u-p`($#eR6f9R0;yL)&)$&laE?)U2I z+J!axYVm(%euKc3cP#GJC@ECz4y&j&tTB%tQJ9FUSRp%bGH%82qTy?U=hAta>L17W z8l%=uug$to%3{m0suDBuGSoEj-#E^H&OBSrSiKt4t?B$XE|%LFcu-2;aod^t<%|li zIf~VMQ#nK=^C@#$xIQI7FCVJS_&(v&Si;}<$I<D>WoPlrx$*O=t__x-g64Z#PZ;cj zsknF8OL{&YErvfI+FsYgCuQ`J<t>uxh*poqra7uwU||o!GOLruPr)dJLEz{Rgf8JG zIoCJL2sl7<qWb<9k!uXdy5scD5Jd)flBW*CW{2VlCIzE+{TH9%f5v+7>v<_;>jdGX zBdrR`Ia_pm93(^D{QJd?<-=i9YQ25|@7=spN@r(<(XJhwqZK_M@0$deZ34LqIs(}A zg?1=$GSw3zdl=7gs!d87;ZK;!!r*E8!EsI-+S%lk#DfJ6jVzlqAeKsP5^cA&<lQ%T ztx%ASKL%8J!%xAcBTIeF^OoVSq=BJ>sp5Zc=ahpwgMe`?ZB(RsH*pk_8HUC3lyn_y zcxq>)$LO-udKTJCD3{GG=C(2O_x>QFvtZz^j@uF(=|RUINiw!SVkN$pv3#?pYub8} z{UlxD`YI&X$MK*DDln>EK9ZQ28n6oEj_Tw74p-;L>*JLz-z0^-TA7`GoF_H)-`hgN z$F`ryb*k!$i|i3r7S;<{y^B(&Jl%7w2Z%Lw>cn5p3m?~zBAcL3Muu^wz@S)qnjU&G zv^}+6otWIhM#>6HfViADBgLtg2m!%Vze!xl%QFOl&v<lL;N4ZwGDx|-7FMFPerTl3 zKmy7(9D<+7C|5t1_hOryNWrV*X)F?H&of?f;!rq_I^0+^WJTk<XF_s2j<@^|S^!V% zIV~~aIs!?*x!8ETBI7G!<jaESdL6|(fS*=}E>{-<ucy|x{Y|f`n*4scYtmR|SZM!H zXXw55^RGi^)~p!BMh#eLyl_(=iK@wW`gqCxeuI9aOPJ=%^Md~#3(>nKj7$IC7q%2w z?Qy7(({1Btkp2Lg4SP<zZnMcO_y5-Xb!crk^tmv^2Ho!JIT}qDN~|uZ-3QqE!L9j^ zoOpm=o4jiLPOEoo>BT)S*UEk4mYq2i_^$?gcvE6OAOKMSUZ86z$Q^v?{@dWqeV<zO zlGo1k<Dql=#lKnV7C+~&O*6wC&R=k)63$yy(sZ>oDBo<MBzlwQbi@nId4ux#60rL} z&T!dF6X0<wT5#YsKxm}_92uyiln3`@eqyILNWiRD#74<g=WZ`Aj!hY2>Kkz)25S_O z1dM9x!Z<w~=;VeKz$~~!vqa~MET@c&H35^n{1FJz?}Y<fK5T`m+}@v0-w>^wpZ<{W zzpUWKeJ@QQf`b9`L$M@=7JOMIQzn=Uo&d;ov-Emh?x#D){OD-#Kg^@it+D4X=&v9R zDKW{*?49wPt)??w7HwQIJrwHR0-Rbrr<i_NnAHf^dZ+eVlBSU~;6FVporC9L5zjC_ zOgrFGbF%We14}B5C?b{GUT%-8pLl48>&YEBnAN4>r_b5q6!y^$JV+6<b;k7MJxQNs zoRQ%euJ2iBIDP*xd#d{*p6$8G%I&<rm$+N2@7%mNbb7w=WzQ418IVs#2fG`t_w?P) zg83!`^~c9GXNi+TrK`s0U4QTYK0E|@ro9k4V4zpwTrKM0KHS;v@6!c`V%Nbf*Qr^0 zxPmqDQEAcy*5SzZ&m_40P?|an%p!Gc+`lS#1q@DjWUInV>`A~p!;I^>v~J;Yekl}t zH?XJzq79KxMPJ4lZG@D$tyTyy!<o%DliD{2D0=#2gcVhWIDE~VEkRF>e;FO!{iE!< zniS|D@9mZj0wc~jdI~hO_G!QKMG5w#TU{2!Jv+pteDXMQ^oMKrg6B_q#AcH6P)Xmn zswd~sksjEt7{99M8CGt;MUFL8Q6y_tzJ=`G8e@NGh<~*qNw0Xz|G)mt>MqA4KG2%< zOpHi`XF;6of>cO{!9nYABh5#us(RzhG*a2*W^U@tnuFMzy>Sz7-kPC?sFc|GMVi=p zb|VYlkl13{<fhAUI+OOhsTKjlT<?=JrYybEB5WTpM=%<I`4kGEdg`XYIxuPff(jl7 zydPCqx_^RBj&*MTcQd{*H5nTcIV}46`+~a(vaze4?<GhYs}>EBUZZ|d5NRhJ12b6* zn}K47%U)Ok*kxW@bmQTf!3yMsgI<!L<T0?o#AaCKvPdQ}vdC0aN@Qj#6&dcRBM>G9 z26i+Qtj$drs_D20j>;DB&L{B3gf&ijDsH9}=($p}lz`7ojGxB(Bsu&Yuw}T7ko13~ z&U<oZPZr@J`rbobr?DzH+=7gW`K{#`=rhhA+;^C@KTfvOpZlFQexG?M_DpUqkMkUs z$B{qEA)q^?O4Jk=|5bJVfit-0;ma#gQIwQy_KICboNe2qcUK3>`M*_8v1d4Lw>N`W z_)sh!`&e0SYh3;T86_XTbZzeQiq?;Guz9D&V`tV7r}rXp$#0u|JRVQXK9%^}PT3!E z9Vd#I#(iE{e0r{HvKn~U>!$X}_;%~{5QE7Oi4|xM#_xwHBmr{CgB3oWTQvNhZ|!qE zHuJ&D4!mUW{@o^awHokv+jaZT8mp9RC~1i<4n5{>{dxBHYkY!F5zbD8x_y}1aP@ao z68Q-(04{+rs9SJ^0eN8oS}&?YVlg*8@j@)+!$Bz)0J$hAJAf6)Ma8`)@0b@fEE~+n z+6w?g@^kRv;#eefD_UW4^()KHXV@7rQRi)Z$*nAWsVjV=(9k+^NzZV1XWMl((M=7F z{>@+2ePN6RA1+r3DR|ora-is@cftI?wjmuP9CtRLB=)@X<=>wK%)K@)Ku!%csj#A{ zgMWjIYg>`Un`|*)LR%`eq2gN2;!k~%arfwY{#W|z|Nhb1uIc80TAxGSo6vqs6Ykc5 zsw^*``#ZB22h_S=${N_Kqk8{LhOA#cC-U~Uw!HQ6zuyn4&DtKHsN+&xHCz<^n4a8h zrY|8f-%@wFv)ysMi!NUl+KRDXxyh<R$Qs$ypg2>U?%7gR8sj>$+2k8<GsIiw#LtE4 zufJ^)J=B^$96i}J&3oA2cM*J6XiuWoQOop`QwRZtPa~OtGJSU7oEar8bHN~cSihY- zr~m>-gh>@CLp6g*R@i_ft8K}7XgimUH84^WzdunXpV*8aq(gyKPGucLg@S`d(bbAp z2Eq*grLFObpv;b+WMsR@Xy1dtW%kvb0Fk8k&&a3wA-^Fq=7m8PCWxcYoTz+dl~Jxa z%@4HATbsqmpM+?5<dJw_fNiHKld<9t38N!K<y6X>6w3_#uPZGFHK}7`QeDnf{R>w0 z8EOY3Y;zaJANe0H_B><%=VktX7S+_VynHXMY?zQsVP|!;zA<6eL~1);J<?Q!g8<Jo zz5Zf^=le9z4QA8l&-MQ2zs&-@I>FN3>^`^(?sTbIzBcvWIv;k{qiY|IjvWalFRwas z{T=JpCqBrTC$fEgGA$UL^F5{ct>46q)+Fm<a>o7#c*v~pR(|r2yNhVCuG8LuCc+xA zCM#p-MM1J}nW6Kc;o@8fk?+zPJ)bv2LuR5`wImW)RGAIXQ4;gBeD(cLrL5lVWtj*k zLOqPRJ|n*&r7@^7TBSaE<&lzn=aFJJgXup3Y{AX=@XJUzxRk8IMTD>irSMTuioqly z#{q-y_%dbpAKoR*+vG?5WDuEr98h~)Ld(nC4Xox<<m!m3gF&~xG)E`?NRWdDrW}Tw z5@`u7#_<Qg<He0)E??*4=bp7{j7lY9C$}<Z1hXn{p5+P9f7=-*9a24$<9eZBNgDt0 z^G=B(BqH)4b4ya}*Z=Ko{y!6{?k^4)pte%hY<z~4p7^IC)(7Ay#OBX{OnB6wxA*)9 zOy&^s^z-l#%qIVL$7X?&d?}hVv2Rf$Yf$lAHWMAw`32uyFOv^{4;#BKhH-LMlKQzB zWCKMcU;U!R3graxXL|Tc+1<5g9GyoLmdvvX*`989U7sxqs8!w1H4%0Gy9;x;P4}sB zJ_S{sw(?kfGfFGjbLam#GqCv61Mw!9jE+rJnuSqb9W!Z-jFpr4n>0RdA_{wnc=g@_ z9&~9umL3__Zx<RBshCGogvSfhViNfr$!+!Y2n0yph6eKr6x>YA@TmB<j1pZ|9^4KI zhX)=q+|5wtEQ%%;JaLzPOTog|ZDyG~gHaP2S2>m8PRNaHF~c`<I=K^S_q$)ad$=3a z`aTgh-1AZxTLs#s9+N!l{?5|Pzp|@6iutv=sSqjVvAS&)-S@|V%<2m}=f?k7(&pY> zl44x_8<#3?{Uc8vHbk|P;GSzHPaTxM@xg#+#D|BqY1wbyt8=vxhrh-9kk?eTP~j%T zkE&r?Uqh`jjMjQ{Z)Nspjbxz5<-)CMz|QMZhL>-3d@Cd1IN?|r?5}wpWA=*r+9z4R zzX!5*Dy#T(^$g0TNnD;x)dn8ie5btRF=|%_?Gyg=@eU9~=gwUu^`Ho_3ioO3F!3hx zI)i8ku;o*z3G47Q6BwDeLFP7t&)mf@_5Q~lV~tH~^W?&co1@$#H1AKUljiI%zM#yQ zAXi66vL~#js_)p8s={8x33<G@(r@wKTo-yck)ywwk6>tfY(B&!{D#!x-@+Bl<H@SP z1=}}bf9(GQAIcM7%YHdd*Dw5)(%B@-c(t}e?TaTAb5+j{Oq$UuP!+-Tw)0a>wR<>b za~4r=L^xCN;7-EhQNN;ZXw!ddI7~nLcYAHO$=2aiGjO?tZao6kjt|a)piLub0lRfu zYi$|VkaKtIj;`F}V^hhcU(X74&#_Bhk0V<>@NF7OPbUq3{y6r#Z=@9)xQL){KBhWa z=*NeKeb|x}1%(Ns6sM4dvZa%uqQp%j^S?J|c7;tB7w*R0mMKlzT)Zz0sHdI2&a5tG zjAqFa3n4Tu37*VaN7{!APOriA6Mkm{;Jj7@)Dwr9_lPTuj%1wBXE7}N_9O&PVv&5r zzzZ*$2LvDy*KwX#8OQ`vM)WnNcF^j6|19yfHRb)M_}b@}q6|J8qd&ww_W%0oU}J|x z)E*QsQJcNex3b7?_*NaE+Q<QCIRk$oXeBvciv3%uJ6QXUQkZq?fY2hn9P<OGeN<2t zWlgwY_M6M<Vuzq4)@@FoXS<VjqnTnG4;MO3;uUCh_CJ1x%~y>}L(jyD`Fr@S6I8!+ zD3&tDQCi0vb9j#UY}HRpl<^9e9vPS#(j6U-H#sXi8A*PMC3<N(j?E>ra8&_l+nVoi z^}C7{CgL%97>`UnvXwaR&a`Z{4b2b3u_55DBz>_a6I!uFLBY#ziS9;!)5$UJ+mv+M ziIp4oJH6dC^*g;O?kF6dbeu5e8P>8_td;WDTK__7jJ*oglL1mNgEny$dH--zlM~yp z!j=XBk5EihP<=n4ww7f+Fc%`Toi_>va-p<9qs*hSPzZZ+EoGY*-N9uH8aaCKcl_Rv z%k=J#rR4qSjY4;5$ps@RUkgiKTt&GdNS~cEKG=@624K@Iagu$Hw(>;Oe(LhMFRPfu zB9bDM7#zrFsb@WlXtByiJbibequMsYAbLUVr^>44NT|U0IB9d+GH3svIi>2{c>_fN zkAt$gZvwdjUVP-vrsz{06&ew80ZSU+XRrIblS-UCm|U0h_f%?+M+X}!GLD*8-V;R2 zywNsz+dI4_ZEV`r`nXv8utIuCce}ND8StC=>r-qBeArS79~C5z!{+q8sPa2uC0jY& z=`YE}ecP7J$MeR|U%C8r4%i%UZa=$lY@H}N{@khZc`Bj;mpi-tz~&Sa#Hfg&Ucjjg z(qS5mBybGX`x`{H=7otY;{(c}$g&5&RY6`CDWV41Nd=M_Nl41_2kqo7-u$2TzA`9| zuHANUg1c)%fB?bWgC@ZtXmHm6fq~!z4KhJO&<td7*FdmAGDvWD7(BQ;%)puV`_BDx zex3XKR^6`JKf1bl_wMfXNbSAXdYJYjPq({tZ@VoJgL20iI8hyI9!bFRF)lUCV-dud ztG!urV=%zk5>4G5<hF9~2)>vVbnvxo!AmAn2bb39JN~5C2jzGlzeeF*Mk(3ja>Jhv zW0M+F=Mi37jBBI|NwXmVLk&0{|0m4X-wSJ!ERPmq=va>&XE6A?-ZkpoU=-H8<dr5L z+_GAQI%I*aug5zoiFi$CbIjyQd#(I_r23rAjWzPK!89j?*YlQ6a_1io_xQjq$LG)@ z)D+5{Y#`l$yukA`vlMNk(DAorfpv$iFF0dCt0cHzH65G-zR7+dLl&sY-DjviTrMN$ z>+^0cYnX>V<>z&Z)C+%1^j6AC#4sZJTqpqOB#9toQTH7N@XI&8`UsGJ!Dgw*!xptl zkTS)pVlN+I^!1gSf<o6IL*$#^3)^69Jzj%mL`;J81##eM%w6hteVZSx0Vzp1mZV|C zk+DQA(@%!8!gV#ggNP|Qlvi5P)@RIv*HPq!NPlo++U$!@Kz&Atgi>1dw@o$h*P-$W zty)TTqF?9z!WG^6f#qV`BCPJeSk^4077QLxcKomCJ#~9m{er5)yg++WBwlfRtJS0O z&BQgE<6-{qZc)LjVhr?favryHsipkctfb+1+X4D;&(%xfE6B$gu{A<+;15Fs3;)&r z8+@se<&d?r1aL6IR`R((|NC5agL+lPVI%xM<=F{fC6{8D^T%)FI>cEr-;hN)NKlnI za{Q;c6z6BQflOh(@DD06zqMnqLxmW+Npvt(6>QOUA|BaNh{dR|V#<H)0N^AF;<8ZT za7M<H_6e#VfK=FN6qSCBC9#_nL0+#*<4-s+Ng^khk)snu%7Do!eo_p*l;{{SbPOCD zp+Y0{r;QEou!S%xML!(sUJU)LZ1-7Tna`hY&bmxRK2Duz(tSj4_iV2`|HiqwxqjZ_ z5DVnY&wW+aZRP&M+nFUCeSq}g&rZIKDa!xtY2`zy{811@%C+e3wf6kzZ0yvbEYkOi z_<-?g$#u-Kipb6azW5B@?6bbVBQy{OJ8%wpAW5F>WC^>hJTg3DpfmeSo}kUnxgMxh z3TrVuQ`O`{>OCCiJ&B`?mW845`l|pkPU59x$Sh^$Tr-_A7rHhnYxm+DPtOtP4|j&V z!8?&+#3C<3-msccsEDiCc%)9<8k<dO&m2rArYPdniL^iP1+SKj<oM8!s%PQplJbR$ z$v><;93z^*gM(+7PD_K&%b(ZL<k@TNcV}F%zKQX&lBE|fXDg4MNj^E`IFh;`4o1ZE zYB?z4_kM~Ei+xG=f<W8MuG$)$>=yc@`$d<L2jhnw$+pY>0_u@vah?p<9L};p`E(3I z1wg=VR)J04#RR>}o<tfyF8oeez=DU0+Cs|L=f_EgDwFi{TR!*q0Uiygm>htOqLbC% z?=$*huH1PYpb_M+yg>tXS{}Y&C`wcxh$vm$WqI=R8;RXr-OYWg<*O)ezqZ!*9s<J( zw0|Hhu%HsEzNWdrI}nl&`L_L3>jA`fuQ)=)0bsX+Iy5VNIqBNWi;TuPZG~-+1PNtP z#Ub@vIDCS{GX|D#GbXO!0c(csh#{1g*;hLkzc&47m6vhW2Ez!)ATxg`Jx;*dr$@Y{ zoVmIfldlc*UwjlsCuP&7!X^DEu0a)7>LLZpYFay<KbL%;Q*r4gFmhTb(da3>^Z*-w zNDH}PMjku$QPFUAVXPTL$tSxAi>F6Dm$2=L)Lp<Tne?uzrWMD&ZNQt0gOeL@OsTRY zS-&;bHC~3Q(WfsU&{t4^CV?oJdJ;cpkh(lYNVi~dRuSY9BQe(9F6~<OfU;fZk$+eV z(+>mYna;G@qUkP+6>*7d%8^U#44Zu@{ZD9p-Cc)bLb+t&CnwO}ME7Q&tFD3Qd`f_X zF9Lm2Vb4!T-C@c$td<`#2-G<=_dnj)X1;4030_M=>9CA}B5sf4$7jYoohN%}GCB?H zO~?wKRx|1d;jJtz=R82G0`I;q<=OhxsgN}}G`rwTG@mvD1A#u?qY!HvVwK=4_n?zJ zW;yW1M}m*JA5^e{@XxF6iTS`%zwO{wubj8a3OyseD8OZ$CHN*R>dEirs)~r27Z6Pj za;N)2U^^BpL3vV|B-9p=Pn;w=IFm#+D;?`B)`uQT>w8t8_S@4YXb*#ini6;T)S%sF z?zyreRf-t0O-jPV+=8C%iBeo{tPxLbZGSlXG!3_M{q?Y6yXR`oUH7H7>wl8#hoXCU zB+L@xs-}g5)-oJ?x3)lidBq&CTk^HbNvV^D+(){SN%N`_wb6Ve3j9=&c2ZQioT|nc zv%Od+H66q#!g*CI?swX$he{JBh{0>T9(1g|=+#uuP#l#Q{wn;f@?Sh8GBolfv%JSr zRp$5g?!oR3{YyhQe_Bn`vtt>x{y>%P(m(%#7sKy4g8w{WmRdT%prZSV4#DQ-ya!qM zT`XFC77Q04uOo3Vb^0JM;0GTP>59y;2(Xn2*sZKckU2euJ~_mo$Qv7f$p)~DEUqoq zpk&ZNqo#i&QP?pc6u7t6d6w2Nau83wjt3P<e41sl<}VAgj_UGBYsniLyPaQ|Ol0uj zpD~uuj3+9mofbHgRWr+Ek9&X5ybPUW3jP}+9(sMRsDU8Gg0j&n=>2UZ3|S<1c~WmK z%I86W<Vo_2?m@%3o4U3Pyf~$_$SZwWy!>jWVn>rG5GsXDKS;E?m0H#~+XsHw)+0uS zGs~Q92u=g=l_H;R05CvTO#<~*gmHFg9{gZIulb!t0I&XaJxX8juF5>?N>d}bK*qh+ zymBbFsP3zONI~P}NZ|dG9LXhGtorY?5L?U@#_skTx$FR!WEVSnNDOT_qJzMI#^2kR zW8tj}v{$ntc(s!}0Zg~i@j+nBzgdETrVAVY<I`C{2|W><6dz5fv$AtQPx@+j%opBt zxdsaF9(=-RRUM@q3Z!@w_XsiQz4WJMYRo^RF_liCC``DsH+IyU;P$&6bHHopyGuSs z_nEtYd|AuCeObuG<ojU1${?&#`)8u65OZn*X$Csw@ZY7+IJVu{J%MiZ(L3HXb$Se% zvE9}q>5k)VuDmXwd7!m`8-n0vk=12=n(qkI?}D014tc&rf5jjs0l}pB{c(^6+rKAr zUaXsKWXXPnMfk|n&u0Bv#`qUU@NPB-s&IKb5-Dar9}vJVX&$A*qYQ$>!bx)Vy~7-m zW1D(3qAVlhyBwvJ%-~(xxtxj<t{H2GcVe=LW9Z1DOzX&tU6MKG5uptR?P-XxH9<;; zJh}^A99}v`3)6^2x4ZO1kD<AL{o}ZLa-+9lV(H|r)U3|+{1Ib4{U>@ZWxZrG%Il=~ zglAY{`n|e`jogbf9*a#(6U+bYs{SEIIwSo&auoshmb*B+s&odCr!+#kq$D>aT#1|n zxK|8spT*fj-<m>Y+uys%GP%<)c-L-5jqYWnf8JH5(x7fLN;!*Lhdt~cwVtm<|H(ma z2NCCVM_~c5gfZXxDelJu{fIBh%?CBY^m@gJdvRdH$>jI5c$$cdyWlO*u9!uOM@86H zwxg@C=tl)@Jj-Qy1@;mgl<ug2j_Y%@C>gILBRO4HyW6oZy|OoumLoF=?`RwgDamf( z`I|T^Zl_}|_7W@nblPfSQw;cQHngb)1<}@qnRKoNc{q-5HH#8fjGJ^cyKif4Yi;w~ zQ5EhZg_4@$_m-APoOQRF@dMw==g)JN2Ipbre-|>_0`naJh_i?F2LTqIBI#$^hQMgW zZfEhBUFa{9SKz&hr*8*f6TKcM<LCYLJFf4adculhXtL~MaIi$a0o5Dcq~$FKxox#< zRmyrE^=#!d-@$yF$Y}}GvhmTs10IuYsS_NJ_3DH?>XNX87Di1Us%cihAF@Vr0)iYk zl3&)bSVU<1VZD4&jaT#u6FXf^(e+uP0kEch;~LgGe1EQZCF@CmAs<vdMox<vSxmlV zgf5KEZ;vO1cKK1J8<=opK_9YNkk)>2Yd5?8Tg)_bS~mBTr9S2rLB=Rs#=8pQk#9o* ziYX$0^q*6VYXkF$WG)CLd3TC@Qsynpo#l#9HdAJXfue7jgtS4mU5wYiJ2faa+33*4 z@T2wMQxlewSh5KgVpY1|fuY@-+&FbkHe(027-h5p&RptS6Z0b^RGj$c@pqmlD=H6L za`&TKvWsR~mXu~;;f7taO2sF1%H={Uqg^Dq0wN1RE1A8Kv~7qbFO>4VNjl^GDYfj0 zm)7FbI^@vd_spy){<<l`EQD111yt<HIV07DF#ut7yOE*Cylf(4#~)u!)=6nSp@bob zON!P*V<cp_FFI=wfk_>@?00{96nwQgfFsmM&?k5`(&ZG6lDxX%62>Q->h}-v3Uc}} zX=ZG{wW8)0o6(hsRx<r$P2~L(7a@+2Gb5?3qQ7{6AZ{DySH(F_K?W-di>5j*Z>;Kz zDJSTZv6zo{%fxuUEk7z4Sgg*fEEfARr+#Z}%v)WYU+(0y5t|44Av=xIQ)=p!LyS6B zgxibm#qQXZpz8L>mzNn0dOfKoQhG6twNBFLv278E1Z`zMz{!c1u2A*B;xC3`Yb2*N z6JB3db>CXtFNC-k{YWThy4%L^mGQnBf7JQx`vd^b5>@F&v>NHOgxfS(NZKeck-?hZ z2teH5tj)Batu?vaWfGmPs=VQ)ioKUi0im2FehNK(-qZzZ#}_iPs&>)#*}_T<XMS-r zm&_WZlcZU}$8u24BNu#$qOts2u%n_q{r+d9`)j!i|CD^Jyj-J_s%HlI+0Q=7(4=XA zQ@%F&*dclb(mb_WR{uEq<()%H>D+#Y{wUquVg34rp>C2naC`rB`Fc%N)*qdK<~zpZ zgmvFbIZwcMQn(@pLD_1PO2Ni=^T4~vt?2Oj=%bb*18)i#UC(#Hx|!0OklPDGjga+> z3Oy~iO^omO1b@DBb-bx2R5z2y@0d@DmWkKs69sJ1Av$kv#73ZAe(?Rl`oehi1kSqT zd7dnFA^=}1S>?2Wqzk>->;B>QkDb_r$->PjZWf89tF&dw>M~yupHTnwKM?pI?|U44 z(BV%0oJWiy)=0}n-_eYWF7@#z-F|i%y7dFG%PKPo0yqo1li+cZ$S>9B1G>~$VZH=% z3wx05oqZc(FoND9aK)Corc)p;f0`l12=^m}hM8j7%eF`Q$r1&&CSr+|pJ>yJUXPst zAh-)S!@*uXd56cSf?Z_74H-pom>wQzyqGcg>0~Ay6#POf*vI`S5&FaatEznqI3L&H zC&pRtj+ARasIp_*EY^&R3yl0NYz!A?9Yz1#tY3$HokHvGH_$IS;RcoKG_&4l4_dfW z|0@#yL!L&hmS#LS8KjL-A7k}KZll+*z+U<K8l)16b%Hp8r7H`+ybm;*u_K#IWYOkP zoS-1=4`qRM_Ky{)nZ}=q&+Xra92aFH7KOMmRtU65bW%6RIfrP`<T-WGo(LBcL?i-? z=e}2t9(^}v89<XX?P!a9hgS}0C~bbFtSu}t8TJcvYVx&`E`YKczg03}Sv=$-GH$_; zDD!dtFhRt7UGgw4d6iuwu_46lNx>@rlF>jp%)6oSdYHbnyI1Zqy-V_uK3|tzE};*1 zGLP5k9K?+{;h&uQ-+^rNyq%GWB1%m_2qNLQW`l;2#zSYi#H8g=Q1eXfsN(GIOmMJF zH^VeF$+ium?Fc;SS()w2uXG4VGyAq7E$8KWUDA6P>}un2MWzx8$lWI8$xVo~QPhr9 zFt)@hN7D$!i6>n1#p`J^9<of8$<KBYd}6;niX)~-LqGTm&yqMDjc?g8cyEEP^@G#T z+Mq_AVnQ|1-*>6}IiNEC`JLv1uP@wJ3{qRdA$C3Yo%tpGH`m(M7h}CluS#pHf@8e9 zf7e3z;w2AQ$Nt(LA{c0*K|!v)vkyri^n!?g<Be_p=z&FhXX~zec<`BH{jtB*Ya=W) zHDu@1Pd=8O&DCP_!ML5lYFpue?G)rMp)1*d@?{)sJ0OpSZdbQ=r>MRQN|BYDLD^A{ z7tcEi&AiZ1TKG~^O4|g(q=S)b4iARqipCS_wjy{uk8TmNI_~0bdJdnGrPq?4JM6zr z?b}~neJ8OH>GHY4R|`zT_?G_i_9n3ASU}SrKlVp`1D(Ug{%JkVbOLyIzt+0zHsi}8 z6ZYSXwQMs4d_CT$qtqu}dNB`&mzUJOi#~&=s8b4ndzQd?(50PR+|-KtSB}zk&thxS z{fa^G9_&wF7R`^Mpbnbu$X~tLf&O!LXkc~%J=P8sjg3-RLrG?Db6C~v<)2WB_3a?H z)XecKu7qz>R9>@+ws(Xh&xt|}uV8V8S0N7<YAr%XMexME*^dxR+uYGr1c_&MmF*S$ zCvbO`b2Ae;NIU&fRrO10@#hM+rGVO>Ay4;PJy)MN9JX=8s2k?Ba{j{Yt1SKKej3nj z>GFp-=fJRs1fBVH5BXHT-6$+~PBz_iSyo)yWMdBCOiCV!51%BQA|#>m^q=c4ak0;0 zyxQqKd{`6WIC`Im%}q5O9g$QE;LPe#{UkD|gcqwk+QDu|gTcv<aY?6+rPo96g@Bh$ zxVHtJ>^5pIoB%^-CetI>Zfi^9B;SaNag4Yw-F3`?fbuoz22+7i&BAmlubc<`6F0J4 z)HW^_&-jA(@9#pK%FOl`{vzu%*lT{U+f?S;!7%llqcUpZlChqR;(L>|NpxOQ4&^=K z?M#1U>euRxSAyC#$|d>&jO+|?#u9P_XL$^pL0REB$YWSeaCIFT585;BArACiZ+|=r zpbd%c)?;hTnNRr4TWCU*8g>MxyvGQs>v<QHl1a0ao|>OlR%V4!EQAXYi0+(ffWy59 z<B$uaA^<s-mSzuGo4r-w6@G2k&F;q-Rr1#2z_Ejm?I2ncW#j)^Kdd)7I<s)sYT!6K z9FL`27olJsv?=}`DL}Y@J*l+M9EDQ0ad7Yvu2B5Z&zlHBo65D#jfe~sS#Du+Xt^r) zW|pc)5Qp5}zc_y@!K@{LW-SDQ?BqAR!?Q6?n&f{vPP+}5#ex%k*dtjE*jxE}wxCL` zm02d%R_eMedO@M_s0<qH01T@33v{y+c_k!F87Pp~{5t#+Oy8K#{W7rW+iZ3(|3H-D zEoXg>_<u0(9F+LrM29M*Wb{EjNGQ$<tyGDQrivswx2qGa5}t0hAS;<k$)rAh(kUQe zKm-ggU2*Q5N~$3K><hDaSQL`GfLJlVEPemHM#5SzLFzNT<-W}ezo$2%$2|;HOsjkD z7IO*j9M(A2$*^=h8j@xyUQp55f19=GozcveX{#mj)V7r6W-~C(=e2q%$g-oPnP<`G z<mi-txz6ntH}W4i*9VvLl^KxQb@5o!t?}F%PYP;N+L>d05w}-&aXso$6Z7#U{#+PG zGR85?IZvY`gHPJ6@M|(E?=us;Jt^o<O`TSb*&P2iD-j^VDbKTij<ske)R6f2;_Qyk z6y9DlYQmU{g;~&>tHdY|zo>2<m+?HkzD*T)6icUUrc|MV6xLaOG=Jf_0i^X|bIO64 zEMJNT7dy;94E>K0K7N=n#os3Itn{RUNq3nH<$nIiR{b=b%Q_^sObSN|X95hhmb|1x zk>7g8xnDm-tLL^!cu20U^^nv#97&vX7cmD|F3pnVQ2;JO&xE8y^88MASGi}3W{9YF zj*TS1HU<h9FF&%x^u71HhP1Sp?Ot?*8Iw|VlP=5-mB;9(`E|7Bw-U9ys~a*+C6i8R zU>5lMlaYN$6^IZa7R1&Gm(WTuVO@EGq^yS0#$@+LG1b{^|K<UA8qvV7<oMsfyn)GB zQ9Tc*ZzDf&rDm`pw}a~m5Bqg*8CAws)>zG3#e+`9FQstea!HFZTzARBjVRYuil93F zYx^-E8#V3$PU_-VItZD8i#3PPlG2ZCVvw<*PsUJeChJDsz(KUyUt<XgxnDrWh>05M ziF%THk99rn;(9;C(1i`DEeXn-sf=Hi_FZ>WaPpmM2{f2~=VnB$H|eFFSXg5>g+UB9 zvtXJ6LdA?-nKiZullE-=Mrd2o)$^(XJu#^@bIjVeI)!c$<4P<0vBI=ypp%#JHIDJ3 zRKXR?2PA~)sy#@BcJLvJ%K6_}<aAEbgZ)-9Yh|8)GE0M1<r^xxEseTQ!Blu;YMDbt zjh=47JM*1mttDM-c~-ANKZ%mok&PM67FLc?Xv-U?lqV~3wkGr0l)NFF@z3Iz9?mv- z%|LXOP|mu>F0x4eMR9_pnJ&P<KPt7^4}Iumh|j3#^?w#@4faOv*E)fDoa+^kH(f@K z>1A@GyTv>~-7)lZLs!IGN2c(m=73RLu{G1_r(g6Vb9;trIIC--NVEfRym86)3NxQ0 zgm)g6_m`x6CgdrwSNxoW{iPZx7d&yFaT>p%qXJ;H<cFpfXnQ!aii!sRrgLH%A57Gc z*BowICOdq7h%C$DGv_;89z<8RI)-OLj&`}UiZ#cKNK9CDtxT<wpRj3Pf6)7-3jhGn zQ7trNZ=z6y)kq0jK}Eqt<>v=!(6I9sBQSMa(@8`&sdkxhM7OD9yu&N?&6Cdsf}ECA zo|=hb<L87u>;r!0Jp(Ov668*wiEyN7257zJhq0OxqQ}e7$DVC^{o;B}z6GyXxx)bf za8XYJ+^3DS&y#*hN>o$23{#8U5B=-_U0{Aw6vtLkR`zGa^XF0yFZ6vQ&^2Bt#W34r ziAysB7G5JL{_J&4TZQ3(zpkJQbga}VQ@F3TJh3)M{6f3PtLXJF_6Rf5TYe3zd(<P) zP_0Ag`j(SVoMC+<;*&Szs!gZiD_Adzur1bFTAY;(G<$V$#C(UOT@5vkjMQm{vGcCo zHdGp(agm2v&h-Co`sNku!DfAcJQ*(+zp2iyL>lp5iiRzqdgh}!uS0bocXiLMiW@ZN zE&PGXLy1-+7uNw>uY7;0+(08Mh7EkWQ~Uep7xx4?vAgw9f7V&s<Pqw#y(wUZ>g1Dr zAO$~TU|%4W9K^@lZo{HGWUeV|kv)us05&Bgvn1nb-P`$yJovG)DJI)Hz?y<-7(NSY zjSbdSD51h{v{e)<grnAV<XoMa0hS8i!d))BD@*1=G4QW20Q9JlefIOMYkmjR_4Tdz zFhl=AiUc*YT<Eqo*Nws0H)S9@V!yupMPX>p@<Z^Ew^1tO%i~zX3l-v^X}9Sn(P3xc zIG@>l=|&9zfCm6r8bZPF`|=4vTEp|t-!63iOh|ok2;cQs-)K%Pd1pu$03paYD2p&a z7{sRI>2vfI{$bgGjhncsgohUq+@pn}pfwv*)gE7Ql2BSoa&x~v!qv087T9F!E@(yp zPUVfzW_!My;+E?s<u3doU`1oJ&^_P%{AMSV=HK_yySHgF8(isetoH@lou6zvwv4Kb zKUOpQeLo-t1g7<Fym75m<}aAiUH7!lzDU3&0dS(Qj66FrsA4|@zT?gLHmNpOikO<E zO4fCe0@h>p1={0tH%*w%Q}-@jVWMDixm;u*H+X^MA;UtQ{ci`thM4G|I{={w3;GxO z|Nr>Ee1QTPah87!k>vaVD1}b>zkS;Or>-%f`)2rKR=(P4`)Am%lr@zq6)eO43#RZ3 AD*ylh literal 22967 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 diff --git a/assets/favicon.svg b/assets/favicon.svg deleted file mode 100644 index 6b9f69bf..00000000 --- a/assets/favicon.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" id="svg143" width="199.005" height="218.204" preserveAspectRatio="xMidYMid meet" version="1.0" viewBox="0 0 149.253 163.653"><metadata id="metadata149"/><path style="fill:#2c7f66;fill-opacity:1;stroke:none;stroke-width:.255102" id="path155" d="M 70.291014,77.896165 C 59.680388,74.213777 22.648767,50.991201 15.537079,47.357179 L 9.6785404,43.882052 12.974329,40.27204 C 14.389438,38.722015 23.848199,31.22073 30.014505,27.519226 48.82918,16.225168 71.327881,6.3561529 74.240859,6.2939037 76.840164,6.2383587 96.296822,13.526104 112.93116,23.22948 c 13.99617,8.164443 25.11609,20.005331 25.11609,21.075841 0,3.35084 -52.956681,34.036172 -60.756373,35.148339 -0.70521,0.10056 -5.712968,-1.110855 -6.999863,-1.557495 z"/><path style="fill:#60a490;fill-opacity:1;stroke:none;stroke-width:.255102" id="path153" d="M 59.762993,152.41877 C 34.273187,139.37619 9.1850164,124.58868 8.1324288,120.62769 7.3477601,117.67491 7.3674123,103.27376 7.1659271,81.577795 6.9735686,60.864542 8.2924714,49.447777 9.6252837,49.191101 c 0.2172937,-0.04185 5.0220853,4.138746 7.3318793,5.356159 12.651207,6.668019 24.238738,15.66922 42.756593,22.261247 l 14.214128,5.059973 -0.07609,38.52563 c -0.03525,17.84928 2.440906,37.45994 -1.830585,34.51479 -0.326872,-0.22538 -2.523682,2.31772 -2.682705,2.31445 -0.15903,-0.003 -6.06786,-3.00979 -9.575513,-4.80458 z"/><path style="fill:#339176;fill-opacity:1;stroke:none;stroke-width:.255102" id="path157" d="m 77.872974,152.91559 c -3.269362,-1.92068 0.03217,-15.1659 -0.262792,-33.00359 L 77.018109,84.108633 86.517737,79.188835 C 101.26896,71.54926 116.64721,64.399959 127.85892,57.115614 c 7.84892,-5.099512 11.87447,-6.243247 12.05109,-5.927453 0.52593,0.940369 3.06033,13.025431 3.28639,25.648089 0.33835,18.892771 -0.64244,41.92455 -2.70182,44.72957 -1.75852,2.39523 -22.6872,14.97537 -35.01436,21.80032 -8.102415,4.4859 -25.563376,11.85455 -26.260778,11.85455 -0.12918,0 -1.346468,-2.3051 -1.346468,-2.3051 z"/><g id="g141" stroke="none" transform="matrix(0.1,0,0,-0.1,-25.6,181.67807)"><path id="path135" fill="#29594b" d="M 875,1778 C 659,1676 371,1501 308,1433 c -44,-46 -52,-113 -52,-433 0,-308 9,-387 47,-428 60,-65 281,-205 506,-319 192,-97 194,-97 384,0 261,133 501,290 525,341 23,51 35,255 29,491 -7,261 -15,306 -60,353 -60,62 -364,248 -547,335 -121,57 -154,58 -265,5 z m 251,-102 c 171,-84 474,-267 474,-285 0,-36 -536,-341 -599,-341 -59,0 -601,305 -601,338 0,31 546,341 601,342 9,0 65,-24 125,-54 z M 445,1236 c 90,-61 266,-161 393,-223 L 950,958 V 624 c 0,-184 -2,-334 -5,-334 -3,0 -40,18 -83,40 -235,121 -470,271 -494,313 -8,15 -13,109 -16,299 -4,287 0,354 21,342 7,-4 39,-26 72,-48 z m 1209,-118 c 9,-227 -6,-462 -31,-491 -21,-24 -203,-144 -318,-209 -83,-47 -241,-128 -250,-128 -3,0 -5,150 -5,334 v 334 l 113,55 c 129,64 301,162 402,230 39,25 73,47 76,47 4,0 10,-78 13,-172 z"/><path id="path137" fill="#29594b" d="m 1540,939 c -57,-23 -110,-94 -110,-148 0,-36 22,-51 74,-51 28,0 36,-4 36,-18 0,-29 -22,-52 -65,-66 -32,-11 -41,-20 -43,-41 -3,-24 -1,-26 20,-20 69,21 132,82 142,139 10,55 -6,76 -59,76 -24,0 -47,5 -50,10 -11,18 23,58 60,71 26,10 35,19 35,36 0,25 -3,26 -40,12 z"/><path id="path139" fill="#29594b" d="m 1358,828 c -13,-10 -17,-37 -20,-131 -3,-109 -5,-120 -26,-137 -21,-18 -31,-60 -13,-60 16,0 61,42 76,70 16,31 22,270 7,270 -5,0 -15,-6 -24,-12 z"/></g></svg> \ No newline at end of file diff --git a/index.html b/index.html index 0cc59068..362a83fe 100644 --- a/index.html +++ b/index.html @@ -29,7 +29,7 @@ if (document.querySelector('.initial-loader') && document.querySelector('.initial-loader').querySelector('.title').textContent !== 'Error') { document.querySelector('.initial-loader').querySelector('.title').textContent = 'Error' document.querySelector('.initial-loader').querySelector('.subtitle').textContent = message - window.location.hash = '#dev' // show eruda + if (window.navigator.maxTouchPoints > 1) window.location.hash = '#dev' // show eruda } } window.addEventListener('unhandledrejection', (e) => onError(e.reason)) @@ -70,9 +70,14 @@ } </style> <!-- // #endregion --> + <!-- <script type="module"> + window.loadPluginScript = async ({ pluginName, script }) => { + window.loadedPlugins[pluginName] = await import(script) + } + </script> --> <title>Prismarine Web Client - + diff --git a/src/index.ts b/src/index.ts index a0ed33f9..a36ea9a1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -92,6 +92,7 @@ import { loadInMemorySave } from './react/SingleplayerProvider' import { downloadSoundsIfNeeded } from './soundSystem' import { ua } from './react/utils' import { handleMovementStickDelta, joystickPointer } from './react/TouchAreasControls' +import { possiblyHandleStateVariable } from './googledrive' window.debug = debug window.THREE = THREE From 9ec20eff1b7cd7074c4bedcde3e25f48d37d6af5 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 18 Mar 2024 05:41:03 +0300 Subject: [PATCH 0077/1195] make favicon larger --- assets/favicon.png | Bin 526230 -> 603328 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/favicon.png b/assets/favicon.png index af7135883f1a74d082d6dd223f3d8598633b71f7..4f0db721ca08cfa0600d2689c56a931962d2f92e 100644 GIT binary patch literal 603328 zcmcF~1yft!*ENIy!9#E<5?qQyp-7Pc!QG{}yK75uCuo5J#jQ|Win|wWp+KRy7N;p(GDOdHnau z?<`Awn!)r^P?5#lLxTWVsO9*7O+8Jax_YQ;qfQn2WNWP?EFBuRXd8Z3My59TOA{5LFM9k3W~Hs7X1&w- z;v#R?ck2GbBkjvv)v~#Lum69;-3|EFFRJN(w|JG=Es-^#FJwhuZyw;pEOID!v5Q$~ zG$)#?x~nGD^4;fU?qpJCcLVLl@=0fZznVlm4XE@>N(qN>J)Ty&rauoCUkaO1=~S~u z6^aZ2!`j?E7u@&hHy;@9`@2y8ZRC&m+e5mc_VLJPhYF;4Km`hbF1c#Z+PoEDiAPg} zFa5H_0t4LRZwI*hD>fw1Hk&}qnKnn;JqUiWt?J>C3*=p)YbzftDugqmw3 z(APJM%#)oP9>{ROXp2uQsEt|`vJWj{Po&twvOuxNufU*?#74j&`0pdNrEoJIPg@h& zHSTIK+m>UF{~1eerEuxrnqZIbixhsm=42BCrfyn9PKy^~9GaW5D|ty7?4q zTxI7kh4^2k>g(&}bown&Q?aO3%pUDVH;TgxnW+*g$oNmu-#fAq7%y$jevVHd*|R+= zqzRH)NfVfdHcFRJpeX2^w@g+09=>@Bp*uov9Q%JG+uv6-?X4)-3$^k1jsm7siewcB zAuU+rS-X4rRvuq@KFC(etyQDAN*1r7si&4^m>+*PRug{vX=?E(jsHCz(2t63j6y~0 zaV@ZHvL5d)@Y-Z={^8&H8TLqL{*79vw5rZI+8O@D;R5{%tN>v=)jkWXxzy~<6_G)O z{MBZBcti4$bkN(Qh8d-Kg(9op41Gpe@kdds zU|J=ivJ?~;Z=v|=B7P{g>VuTfR`DfgES!Sx;CmUCh}3pIzm)~3Aheb7 z3$<-apm7_Ig(IF9pafkH9cI86o%cmxeS*jGBS8@`9F3vJ?nZVoV*j7R%l1i!{|kV> zQ$g`MAyAAA{EiH5fFf#wos!@V9;cGuNvGu%J~K5fDeR|AG+{3VD3Vc8UwQO^sdFc~ zj&5zu?%?!yuJ4F#s6LqF*P>;V z^elwLTw;cj+Y)bc6*GM-qTgI)H*)-F{3FC1f7airL9OYBtpUw!ID}A)etNY_t|*t$ z9jp5O+x;|m$cUpD=#*Ufje?qwpb+s#PHcw_DTC7riyn68^ZE;H0_td zWbXKy>3s2&2H(=g*%ESPH0P!qFpi^>Uil?XNqEpsIT3tU%`XEmqH;s!ATadNqt#{g;hBJwj8mhUl}*o@*OuH@nQ^G5HTko=?2O-K(Mn_nBzXvv1C&WA zaLocmcf0sS$mY%ZCA+cWqj6D)&~HM(*jb=>d)IKl!$vvI%#-)a^jc8<9bvDcy3eXR zTfN=mG$*1fq$_c2NJ>KbDL*~y|7~wpRy)BN&fa_^#Gb?{Za_4HYT*`LDz|{HO#}-b z*nyw+&0U}M4s&1JMdUO9=Bbc6bZ`VY$fglBU{0F3M^?Cwr1{+p%0h_Vm2J@3(Q-%A zYY$s?&?vLCi#kd6G;6UgP(y}P%J5VP$#lpel9cy)cip=`Bh(wq61@Tl15#*Y4P;(v zd4Mv-Xza_s)uuDDUng8EpZyNHZ-AB0| zusUi^Tw1SINw%_NeK=#to=h47dt8ctm>Hut)AxNgRYT9hPl+|(pRL1RtV0bu!>OIs zr2|uVl_WW81v$yqlrTQq6xsS+ZoK3W|89uTSbfk!$grzXqRTk$$x1n(VAlEEooDQS zV)|!)#g;wqfA$}Il{cUdsOb)jG7`NNyZCWyupDVkQDME+n*1Zrz(pD0Tb7(#VcUgE zE;x`~q8yK!8=J_hg1%crNl#!Glmt@CKSZTBzL}9t6 z#dCARFz1nQ%Y5;f59%bhH?3BTIP*uSZ+8}l|NJ2cLdpvf2jeU?z1DM#4v8alioiFQkF#AAZL~i_m;f9ACUQgW5wBCuw$X91sGsoSdJ4@8TvyxP5xlyJ6RT?)`(vCudu*}A2FKEw zi`*3>8DV4*AnBbSfuZ0B$+}vH`F9RrN#)@qK^=~@&AofLMVxXRwM@K1r4!GxdMpr7yEb&)PfN+hJcjiV_|vg-?1n8sBd%%dZ!nKrK##q-0fzxW5RIYxc3U(scvuju={I!{r(3CELttCPXYNM-~$ftBm*(zN-?vo=go|p z=VRu*y_AHh^~JNEv$;sI~^N)0@=e?1}Y zEr{0t5^%kX42;vJvvVw#xnzYjB3mn0Vn_j};CqNg1P@JPANpv$m(@KnW92VSjO|0r=F7I{i~dBylM+eIpEHM~VVSu>t@A*~!Z&~0ao*gQEZiI) zr&)K!7>gu*lPR5xoVXlS32jNV<{gZRJv%`DuEw2+_aqz2S>zc3{r*v4BFp^D|FXE* zDj(`tVa~6#xK|cmpVp-=wt)V`L@tO5jVAuZZtl|0mO>IsK#P* z;m4w(abVUK=U8@bAd8uhIhHp5bCO^J3yH8lz&TF%do}`>YrjXC<&M)+gS?I^k&kqk zg}#^5ezflOu>FueRGMw#=pXJ{(yKMo}*n%J^rsWF~!gVsrr1p<;3P!7ueGb z$PL0(qQht;8!Hx|FtiAx6o4<-QIFYuza(hd_NK>_N&Vg#o7=rNUpaCfOF~W>1T;X_ z2+MI`y{F=+!pHlJfHhYC<}+82NpNTS+;S;vB{)}w_qXaY0Jo%AZA(VlXCd!tvzFCH z1OGOgzeInEZ~Kf#Xoe(0C>#MCcfZO6Ea$>yk8M~|B{{@(*7t=h`Qw|%cS8}|Y6Glr~U z)MyQ$i#BsjZE7w>=5*_Ik|ubxO|&9pmY5X%N9Sgi3Jxqp-`{GT+%AR~@Ao-M%lB<% zeC{7_BX_x-FZh$3-07nPvBnS=H1;TLAoz~A(PkA%NW^zA)DMy|>xTOSaO~Im*|X2$ zZ4}E?&UVqRE;*nnX`*AhrTdoBdN!&Tdw1%?x+Vb^Y8Z+m{$JEW&##8+rLiS;qCxS_ z{omozNaeU}IoojMT7nMSbx+rmi-U)p7d|Y?4(OxU<@Ca65|Sw)+)`5WYNLD#d3{TY zNk=+T-1fc`QIw6>;TEb+*zqCCev<^ALh&0xv$jsSF`;Gc&;G@`W$9tx%#$Gs@59J9 zpF`6<)9@1yvOix;I1X3Ur%A2N(cAOU3C0ffd*C-Gkm9!WFzO{0^^$ z^S`U&pMJI_=Fq0v56^(+3zB}X3bG5QP0G&&=T+O$d=$@6MT<& zZRb}9sUD+PB;(eD9$5_{s`ePzBB2P4=m+df;zMe)&rMaCjtb7ihitff{qHQ|DNd#J z7@kyuH_BddI!|mV=JNGd37Wx3af-|UwK-rmhK;PsJ|LY)xBxtg!mZ`NV#i7SOgIt$ zoi=||4YV%J3d)e2t)Dv`hk3c3(}32$NjB7Rb1F1tOyj|YkPvJZDJ%nKjiI8^_v$8- z3&<&0Sf0tb&BiH%m1lmTwJ>KGvE;qI`}S_pRm?rJ!0L;k@u}^Hw>eX$U6Sh#r7x}V z@9tmU3gNu-5V&S7;N4EaJG!~xmgr6Y9X~v2<%A6u0CLh`fztH0#=xPLpM~j@d8jYX zdU`t~ujVU=e_{Il5eixlZ13>6jV?K6(BpP<{Zvi}gN}r#i%^|G`Jv65Cr zx+sO;qCW(8ZAz+Ujvjm_aq)xX&3Z)?7OWIh+Vk^Pty?k06+8%H&`dmD>7BY#IFyk% zA7GNWKyZk;`zPoS!YefVJa8E_vkL*wMj&Cu=3SZ42(#(eVVRox`XGJE)`cElm%ewa zt^MOIi6TPFUv1*`07^Yr1TUfCEJKi31}|)?j}*Jj3&IVb$Hw4vOyM9y7)&db6i?g? z$sy-IHewe^s4IqRWmIz?<4#sA`Xqamy0{-aouz~l=d^b#H?RJ@c)(_fus(k735am& zzxXk)Pm9HD$p%Rq8wK6~n0?XOTgoO9sXy@we{|D{Ny$hzW!wd>P&X_&wu))qokxAx zTu&g}ou^C4N3*IlQGU)u=hixxf+ZC?01Wfuk-yNz`v%5G>+qO6-+r;W`9*a2YoYwh z?`DSj0sS;W#F8-{EJ17cNvC^gRPlk%&n|LJZszrVT6yTFFnt_B7N+$sra1VIT&|IB zHm+MviBC**-ry3{D0$@DQhlQ1(TSNO%wqB*v{w!EBiD3_CbvIr#C%>IO4%wJ)k3hQ z_quH~P-{2`_%1=%rALTVGYn2#CoJcvR!Etm&0|be=kF8O8_D>hHn|7hlw>6GdaW|$ zhn+5Fux?7Yc}QJ&S7cuJR3;bfN&2G|U+Me$l#*5Vsn+oy9*2By5^91{yYChr*tM43 zv`LjKLlv<*=7FhnDsswNW7EgN+)2;o?ql~&2R%0OC*d%~2G+f-kseNkK0<@<>*pC8 zmb8AEYT~zawp8C0m(UoY(zyBBKqzSviv=ozo(?1_)pH9kAodNZS&69Wyd%{+q2VpV zTx6FbsMXL)Bk|9$SOL&0Qoh(;=O80b(1K3EZ{+z?qo4!%7^CfG|$qK+@}4rCXXVa=|GTOalr(D?fe#3shyhMHpN zgPLSt%2T2(8BOBJ;})A0qkm-knws7HJptq7Dc&sFWWt}A>hQd4J2?SmCS^Y-iLymM zpSE^gZ*0g{EcQbpWz{gcuj;gZ%-1$QR8&uBp!N-tq@s-5yn2(?L8lc_ zevheSt&OX;2|k!Qn6)#6MY0eOz5wAfh8UhpuQ5pPKyO`mMOqH4u+J$~_XVl%71 z4^Ya$!PtEMH_OJ|D{kuTrr`1F;%@u(huvL?0Q5~W8IDOCw7-%KtUQx^$F^WdOuwB4s? z|6>nW{|PLwe7cS;bCiU=YRT3HK%_A{JOMf2@YRqR9`vGG05dwZvRIsb|7e2c4v~_9 z+%y_&RX#jgpJshb2IIGcTArH!Spla16~ddQt98g{-ladF1$HO_iyA6yl153128B#d zkO|g*;KfV~i3xwU=6Uk$Jffx}JQo`z(u}m*HFjTPIFa z^s(kBD|q1#ZLrk|nK{E05X9KlxZ{KILm2asA90148aj=Fu5-m#y8?UOefqhzEAg99 z!o5ok>(VB9+&@W*pd2R}k1&ZRMHd1u+nQwBE?^NHW@VuNsoPibt!8~rjfU%%6Mnv}N${I?IdN#J-}OGBs(Sg3bwSk}J$o6?thS3NAbR-Y?Ng)BZW z`&)HXj85;&C35-NVfAL})$lHN-gd*(tA6x==_hqhf&-ogxB7 z4ph0P5K&x%yIWIrhQM67xe`_Cx;%Jh`njopvX?NEaGB#!c+t{yf-T*=F(9j`NG7`w z%BfmTnztyI^o?Y+7PHed32GScJ3$rIm^Z=EanQgD6g)MIKdbm3X4Z2_{)0}O$J)H% zS*+E}=OSF3Ec5OgVh!c2UaEUFvy5!K=&$=dFywFDywv&L8=kr#=4=|Y$448u0X|PQ!6siqFhauu)!2->Z;Cvqd z3%c}Zb1EE-9Tc6cE=a7Bz(f}q$v8FR{{j4LID#QYJmpN*CXQi@{N}1j#^uMov+3JA zsfP%%n$s;1GwI}YB<`L}$bXkYc0kcI7nvi7offJ(qmKQu)=#lI#HkomwaA;RdFLS%|d}#(F9*=3I(v z*8?f-?N*dMfLKXbB4l*(sm!!DlX9=cv4qi+QQ(wxC?swKtp;&D`HSNP8@{V5qFv=mD<VdN%l?#?!p`tm(Ao?Q*^~! zlQcn_8Bh?`16Nl*mw5aAHNhS0ZnvpNsU3#;3o=5Ten zH&s#InGq$Z3C^P^_RvWY@cj)-YoLl1>&uc_K0p3e(>3U28}<63M2&A6d=OHbA%Fp~ z{qxg=!grzmDWJs{1n4al%U@`ohXYl2Xa*(vBXBS5`41 zZd#j0rTCpaC~+uYM`5fkgb200XFTw<-PLrrec{+$pdoXe6l%i=?FEI!hWr*bvNY+5 zB&O|M#xO>k4{c#RS#EOxYJ`v^BU!in;LSpE_n! zQP0ywqCpWZ1hSr%F0$&`qjZ)$1QrlWU^wV$y};=(%C{Vympm(wKiO>HHeFxj#SQ6* zb%Lw0JJjMaic{ul0{9OJp|cCw(J}=U2pIqoqc8Q7NKSQk%yClpI?13lX9*{V2bLQ) zY3G^-WZNeoia*O)oDgnDAI3y)NDb!7T{PpL+UHPsMTkp8zTeD0(k*guQ2509KjgXe z{wwinKCFnouyBT8(`N<mdA}K9dHrK!BXZ|%ERzO_5-ZdiI)HXD7DimGupDfu%S9(p{y-^; z>LYIap|{0__B^8Hlc%#S_9FA2tXo!F{3Bw6XmVPfRYDU)14+W~@5r@K#sHj8^e^MC zNJ#**fyH)?RaEqDG14{hBlEh*eu;Gf$+7~x>A_s_*|FIR0EHMlCKd7#Jz?H2H$)XF zU6dw;9VNhI2y8r{*9NfnDk{kIV8tmye+QA7d^p|9qJMQg!4Pyl>M1rGrjzfACXS{9 zqMo!tmd2k;09Y$U?ggZ9Vq`T3;Lin=)?DoU58Xy%BY;!SBni{-N@>7mj&$9LHhGnYNZu;*+xQH-A%3+QxjaV>f+$>wkNZfSNuW9s=a zM!gB|vU?q5N11V9>A^&PDF?%pZbYX|$7Dgllj^}bjg5MD(l_pEyqo*}mijqk6ZPzL z5pg6K;Nh&Sj&Fq)6TxHKDzO#AGC4Ozm+V~KREzp8ZELn6nPR>nT!(>N_GY2+;FIe= zgDbc6{4;p=TQ|*tJ_FKKjT<;26F*s|5W-q}#0&Ov8i?A!M9sB6Pxxcm9u&od7O<5t zG`Yjd*8t+CbB^Q)no#8f8UdcmB z#z-*rj3~@2dO9PvoE&8df{!JkqW+Pg{>wMoG`Dh;3Ibx$D9+!S`3a}zWv0RLhcvNOhDXfDZvuK}$$tWpYDneQt*OOXxKBHSs#7eYWfSV~WGHyvB(h%ZA5wI>^`+yWN&Mch?C{%$d<+?Y8mk=h^OeL@ zI^&T6%bqd!$SENamPQQ%Xo`%kXx)LGTShOgz8eVpB<;{?1r(PfC7++FLcJpu0y!%w zcd4XJWOOVlDd)asR?6K-Zc|Ih1zm#0p|EIYECtaUs!(EKEZ!G;-+1?jumgU`v&Og~ zzG7xPIl$#8g;=n{5luj|vAQTdKN(Pr!lY3yBpDaYM_EQZ&p5z1$ilWq%mitic8b?! zwb2T#*(cC~;q!}HQcwlFOyQ(@h)C-AF!hFYyFP@or}BM+JphfqAQp@_Le03gd>o|F z_-OBd_|@nc6V>9g{%tub=z1Rig!)U?FzyVkmcNuenn8A|wRm=YA#3TLj*9DZ>p;hZ zganB&!eVR~%C?eKr&)+4qdAAt;>7J;QzI4n>Jvrr^Nv$|q9|HtEvs)hB+f@j5}8S9 z1tJ`UE7+M;M){SO*+jc~Mm`I$zY$GHnl$T92)LGHVJ-m*8-g+?O zQ)_+RDI#j}w62V1?Hmq?5!fcqWyPpWsuqh80(md(2nQeuIiO6097H>fb7-&vCnreQ(=ygJ_=9+uzXJM!y_Yjie6m|(I+bQ-$G=!YtW z#Yp&^Q4<8jX2DZs8PE>n9nfY_2~C5cSrGN7&SI}zk5~SxJF}=;ab%@D*=JwOD z&-T@&@P~kx+kDfQk)O;}4zI3Y-@5p))|P!1;onTX06Z6YW323J_^01|Rd0sAQ3ah$ zhHDa(@6|a0OTK}!ic)FpWOdZ?Sw^G8b?0xZT(0y@!g@jHz=MkZ)|4LxkUW43cJJPoXx>M79#;N$~G5Tsxm%=+UfI2o9D4v6Bcg ztdJULD)G)MpQ7Pn_)(Z**&?OY?mlkd^``dI?H9-AtH<$6moYDkD(G?8vL>gq7~x63 zNp!@Ag-B+ES_`EG2n_|P} znHq`eDf$K}DBGPf8NOG@2qteDV>`$Eh~e>QGH3F4(86%W7(xyRB|l0!0vp6MEte0G z6Q8fPrM`*|pP$H4WV3d}hHtArA6M#~}!gWP)m)kHHgTaC@|f3w>))On#!9W^YxvsPB%lE#90$ST&T- zh81@POW7oqljRZ;_fC*2uT}_O>~T*-;(kJ=gJ;%h?uuL0*skSea1Tb33hpf2L61J1 z1tW=!rVNis1e5hRz;6@WuD{z-?8K0}XXM}d@s5=AUPW~M5FfZrI# zhwZ*G1js`9&rKC6Yy@U4{)(^@D%(bl>}2lJh>hFkiA-JWu0d<@E-QHTAxpYTye}K$ zKo#^D?7M_7nfBs|%xdb9*2diH-wr*y{_Nnp9upJqv+KM~_h$opho)t-Qmg8#3tlpX z{m$vt_goLP`5xvzoA-(sXWDyE5?eRkLKZUsdg|)DyYjo{Noy(a#(_VjjOF#u0p`^l zQtB7UMUd52AF5FK!gjDQejhXiCu|!_Cm=zJcd~Y}eA64C%ha|Kdh<{o(hvo>CovV!}oR!d8 z+wSaHs5!Y<5k+UgW!*w4^JpY>w#CIMs1qgwOu!bb3dj5ii^msVXrm?LHYzx{vCEWuF476Ek z&sL$t;b6MR=AvPHWTK{76G{o)s1z$0LT_ypSWTkn2uoQj>3t7O-T~z{(=y8*0ILOO z1HyG%l{d7cWM#bg<5>-~NRq0H@3L%Zwus1xsU&~SS5c_N_Uke+8=(^OHanxqM*E4S z#}fDO=0yS%EC4}A)hTb!50*Q01-`HQS1y7U7;j4H2O=5M_l!5SRr(>{$ecbHtasrs zOn&N952=uvRI<=wfX3g7>jq$r7g^4l{h>t0&U|{s3#3+b6ywS5J^r-4mS3tb*(i<_AM;Nr=fI$B{!7uPL(Fok&2ru9 zDtn3;=02_4{d9W6)EkM&fzv4B9>EVoFbbp^{|JD=Kp@R7n)GitLCEY+k?28+b48G`Pb-LryuswX5>Q~z?{N3 zT^Ilj;L_0+E_~s zeaGDci=P`4YXZ3KnO>rtA38hzU!YVdHf0WwEt(hN24Xvf7DkDrJJ<5k=}6BXZbm@$ z`>PU-bGg{M9{8>&6aEY^komhXIG;#6@yN~itjxnu*-=dMEf|Lp9(IgO=zI>ku*m}% z5u<+FnJ2-GCH#UfhV?3r4u z$>8(~JGRdzcKDdZy>?S<{#d*2wh@iflii$@qq!%gSVKm*O_*9_!Y8`XePzW~uHkzstb6p4xC^cmp!0>#PE2ayk zsI)rO+TfYGv4-*G5`4WDELPXnckeI9t%L%;X#w-00fqFL=3lPK*@p!u{>MX!yhjLwHzFV%9A=A=b_<7eBf4qtDR zipNuCxY&;mc-hZIviau2ik>AN1hvD-;`yN9Q{#^>N=Xl zvDnSRA^ZNd2@0eQ$jtCm3O@H@vI}hpBck?D!1{5 z?T5~!VT@_f>S)kR%4i52m&=dTo9>Is`%$}#Qc`d-kQf3gkW-Y+u&GLr%lY}TA2B83 z!&X=CgeNEPX-J5qxn6*Njj)v!OQS#?jGinB0}t9OmK{Z~z+fZIUa)DOUT|3|ekV%Q zjnsFSTnv+?71OTA?KeMPCDTKLU?YA@pTlSyyW?ii)-OFb2_9%HVRUq`for4JId7hO zzeF;@5%P3tVk?!dM%FMOpJMb84k3xuP&8dWrU*V}S1%X)so+b)0A{`s#?3&SB zli*UY3opFP;1lkMh7%WNfCwfrLUCX$ph=?lD3egiI*5f0U`Ou|oTXOkA8Cup{KFmvUQ>9(Eu1R58T#kShf+Xpq zHyXJcV_@{~B1xU^$seLPNTE7)zub@gzJvWlIj}s9q;I z&)=BKo4?VUAi*thg);T3wvS@YXNw%bR%^^Tg29#;EmMdrmV(OMHb?;}DVF*Z5>P%a z=gneYX=TFUz+b2*lhB`^z55n^=AL)vW=H&>qpc=F)JLwNI4Aqd@F-1_kWYQC#?y@w zpRDGvLNkcR4FnkFfGtOBKOi0VSYo@=Klv<-JUw5keS41o?=<@5x{#_bDn&w~Gd)2$ zT9wFIWwj5Z>cIU<7z48_2{@o+S-ZxYmPjnF%G=bjam#4n?2CGZ5TxtY_ za%y7L2D-eB{W_o{HxeehMmoiaM9QZkJfHIm+zK$WR0*3DRWUDcF47K?0Qb5rn<1|N zCs<~(Sbau$QI<_RYdb2l989xFbFur%C(C)!M_K`)F6!lkWQQ`rnB3vi&J;?qauHX} z0Tib&YC(S@4XCq{V#nHu#V2@+u1y32eIJx5Y$0d8+%P5%H5C z@T#S|yVkwMp0&8xBQN42jf?L(nGbZ3sXh$Mt(-HlZS^nOxv@)ZAT&;#L32W#6}p7U zPJL0xmKmB@6d+0Z@a&?1h3jISrCC)TCR0VJeF`gZW2U#WODaP26}o->9qQ0!W!<>6 zsz0M!j$Q#O%$+7f66<_n9p@G9**MJ3*Q}zc&40FdpYZ;4@Z{)xXA-NS9Ls=~g;6Dh zj<4hKjaxIwmatg_Z~7=CeNXH`z^tX0V#6Lev{3eYrg6F086D%`TF=`q;zd2)GzY`P z-_{j`&=LN{3Bhz_c{064*y9@#EOv|(9|>F#Vj)=$r-LV74wOtsVpoBLG|ul0gy@zb zMCci@7$eKIq$`sZY4;8GkuSA|Zd zguDrOfPtbb^5Vtc6OiZPWVLYU{cG4QK%WF%HCk?MsjE?%JnTqOD1D;XPR$W}s-J+5c#Ry{h zE68@VfmmI5*FNRvM|T&HzEP^30=q!=)v0Nq#3ykPmT)={2#P`}L+}%p#tmi;aguj1 zVk{ZUO6Em(5xJQZy!m_B;(xMAs3S1ai;a`65!LL(;D^)od<8U*AP66VY>a5ni;9GkkEKDZEnl zuJ7sPiF5v`S0h?v=FfO&<{3x!mTs-an}dezkdR#lMY|krZTOu%Em$^?*FzG~zYagU zjNStE@E7$8CH@w6aqUL>9ac0IsxH+hI?{CAT!riTmKv`ZXtqgcx~w_Nu@d8{mq#LH zgp>_Pqv+UmrxHZk7kB$8M(4rWSmqiVaU#&KR)#Z&W$_7Hn%ujuX??_>`g%V2tU#Y$ zeS3KPo8(AK;Kpg(^Np~>Lc~{_OI?7JMZkeaayzsnVie$Wh3(^G%c)9POo@C?BK`an zZ_keRf!sPN`CE80r{AUWqWQk<&#Zj5@8yka6XEF|Fs2KhH1%*Um6gITBL4^dh1^L2-^xwY4 zTxy>S*zGyK#f|3q+3PzWD*AJf z3Z`_EHFZXt^flm+Q5x8J4r0azB(lyd^c(KiTYZ0#esbjIJf+Et(IhRigdd|obl!0^ ztEuOilWXBYo+v;d?iG2Y^4$>Kxj>AyZjR`$V%-wIRp~v`?JFl&--W5Cw+!@KP@d$A z$Hdooyp!0%oEg+OQ)2vStOv82+~Qw4Tn;t8L&yG(&=8Xz|B`k2DZ1hJR&L2i7G1`@ zK76deJ4u^)ZztO64ByedcQAqe?IcqpgZJ3lDT#4b{;wj~-OmBG-I_lP`nfY7*=+ef1%*k1 zbA+iZm=8A(RS;{K#Q0~FZz9K=-z6s=?M}jM;`Gnx{=OHelwZe7C%b7o`toD`h2Au0 zvPz7bAfKP{Vskb_9u1>c*UF%Tvj!$zvDmXxsCk;@{IV1~?~LDxLU7M&uKLQVR2nH! zK311Xct|wrCPRu(Wx)c(k&zW4L@_yovAYTu*O$Ni+X|X7R8M}RHnV`gy+fXX+gRob z#o~Xn&p+kiFTP#y+q)TD1s*BqotdQpIvu{>UDXmrhsu8hdKyN(3EDu)BC zmOC%2;7uS{OxMmboW#nLV*-Qn-v+pFiQQ6KwE)$9aH@HzfzN%|+uGHsC zxkNr>$)8nt?)kNKr9s7VbUHmz7%c3eF68k*$b4U^5y{a`Q%VA3I5Fy^AV|Mk44vPA8KCb1@yHGxgYM2egHF*- zHXpu7P#hWEP?&)PT%=x?m3h~tEC~sd@hC)U$J*;dtQ2F`$%R?P+f&i?YF4)XHc{QB zKc0QCOb`mc@9e%#BCm?~e~{t!u;E}qqmj5b?QN#u(>l6-*K1DZnbNzzwhzYASkqQT z9xXreui2nIH9Ga^y>1`-b{`s}Z=PJmn;_n?Fl`i38R~%AMOOgDV@l)Cu4Epdml*T0 zSbI83KjqRzUmTfBeWPKv$}F6h%REC#wlhApGBrCXZ?^#=`J{=SVa=*bOO#}2{uVqiAifi-_sXhoYS=`1;W}urE>dRg2+(!2 zg#Y?+)wxP|s!)NolLam%Q0g2Q{4$Vb-cvnqhG%{DGagM_X5Hu6`SNzk?8*X%jI_R) zh3x0wEM@0&|Z?9g@wr_uD6@=_j3&#vw+bI0%F32{+}S zVq!p6!oD?!mBIT9d@{Ea)4^&{EmAEU4@nET%O;yPVY=^tEVI zZw_qz{A3%NmSoT*3`4IOrSsF7zoC&10vyFZZt67hg3x5YO%K2eqH<7JRJN|x!+no` zxjUYOR66iMpbUnV5z^LiZdA$j0`? z^V=HWQeLozG`PD3O{GxMP@0v;kd7#Z$9Xs|TAETe#SZ2@AZIc9o+w~El#F(9ho3tr zet7CP1q!n?*OIGj?NL4{Y&l~(@Nbw7n1ZJND|(fSk`p_sJmshKr%J%_`B0}L@pk<9 zrq0CGy;Y9}-U9Z`?c-vN+s{8ZcZ+JlDZ5-%gwUtjD>D+MEcq!E*cG&iQaq|if1RLO=n+R-=sdCzr9TUr!2hc{ipxj zr3DBM`L&13VBuH_$E1V-e$@{dj{gWGg=D`Wn0sN>wgO&Rj_6!ryFR9=%Mp|$D8V?g z`fQ=F$w^g6AA>V+Cc)9RRW~f;|1gT_w{wS0YcO{ytFpE+h(XBN&z3RjfX9+8<;qms<7HSP$+uc27sD zK3jTb=WU2t&8W#1y5U9kQi@e2EtGDF?pcW)Eq{q5&cHPbW#vs6$`MnUU|$>FMhu{W zMNkz-D*er)-Zvb*nziu@uDKb>Qku~mk_alz`bOR0RV+ejmUc^N9{{ag@^uG21 z(SR~UW$+^4qs4klrUul&tZqZI1*X88C-9w{dwlWr>)f#obuW-)1FSP#ECPd(q)Opr zu+2ff#f>{heD7C&gJ&^R3*wApl1R+vRmIYczvOK|zwo%@kP7wRWgRRTlJegA{F%Ml8y947D-z zhCL?7hm1Bi2tWx;ns$~(1?)8Nk6&K!>aAUF@9p6bct&UmgTgRA2uy3qg|pCTnADPc zlPQe0ki!)Yj`w)Eu6g_a^=mwP-#PxJPkxja*A3SlWOZcY!WioS)rR&TZ2AHcfkCp; zU!k#{Sy8hw=<(5QcyxP>%VW(~UVo44hchPSg2}{FVNgkrWVnuxg1LuaPDgDc+W_qx zgn-l<;XNXWNGS;l-1j?JXoXOcCwOf14+d43Qyki?t&lGmwh94AlEerpG7v-Gp=7 ztE^n?F&IF)DnRuSC(smapYqyd%mTc-f5?Be7o*WNzqsDD!0U8=l5|h#PUok{=juA% zoG)1hMNwhgI zIr9hy7G}oa1?&P}zk0~;e&;Gz_u#0ISgA=ytH?Z~u{F}x^n_zGGsJR%7M`-Uh^)`T zOG=d@q{fvC`U;xqA)-9yxkt|P%b)o$&z}`!zy>hHlVTCRK}3m`2?9ev(9{l-YNCYF zdTMWR+TgXK0)FGATfBN_!pk=fxl>4*-WhyZYsDpCy+;X&k^*lFlxhc*H__vS#>wOd zhyRXfe`l^8!7J|_@ya{5xw$)|XaYhGSl_%rf#*ao38G?%XWOK#27_~v6Cs#*k4-eo zlL=;7vZ^GqTw>ysryt+s#U~%&g~u*)hW0l00}KV25OLL#ERiI}009A5XWKFtq1fHu zW4Lu5tCRMi;U0YBYRz}APq=+;O-Gzy?4yL{X?3iMTQ=^ z-li@*zFwe&Bd4YpOUANdO*TAt-x)sn%!9mmsU6`gn>O4a0!YcBZ2SG5p4%eDVeo*X z@}8*r>^jGZOqok~?HGRhrFZ%E+t-;az@%F^a>{txJy;sh0-}Sag5?Pb9)o3NG^Dha zB7n~O)KL*haL$ovfsqY3)*18X>P8nla~LLo&0LQ>ZrlPaWu z5F0|Uh|}qMh1W!-c=rUpa`lieU)|x=-39wD!{+O#-jK4Iw>!|$Bg6MU0@Allpkr*y zIGk+zT*uU)dMPqX@JbR?MlUGDony+|`{>4j6f`2V4{BoCLxfQvglc!BwMJ+|P!W|T z_5OJR%AZDT0I$B`!w1TB3!*qp1)SD3%B& zzyvr5@XdEBzWnmLym$MEMWqn3M`lK(Izt6X)G!fCVl2spLst!IQG?VpSwfR##5}_< z3v#6yXvOmAkPv4yV#3-`^5Vmf@CzS!j_0=8LybKTW7R$c^7Qwq?FH@-E}(=)D**&t z@JuU-)k9nYdmdiC4liAA`0AV2StLCwl~O206$5qj1Oi~`CjlEPngmwX#yoWK9GBK1 zw@^-@EY}~F3&xFKOcDdA*`RGS0qHoSSI{0@=O@_TeEs$4 zGL7$L#8lIWjKC@ZiSuocoj36LufEFO?jaxlxlge=go7j4-Lo8?%$b!nGy$SO$fWIl zU>iiUKorOH>M8e+4WD@O0eRY=URE9>6aW2wV3Y^7-h>wD{BV2&sh~AM%ffNBH+ER$9Bp8K| z8m|;K3IeCK#IYTsqI`+A3sS%2(d{9>^zrBTPY|EF>z;ttQ#5}P2!*@k(nWsOQcYY`(vaqG_!`JmJG7U zV)-7KnsepM3ZHuaqx{U%_wmpg^nipCNsWyqw(<1S5t@`>6`=;91TptGV2WVk6{V8Q zfp-dc;~xB@FMN~ZA~0P>5Gi>wCN&wsMw+U|D1paeafDz|zCp%-3GHy4Xbe$lqA^G* z(TKJqN(fjSJ~y~>idas$Jk)&h@%#An`yb$mZ5T!v3CL(r1QZ_G_97twRaKIiq#eNy zXqAFaD1nmz#{#Y%!{=VP&X=yV@Id+xCn@X5Vp+48m-w=Q=Coh2kQfz_ z^&w(;OfG63+!*rw{bzXofipa@opZ4VYqZ@h+TO;lttZv(!Luk%d;ju#eVA+7`sO9= z(2~6dzVw~jeEy}Y+&r?BjBt7d^oTS~(e)DP?dg=iwsS?K{dmQI@nm=D7#A_#b@w{XD zjq|MvUb`Fk^7n4=(z|!4)qv6&a1tRBQkjy__T&!U;zL6Sj_BKgDM-w9Z-}dPAJAh{Xvk_E@3di3?*s{r*Szz@ryCXQ&{4d zI!`H5YSq@wUYo#;BlzOCUgxcwyBtiGjKwA3jojbg>vrm)tDYF4b z6*xH{8*UJt#MX{P29hii<&tFR$wrbWEm_*f6q0alL2cU2d`dR@H?-(&8s)|IkXa&j;Xx@-ABn36(quXgbyh1QABLhv@d*412o?c(5G|E zzyHD~iuT~7Q2O-1q(TUVvjHU`PbFGg>f#VzAG1A9xV$ywXP$qYE9W+Nd`-38Ljc*- z^pql3n#R&jFO=Z%_)vndZDohJ51z7PZ8c7Q8@8 zjnoN2gIAVpq#3WJ?C)M>Yt``VgXdUHBE48Mn;+Ad1SdR3Kwm4?^Nj6&&i{U8rMn(? zIzL9bCv2zl6Xf${h=q+TY-Cbfj*6P&##01=m5RzJ{7TN;JEBh5Ijp&}yI{HuG;lgv+TDKuOc$}@MWrRf2AZda}1Vg4ZhBmOCM0ocIzH;?8Uw-!{ z@6000bdx6Aq!B%;WdtASClR9xg5M+SS8Se184nDr`GBy9>|dX=zta%H3RaJqdEFi) zq+oqjk%=kGy{nkzF7La4o4@dh5Amr7Hrb**cvnP66&y+>B&RPTToqVJC9VM?h^#F| zId*|U2E5eVi}0OyYQFXI>s-CP$Nth&h!pY_OmBr{X8mzQsyaBnH8L?28alcvPF!krwDhKluE zqWzNjNkJVmnxF{IBSJedkmyf$Gy_UXeh|n`M_Wf3kwOziAj#6UMV-_{l@OI`OH7nT z$cWaG#cV<^m27W}apj!Dy*rGCIZr%zi5H%_k4MiBczPW+fy9BFpD;=sXs=nbkn!1%Kh8&=K2HW%4%rNm zEJT#fkt9eIO%qYUkg9f&j?UXU?7bRhJ!ll%1KvJt`207n^Ukdk?(H4oWJ2Cw!>ha< zV;&?)k`a9%T1Tu)VpAcShUjYWAiX9AK@4qx7DQt7CWEh6Lz| zKx#C#F)U+XAq8ZHXnk3Y!!?jLd?ZR@;a1asP@P6W_I5-CtX z^s%k;1}YDe(jqfMqEBnur|_Gv?{js(=H0vd>=m9SU%~g+DRf2?Xnz+I0nMCV7C5(( zur<_N+!!+)Dd@Fb2VIQRZb@SosL(JpFxHa4y?U{`E_XUV2D&F|r}Ja#zgUJ?J4@*; zmA6zeQXx308mg$NNr*{K(5fA!T*IP`uoK9OFG04N&~dkAO%6524|fTjRtK9QjlaRIx#f9p(+ayk-V3p5H!^kS z%4I(N+!K7@A<2Cij3bOh!GIEIAlf!1$%ML=lr<#Th%_-2^-(+ZE?>h5&2hvN`@mV=_s}ICJd?BCgFbCtdvIVHN3J9)3Vd)RxuLQanV273AZN=3S}Amva{_#O z7ryxFRlaj$k6X21W=0fxL_>lwLtF8&0W@ClTjUJ<+q(6}4<941-*;Ewe z3D_mZJGSzik&yiRTV0Uubbgd|PtZ>1$IO3P#pohf+wPJT-cd(SEdrI4EF(CR;!Qh^ zuB_l>4#!6gv$IR2E+xvS(<68_O;w>|Adv~k1ayW&b3*$z_z7^`!PWhW-~Q%RZtgAE-JjuNN|LXE z98lC?>p<2YV(SK6gY*@ym=TL9$jGplQ_c#64+PhiaERZx15IqpA0Q${yOSuTLVoTumw)dM3q@Fl_`R?SZ^ErtszOE%?rzJ$8#F zOB`N$WGpzpG2neqJjfFlS6GiwDfq&?;0tfQ&Cbr0L2Y=r$$41zc=7xhKK9584{t&& zp{b^r6{t*PNr}WDeI$#TzDf`=0WYw1WZ@N6Dw!xaP;hMyUw^0IE3d!JyZ82~og&}7 zkFttTI}nN_$x%WR>hS+%@4tgQ%ku0#>~q~SKbN+=>uT@aO!v(6xZT;^+1(*_A&3lt z5@8q&gdAmpM${jW7z_oVP=o|hAqM|pNI?pe2x$cfkT8q&GdsKEO?OXwUtL|k(*N9h z?^^wFUuMq&q(~48U`?KgjH>F&&dT4r@8$2@bIU94 zWxtx$6KC}m_Q9d7?FE2?8nH9UM~ z#HSy-z$YI($HfvV9D*4lCTh8XwIHz6g+|hml7--rx?tIOQnkWNNbY*r5^!w^-+uEh zzxV0~ynTBKq6SrAghBX3>=H&8>Y}2ZFNnbteaH&8%tR|V3vG*V9nyPZ-{2<_nM8*O z!5{rl%R^!5h&)RvNl21ZIoUy~9C4==q9{m4k(9phe&}1?@3V-gvO_W21BEvm2j~!*t@;WBa>773zr_{^A|U` zFo4=ZnG&b~GJx!8wa23AlAsm?3QM1d>{TG5xF05=2t-~-2ReD8JMys}MDBZ_j3 zkPMxKqAD?}Aa((}=!mUF*ocae*tY24AUcw3h+#?cmY6ImO0W_c6fyanc^w1lXn-)U zT@-+jBq2#cWh+jS1R2q_!6Q)RfU=(8gvl16vZ5XjL4gfR5-nO=6b&IP5VQ=X0~@d@UrK;9H5yqVHtP7d5i1u~9&`$4b1*#zeAtW`k4bHd#HX8IJmnn*?!bk5SrbD>rUGErINBJYDhV|# zL{8pVMA+JgkFL$wy*nqg2^keC6a+7c)=?1{D@)PsQ@VZ5k0cMA9P+tm9^n4dLoTjB zK}4q|m53NTjsnjJ0G;w1zQH17&h=daduV11*aO~Qz&Br>@~xLY;M(maOI5?lDoB~5 z@j|2y0c|^EYjaeE^(61`K4N3Sr@o~yrrcC$7wC{<&{D`>BSnu&xr8Khv0l;SkVp#< ziG(1@3Ly%m5(3y97m zeU1afTas&u!9uj8=m^2(%JQI)v5y*zS^5>}4-OF`b0S6(IfgI^K@yTE1*t0YCP*H7 zqbrmykV=!ZMArq$2$GIO74aevr6w<%wqqg! z(%H;tO^FqXJ@09ip%Q|cT`B^B0!KlhW&zv?aCHH{`knW99=G;2>Tv}ms1xlGyP|9A6@7e`z+ki~elM(;^>A~@P_A!p}M+Cq2E{QfRCcLd9BKwX@mT3u(a*~_hgJ}a@M?a^vIwnN=_yayxpbvi!5TzoD3L#aly;hlA zCr$5%Rz$5bfi7z(itLXz719(KsThz8TDqd3Q-V&&oFy!vkRHEvjZZ&to?rUZ1AOKI zI14BnDB_e=r5U9%E8r#&V~2}PE>V#cLX~v0h%ASA4R;!N?d~2Q&URsa!le@@c-(-p z@aEne7c38*Ugv~>!9hzgP*6HrI=bXgLNiE3Zc$7H5jb$*4a_4PNN8kEnfThTzFKBAm+r-60IZIm$;K|G2c1dfzvfg-A2fmRaCfGAZzW2n$tql^Zlh%)C#$5KO~Nk$R0BI;bG zBZVd`8?YV31*?VS@V6-!!c15L}^Gu6LdjPiljiuT=i_H*QvT)9y>GQm!ErtpMG@0DL_UT zcu>(Hq^Hn{N+z;fTYyiH3ZMW5oy>!m+b%H|fuYh|%HlOU0qQbubfkr_KV`Hr0_Es% zL<9xj-%B#&84 zk?vyxjSnOjkS^pC0v}1i5rfO811S(wUvv}v(OQv0UZb8sOZqDFf0#h`%CiuPghr~G z)K@?XlX?q|B587?Nx6Lpeeu1x;jVVUi4b*5UWBGAXX}_~kL5c;rDIyL5&J zHU%eTAMw>R)JlN&AhUHLiJYKe$&QEMXBchRLvzat=7nMh_~zU2o8Nzzt2>TGsz_>p zu0}{zV!h9V**kRTkhaZf4Q(dT!a1b1xgy*-M6@L55W!~B6+>1sqwfdMLas7A93G4b z0m#0T1Nhjs(OWn&F%uxlqlh$A9#|7HE0kzOI3&=fKxmaej6rLSFKU>az>5-zLhAyp zDx}ePo$$)z+?3Ugnt^I@dpB6I3!c4vmM?wcQJy}Zuk)Bpd@DdlOA$PU5Lp>VlRUIO zfYzi!;K>5K0gMY6t!P4`@eX71P@qbIsx)+Ni8ciZiSH}h5qbYIOL;i(qYhrWGUXeu zy~C@w5129}sR_6OJ=mm_6*4BeMT70;xsF{0L#F651owfQu_XQerY zK#Z9rlL9e7Odb(zPnvsM&Qb2h$2N{6K#&P^_N@26CWR3dAW1rrG}*3E2%_ng>M|2% zp-ZGHkt!?uT9w4Y&;|#i0fW&9qcrVuPB+^FzhtB=Cr5%`{=&0->6wakU=lhm6oL^g z)9IAq=sY1pA#+1LDdF9MlmfCS+3OtC?AytM_dT;JlyAAH0cw=8$M4Vatg?4mOK6t}A=xYq#lakR>o#K-xj0FD`mr(3J$8X-F0510$1_{YSVJjgpQ|iL zQWN^Ji9Vc->|E`b#*T%YumybMTIBD4`%T`y(UHoNnDPWEYDAKx(9zjBF*HyFYNZg{ zGi2ki))Jfpmn|E3hX{exHHc`zcBo(xF_W%Lq9c)<;BZKw56e_?9dtUX^G>3VMH3&l z+X0BE5HdIHC6NiU=p*ft?h96w%<8_9pd?Z&lu}q-6IRZG${zGmN(Ne^O;)kJa;Qnc z!SVoU0xOdtW$>hC$;M#Fy{E?f`7fVhg*>>n4s4J~HEkfc7FC#BFD^C4s9ZQ6Ei!t9 z5G>k;;c!AiFtv_o3`*$!PKxNpF(^u+gWYAIDHRN14|sP5ukA;E{d+&+l@C5bPfj5R zr`X@~5C=?F&e85J7!);HB)nbH_yt{BKv+Vvq-qmo8}P2nNhscB((E0{`%I`~9s*4% zL2uK@ohcTg%k|xaBX5rEzjq<>+U6m`oZuLx?UNtO+;gJRtQOENI|`#Hj79s zN?^4h^f7co8N86R2y9G+g+UaMWQP$8((D%1@-Ck|zs@f`|0JKfe~k^3(>hfD{2ZPN zR6s>QM^BiwsNoQV#w*y3iKP@Yz!Z3S2fqEz$bisN(;?#J;Umoe>_xNKR2N<%$=i&iCOE2QX}<{xfSTDASAeU8yW{6Tz9x8!6Kld zq*exvz_}I|rs$$Yhh0>Ahf`|C=kGnmSDt;8XU}Z1LhqR+zxjt05kd51C4X;+#mbhP z2GKhJSOC`oyp!Oo-`U~2KYWQc2v#=FKrx^V0*@jkfom+W>Ci4Ph*0=|SXz7&=&Z;w ze7*zU<)jARWlyN@GU@7-%oHOc21tn*$juiir#WN-?T^Uwp^6!LFYTfCnV(RfNjc#_ zN=cFhL1==~L}9YuSrwrA=sKl9N|XdC1xhKTR7h1LOp&L&OeWnF8d;Xe!mw;QHcp?U z91oe>7Hbm4%7`|47Q0)lr-rK8W21)W?mx?yo;=TE!>mGwyLWl;Q7a5cb-9sF>s;|JGn@$RhyhU4?>?KX%A>#G|S zs%Cz$plcna$!8LFxx_6RWZPg`i|QQ8<)o8E*W#nYyN(ciUX$SZH4Gn<>7G#M8|^2& z>iCZdbm|GTh(})Nc;to7n;81c?!2DlbpenHfkwyzp>ncH5{4vAPF2y_l7p5=tyL4aKV%#~ zRL3~RKSO-o#K;CE=>(@mVob{riEjc*6bPel$5A~86kPeA>1c9h?o$)iWz^x!f`~Lk4SXP z5n)1rG&zS^n5;y~?43m%5-$ZxA$tO?wWbtM#Dpp<(r|#S1~jI?7bU8yFlB|-nn1`l zkg6co25SV)XbK4{!J!wsFuzINY;kGe_|(M{eCg49c;@^WHc|qc2k;OIN&_;JuVw1! zM50Ep>P*g}a~+HdFp*`~QIsQgy2yu%#7lci{=tV^eDlUOdul?xd6DF5DpgV?2(860 z+N|z}Jj3W+#C09Q1*(uJn--=sie-nCl4!pbLLb|?I;rH0AVr59n6RaONK&nax~`DWQB2M`0q@_ z@q7L;j`4>C{ZIZSj&Y1*{8!dl8dG7wRoUZc`vq0dfS++3j z`3nJ}1lQX%vbvd22)1m)QdV?Y@Y(`?^T*eD@uNHJ$02EW5s_*V;8IVX`-n1uM}&}l z&22~Q0^TNK=Mgby@g|>%ln9O(9Vv8uDg%&YF84?Y5j?4ntIH($(5?~k5FsF9KoUvx zS<&=LbRT<{QjS4OGJkDEBB-pfr|3bJ2t*!CMCA*iilZ+e=)S#kN}UkN(fWXQ z38xf6lz3t25a1dH9fulUV6{BWbUPAN zK-P(1JM3&q6%*sZ7-u8<`*V~TASg(9Vp!s1LTT_tw%njfWTek#79Y2tn&Pqv@8f|2tkt45En~qsA#<*h}>Q&V&0623bYW+LgXL3z0bEl z+~>JV9l!9z1wPq7V=LA(859un22CA4WBElPOx}ns-GahMPE)a23GRPl!e{Pzg0Hf2q8!^Ayw#!m?8;-kXgNq zq5x@-+K^QCluNDpfkJ^a8Y308G6-p~MU5*eY*l0HDi3d#l5$`WS{^khDqT=iHBuWC z9c7xLXLmR$JD$6+!OuQ?fu~MYYy#3PdV-$2R+3PFL?FpU*0~@>(IH~LhEWisCMA($2nmQ7at3tz zN1vTM2&#_OFUo8{PBJURxn;7*zICaHQXzCsSxH)F@+|XksMG~of)WC)4U{#psEE}F zUzVhDfGm?f)WuWAxKXu9hwE}X~~1DhA-ZGn$O-l;gSZ^beyb8O!)XU z#C|P<%wn>X5%47M2{s{BO{XQ-mwCwZH{QC#t6K}+*jh661x2w+p+-n2aXyjC8Ydu? z4pA&gYEC_J+;?f6M=npOfwc;T5?qs5E?b(;;X@?Gmen${F)G*?PWab#dCUQhag6_l zIDUAJag2XT_`kL(Ey#rxd$wcVb+jq5STuMkNz$MOV`Qmu0@@au7CwA`PS?P}-jdmF zONs(j3`hu~Tc8J#)NE08Gfo$d$2V%8yL_4#?z_N4Cn_dDK|b(i~#;Hpe5GxhG-S zQ+sINNKy3aBe{mVS4^eJgeJ$NNu(&Uj~3mhHyDyqNM(+aIh2t|qX~L|FV;x9Lg|Dw z0%;PW)TGJ~ji#KeVgaQ!^`N9S5*Zw!n^W06)ZSY>ci$;K_xPhcaekfC1x(;55#>mX z?=8QYyz$8=2{98@1f44Aguvyifa*WT0BvwIArXs$De%e^e*2~O_|`kO*a~YD8y67L zu)8y*Sy~3wkWy)4yF|r^aE|0G-bF%y)+M~l|F&+YDA#5Ww6ndx*@DXiS`zz24x8;f zF+j{|DKW;(B;gMbXi~^3w9K{a@yN1%*do~zXaQ1-pIE<-33Te~+4F#BPF0Cgk(5D5 zi8KYMlA!Xhsx-)=fI<_C0$G+Mqflj$RquY|q|~ART_8oEFb5d&c*#?D69DIqz)4 zmK_u7Gnm0DcCi4NP^F|Q1;Ni~?E&QwR@X}|-*b|UjhZu?uu^1eM>mJ%?jFne6r}`p zRkBtMS*>eMREmGKI<|Hk;~4+AIJR&c;~0O)_-dQdod#~rU@2jiJo{b8B07ZDw8o%{ z0cBky3urCu?!eYgBvBEz5gsf{m@08 z+?+506am|HP#B~zAO$(g!6N8LVS!f)^0*%oi9l0OQXmi*zWakWc=gtdyR(RxY#{X* z*K}wfsq2Ea4QP3oeBqHkLf+%G6{?fMzibxVZm)FFQUvy8N`vvRog^v|@`W%uBakOszm|?zEQdV?@ zG}-ncvo}fjh*Yw-dB{x6rRa-vN`%O19ukR4F_+s!Pqa2?hnqa4n1lwINJ-~gsmu4N z9t|0eYTDTjKYss1ZhrJ0ube9Q@Bi5^B4{u;6b?nmjqw-+hJ|$~Q=lX{^(Ez2M4eiO zvE%7+#RKD29z8qZ(W^7Q_SPOhxZZNhZqwQhZ8TbIqU%^p8xT+p*NCm-&ea*q#SZJ6 zLk`Zaa{jbna|~q-qs=wS@sQcHWo|9g#gtv$(yguXe{NFxEA=snKE^Trad1qak8zAY zMErZ-ct71Uv0L7bKyX ztd^9@V;8%0ivucuz>}v3Jbm^opLy^SPo3Z7yoQPnfyD(+QC4`M#S`$D*fAhc0kx`` z=kPE>Pof0@B|0huE0p}gGmmobz3{y&d%SdYhn?jVGg`%K!JYXs$AR_5CG=KSL`0IZ zYxpPXm?a`}Vj+$=@qalYkPzwPM23GDhfRYy^SS?3#O#lb`7Z?=DVT@DX1SSA@Uf=b zr#kfHE}JC!zyF87$9|A49!9ANo6|XzB$}*VQk1!wQ5%NC0g6E7JBnrtGrhr?((#$g z=lJx)XZYkj8?55cbjTEuN#y7?sgW^Tc+%0;=s)`F98yFomC0%9V~_jKJyf4fRpjV9 z926^r>Ci9yE}L`O;i zBVD$?NRQG$?=en6l6?+&?;((g7;_Ru3i&l8MI!YZ9|6fD4&&+$OKwtr#o5=K`g`Ya z`*OH$eamD_IgmqS&-5Yf%RXv)WjoQ^)**pBtPJmc_9T@zO(~b}sFYAKA(G6&AzJ2( zj{H~wSBfAsMNzOatT8Fj?CoOgk_S$#bE2xL(>9U@PeV&Y6DUwUNiPA-NXXpQNW?}5 zDk5aeTUn(cEGebsVp%hK@FbVcpW*TAOTPK$bzb}EDzmOc)@uX|K_o)bgjk{E1TDwR z?lky=4!^s@Vtc^OnSzZIn$Zdjh6Tt1mL5Bsv29!Y!2t~;{>C(>Q40JIR?IPxKE^Tr zYvA}nImR*m5b!mZ(y#yCJ6zkFao>|qvl~1M5s0-x3=E>o4b8#8%)@LB`*&dX#)AFZ z3z~VrhfJbkbdW4{5g5phG}}VVx4Ez~4^9`6b%D9N|wMC;Ono$Z@>CJ@9s|V!wG}c4Vt+_ zCfSptl#i!F$`%d}-Z_#Dy>-JQyGU}LXg$(fl%0WX@xc$|e zj3Jqlq&33yNBr6l%92oVh7uPs9 zDNtd~Q1!!(ttEC2Arzt-K~d52v8oK&nxO%mKoW@}646BZ=I{O!b>EC<0NWjq{DNvw z&I_!nX+$pe`2PDHU;WN&eD~@eGqZ+RIg8UZoee}EkinsBhxQH`Y)%I80pDe7 zO|X{aTCgp6k8o{nl#G!SBEfqIkr?y3S+D) ziH17zM&~q@0x5JR@*+poC1nuG^rbi&p;fN()-_fQiMq@~xJDwhL=_;*oV=pSf@pF! zI7NXl1xojs(jrphsd3b?WmS1Dtr{M?yvmdJj<{SxU`~x?NTdV|3gs0#7>FwSR0tph zUPpq0Lt9nCqa#=sa6%J{RT>0$fmd$LdF|>R-+ya|n|qPnHWBI-Vzth~YrGeLq0)*N zT8vsyjsl|-lF8|UmD5AkS1Z;e)FNBbXZsE9be~d2HU~8ub&1>GiIbyj*+3ayTHav5Bou7a9DZcpVI;VQitcrk*nQ0Xg40z$$aeE{q zFc?ZoN)*QS(}_{Q5D*XuS%M=X=)I~QqKh1Kk%bx4O%(3~-?#$5{pMBPy*;HgD?m*U zIrrHk`q!fjOQgoEfHtS5eZ=CqV-e=Fyv-}Om(0u>b2*|-eVT;#l&+z4OSGMVPqblx4T)ea!scN_ z;XAM`(%U>p>O!va?%N1sjG5?1i%2aZ+HAc!T-TmJA6a!$9|I=@M=G%VcoUQkW9<4N zLMe2%nTWiOhXh(^fKG|E004jhNkly`0Nv8ib8igKId5BO+ zM3EaSl~PEpsFKA@x2T#O?mIEyXFvH6pMALIw1R>}MJ|cS#uJ5%3LP}c_lF>f{8~*8 zBo89tfF&NAAO^`ummCJ=xByWkkP(MvPQ^Pn1>bvTkMF$mAs@~xJ9@-Ij0k2GQ;ZQo z5N(Hu9nx4*)gecLa-(Er#c=PbRW`?p@gUpQ=d&fDnWJN%PLSp^PSzvVWXY;D{Lk-S zIpzt+IL3bgjx8L=IL3cN{Ix6dG;LbmKA59NBW~mAN)4+8rpkn-_1WV*KY*>fQ*Pav zvokN4&J!$J2nk&nloI&R5SDXv;bFPMD9m~6)QF#d>?wZc(R18CfkA*Gb|@LMq>Vf( zm`DM-D3}zhSS%4w#1Vted3BkK9GPoHR5+gnv7F|RqsL^htW9dxRAiPUNeJr8aAx%q zFMoKzcVD`K6C=DR=#-(Opv4em*0U)~kPeaZpp@1Q86?sNf{KJ7NJ?ZiPR5+uoHVGA zkNc%S#vD19$R1W91u3fRnLd2IF)PT4!^i{KpYiu+_ad7DesTyc3HmetTn`;(ZY7K| zlWSDY5e}w+BLA9n-4~|RDB}@@>xTy+N)Ig2Au$Lo<2d6&)$)bMF7UHY-_QLUx%E+| z1R+ojM_3?4O9MXhMo2o|FeeNkk$6Nt7SkRSE$C!OH3; zg1i}tF(Q<~AprG23cqn8`>WTh637wKD#2IoFL~y^C;6RM5BT*L-{H!1&Qy%(QcXl4 z`|FgXAt*u6H7R7LZW2$ zuczJzFE~u$5Jy&zC=b_A_4l#rz1JX;1R--DqsY0@AFsbWdTzB!NEJZ~qE?^`LFFv) zqzyjl{!xi2Z!yWDQ$hzA#RZq^j?X{)AkRIv$;C;oWFO)vv7{J~q9QqskG&UP_W%5m zom+#-?Vc9P5=Q{E7$P-H9Slsi=7W_>k-9g_3#WKD%*lj&m|qsQ^XaExR8W8!b@rgY$;ah{Hd85Uf*ahuoPe~*>5 zO`dxGVG>zL-8+C=A6c$nzs2;RA-NL#m=HBWMMRN^GAfPtU#$Y#Zp=f?cG&pyuiiDIJ^1lJOxK$augBv^Ejs+L(%rnhOtfRu_Bn8(C2 zL<*zWU3C23H@?mb&pyTFQzuyw3QeT#8caE47r4^}e*N3u;o(Og=iXDRlo3u!SOtW2 z1lJOa3Tq7ekBE7gR0K~<0WIWF&Ufm4 z$mysMN9M|UsZc`Z4I8qrUGEcAL{^RSdaC?;ZO~dHwW8}fRyQ{&CTlbimPpiaj2zTN z2~}limj?_@;>1dcc5~YK7Mr7*r%#Xgi=TLaivv$RRtV7{as3H_fKDO00wq=U(f~F< zEC2(`es0oenA<>6BsxE3tZM>+=s>3mlQbqjuEdl`SX2>E($KULD;3KEZYTJ`ZTQ;T z*Ld;fKG!Xg);5o-?eB0S~@`#nzN}fBZ5} zT)vO{PMl_hh(PS8!wMpw>t;>`#m%g^-j5_z0AW zsq@G#F)0lzCLa~22y&!oLPQAJlTwGKVI@S?5Oiw9Kn=L~bLaT{Bj@?l?TBoRs0654$#bXC6AmI5rrOt7(*is0+LhXaRLC z@hM;5oE-sHDmrpA-AoE*QE}z{ZQgw2HLksVg-4%y79mvrT-P!#YnuM^Z+3xSfAt-{ z`qmAee)MrZ{m{dF`m|!+!lp9R14HNYH7S7uwXT3K z$+K|ICn{`zLK6F7PlXaD|67IVGbCYe31JKi0S7K&j9{Rlb>xh3K*r z=t{Vhv%`%5Sz@hYx;$WQbroY9+!8hiHD5df=gwTWOaY@szu(<&%D=;X)sR?PghOI^%D1i+YVwsb7v|v(~{7Oox z0)AN>CwCmnlX6pMK;bkDn{EVaa^HO%djt z9V9+=-${P%=}Ub2{!LD6DCx3~J9=VFIC|f;&i0nruV(-jNERp>U>CUB!L@yO<-I#x z{pcg6cdk>nd;HbE@)vk=vtWh5fPjyleJ|N5DsBP)oB!L_c>Bg4Qq`QFtntEq7x~K5 z=Xhcx-$Nq8bb5!VJ*P(N=-?>m(=+<|^_T()2tv_dNP5UV@V)Es_rLQ#-+ucRdtpE| z*(AkC+qN{zju=y)Vxn>#xDU|ves!jw;!6 zcRL(ea-_(LvlQ9atYnVZJ1kmJ1wv_(Dv@GnY5`sVDE{nfo?4RX~l$q$RkH7&THBAj)h#>MP_`A-FT06YBxi zNN%T0pzn0>;XCj0l_wq`+CUpUckbTh^!d}QNW&Un+bQc(Fg{EkiP`ED`-nuTK+=+M zEP`ht6sQRc;4bj~9NypVc=^4%y!`eZwq~H})0EW)K2~N{HAYltR$1w0Vhuk zSX+aEh8tI}aq-Ls>qCWbGghm7+H!hz!Z1lD1|}+xQxw3@924nd{3*ooO@EAI{FmUX z%ajgWV$XSYn~wcu!$H^Kgv1MtSBfSk%C&W@lzeb~hlLaDPdjGwh+hgw6$K-NQ$#CK ze$Hw+$M0W9FZQ`-rR0SN&hzPqFY@>~&51fIg(Qb}4H_5}C5lWIq7`_p=!??mT%t>f zrjSfUCSq?ocb2l6>Kr$9QBo;*N9twg326SlGxD_nhHh{OQl~iPf5{ z<5|`yaAabA7>ibtD6t4ya1BUF2!e&Iv3kS~@ahiy){nRN-rG0%aJM1WYnW<*jb3=PA&U}Z8uMo+ugXH>!`9=XiV zJo5n0Tq?L+<)KcK8bY^3mo+{Lyig!>{fWcnnsXHU-3-bRj*@-g{RO;u&GLgQcX;>C zKC=L>U9hG-r^J%~<-h!89-hEv=vY;mgzsXw0=(0}fB1KQ#GV*4Z6)*VJx=M!c@y|E z&)&~ZKXsCmHLT0L8QR(Tkb5>xAo|h7gu?aLOaxDep3;=;H62SzLT%UvzIz3J*rA6bY?A0$P|5lzZ!n~svU6j0Ks8?B zHjz7kMe^Ei$G3m{E=&*jpZ)S@xgg*U@b~_~*SK=+CKu11EDx*|jDcbDRIWq1 zoNukn;4p?8=ME?fiAOL`9gXu~YLu7|$j*)T58%ajJAQO!i?_EM?mA6V3`o_O#>TAH z3kbo2_fRCvP*V>iC)S57W_P%BVS|&K1xBNc+SkVnYP5>8^67wmg3FG@rl!9zK8HmnYNZv3odU?_|kJv^T?**?iBvx zzx^HdmzJ=&&DpWw^G{ypr=EG3OT!VmU2?J-Ql(y`3VlFj>UP7_DbQn*9uSfuC4p;}q+WrJ-XmQghC>4F5#E9CNUnc# z@4d9i2U74kwyqDLPJ|<+QvL*ihMqtRfs`5{HBu^~6nNSDXp0hIDxxVt_mO2vQCEf- zmJCc{Ttw_*2fx_k)QJfXUpmX@pLl@B?>WswCuEKh3?3Cb3Z)U!&>^u2y!bf5IMAT! zNR;eSGXw54@XCiXzWMfbUcEJCi<&T4Ww5$RSR62H_gGop;otpNevaqXU^6&M(b336 z%b1UV7Z2e7_$xoeu3jXR>&$0M+TA;>rX_0U3J+}*{7YYYo~Q5KWYxea11iob0GkY* z7bICwn!~0;nC%|0vA#ke-(v?c*S+6Z!aFw;zxnMSaD8Xa-Tfs_)QG_vT^cZL0*fYQ zLhD1no-M+4DA$5p=J>k+#N1Yxi&PF3XrI;l-v9iMDA3|3E~t{3Kp*CLOAWfrWVu(I zIb7Gn4^x0P)T?8kCaGsxf_5q&Q$O>zi@3Nv}-U}tz z*ArR_20)p>#DfDEK+ZVtES1z0g~q1_7cFSey$drENNqwzgKG?C zVrUJ#J%!)B0$;!KA+PN1vE4|D>J*7V-bBfqZ5{hkqbMCIb!ct5_uiA-bE#xB&cuDO z+($>pAQ|c?8A-`nq1Y@88%DFHU`XO;DtXK+j`61g$2a;hj?v>+mo{}mu{B+=M6z!q z)6R2X6J3I+ON7q#zg+|r+}eigTXUxK#O{6rurxp>teRFz7%oJR_B0pddM-N_ZvulxCF^Ekf2VJyzU9uKSG`bB#BTT513_dtjKX? zS|d$G>dQ|s1;S{QPDHn4WCA1QDB_gL?{i^u$Y-B>iqAd$2oJAoYRE%$!BQ(lAvF<6 zV=X}zbRsua2l4R_*@R<;;i`jIuX%p>`g{EN!&_XR2JCQy`pi8{POh*`hqvkG? z{p#$z$^{%L9t>qcIyUfVMe*!#_fE> zqxYWX7k~P5JaW&3dj?rGOn~$G5>`4N#mfMd0HYv;NaLD5Gg;%w@B1MJ1 zYP*l}ld4ah$OJjpuj?a=&f$L(Wlp=1>aaK{P^N~$PdUG0_`*{U^1_o3@W@HoH$)~> zJ7XXdN-Id77!tE$1&c(+oJc3hDU?eAd%!K=gL%hq|M(4F`rsDMY|t`9s5Krqy~-CK z7;yh-!OX&yYmu*g^JNZ}f$3~cVKk#M@rg$+@P#KX^T;Ng0XF()()4%wyj_6s49Xfs zAcYRy1%${}F+xFW1hYCT-LE$AwYTo@{r7HiryVlyDw-~mFlaMGo0=rDKi`KIbYL)1 zY@DcA+b9`~pd7%U2Dj`m!BNG?L&tWr!{&l1Hl3Kmgdlffp96(VQ02DrQDv0ig`yW{S5NAwlAoE1wKF@8be z_Az!h6V##LzH@6lc)I47pTCcjMPiIVr-ZbgS_lfs$8lTM(s&Q1z*Gf+>`mTruxGL| zcpdoGJNx|hi|_E}wOs-=x>`lp$fO)GE^8zT=NvA0S|4b-7NHdDtE(8JSRCv#-`hfk z1uM!ikxTxDb#kQg8&9ebCY88t4?_k!Mz< z*z1&iX@?X?3Y$;{DP=!oCZVdb*V$AglgYF&*|uR+WS~9D9#Gg_&aX;->goIVna@1I z{cA-gRm)vgs{y)??Q_&cdzo^w&l+50YR5k zD<=@c5v`Q?;2|s-q?Xgn*<9S=fA!z}MV?!S6TU^o77EQCn)j%9H^N{4J1_H5SJQ}9 zG&ON=&bh&ek!_)yg6x>i_h_Z#{KkO4^yN?S&?ek7fHB!;KP0QEI6#11E=e*`j%pBr zX1|YfpCj)?u*BZyE>b+IXs7qJ$9|A79Tr8ZoT?(E&QW;sP-)KPHzQ$1M zz(g&O_5j&UIXx6S|L`Tg^vOqf;@p6Bpdu38lu9T{oueY#rX>c+U^wjkLC^}=C(T6ssGXST{qZT|V*DW1L)(e00_E?mHjRI+(l2 zv{~j%Njla_&nGUf@n@g9m!CRQa|Un+`>a)~$ke-9q9gbgNx+mUUjqb5DwavHM6wjH z1a?}u(!u}dg9F~125#Nj$zu|Ij6bhNr zg1HkkQPL!hmkKYT4dfDv4sPvv-v96xZ41d7NJC69#x)TcBchp6rx~Moz`C4re&TuT z(i)$6@_wE@JD`e=6`9Z|1Rfb9TIOoua;|TOqGL#hVhVgXhabE(=Xk|5b!Q$pR8?=2?B|jL|?hwXCd@< z07V|?LTREZNJ?d|vy$jS^`yDVUTCRNN>J!TB|2og%bBs@xd+eirB6P@6PG7UB$QZ2 zKt&*?fOUx^G)fn_0k8iqx@hrIGefc)U^l@>Q~1tXAMx$CZgOQ_(~1d3l@w)-HyS4b z(rC)kP>O`xyTP!z%Sm^azxEe@ndjF9lWsu~T6}_LFyWdoyqw^#{^vj7W>`UrHB>BE zFG~FWjH>e(EwQm<<{J)z!*~0vrWs#+;y!-v6A$wESvaR)4Hzd-KIUtvG^9ZA4HAzi zBnVH6uoDY9Jpz#x={Ih}*I)dA@4R`P4|g46bgEz9EG|p$(cWbrbjU4*(TBc;(&qtD z-w{K$bVQ$B*+1DzC`8_|<=Z9nM7!D@P79C=+LP#;o|H4AM4~x4z zFiQN)qZj%4Cm!U<6D4&Et0s3RC70VLQ9x*E+XWOFU6uqC9SNKI)DmC^coTSK25-E( z!~0iv*_pyJ4Cz8i7YeMCnBfrTTA<5bE*+>gM~pU0PCY152C4{!Us7~4MxkR}3Ra|I zt*n?7H3L;LDkWOLzkEDoc#J=RIKHWm@uv>|r`D$A8`{p|fxAs|d9`6JyDrz-ACrxw_yv5*%iya2cI6ts_^1e;J^wd3k;%v<- zkWx#qiK-|mg+wGv^c|XnP#-tvSqhd&?gBHiFt{7w!x{X_H{asQZo}=ZeSDCZVuF%2 zDi~xG=pYdxe%uC^QlCa4Nird%&$+tN5OqOJ5+7rq9?_uO0by~MP3`#P!{_<(r=Q~4 z2gdmb*}`Q7Mb{8iLY9g^q@@ESh7wPX%<{k@fK$1e`u0A&ch~W^zx_HN>{)h}9$8HY zdct(s(Jfmfuu>Y9vje2>s0u@jFr767=TJ&hEoV6iBK3;$VM$E#fQQA5LPdskg)B>2 zRj@!pF@Ul_i56`HLK;#OC=vsi7>brjobkfLXZidSm-x&hXE;#-zC$HPp${7|G+hjc zm?(77$I&HhN<^XAY8}2ZOo2Cc;cKtn;oEP2$gR1>nK9*H9hGVZaR5@&6&@>c2?r69 z6AVp4wKq5&?(o0=OJC-x39O|=DFQA@rb2QXcoq0}{?@D9TuvCdF%<@>8$=8!Z!%d; z7Ei<@@WL@)>=5T$teU`QAHKvded)Br z?a*2ibwQi5%K6G&_^p@T-GzUvWNDQ?`#E4Xp<$OkPj>;HRinwNp zw;e*HOsq*9HhPN$GGz-#kdaWj{2z6Z*HlVKxts-6P?Qz6YblIkbv&TZ0^c?$897mU zK5+&<^Uygy@yLCg9%rjk35b~J?2M`^v2?lMM~IwrlLSU6A~iRy;{ZcjWXr}6Zw7wz z2e0$Sm0gyhLW?!xVUwc}M3D%>;ZsWr4k-;PLQ10l`kJIANfjh1NJ4Gb&YtFgAP7m2k{ni;Pp%sBpy76Ze}3nk zyS#FBms>MMmxd%U!UuzM0UrWNMsz7a2|CrHFHTrLU2|>|R%@t}rHl&-+oC$lK-5gC zF{f5)RtzlW@O!`e1G?puU;pzzd(1hG@h1kyH}f(6)ZnN8&Uez?=^p>>Kl=rgas&^H zwxe+oFAM>L7bQ)|$H6|q-W+bL$)`BT!Ec>g*G>`1%x6ux~WW{gVY2e^D#M|Qbba_ z5A7Z!*>LZP5zjnwiBCNC08gBO3jsD1gydK>bCiH_JwgDTZK#Se$C{z(!?H*~2W)w` z3H;vcQ@;7bH~8T8KJzppr~zIKKpLh8a|TsSa+YQ`MGC=SFu-@7<<1r(5s@*_2#rI1 z+)9@MM9;?R2s@u*ZAVmsSPuzholTrZAmsuTEt5gbN~y7XTj*wwPd{{tUwH0Gp1p6C zQ#Gs`(8S(jo!MO1byy)N${_$Vx1CEq^*k|2PAWHH|+Ot%@+@W4jN^ADcmi%(qUsnZ3ibDS)5 zK~L8n5S(W?9HXU1BI()|tpr;4Wjt*M^^gT{)xqrm|LOntC4T>vtC-0-RJqR1ZcDI{ zx~^F+=DA5dCai1mU5g-5N=+dJi}~~@WrdjNbbb883S%%3C)tS(3EwB z(7Lx)Wg#HSyghd$8fx}{j~u-Gk>mUC+~J)Y2i%?|RK0YS1QU6F1YAQkO{G zXW1%AK;Y2Kf!o&Mi>zS2GllQGeVZS>^C2H??K8I$=M1O;##EH5L?%gS9nnT)5CrG4 z9VA2&St&glvJ)ZaB@01P1yNf*ieFVsvk(3FDas>7}X@(TUEF+&l_5NJ|5+Zp?-XDD)Mb=|H3_HstlwZe$`q)}0U_j>Po?tQUu!M8 zHb^6w1J|cB%w){ld+;m2@jbrw;)lfHImGZZ+uJi#(A4#iq$FMF@FJiDg!uyY_bICq z6(Ta&+)_v&Du}&rsOuckRG8rkW-!4DLl+}t#}4C4qTD{F+hIk_xx88M$ww~o*{2`j ziOre`P(=F8T`u%NWSXp#z%`C~Fw7Bsbx9R{ZhHZG4iaW=OURwU$f3bO{&CC25L z!i;$3_4l~Gy~odd?m14VC2P|2@0?gU<{!uSV~yh*_!xg;@l8KV+g7m6kXsi1)^C27 zz1;);)j#+1Nbm6?5lf942wVZXOW2)x?(QzQd1ub;TMN3SM2c0k978M-5mrWEn>owb zU07~$au9g-o=txC@q797CCz;%dxncPLTteZC?uXh*L9Rap^G{<8s_2KUa^#m#67L;@+E5!o@(b)@pX3_`T2T!WYo`rg`Pmov>5Idh*0F$#6^sSB z8{G6M8CsB}A)xRnLefO3x#i~=ofYc?;KS{Xm)_gvo3GyBhaVi!7N8d zX*x{8FjhwgT`cVhVRGxzfg z&)m<$F-~_%6xa0{{wrW&uiI1=-JA(EY0YYeqHB||?TbvfR`49f`&;KI?dfsnD zUJ3AT|L3o9dp2gW7*MCgGVKuX$XMs}77@_`k}zllaXw>E6_lfzAT85opV?v?DLRIQ z=iz%!@(Z8&1TS2!83F?b=S&_pT+WtE#)G5alU(cp2=Kwv*g0igv+FH$HDEg`zVZ4V zzxLg?c;`-wOA~Y)5irbSpbcF%@sHMMG^R_>?zOMicrP_<%e(dHIs__HAWeCAfI{m6rWE*S!FoscLf{fuAE?UwcHJdGBP15Z9N3LnmHpo9+x+O=8@&4dE%vNJ zjW(f};DkW}W$3_l*w*1Y3obYDWz{Q^eAd<^kka9?bUqT7L{!K}`bp?aaJ4=v5kYA} zUs9*F#1slGB?(8cjyBG5#gakcdFs-6e({q}@!5Md=OnBKSQXi>LNh0Ni!2P3B~eIR z0@r)I7qmFrA$3J1hcv*Cu6w@w<{f_frH|P4Lw37@CTNVVDYYTljzu#g8buPGJgyje zf|3YmJetwu1g#AaBBg;!b?7)p#u;UrbN`t!k6v8ob5GvSvu8)Fk+YGtvs7h?pvEC- zY(J0IH#3JW(FO};!CVSjkt54~@7;!9fAMYJxIJfK#x&jl6^I&>6vhUm^^^&UQZfxo z2m;d-gczBZ9myoL5=dc445%x>-{zdW%m3jof0-v&|Dc6qPFA3Q9O2*kzrV)qgAwCJ zO%)@{v`xeze1(YFmXj4|gGqvs6a?#NB*a2vOR#vn^hjX|^Sf*g1kc}hmM?$uQJ%SA zSW7vvV@*J4Ji|hxRPRp)Ld-=iLIr$W;w3C8m{PDnaRB`OD+|8*TR&oZOR!)_Q)#-o zWG*4a1iECb2efzhsC`7I0K(%{z^X`VJfwn=*~p%RvMSH8hq>J*LnHP zD+Ed=>!(pw#jJBIx&W#~MMY>mI!crcU|R^8L`UICDHj15bUq$r7ugL2;+6I9f*!vEfI@5Y!)3q_o+wtvtN9iQzjSttddU;>X6VO^oLNI zlt3JYekX9Q&FgP8PFJ+RN5JcM;Kw)j`0+;vynlDjJQk>Gl@tmhdC0j7o|HVIj7%ml z86{4hFq}LwVmMY<@0oY-#=BS9p9g;C3lDL&f`N6E9gKoxJt_VtCys3$$N1w1{m=Uw zIL0ylu<)xXB?o-a&Dd`pTT9DfseNLxxKewy0D}) zf*>&z3{{Da0k>Qr><)q%r|dPJxxCH`Pd?1E_pWkzkl(PR^Q3l4IjVBTR8rUw@kt?c zCZ$3t?#4)qzzRh`(vf|muUu()^XeUb>)StO<_atWRJjIeNNh{AEGUein@*9wC3Kcx z9V!a6l!Pu5YK4FliHDWf;wN&FMI!l-)oI~L(&eZ(Z3)WceB{y)rJ{2R>vKni)CEFS zBvV0}vGkVjym6g3-?_>U9=(@8^TN|SeHykqxKtZ-xr$<$2je^>6-iQ(f+t4DnkmtR z!4mOdfl)&~b6)er`Exve=?uT~qxbmko7b6&0YOffb>J|Rn;R^gBZ-I*28~B1ha?h` zphya57Yt0npcbgGK)2fr)sjn_HTRr2$(Npah{x|;XG4Pbf!TD2wNXu7j){Ov0Y@Nd zg%y%R2XWAer7qd^xtaaFZTQu1zsc{uc7;3M&{ikF4`5|8H{Em*7d^szRBY&6_T5Kf z_Q*CdS5YUIn--NIDiFevfSNpzd>rBS6F6cWA(Fhyog_UejLsuGIjTX#?8i;u zOo8yf2xfhw=Z6-4^j^pJU;mIduia(VK&nr3;`Al<4;IYt z9sm+E9AR`xH(S8oG!t>}kj_J}y`MW*m=k?gn^Pnuk%v-6Zdw#d_jTn0ihxkLirx!I z%A%A)NduiEgc3+JF(LE@x8t0zzI2TrzJG&1_cNd7zO^9_Y~;bvLI?`)7)e28G{Tan zl2!gNl|d%3DQ9+ow{)Rp5M{P@CBuJsH>UsT$>Rc+WBl>L z@eO;7Klb=)O6dTYTE`+-b`GXA36?>y42Dpy5DLxjeCr*2=lC;Ue2k%iF2KzlxN@`O z?ry`P75V7jM_4StE*Rn&hL(z!6{9#;JAUc8b3A!&%!4O4m;j<_k+#KDIa|uQ4y#Rm zBc(Wc$h?EQ4fqL1R*l;&T)Exw>IXM@`R$K*@1t$1!3nIdAe9t)Os$6y6|MYQ#M$v6Qm1>nPM1)2q-Kk?0etqkC;9o$ zJ;oUW7Zg;0@*SI6Q4qj+d`#%FV&MWo=9>*+Dkv?XoB}r^+>Y?QcbEL$>+kXYt$hw!g-Zp6nNU_^nl{od zTL7xE!gm(Gw+kt;IvR6ucLy0f%KM|H#TX+#=29R-K&G5B5(Px55K?9Xw@}EUB&0|b zfDlNTWB977qO6DPFC4{Sh^z{NjCkSksUdX-u-v8?3Ld?%&KI7%kLMpe$Ac?^P4arx zBvxadD(rx$60(4PngBtfXylJ}W;MJ=)_}cF{+n^?Ex;NXBK9yr6Ao-vFKWq`^-?IR;;n3#h9#rerGCppF+ z8yw%P$M|E5uO*lELS)-Twj0Y%({SJ{a~F_h4Q5Cu3Zg6s3cm5}t0W(I{)v0>7WSrr z+uI9v4?Nx~NChHFr0W=_j&WL2v^$vQE@vl-&pi1cUwHf?kE|v(m1ThH)g_-5=NJjW z;fsHq18DX`N+G5rrlxg%=SU9i?9|X}1suw^&huC+<7PPe1(-PhH;Rl!6*Z zO~`|+0i-B$+6)CrfY&*~&GjD#wm&S;nb=>Q!dJib2JhTC;MTMy6hl-oruBfAC{++F zRH`I+kDbks-cw2lO@rOvM+=eT`eH)%N^^`6?=3Mnis<^&0Fj4zr9vo)kcuc35lKi9 zp$x^KLQ0Jb0VyR#RiTT5Bo*Eicp>OSUlVF1qKu^37Px&@>YP9S*(dJd*$2;YZd|eo zTp)X;V}GKNPb@3~he{C{L8*d-VAguP&S@Sk@P2|{y>^qAZtU~k2fG~13y^0CVvRNo z=^}_K$6vSBf!}5I!YayiI6LF1$ItP=8Bi9&Vu7C?5Ec!!NKER2aapiB8uD+f924nd z{L#npO?r$!cKAlJX_;WJb=+Py+-WS+09|45rlw0!j)u&etSkO8@%C+O7uZ-^ zXFhM4PFtcCkSa(9nIy(pD%&9ETMX$2oef~sG!7P1gH?DkO(M92_gYdKoD*h*d5I5*zW0>X)`nJ{q4T~mOVBzKlAF3 zFHhZ`T|fbnFe{+mi0U%8y6RNsIhoJ*e$V@Re25e_Pw`JA(ssjWV{+{F+cS9nttmf# ztsvIG@4>%MS)#iaJ(*$hmu}wg?EiroPSZB&>Oi1*k(53mMm{Dkw5Q!l1 z5Mj40LFdkRH~FQMpbaP`o$Ewpgr6~B%j}IVs{G!RpoLyxy6xl~jU7cYXIKS<8d>a6 zxxiz0p5~7{_ZZLKS#ey!D8iHGKE28+`w@3%qr0Lh7F+(Zh(ripEBZ4hhxf?z(gl z)hV{5*bw4^n3`@^Kv2P9ykXD|5u=&(TEs;t9Ioi2ixtof)*f(NUFFaHi9gB{TZ(>& z46VUSel8s-_?f`J{uf?md#}%E-b2?lt=dCUi!=u5_~bdU(GoPoLTCR%HrryA#u$fI zwp(PWOa`=>gC2E2R3Z>STA1xJDidEle+U2lFFnH3tKdS!O!rvrRTyW{+Gd`)52V&p zX)q>7%^cKY+{y}2u>jt_7J2c_3;gh%i@du%q3(}hutKmUIK%qtI>&}XCi@2*eEcSx z^~XGR`zB95`VjY?JIiK~yQ?KolJL!xL7BVDDMoxNhf(g{K%=uoW1mcexfpP=>7wwMr5p+$M0gMJ#1NmjD!F{Cv~N0KyXnPb!p zCHoY5&TVJb_}sIP^3?~=a2I)2qXb+ERHGCVqOfjMLupH120|} z^E*Fzm)Eyj=Ka&O_BeIzptTUP&w3@(9+}qHh>R(!mPa4Bm6IC-PONE44N}+m`96L= zCNvY)Mk9Jv#eZ=8wj+IVRDY=J=m~mM|9?~8iXyWV*sp7@O~>3gm@z>i{Z-;%NUbch zWYDEXIhf30z5w6AmCFqmFJB{xLz_O$!b2NDJB%2V_qb+36&v*QI(M%Rc>K0wJbrGI z2XE_xVB z4~U|n?B$NAWJDf5g7@gU#rhW8)@a{go0b$jZOR?3WvsP|0f`Zv;vow;4=JTjd7yJe zrAfNTuY9FYI_3K{f>HuT5M%S3E%IPtQK4*?@TOGGtI!VTdSEJ&DT&75oh90c>uLP- z8qBVdV>e)j$qKHA{z*#oRy zj!LhAgBWqfunl~&fFFN6<@bL25wBdh!Bh=#>nHKa=I(8Z=pY!MFinf9Ta5S626T)_ zh)DGK7;{%TB~X$>PQ0Sm48S=iy_QsXuohbmFx46ukF^JEafLtkC;li;9@mEgI?xGd z;HLtA>d(K-_1zxBS%qsFYS|%43$=kZbR>w_QBV}Yk_DQ|U1@E=<&)Y)V=I!eD3{N@ zI7eLCd{jOwRu&9qJKS0Xe(C%<{^&FJa{qdM_FI8wF{W^izAG_+Z{|oF==BStNz}2$ zw;ETifr9HbynJEKYZtHajn`gdKSiqb4Njdpg{nRKSFbWabMJ{&{`eOjWUB|qDu<;* z4$>kiU_@}n<>z_=p9F2nyg>v^QnpVmG+YB-z5u`Xv-f%BqwCDlfNJG9)3HY-g9BB~ z--W2Q=v8O2K%BvR9B@@+b+aVsIs20U3GCiDV1MTT-vo>qV9Ryt@f_M3TR>k0sCTKFF(b9$x%^EOu|NeuVuX~3$B5awp^+SoEFG#&etzsMn!HV% z1(fRi(Q?><&hgipq&3Pquny%4um##WlFt9GjYGR3$_^0QN8Er^R){l19ni+()ErrC zBh%}g7+F65_<6qa#BDsVo{0`d!1=(6OROk`C9r7b^vV@l5!whLDYS7|(~&U9Not>r zg_qyGz$@>3#Et2K)2C1K#QFOF`v?4^M2xJn- zKJb1GKYl;)<9Dv`;qHP-ESN=2>k|PmD?MTiSunLNx^1DUVNs)-fbpP1!gz&v1yLap zR5Tcfdxv#DDa!{RU5+Foyy1e)i1k{@F+Hqqjcb?W?<7Z7c^;u{g{mEb|;hY|*|(g*htBi0us3dUQ)i z*=R9sM8}BoJ|}-lAg27f3!V2lPXT7ngpz=k`sW1nGUZxS?n0vsqB>8sv4^t)N}C)E zq{$KG)<9XH$}*obn}>hPsz;QBQ5tJ4(FfXkfy6{rw4B+BJoVsheCdh1xo;g-fq_q~ zXwRxq7;01$BnT-QloVJga|oy6Z~$?yfE||?B5woVeC=ai_{k+M?`Uj!hN?V4QjWRz z)Tu%Bpc+*yu6zOmM}M{C_GJDMM}O_bs&h)Y~7?W5Sbnp5nRlkMh*rCpp!JE%NPD8c&MhP((H{ zAjaUz>QkaXGeg+%k;cJJf=hFF`wIN{t&6@F?B&>26n+FV&bcZ4aoB@*Op_Lxzo;b(7 z$A?@1(m*Z09nV?Y+~Cadf>oeM2^|;2ltW{Tt#G;|=fXivAkkzosR|kly9quT!-X0A z%@;o8($sK$ZfVsqtgCWBhZB^}?BWn2sclGYi?j=*siCPm3kR5B5U6q_b{DcqZ zZ}G!Rn|$t}(>#36a9aVQ3#b6DNknJ2XA1_Hc$uJ^_ zggmet^J~#WIqYahB1&nNJ6B5)jbe%Gfn<=ByU;0`Y>QFkPP7k5Ve^7J1&B7cagCwX zF<%B$MXCD?iWQPl;31lZ_pW}zhx_mHgEz16%mcUc4?I+vvzd5^kB%+V% z4^16C8IS4@UHvC-To5}tMq3u_x1MQ=gu)`uu@Hf(WZop25Yg6QiX2nBJ%;@;T)H}A zZ+AvLYcZm6L2z18DGhB)s%z4Gf@8*sq2{*rf_rXR;o1An^2mt+J?MH-0ZASez-ot4 zmZTGV?EytuQcxfm>L}DoGt+r%{pB6_;Ya)Y=$$KE*l8Fyj_30Mzj!h zjzwM$5-z*Ws`F}NvJX?4?7>vlptMDI+sd};5w#^0CBf!_ul!b_wWHDnR_AV8)B(3z zQLa@Sv{M#)SFu&WJ*QUr@Q}PI!CPf9RpC1ZYCy?m2>^;6CohVll z$Q{g(0y;(3tjkPd05lPeCsPOJKtp6sjmHqF7z1zIfN#Big&%*o&y~8OaU0-9NK&YJ zg7tGoIx(yqlX^}FZKf~ymeejttw)*$+Jp)T6BWuUbW*6GG0{L$hz_*2M#V(g_EClH zC>#l#Lsvsov5GAPYj#-+7x{Dl+HdgOEfxKk=ox(&K(kM#aQy54$&c9Ht{6-U%zRFh zc97T{cA)W#+<{J+KkSsw*gus>Mo3N(EkvV8MqzqAlCrrAZ7Q^`G95%aw1TyPrVW9H zG7s5Rt0<>v+kMjf8h4yD+_hzR_TJ+>efKKoSlTS+sE`=gAqqjqM41c)In^*K@Cx?Y z7FQHqZX)!FR0uXDLY<&j5mmN|7@<4+4M>~4_@>7$njI=;WR~-rQ+VNxJzjtR3YT|g zglI9z;&h3kz$Zh{7K(y8dWiYBQP-%&9Ji>k^Lf60EK!h6K>3LAH|YDPhILxqCwJkK`Uj*LYqji526M3g2uMREp81 z8mb~P8W{!y#rX$MvND9#K2!o}+7PD)=z0N37!23>_s<-4qmSyJejRn7kLnLqeNRMw z=lRztFvK|IAOvPwV|or#7I+{TmcksDK?&7|UY%8$RFjU|Os1yN>Dk@T!-#3q*UfCxg91y6Z zrq!Bpf{*s#qY3=Z%OCUFrCqLEIRGhPxQZ=Dm}HTrr4Dn9pVQW!*wmP)C`3@+6Pt#@ zw@Au<=OmsektC8`8Bt~4Z^)fy>2P(DV)uB{O-x;q?5XU0*-8mW!lrOY-9VdsgC=7z z1cg@F@2aB7jcHLRBd9L$qE$k)LQ)+7PA@=9jtRFe6C7-bG7eFe`COP0QN1;)t##_= zfHywg;nL+F^7dQneD$H*cSGCycNHI*t95PSUWbP zNRBw(XLoNqCqXuXZUob0&b4Y41c!u>JD8G>b&zb42}Z!sd5BYPJgW2uEH;n_Kt)vc z(Jlwjx{|I3{ptTprMy!hB8R~yDStC+x$=m)L#vZUQuc$RyUusg5ERNJFkScA2v`s+ zU=zv(v~qwjK4@84J%%ky4w{zvd>=I&Vh1ZoPx0>V6)x`Yb76a*cP?%6^j#-;;8c%O zrq4=u4mAp`6vpM7P&d+u51x&}knotiltMy7y=drbjjdMLKWI^|pt4!OX(ga7f+b+s zK{G+K4}9d|Czs&GcW?08g{$oEH}p>2NB4NL|R0R`RLy3n~Sa%HDq@ zWm|^?QpV+=mC6%(K9hflI;Ve{E*5e&16$=`K-bXdh@k*ekg$yR7F6pil*f)Soo@5a z+ZTBE!%Mt-&pDpE=T@G+V}rAOI5X4?l}6fxQVsp0z}WoU3vD7aHG`{b0n?+<7Oe-w;HalH%`CECCZ@A(woVMW z^=!q-V=(NMXuE|pGgORRp4R-2KH8D>e#QUcD9P}s{wdbclkcehP}GY_Wa?oO;kUo@ z0{xRGDUNM0)rN&JNUtJVSOl0giC(2C3Rq0x@}()4F7L9xp9hnCt0~+7KMP3R($f&< zGmLLIGZIb}S9$vW6MXiO2f5>T#VSyFVJHoKmCzShVX*?~77LQ>{j{`C{ z_O;9K?VnudrMEA!J5Gr1VNFG4N-P4QAvO(ds)^c@q(v41X=aZ(7M=WI2O8hph@ebI&b&<>50tbPL=j{ z%21g6wctI@NIsTmL}`|plymaj!2^Q5(Z()0P4%%ir zP;Bw_gjmn0QebE;(;M5_zS2Y_2r(#POoTx8z57LeUng`(*v`U{BoHOrs!%N?50X9d zHhRh!5d||WVwU!eyqHo-4i`R3^enpP(4|2eLu_h91ZxWhg8`;+G|h~9HYT(A+qHy`335+xr|G z%xLOF3>p-?hLm9nug?4HY&Fs@e5Q^*~1zWq=XVdOD1ik6wo@~q)4IbKxeO|B4vS;61r<@ zEd?|x0tQq<(`Her1Q7>%`CXdW@uXFh&WjmQQ2{y+nMFG9bOL2CQ8K|p0LhH$y-Qbd zn_Cov5q0ZXG*brUh|2az60q8^n9p&h&+zz&@pO-`zw!Z}T)DUL2b+AbcY~|H_X_V_IL9wOavNX1I|GP&mTZEOh&75rD-@BKVt(pthq0Nc z(S~m5)M`ivq}XQ6nk{M7kQuPky}fn?es+1rYaj2hvrxG8bDW^0ZiVr+1+M6`@R7D{ zuuia5fmRKEJY_taquV*IiO}TPTqTw$CR1{-oxLM3AX1FPlt3i2zr|-^x&cX{f*vwY?8dwKYjVnvsj z;JCHY%+d^nqa5@wz+%x*rid;bs%}~Bm#k{dzK>{U*tomkt`m3hlTQ|W^ObkGv6wS$ zAuAJsp#`uBhEvNUDI>*G0lqPaQ=T${`|pbzCbErzBh zcW6x3weuQwt_k~l3$}N635^F`<%#tO5?Zvf)Z3SF(;FO@1MXX|c$NXQfulcUu4>cG6}vv7*H z4(5FO{g3$WUd2ZfgGq+f;TkF$WZt4-PFmm;7k6okMa|w-q6Th**_9v(6ADCn`E?X(UnutCH;; z9*xq_NVh185oHarZYh)^dPS0a-jWuyQJs%G<^_?;J1bhUB}Ac6V$dp^D^hSIZ0-)K zZip-v`K>UytBC+5&h^k5eB+5Bpev119;+g*FjQq9S8Cebf|oDva(VX(zxAz)eC5$Q z_{tNHaa*P7C5`b7%H~Bx(h9FFHG&`%QBlQ&jX8|P+k|p`B9@ugc-QSLTozvV=n8L+ z8{XYtu;(4N+Q7yFSt!b2sdT}lA>-z>pl!BOv@sB4iwmBrn+q_2P6AN~F%nXQ*kD78 zN==UD7T?)&VvbDj7PN=J z=fNHi-|;X%dViZAy?&98Z`@!m2{9|Am~D3oo!R=XM+!CDS7vPQOc@f9>;+9SP~9`o~^J0{W=_iPtwpWDe}ru;+z| zQYgud6{dj;KY5LH*P|$N=gGI(s-O`}CBhz);esR1T%u{HM82*mt|zv3qn;3_AG^w-wQ7$|`T| z&)USn{(|YGWPO89TWwn8(@l(vMd;Hk1=8p(Zp7Wp~XnTqA0_V8^*ODq#{x6oT;gEm6y(zobocoB!SE%yhA( zZ6~*bS&$5>3;D z+zmAj*Xv<>1#@W_3QNd?VG8gI!hDYI z4?gug%|AYwyx0TKrb2KO7=qTsY*l7H*`rxZ_~?_5S-t&!j2^H%j@VugS8C#3qG>(O zDSFn^gob8XlY9+rofin!(liZ0dyGz?11YL}{$qmZv4C4uZUPl$Ab ztRh|Sf4OyVbI0KD%%)Fa?NE8oLG(>?xDtpRelo>;{4pe>QA!iVAlRJlnF>TKN|lGZ zQaa^bl3)~q$0vnN5l!m6*jij16Z?5vnJJ)&ny&HVAy@SY* zvKSG?=%e~4R)1?AWIra}XkqGMHf?CzL=ekDER#jUcvfS|3a>TOl!H*_ zlf-=YfbsP`7SlPRd+0?%N6V-fQ6!C@9-tQo4C9PrcFboVx|OdyaS!*Nu2|Jj1!15| zY*7-r#+}iUhmfQj=hq6;5gYbm;6|&cdxi*n65;t*_xaK5AMws7W9sNgD6}i+*$T8H z_=NX?-~+17n5)#*=r&-y&k1$GlTr>_h&~ShA|29fDVU@0Y!s=ZY~+E#lu`#`>taT_ zuoRsVN)jmv3Lzb)59S-T@F~_TkW$E=SM;a0kLA!Sye#R+9jf!1Ds4avMJNzuQDotj zR6tAv22$au0d%HwSX&|{qO%cf!O&!^Nl$Nc&IEOmCjr03VO;>0-J^AmRryAz~))*zcl4< zzw{Cp4`!^NIK!A8`vAr=8&BzvR_L@7Mp~lEp58^65&euxW!`q|3^IarGlSA)BTKh9 z(P-%wD&4V-pH77oL6Z8^plAMn)u&FxQYa@n2Z1cV{|}b>)X)9&djQp0L$YM2nNo}IHI%Lrvu;L$u&^+;@C~=N^BS&)mMo@e+Cks5;W7Im&^v25Sd^q3HganEzxND@1G1C@LvX9teq% z(u@jN9m49p>)d_EI_J)9@z;O!Q$867-1=F@bwdb!OgY4d87r=(!s8UAR!F9Ylta8v z_%;%3lPwr5Ks7kkU}QlVT9mW|i9`_+a%j0ZJl@^n>C@-<_n();GbPzxgSv^H%>S%9 zI!9jY`(#0W;}^XB$hi=iIf6Lcf+-ki9V_D*p!eWp(UY+ zC^3ZODJx4+R=7fFYDL}5_~_#+T)j|p{gcal^)rv~++$}sS-~j5@wF8!Fs~Q%wSdWk z$|^*r^98{;ie8@+Rms63@o-Ob|4GN^PMqP*d(QCkhgbRj+ZXxi#ml6@DWdcVp&-pQ z#E21LR22037RCqoq2gd8&}@vbs}-iIFfJ!1esq1CvDP$I#lLsGk-!=y0}dLPiQ=P!1^Xe<&OFHr)?^Dt5Qk`?KU}8`h8x#lZ*N93Uf^dn z?S9B$e+LDczO|I?0@>TAn(T6Rq`BwJkU#R-&v5(klH1qw@QVdV5#=>WDH0x~6-Ftr zkR*S-1r})be2aG#z6T%9;iV5eKYr&DZ(qE@-a*Z1utrZ5NEVhz_8cZ3u|5&zoltJu z+=cEwUJ7XG#IS_rmapV4xCkm{n@3J#=qMZA$Hdh2Ed!8p6HB@g1p%sZKP1T0EmjN@0}AXttQWw271jwALi!i5iS^L=}J*t1TKu zY7>pG(RE~X-N1AkKb^8(25vjE%A>cg^X$1(Jk-~00Rs{=9u_{M7Rm~&A}P(B1wx>} z<^d{EIO+agV>=>)&~}|VOBUio4XdkgdTq#qr=R1m{JrnxXLg&v{EFkyP?ZGc$tUTx{w{6TbM=#6c+Ib zqq|{SrLeBV_Ir3MG*Yve>~U<6SkX0Zvd7uN^WpiL&)*iG5Z9yrOcNQ(Dn;FuZe}JI;QIzxut``2L$8u(En9 z$r<(+fx&7?+e}fR&D%<~!KxuzSz-%eHidGShXAt?nLxsbM@Nq$;|P`NUi;eQnT4g@ zLUKnxEq&#pyVu{RhX(WeJU5Vck5uZI>>_#Apc`UdvfA^)sXJ&$H*FX}YtrGu(Ppo^ zN+gwMCz9!g6D6T_Ac^VzE)OK42*iklfJy}_8iM4Xp|zzbONK*3O8sox|drMLVYkQPfY>23FjjnnG-?F!;kx9g@SM-nd=nouX z3x>x|q9iew$dy_+@GXCKJ4(N=`M3H)Xb%M8PT7#atk)bNuFEkAtwGOvEP z&5c=tYK`HEThVQe3N0ZdVjD@pBSBDY!lXp1b7G(hE#f_d7GjgTKGApKCwV*gCNU#_ zO?BZYTJmJSl4UqU$|-{qk?ux@fRd%C&Yx=%lJfR09copKhDEc%U#lopIqIBls4m|uO5k(+bNdXFd1 zp5n9j-@-$iunAOnWU@zuO#Y}!D9Y?p1?CY7WAiwtL~M%KlrepD)PjUiOU&$QG=_}b zY8wG<7--?~V~X>C{ImRU8~*%neUqQPeVNUZcQB3(MQ@$DFvQA`e4=h6s*TvF=(_>h z&vUSh5scH>>XBle(?k=K&*(n_lJ_Zo?kFpjvRI`PyN6=A3()wv@9kLK{Cqe1?^i#+ zOv?TFw6r}e#W5gS-yBqg9I~OiAyI9z@7Wl%RvmLr^20KqjH0rAP=*+?cUP;3Gl9Yi zJv>SlxXCU~#@u^+$ge(pA78lR7+Zj@J>&gddSyW|D6oYEOxI}^ya)vblE$R$tU^Il z3a@htqnG@rn4UqY1j>_qO-g~nSWdeYszPz=SI+ar`_Jc0Xa%U+3D+0$J%1 ziwYeCw2*3#N>E_YWuGPnTFC>GbjPH%mRJ-SITwrUao0;9J2?V9Ey2{G6S#tC$*F$J zWvtRU%t$4cMxKlz?4lLB-@6>@6_uINN|{bztIiuuJ}_MeTBW=kQgpiqI%e3RO5JZZ zNHp07Qkd@dXFEs=0b-elAFadnDkMajMZ&j&v4Sz=flgDgs8*=fdt6!^@aKQ)M|}IG z5x?@xd7i$z&+!6I4+qp~z`U6-P=TI>LEjN#AT<-JVw4YUGsiC`R8_$()hdIt1MWOM z;K93Y;nj;Xe)P^R7jEp37$D`4XdP{9NkI{!&btSVpyw@NYLE>BLx&SZ>kM;ku(3te zbBbA_KP~v5U7E|fj{MnEqaz`GRR68(NI)OeKbHEA7ujv#ASA{qGK-OUOw5w7vwJ`+ zd#JL+mWp|VSqlea7#}q3?Y7_pll?idj<}+i1>Dm6*DUb!Jt~=U_C&?APu$B>w;$)B z<2`P1km?1)s>}#3N}8so2?=d2wlJLmLOSe~p{C3czhtt;+n3?RH!kq}Pd{LLnsBRU z7@azf7t4IM0H4qy5?T*l5T8hG$YC07K*yA$w?oLnIW$NJ#L(uzljJ*V#!cU>f;Rq`C+|JQ=O4PCdr!ia zhEWSc)uK#~-@{>1I2AgPkVRrtS%|fw2x72mc?1%+6v{G>RQ6(E z(F)gQ4Nt6(c<5jG3cve)%U}7N;)S6 zT1}EjjGgo;G=!MF&Vj?-h2`;H@_bSHFwjO+7DA#_{u+N!C?7_xFD)J1^g+wv`}{Mq zkWy%EQ85!7RM%O~9ZvP>AByM>t)^A(;4edToXK5%Yf#RhtVOH?Whe`SEiIyI!gvp4 zMxo}M+3d5iB0PTXcE0?`?L1gz#=2{!R3| z`Hv1dgK|(1b;K&ckkEytkD-TQcd^gu-ZA>XmrlXG|H7mE&I_0L?#r*C+>noMj7hyU zR*MnEuq3HKI}2E)=nr~~4;pleWYl^hDIsY{7DyUr4N7eH`V+)yR9Jd+REMSO7Pxel zjzkvIk`9kK5<6;&bPKKStR7lILbpR;@@@c;&bZz+$Ge4>sLqm=X9FZ9l-SNr6hTKs zY}X+-m|zhJdAKo#Y`2KnI)-xuCEcP}V~ip=uvX(l5yeuDHfaT_l>vIN$}3ks;-`Q4 zcX;;v9sKHZk8tM}+%bgp-iYm{!Paw54*OI_ql~7hr<6qxRXIlGC_ld3O5vn3{PNk7 zJ5R1~%UYl3-?+q^7q{7)?GbGs+=w<>lqk?Eo#%!FCrFgsQ-SS?svhkn1n zm5$_FV#>i)wRrwlAMMC$(c{mY?jH&1qxx@LM*{k&{*l(VTaj@Sxx5JM$HXKgCNWWy zsI?|&MG-xwD3E^UwoVo>Ucikxj3~`v!ct*YeFD zy~cj6sof@KYlv|@LfevjO%b#3jXn|Di1w22=#3}MYf@cPXoU_D@hvGfkUSC_B(zA1 zSjp*u660Z~R#G=0*ma%rwrGm;V8?hKHqf=esrr6;l^3qdQTa!)EAw*ExBz6U^EoMuD~Y zYqrRu*%*{H;7Y_6)H;jtq7eG7LAU#`*kQejoY^Qiw;_D_nMZkO!_fywfl>>-($Tgv zCd~xnG?jK(U7>L_Sn3Y(W>rohuQZuPlYo>h9VUS)AdzUKVZW(~(Nh{rWgS)&8@*LR zgr2}c!BzneeDMswbl++I^0$AC+jU%81m@E{VlhA)$HKIzrlySzh0&BL+Z%#FPzrAh z;m|woI{QTz36ny8?Jb{oBAu2ML^5MrM0Jb3fDrQ8ID9R33!Y`yTDqmv(j!gGRuPrD z`9pQMz|3!wcRZBo1UHE4t}U3(&XWbSN*cuF#js9beJ1L}9I#GGNQmGHs0xJ4SJ&Dh zQKOAzy1$3+S2W46NCtD_4$4CD^8S<;|H|+2(5+iM_ux6c_`r~JWy!I!WPxOiUp-^c zTcb_jTLGo>j*>A{L{4bo+H{Beh8x^=zva<8ZsWxdkMrY?Zt(i$eJ+h>sNoqzIZOc6 z22`yHbz(LPObgF=zolHWOy_+zHZ5yIMXy&v()idi3mFZ$2$4U1X)3GQ@Nb{$9SP~9 z`mbF_0{W=_k=1`SuH~cgguSMv(T0W6%+btIG|G@{j-@S&9s=y{!=?Sm$2&8&$AS5j zY@`c@h{hU2Pe+C{NLbMGQ$`ZFb4&5u`MY`cp%JH8#%?!^h*YCd7SH4@(U2gjf~YK7 ztx)w>*e1|o8I!rOAI{*Fi^8{G|ByG|zYLqVKxsj2jgC0m-lAvC8iel>GywhQ-AaP0G=u+!c?o=)9k<#%N zAa|n=OL77q${dPk>BQNR1|Ujzo4z`Ss;C^4u}mmjZsnsjsT)-CMw1GQvKD1aa0SU0 zXj5Xe#h|gV!Nr=QnNoy3*43DEw~qMIbC2=m$8KT6CpKLtblZ-pt4+=Z)-L-vO@-?O z-ZFwa0X9OIMfz44ltN+hAY4Wc<}P(;p>JT-Lf`dKID|HLu!&uwV}pdqz!nTf1pydZ zICJkBU%2;c{O-@L^IJdoDIaWqg7j)^f0N)Unnoeckc=TkL3AYPgy=x(x^~&NlfA1- z8we3?RJO7&yM>aI<|1S-ac6^B@_v)*&awIj%VlBdRqjX~OM8b_s3o?rvmhV_Q8&Bb zEC&+Jrxs6c`M$_vy2!R2Z4J2PIR{rMVlyQ)3u4<+wfh_|Tb{f7Ha`EzojiWqC=Yk0 zK&c~6=Wc5f!4!@jn%IqCW)4I_i=tN9)@;d*dk_jOXcbAy&`J*9i$SnfA*zop^KL|e z#-Jev{G!ESF-c*qVQ6wd(|yO_-~5-J;`<-N@4kG67hivyX}wQz>^N#z;S1fRGFr6K zC=y0>L%J!DjLD+2Nr4pS-wh75$GNg2~o2DBwP1%ki%OT&J!-GjJlQuh# zbQi56XjF=a=S_*~n9 z{PQk+*Kv6MiYA_bFwZbbqyS)FcS9$gA6@K-JdwJ%L zk}aheNX2Szz$B!M2`npgcdld1*VeukZXcE`7&F7-%04IW>+#_2xAOgWR`~JzJG^~; zn|T~U0P%T20|pffBtX3%s245GyrrG@kduA%nnG6&;~YNb&U@=4)23xk;D7zefvi=I zKfQI-kv^(__&R#B9Mym8`iln>*_+K+cu#UAGZCnUw5DJZ6Z4e)ivdN53L9ZIOn@B%qdGc<(nUt_xe{!F?G34Y zwuw+xsKRCMrB$f1gmQrE4G?3ANnvzJuh+v_jS6#0nNh_FRoLd1V}`Fhc{g8u?jg<$ z4dQ1EL&KmjC{q9$pHh|!T}Q8N5@o-j1#T>$wi&{4J;Em!clh4#eus^I$-nw9{|ZK? z^mU&dsX+~S>D_DGfA&k01fs0)ofH1u8Zu@c^{ZcY~gq6cT6)RRv|gTgY@NlL{~fS5=f{2}+1* zfzdPig{N$%tfZPJZ#&MfKXsm`ZXdC!VIbrXk#+0m z)FZh3HywC*|D8)b{oonOIAzT^0>VKw>^6=V;I@@+_EzQ7m!CEHtxQlx>8KXnkg$Q8 z%wZNB0oW0E@%_Z#dhw_H@RM!Ec7<4Mu!to(me{0Gi#cgN!P4MtB!xMP`3w~dR!nAc zw>7b@kl^s|A`VE>3ad8?2=<&)j*EUwP&c&Y#h&04K?sUGx%En9HR^ zp*%DPC>;@95NySQ0SCYya6{nhuSZ_~@EUJ_e2tm61iQvO7KB)0+#qB7Od`sZC=;sH z#EDzh*gCVuXrvjH(6>;L^Nr$sLYV@qm1DK%_;=T@Q8`-_%E(&%1=s-X2StzqZ-f{PcfbFed~Dpo10*-=`0)5E&GN4Pa5oJs2uFJf?h)@}nf_(#T z%;A*_!jE5noA2Jex!A+#PzCU+QHkNA*pnjxTK zL{f|C*v(pe_P?f(hyPN{$!*DZR*TLPndH!_u@uj$Lu4sZM}? zJh;jvK-soz_WMNO+IWYpVueEM&Z^KYUP6lzgK>sRG$dH*!|?7Qr`8|hM;9*ggAYF7 z^-J&2>z`w`2$W@yt<4dO#xvbLAV#4Y4Df9t*#x#kd}7fopk1J?raHbs-2{j>2V4k< zHYiK(_8veT@f?I}(ApMCQ83 zix)oOg&)1fJ)0-_{1cCH?nM6ol82MMyojE+k+L$`i%cH4Q{C%M8--JXKbUd*;20ZC)`r+vQcw2K-m)^kbB%w&`J{P)w*EbU>mjj^EjUy`6ef`rP zLx(2GUHgtwNm6-;R7>W3$Ly0%+F&HdwwnNP`OEd;gUC;;sK6;iXB&_*0ZJx z+jYQm_u39tDO8`{a6~iN;qSfm39o!`jn6;%2*3RFDdqzhX3RVU7&=%p*?OcgV0ztk z5DFi0rlk_gN>Z$%xb?i@{E5>%KUnbE#XUZr?ht)RVu(tb7%X8@qbtL)^-~0ybK$*R zuJ24abIS%>#|Mmhur|nRS!YMYCa~)p4i2XLnf*poGvnVov3?|^kLv$t9SP{8`fpT! z^6j_e-h1xl0BE$umxDZqVigB9)XCC1izo;N<}BXA4M(Y^`ijcSpb z(AkQgUOM2v_||)rgEJ(*V0`roF==|e0V!(g>2~huN(85IWsguQWY%$miwdNLWKqhY zl13So!(obSmB3}saYoSTKY+9Q{bE{m6b)2PC`@9qy(8I95E)X`dD~tkl-5M8atB)F zg@ksUO(#WqgOawL)5aO2e!*&A6Pp%4-@{LKc;uYnxkn%5nMWVvbfpecJq=Kf2Ki+< zn?c<|ugrF+LSvP|W}^^_uYPmKlUrna{f46m_yaHoI6&~CMb*o9~qDL5Mvpxt!L7QpR>|S z5N}YX9)%ln`mq&0ci)qI{bvV!<7Xf6!}ngI+&GOJtTCT8B%kQ@HZWG0&Zn4CBkdy7 zah40!?)rnuh)fmpVpVyMN;Xd*s))p9dD8OrE2)m;p$>y=r0bq5B`n8Qvxfc@o-%b5 z4N=Sd_QU5!CiUcKcBQ5Jd1L`Ef+$VGfKJ)NPbSJ_3}nd70SO%{P_jx`4nkT@AY(9< zPC$bbg@{L_K&+;8C9}zt)@n93&eA(}hMm0|{EavE_`#(ee)ZY2JaBrzT|LWM*9i{Y zuc+&msvLE`_k7(`AyE=2RbrqLvl#ictr5?B`UEv4s-{9j(%`CPkyNd5; z8qeOr0%ZiPSE#SIym#X=2j@nNRxKwtH#xorD?KpABCREO$Hhs5j-G#KJeQtC{>yPQoh1Ji)>Xp@sd4N0)iKZ{EW8HMn;Dfa^QE zEXE$vN)8?oL3~T0p>BjNxt;J8SXm)ClQ8BFma#Q)R_KyH^7rX z8o(2k!K)Ha$rzYuO#|!$7d^ap4PJTsU0!(m61&AYQh$?bw2mRtG!1FdU_@A{deGD; z9}yo&Z6LOZh+XWk&q;z3d>#l)Z5MXpbN56%5VBpO>q0MsQAn}tFx|9ph{W!O zkuh`tTH+z=S!9W@;}C(iti#VgjY8|l8t6m*ST`i5Q8wS)#bn=ews2U)6xs9Y3UpBt zt;+2^L-v|h1yRAU?9tA5F`_uJs__RC*uTsJ_uay;e*RbZ;=^Yc07JkKNbQWdZyC4} zQw=$`wZ<%fQ&1H-b#8kyr$JMVD(1ku2k`vcmw54=kGVJwG{uPI*3ltgRYM3C4Y(#^ zCDJPfj4CL4>%6vCqtD#IP7{|R7g<}+m^Ygz--MiEy|a&cxbYiqpl@gA@K$A66{?>WoYKKCRK zpDVZ#VBNybti{B@#>Q~~+B(wIo?&HxkkfbS33@!{*l3H#dydmjuk!d^kMY7sxAXOv z-sH89FVkN+$zba^2RCY_wP)C0A;}D-62@9g%=DeuWLCB?OmqB%js_6tmRW3>3m)@nlgLjbC`tbe^@u@Y z$c=if&?yhC5;~Djb8~`K@}MIqVw;7#BcMfr)QDJ&M3NZNG|(?fu#Wvku(m{R+)fh% zAGO!`ORv7k!@EO1bLSb(udi_@stZGk7|~SSZ;u_A52evMqdlE!C}%s^!IXhnXYF{& zU0*rJGY_8Q8$Y|s3-4az;`o5UvD2tx$o`~8<_%cKpco-V!HtW1>>nr=c&QVWcI)xkCbFN<7V=-BP(pWR1QWdm;veFbi!(#s`i|dy; zJ5W4wev7X?d7ksf3+^0cpL1&WNG#A!q53OCMu0)o98oQihJ?Z+v{)Jp6W|8$<}Q5e zwM)Ey=@N4X`rJAC`Yd&0sGAz)1BF0Y6u1!4ArO5+`$TLKcu2`~U0|1YDPx^&7%}f3 z>m{36MUw7BGaiu^Ma*8u&gUr0j}JS|@^kMG-#+DWz6s6f9!Dpb4r?i(rP~Uo<2En5 zV!AUCn=GKE8wf;OL>Hj4c*dCSy(Jliu@+SnxXNKGmxXi+^z{L{Y>49>>dBnP?>WP- ze(pDU`o80A^k5Z`I77!o;Vin>CsjQ{5PUSmPSbgT@iagDa?mGexESF14`%%CE3fh5 zyPpt;8w}RZ(s;*W5*S2!cVfg2I37FH}2qmtHVYDF@ccAxKxyC;T2we`+b6U4Et+@W)EHVNT$cU4NRwVQUYC87+2-!_|$cv zwaffotq>cLLU+hGi?Rlj3|jtR2l~^c6eyF=r!pqb2FkJ@yo`Rf-Ofhph6EkC!)Y)^ zp`FEAjn#tFiPfGW&1W#%V;~L3*9#uF;})KK>M@?Vqhu3k=QDh48I4BhqK77jo7>7T z@sXm)%;ssxZ@w@@od-QHwD6suEO`DWKjg|{O0&9wteztJf=~8ll)*ASn2}cdFi`Z2 zK?j%}L>6s@JAIbD{W&@nw0g`pUipBRUwxA=KJg&G^o1umvk9AniXm`4fvbg~Gpr3w zepwY8kQ(SguL9~BVY1-lV3p(ReI8g}<4X@b%lBU2;~PJEi+3-*O=;E{uCLMflz|n> zVO)VG5o}8oK^cQHnsyd{&UVx7JuFo-NtIp8wWFa(Tw7J&kI*}xVrxi7dKaVdTWITM+5E} z4%zHgG$B8GQ_igE;^-|x#G>h~9LpZ^#U4F9;GS~CsS|M9%1NHQ^CaJY?-H+Gy3WUY zA2aN4QVmxLa}IX{X7mWPu)iBwO!wLDm8`Dy+1x4^tw1qw#N_hss$a1071jQn|K+u@ z9P5?*nU(TLNFNn&B%qJ#AEN#*6Op~9<-*=Lqv?`i5*2$j_yCR1ll0N%d-V1`>~7Dw zu{~jYus~V`3^1;u)D|0CO4Fj+Iq6`B)n=DFPxbh} zA>xQqcI1kRLqM0#p|?w8$E$B#<@xun^3EjiNgLU>jx<<7xe<$bO$-(!P&h*mi}C^A zc;c+3RE`vNp6f}eO9IU3E)Z>Bwes$)dz z1_jg2&&fBBC4@mKbr^<{dBHco4&>kzMfN#ka)^k@R*s~KjKMMvv7N`(8pLGZtI`#! z8yXU0QO=^A!S)7U9Y-(6c8&pte ztuWEj)=i!hvp|Y8ZK73uS}}+j5~F6mSWqd;VErBzZp?1VlqLnOqV(%c)6-gJ83jMq7oB2A#5pHV<3L z;eT%~vAX9#$Jhn(uownW1?Ys9kZsi|BmaUf!5VB);0l|6Qmjd#L8XSt_CCEZ<7#%+sU*+7?DERtn9ZWwQm*;Ea!Xo_ABm=jPGB`Dov(JHQfc!jFJ%0{(?l|D_G zxIW(D@BHvRe(=@>o_zcso_*>;&Y#v48U{wucijO~&|vY}QUp(-1u7Vn2HH8Z@r-jT zTZ}5W<%wf_=B{V?=F8XldoRAmjs5Ga96QDKB+`gN3pmp)dR(?gX{XV?grIL)YkU^e zQMzt#>UNg!9Xh3Z5-5d=DvMIBbJ$X%!{2p?lBLM)(k<2D?nLGtYL#w=US=L5h@d53 zKS)B^61wNA2c zgAul0Ax5#N1IbSrtQ|+qHM_fGUfbJc{LUpltb}K7JI!Oa-^NzIN2S1YNWO4*RV;{T z+E`PVin6CETA`j#8Mr>@dz#yBhx50e;ajf_`PNU~Huc3N0?qiT1&q=feenbEfw|UDZQaW%Z!vDwvmHIFiBJDifUz* zW;zE6C>$|0AT3G+lRPE{Y&SWdr{p7^*x4%rq5?|AJjkc=miZwmqw_T1oUQL9(WjE0 ze}9Qq9k%Lbl3<>$rz88`OskVFURZ0>-N;-XP*W}oYU>cQREf4O2clSq z?Ue)-v4z7rN0V9_-%?ctC)Nzb_#^)KZ$87wnSUX9XhJ@=LlRPJ?9x-?p z`&Stj8m}WW4RhUKshL(4jfHs-7So8N0_$_kch7Fo8*H)D2-gnw_)CBN`+V~o-{-SW zJ;)#Xr6;(51Rn!cIN(&jpd`nCBY~I%R7uo%sIm2lRW;|BNz9U?R2Bc?lPCG&lfTCA zzC7k{e&;20(PPgyH1iq7;25sI!o2N*cM8igLC*LBlQc$Y#00RCZ8gTAO-Cj9eL(L& z5RIcb9N@|UEDCGNZa2i`!NHC@oOO>Ts4DL~6ed3xVht%#8Wa)&MIrm<39`dbm<;W(#5&=v9Wmf}MKITD3`{%sU>yb>Jr#gm3=nRet!!MfPSx zioq&_!EyXT*!f_e7&TO@tgoJA=gM`qeaoH+^kdCFFlNYs_tdrLM6m+1L^Io`^^vvS z83woC$#}8HJNp-T_ebyYciw)F&pmlJzxk!}oG;;%P}3jpvp!hk##Av{ElJif4G|p! zYh@2i!N4b`+t=9~9b?5h*7|Vn3&;7z$G^hYfAlkc`}=RQHoBMXxgj)pSkM}Sb*^JG zYl^a$Iq7XDpmod^4y_Qc^UjsBM5R$tXHrMEKo{L{r6n`n)iQ}iLKl{@%2puJ-GFnJQXk+#bt*8@RALW*mgtI6_gOiaw<-(5)r4 zbLs%|27C*P1>CrP!1j#;Qc%RXhiGsPoJ1rBbW~JK2$x^ybhY5AM{eVnA3x92XC0eB z85>IKY{t+KwF3$win`0$SRzVq`Woos*fQ(3im+keYfs$I<4@ercRoDeZ@&65uU)%@ z8Ju7+9HGM;Eh&c&Sc^gvTOqcQdOpM8$kKSpzUT&hNZFd95>e%Uk4xTbl5WDDJQ&s` zsDVbSZVOf`(lR>kaNNFQw<ZJ6caLV{9(>0uyH$jyd#N_vxu8}PQ zr~<7@ly(?Z617IzoSrAH0M{YxY=w4N^q8_hg2y71)L5C(w=>QhU+1CQH~3e-_HVFd zB7FoM6C*S$uIrFRL$f=k91YQZO#p({3|H1!kZm=SMkvaH3pM=K^KbCYm*3{<6k4~A z*8^5Jwn#O^1yreowq-WnMXSW9D40&Jv8W<#%C>>bI(F0oJA3;iUlM)9v>A`L5TCnP z)qs_?TUaE|T+jKPAH2i;qeIKMHmnwwKl1nrpMC7heB-5kzWwUk{OrQV7`?!*9R~w52d=89Tfu0J!gi^3 z8ZnmS@**hdL^7HrIfz4L!ZAh?MgnEDG`2&4EmvMfXk9{*COL}|OPL%fA*lk<;L#-Q zsEPqe1WmxE2IVL8(wwcnaB8Ud?|ki7dGKtHJBOKUp~C`gB837~Rxl$oAuH&Q2GrWK zn+|Ao!d9DHL8!6p1MgoBeD~E0y!iSBu1*8GJVkG91xbo#Q6mb5MGx;RbrU(*-Dc1# z=Cvo-0$Z(8;c^n?Y(W{oPxdJ7fJ#|{(oE-pX}cg61=ZSF4%!{AEoS_+um6zme)oBP z?TH8Z@BYGPxp(~}*IO8_!YtEAs?65!R$>w+?DFO(aURvaMME%9PWH&N6E7DESVjy^My7y z0Al7ws{m+H&WyyQ&I%@(BcCL*f>4>sZml^SUX<3;GYMN*w6F2k=A0>psKo*o=G<|z z&vWPR<>`CijLVii!#sDwRq8w~xdE}f#MI=OOk)*66scLDV?${)r&juqBD1J?pr_gT z>>2L6_YB{B{T*JqaFMIC1GK(_TFNfON>IuWli=qb7A;hoD{;a8q~%~^$f|rX)B6xP^H9nTCZ?3R+0Mi-V*j})|HzCvkg2h;eHVQ?c(hV-n zz_*BR7=|5w`R*ZKxbJQrzUK~BE2so21%)XIZ6pLRPNS8}K07>>GM$i2lqRB49MnQt zIhq!F1yDngJiXYUQ%l(!aQyaF9=!b_zVTke*Wdhv*RNb-uys3&c|f%-J*_aU$Iojt z1!Zr*c(On%Lu0^ezzW7{Vk5-h!R7FgkTi%vOOC@fs612?11gde=$1Dt1KoZs61y;Q zC8U%(RNc*3ZHd{4C>^Y9nMkKP_DEVLpJ|O~5SO>`GseskCHtF=t`Pc|RH39oOAfG! zw#5!Jfg_{@WuIcS3c8?KGz@zylwpplcQEY^w;xwL{m3nR{+YXZ@YHG60fzwrs|^Kt zaialB1!jn^G?AMjD9iV|5k5ij%@^i;_k|bv_# zx$pRpFFtsdXYSeJt`)GcLHh;9D3U3ulVPSxdM?`{+#p*s7Qg|Tu^ur-F(vz}U*AhS z|MG{t^!i0Uxf=0lL^(W8zZ~G_QxH#x8lOCEGbT#FM$MqDar4OR+KkF(w30f zdS{Ha1KM_u7xLmsDToTyX3^P~3PbkwAM73Qpa1PQdEw<Jo+ad;Ro*s-+2BNe){fZrfo&pTO&|1pD$<{ z&#}=EBZ2+hJ(?JC#Q;@k!eoXuf+J#dz^8^710qenNFGMiSIk2$C47-ZIpa5H*$(C63Sr`ojXN^EK&9oAB5d@8Pw} zL%#pcE`Rs!Jr1wVbR7@^~c z`J!cVFy?aGaG+YYF$}fl_^@P%<}Xb}MjC#-f7F%!XSI$5^ilDD8&71%M=l)9Spt5v~TWl-~7;{J6;HuAt- zxA2*BkMc`rhunFrz;&0Eq_Thv2(1>%ekL=d&ZMBbp_$x&0WAUVJw}xorCPu|fQmIm zp}`u;XrY-CO2wU~fICY@?l$f`w#PSLev8%77Nx6*ZB0l}RTXVe>`x~-VJ~O*QD9Kw zveQ~eLiC-iO`WGX`wLZES}IgG$VZOeRZHuI&I5)BNxJl~m@;xsR7cv#f3?z``T3Ao zr@L)>(={B6?sGwzeCU-~POBRdF7vQenF$+Gp;U<|hjND1(P66vIN@qIt?s&pz?HDs) zzs>{(irh82unTWr^Ze!Sy~)Qr3&sbatK(F~h!hpg)RUseX-7&a69R%qNkpZDLGY@@ zhJYvLd<>xO=f-4*|MKs?%J*J; zoj>`ne2wFMI6Z`|Qn6n30f;oYmuD>VHm?=>y?*zsY-tzU=nx4}aeD0}zxnVP9=`t! zf9Hqq^Y?!A23N0aV}>VKUAvQ3m*`5dSS&agFBolZQVj;|Z(oOAfl~pe1lyhQ2((61 zcH$&s8_8KA-A)GzQkN`P^h;L6Vu_6PjEG0O5xvUNZ}uVV(5L3k%>mEeeU@kLI>q_Z z1t)D@6gZbz;?aAAMCtk{VCsd96~(lMTJi$3!7#>fJ;4O{?eBcZTOV)p#s@c;FC69I zG=u&IiyF4C?J=wjIt4-!LP|u{qQql@V10vWBdHNOW=LL0CWS0&)S^L`MTg<*cB4#w z4XKoeYb%qjUAE|xR#us^%ez+>{HK5GdA{>P$^YSUkKXn;-+t)~fA{;Z@%n`iNyP@o)=m*eYwYbEkbGo# z>?8velkq;O@eEd1k;x2+IzRR#H<4}m55CEL?iL358}rNt`sU8mO+NJUe^lKO%T$iE zo0jB1(1nqpJJZbhyNf;}hvVUSbYS4pGu3?{JkxMH_`sFVOuygVhmwP|+G_ zeT_*Pq`_KEzcdWAV0FMoPk%n;mw(|=?pn7zu(if*4vt9xQ|G_OM=*{?5|fm24x@1t zWWRYN(Zft1WB~VGA(1sC;(aAM7suk|KYsh!rIN;US-)3*o zQmkxoeB&6ks+ct?-%z53I?zt0T)EaTTXnQ2*J-y34u*-UhQc^#74zHIf6AbBGeLS zDob0zM8nm2WV-LU`tCj~3KmU*V4;H$AqJOPHu`J$or}!(E^^$?c<9uKXYW7DlMkHZ zzRi+h_kRR|IyQvVfYW&k&Jc)x;^w>h3#KhCe*d7R(*!B2VNjo0wKO^V}pGLt@&IuUGzY6CiYvX8*$ ztO8MxN~{sA&1gE6ZVG6Ylki59#DK{{Ini~MCFY6pP7ny;a2QObC540T9@urQ^-a(7 za;iV$=Bg~Fbr-~~bNAY4-Gz&EDSxKQK4?Scyy{GPnE0A%Z4;#}`+GCAfwf^tsXTu2 zAtwi(&pdb=zwns{dE|~YPWLjBuEL?KQG(m#C%$beygmC^cHuI?>J`(rk4y@lC$pOGX6DddoA9ch3A zW$;Q+#m%n1)=;K`o-a|cASp{NiI{|FgsOyLA5@yt)(eVQV9b zC93FS5X6tsu|=zz*g7N%Aw`n3pc+IxF+%bI-?r5CymJ?H%T?*lZCwK;(MVq6DiGEA zb~`V)Pk|Uc#wx0+px+;2v}Q4>d26!I|Nj5+H~7WRKgL&|dzjlcVMW2Z&O$nb1^q&! zXh9kzDOwMrN|ZBfj4TUgL=?A|eYT!E!7~q?;0JF``8&_Q#dm-5CU)&sij@QGDLm&pwXoriFjSD@vBUwt}kNoka}h_xNbr;By(NIk|_Lh@+maAl8FSY{z1 zi-@iYv>V{8FmR3mHF~x~n(nYMbUb?R9XxjXojiSO!Rb8yknaP@Vv7+%qKP%pL==jF z$&WF_S+=`~p|BOcji_XCh0ERPA_MONiG|FlTty(|7gH_Bl-?47w)E`g*cBPb6t;7bguc(6%CzMQKTVrkfQ4l$rQ2MMOVa5_90Pw z5)jdm9HKVFOr=CRt#DcpjllbeZ>IDIBM$9f##LkLo!cyoBo92a%-6s8IFH`9$fK)i zvy%g&O7Xig0}M=>2@+2~FX%4}sl8>lX+dPvS~CHzkKz5REkF728gE~?#pSgzP1Ufp zZx!!-GE=%hRZp>PKnsn@6;0EoC}bZH-gZF{p)*Xi*wE6%2J5>G1UhwSTWG2V*BG2I zduGpoCwfiLmLMP(noO8v9;z&D3t65sSXf0222@$j_uu-656*tfOV2#U&%gR2k3TSE zs5BcfP1W;Yky;Wu(_fStFOtM#YcgYD(4)v;H>9NR2Mrv1^(0??@+80g!6*FY8}GB( zRVVR?7Fo3e@-=2U60-F^3cwCZ^C@^R;p}Wb0LFL%yoFYtVO~=2HYv?B1VU&)HV_>l z2!d^B+nTzr6R}3XTAI-;bProt7%-d7XzB_PB1Nt#Oo5k* z7<29f!(aXT-{ZG__&$H)m%qZ#KX;g^hGBFZ>Gf%8u(Mr^lH_@h+-PQXOdiH(S&hmwtkHNOQdWue z2l^s-1CZ$N#A1BK)C zL;HF5)Da#(xsMY=SZblyaj{zqHuWZmQesu!mA(lLDv$)>Kox0&>;f)J&!@iE{;#G8a+bS|g5vBT~04%3BY9#~xD#1KZy25LiHWlZW_T=48xEnBu>qitCz z`wVl%Uua_d_w##2^dFRUuYmrSZ2jdMH{*C=m9dZn@3Ai68jlSghr$JqH5t}OW)jwR z;o9wn8+W#`wTI9rh5?Rq@Pm#$Bk-nz!W{n{hM*%Tooy?#L?QZ+L| zuq^gQEcbgj=LycGhbI7m=o++$NR?xh;u{Yy@btqk@XfPhe)T8sbN==fdW(l?V@Xgs zve!eI5@bX4HJP_)WQTIn-E&=c<{6hd&sd@i1er9zbo#<%!-w>g>kL7D9_O19$wJb7 zu;&cxx~ub`jM$~kp}WA8m~`SqgA@jVAxMQVUGZEj2CwO2rb?tL1jP(>=BUQ0SUXaR>XW*lx#^I3ED#P}MSOn`9-a5a_ zci;JxcRsz%jj^DXL+Bl$7)WN-7TQ}x*IAb~5bKuK&S*nKNka?{>3zrA_DEbe)wX!o zU}acqy5Iu!)4&y51be$eIIkF^q=EVIxecvHod1#qM5l}c zKvpD*iFY%!6fBql5NPa_s@`Rv9Pmqz_4vx^6<&XGg>V0Cm)GC>jJ5G~YH0|W!mO@P z^m5j=?{pWEoYUu!kxojXQ9cDN1rd|?A;bjAkP*B@MuUtoN#BCpTkE13X0 zIf#&5Q9buoq^@%m^G%>3N<+}8V8#@Q8Ll(XDc~m>MK&B_i8vWC1{RAPr6sruv9(S; zyTg%D#?vSE@%%%Fc>2VM`xnv_D+?~&k7q3iO=eOnx^>_rNUaDcDrU^unts-2>ROhw zJ~oTooX)sC>r*3=9@#+A>yzPW;|y1g8TEREE-qb2ffE9yQW~uQ3JroSdJK7bNps?r z5np{|#E(9h@z%MUT)cCGP>!%=k6J3G(cxso3!9ALYXUaldT)$d5ljz^I52{R0`fdZ zR7$_~P)i8A+dt`Y@JDp;bU_k~lH%9N?VHn0du$c4E z{$;-Y;%SaA2@aIW_*Cs|QM;O9Ss=vhhOHm-?_nW{P+XzG$j>1yy&AvK`v5CoFu~f4eXq9k&xj`yL2+(@X_O3(e0ivH{n?ARyF`FOV;^M~d@~!Xo_>*6KhKCO= zaCoGUnW7^T{4kHhrIL?_9D?EPW zejZqmjC_rWH4#N26~gqoEnA>*6^&~tiXK83c7vmphA3c12`-P}{5bHd-+rC9-a3a+ zBZ}T3TvRx(7!8-GW-V=N@oj~oA=hd1;~Ps`)np1{P$}F)SfXe_I6{Ev9nQ5W9W>HK zkfeUAx0dKUv1y2N`=9KJK$-NpNX2+#6O6%>88$O$sgM$k&XIY66`I;cvTTKNHRHn@ z*ZA{)?N|80lMnI>FF(a2$5wdYuwkWKV&YoHvnk8H5-mKLHdyEIF_pWylH`M&MImUs z<4z;_h2xS(jx2EIz9;y{KY5?CSME^D9H$F5t8pqygH8ryG(u>U$dJ+_v_p8G?iI?X zq^j;7CcGzlg^U{EB`S2GO+gc5GRy*!pKdZDFH%Y(-jdEw#v_|lX6IXOz_t@M^sv>4f; z89OF6DoeLHIS)*M9U#(UVhT20&4tfyaOz}6-xN&x1AgttpRhi29O&nqIdO!CRtpXY z#Yha1Mi4Q{$ml@|ffn6$5>sE_h(3-P%1&62Ir~(}u~j(sT#u*jJH@wtc7sd1j*F8m zWq<>|Jx5P#}g0S$NKJel4od`G*evS#Gz%5Qavm% zX<$3R+5|4IRouF<4Kq;m>4k!@zktZHI$}fKDIbM1oV?<(W`*FqcLJ6%&h8~$g(V?vT z20N1}#o`K6=h*eoWPO}~&szBPA6(}*zW)}twk>VU5o(ouWk@D++PbBg+y>XM&{sq! zXxo;iP3EB(1j=_tsCtGB34Mt7U1FL~vA(h;P}7Enwr%jf0F}PYwj|cFa}X`URfu2- zF%X5r8AXhq{rw)cZm658GjnCwM&PwbcrKGCxS+_hR2S>a(76B4P?Hij1Fyb2n}vJLn%X6^Z-FUo8V($R1DB4UO5UU|HK)-b8gBv zKfcOMtC@vlT9h#rnlhxQBp4brfnFGMAa^`J8uId~Rh~RE zS`(9=3GcnK*ENE)_)TLI2qb$oE?4!`<4Z(!-+&HY#x zX=jlv%TYdZXY(=&g+!34fba&{vD7P68BslfsfzAZN-!3jl5Hm!U zCH=B&NvVdKS|)A(bqBSEi|c{g>vuSJ_A_1^Ec4Kjk_qrhki2_y8^62BiA&dbXl2M_ z2bOu^_%R+C4%j4xBPjvG24qOk5fPyc;EN0`GD-t7G_=!gkcx+gL+%^G$rFe9@ukSO zKDxwvH}0_Mwo#!+S!!a|gGqt%CCUauYzrIPaA|GEjjb8CXP%}B;3QJ@SqK?r6cpAaPV@8{)9nik zl;io+r})~lkMa1?-d=iO51aIx658mQS_j&obddrKy4Tr+F0BlhNLa7n`V@Zcdq3mK z?wDIuOO^F;g`t)LKefm>Av*eejG#JMRl1`eAZD+@h#frozi3_tv6oA17Jo^v<1nTDKJlsE}ZP()oM zgA-l*X_?``qxKlm9R-Q1xyBV4}+P11O_wLruM zQMdGcix!b)dxuDxet2uahfdd-3{@hguAB6Z7}{=#ACgo?xn#gp4bgi-0H?Ypxr+oF z!1<2q(549D7?Msl7^3v-Y>X2cPaBjpgx1l{0E`Fue?83@!*ziYzP1^MV?~ zr+21Y`1S|<@cqlY_UviC`rJdDJ_`GcM3^2Lu%SXaiykJTjGax1LQ)KRnBb98&?At! zz))+BobL1J(MR~!2RHfYr8S%|U@J=7puA5*2O!P-Ri}IPWKq%cQx<(q;RQu(IlR>4 zsRM`krDKPA>>#KD+PF=K8X@~hL*FL4g3dHrlC+-DVUe`D&yEZ1M!}AR^IP!4_b>Ci zZ-25dY1^dyEr=TI7;apeaN*NiY>gchL%c50N?|fhDJ5AoB~}w++fs-v zmfS_2d~Av5pL&7^??1rO+^`4aNCKKF)MQelL{4d7+)Qz*WuOREI#;s5~FN{n;&QHNy7};k*V}cDOAIRYPcNvbILFHQpzCnil~PK>LoiF&|ThxEFmML!zCe zK4U^1M&BY-OYlt^Uw4SHqJZgi%4{+vstkfBx)iVgF=;zPGTDVtA@JZ8wpK)?QBo74 zrM4E88{EVbRf|*xp%vaaq?BZO1icknJLTfWCO3Zb4PO7rd%XO_NxuHV<2-vR>yjo5 zl$7)lXap{I#E@74HJ(H&wv@JJ;0^oo0sBU9`o%+BdEyWsd^X`*-~Aq;nIfkXgj}TR z7|Wr|n7CxJT2zYBbQ8N-@yNavo`38VXC64l{e8i40jh_++%!siK7yoFqC;>(ewwM2`?HBDUa@ZCHpl>3gLn#(-;TLI})emW7eVkz`r6X=x@i^1Pgb zYLYJ(*(EV{m`B-}Yn4JsNeGeXEkX#ih_JhbRuZZ5WUAFVMcC^cVS2Q7#!i^=-Jjjy zr|*Bti;o@WkACfCo_k^ur(iWp#!%P!fKd=*Mjn&ef!IKBC^2DGIC}J1(3)dU^!X!C zJkHx^ALm;?e4qC}zKF<2Q0`-GyJp;aOxee)46OyOoxo(17zM?khj2B`cubU8iu~3Z z5dyKB(kRkK)cX{85@W~Ph_WMaXo3*LU=jm5FUfj+qSCY>q)u~DQZ6h|H4Rcizn>GO zplK?kS1k54zP^d9H#jsbdFAwj{M=KI@c5C0KpX%fRB1=c+yU-V;~_v31twR_fSsyh z5-s!=sDN`G-nlm6?aSMIbY-3Kq`}Q3_YIG;6%w-a_Bu>Ap%g2OW5%tW3e=EH^ttre z7Qgw)HIDTSzx2Y>{NkBaj!7s}9Z$crm*^R&I^t!3g+v%>Xlax~QZr;qNx_IAM~@hu zKl~_XFQ4Kk?|sHQ7uN}+5#vnJOd8ro((4WB^#@cTW4tp#i-Ox%YbM(bhxhe3bui=L zu!odAcDJTDuW_cwrQ4hAM#FXx{I%T}ODunKA-h*d|2|sx3g|x|>sPkxxEm#HG_*0& zni`i4nS_i<1d5!@019qR61sW!R^;0Go9y0ckzznO%$YWhUS8l_ORTnWeu`lyu`#N*i-ZzGkV-&-IexzpCPs=y1_20q+? zA79+$t!tZnx>2#+7SJ1|zfA@3$$(VgDWjtl3)E_bOHJxpuUU|z{Zy`Hof^B_aQ?e* z@#e>?y!P0Gy!5~_hs%Q2Lmpt+Xo@0F$zM)(311o$Nt)Se!l>UP1W;1)m4^l#J@PD% zU)bPV@1En`^Pf=L5vvDJkYxpH>l-vX6GYLczc_#psV8IPpieZ0&{ov-Ea?lBqR4Y> z)g-KlNDmh&(g-$DMdICXMUpc;>NIMPO5&wr-;w*7&Sq53BbCPVN{m+c=&)gz1FH*c z-@L^7&2{eEH{dI09^?yW9_GwL`#8Rubj}%|Xfas8CSA3WfM9#`CfUM%d|ptKHaIgN zJ)#xwUxpw2_$EJi^KEWyO$cU4Ec--f$nqiWv`U+Trbf3lrmazJgJ>&4R}d>mAu=%{ zeCSMr5n>8VN%9s)od21SilUfU6oD4+S|CyXBH+F6-bb4{`nE;{i@+saxyU=(LyZ)c znD~Ckn6#i$7!Vdkj*zM=o+HvLq&Fy~2ue{^74!+55FaCC`3 z^wlRgI20`DoC?sv(o+RWMe5L^Wx;Me##qZ@zn9vC&6K`ZoXiUL58>pa1D0kFa^bVj z7)jR+G9)`*CSAN%$yC@_PG#`SsUy7l@JXI~PD^G?%89I3siBgm5=Opn+)0&R2 zEEFQjjyKp>-PD{|Q-hYE?5fuU$939OP)1N%MnGO-WQHRdZErOml`C9XvQ5dw-5DR=+2P%58+^Pr zTlD_}w@8$$JBS z`PtLF_P`1;gSL+JydyUTp%dE9MW`D`OM}udP=O6>=gwL}H6=_U)0Lc20aEvw)=-NAdP}sb$F_r6 zQzM!g|M|6z_@|Dp+$*AgpR9Wa>i7Bj@3*GW2ABlFRx8*Jf{Dnvw7$)6e&>grdG=Wz zd;B1%B*U#O+?m0JOEuRo-GT=4d;zVCgckD_tsTlw(Qb##Zn7#H9yzqg3y+@S+2i{; zohM2|*L+EV6~09Vha@1Rq_!GeOWJ zC^{l-R1iIRbo6~o5nFO^(KHBAvH!p#vP>qh3)inu$H>mCMVpf71jDvaBZ1IDY$IBV^fZiMUCWq=D|0H5ipbBlYA$Vh{{FW<=A$dy zj3+ae_Z=iFhTPfQrL9^_-Xqw6F$OIlv<<$gh&G|wh#p_NRA6)k1kNG5Vv;VNd(UgA zREp_V$w(NafpP(iK^lWJ5f@tU6`2VPbC|7PSKXh9^U^HJ~+S4Pk(lu%QrTms_3n(&?^Uw$77n= zq~i!gq;p^`(l+UHXNk_?L;4MI-fa&d70$tRm9S5VYSDM!)8VYa z)4cq|14s!I;8(tXhyUO|{jYIx0fL}sr{tjlpw$^uy^xBnFhL8~g+&O2&i!p)5|Aa0F8Bsykx7YxO`)c(c%g#D+7qoIFM!@<6Yyd;?193=D}kp zd2mHyRG?)SLL_T55D{0}PE<9ZqlaOM)PO}`fjhvtHMn>Se(MMCaq;?ujjaaEh+%&O zHqy>2V$+ZXkkLZ0c%KUA=qqCAaCENT(>TW%Ns6363<5zwGB1Qd1dkUjQ3;|-!7rv6 z^X2D`^B4c)e}nzQv~ifB`4j)v-{7qeZX=XR@{Gz~@)1W%aGns8(KdvneU5XpZHx)!Hjn&Posm$O|0z!#lYIlI|P@5E)ZEs zC^BrOaiS~ULj~0q!cQn>YwXtzFF$mYUwrWi9zQ%{1dME8ASE5(1}VBuqHn=Aot8`h z3L6bpYn)1~^EKf0+codryvf_2T;=xEiftc~r8zG+@w! z(!j?0HrLL7#Mi#`9Q%3#6J`ik(=!4U9l4VHnUe?a)n~uQ*S!w(@6+|ScbaIeWutb? zoM&t!+pSBEb>`uGDp^T1(_XuTJLB1rdL9l?kWjvGkbGzmpE#9_EKu4zm`R=`9G z&QIY7>to*d>n4Kv70dj0Lp zqBDccG6p(@E2ND=VBeDAv894Ti_h}b$79}n=Y6i+x=CoaIXqmz^?OupWa2Fla9-e| zM`?}Hnx?7`(L_*E#^Me=q9^aK3d(~t7-vSbt?t1Z|D6WRoH);c{%MZ)0)0WFa!mJL_o^#Weyj7b{U zH_lq#c;^b|E^lHhpgc&isPML7XKRe~4GTh|LW{3v;9Syzhs1MEo3qp*7P0NnTM-#O zxRmNhhrmG5MD|noTAsyX!7@=m+tf66%!g~9bN{#B z;9EaD!2kFcUgpI|ldQu8*k?xArXeD+NT$;YVqj@l03P4YaP5>{Zdok_OD7M2C}=!1 zEi9CC9GAxgPni`wef&NSu1bu9+13qMl6Vo3N}#g>--Ti8?z+9>8!8p4NfU-!0p9w= z@!LN>%TGVJLJ$jhpQDOpj4JW7h^rjZXOv3es@o9jWMK0)eFRGkwksMEQHJ2V^SLtt z#7GRuH5@}kSqRY~afFa!?E^kt?`=!Ep~x;I1YFaCOG%7D#BMs#CF?~%3SnYrfqKvFn8*J5)<{Ej7^lu?{XD*@9K=V&R^!-%^j{y96OC7h$Zr3fXpNX z8e2C^r!!&{OlRBao+Ww|K3z*OdhniDM}(G;6=+jnMgyANTQtUV+i&rY&wj>xH*WIE zGpG6TGpD&Plk68=6Uc&T8kVwTEKDgyO=rv&m;l;>H))d~G`xJE;Nb%&cW_5RbaMb==T{&z?NYqsx6( z0n-8MUCi$i)dXGgi2%AlMZfPV8EBi9SeEPx*eMDoCUqR%y8z$$_yTWjt#i9>Aq>eD zhZJf=XcVz(&@obYk#JSE#o3xRv^Xr4@OUM#gGGEj!M2_@)Qn7yaFH?_5XBJd3nooK zngx1`1Ji^2N|L0r`j-jgbNAN z7CgbH&TGUIL)=4hMJuAAN~5P zoH-?_8#tQhtWTh>8~THiUIDv6h%G8pWZ6RM+{ILk$_UCDhA8p?)7B$YODR&Mypn;c zfh-RcD879wd zLNrF_QyOLW-E#?tuT#oslz^C1C%WS&k`x0Wl6*o6R8+*6t{XxMS^11LPnF2FpbMpqP%Ogf*#(FiTk_C_V4F|q)A76a@KEC~vkNDvHEw0_V z&Puj~8jP4uJyjEsS>8#O6j232NYjfLG%>_3Sf!J`>?NwmjyavCSh6gMNCF-yBSm58 zmnNmTMvwMWm~5lNloJPreDT@G`SOcrxPO#TjfHCveumK*N@YN#2`yeq@*-zODwL-& z#l3r-lspp$YYqH^H!twf%?&Qy-lhr#G8>^q59u|=DwsB8N+Mbh!4S%vnTSaiq77bp zbT_%9wV2pVFLF(mX&N^}c}143ke5qT%@$|3*Es*Ywq^#(Rh$z;LI3t|Sk6!@mZg@7p}!CETU(At(iePul^WQzab;PSmf z`uEtnS3v(hTK|tt8*jB069l#QIN#|~jYefX%0f{Tu+_l04#XyMLVw4?)YJzKRRR)P(*yaO>PvK>M`r2ZGu#M zI@fflF^QLki7DCjidw^tf%muIJMXOX*10QOomRA_fNX#&dX%O|<`vGhgjr3r6)Fm% z_c-V9&f%jYN{}XX2>sel>U2r)($IR15*l0&K}lwMsMz9Lk2i*5c#zfzE^glD+7I66 zXP?~R#YZ3Fm*>k$2B&^-fBUaX%IQ3mbiAp2+itp!Q)>#!V?c3 z;J3c}7H@oXg{^5rOGz|COg_RCJ?b{lG%W~4KFFwNReI3*WFSn~HJ=K|j=~`Yov}%# zSY53U%AkZt*cq~QDAzKeVrfP5*ztqB_S_@9_~?Fmz=%kh$lB;$1_THKU)KbaC=NCX zsvv1o4Z#f90(Kny;N4w*`v-6H{>9tO+5%B7qfCbP7FX}$CJr3}y;6}mLu_iMyIZ(w zO0Hz;@_LJpuG@5ljuzljN4M)Z&%0)HaprO!BGYxK5%W4={)tbBFK=m^Dv<%>-41m6 z`+aKv`IZ=4q!0+Hy5G|kZ6S2w5;1Ad=iTTilQvo?g7QQ(5krhA_yw8LB*QFVeI)7< zrE|PA39;5V2BZB{lP#j?QItJ?eD*f)oc&w8^z4)T@>iZ>x(X`=3GvhpwglmkIwKzxi4fzH5zHdH4xq+ILn{qNsh z-y8EA-}@;aTwQ0XMwG(?1l7Y@N4vX&Fa^1eD4kLY6`rwY!I$-X=AM-LAuUZ+6mxA znpEs1dXnS{BBl*0D)}9vkjX$QQ(U$U3Ki4F$w!k4=qQ-3uMwn1^#DR47Dm$$+6Y zSZfH4M`kY3TbzeHOISS8l%y3YWpDyq9mCrn+~MtuS9#~^Cc8m_=#%vqF{)2+g3x%d z5jP3UgeBOBmmoXiY4kNniE}EYHcFS~6Fwx*NTaa|d~^&)eWDDECu5>sqJQ83RXgG0 zrQ3XV^F!V}w8n=I-OtOX4)N4JI9v$YLJ@a8!v%%uDx>7_ju;g{LMb~UOgqDS!BW}h z&`QQ5Upd3+bL;%*(skb3m~gwT*>z)(17HDE30Z~|2G5M(6g8eJ*ER`mfdl(A{SwMt zGVvgVCXz@qb=@#+YX0=)>v5zN|GOjiq#eIk*1ZGq`(XXe-8xQPVCp<=h(w*!I-9y} zQlWGYs|1yYv4c;qdOo?j#@gju=+y(by4}0E=4FYWr6Q!C!60jiyEj>MyL|bf`}oBt zAK^=fd-Of%SwMLQWdfX2vSj7hbnS>Fr7Y9 zv9hv4ZX`Rq>(uo&MJXtAiT6`>cQ#lmHOE$moH=!fSI?Z}$z@mo+R050mYPMS(I}F5 zyr69aE=Yv(7_*B~kr|5H(?F9i(P()4v&eVe`jmIh-(+nPnR$)OMp$8}W^JnUjKLHg zCBml;wDb-U0y1G=nIm~3 zp$KZSy=aU?UhzVw_Ycu25)}?XLz1a%0iWE2Pp?J(&OiKJHfMrK+i_3Jj3A-)Ew~yn z-bq@)Akb0bDvPaZa-kTMJtjNbseq1c8aGFWC&@1G9Zn_`m+yKgIv_4}XoBg_(xG@((}eKluxP6G90g&~v-w)JdLVN~&xn zb>Uo%3@-hhuor7Ax+rcTWg7L+}l@o|0+BXb3Modz6=-JkHZ6dyE2&q4Mcp>3 zSkW2QI<%0fn3+~Es}LbjDn%wElks+v5O_iK0clg%jtDVf=6vY7!!C7{=W*&W?6J*7 z0Af`*K*{^FnK+?8F(BVM{LFeIQvM8uG8 z5keqihk!(P%*U*A{K+J%&t;x0k-5N&NEIWs z=rJYZ!X|wGolE@aXP3FM>9BHvkd0WMG=!LfXhIh_6z3aK5l~&sw0bTzFL>QM0KbRV-@8{T?P0w63OcHgy%HMM;OSQ?fAQ{?$IOo;k&r&)m-=J;4Hw9y3bs$k1p} z02y6#4K40~wm391GHMoR5sZQD7T!G{`To1-c;n+M?0SRfEzw|TtxEbhz>{LJ(!)88 z!9|3Kr7$KXvxz_y9xoxNh!BxMn6kQiji-(+@zPUgc=oaTIJTTdt2zX7>BvPIpNEc` z;n393;nmnn&TG5RcRifD3g7y{r+oK~b6BxL<8z!y2samMte-)wDU>JfY@vfAdV#ZH zPvYurCpiEJEg@QBs1dY8T7tLW9oowzSBYs07Gt7r>;*uOI!X!Y*WIF|?uvjG87DBi z$$$Bu{3-sm|Isf{HIY^e{;Oa48GrUK{!Q>DB0v#l=-8q}q*Xbye3%?~wnoRKuZ6n> zbYkMkgsl^@Gi|0K8l}6AwE|(tvK}fkNz3d~bh{}BS z1C{S^Y_;IkM^5sUXCCI66B$bavoB=S(XiDz zHpK{~4f{GX)DA6@jObv?!Bqw4?l^w<=6Qbf&UJR|DzjQ6eNABknR0kn;e#at)4IV< zr(gp@DKa1M^$gKW(Mn?56iXjF1fz7J+YEN*z%W0q$pD%p1sxSagieYR(QS&U4x-uH zC<+l#ZpIT2uJYghwf{2*78H?4gXXob|3`d!WkSp%@pH+YsfY$4;y-c!OdB4VLRPvU zkqBrb@loJ~!poc}vXr=|I)h!7?fo5EN-`r*5(u8g21bjAv8tezU3cFYq>kVxh-Q{89O$`31e%{xk%|y2g!IUcjWZ4gD+?On<8Aou*Dv#< z56*LQ5}2w5Y%J1y?jj`l2DVu<6H`Ebyg+*H9%Vvn=z%b^t7e1HQo$pqv$r; z>E9-_LK#hv0&5+E(F!ulsagk0Qw~PNC>T$67%mR5uEM*D7^mcF#(n#9zWC(*y!hBb zj%Tn;%OWi$fgTw-1`!p)f=M9*sd`E{qm=&?p^{K3cyHbD!;9B=`}Pi>Ogz`Drj|WW z3t$a+L1_fl&N{RciX4W+oY7**@e@ZFEgF^=JJnqczMdj|ONPTlPbMXqGAtH-{=HFt zua5f{wC=s}zX#WUy)lVXC78;2hcG$VV+aHxX_Uh0WO8UdtlxplS0>!LzRPUa5xpYQ z`JSWN#+qn6L9}GCA+F!zXiswb;D}cqKEf-f4sa^Z>0ycOgj|(KnI$;CP1vWd)<_+t zJTS&{#|E}TL6ZwMfwynMkI&uV?N6>VC8PEN7Zh4(lr(6i&{5$h7STGqYjJIx2o1I+ z+SE-+nZ7Y~X+lU2{+Jx)f&iiEB5G5CgVLQjrYo{cXS&mg11q#Z7=<*NXcTowVH`$- z#!>IAqwR#pk00O*j~(ZiUp~et!cv5ha4ZN7SWPQuqNR#*~Uzy}E#Y()6c z#TozTC-3p*#Wkj}Pmn`qt)O-wOhJ|nKo?YPz`KCbl0j)up(5A`FvIAU5N236B`-Ah z<(_}#fmQytRK8@5v=ycpR#SMovHW$G`=**wdcU@*r zv2IUm2pKb?^vLMQW57w6nT~%OJSwK+D1_+9)^r7yL@2$-5=M3=v@WnCvAGROW+`Ao zCUarb8dQeVhA1=88ky%vWl{mBBtj~p7Fg*ib1>6w@-X44C-38ref=q(K9~~MR|Smg zHMEkfnh|{rvF_vm8PpwuE^J?-x46i4`UDIG;GAbH1&x$!&fuL(@Y^5U;LQt{n9L-3 zJ|e*~JkdFD4boept?{ny5(5(|E;t9?Av#J7&Jv?Nl*g->h;*&x%!7ycZ~w}lb5%{wj~m-*Vu zpGfD^ydya$+00Ws_x>M=hn$Y3N;o$)r?BXBKanYDBr2JXpOPpw4>M9or9tO}tN>Hu zrN(QGR1qy5&3GNrY_hM6Jb(H=zW&AMc<%897IlK%tSSgKIGKX}B$gN}bPV*QK{-ub z1u!L6!&E^d;FB%S@4WL7zy9`TxNH#`sCF!N22u`)azNuV8ky0|i^@!5v?uymB0~5n zL+ugGHoD#6*kZ;PpE$`^UpUPphco)5no!ays5)%#50y?n zmpctyT!+`+zrq{uo#)Qjf*BB0fzTzH=@Y#sx5;H%j6nrF1hRO?sNk(6(b!QaSI669uf+!s!HsELIFrf^)eB+g; zc;&H!Jh7Cx)@9qWKU4Gx2y2m|$6c4`{JBUnwkl66phmL>oSioO@aj50xw65z?S_rI zpzIxIw&P${V}zuyGzy<&jG`r)mi>p9xc~S;_8){nndCp2024fRXA2V}zDwI$CEC%M@TDT|m?pXKP~J zrjea>1nZJ(-=&z^=zWKG3!O$XB0^_Q0@7&G?qREhRLEfW3|@)*de=At{Fl_FErwd2OA%7?Cd>W~&N}D+@xC zFZ5F?T3az~w&}|jVK?ZjnguK}Ojuk{eBt@W`9m)~z(c@((cz#kJi?*>*)!(j+H&ic5yC7*a77y8=1}gqU|L=PRaSdTt=>zAA%2 zB#3X?&IpaCD<%WT&?2yy?tyDbT;O>}RECy-Kn1!n_vbhdLMF4PNb~>LNk`IaCUu`g zBqC9r96-c~P_dIo-Tk@PRUZLKG$PUQqD-<|G^)42_ISbqOQ_xw-~M=wH_rcke);)_ z`B%So8e77sSV2*<)$StN9=*Io2-u#&RKUsrdSwryV`DZZ^p{xzqE<|RH_lD@)|+d* zcWIZajiZVKh=zI^$%Rivvvc6mH5hH|(m|4JOZY^0h`uAl#6(fS`-EQX(jt?5z@_sb zMna4!DRLfu6T_aKeNOI4fU^#17wOXTECP|ja>85_pP0^3b$}l%kro+~Ry}E{yE8`4 zb-xjjoC_&j1&@egkJJ&7Y3h?$aLJ$7+EtpNK#R4+Nx0y6+$Y zQI*8#@o0RM^!FV@x)rL~2H*SHHO_u|oo63A#m|5FMP7bHaifO)DS^JzzYF@Jj}n2& zc*;UvQj{_wlqGlCkR*LYCL`MUCFw;PLzR@$>_a@W{~-r&daiEgF`H7~fD&CP^P%_7dW<^Y29x zO+zmX*}*f7l9_<9hMO^M*513c&ifZ`a%-n%w<%DAeH3}05YptLsaiCa*d~8Vv^G&h zoK38J?-H>jq}0g}=5(Hj>#ju^0bxIvuqY5AN&J)-c;Ugv#KjJIx*zF;r9>N)DG4%3 ze4;Q!nG;xmI6-NWG-fEEp_xb6A8J7LJ_oNI)gj6;r7iCoQ#|M?Nc}cjPM2r$tS+ z3AeAZ94udY;xu1-_B0P4RIC(9^PACim>p!Dl^xKEA!nwQ<9y%cx|IlO@O;t#XW17#E0bgPYCpbxUk4bOm&Doqp0gg!KrYI-7)4 zNXM9PZ%Ip;I+a0mJ=HFrR!X_oeGVP-HLAPh3bag-v_=z+rWh_zcWGT&rpb-QyBT)2 z3(c4#i#?`mmwEW$B7giFuknQk2I)cD1`g(uoJfK1NUxFLJU-Z@$tGg*9FL*(l14%$ z;7SeOdw-qpeQ=5Q*IH_`0H#OKhQ@(&j#79=CJ=XSup(G;n`^+$G02{y!50^LLx4!i*7q4${^~MI3(`3CB zgdQ?!BC+xa(?fWVuomTNbUQ=1irCIl7qXiSxOs;%q~jGso3M2*#b?jC*D=_;bb#O! z^Lj7P{qAuEK6jiuO2fR<)cscoPa7s=y5c|j5C0wh%|G#rF-k5 zWr%r)D|3`S5Jg~SBte3i7sWz!d50rjQjWHAqd6vO`y; zaEj3BXoV?|#(>f(ltmeYN$m2vn$VXS3oAoh8JSgUEZAKR^jd!D3#WPM$&);^+9Shr zs8y8RCTZG0EYs9Mj;}#~$a{=vB-Ay0cD3an|L8|tUTe5=TQiFT;zA!(j&CfsP9Y{~ z>f=(k*f~PmB5a*J2_bge?j{w`F$Mn2JI;dnrYZe7gw&B19lu*dkBA93C+FJSIe|lf zivfut^BFRDf~fJ*;P#|~b4?SH||J1wdsXzX>FVIHZN z{w&2FfFg0eMMu|68>*xdPRCP9osf4jNpqr5Y2(>Vwvv%I9p^M{h-i^E;h2QFbGl3> zQe!%^qNCr>=w}gM?a)p(80K*N$N^3r8u4%ZtItz780D~Zi#%9ZCIp?zp{CD4ckMF#9k+E6A_71RBDcS~1QPS__6uKcc>$rBEB5ygE z!AnOD@WQG4dHRw4taf~IO`=<>7*Q&{d9x;k9vP!hQXue5BWw!8j3fcu1kSI+yBBWr z=D90exV6pZEQ0PK)BvLkl*kYPymdquyT(bICLGr8d0}XqPQFKXpXjC)T>*Vpp(8uF zj{KZIBAFz;NJTzMlSYiG^DHurnitSzue&}|RC!Q>C|sH#;8-dn+cz!{c5ZR{@FKtb zrDu8V=|k+NgY8VmEaiq$7b)PVbp#hN%Aiepg^h=4cV7}&lFDtjuwKKvmmKe0S?Ar) zu5jB%!oq%RvB+){iL<#j#3N-(FAt0s6|4J)96Y?p>awJ-64^xtm`xpRJwwWvjE}-1 zLd#z|dgNYh_s?P7>p=etUjOcUZ^zIdaV^58OI;K1p>CnI8d(@jKXE9xYS`L<&o1t; zyWKL`9^)DZomoa`$c!b#8O_cbq8@W1~!KsA7G)hwuSPwOo5CoCaD9MMn;r)wie0bq9YvY=kDw)YXt!eB2+BV_(Qf6v+q|r633e(jk;e zvJRy{b$2f#(|@%h1P$Kc#00IANzBb!g0^H?Mt|V|DlTz*>o&vDG0yMo@)!R0Z}8-) zWBmN9FY)O8k}0r{MC>R$6fqe(1c`KEX|SQ8l!D9$#57V4N(KciKflTYr&jsiC%ar& zpKx{U4pSSE!xE(=v8~bdE(iB%4w!=HjveE*(+~3K{+!Z5HnET!CL0ra%L8&FX`;o_ zVpN7!0#Bfg5g`>-kgPknqf!vcw?5e9*S`HD)^E>%9;)0=zZeq9Y1*#H(Gt;(@Ub=6 zn&@h1YebuL%rS~|{JbUXjqf|=b4cB!(1m5B&SdIP&O6X_#ntBv=QtOdbkd5uD6W`B z$wGBsPv1Y6_3X)3V)`1f>xM^_UPI^B3Nm!bgX~2YMmlnuP~c6{Zj zbuB}ZaKspidfr`C#Dx7IhHNjQJ;s>g#M9m5Wb=hH`wofbB9nt1P0;$Zi8iO&_z z$uQS7%)39&Pmnz_#omT2q@sBbxkr){q0_OGx;yu}^H9yDD59H8%+JG)ZLRY3f|Ld$ zur5-ov^g#F0aZKUgKJ|xzI2t(E??viz4jbmeD)L`7(`epdq`koRx#+6xb93;z%b8I z1Y)c(b<3m6Beq&NHGqHjk3GQ?&p*L`_wBbhd-E2{D+f@;VroLzZB(^|w(G3+1E)_N zkZd?2%SQ+_^~}=F>NK@+>`C>)yyNV;?z8JYpHDnOB^w z*EVkOSAYF=zVqHezVgzuyzp?rYJW%rWWmxGg2nFnsRA@pk5G!-B-C~Y&`hA`BZqT= zTYv}7XdXX&h(`|@ct^d+iaeG?xvyVQ; zH)G<$gsn-7ml;tOpfy=fkQYz~*t`XoukLX3)-JnKiSr36PcD+M&drE*g`LgN(@hS^ zmIoILUOsh{UwraWPA>_Dz-+6+3^OE9^o#U>nPYG*=-@FXP)E;9NM>YIvfw&!ZY%QH z+KeCl^gNrB$gCBJe3_W#)IkxAqR7hBt?6!zzN!dKgKR9cZ892pkk;dD8uup&hfRh> zXAxZoIu$yp=-TT*h(PQNb?HS5gb1nY>_d9EI+r>@I*t1gKCxVb2jj3+h3*f?ijp8D z-U=)d=hN8O3=gy0RusJvsK5_D+u}zTe~agye2lMu;eH+*!Qou9(mj8h*deM&(tu1x zw4WffChHr5Yq&jg4ElXuT87gvE%51hf%iTYoc-)FSMS`UvX)`L$I`xx6H5#H!t+n^ z%u;6#oH(*fCvE0?TgyIhHt#{Y>t)INl#XB>+ z9@0N_f~F4Cjl((vQQ=+Er5Y9RZI!fswgy|JLfSPcz{GhXaZe{J!n}a)img4(VyAcRbBH8C-7f0?L z-Y7(HNG-@RaMLY<=;P6ZRjj_w(o<{VE4@(ylr} z^qvqbWq-g7!yD(e`R#L?+`L+G{Z6F6@*vYHU~LIDjhAKH!fY4UI#gcby(6}%h!M6$ z%&$Awq~g#y@D@V5C!tDOcbDS0LyC{a2ju)1lOz$r+qA(A={V01W9+bmFek92A}I>j z84}ZBqm%o@Zu2xRmhXBY?yCCdMfBeJ(VZ(|u8p2cJLbfdE`K`;)nO64`$!0#Bp`Ou z6Oso&bRBeLcTOd^p~k7Eg~epi}V%|BszerE9_*7 z(gNx1UBkF{ce~K@`%0wSKy~t{&#x%&o=0?pzFzEiaQF+W+`|Y(SvY0f|MW&HnVH|92-y~}+akRo;m{jrKAC&is z=zm7*UIG2jdHqToI`L1qc-<(esBwoTSf7{!XCdF1DxIK$7KImyWpi~{rm=x7=Ce9{uC;-7fvAkwJG zNQF}hhhj<^(Om^T*nsbzy~SJSt`p<}EebM;Fa{ws(FpRqq+jH0u5BQ!MKmqST9gY! z7l<}>okfJ$rp}hIEy5-PnzWwaYzkzUM_YGzGtqUjVi&X#L{hJ&ho|h)G}NBii%$1U zNcgw(XN~ZhEGr0AP1Cq!Fe&>{D}d2g%j$8x{@V>!im~IWp_Bf0Q$hk=jSH7}!75Jn_sS&h9t-_`{D_-yU=D z=zbn~;1mz<@1bmpZC=*U>ucDpQ&+BEg4$v>n~>!LjOsHBF!f+f&a}w+qykyyd@_aq z*FS!n@4a&YwQz{y;C<|DRO~i6(RbQhDT!?gCZVdZ-XmR#;EwGK=~4`N>JTM^AYCDa z_nrPV?2Y+FXj6BR^feKZW|XdD3EkL#Pr~uJ!WlYkv?o0T<6W(5?1%!PEUOdz*C&NLk#TI>}hc$t2mlwBt@g-b+aieT;veM(4+~G>pFvJ%r0W+IL_S$X-~!h%r{KPuIiQl#KtNL z-)UcEdS7Fb`ADJmw9_)ub-n%G2tWNkiIDSiCEXX&)G9>)3R2>pKy`RK*(Fb^j;f-% zbFk}vE8XeaQ#c8}>s&`qlp=+gM2(CteV-3|rqoElJD*T^Wr^ypMUiUo_qKZ`!p=d z5CP)+XG%wN8u%HCUm@2Otxz2sy*n5!+V8S%V6m7zMJm-9{}E zeVZm1u1TA2pY-_AyRLxlxcK4j6hNj+_n#=BQ#xrPM#VijPC7=2P7N<4!p1#jxKbKK z+wH9)N(h1wpgdlHE_#SuP{+WgOH>xO(C4<4Ot&H*{`$K-|L|d6dvrgi7vQkW5V;`7 zr?gL#B5d0x5&~pWB>$4m(9$u?5)XZd;i)A!{@e;rKe)m--@DE0pIl|lT6SZGlRZq4 zV`71C0?9QfSiio`_PAwhw`FDDfaQHTOAD}22>N*+l`k=y&e-%d#uxm#^(Gcs#-AG9 zGa3F5z3vsz|D4vZ+8B4LnyZtBTa}^~8gF}e-zUpTay_8PEj~9y4LdVf+kjiwDz>jp za66GQ4jASc8}&M5Q@nEsH^VezmXzg@KG3kUE-kwaH@dAWN4|_+PcolC<#^TYDQaodcA%0gkXd~RJ-5< z`%KBfqbodr^h-=h?|%kNoMpura$viy*=ZUUdOZqN5W@tmD)PKVD?!_#^u{`2^lnDD z8sTsLKi}nz56)p$j#AwJG~glxG*vyDF=@O$) z2G1Bg!nr+mYm6@GT<67=_vwL{qUMqztkXZwlNJe{c?)EKBcuaHt6b~IuD$eMly=8YUbOyiq<}s0$A#|Ix7zNR?*U3tWHi^gGwJs4l z0IA4IVB@q=6H#|Xq)So&eA3c7*|CK+F$i3A^amp{U9dT=uyzd=mY`TfDppP0Or>v6ZxHfRGC`A%k)mY(!O>W-?=1ts`d}EYdK@Gd8PP z>SA}29ASND#PtZ@rhkJ^T{;nMSI~A{=1%J_h@T7Z=nSASq{7*EQmZ)U)xaJlquU(O z89nEyJJChhC-dL@XXt+B?us$&CBvn{yX*Xh$h?~zW9SO%*!_L;^Xu-Xac(q}{_cib zD1s135jxpU*JY3CH4CAML8iTW5cn9=#z-Y2Y!U!D%E1zq_k`&bXC1CDQF+qUH(oMv zIc2fHz9aXMWi4;t{*<@>?l<}3;}7wTm!IabeHr)np^rkz9zqGALTHC|ExBAK`i!VN zIT3JZB11GMF}(0gFL8T3qus7q9gH|SfMRZJ0eZb&I-jr*Yl2Ul?w~T9G>qxk;W{M> zj)6~Z!B5`#jJH0y!sQ8&4^YGVD0+Q_EC>PG#uHtn$OgDsjhm%Sxwk$=`#47)9jUEyma3Zzj)>tFDw}% zhUvyl7V?rZ%PAJhgjA)w=R`m%ECGdNG2NY51QtfH`uG8!J+{d2y!Q#0rkiqC^Op*re7HW(}crC>IbmAcIIz-#%$D(+IEQ0DG4>vfh8LfWFIm1t6s8;=TT5 zAdOXpLa3x=6iTN~At7}QqX2Xo;RQ{zvx88EL78rnjdN7HyHNBn!_@I?>lEgqGD8Ro zCnCa>WQ&K;?Bo1oo3n3U;NazwmmfdDS5Ef`3WlxX*wTIM*lj{+Da$1?6m_(SHjpWq zblKiwni`b}a#b+wjza{Nw4tTN`IcUmW3nNEz!-~?l9GZ}X|~YZX&gH-Cl>JO41V*C zG2egh9Gh04_dSkRIpeVcQ9@yewIwSC*lFr4DBpV*UmU)^kOeaJmkt(B_HB72q26+Qn zGHek8nNYMbU_^$>d&!(dMi7>01MPSRi~#HKO+gVIxiQE*Lsm8Qbds*UxrAdrHV?^v zAfoG#VO??kd5T7G>HY60EA!%cK3Uk)i^q<>(H&ob*ei$@lTjg)!$o`CXoS@P5Ab!lOKKKMa+k0t(XWAL=2}W+{LqC>l3qs2z(^0G6uV zCO0Lk2F(5uQY-LarvW7-vd`W%ReOP!$=K?NR7l1cZW5@FtOFmf!#f}E@WF)}+*;pd z*A6IG4iI&TloB5zq3g6_6<9}8RZ!PR=g*e_7hW85T|3BBg z0{WlP`hkscSHgPJan<9zACCGIOgPE&9o5>SpP9Zp1oR7jF3M2Ch< zre4rAIwnCdQ$5y!n*q+Q!Wa)J=)6eUR<98*jr~#{gCt6cFPErvPAe9< z5*lv2@hLxi*Yl0jr})M*BWfTMBXVsSAjpvj(NgRIwew^;G8vr!g?#Rr10){f8X^|0 zLdTf~hsUDXjybb9WK;AQ=WxZsZ+w4?*Wdk&I^;;TpTcN@mjo*kRV9K?oHpEajA}bm zr)_X;VzC-mAw-L4Tck}<+`;?3;yHvgu9vPw(BbLudtK(#k?acU&&fE#JSe3L)JPrR zyV4CocMf#N5mNkcCt&P~)R4yZGU8i@F&RzM0N{PVC`ns4-Ot9)v1>m!?Tw+U`I3&g z`)Vi8m=}1mOE{BvO=u)c+PsLv31U#G+a*QP*o&0P7lOcKA|=hon6$Dg1%?Rc@li1& zB4v@{si%|l3iCdw9@+_nstJuvC@(3gU3w5|ozoJrfJc)dupZjB#Wgds*u%&`a7~&3 zRV|@u@L?C_YDAN|@!mIyk`g+JMR2KD4hcONyiG}sb4iMKdxlRL1JNf`*Ip+-#B_W< z-*N8r=5$5up6O1APEvKZb1k}VbrL$;w1I6~LI~*Y36*|KrF28?nms=!tL~&-^NrM8 znwDNs^m9hEB&t;G3evqv2#*roxh7J<>7z$TmGb;zLSrIBLZm58M4;zLwa{&SZ6eO( zSwVCa)DXSJWMw)hy}(9I)7H=vQ1-~8M${S|hiH8W^1$nt#=LdyZ5}luiI`}9)bhZ5WEHe&@@4$5e%pqcubN=0_j z?4sEME;jJSM-zVh!4+<-Hw3kS8k{8a0%h`~Pq)7Fw4`%;F43cI5H4x!X=;LP5Vk>w zmKZ`xnw^`*y-QP$`Q$3tJ>7CTuh={H(!IW$`pggh{1_6DLGL*xMDRo#aUpaGrn-Cn zNqp0G*JL85$PPspL_!`)Z4;(aDYQ2zt!acndY7(G;gMQV9z0ITF)pp&;IDoAEI|5oLe$KHxC7Goo+EEcywIR&8+$}k~t@zx!Fe0`TsW}54D&TelR z>-)50i?)%WfI_55XBWY{RBWl3;)X-p66?-9*!m>haGi!Q1Vj*okTj8D-YuNRS2H&X zM&=Q{h&eNOKAuev=)0v)`f@^2=#HuW004jhNklj!D%KIi%hk&Hg17~9}H zBDBaT3D~<(xlFv`2Vo?=P{CGd7dBkd6${_6?f!) zXI5s`U6s{UT~&SGJ-ai@oh4Tkp@kqo0trZfBnSjZKoBVXAz&pDs}%?dkU)w6Az`^o z64;$t&dhdC_w?OW)m`_Um6chQcSdAfe%kR4{qdfAL}pj_^c*W-d)k0Zj|g`+H@D;2 z?|pyYBcPQ<8x^x7olTtX5CJW!hc$U4I}4bI1)ipD#n z3#r4?Ag4&Qbx2=F(Uz+dZ+$8P_4p7`Ruau(%57FtVIZkM4!ec)-eVcU-s3twhXf(W zWW? zp_*im3q-mGLRyauA;p--4HZr7eNB;4mAJT4fK>`w0)j&M91{Y@NrcRBGH0X}P1Yjx z1aI_rxcsMY@Z8xIe&^{!oH9KI6UUhrWD^ME1{KQqrBy2>;-x90(4Y)fMc(&R;;4!4 z5CkY~r0h*}!49wv+y-90QSsAvuk*_Lcd@QRv2={KS-@KbHXuVCgHKX(LRgP)JX8+f zxM)pRH-x$-*lH#~4z8L-zANu>$^LTMv6yy>;-t(aw$+qw6}j_5#`{P}NVGsfuxY~W z;;;5o~DOE0F@h~R7P92k!YkB$%!a#hzgJ;^|Gx3 zom@~9(0(}Q@S%tJ`Hf9}cI6}9x$_oe`w?c5Otc7I;GM#S3}+>7EujCJme;E$ z^qprw;EoGy2DlppTh=pb9HS5zhMY3b$mhCDbo6w+z8ScFbBG-{Xf)Uip;}bU1i~2O z``|Vy7|=3;!@1+D4<6&`V~2R`@FA9oKAy5lVlAEebF0g=mqi4QU#QkC>KCM(KS@QV!U0Wl%d_(kLoUSZMe>rOV{~mV~gK= z>O6nv!8V85JzCb{%OPX|p%oPtn_Q$7B3eli>6ieNj_8AA$V7%0(YJPh=Pr_WO8D$L{npJg|ZFa)yQcWhL3h- z0GU8$zq`lCCG;7lsN?iFk)9XHEoIkkD$EL&Fh!j2JJz$>m1!s8-ro^Zd%DPPouW?? z@Y5LIu!~TIJ;hu+_UV0+6c-(kLCi|{SwM;qGeKiwj6`1U)D~@e-t6%a4n#2^$3J?OWt7D?dThCBY4lm4({iD~AsyJ~UXHf=^rt!6t6|l;2(A$1pak8`AQOpjff7|wXfdkUecH(N*^(dmyO70)xO$6gCL_RN{m;(yg`e$Q+7 zcBvx&IdX=PBJtj1x}Fd!rCkPmqYCnobaIjJG|MHMvspYkQD3;9Vft23bW)kZkH0V&H1RjQ(ZgBrHt3RY^$7 zlw%%d;XENt!ob~oO-~Q1Cj}QwI|%F^lWE6_-TO({Gj8lXZ)6%Kc26T2i)atcxJ0*d zjFL&LoTAXnnx^rz=iBrLJGApI`&RbhhkeRh8|-W4Jag_-eBpH$8QCP;qfGssL zpCeN}ERwnpkTc%i;j+I=?b~cD8kTy7l>>{k+#-HdvojgduWLF+P;0@&TK?0uyP+lE zf3dpq+d}%+SbkeT{}q>)>kvu;w}Yb}0>covTh?saz-9w|FKC3uW-W9EEd>(~>zkgN z*SFYQo5TT4v=O?Emf*_?xoF761lep5#y44NH(WS%oX?*-$rtvoa!@N;K%l0nN`iM} zQbjJF(g}%B(YG{F5L_BCnkJ>!$pUF7DA6#dH4iN86G>FqQDKSGNLWtwENI@=M z1Z)aqKtrZ9naNQi@#>5sUsxcYSIp;@7k>UScYd@A|1tcah zY7Iil-MDlg5baJnP?kDKT%ni*xO9D;m#%N~t=oc2Lx~G5m`KJ|L!o;VQZU%srkiCr z6^mizqt%;q7SqH6IwX3Aa5i-YLP~UtgLn`TZFVVEJ64f?mPi+QiBn(aSXfOR6=sFf zCoH=KZi@1nI&I8~tmw~s@0-Nzy<#dHN}jMX+1&{rn+GCHp|*6a ztO%d}OgfLI=T-D}mZ{K=$#a6}0waQo=bBWrBFu|436wIa{#A?=$IMW0ng*d1%Ey9U zxtQu0@2EODIQqD6oO8G-8zLI$vFCD$*MpCI-6;I4P|XCg$A&P$hiUA3a@Pno z-uaXi8H?yCg(De^{h;Q5`i)a8WC~4=l9pyXrcgOWJ4bXhrHxLCyL}pm!lHbd_@%_G$;k5Bjcfe) zqmOxgeVdOO&0X20m^)0?*+(6^jE5F#$hAS|8apnLCXK?$mpiyf*$OtI&MHhN76B)w zlVK4ZOr)5JGb1PxX4m|5tO;pC?$Wg=12H@+B-fSMb*d70!tUgFb|0CJ6Y&J{Bu7I* zbbLwrhdr>$)^sHz(VVoARtSL|=KXemcnzs_7}c<%fWzI=X>XAZzB z&-|WLV~m<{#bN3>~TX50-w5NdKzkw*~ZHa{1OcgxY&Pt{o#R zqu}W~&&UflD$7P`={F!+^K^R|Qp3&w);8gz%`LXJN3c@tQWq`aO5U2?F(9jh+S-Zu-KuufMB3`GX z3c5wKkVdsIZcMMKQO47yO&j>%ef2!Aed;`a_`~;j`{EUP%ZF(%EwQn&NeC|SL={qM z8rwugx>OibKqCkuS{D%lE`%7mAuQ7@R-Xpb>8KV${8>ckFSW|Up691~-p`6EPqY_H zl@3hXroUndDb^P$nZ8vC0Yc)%lCOcH}n{Kx3lpa}tbd5fwl$=rl)QJ|&ARzqM& zTTa;i_!3VaTI6@0dWz>x9O6I*cGSmVF@>fGHrZ$yz#)W5-%}=1Wpai$7?M{3Oze(CGuGCh{NG0n5ThiSn*{dq5- zHmCEL?%Qmx$J0njkQsy=(l{>joCy|*qqV14pVImpVsdTJapI-$;78+GE%tZd zGr#u)FFx@ofAG@Fyu0}>tE)#Tb&Ji-Yf$u}NVaOAk;uG5S$b{`OX|TL*5=zB+c(Fd zgHW_#(r+=WJUN24$#B+E21jKi|JS?2usYx2ADG`-;C<5a+XDJ8xO~TlFbL5jbJ%$L zP066C>Dz{Z^Gt%onl`@OBR3ipj4f>4g&VgftZfY#P8w(ggf_V{$fl$kZ$LF73l(xS zX1^M7@?gR9=Z^8khfi^?9gX&NRia!%IFv@?iHya_;FCgA5j`iQO7=YI1{}*ZP~AAz zITxc_2^kVexAF)vNKm?6NAw-s9m?Ni9>40(>+BK0!JShooMB#Q=?s!ft zW<2}NXL$6$GUvM)U6NB)doEsVz5zE$@OGrM%r+^tChe$?&I+W-C`cC9z{5uhmX93f z$RmgOgCAbx)i*!Hs|8j&2bcuUq-ikiHWO>HLKCPFNQ@SQ5QSj~87Bo+;DyA?W_I(6 zG03s-6T%Qf-D9a8{e0`_(lFhNa*A9}DGxi>}?mb%y*+?~*eVdMXCpZQYAB zu?l;Om}Dgv*ONRF!XC=N9(s^S6pr9U>_AN4|7N8^BO zhD3(|4uK2NyFFf4M0XTVM3`xke|MyMgw#Qpkyz7nvq@A)K`7XSE~n?%BkGz>X4pmg zei`Dt=jSkcy-ySo2y#mQnF={mOW#dBq^IYNPqFIvap!-`FkgP(>064 zmq$!_C-GTDlbj-=kSio!ii=9)G%=0jEGaYsgBR24RiLzpaoJMN0(@jLicvm}LrQq^ zU=foc&1jni;d$izQJy{fFkd>|qLsF@roz#Xkz>%b^2i33sel%cM6T&t6Ceshe>h;L zEHT|4`-_6lo>(Ny+sw7*_{qhaY;6a$S)kKir1pm4XiV(_CT~%>WNoMt$6p14ib=S5 zNz*h*B%J70(J+o_*hvINd~!yab|RBVFbxIqk``$~CT5Jhy~l1!zX4JJ&b?L?ycS5M5lYjDC>GDO#AF#l){KV(MpU$X#iDWSGmghj9pm#C zPV(?#q*3N|6p9z~-BjQ!u%0G;b!DQ4Xp+SIbt=D9%x=P^rmK>>{xG|Wp9W>iEFsvpFnv#*Tlu}U(MXfZ_6zE*z1?=p=?HiUmw>KFL8@$ahtm2(O z$(q2J!Q?Jsa+l?-=4e;b9&hlKN6+*13lH-^7djU5QNTcSZ^*<9sEaxy7tsJ6EtZBe zYbA*iV5A`P5@W&0keoR@jrTYogBFl6IjJLJ`kmy$&azTH%XlKg*9_y~Ow4 zzDj5xWz%bF8<90<3cT=mFR@;LHc`!-LJtBu+IoowEfl^^X>&nE+bfdUeIQwCi6{aT zQ%j;K?uZCAyU64;WP?3op;SzVAQ3XQSZA*h3Gr4k4ysDWo0wG5gkKvFdAtd#3}lW_ zIYGvhDlarT1n%72WZ!a^g~c{Z)?jp-6J5vG&mQIr4<6-2ThXB=_%WkVNhLaT+dYDV z$Ygc%4eT$Kp zXXs!w2xQ%bXthj*P!$bTyn!o$Xd>TE1sB`KLBuc>nJ70QAXF3yiX^TSA|%OL{CAIs z#cY3vKj#XPxZw8S%gj(r!R`T!i0y7mbxPBT0wV62K+Wg?VTvIC;_?fq`0UqRWODY| zvqD<^!a8Os>XgWvgsIVmgM`}0?eW1!PNtZ0ZljfzNQJ+&B~m7PHz_0P97uG4h+5V% z$H`a}hr~Q8@DY)s!IRCl-vvc<_00$(L;09~;nOVHVIkDBbV1?j$mS!S zclYqicXtH4fi(B)7l;#;c&Ov=F74)B_SL-|h+jNdyT@XNK<_bJ*sGb?+uzs=O3qfZ z7cdL={XRW5vsmxl^LVz-JrnZyd;CcXVt`6Ir{fGM6=y;dq`@l#Iwz#djvd_rX&xF=MUyQdGG|EedGi`e0z(Z zymy_oyCZaOKb>xeu?>u!i(OA0Co#f%l#xiUz$rvf_(mYT!b?RE5uF!O5R{nt&&%n) zo$dEHHirl~$Jg(nJ?|Od)5~`|k-u=vrsKTW^H0er#BAT-@AbQk9GxY*vnu7ff(i zWeBYns?$TaJ7hTwhOoU2ch_px?(ERtuCX;pS&)f>F!C{}PmRgUh$8f9=R;1+3C=Ak z{s*7?Cg`rl|%|N^Ksrr;}Sw;fUbb9g02G-JmY4B zFp?~bieT?!J*Rx4PJ7Qv(PAZ2)Ib4rdvNkIXZZ9ZXZU~o(d#H%GpKz;+p`X(P)zC= z@vKzjhDsMVK%t^fv&;}mMGK>#V<8;C>p1wjgwjPXDhaMm?a&y6A=8a>nhF=;#k~Wk zOn1)|$sE#arV-7g^-2R;$A8Mif?u0BP#J?ZIT(e|G1<%!+uuIKppfJ9Ef{Pt-dJaU zr{Ob?9^-3|9pmvi#Ug!jyA9N!3+8(T4Q+-MC<~o#ob*U(X4wzZ`XYV%*aF89T!U1G zmQl2(fgQm1_8P|*_OWoX$HA4y`2M9nfBfndhQlFC`yXIuQqxRR*JNZ`2f)eboFJ8m z;wTmHJ_&GSNJv#g(45prVF)6krBdxdccn@eQ_%)0h~$f$L_MBpQyBT^@w>!D;_*?8 z#}pBBDHeHJAkFTS>Bp%v$`pZ0sfK>H5Oc&-IT7N7%L^M(X(1vtKs2dHPek)n94eA1 z?>>&~EGl}+)t)BYC8|(h_vgsr^%2DsOhXhAHqmjECWMfZ@q9wlqiEF=MR}1%5sTW0 z2J85JyhesSR0S~&bq25Atg zh?8`!k?Eh$6m@2!Fd2dJ3KPLlGHat}wI5U6y~@FTlE3|hPx0mROB|-6#};j^sa%7U zhP+ik$fB3`WD<9Hq0z}r$j(SpDV`o+YJUh=YOob8BbY;8TjwXIeKz3nwzx#&Zd;~G3jDDX&ab(gE zgsCXRO>auOmqD105UDtp$wpGTcv()1W+|eOSLj5e$f9;ahiJ@U6hX;Y1!;lTAhn<< za-5wInj!d#e0-M$COmlP5T84Dh`;~HJgXt1&Wb3Qq;5cIbkV}5$*oWKV+T0jps`3D z=~rcdNf1m#>y6+H8pSVp_V{V)QjfecJA@!Y9H z{C7Wnl@E4CY?U>Ysi|v?(DUR9Cbhshh16}V_uRQPVrOH_o#lB>9G&OTK0#-p$7s-_ zDn0$-4%N71$9b-7ZD86N|Hrp(g#Ya$hksi{^V3_BWtxW-5&H72pROp&|ia%I~6x3J7H1tuu0>`-84cp~1@%G6YN4gr)@G?m3V&s<(Gr(i|F!W{hH|H0$@ z-~-3Mdf|26y>*qcy~6z5KDM1>tKTOmNjuL#Sti2~!b7Lk#TrL{bBnyy1>0ba$Jr2j zS2l`iuuaUxwiB==!c{0Q6W~!r<9^X1#_5JA5KBdMRAVO(UX@T~BtEE!NMlek3M_@x zpbcJU5h+o6hNO0j4CkZJN-IS$P>TjHp(`59_BxAp#6!pT^R-W3;8Vv1^FR^C z6uQ&J4&%+xV-YSxIEQsjqSwUMv~Un?lUyhgBf|&0bErM&U@Y~fc69Medzl!~A(pXI zw+=CF*-9Dxr$sWKi}pq8ZZtUI@ji=%^NjBt z?m@Jti0|U1p4u$#>1+rUg?B(Q4Uff_i=11ZQV=6$GjgHvDt1;}9Zv`o zxJ5S@0W(cJf0%}K)4rS22E0Gmn?C z2+Q4st{b!HhkWLV6MW&q8BVMS=72Uil4TlOV>E!J4gptLl$T`1!fdYKg2#zwwm)ht z)>)*~6haaz84**J5pLfU-vCpo$!arQehkri;U& z>WY?zj4{D0x=M2Rkm0F+`$=B7Ipklxd6`$QeTZ-igj~?LUUWfe96mEqd!-a%TycA+ zX8Yzg7w2=1o^CO}40%tY<`=0we7vzuwbzK55B$~k0F;IkH0kn~H~To2q?AF{PkvT?hQ^f|dK zm~XdmE>Mp-rPCwSpZ1*MaLE{_y1wxY^%eQctjhP0l|06o-hgPmsp0QDpm_T91-|p@7XSPwZ}85=k5NlUdEodd z);G5qjV7odSzI{?wPpM6I<9u~I$fH{2$VzyF>CWi^ixGU1>3}mD8>BlN={Phm{dtH z2GgJffkMvc7|duIUg`KZE%DmKLOI>Sm5d(PQWs!ybkRa(hV97^L``7=En&z-z`7B( z98r|peDQ%}eCF(fJaTq{47_G>(!fN<<xC(j zO5$%5w?8B&5oY{oiSRYb*HQfC<2*8^m-%Gu71K0bYBA5~1w_8GO1_b9D(3QH*IJI` zy5^@|xIT73lApIseB@aGNIrhYf_-vL)|#go4PZ}SYNl@20U8ree!okpnRb6v zI;lL#QcyX#S5qS+fO~fBZo5Pe2wjIB8oY@)F=f-tA(?kvTCrQ25pck=2MP{!p;eB zw}u;cci7q32McZj=PgDu#; zYuUUzVq>#pFs$hHR;j8A8$3#mkiH_bLoyLqHI~-!3Xh#xf8-qqM~r8GYic z_n-dsb^fzId5Om#f1EEr_Y995h%}AOiDRCI_9kL>Gk`e2R*Dxh%8iC2Wk!RCLTmw!? ztbi(btP%(%I99;Eqww&-!(825=6kPR;!j?Dm#bG4X5|68b0--!f&S(ix;IB}evxLd zgB=cVb&2#9(v8TZMJO9x9Z+}*Trjaipd8R3giXznkb*Z-+dtU`?k3BDlv4@=Ff%tx z5apD9b3cuOv~D@&*M`(OpL)CAyX=bF_R>H;X}Px@{7K8N;&aDRI3ebH92;hCFjGGG z9#8ChIMy@&>U+J=_i~E&`dWX|wupPS_1^VPsS%Olvd1rbFOPe#&~nfB-CF?P^IVv= zS0;gIa4M9d1A|(Y%dX#BEOT2eDU*Z~r)fxGGmuzm1(m4j3 zeZGO??pJ!lJA zgD{Fo<>}5XV5MYpV;hWQdA^`<6Ii>%K2`J71N-^PQxEa<`9&6W6nKtRMlrWU0LG(= zrk>Dg<+O8+&;lcJERyxIVxn^<8a9CUZo|(nUgf=yZ!+m`aQM_omU6gJ!DcD&W(8?F zTw53Xi|@S4i|&1X_nD{o(i8J6x8jMeJM%ak+kV7}?i>sPwJix*K(*Q+1ujwK6!Bhi zQo#JVd7d~k&zmOdGw7*5*cZ9`|i&HVlX z(H4w*hfy6*BP4h0is5*~jcSws^|iI|kB{#A8(BpEwtxmM)%`F*u{kMOvv6yB$erPs zt=iL_Ya=@?R37abC#7J02wN45)&o0thLk%Eu95`Nq1&FLYHW<56*ZZ!k>wWIXoCeK zIG#&>?~4y}W~I&PgZo$&$sMCg8)LxA*dT4v4KO3n5&|V*65wjz(ab4^0xs3?ldD_2 za_uIUxBK*i!PEvP<}vvyx#)3q6UrAmc~%p}3ZHmP${Ze&OT!wUR3aYji+ zaC(#~{u3f`4^2uh&|p+VwUt4&+juANA__j0X%VsvR|sSt=+1Yj$Ls9eT4SFsdF;$8 z&!0ZZb7zioZl7RIKwXa+RuyPPtJQ+Ig(xzd1+6tAgFyouwqa}}R%`r1j~`d?@$E5# zjdeOYaPq(kr}lM`4(?pN&EeJkEaif>gsg#ip;*in%4g8nh@3}PCX|pgcq%`^NKXgF zlGYsBS8(JD5Aop9!+huUHD0{b=g#e0$nFwz2li7p69)Zlm<*7@(P}G{l2No)#T$|$ zi|Jz`k{4o-MnjNg{JtRo89_AB+cjvWNs)dUW-=|T5>o4@eBv3$nTRI&JxHh6_2U+) z(Ag^lor;gdR8aIQ7y0MC;4i)G7Ie&ty;vOjgf2Vqk@4+iM0rCBfnoaE=|1wiMeWS@ z_`c7Pzj|Ys2Ab>*!HH>S_x^4AT9JZLm=^TxhU4u0+}Y1!&m`p&w(qaHANQUspY)n3 zkDNV7zMK{G{*#O6nV6Va9QzEp4}erNaj{5NmR_3FQjv@+1wo61Iw(;b=bM}A=U5}kDpxN-~P-u`P{?%SeDR~ z+Zd%I#YSahCPNyTTyPSN%Cy+58n&wnU*wR(HgIX(a^?07PMx(|`Eu#m&i!*KqSw5 z7B634XYKA7**$<-S;6@hY)%MXFtIhdb{LVP71T|M9S>>e1zy$!VPfczOTs^&(mV-- zpuh=4@16uW$ADUnKnPI?!kAlC$KVp@z5cw-S-P&WPDd{$Ps?s8ddtmr(hL&6svh-q9!oHDGZJs*+Jq=yxXT_k%i@D-n`TB@F~Mc!C1~gv7c6VA7$Ti_39mbyT^b2M?c}a zFShy0XCLFj6N_|pbdFw?bBsrh*2I!^3TO$egq=xA5YR1(nZsXhVadRPf+NQy5AA!D zFFyVt|MdIsbJtZ2+=Q_eG$wXX5QY#WSV7$ws%^($G-Rg~nE4#lfnHZKk>F)c;~lkY z7?eZ)-76o2glC;F;4$`Sj@nJa>GF zR>YanL7{|(T;P4chnP$^y-k!3CPGjqP23o$<`f@};H9erestwBudc0Qg@&d5bXQlY zcE%Xd&|eD_LGqpNz0c*N2br5Ma0kyIbxC`^q};j74?eid8yEkOhYl|CwWlB93+I+; zr-IN12u(~H%-c~J?1DoHMOSxdYfIIPXhO+hJ0*{U}Q z!4QnXwp;kAsLk7i;5ekUU}MCt2p**+K50*)AO6&)VrqC>MGon-7)dR=AQRdwh+i$%3djy=eIS`O|#!u`@in9J>Vdc!+2R zT-c#qWVB5Nc*c_f!YW#=HnxgkHDd__4a1h<4)F1$;qtKJzyHZaMvWi~j{S2j>h3U$c`;^!EW&!i=Vv+A_;L4 zv%=^vyZm`U9KZ6taRoCaT}Z;Ry`e0yiv}lkr%lv zA3w;c{XI@}GP*iaKbmnwrHd&a-P>dc6T?evuuSR_P#np7{O-eT9(v#zesFQXAHVrA zFJE1!v=!v5$Zn6&fS5>Z;|QUNU`5`GlLJ>pJ2?rWiJW<9eJrGv-3>#M8lTQ>gu;=! zi%CE(QbH@}7=Dw);K3+@5s*tlt_WEY;bj6TJ>A7FOlk^0A|H*Ivn59sGCuRjX}2d~(*$H0!ThdD`RvZ4l|-qSms5I=^MZ~P94_GT!ujBuIXkLQEt;~wmIE}3ulh<%!&OxablH23R3Zzs7*&w|mxM+3crYRzxbOTpp6eyA04Ul*t68Aa7t3=~aI*uSJ(KwWX zETTz;=|&6OLZOVMwwpAgKG*?;D0!%7_{{keeErD>d3b;17-vmD3ro9g7=&$1o{^!E z#3Zh+R!AKu9zKJSfNcTm3a&YL?N-eX-h6`>KlqqNEmO>`vTv@#Q03ehDvB*|Ls+N7 zhU#(o?JNB3{i}TT!V`Ss^PlGIa`X?~963&QBzZI0O|%mN9is1w5U{_uf+u58H~R{2r<$6DU+jIHo`>-Q zf++@h4}~L49T*&Y-8A?$hW1~F!ZAaT@9~jNb!I}8g$OA@4Q4JQduScu6AD@3cZ=WY zw(O#;zigZQOfSH!NRNg3EDGK4rE$1VEZ(Pu_%3hye%eR;Jh^Avew}^x2|Ji+5&cPY zki7-;-t|vuKvUki*hAu&xjD>y#G{29iSrz$NHcN5HbtF-PzV*d%~B>WXA$kpoXQc> z5QIX?h(arE2wD?Nd>=;PjUgCK$PB^=P~by@3MIxnWbkBmOt;86*wOs{7oOyi!^=Ey zykK4d&SC2jCf69HllywWQPbdYF8Q%*LnYd5Yt0U@UcqZ0Z}X#fKj7Uvw;2~X#nM53 zd~1uPYLS+N&0>*i|4Fv(2Ag-syme=jpIyJi6X%cd{6mj$c3;Lp1FP*w8!-;3JZ?0^ zhLWt4L!t0kirgTOjLQwIR~%_C@cWPSICJU|{_rR3{NRm`xxI6piEklgn@s2Ep20Rn zl(lF@tKFp>ZxNi1WVs8=H^#Wy%uk*UE$S#_8p#h?;OAT?31vXak2xgT+j>y zMFWeSNM$O^arEAn0wV=^64DF6RRKS)czUtm*jdT>r3d)gl@(sPy2YifhP#6y6A^$G zA&<^jxExhAgmFbPs;MeRTX$%BkONZZ1k;VwC1q)}7pKO$Sek8-F4MP1O`*rtskw*r|7 zdTN>eWJ2X@$Q{%Zv}gd2R9*C92OAt8lmk9^f16jYewWWbah7j9dxQtt(U@bWs^}`u zg3fScsFa50>M^0I$dtpFhW%PG8C&K|&f(JqpE`Y-A6z=lpS=1$@2>TcW*$4%@y3)a zo}6(A>+w3qOXD5N);L>}*(L@}cozdztfXk#$b{B=1YSzKjJ~5zDZG@4z7fTPLTaQ| zNFBu_S*wS0jvyz{3^8_tc{$?5O3vAp9>4#YPjPC#!-;O>rN@qTgHW0Z0b&k|!%-8) z6Ivp}6a|RDzzVh%3}mF&{OH|n{_M?5ynlOxamWb8adf_bq@b=0n@z)T>lQa|w#YRM z1|avHWO?N{{jIzF)0f`lU%v7tPe1Vp-}u6_Jh!5_11y>j83BXE1c8)UiiC}B56N(W zgA38C!2+LJobb@s4)eJu4)fjDFY#wDyv(&5A0g)svM|4&kvH^5KDMWA0BuoKgVr@# zRY(Eed1`0y8iZ{Ku1=pRQx_n)p#+6+Dn_{zqmQKzv8eMlxuOs`wSp8-5+brhw0iR) z%mjx(EP(If4y58}R@^0#*{?#U{|dEC0jr2mCt8WAJj_wt~pLd@Xr-LAhX zh2xj*;$Omno_$?0-6wmOWG^=@k`uB#(?&o3Frgs^ZBJR}fkqWTMor|@UIV`WcAp=-{3;)=Z&DQtjutQ;)hv03DGVlS zC2v#5D8L{z2qBp(x)dnJ!7(1xJkf3O#8+2&#B@B~3O5D#KO| zTRSSFP}v;8H()HnS%ixb;6X)~j^J#X^d&nApBy^?B^q>7qh%n-sC#iLC+LD;I*=Kx zF<=D3c+d`^YJ&7g;mCc(GGmri#ZzaF@w=aWn&*!xIzTAFR%6=pZOR&I>uI;6Enur< zq1s_QZjkMHY7ACs8U?q3S3Y)p`<08l^xk!3cZIsMA38aehiXuRXedlZZVGm`GPG%f zo@cJJ3PR$xZsYPA+w0=$38GL`0c0=~`_9l4fr~eW{KNm^4>@;G^36{_%2z*ihNImW zl;$TD9qGtS!1|I*W(X8zHNlPpIR#m6IMgXvTf582l_id@N*-KZc zcIYDcN5|)WV+-lO5e4*{t_ou>SZ@MjAy_Y=Z((Oxu~UvI@swKACubsaY}UeuoW=%r zhAQw>NNaITL$E`1Gh|U(_G`=2XAbbWv&VS;v|?38n@ZV?$&IJG zxX3tIRF+}LkXSr5o`8`VdAm)8WQ<_L!3E|{!s(#cyWT~PVJ*vA6Qxh~#&2E&q@ z-+z^#zw1f?1FmflI)+9BpC}w+ny8nI z`=vlmsT(HRQ7NU6N=06>7C2ubM2Ybe+M&;aE_vwC9N&2Q9AA3)DDyyv8e@GFE-C}Y z;E++&qq3R0U9}@$eXFtT1W#XQ+;oCBZtU>G_pb5s<=dMSy8bdvom911A{PNX(~^>`cY*JdDZ3SuF-XE-D>$QjZXq=*3u&NEFVgk4_kltM7e zB!QXVH$;b(DcMn=W-bfA-tyNycHdW!?n${5h?J5S_eDq?=v|m~m%lrsDD358Or0qb zEkoRgJm2qZ5%z4yjCyg;o{5ed7B}No&roHt%XJo0N=o8O3-QZEmcsuv70aK5UjI29 z==j6^E*jBUeD}BXvQ#kp6qg)QFtSLI+i_J2gvN_327btlpcKd=A? z9z{UWxDrc4rV3m%J7qw|5V$phE1U4Ie*QKeuI+H+?uaohFg+M&#EPpSWS(-eLunnT z93fj6s}a^9vw83>f^4``Zu9LoFLUvuk9q5n)BNqH9^|Q|j0w>4Kwaa?23KfuGnYcT zMvQz(Pqvs7lEt|e)-%~3!BxKf+I#%??T^{4Cy0C*BO_pdFjxs8WN{Me zV!<3_6FIn|CRiUQe{SmOJv|>Hk5S85Ks%KYR12qb$Xbx+k!MK&9ndPEghho4Whs3!w5EDNnR3-i-O^##`=rX$yXU`qxU@ND>Gl$10 znJA!wLTAv);$TsN9X0G*oyUceQ7Ji~3s#T8!$%BfKV0A^S9W;y<_4Q#$YyPE!KBWr z$Jyx8QT7|`q>t}gnyn@FAM7x{01L%DBAbs6g-vvysjG(n;O*_u(}w@_+;3h0%Wr%E z{aUEP7(+k6W@Xu$1o}-()frAEj9tK+3@bCxEefsB88ibBV;GD))wo3UC3f6I6@k$- zZbGmlR6U?5cQ{xCK7Z~cUw-g3&m7mR2xwVwb&aJ&09>)~!UuQx!Rzny&b4)FkyEUkMd}`cXbK-nD6BwK8aZ)^WX|4_`9 zNw?iW$iSrB234Z`fPF^r)R85=_UKc5_WTk@+n|Fbl-scts})#id_V+&kQs%@X%cE` zk!(7cC>R^XHQ@c70sr!6uk+#NgzFnM!F5pG0~E|-YynQt?9|{bWj$eRCn@#MrKBv$ zu&fBGh0um3SVUIfnegFS$>kd#@Z#&2`TZ|G%Qv4~^X>-qnV+>v(J{h2x&+*fX+Fru*}W1aRIc7CUz%Z#fLQY)Ct`EYoXD?faZ7cO1o=~IXJ2j6&(MPNS5 z=oVQ_+e`PWd3t#1sH!nCKxQu!flw5Pyi3p-PAVt_rlo1h z5t;PNXMx<0u>E!Bjpz9%AK|OdJjhcAVP3`WBp9Gt6LP>aM4}MRL)9R(LCK6N&)5M< zB8_rK!|e(D?Cm>z`^7i8xIV#l_ru&#unO`{yv!#xzN!e-2%0g*HmIPeyrHZDT4hKZ zu>BEQI9zQJDo}0p(>z;J)+JSt6d@xsIYQ>__>$i8B5w`*y!_9<#hLwc{NCq3&F9Y@ zVLy^3G>bqRaE(QYxG#MNM(KMinb9iLY(#8JSb6|H^}sxDZOrq+hikm};TE?>l14#E z!PrYe*^uSSRKpQ#!wI9U4R+Qm4jx$Gz<$Z%B4A^Vgf7~sRy>9!f&b-AA97#we>qb8 z#uU=O(FOF&!G!^yzJra*v0VoS2)1oaDZ#bdC?!!Ui&ku|8^ak9J%GNZ0t6w}#&vL4xhECZAcwzdf< zj0K4Gu_#e4kT;Q+X^2MjUPTKsuNs`ziOU+0d4~5MGq(z@g16Q-xb{as=GE(4eD2Y6 zeC~LgwoZw9W%M##R1mKgNtg^0pe4wIN9ze~U=hPX2?rj6bF0UAX-V+vyC1VQENS%? zn1q6@afQj-k;fHWM0RKqLQT_DgxVn&I|wUrAx3~(AJgej5VFX39@P_!7WC#@XaZHa zP4Jd(RwLYP9y+$f=g*$u(||6ayAT7XyoiJ8SjGWq z2e>$a@4j=9AH9ExJ0&!Y2G;|qBF=>^`&D6~`=qLI-x zBp8C%1d)MiF$kLf@?X5j&t6&K-}~C9_`)%`1?Zt;IfL$e3qnIV8sMBID-6S$Q~F*M!eTVkRpdq!Inlv8f|M~zIu)Nmxa41)+#o_qC6p0;4${v=gs@9%m~kP~ z5})4v{gaDfdEet-Z4to{_QZWhbXUZV3^Bz{ChC4fq+N>U`*S{jib&u8c_e`Nm)>@g z1=y5|F^eEfl!dSdnN1vNIkkaIp3u|Oz-h|hFW;AcP0M|;*}Ghxy*?TD0M)yH6KdB@ zBZZ)l_J3TToVoIZn5;4T*{2B)LPfU?X+Y(%h!%P5T&Wnt98`+wmLRbx5tHkBE6Z&5 zcTnE3@4$XCrP4aF>??k(iw!)NEF%&gbQR|MsY5Cts|p9_%!fm zv^^xqfNr-jMGG&X>?_{boN%+c&UfDaulOJT?l<|Jv-`*ZJq#S`3Oc}Ov%*Qs@rI^TQgU9PU*ChIIRqC*`7&UqX%vb=oM zv#2b?EVuB^5^9ULb@C&R>7C9CmXGddI36;x4I<0Qx?Q9SG`6A{ZL`=b5akZd+HE?% z;&Tt4;CH|9JQvQkm`}d>ng&Zr?T1Kdqm3Z}8!XvE7lOhH=-05`z$lNt&I915?~Hlz zt;>Ay@g02LqgXw}#@NBclP@e&jV4K%StIH(x*DThM8OG)x)FdudeA}4M6FT@ln%Hc z2r6B;LLh>e(ZehfRqSVDu!SmCnLlxmE2F#oXaDlY{OIjNeEo?>_{OP4wi;;FmZeP7 zHoN0U-ZeBS=}2Iau1180Oeu_zv@z^o&N#ZTkE4qjKfQRDS3kPV_Q;TR_R(EA$kv?= zj9ElVsH=(_S4V8z9CTky*}ve5(xq@ZfJo5&auo zK=+aCxWL`Yv01~8S4^a$pOrWzK;{S;Q?7Q#u-><94+Cpk4gG$N9aylSgCX-0SvL5= z7H)inV{`Dx!TmgY`WT-%xt|ADH2V}N*F>weri`;^qj3~iVNjuWsu3{J*@Rw{=!Hl`6r(qO4t{k#xBpszd=NM`52(0z^#-oMBh$cps<^=~=;lfvs^3M4~{OI*7{Pf+M zT;0A)A?I*P;B-48D=sjplgooP=ptI}xLsS}WN&9dOJt^yIF^bY(lwNWO@#F9TW+C( z#`SOTcb`AaW5<`caOxNbO&n0ENJV%HhGWPyAvZDVRpit}eO#5n$VIyG2JqG}hOm>kTY%`&5Tr9pq^s^Q|(tv`qDFRzYyCjIVS}I3M&{85P z5NITx;l_|ww#0kaCj6s+@*{rq&@sOG+%X{ zI2aBqTJ4-iTX6WZ%RGDLd4BrNHD3AP8n3?p9(N~T=J(T@TVzssszIMj38YqJ?KYxl z#hahA5nZ+o77^P4qKU33-Y1_%87U1R?&}bIESSAZAZ-*L`sDjciXfjJ=c$%-*TQaZ z5lga;OTxi_?TbTBZ+=r}YagxBe!=o>?-G~=l>B81)Ljpg8S7%U1H?=KnC`ua>%3R2 zm;&5(w{Q0L`+3d&KELUIjm7jYe93$7t>M1s_WC);01bdxAVzO;6^m@C2}^Z(g5$N%JazQ*4=Ua$k$5iBp}MEMw4C-BDLM2@5(cM@{Lk_I12 za#5fKtUR^KrypG9g}1Nr;@j7G{n8DTSVU$y(qxQl7>t`;@wb$C1VP71rXX(Wv=@pg8GyAwvNm4UJ~hfl}khabU@Uc1WsxBBdqfyOVRn+%*nON9=CY`6o%apZP4 z4WX%_slZvB_k_?OLrDxylHe6Gz?iso;9`UyUNR7Z||HKJ!6b5fB3s*+^NprpgP3g=3Mi`P$EC=>;c zn+1+Pu)wE|Eb!_Lc;U(xuYP!wk1t=RwS0z2DWHnoG=yPPT0Xko=jN@uY;7&FvYK<~ zV3)aNQ0*9y)=1BYz^L*3$JZv|A0BP}8(&2K#um_jSlh5xIr=`Z;U(KbGE%YKUKItk zhq?-sW6N;t*xIUC-zeGcdz!}JCqNzLa_!(y^#oClP|X^T9bMq*^ZWSx!{<1+31l!lo#83)KDL=NsVIYHYJF>hbF!=+mdSGP;vJ%5yEPVVFJ<(#=QP^l3^}zzN)r(x87L$aO5n!Zbd=}t!4~7KHQd%s9((9Pe(&%9KF=P46&x85 zY{R6k$%Vow6AQjvLZR_8dZ`YGzNuw;6bjzF13!KL60hG}T1tUbflNw-40Jk6G&GFsjH_Ea z+h==l&5`*AgCvuwIFF%q=u{spcXGPu!wOcG7fX5FU z<&6iA^266J^V9dPa%pYM_P8d?dgQBfluhGla}`tq6t~u^@_fC3HR}6XS`RKQ5I(I9Dj-BUVQWy zZP=zh&~XwpjgF2Fk;HP}HmAUo*s8u41)deVzvQ#0f4rv_{@|d@`>N>6A`G8W8263{8R&ct+0 zsR=?wOFEt5Wez4!Xtbi3>rpuy_n(#o9k9YOZeqS@r`sjCKI6?1bIS7k`Gb7%!g;>% z*a=QAK?@Ky_-c&Q3f0bM=YdrUl^2vmVehb+V1>f!j7{LSg`Zu4m)^g_EAL-pXKc|r z!{l@1BA{~3hD}Z@7JO|94Hz4cwn4fIuN(*$J6!~vBnl~2h7(|nBzTV<3+z~-vo@X9 zB6VwtNtiI&-iEmoTpH}~kN?>p^Y+;j{Qc*j8&u|Zqc7O24#iHTQRsM z(-LOsnNbCY7ZxQgUFA@+ArE7EV#4WTUB2|>r})ZaCpnhGTnOZ@0XxEt zM%cw1kBM{*VNe)A;s}heY}yHpUZ848t^;qc!|RvFy!F9dF5Mn6sUSOejIL7jH|`=P z6$_mf(pq+I-k^{wis7xpHFXrM`)T@ULkN>N!Sx!v!P6kfK{$j`U>z|4GeG7MDiE~C ztAH~Z&7?rKdU)??HXGF3eil!iq#SN@>E;LA?l-)@_FaB-dOzQM<~)xrcCa*53|XN? zTWXZlAVI4Z@$MYQL*oKj?eJ8zO-`=`N6x_61B;yMd4BT#Ev^lA80I}}rg1@0yMVVM zdU2bKilR9RJb9t?++3yZCQ(5&aukK>zb5 zgdOYIX)JvdeI!E(I{^kRf{mjw?Cgx#*&Z?6sTmF}Ax6aJ?$lgHZttcQ-Q`0*eU}D+jIQx!#Pi$ zd4!)`toc_jzRCK;a<_4e5R}4G3JrOV%5utPjCGMWoad6<2xJgQTVi}e7;UkfL)%uE z?Ew$$o9DSFKF^bnta4hxejxJ=jh|3@Pbf4_X0e^<0$DrKHA){Na{DT#J#GMZExhpN zZC<^2l{c6GSsBpi#s^S_V{Ju|3$qx7#coJjTG5y#3J)-o5(*KYVYMFFtadhYoakbXBvO zPzPD3==MnbV?4HG%F}6ObXpQQ7}9JHDLOrhtl;^BaQ@&ao_*pJKX~IBFTVFNAKl)d zKl03Vd)UTA-*WGxpintv%aCbFIT@$zcJVRUR3Ym4yZ1>|-$XGek;Hw<3jYfZ8oS@;-enq264xXDlH2#omwSAgfAPtCzQaA9*dkib#g2qXK__Cy zM^7a+h&ZwKGJ0CX$!HErC%uaFfJghqan4w=2xKVgVxl>@n`Q|=Z&{7@%i&-`Pws&b9x^v&Pg1S z%VP(W>}$8_%A85L!*VeXwn0kGYA0vn8`jH`xmL#W%Q;VdW}f%Y&hyIKUEcWc2A9{? zSRV?y`6Ba&R@f;$PGo4UQA!b-5?hyq;Lxe4ZkZf|z>fxm!5tQ}num`p^3ajPeEG?9 zoLb3P0i+wz32I z)15znM^Ft%)Mbs)nqDVEmL<*3Huqat{Zw+?UPjo0~zY)cwcsF2=4&;+tb=MxPO z(QMI3loA9bV$h6%kdd+q0>M|{6}d7fS-?mzDJNK^QA;No`fbKRbL;JocQze?7&jmdA_cqF?=Qyf3A(S6_$(|L4}VBZ~;CgKn*p# za2dYy>KnX%<2HA^qG_#SiUox3QH?#)LxzZjsI|DNWHcJ$C*#Opwhgkb5sgJzhx85~ zES{JS6e~0$+81KY(l`my;)NqL5+@_t9JIh`5GE=NGL z99YU3uV3eI$MEInpX4)-9%ChoBA5jrjE0~ECO2rHMiTKFPptw2r)Ywt6i}L}IHW^Id%2VrMv@F&cf~D0Z^V>#u#t>#x7b zQ|FHJ^$QPj;nWJpd$5@8x~aB+yc?r*t7=S6pp_e1MJ#ITNdv0IoY6df01hr4<-y~t zeE+4_dFh=i^qr=(1`uRfMxM9ORYub^2;vRdOC6QCUy~y)De$Zl7lq#Q9j0;Vvu*oJ`aJ&ymtW*S@8!PV|2k3x zcXHC0b|R#l8vDi7C{2(VQYCL^8U5ge)CiTLpmhd1qR%maBgf0gc}5C!VK9Y3Xiu;n zl}ozXvYG|H@YIuh>DddM+7~Hc?GUdkBO3g8jMf571|m@6@vVY}IR4-DaUN+!oRnW& zho4{CI%3yc>hELW3*EsLasHa}IYpOoC%njnT^R?5g3>FCO8YM~?9Q*RJs5 z2e-I3m{2wYjLxI*Q%h79(*(VWAyL{$%F!0VT4bo1W5T{g#Un=#^2Ns=;F+_FECaS4 zfp6#)2IjkX8;e?{3N#SV1T?jPMnffIn&Sp=se%_j+~J3>zsHr^Te#38pI;?d!`9Ya zvc);5CeTzU3hcyFZx0ZYinhwI<8jn|*aqhv&b!z-P2S!*I3QBhf^Y;Hf~XKeN9)fN zJCBmli`h$>WD6Rs2RTB>Cc0K>gY|+&1Y{>C>*c6?k$U2h`2m^&zW3%DZ@v31o_pv) zzWU@*nogoEA`w1Ac_>66a{*-~nX9A6xl*)qXlsEJu%cl}!@j2sXZFwY6Sd7d*LPT( zY|^hic4k=oUCl%MORc!S8EFUOXT+UD$x&frfsQ>i^#s2?g`Hd@}|49|X zu!6A*3~XR)Qgfq(TVuK_iZ;R<>Y)X#-vlPMN zg~y42OLSBRSgDW}BqcKOZLL&TKh;=kaDq}wLQ{d#wB`z0CMQ^nultCJiVAm=A+rv( zSms7O#0dtZK>gonmcs6R9P+QRGITf+JIcxlWsf zte|KHJp1*}^UMQF>@Q&6Lyv%NO2*@8ULUkfg+h(;QT^vhGhfgusTIc2W?(o)o zS9$30Dqp*Bp3gpdjFaW!5|IRi_^2UpM3HC|i%J9zC9|1}jmR`% zY;lb6vcW0?T4QvFUe;!~vq6zbyv%S8oHW$=Jhw&QR=>~B{@Z`asRQ$T?ukeE>V>mB zI#24ef=08pwa)VV9J<$GGMNxY6FTi4-5}{|!FYI;kST;&whd6$o!>>4wEzGugOJ%T9Rg_yN9g;X$4`GshtlCoy5tXR&2~ zoWXcVB^9k=o*GRE6$_O>BAMuTZ@w$wrjLTn%UkegFI{AP;Mf@CcyWlLm4On}c7P2d z#Ks1Tc^6SgCfi#Kb}DEfLo==gt}+NG@Xq7Bjb8b|&V=dK3uI7O(|aG@PVK+6#6%=fUX2=P9}^I44S}JRkOBJbA7vFW8ko31%r$%7_`>3g`toEX)8kAN7N%k zxx?YE;<4lVc>bZoJaM|s!3#RWH;cA6Iu_2? zD){O9xB33tH@GsIr>Zi@myp_!smMu_!6K!{Ru#f}L=y{RkdhQAp?M zbbAIQYAFx_Lw&VH=d*t)?^8Z@9pK-M*`o`AFXAfU3iafzBZf|KO6M|#Di ztO+6zd`evmO@fC7-Z_N!2q_UNc_=G@kSG(H(asL!MY30@Q7WKh4gtm!ht3z#twlmP z;`OWRT)XijUViTgU;XqGJbiACqrEm;K2Di3AuvdEu#s<=8=Q;9x=7(CJuT=NICQYZ z$%C+R=t;i!ddUkfy~544O{}-%rl6$^KBy=h4F-%Rh-%himq8J5$Y7Z9?tDboaUL&X zu!8rFpd`Xa4zIuwh>iuCn9Lc3AjmjDOzvutv?SzI4I6J*Q?!*N9z)=1rdTDh?2V5i z+3w9;>ONt7`DJzA6n&N<5ag8UtoHDWwc$8io~MpX&Xs38i#*kgrDa%}m8 zVm5>nr#|H~hba$y*OqSj$-CTW{|oT;Cw=#j7{}AS6GVL5{g3x9(+kJB$4-35XS zvC}e*c%Rzsi5TMHL`0DtiXhBPJQ}0`DR3gXWw?|!D3u18A(bHrjS?za*oj!!VlteH z2(&PX!eKImRtOca)M(L=D@UOl<~kXtj~(DEpLv!qKdLzbNIyh0ijHX^3yp6ArT64{ zhBO%sv0$#*b#E90BW?I-2VT821ThdpN*B4{7HqIcWiTy`$5K@_jV+PYDC$aF zj%gQ&tV0t#W$*|gQJoe(%lN1obM4Pw=X*bWhc7>Rj=%NXgPdQ1?FJSXSJ`T6asowb z4g*wUN3en-gLZEoWKAnHH1#&~W`QRcVD$@gJoEUY{NWF-b91|5Yf_`MBhOlRZSi$Q z?k6nR4bD8U%HwBG@aTy}j&xuyK;ASI!Xk>CP*wz`X|)#t%?2e6o;i^-ksc8wJ0jkj zuL7^$g73X?ombw!L%+-jqJ!4+7y@-U#)k<)HFR@>syudQhq|nxRXDih82Y=nB_epwBz$339yC0c!#Sd$W~5wp-WJb z$zTgF6*|jl=WT`?1I8#i-8qW6MaFf_*0@H?hX3U3pdT2Q6Yku(PJJMwwbEu~rHcgqt)E^E|Kho0|Hc*3zflGB|NKX8Xtl_(FjrsmtSGnGI_}2btoU8IPp&rwyDV$QbeM%M$5qRQ5WHcQ(=iaFKWF9WJ3pK7{0;mBIvspiURE zlrid7>IPhmmy?JXYJ)I_U^1l6KpX1daJ7gugLXksAf!bEk8LVK@ML)#RUD_RcKFjb zZ}HMQmwEKWDqnc&98aA;%)U&M5hy}zeF0=TLy{#&0T0q)sF)Wbw(KyhtQwyD;vud+ zc!;;JZ}HP>SGe21joGLx6^$aGInbc;PrwqdhL03-ksDDSIKCd*`IrO!NWo8K&>i*N0HP5~gro?-V45VJEf zj!ARQ+57+3`quZo@AFDGYcgx8Mq(P8r@$lyf~vRyTnKQXgYQ0nneV;w9+$Ryv>9Tn z)6^?9Wj$iM>oK914ay_Od~et`|! z^Pm3a*Ld)hfHqv4nx+!LL;OjmJLEAARpb zzW4mQT;87I?K)l$*lt@=0#^(uhl$wkG283$Az-z}>H-x(`$QiTv5z?(JBnyNh-RGF zkV1=%9Zp*ey##%fL+Z*AY@|t0yXI5(Ax+n=hYQx13uF@uvs?(!}$cA1}{6(I;UL~APrXiPF<)|#MFPDKxR z9i@m?QV1)RK3zJ8{QVh&Q5qkjuuD=vWAcF@W%FRx+>-ZMIQ~lcw%XR8xgjmNCftPw{O5J z@9*&4=YGtjcXWLuu#PSY2D%^xNIsB4OV{+YU5n~H&iA6H?I)xt^reuCv=pOw406$| zQzQnTlMELV7+LRw5|%~KptL30i1(f7?5sgs2MJ7B5mP7ELs6id!5Sk$Cus4Ds6@G; zxDtE*{wvq`7q4C7%a7d7Hy=O41IJ*+6pR>7|hS#uN%!5xwlm-b34h zo`5z4XC*VBgLZ39D0(Ogj581u^U&w;FU!n#F!yL{s0S6!l<4Aq-umD=XWxI0J5H|g z^nyR^=;FFa3= zF$<#s?i^e~-q&`eQyYE!d)Wt((l6K%n@aHuNzpFevk{qH|}{O78O{)H-_qgM10 zd`Kh>#yTMqS&P;d7Xv;jQr9!GhN$Mux2~`@xxu|h20Zcb-Q0iXFeiqZTSf(^9TW+A z0)-@JfG=pfAYHH&h}xs;g3cD~q{s~)a7D?hGx)Q2ukz~oE#AN8xjDB`9EN%YQZ@qm zD6Gytl6sHs;*zYP`he;@vG>Ff2q6%1(QJI~Tm~_v#Uydp%gr(NIi7c6smUE~%rgEK ztsq3f<^)Miv&IsZ#l%8aDMSPv9atH$huI8O6c}ssZ{eeAQ%UEv7^BCB@!c-3T-@S= zYcKQc+ZXu!qxbUIovYk#E4BeGC* zg3fBTf%o>{oy$GndG&oh+40=y*Rbnj3O6A1iJf^v+MZGrgBS9J^#S&DXw(pUL} zT4%a*lhg-dj07#@jzp&Wha9Y;6ogEpP>@VQC5=j=tB!PXz)(@}i)4s}LOTCA5+0>O z)*$C%4h71hR7(=Lue_D0j{I6^Vr~mB?v)xuKvGb9{~;(7UVANXcf z{<#)!Sp=BmVqL|27>QyGOd2r4an9d=Qjv(sNuwpGN>TfedCK94UO~XKc661bBfg(d#DMB|c;f!keD%@$c=GmR+_eEm3n`w{e9BJ0 z&FaP)P|$QOd%F$QaFx22j`Jr|PaIn28uqkIAKy3!-+$>WFTC{u_4+OJ%E;s;X>=4p zbd=2tI#525+C=I*boLG4TS@Z_!cbNjizgV&>=aKDqLUV>mswYy)Ivip=(K1OIt7un zq=O z;mW)um4_+T4}q=dyDTY-z4$XiAobD+p--eH68k{vJ*n?WeO~YLZ zH~H#}zYJNGhSIj@!U*YM~U*zVj;q0Xyo;%<2>~=>t-ve4oZ3&&2$b-`O1SZJjk-w^x z(|?DLUzh^=-}^8A>*Twh`D~8wBe5vaO5^hS9ep5$9vveE2Hkr?dz1Cl@b!o8-mOA`2)>nG{czFd}z=OGO7(CP)&#K1F7x62U6b=dN1Sc5Tw%(0x|Tc%sv*EZztV{ z7zs&=G)-J~*hpG5eTz*}OD7qnh)GE&+KMhW=DjJUB*?QMy4c{PxG`CuYP%le3T)xB zeo#i|(H2bR9mC-!)%XypoUlE;!7Jx`uFfv(aUQlaEOq_oiUrY_PY?0UMod(it>3Ct>C+&lEYUBcrQ`H((!gE z=X0W0L2wc4z-W!JLLx{B+GJR{FBd+9^A1!(4frt6dvpanIx!3vN$`z)ar7Q<*99?5N z>$$l%16MHGyp?w65-PM1Bf9e_6Cp&DkLZ|)1W7Mc7EDD77M~&>r1%Y6K>O1PcZ<=r zQphiZI?##RrzrDN{}%R($fag_v7rA1D(;}b;b7|>h?#=Uj zaB&wOYc@CTV6SUYM2Yf7k$k{+y{s#}M|%&UBegBcH^jcr#dAmW0iC4N7-Nt`!xTu- zOZ+u)x&AM_07}X6O)!5Vg;6n*v?du3Av3Z`+5F~7Q4YDp0MQC^Gum7L%E8b@D70lX zu3&hC*tc8?9XnThp8YR>z~gt{!r%P*t=w~Xz}Y@gHoKf2uj2FdP~xyS6a}X1@jIRr z0=KUY3B8aokF3MvU%H2`?=U)2*$y{e6#8;6T2o_^VnKzk%LIK(A0jj7=&fan;v9za zGx(z)eaN|+o=>hPcFl3vJPdBktW7X!Cnq}Shgucsu4k@0K zmuYZH0Tp^;$jz-JL>t+X_wVMkxDHgzGBb!;LS;nfA5hxmV%kb)IweTLu~x|~2|q&P zQDO>>kyvPy63)0*xfsWBW4B{48c~dfq~Vww?R9pq?{Vq*vpoBj;(zqz2RU8Btxi$6 z3I%w2G_6diOo7f}MkXZa8wRE3m@=$7(CY=W^@6*PudsF)Eaf2=kj9 zJ6!W?pTCW#kBb4JpU)Y%NErkXL{i{t8St9yv+7_vfov1}lNPjGABdetbpiT_=>t~~ zzENWk4OQ$&Q5HO+jPO+S(oM?+fTX^GQc*fu%Wjtvoo&jU36*~fd^b0uqsRs_r>i zQyLp({4dq7jHE*>2q99}tMpjB2W?91Xv{3kIJ?zw;rce0Z@kFkcO2rG2X5uwBe0&J zN{Nv&R9Ir+Kv^;8X)r}1%=f@gFkZ7-I975xAXwTSy57?pgRzPbMc0|M!Inc*DW~}z zdbWK>zq-yf;M^2my9hsc_ZqK#e3Mycpgw_ij?y_)-_uTJgszpYmMLW{-b~Po!%Z)R zbLu)$E5)-;DNhPSUbA@pbj$~#1^+n9Y|@g^cA)UlN;=OW`fXb^B!9cAZ8<>QfM8}!OJ8*CYgd5J`wvWHMBKoJFtDpV7A3zE&{+?123Y3QeT8q|y(S=s|HCi0x7ynKxVHrc2JIzYM zpmap(D6%DOh)yOpsSx8;u!dj_$`x2;c>ltOoH%}j$ed>T6Gmmvuxfbnp40r+FaKR0 zI#IA`WIqUVm^E`$p>aduId|k}Yg?c!Ow*ic@0lvc%vM}X@clP$@W-#5<)iBzy&9pb zBj{eywz58`g;dBVy3P~kE%X60(?9t}5M*d3#EA7c_ZM_Lro5tSkl*#}}q zL88=hf{?V4KUboYjz$O%DRbBX;T4N>m#}!5qhK~;u%tWx3;Flp|DS zxYTr%<(NNs?*`9*c%CmkaDrd^{O#O1UgcxvtWjfApy&fbqZu0ug~3{|S*CA#AoQ48 zQJTQ8>>XGC79Cw3@met@vZLiN^Uf4rI(LINE>3v%jq8MB6IGso z(TJdH{K8sL3STy&sS zT<*VGo?Ie+=_*c0BP$&+7N;CrFF;96NFK209G0dQ2jz_IR7hh?DKG1f5`3<_)=-Rx zbP1Yyiz+N;cm%}?*ZMuSuioVP@4m=0_uj(SA3DNq1r*+6X4`DkmUTBGL@fi+gs{2$ z4kBnXrjUz>T5C=gaQ9JI(ZVFtsw0LzBP5eBuO+OOWHiAid`$ey>nZ)}p`Q;^;V(o1 z{V&c<(?9t3zozh>7{ECP#$pvX15SY^O1P9YG|i029H(0bPIGJ|9p|E(v96~wj$bU+ zsvtN`k07F>k-Urs*unBK@WPG2pT2*QH_qMQ`c7hPd^_V>bl z8du-E!s{2V^VHqP`Qig7xNlTSahG7Aw4`h)sI?U8uBx(2EQ;@`Z2&pkRJNdW7N5X} zNHd#K4J(wcC9HrX2}me*Y{BIO&!3&~+}oe<-nEX)U4=L6u(paFl=$rloi>ySv@TG_ zptYg*o;aJ~LXYnHEa4FH#G)gi`d)|;UNmqz2*WSN++~dmPIpA-uEe5is)=I$L~w3O znVha?#3&TQ{vju3HldRak;ot9t=5Lv2fUF4)NV*-{ra2&vAM8BDLGZt&Etp4KWDw868kbV2@gBwCW`6 zCz_?iBN{6QqO4_zDPWRAn`{`%L<_wz>*b_6r9_sYu-Q@F?q8%Z|p3r(?+d?Pu0G%TE z4%2%=-=lpmp+mWtTkZ={R%!49W&7?4V z(8Kc|wEXDoMc%r&!^MeW^~59Wb(*#f&>9&rHMEm@F zhpcbTw(TM6B1 z+BFhnq@qj_R3uqV=n^yEF`3u=@wJ$~a#;WOzKH&XD4_cgnKd1HK4U(gOL@{CmsZ$04Xn<*%Tabrwra8;e3>qx6L)W^9tckJx$vUPTgD_-;HZAWX` z^zdK*@FU*8)^KHOPPA)`j~>NSGnsh&)*cv(4oboaqLN}QLF_wxGe_akK0+7rcr`oV zL&zhFJkndlTc_MD3UN7llcFwD6P8^;dHuvNrk9Iniqcxq>Hr!pMJWW6B^en}lM>1% zl5TSvn-$`m*l50%`86U@xuhA?x&%9$EPaxn_NThfX}_Dik7PU0!Cvx~^M^TZ`oBp}0o^}YS9j{KtAzkFXQlD2uuvR{CUiO|TTM9aY>@TqSftu5LZqRIMoEgk`l zLsPyG!vNoV;{t#7+Bx?6Rj%&_;zZ#Fj?Ik`!*QbTc4?al zCTe0xq_!t^9jWcmeL{tZ4vEzFA`b~3<)ui&ix(!vD87M|L>7=coJz%PUd@s)B1(xd zRxQG3@-?VT?t&&cWa=mf7!?9ZDU23*Ve&rzm6%Pg0qqS#Yf00Frs>h;fMPg8xfOa- zFe5QLe+AZtY;2ySvJI2Hz}}=|_SQAtzr4rS?m5FPW6P=Wh;>!qZO^QqQ}`B#W>^mK zG17%3NshXt(2hi;NuG*AJP}bt9+YB*z%>PKqPWn*JJ)*NytvET7bcv$>6wL1s?jQK zYe>mpOYz<)Ez5P9?%^jpOJ+a)9MyN=y`VyqNLW%oNBNHEvtfLp;q^T+N&t#Lb-x!{ zk%P?^RFq}67#7(Ki#uBO*|hI{L7^iglMnSuUKf>LK$SfOIw=TBXi3WEgiR^BgUUlU z8zBh6Nu@-L9^cH+rDI%-8MpyfSptdP2WAP98(`NCGYdPsaQ+IHK0M2#8>@Wd-n)4G z%q9u3gNZaHV08lJQQA`&4RlmSNouba`A1NZCV0xCz&MR9G|DPDv?L3I8tr@fl%y)P z|GlrB$(P;F|HD=_)p*EoJf<2C2wf-5BqcA9auOQSg^s=_6ABc42<-WWY$zo;BVt-{ zCqRk>0=Q0FP+Ne#updT3DG{M*yjb)%ioJ~8dgc<9MXx9)32o2ExJ$0sWl3- zcCmIY3xkwRXiA|~k_E#gjIv@}BS?&R(0JwPvo6LcFa%6?dnqMj)wT5vCceebri9kw zs**unP*_b=nw!&r9UdjP!@S$=^6nc~`O~vk_`+?+c;?Je9^Zg76|A^Sgb146Seh)y z8C5l@g_#c|o3N$B5J<6QHf^Yk16z@FL9~WlC2;)bKJmQp$#p)Mj+hTNF@>i}3L86g z=ouGs4MeZ$`$*%X5HWm@N^7%6KlNMShT!XoFLfg24z2Y2P-c92=^Nr? zhm~Q$SZT(kX2ygj6&zC|e)WNhdyhQ94_-RQk6wJ2_dmJB%xut6W;~f8nVx_pYU$o2 zExN%NyL^C*x!ab|DPeLEoenf8G+?#Hl|&wP@1IhBk83sl!Xb-fG)&5su#vu?J`NCKxL+}wvJ>i#wv6! z$SsCabrf-nQyV3J>q}qcH$HcY;|lCvN9FpQo|(WTLJTy0q)CCK2RQ4{8ZJ&?reJpn zmx1q}pYw;WzQa40=5%_U&<>~%9cJ~!02`p6@36PGh0!f_S70H9Aj(JQRAl&YX@!7kGDq6~_A zB|fAN1H7>pc;Vs>FMV{AOWTT&RwxH2S<{w6!;PIO)@qc}^j)CyJ*sPQv7;yhak7i? zZ7!Z8g6S9kiOT!3&iikSAx{-$?ON`~F^Abi=|1OEe5P6+^jb(UEvcpk6%$HlXFW;|btR29Wvrdny%<1)$0$ccUPq;+XcnKTl73rGjja!_()*UCnV_1UK~YhbC56@W zCK9bQYg{xKW1zP*t!I0?;rcclS<9=Q(RdZHsRISAw3Z+?^x84U5lRDtiZl(RZcdvt z+98#vkw_L1!C=VgK?Dw0>wNL<SUAh(gjQ*>qxWo03+xrGXSFrN=B$j zDO8eVs1Ox9yVpssL{|f>)fnRmzN76$UpHRcpizcSN0KYR8m_iCdH&sx*n0oRT;Hhq z@*O95;nhnItl1#1eq1~MWo z^?{@`MKvawl0Il=eM3x&Xe-%?jHVbIr||_J>|W&BD;N0qlN&sB&nX_i=QeIz(;P1? zTS;n-RaY@`713{#QipYpF^aJgp7(YO4;;4K_DiR^|HKO4ef~YZ_wp5{5&=U?q*Iz` zO1T$EBvVMLW^mBY^4M8AZZ@iAI0nk>Gc6V}0i%gXv8>N5QG-C=-O3i5g3tx|R{PNDcIX1ELh#+G?WJBx6vzB&bpj%%&7-jnQahDU1>+ zMhsZxaS;Y-&Nn`HAHVv=M|k9rp#1XHLc(f3(8 zmc0l_;D`1aWi>ai-@v+>dS#3mZP1yDCPu8)3~Gz%=QtN}Re`A;u`Fnlp;wBcuIZ=O zIs4Ihu6%HTolg!^KY16Mr#1oTX<4fV7y*%@Pz+TGPR&*MWtZQic zf&>&H5Pi?2i@fpHMb>ry-}N&0mwNm{6wv?lU;cBx{no2=ufD+g_m1I=!qg+$q9m;z zVw(Z89S^KSDZJ3W?{G;ms8>Wg1sJ!6rxTh**HM^KPKERsI>xz_-fb1*5;nBq)_YI! z=-LsU|L8I=f3nL*lU<7SySUy+YgQTae)P&tV=8YOa`UIIIkb!b#J;7N@Vy&R_c)PdKsk0$Bb zMP1_Cf=G!q8e<~Hv?v|$s*$i3udr@}t8ORuTfBYq8W&#ph*vL7c;NUtUp{k+JJ&Ub z3*p^{F0i79SXGdwGgK*NtHK11l#T`{6g>0b8jn5jBwzkK{NbOz%a2}soxPZ-%2jr{ z#H>qTONy$dYi7{yLaL~Wic&{nH>aQVI9pS=fR72Sr4QUiaAk?o7Hw<6*=5GINjK}hd+k+l{BHB9k+|5N|&;6thGcL-6WE-`;kF%lQ)k3U5m z;b&@3(xMb8Z>IZumg zLm*(3g4IoVvXzA%+CDO~9er6aQ*b`Pi*xwi+fy!`zky0M#FGrWmdaGvLCtQvi#Lj% zKp$Il02@GuAt`8jKSw3e@dhG+XelDtJy(hLV0qgr&g%RqUKS;gSy6`nkOj4#}C zn!655?6=A5kFtphoxLY=kV|btDjk}FhMtm=Jp$lp0zd_whjKtO?I8x*zTxFpU*h#w zrH|MDscpCt{Y>7NP*RWtwhEV616cn5~kk)Z#YyRV=|XQ^p>IK__2a} z51r=rjU9gY@pZoU!7HehW2}yk;fu6>ZRPx^91SHF=Sg?xxn#RTiVq!qlU( z;NRqbXO`V0qa-L+kp)*d>1}=UDAV54_6bL#E=p`s;uIL~SuY(;-=Jfl@E+zjIb62< z(!+Q0Hy++(JcDCp{-#4f1?kEdV<{sHtVj{sTvk*#(FYUpp_gEhwj8Du>jAb#$*t!J-1V6o}r_%p3ao45KV7 z>zg#&d(tgPN=%X=WNvXbIC8)^l@s%%+mqAoSakfeL37E2miHI9!IYNIu1I`TT6RfO zE_8HU6#M~_CFMO+G>-BbA2bq)CfK2Z1{H{OB2g$EbumU4B>_zrJl<>S@(}fSi1yoj zd}D{*OXs=%(hvCh19$QCXCCGFilwq9$Im)c;r4?>@`R$y1)v1SX`a3p4zJ$Lt;Y&} z@ZuZ1cj-En9+CzF37py6!wrVigE3(~rQh9R+DsT&$J+P^v*`_zX){jipw?Ipo!CO; z8WiG;Uud9{6}iCzAC_dQB9j~=8c!sG7i}_LFc+?$+Uyn;W8U-@nrY;|SZJP?CcZ_W z$j>Nf(_irM{(bvzXWjf+Ot$0#rkrL3^&b;@7sAeCMbv1}f_g&Vt5I^|e7bQEO=?CefpKEn-b4sEVbsfKR* z95-%U;_>@W^0$BOS9tQ_RYnRnNR-SF%bm%ZPA#d0R-rltSkO=n<>$NV;kEbP;ZM$8 z<7Ic03r$Vv4QdwAUBybZK_qc=Ya3gNsoTev6nkPa#3+nn-{#<&Ak>B!LN<|yeU5P2 zmuV!zG7WAYSC(>TGBe>3>Cva-;aQSq_D!7!UsLllt~Z@o^zwQwCSJ?m+7Pv3xVBCc zBRv6VFomVEC0aupTWqCi+K%;=lJTIXZ+55+)JDV2D}3dS!+hhx2e|JzXb*bQu{JcQ zq87ZBE1{P)PZ_merHI@ZFIivG9M?izsxWLQ&8-%GWVZlQE-7PO?GP zVy&e!9CbuTNqQ8z)nYwJxnrG!k&@2u>-`X?9JsWIu3rQ&shnh*lt$-+Xw*8ddom#~ zWkDMQp`B6KlJ%7_#h@hUNIT!dhDb52fF3`aV2g%BRmb5lWpMpEzx{>JaaV1*qk_>K zP@bfF=DH^aMb}s=Q$U@I_^3$%lrfaJ1I&B!p5`DLbSzLLLf=tsRGd6}bE}&*tSzrsq zRA&=8M%DoZLDfW6vA5?5MpC*8S4zxv@Ms+<4aB``9MW^lbceN~=c#*6^35kd!(FB5 z#y1DT+7`ij1Q&7ixP_L?%Zc8jNw!2QiBj)kgg!AYN2mzC?J+nu96Y%SC!ajQmmWI7 zKYH$6UOD#~*YwV_cby{hmT4iqgq+pzrBIz!^(&9V#}&sL09| zDWH)AIi2x-(I|2awvRW`l|o@d3(bUa-|)=+xAB=XhdI4s zDan+Zu=pX}erj_r^uvLT+W~FU^1$(u+yB}b9)92$|Kj_v@Vyt`r`_9QP#t2lHfA~t z?Cngk5e9aRVmKzXEz`YiOgR8MmkABI@1~G$rnO+C(;NxttOXRkq!kTxC~`;H{sHG_b!OGUXzHJkXZ(4^@UoTm=M=?1Wg7gqRXzWVudA|er4Sww#e}`v2bA&@f7?{KuPZ9P|Dxk4MZHYJ{ z36I62vBk1?LKaJ)fKnMoTCsiU9M|V1B^#`i$M8{e?nU`Wy9 zLnOty@E5YND?|xCS#&A&5=#~c2Yf7%BzUuQAcFnCHF9twxp>4Z2ZKcjZ(b`#o$Vsw;# zx=V@;$}}kLK}&{$(uruYw89u-N?@#zeNqy$pB4bQ(jt{ys`<#=|2$<(*&L8aS&k<6 zP{=>DI{5tO!wU;Khc>d-8Amb&Nf#t*QC7mU+P=Y51yxm06b8bK(6nf$89B>%Fks$Y z$12Zg5TLukTDQkDcbw!`zWH??tTgKhL7Vt47xJ1?m-qmsE#!{qKsGanP6nHQ84`;X z)_HKfLPbLrL@BmV=&?%&y?u$roHcw=zR zF`2Y-Gxwg(R`@>Rdl}Q{wlIwe&9pD47nwg)V%Nkoc zV%O770zny$RwWxNaQBMkfukpQaJ}N?4=(b-)l2N`T*KNCYjwqRvX?2bQqcG=()R)1 z$>?3#tQ%b5id-q1RYW?%i<>d?I+H}v6M}`OL-xpgbPU2a|f=Z(lrS~n=fUfHL8N94LGZ* z2a-lLPmy&6>y_qA1;@X6H{bv99^ZZGJ>I+a3G-QCW%VT0u%PWAHk~YnJ`zHYv6gx? zWY+Xd+m^b>+TvVnh^~Cm`_6?JIPBiEQMDfqERYHr#XfFVl6F_!$dA1 zuc4I1%Z}fHw<4ocIniyQ8`XKC&su4vm#=?i5~LOrG{zaUQ6fJz31uR_+vCW_CWl59 z%x>VXonx);dF;Mh`P?0k^XOXQunw5i5ZVCAQI^G`)?a>Ki*4TL-wDuoMsAMprwrT* zPo1eadE#jvy6-N&`|OW->w|0DoXi=7lDd$E8J~zjW9@)(ZJEcb=%SWXuKYDbI-$|F zKo>=37x%F42~Qc{?X z*k0$I}c|FAir)JqO(Mw-USWXWY4HG$JCnILg z1%(8yMH;n;NiQ9GSW-Amh&^4mO;8Q0tg*(hvcAUN-ZhN#(A?y(+T+*0^(5bT@DP>v z++r>B=|?n8&&Jw@q>^<(%q-O?Uqd3(Tb|2xLeZn>FuKi)ULtBu3}Wu9`hcS&O?P=< z?JyHGM~=Y*f9G-j=%vei`=uYV9VRGqjJ4rmywYslY=q5Sjxg0o!cVLu`X#T?whn_aynQDkq^i?$kWR1Awq+&Rmsp}~cgYBJ~kGl%%v6HoBaK(h)A zQx1$-!uJbs#eO1cnHSx8mJ(GZD2s}MN-dP4MCxl5z@#WrK`qyC+ctvQTf`c)bGm6u z4a`l2DvH07HSXWV;}@cU{`XF-sQ<-tZ>EV4sNfmZ6%9};OSDkA0%rRH$Bh>HbUgfW5*Mp+2Ea9H~5ox zF7xc!i@bO9COdP@psb0>(1$=!LSsk@TxoH2#cVQ>&4vnvCaR9*3|JdsPjaw}<$)rz z>QvTHFVJ{-{JhXns>RlCmTI|#XcLvzS*~GoP=V;hQ+^vwA+s}OFj|rVwGrN`as?Cx zrjU`iwTVHY7#5n+2bfP#(+O&Chlh_9eCxAM@x)#04Eo5*Y=_N(1=AB|GfX`q*+|q5 zuM`GLN*yZXledyhDn#khNU(xl7L&F#qB)KoT15uA`_lCt-fJGNS2%g!m`9F1#`oXZ z<_GUyk_XLp-X}b1W8s}XwQj6taOP|AV!s? z1BpeluFw(XL{9#^Qeynji9Ag>Sge45FyXg^>D*j;z)>`gk!#NUV%3 zUDwe29(;iI5zN7D@uyj?i zygcW@QnxG5{F+3{mmK$u+qLFoFg*PQ&rND?mLTG#hRSIo}%*{N# zij9?ues+!S#x|!Greqa9rg^rk{%uu)?$=#VwS zTH!V9g@`f|T&*;Dz9wX)bqk~8HTOO98D2hll|OsyJa1lkk5C?_9393tiLQw_WhfX> z#0KBbY5EqY6RI}&nIh_JYREiXZL%|N5zD;1zmba5=ti0&(K;{&T@+}oC74WswTik{)I%_ZW^el( z>!qTY?C_ae5A$1JeuDePQ2Lg2Yv|CZ;c?6`GDBgL!Bhra+vS0~=@MPnfbk3pg{31g zr;8nh9uO(Wabaj{DV2lhu|BXl7{bnV%HfES9Z(zi51u;4gLfa}zxspcdFSeR=6(Xn zQByIfR!~L3yy=O*R`z65lB^@z0tyF(LpjS}G$hgEQ;#!>apfqS zLdPC6-C`wPW8ClY@a<>#=I5T^k)slTqPr-Wpd|6MmZLGz29Y6EVLPgM#vq@g^O2-0WoDXR61CjDKRfehe6B# zoq4QSmxX5g?HMv@NLz159BFp@Ydy zXd*H0v0_`!tXrPE{WxE`_crbw!4T;7_9#ac*b-|OUDd^*G|}3C&eDoS8MfFeWWuB9 z+Q6W646*1UFrCjaMa?~HaL1RA^5B`T@uOGX=Lavo&BvE+(lNlBl0H~`?6KCMwIdmO zz&ZuS7Pz9KHMLAYGUiKZFO2ixl`qN~)g~|74$UF|301y6uY4LUbE$l4^O~^m_wfFx#FB*#j>H+q$I&+VKmAVSZ&ZT2~Ekm*o+6u3RHf-~p}EqK0Lm$2P#gK+pcP$Rb6w zm;n<9!4 zrzIybE;O%lFAHf$k-M5`5*AdHf?wt7V2q+Kj|b)(YGLwJ%hCU0z2LyaKrPk@C2NB* zg8tKH(JU#JYkzct2Gq8|dxXzkD#qgxgAx=iY4P-1X;1y7x2H-@Mq21%{8Do3|;nQ-|mS{-wohv$)``+izs){QMh>wzB>v zYr&S_9I0>uNN|Q;2ifziM&oJbyZEW6w26_P@$ktZUwQNqp1Su=)`8M{1{QFd`D6z- z8WEJi<7l-|a143iZQyDLV+BP86(t1`-?Yry#JI|Hs=Q{!1i{Qnr6E*_KFz6%nySjV z1WMK%jd;oeKOg47#p4&JfHnr}6$P5QEYJ}qosb6%LMHH?pn}>(_PUL&+(1 z5!!BS7?dSF@ZyyjO$^+2bj)FE83d@4A*h~NoYAE%g4JkUp$biO2Cd4aK641%dk9vZ zJkBEzoZ=sT?>)|KC2nr*(6v2Em-t|qHl{GO5=1FV?28|)$QN}DKYtgG*_$r8A z3ORKT^pU5bIFCV%}pk=8LnKz+JdI>_-=|*mQD*wNF|%s&P>wCxFV$#c%f<} zmBiN>7F`B%OEzTupmfxioLsfv-COW=7v`*mS##0p6GN8h<+K(3Z`2xXt&m-uL0N+; zEZP+q>xiykM~i-ORMhCY!1_6QzD=!nSsyeE)D~ZQNpl3ihYYYw!mt&bSh(D|0>w8IoNPuyxb zvVISD-hPM|-@U+(-ujq#E?mWzLsnKdnQl)=s#q3RixggKEyfjCQwZ8DNV=y{0gadE zE@cBy#y%1}$>^N;nR3!w4rGaPh)s*bXqMM3539?^PwJl+!6^q^^gr?VizFQXT|Exc zLVniwx+tLI(nM*NaW-9qi8m^TWo73)s1z2_;7=9y!fJAUPUUik0^-+SXDUi#<; zb7$G@N}9eR>Jn9qNUDO+kwOxzr^?qGMfOZ2FxiL<8HXuSyM;bhmU%0NVU=>C-J*#8 z8M6ANk@vuQq4N|#TL~l57L_NA%2??*y8>+sqAQkbzIFw=a2Vs*9E^!EQj~_$Mnbbi zH{D{zPB}jEeBqAM{Ms|0;Y_J$raP>bB`c#5DrvU2CakQEn9U)ko^s$YTG7Nn6C%+H zwP$fpdlWH^iCsmC9Yn)$P+`?#pr_G9JV9ib+EA_^W^#QO=Sl`^8#Do`=(*EbTHyF2 z>pXMEIzM>%1HSwGJDfd#fwk3JIJ|O_Rt2UrFF|a^NFWnQ=tf#&w9j&`EQ`yM3zD{@}X1qdwDI2{bq=<80$nLX)Boy6a~Q*#KJ-4NTo$N zP2V?^Rf#P%s&7eM%djrENZ6*wRF1;t7BYrQ`FHiv;dM^>uArd-4TqQ3IN2j3BM);xHGV=`~c|yi21r_m2KeiY)w3Y7Q zr2v2U+K;(1YkB&Kr}@kYh1M|k24ytXC=4Zv9-kS%28%UWPe?Y#0d;Lzs}(2z#y$Mt zEd1$nuk+!BtIUGOnjvmj5|hRENJY3vmjjlP5^qS+N)fCyN%ewX3JY3Cm#0E9KhfF} z7O}2*1ikDC>Ad;nj!@E4fThJkYMeyiT8*+!uyszspa82$&Vp5PNHGa#T53AX?i4k- z%CRc)g@;b_ttTJgzV(_KXqp=wsy0a>;5`hiL9Yx&FqHySH9ejN%^aBEXizl3G(gk9 z`|tdi+mCE=&-xMS2s=BTX+Nh}t5{oi=<&({s2oejx{1&PkLeOco+2L~SWrC;j{1b< z?xXkf?70bl`0~3v|K52*oZtoln1mlR>ETim|5!B$~ZFG+0 z9CldBf=)x2?Bcp@Hq?YWj~MPcG3IZ6>uYS7jx_=$yV$6y3Jbl3Hc7H%mS$+F;pvgZ zb(#XGVktgx$mFg7s_ZjR3f9(YQh%CYWdR*k4o^~o2UJFZ zk75u)qV47Ild@h~XU(b4@25}sbb+N7Jn4NYgXX}&=s>}}KM^{}l8(#2|I@}rv;6l7 zOWOc0;vsuyy#{NHn+gg0T3u7RQsfbX3mL|b06)@W7 z4y%#EdBN>ATI2z?$~@?VH&Lcr#-i*-jG9v`m?kZT<;NlEJi_weuoW)fmEF$&k6Zi;C0I#9d62KABSTrS2<0+elp;8zM`8j={ z?>)Y7DC6i`7}S=r6%x=HlQ?nbCXe5-$*bol{DXh_ET2$tBh>V)VC;aP4ZfABm3BhQ zQ8_e7Ws(xex*d~-Hblf=t_b@^;#jQ81rL z$(kQ+LDY`qN_iceLt8_%2IC+(g?8kmMaTDM{3IdyQKLp07V~55N5Mo!mW! z)a)>714o7>py=lfN!P5djcDhvI)I=YO@!SDy*A9XVGnuDKi=xNcKrq`^^nuYSEx(J zCm(L}-UlCZ-xE(z4qJXa*Y-(G383hK_excmMH~JV#EVlNLUmkI#RMgC-;?B zsE}XR2qc4!!nt3L=h8u9jajbu%ElU7V5V8uCx270YPMPl-Q zwMF5-gU2sS0sX)J?0xFDzw=yD)}fTan1u44;H56JCV@`$evVUfR6oO+iqIDHoyZUR zuB9#vt&gk^Hn<6FbY4oXwhLy8oMvl+qfK@zb(F_4Uq2o@cj#kQyyCuR&$Ilz&04Yov?f_gM& z){2}3TcDh5cGhaDp(70-IPe5wjFh%yRDx?K#I1`QFM2+A&ndqC$Xz^mdXqyAiUcMk zf?Y=g^N=H!b6qiuGg9m+iy;#XdnmSX%z$m+gI##-y(@h3@sGLj!4LUQe(kUE#ZyOU zwn431{%^nY$84`xeEy5iaQ|A(QQ$DLSOhdGb&@U>G;S~!xlD&JM2)9%9miC}sl>)@ zD?EDJW4v(w41e(4TfFu0yA1RgGg@WlTap%lh= zrYJwb^mB>DRZ7fiL7}`BT2hk2S|+(-QWMjLT(>%>qe%jnpp(3<=k5-;1=9dCBS~Pp7;bj(!Yk*vaPAY%96QQq@4KDbHf8KL0EWU$K^cv! z84pzfWnxi zWJFA+Fz@rm<19?GW;!RxX*5PD!BZ*;LQ2VIZ^Z$vE%|_;6wVZ%D%=H8w>YpnNG=}` zh4Qmd7-=o3cUtF=6D5VQU!d!(6YY92l8&D3!Aj@?s)AyjaaA+)H__<|rS<68QEJDk zQRwalCszx;@%g)X{QfgMcK=b1j)m!5AS__0XozS^S`=ODDa$;a%0KE%!_^>X+aH|0 z#M#SNdEmbLIkoCIWh^JF5vGH>@hH*e;j9!tb0CzmG&&EZ>KM_0N~~(jZKp?k<$v;Z z{`j43{@I_s#Va4ZOJmou<4q=Lc6O&2T~byeKbW?=7~>g_D#9$Vd%dA7NBP=N&`Sta zj2-AXN_W^4FhLPjq|e>WxaeZ59GsG4qct*d(NSY_$JA&;h$g3j4v57Nsvdj&<+9~?Fx#@ko+D4*JHXp#%aRi_iXa3Pd~`hcaGQq(rky?0m?xeX=5VU0VxA| zuq{Cu8Z1``+`upcZUEP2@XA{sbNS*0-h1tJ{%8NuZ*#`T8gt)mhxwgve~16mpS{lU zyYAylk3GawcMmy^7~?e^C5oc#BzVRYSZhU7oxm#*d(?V{qrqdiZJ_!0zkCZ{`OGbR z=amb5`-Km7da(h(K3eFIJrl%=pGZdlRIdgj}EK#LwgoNwp*$xAaU zC{pmETTdyYL~RbMv8d!w+M#fu+)}2etVCYx(%?#qc7hj-&d~HNN_CV~MOmr5uXL!8 za7yE+H#j^nJoDgfeDm=;dFUvtA^yJwA+`;2cr%5e&*tbpDhg9bL&U=tuw&sm@ZMJ9 zt;^SW^TIXSX@lF{<14owrLG2OdTNu15rTGfTGqdL1F2DHZwakNS3`8aN7$V)PB2KY z(+7+({2y)^|6FyS;TNcYKKS^Fpe#TFF+xs-Gs&YZ>rgEIHDdpyJ*lM==#ns&;l z9I<9A&OE%%<99yJ_g}xkcb|Wo*FSg-TduIWeiW4B#?5WI&NCXXu)5)BrX8_OvXGgQ z(9M~&4TK(7Tgq{XZ{|5!DxpFY@O$nw$z#!%vS{s4x)3duEr`Z4+ufnq+@M|^iRlK9 zDUIA{I?{IyD8qO(U|3j~?ZM3(9Iqm`pC0oY&pgWQs};9z)@&N-K1!2JcCejU$9Pbn zf!)cRs3W7n5D#4RJyYZ8mEt<^`c=>O-*}fdKEA|O7a7=&)s+?eXw22Am>HTOob4ko zp8teD{GETw=QdCCcc1zKUpxW3GiYMVv5^?%x@OL7mZ+?vw4ibFeCU8vio8CA|y&Y;(uzBPtee1b-{RYOBU_2q@ zbdwmsM7&WL?+J7wu?dn?sB`oxQAt-S=9pv^rN}W!IuQnvvSrKxbX1>4zFzS(Ulnw-+qb*Z(ZZA4cO~C zhPuaUhXbrK8Brz;%|RjaXshJf0a!2K_-F3q&RcF_ZSxv0KlcKYYZvg7+Zb0RGeiTO zY$>T>u7EhC3q5Aj_QtbDc=}}3$Qvuown>TCp7D-=HWlLZL zDGEP&kv_R#c7t^17E_32!E2;|PPtorPz$LSBi&DD*v6mQQue>b{=s;G!8)js&hgp@ zHTAjMs)WI_FCAIPhO}7r;(`XS2$48I*4RhWEhr;7iA^I15v7QWu5+G4n#58Qu0-}>y`oZ1|4WGsa- zp_h9|Spo{JEZ28;al(#4`K_;g zm2ckZSn;r-EMo&cM)syNy3$ZM$L?Oo=D48LP~cFZ1rjFoq`1v66#U9PYdn0{=lP=- zZ}Pj}f0;KvdJQ!`#L1(#GV2YyyAx83Y#cfUp<(aFHDViB+dM=&X{Cej<$jMQN=q*q zQfP@OVRV-dc$P&9Dw)odP!a?cW#VA61W>Cy8E`{_vBYfr#+fYn5_uomGgx1vaEj?{ zM(hLQl{IXkiQRRI{wBF zgZ}(IexVBJq#$OjSW20jnI|M^u>mNbHGNro^eO$Kbc>9(^cfze6=-cG7CA(=n}i$P z!9V!^S-$h)1-|jbBYfkL)7-WKYZg{ED=v2p>xIJr?QB9}3RYbW33je+v2l2VX`DgW z;gG92JSe#PiA_F#@^Rk1-tmvW^CItFzsQy!P#rn}SoW^pguNNXXbru+$EqpNWq~g= z^BVf7iK=CuB4HwnExm$X<9dq@789hP4|O8wh(WMP)+n@9C=*H6QyrF0>(0Ez3~J11 zOtezeMx9taaf00&m+1DkSv7OU^UEA7I)3%BNBCP`euNsiVKu_E?qi_P3afz7vswqb zW|!m&#-jl(mdm|oibXlc4dD5YdcO0@8@ze$GFwp->lM6pOv5g{US+m+lD(mfh%NzF z88RO_=F=H3ezL_||JVOFj~_eEuYco9+;(Tlr8Y8%9e374F-|1t6ioY;NRP#$vjcjw zJ}f8j2)8RZ{Mad;y6+Uw?az^2Us!X}4*c zo@y|lu7^yJf_WF|I$!VLoy*(&@b$C2{@xXKXBre! zmEjR;y~U)LV$E2M8ykvJ4w~CO5N6xdwFKn|WLT3@fl6KibO`8_B^tT~6(w;}N22QY z&ACYndpqq%CogK?Me1kFj9r!a>2N?#tQK+O`-SX6gZ$}2_%B%RKFz*kNo6^pV_t+Z zEW%$Ff2MQ69~a-(BK~w)X0VT_L+3F zXM4Lu14Ug?j7Cte(yN+~Dio37_z0_^McDxWmX0;%{7?VpS9t2N`zaAFyeMCVLeTd?h=5q`nL@BEARc<%iV_;_m@JKkh%xW=0o&hx+hKmUDx zZ+*ny`RddB(v!Ear(y0RZnQ!Irg6%dvBh+|Oj=KG9K~Q|x%~$Nh8_)^(C`~iZt&1u zU+39(r+oYQw|MTI*J2dRDO!%XIsg8*KFb5gN8Gt?sOSlPCbKUqIJ(ja0jh0gsH7NGHNDczkWO>l81hOB zFMYhrYad_Yz02EdH3?IVsK&==nye+k?z5~-zd(;g+@{dm1XdMUAXpb;NV8;Kf*^oW{B*-wE4{oZdJj$0k`h$q zkQPmEMii%xab@c=|DQj4i9dVsO}_Eyy?o)}Gn`pd94RWU#Ewyd)xj#Ji|k##!N8QP zuCGIakuLFmifVVU)>4~_^;0$XovOM2&ad&WUb?|Q|KU4)aN`{1+EE6#9%pYdrMt34 ztpzpHr$noIa0YEk`rgBQ4s|6Riwv6&%7B+B)~F$tiezLYX>}r*2sWXOCK^SjTFR9Y zSCq60+Bg?F$zVubmh4?R&!M4WO$CmshOd3*0shvPAL3L2T{C4Z$9G8?5?KO1h>(kr zq7oX!^=6O0SjRidwFK{6fj@li9X`A<<)fQBOc+tFZBmX`(F*#e#EpksQ;v^1*t-HR zUxy15Lv#2r>WE|a>I5?$^4z%_y!4;{SKRZ+8NTsLU*!Hn0K`B$zZLHT$NRuIb>Ixv z6)+2iN|hKpg$wfSRwG!e;lyWe=aJh^^X!kW@ya`w`S9{3Qn5l^uFzHv-v_)k zsH#Hu9WvrJ#N>!c^k3*8Y((9O(Ij{|h6hiI5?e0CRLs|IE}Ts^2I>m*2(-Z)kJ3Fx zCyWJMh=#FKNj9yzpt2F&?xFi#4h=15Rvo|b)aSVS#2RN#)hw);!3+O3X(`@A=&?%U zw82(2wyK$RGj`{Z>v}|2Dt3YQwt8N8?*m?X?>y%&&)A(AM%5wOE}}X`?Fvja=1RZE zzk1~(o_+gW&OY-1pS|}K51c3%IK#Gw>8xY3(BcNqk_1y&h7^RTXxa`RMJ98&gfBgM zf@;13z^v)%gJW~FLYz!Ebm$a&5quZuLcpV-tO!N^K|=)JN^zG%ER^phI7sJWB#Ikc z$6h3gA)wGXTAe&DPfN2dF=PYi!m}a5v{ex%ZdB|e_3ZJ#{tR5PZZB_L2JpM z-j|I0tPb^p{-XCe?_~M*0m8=uS*OYRS)~La$EQ2si&WBu{6uN6I!baHVn$9z0v>`c zq}%N3?5Pms7RsQF!5BkwhH_BS(_wVT*o8U9M#|DKE)>@#|XSfEBx4jfP2 zcZLBG6DLIP@f0XKL>VRc`y|S!(Mrvv?WGW@O0IhG&3yv=!M8u+$M4_djrT88ZX9C$ z&`GZDO=z!!Rfh=GfY&Zub3_lBciU9WjNxFFXlp!h zbJC#=tkwks=a@7dZR;5f20XY1r=A*edi_c6JAH!h|M)5wZ{DD76^B<3Q>-0lZ*Pyi z*)~d#P|ixR6~$YDSMu9f!P&(~A4^#?LN6NrMfgva;RsV+6H!FvGRN5xOaXN*dxPpp zMqzA^b{d=^T1%fIwklZ}4H#FJ_U1Xl&Nc2md5F({;Ss+2z-jI~HDsJ68U0*{3`U8Z zND(PqfvPJM0Z&ht4?J6xOs(PV7T$dS25)`*3GZCI$(3mf^%{fK4F+}-QlO9U@_RFy zWC#cvmwqHTCKS>+2`!_HM9q`8zSt?<{s`ZRYQg3~1om65=& z*iq_8sZ9nH3;C@oWRli)B9R%|NDUl4I^?du_7qP(au5IVxpVyBt?OKB8U~}&nDIJ& z>zU1WNd26u(A2df%>${|*qE_%QH!)9)<6TPLdSrP5uHSa7xEc2I+@^LEOuDYW;|ik z8RZe6OTuO@M+HTh^HjSDV;UYlwaG6(c^6-~zvQHXReDt11>a!MU@DSN%({-!IgGOu z)qpvQJronu2BMt#coO z8?kZxC~+cPu;@E{my-uE*uoLanB;@Fe~p+wR0#wnX-;TT&MuEy5v zfRs9Q5GqHlU{DtFI`!g}tP7YXxG`-wUKX4_VtMSyao)N2INy8iWB%;T^L(^Dr7G58 ze26}3f-2Enhq4{2@3CH^f*4Yw(xfmDZBXbS^zt^gsHjnRVvG`}3wiuq?2o{W0}{B5 zS+fN}J7Qr`Wto%sELEu)+K8Rsz_ph+vu^pNC-3KLkKNCmtBP6x6w*C43Tq*dX#0j% zMVu{(Xm;u8qsM5AE=D9AQ{a_P;74!2&#NDO%(=ZOlVC}#p{gNW7}GQjX&woMp&E<{ zWx;mXWozd7d%yD?et73ezVP@1Ja*4%?mY@eY(Wdm_qG^Vs26FON@KKU=nBdNm4=9r=BA%0j8Hq2Lit{BfH8NSRT5)p)FNR(I=SiqNkwIf4vP-%vZ&R|;xspda}m2w z!dR?VKa1P^=MFqS#grw>GZqP@5=f*~CIuwvK&wU2&TV`eO-vmX9b+ru7b;Ak*`{bao_Od8pS|}aM`|#= za8|UjjB3m7-Zra6g~n0Xa>zjL9jK+tUArq3Dz`y>{E`Rv!TkQ1(TiXqK zbPG3jJzYO%c<2P)ceK0LsMl8+oLHlqZ}EfoKH*32{uA!L;}oC&!jnAk&@IFfY!++O z#R{G%_{zR#WCGR}%MEp$li;R}NT1d${K{SM)w@pe&8JTC-50m`(TneKb?+*TS)oq_ zX?O%vS!T@^s2PMgggJ(QN&$mMDMRCo7}ge@>7XHa!8V$FWuyfiWicTz1e2vSr33{D z`%U9*jV=tyl_aBaWyNZtu>FkY>UoY84WIk$8Gh-h2YCFBO^z4{vxa8Yu{s)IYbm1I z7;w%IvCM%ENsHA~lDh$1j_{pN;Mud6dGoyw*=anwT*IwYv{AFOrwJaMF6ctwd(Xbd zbI(R>3fSmb**r$qTBg?~01O7Jte!bUY$tql;}hO{`!cVb`&WG9sR#J=r*Gkokr1;c zO<>hV)@+IDmlroi3%1Z%$v-e8A{{&34P3H3dFn8CoO+07o`T>1;RpQijdz%v4H5-| z0;+lid`~-@5dpV0pr3cb`Hza^BPv)-tWYtcRF5vjnwONY2a|Dq`b6>ap)d`~%8$A!S&WQ$^SD@X1;#QCjH_@sNuR;LI?fewsU zYW8-wV7kZ3pv2PCUAe-rwA^)gz!S$;_?4%g;lblTg2~MZ)v#c5Fht>Lx>io3*5H#T zMxO)O6kb(K>oHRbS`60`{OQ}f{K1dj69J2$7i zcH=8HDsct{bJO=0-v+LUo%o=uN2&!W~Q_LsV_@fuj^2*!q@LRw18226@ zbMKK&jsu0!^qm;u9P)MOJz?IXon_=K^{}ArdzvP4vMM=pM03wKZsp-SPVt8?f5eL) z+~Df8qccO4uJE>ycyFySI$)y5q#(48qRJ867W^C)C8Ar=LbSxt<&LDvH2MVEDAlPn2AfNiz#?Ux$<^sRF|`_}6;%^cP@VZ07=4cl{O%3^ILU6~Y^ zOeO@?!mwhnIb?6v@Mk~1%-bJb;n6!!@r|b*;ByZg=e7}y#_JN0qXH@>LMtO`Z7Z}< z6am%^6!cW(fQY4yay)zZ9{5jx`y2d=KY5+^FYfTph3jm$K)p&ThU~QwCR1=j(U9v- zq#LP+*bDUEYGOzN{_mwQAqJH9Bq}-ZWSWYKK{mFSmfgRkG&;w6r?jAUNcV7wA6ypB zDzkVOff`c$>YtEc083dK?9+V~k0r??cfObZRvYoqFVf9e$TE`1Fq9TKbJ|a}Q@Jyg zvJo;u=8Ow3SR_S@q)a&&Xl(`crVFCBVrDcY$(AHjk#tG21=`ib(h!t_!cfM9X{Olb z1{))|4sYLuVQ8(MTz1bAL4wbJG}Zq z$3OblFYxLIH)+iVv%bX`%RpP|q9XW?>E#^&v{@na7FCbf?K7Rplb>e;LO=#_uU zqn~+%-~9UL=x=r0xv3eU@qNIAp7mPfCyAb}4;WYBfVDj0(MYdk65$I+;jUj@=dm+S z@%uk`ljq;NNXr=OHfVYerWOMp6*^T|GsmO`OHWeJ6i(dN!9eWMUZH)~Js;TKg3_Wv zH&zbT+GU+qFV~#5f}bqPY!(+2ybd$E8#@fmoG0!)#IHPg7hinf7$+RKFsEoe+QP6j zpyq@w(uIh24y6YKq^rA|6n(xnC%{M7=e%`!#{ct=-{g865UH`QBBX+D8cETK!ErjL zHyVc}ObpYImQ4L#M~X@ecx{MGcjrv^8gPbc{WR-GZsFS1bNu5Uyv`4vdxbAOc!uA2 z<{=*57zu*y>JE2puA)2eF+dkdI-!)uT7_1coxO(j@g@TtSKEe>uK2Iii=p-diII>6w2P|gvertbqq zAygq>R7-RIRp6rlFQ2=?4_OlYWtEW^(zU7U`_le*mCV_7|#%@5nGbN?O+F%{+#!R=b6H3RSJ8xloc9s9#-~TrM z@b~|Ozx&Hypr_|r)AHb8#9iOI zjj!K#g73cd0e|rRIWA3in9eno8iO7{Fm$a$w-rv0vWBxEmJFu3EN!xJAzDjt zC7~3zycDUCDFIzoY?PMG68zRBY`ev0@4KJh{NhtQcBEh}KW)8FxU~^ZO949Hn=u?z z7%LlgP>NpH^oX-}f@qd^fY(20`B&e2p6A~@M`y+qhfY%uH`%^Ef#H~Xw2F?NZn{lB z*^^{JV<_qsVo_1{HHX$#xZX#)n>|!gkRI8*jj+4J*0n8sYOrhTY@R$!+f2E>cZt9E z5C4eUZa>b~A9{$d-gBBKHl*7eJaoHL2y=#O=(D5_cDT3WQ1&d3pJsbDrPx ze4p=vv6}gKi#UhDXqmn>^pm1-GbS;zw_M^k4jYc$b_YK@v7hh1b%x`gZ!tBBnJVz9 z02C$#43RQ6qy(KQ320J`C{qxF%fTuc1q@~rQQWj+jv?)+JP#KRhkx-NbQ{qg8 zwg#;eJz6fl{|;Zf|2Dq+*l+O2;awbBg>@qqT}nF)MQ)rsj7pf&=BCgyYZ`35#-?w% z?k%b|L<479`02}Mcsy!-wPRc=rXk6?!-O$_+!32SPG>jS#2IjZaMZX070OSK|a zmT5O;{Kbs^@+~O0PUoh)@$nT-fAT$kx__1Do_dh4KYSZ2g<(S*3IkM-xj{JKM@W%Vs`QA$>c=Mx+T$oO1on>H`h${nB+e*`{3rLOl zHZPnjQX;yTH#h+mEV%4=p%NGmafXUcyw{TzN=Op=4JzhjII^HiXDvk*RxNznb2Gj0 zvfc^FQ9CxXQq%q=2=teJdf_pymC!mClr?R{Rx9bugVr}hlRM5lN`|!jb+ul2l4p&G zu{j7uTsUIUBk2N_qJ%53$o8=)qs1*CTcJf$kZdhK${I?;aIGRXTbQjW13%^PTEXKF z?B|=`c!-DY-iwyoP8rFcR}BQNZC%CoSBSBsD6&tm4@5O58qI{jW>9QWa`N*rfAFJs zc;T&2@vNilUYaSS6fwQX_W94~^;cLMEVDUoD2s~WV8o>h7Z@i;uRoybuMtwDH&~^% z4W~Zn_`kmUd)#)o=DBB%@#|kZ$l=;h#y(r^gkjd=ndq@e-d!IezH=m%sI+3$7%py4 zSu2M;cW=R?_uj|zAKlF#y>NoJ&YWi)N3>}`Nunneo<2X)Q6N2i9=ZsO+GuyM+sjU{g1wZz~28^6w7>q8E0Nc471 zgH}xzk;tGi(}uP*GK_0TwqP=E*q#I?)qv20%fKt2&-uZ-$9enAdA8@E^cvm`DAIsB z)!=HBu0hp!r)d3@s!n(pan5J2bP2K1ksN6bk$}cf_bgRa5T*{F5>;(8&32))$e#Ou zNv~h723iU4Hj)StLQ*^E^OquV)4!;3mQ%|ZLkhy5?pkop0g}{IDo@zD&XTQB$uPS% zhNLOVHB7n8#EqH8K>yYu7iQ=AJOAYS{N&BI`JLyU=CPxIn9V#@enu3)g5HKv?T5;!WZ6_&zU%Cddr6kZ#iP!}?*FsmqEU~pYW~H}6863^nQI&n#%_*0zo}o4c z!(I#(#spr;1R+X*y| z-f#d~6Pgwk6S^!hA+b^S@HnIzu+K08QfMer${bhA+;{YBiLn(BX`LwhlPO8{3RirhvlYq0XAQh~e9Dhs zKhB3|FEMXxhP&=&K85L|gPBHaiwOaOW6pI#Gp8yIl?nK6&b)0%)>9S=iW(Cu8V7_( zREmqUEv}w8&!^|F^TU@`_}%Be&XN5q+_nmpl2l5g^B^2Nbx}e)hf)(_WYDV^08JR9 zFznWr=k8nO*xg^{#p7fC_=OL68&pl~P1ZwoqL7)7p%TTcR#WW<=6fwoDqK!kByzDg|Xl z%KqcVLbMTO1EvU6#=+zYJfhT>&LkNi2V6J%`i%1v9vRf2_n=qOBIDy zRE1^RWc?!0X@jRvKyx|4*|Fyz|KJr~IeC#!FFBOmPYQjyEfESY4{Ii~%M6!#G+SHD z=PkQ>%Z#_DT)n~io2D&HqajL^rB_Chi^$(D6Sh9a$W-i9Ppc8Jf9F)G`kVKv5Dv`UnPY#WT$coWcc z6wDZej$z#9uYU7kzIopv9@?wv0im5Ts0vhB6QaY%fbSZLqM%$_0bm*&EtcNWZY~Cx z8~AJvuYNe=`4gY={<&*xdP^AHMJk5WMV~@x=sa=iP%co0MCCPp)=(scivgDu+pR-e z!(e4ZRl@Y*c`?~3Yg|zf%9>c0PzjPAd!ujKuICbp}Uc6(CU;pZD z?5Em?HC`36flL;IMMC8jMtQY|lHcI!{|KaV;r6 z{$$LRv)h!a$Gqt%gTq|E!lAUu|KorDEDwyNsZ~T=jC4lqbv_L6fBxqec;VA+V!et+ zQ?(t&MZ8nQl+%iIf!89L@TtYQEebWIj9bhue?rZiXPih<4bJZn{M}My6VG9+@6beA@Ek7vAIe$Jdyr5l*i$=?a4G<5S9qeuwuH zVwh1^ie9f`I(O)zr09u7nNQGkb5eBllw%O*l(Q?`v#ZB%K7K#nyl)r#3+N?LzmuFa z69HN$P?oh8tF#E=O2a%xu5_B~Ma9^_rwLy85MDlcj<-KNk5@HX8&T)0Qcyroc3~HB zOmdFU&Cy;43Zs&w8+nC|mgUw^U~s0OD+{KjA!?xqTM51;*+^FHuhGSfePc#8Xe2mVP}Xbe`m=R5oOT*@6iro0MDx z{`B?h{P8Ov^2w!^HdVCV;9Y`LqRkNRBawiykd(vuIX<*3IAV*JQ!7hd_UM&0F+$tU z=VcM>al&?Hq2It5y~#IoIH@As^~~W zEjd|+Ij!5KU-alG7}IBp<>Cz9I}P7^;Uq7;^&wr+qeYXqtjycIb}uV>y&jY8&7ABU zNZyfL2fp2*bKo1XiA+%v41*UmIwVvIq_9YnTTJf@7Y>bI*bSiT|w+YQKL)=MUJ7)sh8R+ zY-NejW38dCYYHQxXGNs8o?X2;Uwz;Rzy9b~c<@lcy5#cUbixS<1C62w7?)oJJRr^x zTY8xpH+Ys);N<5WfBMo%e)iTUoSPaNy-Y}b6eTt#tm`n{oZ#og!pjP|OBfF(S_#=P zCBYOpZF5+Kq-WX)WlB^rkqXDS923iqZn}wXCOmNH7JloSkMgaDgod;NRLroxMW+Z# zzP7^>VidpoLRQ&Z-GpQ;g;}Mg;8F)CK7sGQc#4+d#cEDU%89lc=|r> zTD7cO52=N=A(;}2A@iiUHknb@30o*kPN<8S?ll26Ba9Wi@ZOXky!HVn&rjH5fGbyN zi#}knDnbZo7f@Y?X*!H^=q_MGB84b|P}EM?SyYOs4F*S#Ip`Lz4WY33vc#7KzR<$^ zEelWylR!t02?_1xJvC`eZ7=iO*B;gSa4I_tfTqX(CH`YU(vl?QHP&!C`>W9VB3Mv&_+C43ONq|WA+o(_e@ zW7r}wr@$kP^QkfX{hy!VQyVw3w_M*R32sBC&Ql!v1sypU&X%JMow3b2_%$x2Pf7>ri5^@0UxF*L)@QD~A zF-0oxvfUP>XoyNu=z`Wbl`wUIwL^@mQK?V4W|?2V%nx5a$2;%*V}9fD`}p;*-NW5$ zfQJ=RQ(H~MQCNvDZGFJ`fH9Uqkz)d>UPC1lrZ+-`v8BZtOG4p7WZNeut%s!nvl>1R@Y)%8;iD_Oary$6 zFO6Y&KO`gQN=hQU@*eFRD&+Vm?+DI|-J6TD5nJH(UYd9pL>Lv49J?xtU6<0rxe8js zB4SXaPPm&&71YH5ih*o~)f&@Tk9W5&aQ=s{^1V0S<3IkJe}%mT+%|x^uQp5PCjKgo;7&#|d$($XqER)o%w zT!x5BLl+c2MCkYFFAr&&IU2FGi(SXud%D?}%2=w};#^Cq5`~|zx1V_Cq1*YjC+^|c zJ{b6hk(*~vUognm_D0bmDQp8%vW?H?`Br>#fh`9!;N`cc{N#-jym$H%)N71x+0WHU zM;Hev#X-R{rwWQ9B(x8h&J#mNpd+Y2)Q+Hq=3o~Im?=O->&yJg1ci2~8q~>_wdt*mQ$8y~vQvZbeZWiF!6RyK$7%#Smj_oYJ&0 zLDj=94Nzr)!x4OgtxAeAVB!?oF(aEeuzQVzdsg^szxEp(TB$j_0t3AWT+JzMC|Uv~ zGO)5R22qx%2P8CG-lMEMx2Lz@`8Pk|`M1t+^7Ap*<|Wj-2(gk4L5jj(_bsVyQDKof z8Bt#BxKb1%okSN~JXX-bkX?&N8Eub5E$@*}CB^c7%qZ~QwFzJR;Y+;r!9Je3?^b^0 zv3-m}&5AMftskhr1}F+euUF!l zDa(UCMK@+CPWk$S2l<=dew+vQXv%I%?XKk~%RmauXNlGt%wWJ^sZR$u67!r8D-9D| zp1|cPeE;Rsd~&7XlS_%Mv`Q$J31$e?pc39~qe4sS0=jEZ&Y?Poah~Kodf~Z_mgi9! zqA__R5^%}M2E{~39vvelI+TZKEh<=|5t?RFibO%M1!&RWqSQiy03>Gf*~P3j!lDn=$T=^S&Txo1?e@!Vb9fA?Wt`S2p& zfB8d<-N24E&}E;=e8TqjHmHtjI3&$AP@=S=Ul__VqMA8+wuzr@v#V^m|Ih|c+;=PY z-?72LU47PSDCw{?R4lfY2CWLTXq~0L`x&J*bOfd;(W#m_nS%GmXZ+xu(|pzp*q$Vq z572f%;RcwP(=m;~heXnXoTscVFe>4rf@rfCS*$Q`pvO8JBJ7l*g^EXh-Ax%3l3Hp} zCOdWcf9t~W7veHyMHeH3Qe#4a$uD9EiqJV+>p{643p@D5^??xJl~OwmbrLEQAq0Z= zs3hV69l%FV3?67DST4xn)q1gn3uu%oSRNdv?%%Ir`5+fVVk z-`t0%WXr*-)f9ftQc*Cp31yW;$TlreDU2~x)^b~w=$O+)L$4?~@c0JbcwmE{y>o#V z-aEs`mrirtmGrAMMtgQM3kBC^4pptPacD2su7APG>WBlktm3EFm|Z!?AkMgV|2p^I zdI#Tq>Ik>iumq$gVuPouOIdNX4RKKC=;?@0o_XkqrpB3)S-)fgoS4E(A9>#R_zONf zcZJK-IYC>B(JDz7q^Qv`V1h>nhv^)2;#v_qCtRwKh&~cM$e}Jm1wxC*GxHj&H8C1o z&?IlbD1t3;O2ko7AHv&@%Fi)rE=XxvfG&~9S&KpmqHbU_HdtLVMLe8UDaH4vr{MR$ z_X?NCk*gEWycqKzL~L7r`p&0(@bM?yd;4C#{@5{|xOXobg=Ps&Dh=MX zl$5v*Mm=FGre>U1*)vMjp^HA1?$O%|x9)`l2foT{C(iKlYbQAK*%s3_;Nmhd^zfZ# z?jpJvQ1yHGIL3F^AWWh56oWo)vlE~7=*2{KVMmxL8-l8*EKrsKQM~H(LJK8_Uov7{ zm3_XI60Wh**-7JHaQ#^sAv^r%g&%a%D)W|uyf-n&ZfCa;G<-R2@P_Ym)FwC3S){5L z-p&?-qF-oS*I=tYcDTe;S^TU6Q&R8QN7rmo>4qw9Q@IK2gNFNVTjx7Z+{a_b?quJx zY;JW`O=~ z1{?dBP8x9=>E;;cP+pp7?-DMWY(=P0KA}RuBuQk8UJJd1>hVwb;+msTeUw?j^p?=7lt{~Xp#hNZ!Gb9zQGqG0!J1xHp7@U^=S@RQd+;??(0GPgrkM;lbV5mV<#slvp9 zzUk959@TE*w=ZJdCVPgFTStaRkKVyUhxhW(ku^375w`2lU}MP68Wki(=Nyfnk&LA* zYb=J^_SwvX;6%a6G5qwz1ztM&86RI9v)x!yEWrsSaHxBd579dCVmDW$Ks1q{Jx+UE z;fX2cq|XAKYGO<~Bv_?#x^YU2Lh>)6HfUPs36UMGM!Lzh=r7y#OVvOJ67#0Pnv%vv zT$Dm-6_mE1S5_EGTJN%zim(K4^w0~QV<3qi!%dgYKGV>q95Cl2DSA{|_~P7P9cokJ zgTl3upgf~$M4{H`jY?d(%H?p4|NI~QkbnOCI{%A*=U4gaJ(^k6Y!m~=<1r%(qh3W( zKv9SoEoC?+b`51=F`*&N#teqbjCz&>PweH9JNEM8iBEayUxrn!Szq48X4{}$OW7M@ticf&Z(XI*p21QN zD&s5o+>RS&O9W=Vvc3)!r!%4@D7 zO8Ko4-uW1Q`07dCIemq#*3yn0{e6d7D|%eJaFOonHfGSLZ#1)J26_ysC3=l_h`KzA zmvz7sQV>)%Tcr_7LNa&{M#<2bEF@nNivYGpN0U(_3&j$~27H=waWd!PrOTYXe2sJ0 zro8*nUcPe21`pk_kF{aNps0kFQq*{58BZN6{WW=3(j4Vx6mAo2Lv3n?l-##!xb3Tl zdF<|kyz=^Ke)7^se0b&(rCwus^%l10ktTVZZ_pOX(UQ23bX&NlgR-9+XyJY1J+gXkVvEdw z&P`y7=}TW{;Yls;jd(XFZKV0O6-gVCv6z%_DMEn=Sxv-N8gELdG{J2%>P6bEE2wy# z`wngJYfnDGHy^x{!)uljn8*AuMvt~$Is{`WPz0jbwgH6=;_P9;8>ua4ufd0>ukg}) zCwTezr(A9e;&2b;-X%J(na*e6J8aitnhrWIp*g{jyzswM62WXro)kKgawMG=L~#+9 zW*ahjaXis@S{s2HoVPJ%KK-padErm#NYou|LpcX{L0hEc;aXu zjr=wH^$-_*Zl1w65jwDS4{Q=}AZ)W#mKYMHu6gz@xcByZc;Sux{N%NhynW^*w{Gl% zV!+lc(4>adz3VhVF~2^BUPY-jg;wa$k(y1E8#6SCQ60JKmRz&Yp~$+dXrFkUP?aUnn3B8UtccC-Rmf)W4(711W5eUe7nB>8u{ z7)%Rv5yimBO7?-$hK<2)CR;7K+Ret1eSExif&cXX{bL?Gx|iSl+EE@kAQZk0tr-IN zme2*Na*5t>NH-S*-P($kvd5%t2!6(LZ@{BVmOGc=E4SXsi}xSk4}SU@A744m?%juJ z2Lmo#*k6K${-Ba@D-FrB8`)(e&V>hc-04zdFoHyc5Xl1Z-Ns)|2 z7n*)i(h+E4$2=OggT+^t_pib$A7AE;GZ%U9^J`q%Y(V#*Tw|n1=mqHOq4O=F=};k3 zWs6IVC)tRyoKv2#bxPHPN@0d0CUZyc;KO_}+vb1spZz!7bLRp6 z{lD@xp1K1LFD;2XSA21uxwtv0CtN(ca62a=Kfpv@YQ<{^6^~*HF_5DNM0; zh2RZjeyIwM*vVlRT}S95DJf!zs0b@?m!ZY{Z%B=&~U)8v> zV3N!Y@7&Q|Ntq&2m{tr;e21A|XKAp(lF@A3uepEky}b7Em{(4G%9#tNSy|p-X|%zm znWs^K(ee_m*3bk@JIBtiVP}`wQ+OV_^8jDD>mX0uw~PIiq&@n!MYY?Qek})o*<+4a z(KSGmGoNivX?sCMQ4b7o%AK{@RM|l0jIbJ{c1)p5FELK@Xk7zZ45*Iu^Sd3l9_7km=*!3L* zTHl03$B@xwc3eGf?tsNwQY_+B6yH~g@6JUi4}NKZLdV=l@c%_@v*YlQsT*1xF^FQ# zrIX3QCz|Mg@zl%TPaZ}S`JKtBg4hzQH2i@?n*yWZ0GAT8W}AADIB?5uoSSpu+y|t> zasRDrJoDhAeBN3ZZRbx&`f=LMLq3q8kTJkzz>-B`MVsWbQplIpO#s z4K&g3_>N0au;46MNui|3K_$r$W^?SIk1>XJJ|?<`VzewnT)D!vP_dN)7vJCF^)o-> z>7xhu?$h`2$nBOD1*_V!*+Mt>^h(QMSmDUQpH>q~m8GCU4;z%r9JLh(A0P45k;i%S z?40M{JXeDp96A34CY4{b0~ zu!a~Hm3>2)jWM>wY#e0jG*p@v*z(Xt@x!kHWedi@nK8U~`UIkk8p{;k|q>)bE5rUk*(K~LWD&8pl!rRF9D_9_q zj3Q~Fb0m{Nu>z8gD5Fp%D6dF`N819eJk7NUtINA_reYUitVUTdje51ijq?uC$7>o1(hlEjpgTf|!0&g@_1z?5JlongIg#Qh4fOy1)2r#k)r)d-P*`OtHI!Onn}@wV?ZAV#jN2&?rB$o8wJKZ!n^$3*i^xvAu%r$u>r5=2tf{ z{XVOAKEy|t&hmfyyT8X%_Z;AFeEU%juE3$yB}RZx0pE2LMWCm}yxdUGwR4#Sb;#)+oUwN1J z&z@rvX52E|!!&xfuAF75SJTd}QnlAOFoJvUxP@bf*LmoUecZiTQUh(XMTmj5{s2=A zNhIc-hq7cxiwQd``wnTIue9(<3;*Q%CwbxZw}{0O)o?f6T+y^p4+nS$aXNu^j_OrZ z7CJYjn`~vVUX0x zUlj46@f{c=UZPrDF{(mis~T0*bfIG&=1h}frYgR;dX7)eo}fbU)Pwh-mBQ4PD*=Y< zn$7(8T?tV5fKDDtgE!KU?kfjOCS%4fv9Y|&`WcGAP+ReV%?-3(P&t$#DzPBcNs{@ZvS=-dWIG7- zP0`sx9*oBZ# zp$9cH6|g$7x@7U~Cf7gvoYlVJ(E}w9-hG6pA3Vx45AS0IL0+5fDatBVh683aX0}wEAq`5B3wT^ zfwwMsoyY0SYh=5k7xiBgO(e!Z3@thYwDo8eSQ@M{pKURn zZV`GV<&`Yu|))=QWiPNo4{ z6xf)E^D*Ad**99DLqdF>y`$jny-)Jeo7Z^Z^|zUJW0sanj_lvf!$%Kt?C?7KD;NMZ zp03#vZIPDf?M&hzCILk-nmMrTWhE5jVADA! z?kYJ;6tt%3G=)kGtCFR)CFX6z_{w$GmRGQ5l|Oy^Gk$jbQy#kaFwZ@8jK}Y>959A{ z)ypK2#CRN7U$U60$7~jfv0*qEqKZfvJV8g=>5NjBeEmqx-M8G$@zbAj_Tp7k(meO% z*I4gcMn=wsl0=U{odX{xo7WgFk1$1#grygts1 z$&#ubRb}&fG@`uNCFy#^tnITso1wi!JBM?Q=o86BF_Ct17!hPmq@zOzM-iIryBp9^ zp}Rr^PKC-*$(c5@5KQ@ksM!gqD3rn|MWHRuf>~aoGm02JK_z19P+>+HYU;A4N`W$3 zQrEJLN7ehW%eV5jbG-h8w>b1l;#VKPmv29M3;T`C-qVmUL~5PTF;Ue+Ky&r#Wg>~S zwH1sCY`cbm(tPJo&4Y&?=6kQ4H(30&B=981;fEIri7Vm1U*G#fEE$>d@+MlUo?DlWybIS{5@u>M;IQY z?IQCgQI*=wiw-!ZJLn7%8H|q(+)a zAgGd{JzjYU>oFaqkV7~%IyDqZi;u9WM3)tJiupBY0q46!(LqJ*0qxaX` zd;bI6_1-#fzW+I|y>%A1tr;#IpsseYxf!@}{VM&{nxq<{7e8%Gn}dmLj`a3B!76Hj zLW8(*Xid~k1h3JGXi&0kWq?qI1>xpj)!u0b;8r*6@g&L6i0~Ns+R}6{IGwP7p;h*z zPC0E5T?&0e7vjKROLS3UOo20ob~q%qQ|h8)si&|rN8OHj;?8}1=gIr{wWl8vv@&^c z0j({)(EyO4uCGAiPdZwoXc^$>(IVM3*CKp=<|;=IE-|VqY#~F)g>z>~sn7LL;*6zC z9cAd~1^I}>%o8^|bkewJ@llX6(j1k>q}ZTBq;v+8BF;F1YO`1hR5EB^QKSN$3Q&fi zG|nbM5s7tz!q6`g^Vz1@gbs(8x=)Cj=%B#SOvm(l1-39ur*l&3(bOya@u|SiKYpHX zKd_f)?mxtRcN%dT34zrrQ0iM0@5O?nGvCBm2ILBxaj)JChiKdGb zrAAi;D^)FtpzILlm;mQmcmnT~0?hAt}x!yZ*%)5S6Kaf>Z2^=KFKX@%~s@ychH zc*kwwzL0q@mhBAXVS{00niWF*$5-P|*!`cA$JhaAR zhmP^;$@kdUv&x;f-OBCDtBe4PLpuS6mUNBS1{gwsCOU#Ch$uR(7D2hptmS-w_s_#? zA6(^yH$UdosW0fQ?W6Mv6C!1tQ5l1d0Y973wsWvDLDpK69T4-ci|t*acRrnl)>Qz{UU$ zJ#Z`Gfdg0!HbiQ(Se!-_Uii%B4`DZu-m!^`iT;+;<} za=F#`{xYc^l9Z+mk$zQU4YXaud_EVBtJ9=5QU^ho36bOi_>4OE8$VJKTQou|!%A#X z!Hctsk3=ORAEo0?qp_HLV@lcWAfk1FBFUkl5;`j86Gze#L_&XnDhg8YxVFKBM8Bx< z;|^UGjFwmFYQt7&=yXlBG34z0D*xs8-{MDae8{gpaUb8jZ-WC?A)Xh4j7-}Gn+$8~ zyTlr?n-jfb*sDM#Hr3deWV;Po# zk~ubwF+_T0iFb39?J*jz5-8Z}=0p;8Ib@4KgEY?99Gu;TUMARz z!t_x!Bo}Ds9VWt(G1BPHr?|O%_9n#}&waA!E}>k^Ue!TRBsxeAO@|5{I(ccJQ_8?z z%EPK6MZY6B(dkB%v{7R4d+p*mR8dj)M?`ICT8~c(s)}kfpxM5{?!h`S!puR>D6Y;M z{@y?SLk=E4$6x#Fzr&uPFc8)lQ5RzBZ!@@>njnoUfx1YnmVqIGIe`h5-?@JukKMbE z$L~GL&tE;o>+gKQrHhxS`+GTba5q=m>v&b6b*6~qH7d%XVHW!R38{ZbdUcoD7ipK;<)S-5lKCp1ANtS*QKLaOj7<~Z*pl#F~y zl&)Bx=^VVGjcfuWT&W-x7Hu_Hg*Hmi(Lq7gZqi=;f};m&e(RZM`OYIpIJn${aFxCh z{&ck9f)a}?`N(tlN??v*jAfge>%f&6Y>(mi%OCLB$(Q(R&mH55haUiA@eN$QaD`CZ zCYQjsg&~*eC(Pf{q*CSCdZW^5T6jhZ) zf;p)!!3US&^^dOb=Bdy5^lFPM*9m2hq9{np(sT~jcuYzx6$Rb)HYP-3)8gk7wDV}d zct=6Rw2f?JV?>33_JI_g3_CGlQjlOGaefyoKoECx1==`y2UH|QOVSWh63RwYMCC<0 zV`a|~bJBvGaGGi`An8au-=>*uVT*#g-v?dNHVM;PXWn(#)g|h+TY3BPMLzkjf6PJ%+1NORTK(9^WNOaB_|Wj;zv%|@U-SBej?%PIE^5g|L70iV%%6}9r$7o#b6mz4roxab+d|@ci>t`hEiMM zB(^Qe1=`7sT#7QI-Ogpf;LPf)D(h^!IDlnDYucE$%dT9@zZk^}v z{K3!o-dijD);AyH$%8{y5!7K%B~iYe>rg3DmOUtYjJ?Czl0l)U^J3!RKHT%I+nIdl zb~>PMWNA0>P&<&vu7}f>mL%46+M|*|DY357WuK136<`y?bwnBe%JB=l{MP4udcGy; zb*fzt5yKp%JkbRi1XDr5FEg*GOEhRj5MfC_x7b8?k7j*wEzW*^?0e*HTMzWuXna zG$^M?)?##pQjw5qf-CSzlTsn3*TP$q0ahzi-J?(%-#KE4*rXW_hD@6|7)3qmL8Y0t z4N-OU>l(JN(r;!Q-Ph+k-~B4T^5`Ls?5Y_sMRN^hatbLHuN5&yj80gTY?EsOGr>?>q?@#&Q!_PQ>@+189O`dp6ad@s6_2B9?2yH>^JesSNDT41%sU?Jt?N+QW zQ}o2>Maz-`Dt02sO-?-O6SS@oN{fm_bt7OZAe#fF6HztUzd56s%8+~_B|}F^my+0S z8cA_A)}XPdq-n-26b4;ZB7RN@9RsD+6uLy!2e{Ns_`RQf%J<&-h^HUDgI|C40qz}% z7<-IoxmVLqnh*n88B}S|7-ms`f&#@-W;u*BY^=e3U%i#>CvF8LeC5?BO3-Ye(UL@92-KK!G=>D7!9PeoHtUum53dQSziqF5|RjM zVh*!*kRmo2j4n_Ze9*K`7?9q=G-&2t*oY3e;NjC2e)5**g_qyp>=##Pqb2Dcr718e z5{-hcp>Ub=cq)N+Kt~APO0urQ0fzB#X5F{s=BoDQO+upb&w>GN@Z+0-e`HF(pWJFp=X$}(kg-;=`G&HB>oRf7=q^>bIobISqiOKX#@i<+41SwksX|`r9$<|Dj;#!2O z8a@I3_`NOu^ws0^Mz_(a8efX5MN}2262BNTeGu!o4s;u#75-aj=O`C)W0k9a{=28> zAv#pdO*B#Xc}e2fNsG{$K-3CySyd@zd<9@RT92wzIQGym~cYZ&?-nkUzGPk@1*cW5vVD$ON4lhFL>`J zMMwoIdI}xTeu_1nH1_#Pa0a~U)2bos>$meKKR?0y@1Ew@p16naKEA=BHAR6Ss$1Ss z*-9Q&I%3nIoujZCT?9gy5Rzt84jJ?``yLu`^!6wC*=xsn@%U%Fa{4sGdKZITLyRhD zr;gdAAr&P>QA32LkrP(cPRx7+E0GHw5mQ zOw~|ElFk%h#11c+LQ=qz%5bwn_bRd943VG=L0MFNdG^C5Y{LG8~$u$m7OJNg4Ct*v$6QUrPq*j{b*yUzf zYKdMrqbzC-@{F;l7g3%&mE@nEHpdHPE5DR&08!EqOW+zwCA5k{Gf);yfK*5`VXUB_ zS$l{M=qN*$qfc2cQLn7igzNmXS5NcuN2mDCllSv0Paa{nvFuZ@D%4)WTvAXATVbt2 z8QF80Z2VFr@hZxs>fA=&We=)@~qBp#iqF9oI%haNjC&QRh?>mofBdQJ1ioINF#lv6uC^aTT0ZyVO zrXUSn4)-BR#sR?#b$~BN*hfW92o>Zy<)9CxqUe~CSWD{cyrfhi6b}N5EId>THdP{I zacxv0tW8RZLyn4AQ;>`ZT$Q#&Tae-aQedWgyma{rmw)~)Pae9JZ``%Qs9$n=8Yt)6 z+_E~tWVaigZB)&on@BnM=h_xaD?>_MfC~7~?WB0N-eKyRNrJHlS4jDv0H?1e-udhr zfArc#KE3L>esxCDLyDrryNGW)LTm-a_Fg_~?+L-@`y@@YiQ<~1l_Dmg&MauF3WH7o zaFSwaJRS`?5UtDoNg>oUM7O^{m=~G~ol)p)q=i>0*Pggj#e$X}Ni8bcU(V~7rh)$7 z9lKlo2S0yVs8KiB(rMC{=o&XuHvUyFm0dT|qS1|V_@oep+7Yvzo%g7CLq)8~J>tUe za3OY!V#u$xMTH<}kd3IDB5_kxXsf8JKA|uK-|_jUpL6NVoO35m^1IJH&DWpY$4U(Y z1$)Z^1#Hf*F~Cv}ds6I`7ND1cWF(O&st!Y-OqyzEzz`F@PFd&=xrzuNJ`3=p_qO@o zTOV_?{RoY9-Fj$PWgv4%po^n zffTbHTgXc66d~lMPh|ti90kfk1-uB2P%;dpC?2?KLCXo`BrEAvtXHHM=z=GN4hoG9 z3S|uxQlJBYgeGWNvj?k5g`ujKm`GlO zm%KBE=il4p?GMj#W!kYl1x%d2QzGn>bey z60Ll`SHX!&KDg}1o$p-~@ux;aK!%&{6E~i(g+FM_CrLnrYa&{c;+>Qtq=nU*A|*?V z79AtXXuJ*-(Gh8LQ*>kGCHohjzjTd4_c(KYlYj90Kj7qvHGcJ(V?1>K9#(o4r4?(g zhD1e4U9Vy40N$~EeT&h?ZkCi`yNk?2!1N049>Jb(-NzFT-N*Cqoa4>+&+_Jb?{Q@o zC`WrJmv=MumMilBr6hS_3kaURg-Rvx9c?$IQ!@Nn6sAxZqX=4|jn3(u61ZYawo}t) zM-+M^Z!8;TE^O|MIC^Mnh(X>jt@F2$STD=Wgs+-{*N`t(g7g{N;?!Pi_P$!5ih z)D{Dqt-)J3bqzi^bA{udT;#paFY(Fc2~$^7n?5=VhlB5Spo|m}Z8N1yB~*qO#kC=2 z`@|G)AkZpwnZglJF%YslQp^bSmy5f2l`rUfDWitsg&ieu#Vj-|x$Y#x0!>LV2vsZv zLMj1ix{?nhlYs=KQ9&pnL4&cDt+u5yhSA!7EX!QnJj*}*`G>rC@-zPWcfZbof#vWB z_8D03Rg923 z3f}m9%Fo~UfX%65GF1$Ed#I{)jOsIMJk5MYHMIEr-be3Horlg5TTkp9#yNs_BK{6R zqMK79W;;i@XK`m+KyIXE(ajDc`YwjehJe()CNzK;L|6EeGnC zjJ|(C+5WFH^Q0sKi4>wtbx{HoVy17z;BpagsFZHvFfL5PrHEpDrgId6{MkS3jM5qqo2ihB$`3QbY$~f=vZl zRYX+?A1MpX6@jE$Ow`$ER-?%LO9fX$$LAfqcJ3-Ke0+hAw-s@?o8e%@<|JZNjmP3* z!Yhe1&eC!4fg*Z};KhS9bK3%Bv{6udouo-tDUk9H7V*d_pi_|l7UdvJH@(0M(HiUw zy@1MRq0l*0cArSuju?HT=O#&hT=Wr36gmSfMuAefc$Aj7lXPgM*dP>;>9tMlXq}#h zrkP`lRW|nR#dp{F^ztWMdF>R(&wjxZcOBrVBfGh0(4zo+4Cv6J3*q(=@*04g0FYsl z9X#E5>6)}m04XKB^3=;C&NnkQZNbD2IO*WW$LGBI;YBWNdA6q~3!;L?M}ltA zeZye5ira2TL6GO@gr*U^@DUfyvkvaY0U1J$s*d7jkOiG`KSW8txQ{wTDZ-2U^Cb(m zY|WO!j%Ao6_Zhj*D&{>1#D$euN~D;iX^3JEnUW*0;K)ngEPt5Fs9{MPEw)%@>NP)o z^Aq0v@C;8s{Se>z>ciZBs9@E|C%xTSX1-(8E2(V3Xjer$n^E<8ER_}=BGXnlJp1yh z{OC9L^X{Gd`T71KFP=EfN0-KIO(UVdPPu!X?&<`}O57_tjf;Y+NwAYbms(y0Wx*Pu zahQP73T+CsF3>h%Od)(+%wk9KrGM_!F)aZ?+7wVGloLl~qCu;O(VCPLCP}<;3?8Kl zwAMtcp;tq%FNM?1Xx*5VJwujti@W+c%&+k1T?hE>Z$HDcU)jqlP|(r_2}H7mxE(2= z?F`gLUP#}Fy?hfR(M5^G7{Bns*-67 zR|`;sicR3PE%@QPr+DY%^EAFkRjtrlT16)bDQcZ3Dd-P-gxH{i)CTPZHO5Kep?0#3 zRY7XEEDtqFNi9;!gjn8gh<&S>$ z0&hIu@Z{lJc=p&)>Xi)?A^Vwok~k@|Fw%@v%p1_QpsEX?Wh+kTyvLM75{7HQ=My-2 zF7oopbG-7w=X`o)LKig4{S8W=b_SEKlRz4sKav_g~jupwHZ1) zXr!!t2wrM|$yY?J7{)F!h47@VzRP6g^ZL&L9d8@2b~iR-c4&L1!ynD zI4)MSfnwY~Hty_c>PJ4xZ4-td`~^CM-3gCZEq4`2K#fB53*Lm-Y8CRy3 zkcN!b*NAPxb&ZIvOeETfD-|v&VoXBE@S=dnhZ~;7h%iu!rbp!;EO@1hpC=!XVS!M% z%>Pe$;92a(^Rcl=;!8J>Byu7gq#XQ_<9CTdKUm1ZlVGm`sYa1dB~Ngk=pmJhcT{Yp zir$d%ED~a3RIXx%hR3I@i=rlM1n#!v!J?T4fL@8|JH?&b&Yo#w?4&hp`K zx=2sgm_dQpQyGwzMHz##0i_F!F&JB-Oqs3ATeQDn?H6{Q?;C;~$Y`n7#KLAIzRIGt)Rd_Ep%C3a2gi9XY{iNgM7hC-7wU4-Pbkg+rBGNI+JnS_lf+t6g_y<8L4Hk6oQNqA)C@nUD3hVR z-hfjKR(3HQ^*}kA?kdk8zryhke$K;(Hu#kXZ|AW?B_+^#7$`00oY7EK@;woo{#f-DthO2E!QyrkN6|>0|Z16kjex~#KMdC^PB>mdDF{1<AEs2DMLE8~C=NJrj(;JL<@7(*m_4oderyn}V?>zTa z4vhNTv3d*ZLs{*67a0|rQ3dn4gT5hBlgLxO);ljlLRR{}^{sDm*W=Idqxa76)|pLl zFc|e|jNxhwqAf#^_fjc}q)AB=l*T7Tvsf)_v5+Gvp-9ARHJ1zMpDm;rfnIojrW-B< zL@7pThthzc3V8>0^SX%4{J@C62vMPp&@z-xXd@yNc_2J0Em+hGPF+AHiwa7DT%3|& z2TgA@V%B(O?F?Vn3(jbe!p9sN|XYi$q3w&U!lrx|UZ=TPr{?%us5VRV_Ofz1TD zWXL5cH%dDDYUZVYvIw&{;4r*#?lNbli8sz(;f>F?_#zI8gMIXRt8|TFvh69gp{|D5 z0y^y(hbghyCe9iNr5q4Z9(;9^7}KZ)H9(&6#nGn-B)o`J7BSsX_-hHj^XoL?y{dC# zqi)*KsqAH{G?`NxG74ejkk9Kx`5K51aSA*14vZ$MK*Zsb$9qr6y}tC>5g!B1cuZOE zLWRiIY)V}W8SYwV+)a7w^k-c9>^;t$xyJD`_w(=rw{qtpSng%_f%!Fd^?F3*=-Mg0 zqQ<0(qK%ZQKv~0dKBg-Sqq5J#2MYG=yPLc3yp2D3lW(a}fiK1J2Xnm)0M zsHjmkX6|?*nM$@!rEtNOGH6?&Ooh=2Wh%6l@T4!*xto5F{iBnyXj=%Ts!NhCh*$}j zAm-sktOkQA#f_j;RHeolM>ii6Q%gZdt>)Zw+Zw;|PN)Xqb`@|RTWVMyqgf4Ipg42 z@h!o3fnw>Q_uMH$SzIS+jJ#WruecZT=RT;}8_ zn{2i<^mn7G6^t54uMrHS1o!Tt>v?iNf?VtWml&3rJn3B+x1J;KrgVF z#d-i1T$?=o2^{(V(^p$WRq71T#f&QJ+)SqhYMO%ZG#Bx{N%(hp{1s#~f89j`tr6r| zg@`hd7(7u~g7YFSstQcDkg`d{g`k;Du48*cLQrf@B6e^ay_H?Oe(pLi{}+G2vyUF* zSD*L_Pu^D3kI#bALb(habbA~mowG~E8=5#BfiKYROQPJDWT zYptc)b&#Y=N~O_Sp?xAng-;rh@7QPViN>*fx>36|hh8s<{P%_k) znqt{1+@J&8Ft59bGbi2I;*-AVX38ossVI@Wg?RBO8*_l0pf?M&RMxmwY}>pfK`CcR zsi3>I$!K{Av(#tmJGPrZuhI-F!@xw+mFpzG#a+8cJp1%-^T?qURtkxh?ub|_bj}(> z2~w1!19n7lJJjtwe93={bZ91KjUT-E3a@;07Q6cpy_F5lZ8wB)on5KR%hju42?H) z7^AF3qmsce-MFvv=Nc)>F=nrJd9IWRa(G5@kO*4F2_KWNVDchJ1WKN=P|UWsC``># ze;MyP&Rrg3`!)OSdYp3W8gHMzz}p}Hki##n@XXV9^VFlabLf_mL2re#-4&J#&2l{y zLP^MlKl7jlbwzD74zUO8YZ%?p7yaw&} zM8IeIC|wXs3#t=gl&MLoKv{{rRo#sPNg)MW#Ih+PZTWpMhFDaBHk%w!K_xm3rLx7I zc-v1y#3)6tGSqb>bz?%f&c;AgM%|dLv7)FxIoct~~V3{U{&!|}-MG^f)ZdyC1UpNmIflbPY z2<@hicmXjeBlIgpf>feRjtCD?bPGoB(EZ3iR8;7sF)_*Ps1sOCX%tN}#XCh&_t>>- zndxjsVGX@XVbqMR*;P(_dXC9>lQSQkrhc+@@7tHPqKO^MN{pF$8LPiX;G_h(iF*->Skin;*zSTZ;%s6DO)k-!#OR^*ZkEN zVP`7JpDm4Hri&?qA)uL}aG**NjjD>M6hRk6Q=qj31{t!zKL)H%6e+Ug8)k3)92(wLkdsjetoYr*400k<5jwb8g195%@H5y>c9;2lmSAi29{OI+| z{N&a5ICo`68%u)PjqVRfx*{|kp_>!hmX%70QB~*ZIuTPFC1b5p3D-0bgo;Po8-_N3x_jMyf{gwh71BBrjh$+;u?NHikO@U|tYIptu5*li2iR9G5nnq<+Yk6qr)PmW*b zgOC4|cke&Uzx#~`I5w*3nmJ~26*F2{B+}w<`W$rTo*E(>ML~yWD@N8;$v5`Gy?c-F z(z~nt@STr1v-K&1YK6k~iCEgGnR|s(mS_r0(IdtnVJdMhF~?RDZG>p#+*6CGH8;Ik zNJcV%_LiV-Dt63D*SdyNoQPE;z1xYciHBGaH3yR^OLfJ&<#^~*aT6u0;HhklrM|kG0l3OY$Bh*R>f|(g{ zQ10MgJ0cDih`>z+h#P35Nt!~zp}jr+-QWENx4%E;r|+KT+_f$Cuk9z;5u4*NytxFTKwXUOmAV<83-!pvoGG zf>hNw)q&T9RHAi3Dl+n;G?%JO0dO@z@e~22piW`Hsd&qn{Hvqc*r$NXns+ zhH&Bb)3cV)%}{ZQZ97VTojps5r|-XwXC67qJqOnr=*SXK;<3YmlsdeRC|%GsmR@Z! z1{ycPxjCt_bo~JnO0EFMKZhT^_8C8a{X;%IdyNzfy=s|WJ!I+)RoSP)S{cfIq=x(04VJbDGgcb-wPULs-1h|EfA1nc`|uNr!7{!a5_ON#7MKcbn=sDNbsklgLO=A1q>~8X zeUc%Kh$?DOE)V6>vP%sUQDyQA{_NruTzo!@;vk;QG3lM=AIM3B>@>;pG3U?~C85@$ z^HB>wiJef|1%)7Kg|ZQ>Ls{`jPuAj#l33J2+fxE4nGmtDqf8yOa?~cU7AAac|1y8& z;iKGli^fi%n0Ay)7M50^YoIPEl=z@0vc_}q_sCl&QbU`1T=DSJQw{(8^;5ikc8hJl z!c48AZG{dZbjL?bXtALox;f+R7L&!9CL_wqdqUe1TqEy8kURyIT;9gV9bbN>5?UcB zv_dwqNed8?zi$<9#C6{oas-8zTDAB)-57dqS^|9ekWO0qqlH6C?v)ncWK93+pypq+ z>zAs5Zrc`P49*&IN8~YLm60*eAt>GeK@zf@Di5dqge4DL(a?_>Sk_{ESPdPV;~GU;Z{n>K?}S08y(~robf$Y3pSU zsWi|5?`BlMsxl09z^fh`z`h68dFt+Ue)`sBUi;`XKDzK3zQ0B}++aH?=CMavF5%~q z)M=8_*jQ7R71~y`*3ixpnhxy&C5{1jm(hd_r`Q6#%WJxYfJ5#h4P7&2fXG9_g zLFB!5RQje)O@1yZEgrQ7N#fdxPu8NGR~ocomJ)SYQS|!wWKh~t7B$)ypgIcXC^f}u zO%cb0$r$S<99-#f-`)*=<-uFIV+nR6NslQyN*!}k95F%sf}M{fof**yDg*O2QrCjG z%-Tdz$$y(q=d28REb#U95{^8$!~^>uzJR~t$5hEZ9w zZkCva30?5`Aegtc8f$xCEKTr4H$|akOJcO7<*Dq9k}?vMQU-_QLDmaSeIPf}3r@`q zkx9ySc}eN)(M=XPsoYyHkXCU!NHI#HpH`v`KVSz3x)#Hf!KyFIKT zq8TW#Ucw}{eUGLrn46OGL{5(ze(xvma{QAmPJc3nsYTbj>BoxNgK8vPCCn#8*I9Bj`TtS#{_5S7E=h`E6#c%cm~JcU!t=$(RaK#^{Cx^7t!x3b&6Kh<^mRoK!w^{6fZM*lhi^T$hkyFwhkShfG8ZQisui>z z&;-wH9*C->@fAU72@6pMWqX*aAcTYqd9##6r?*%%5~2(eI-yOG?L!y8(BxVn+y-N8 zK0j|Dp7{o3phf6hV!Nucr?*h_tTselV2ni1D=T0@Sb#Jnl2JmDtPAM%am9evNOZlm zB`G?J1gjS6*r6sDS<(#;-Fc92+;bP-KCD>JpQRc&2p#CTe1C;dX573*Rl-5vo_Xrp zVk)s66epZW3!LACKm6fq9KWm>>)njI0&B9Tw3`#UZIat2`6($%&{yn&SR{rB!ATfO z45;8S$&sAsQ3#@6Nik)+y2Tk3vcrhUqS$-<3tXuDb2s>FH!zGFEY2%PHlgDXr{>JVjHydZJxnS=zO7PN0-6G?peS!}n3_%^vwNkyAVvNJ zJ7GIhB&ZbZdwds1_bl_hH{RowGhcAMo3pxpE5o8;=38md`1j2Fo|ku zK=2(4Ts1Acqi$--G$!|7`LJ3{$Ska+7PJ7N)QCdc=Aw+aI%u6eXoXuEwOE9)aD&JQ zg~EtvLR+vEu_#&Jvxlo&W142laAOyBQ8JxQQBkqBQc~Ln*Ipxzr<60t?t$g*gKK>C z{v&+lmL4^*fvorOEzz}-xTiHSCX)Bii;~Eu6pfEG(;3TyA$_X}ZNgYZbPYil=$I&i z16NVSj%AzZ*&YL+w+^chjJR!i$ZMZm~8~l8Z(u%>_8uP6!WL=u=8MELROrjV`6e1lC2o3UaEoUsH| z;f;aP;tV(vQCFmLg_!!_0&Y9-zy44EOMd&gXZVe0k8xlFY7c_~1_r>h-0O)iMhr56 zI!Pof${q!YLC*ODdrfR6QmU9~+{$xsbBgw$NT;%xP;{Ls6jZh}b&PG<)r;4)By3dc8;; zW|VG=gS%Jw_E#R|n-A^f@Id~aVKQNP*aLC^2}yVWL|P*Asb^r8*`5oBbKW=1jN#)J z{`ifL`Tm>l^ZBNy-Ad3JD2Egbu$@KuBy(#wgVbQV2EqiDro`A0lZdvG7hA;OqvX9H zgPEYInQE0f(U)X|S>FU&EGnAXp%V#uCTJIVSkJ$V^rfxUqTv;?%Yqgm6pbu*Md^$# zDwBuqLWG>AAX!W6I<)R#ON%Wlum)=_#%hc%8TD3}I!7vCv@)P8TehcXvC}E*Wu(}? z%#%m<@XXy0^3c9r>>I$cm*=l%Kt)eC-J&HjTv}mJC=j<^N)@nZR)$qpB*+2SI1io2 zBu_QS+nvPlP0Jj!$uy?zeMHxQiF42w~_Jz{O7r7DD`C*v_J1!P-=z6`EL>E zzcAM#d|`2^v|vUHy+Z#vH$C0dVBbvb_?JBZiQ zMU;gSt2C9-5~T{U^NK+b=omqJ;eO?{e>8>^5;jTUDYbZ6>LQ`6rYHreNFmV%#Vp8S zXLOHc6)@I=o6@!}Hz1bYa6nP^fym5FF-cIEw1_5-hEY+mRKQk%uO2M9`?g1T^~}Be z$r~T?+L_bL)e^(eeuiteaBXYOcs@bJMBTGky+kt~(@tj;MJd6mDhoAosDVJk5Y>W< z)vU z(%iMWixZbDfBeRAdi97lEwgoLn`TiHW|KaWy_)$DP9XF zlq5n=pB8RXBqN)Y1K?}yPEstiwu1dYRmj$%-=Qj(J>;cEv=zVh#X zi|0?C;rD+0I;X~)Oq}Veh|UG)vR`PVD!ZV?Gl$GcvQ%R8^MuzPhT~yP0ls zIGm+fYIm_*ND!n80g|8#K^M9ZAYp;kg+M@rpaq1Lmc;BXSH#fFknEnGnYPu{-PPs2 z%Q9J6=`-wS&N;8s#q*voBCBhfL)|R9u?L8XiinIaBEIju@B2Le=Wi^D)w1KJ<(4l# zbT6NO=w42)z%b?D9s_D=EE&Q{lY+)2;Zd4WLQw{zikSmyp#Z$K2|svai=VuHhSxv2 z%w(=$j=V;8$e=7KBKWSQivdd{x(PbWuzoJ_+HnHOlT;x>WEY9v<72>OcQPN6I16|O z#xJb2gxi@Ly}o$P$a2hfmwG|9%NCbOM*ni}%Gh7^x{UmMDm1=#j!}6!rPN|drF4PP z7IZ<-HVe-R;jfnl%2HAcwXBjZwt}u3OM|6aSwfi^ySrQ1!JHGziDB$8Tj%(L$M5Bd zn{VLplSf$x$~cDw$J>LpltrX80CNCsv$*jlp8hieWWG zFOQf_rtI$RQj~U|AGmNn(Wt2NG*x2Z#o`E|gY?L9$d+panNF(xLQd)ad`>bl&RP{Y ziw(+DM4PQ4O(F5IR+<{DA=#2p7FdGeMc zeDRLs+;dE^q7jD?tq4lE>`9j>)61tV&ME>0a~qgNhwoY{r5LEhsIZJyM$CbUshA^c z$iZc}EQ5Ktt&AM%eAUfCXu{uLA)y zokA!{d5?|K-1M$C@|@=~I31{jlv+3}i8eFSYUoAd*Zmmz7P3ou5?z!0%zb^?uQBuZ z_x}2=Dxm-H8(&lp?{*@fU3jDH+nlKbA4BHh9#E40m98Y?YIWeI>TkHdTUNPvPQBe- z^x2XN=)3C7B~n?0s8UuX>nI#h6|xY>K$HZj*t>~lu5jv=`?M${K?y`fQ5INI4rGv# zskpIK1Uht@$vCex)a96I1g8}f4{g`7HeBl6H?c;hQm*SroyU}x(oZOKO|2}4ZmBtS z=mG9{?JCc_eVz|DKW2CLD%D_(@!=)FFq=%7PiL4ISY2ACnazn9lJbIB_8Vz_PJ6Yu zvN}J%5{g1{Io4RjWJ-la(Y<&rKsI8XMS8}PbSVf#-gLDxXrL1xL^t ztA~i0ks*3F3JPN+(4iRg-awRL4voZw z4@$+x&6dY+-r%WwzskRO`W1fp?imJy6LhO%wsz+!=*zEd1_8=1vd_miG#)oUH$lmHbwrQjtvp6`^q%fg5H{;# zX-+vBa`x&q{_B7GXFUJ%eOA`%l9tw;)h#&cy%sukmVApuxL8!lqecUa4lWa z;e5iXgzfe)p&@n+I!+-?=^c3z1wJR&`Kb4`ODU%bMgbmF>Zx)2UhyP}e^&I)BOwQP z^iB4DXhh0qLeImEi(+{n9O)-m3AI3)(Uzn{Xr^>U(gn(t1XD;LjWra55nfaq;svaY zpwFeDs0?P9m^RlaN0A%XOS<`0^riDWe%B5B!Qc2>JaA~p5gf~L3T`F^Z;{Wg-~`zp zjX}enpVP%eS(Fs26oz~~B$|?4JRORH3aez|6dT3Lpvtp%4<-uDC)=+Urlpw884uSP z4PfoQRZidd2+y9|=BMwR;k6ImLYu?XW{J_bA|}nO*<&^rvFg(53T@j8m$tvOa9$y1 zv11~|T$n|~ktZ7YeY7Hmm~}7LPl$WUfDpblO6&Y{GR@1BBBs?wEFFsia%49}K`bf} z><-46cIB{@Wock3lf!gZP?vYPwe~!9=Lx>~z)2oFF4M$1d6@3v+bP}B8mXwTs?2+s zl3WBN_+*y^STVQK9m~ZC{0^$^z#4+7=qRLk27F3{;83c?1cmNewCgZ_f^t)$Zyf&hc)1T2(F-2@{&f%y?;qu`wkvVtlJ+iANY5lqHrue z57$-M{b*0VsIM!cW6bt-vG-k!3wnVR5PrXK=&fI(ko#j6PeuAMm9u}E^>Dd zg79^DF-Ux9(i-mr#yGM6vI=c`%t{Q&OaiRMse%cbH!oksF0V2eT9)mAOA$&BBMnPd z&g`l#Y1_c8oiZFsMC!C{3A4ll%VX~Q!eKst`(b|Y+C_fy)`x6sN8@%0x~4K3Qv|fr z7!1x(6+_CBqdOefUkkXRP{{FM*+*~>5U)KmBKAN%1Yrmd{EVr-cK69-L#SPGS@1-3Q(#j~IAi#I;x zg;&pUWe-wul!`-yB>r`)bpfr%w|m6Y;8eh;04m|N20z0(Px37(blKNC;dP&!sVS}SVehuEM3S>0f;cs3k>N!pZGSR>RjlQ4BjHLNg&rYJ17Ow8RmmX}M0x}nALS)lqlBb8|J7EVO*p0_50;31!38L>9`^-~86 zI5O!wWwoRdPz0e)pe@nLq!CksEr>;lDoa99q6kWDgFKu92w6Tl(A|E<_1PTg{hJC{&^c0)K#ct; z%xos#dmb;m6a}#ps)D4jDV+pW(-DC-=>Tsy>_cih7xr&d|blWAIL8WFeI3Up;CC`hTL zQktr=3{#-%9I+~R_z0Z(`Y|58{}?}c^BhmVa)!&h9$T+dl}mV~n0KNIN>S{Ik~b*T zJ8byuwcL`t7Ow-RQOZjLp(8QoFay;GDEw*?l5D7oq%2BXlqoQ_5RRy|grXqY0;6lR zt-+R1N<^?OAZ5k1^%J^ln+)46?mSfU)raro3lH4M>7f8Z#)EPVBLhWQ%9yp8K~*I=Cya;;KL8ka{ujjaQNhn3^eTRBsO=ivU+5l)ygnH z%eXLu&$bxRyG1LLg<~E-1eA6>Y}p(95)dRX)LHx6_E>BIc%H(uhGAAiE; zWP+^@p~@jq8}ZW3+;gE*X+laeO#-prTDa&Wsyr=fw=XdAGfs>L+;!|I58Qc}2X8sX z&4(;&22$%7>OeWH0Y{7u7d*yVl&P5mvjkHOKG!(cBE0ue;+=C>`NQu%!{!W{nMSK6 zbTDWisiS3NE7GhXwI1aHq>e&4lJ>adWH0O#&O5aCQV^>kh;53}P$S5DIItm`l*H3E z71>TPv7d-0udz@w;=Xm_rxF@^a71(u`^Z;M``V{yXtXJ$7}G_5%gwkcK~*FzsHUKL6}B{l6lh&TN{&NIEq?bR$JST)_LGnB^#=}fs)QwkPJ{1= zokJTf-L6u!I^i*NRK!9v1GZF&Q;Ms=2cLY5Y2mJ0PBBaH(UmEG^poe=Y#L78beiLb zkMZ!Wr#L+juy@Ibmy0J5V!$r+4Uym)s&dHTamg$O=FYHg;mb!Aj~u;)hi<-+XWx8} z=U#n>YqLN(K8ms{I3Jl#8|u+2DTn{4EXGv2e_nIIijCmJjYbkzJ$+z<%8~0TUSB{f zAZlsaF|m{HC5u+24=o2%S%c)&Lw zyM-^^f0|RnEZD>o=QE6osNs?n`KCA3lL?SF;52j!c7bi+yn{E-T;k>DpCxQw;?(*v zhKE-fl@;iOQIQfUzLbWb99`;&x+CfYG^p4@%nhb%1w`s6F}}+|LSYdgM06}7x1&Uo zA1s80o)mJAnPiBGxTvJ076tS^5U9k_q~FWg_r*>*+rnzSXa@SvFF=$0f=R)=AEL4_ z@A%a9zdLg|{exSN{Ki4izf}eFzx~>$bMyuCuOQGF_4o{`;o_2!vODmJ>u=kZb-r#@p*FMim4Xal6HrIKAiL@mo9Lvg* zrc;tu)B~}jnxqcZ!r^Mfmp9W_|Va~R#e6H zm=yDPD;a!%&Kf#k3pn2-&h7-#o~4zJ7??k1cTmSkW@a5HK;IqQfRH;xR13*vK@KEI3sw(AHR`@ zZd~K8Q*cj9mMtb(gA+`;(gjj#FWYfo>By@GxFaz-j-wvqR!2? z5fobK5@n=V#ujK>igjCAg0+~U1f3`a{Y^>bH9VZU)`q?YIc6N&ou3RMPWe%+$W#;91RN00@(I@#Ow22g|B={s@Kh_B) zD|qmRWMob2exh)o3DQXd#zGSGS?m2h9&J!oIM0;%eNmChV(~grTC9$oSQ^r9p2N1A z+<9!oSDw0`r|!IgyN`}o!=d9Y+6z^%tcD~#rb9E2FrPYBMsk0*7-qn(f-At8EjYI| z=h;`^Vtad=E9W*jWDKmXF*9&MSxPr&%_zpPqtT`0XsLixflddKRiFb-2WmVfI*H}> z9ut-5Qi3O@PIMjNmkP#0tOAF<>PcXwl*hBCJq1l zfAG)w{Rbc9_a3~38&|bRA@^UGfBqEMPJ&Eq0qv`Fnit`5k`r!WrH?^9j_;*wG;%fL7?TAa!2Q?T~3T zN!*7+N+?wjf5#!vZ+9$c5Q z;r2XWOCLrf6PA>DeH}!N4{|po93hvS3Jq-%;jWFSLSqUCMiGKooLxM>$9Q>-!D!5U zK4;!F7&BzJv?kVo%gda(bd58A`~!aUi!tAL@?O66h5Nbvc*!W1EDhFCcp{1#jj1eE zuTcn4m_#uWDwdx`Zd%rC+_Ay!H*WCDcdqfX*Uz&PJ(KPVWxET$qo*zEq)?pzp$ReY zDdtxhHJXiTi5selNAJ6rhfb_>{|2lor~?diz|yh0G6n@*3)(1#<5fHz*W3hW6{b3b z$1p?l{x=rXW#IE0sZ^f}@U<0a~;^#A>Ye_z!Vr15IXsxrzc~0^T z*0+?&p;5HH6@gw1BIeXtiJv+txPlY~A!WI6KIEmM4q`#Mf4AiK2b(YfMMR|B`)Ta& z4_c{A5s-;pQktN3jzpJzK|IGwL7tU_LMbgmWJ)VmXoW@_EsiNxVXQ@4E8<+GsWgyK3B{$TDt0F`it!4{$R0gA@YhZioDZ;P z;GHY*`iCF!!H4HKf637fhkOKF*@Y_}!s;!ot;1ln!pHA_#LjzHc*|bo{VV5q@}8S` z^yUo?8(8gN!@`o%S?5wibok)J$`Xr;P$`YJikK4jE-UW5cY{ao*x=bWuJQCMAMn=2 zDSORjlwGEwq{|d%l4uwtLC^^|I3z+5QJoxD_OQ#1E3`q76-n7K5t3|_dH9+AOjygrI zLp<5XJpjoOQio3hswp2OfiUI?cJQR+7Z$qo@%2fv7Zm&MB`H@pX~BUu8J*5`Oim~j zItL5)q}Zd*pK&F0o}L?Y+((uBMDWn>?_|bJiWv4oyCh%ddSPPx4NX+}ttz00gE5`a zGzMlaFh}8|BDGK`i!LjsT_B;cx*)g~=iEX$8bSaoVw#)-Er*s)7z@crENO}zS_O%f z&3=m-DH1}+>4YkGf{353PGO-4S6O8&KeX@WkSJr7H}r6+|BW2}tCfVrQewWiVotW`{-qtXQxFgOjLJ9RrBUOLWC zUpvotUb{+Z4xtqIWlz8V@@ZP*3QD|q?5bSoTiItQ&QRzw8Q&}B#Rd%%B-UFkaL?2|Mj0d&-b2rgKvNBbNuzM z-^og0I8v3Y0LpjNVZur!Hc_r^z%CIn7$So*QFM{zQnOscJr5k>TMr!KopXD9@B1IJ zy>k)W?xKLnyko5{Su0?3>X?<5QK2~QKVhg6pS%4*zWLZ)+`0tE42%Lo!%Cj0VP*!P zVJHADUTY$n36={XFpCCNNzC&PpZl2a{_thq`(T@SHv)Bt(yU-qg+csjUDu&}E21Xf zLe~+4lSalxLduDP!QrB#&672gH6p^ikg1$f9*ak*292Tfd*afNQ{G)P1Sja2gk=aO z+tX_gPC-KGdHehKy@&=4ib$P{?x2JN8jU2-VT%RV8BSBR7&+?l>oRmKC@Ky^?zrD+AZ@k5|ogGv(RD)BT4=en$pTn#PT)MW&=5&Ayfyu;C z430CM&Dovoa^a1O{OI|&xcB5y{(~<)&X?|7B>x$~waIiHm5r@?D%b%-f0Poj<3j>bTZp$yO&_}Ia$6x8|UkKku7 zz02EYFEOQprPEB)K$<6KQ1KeNfz?dWF)=a&g03LJ`WSY08Z2YduB?kDbg0;poF_Vk z4l%n>B|>!AlqAVC^fq-dlc}?{rrHPg7E?amQ#eGwBKpmg#oE2#Q}zQ%4a|+nL1(0V zMQsQ%5?ar4H6%K)g=nzQ;1Tb53#^YTR)=FQZg(VI5mQ2k$grxh8s=?_RtZ&=|3jCL z|9@S-RRwg6k=AwC!2lPvctJ)P>*|mQNfC0fDkBTMK$|};WV$ZbeQ`tfQuw%_3?Lb5 zxmP>jw9&s`xDG^2Up)5$tDN?eeXvl$i082qQA^5P&4k!~=@_I42~KYE07(nqlk9k) zqHKJ|E0mQk-sJNnD2ohC#baXt3>|1+6T%Xa0lrX#6;HLc%-Ks<`G?>65kG!=jsNiL zpX2kVm(ajGT2_oj18q0O5?CsQJ}_%{sjDHw?40Vc)K>1aTW=b1`q1s%{{Z}pAHK`0 zZ=GRvZG&oUolmY#*l8W(dKp~|sG`CMpqAnT;Gtz96je+OUn~(CyO*iw@EyuWNx#ma# z7BA?AWRF4Ca&=j|X-mKwB15)GTx}YLb|vX-uW@hU ze?609U-Vv0Nlutm@$vTMganQo0RIy*RMy&2q zlsw$vEOLU&(B}9sFzzHDqd`$UT z??Mz~7O6#-Mb=roL=p{%50L)|NsWf`yzwU%l$K#y1P z^JUCngV#Q}!2AF0zv9IQZ|8sV%_q2LxnS2h#wsvUn%XD~MjV?mnw%mmX)8kX6evlI zwPjqv+FeWBbJG%!-FFLr`oh~h`{svq#VQ-Chnbcmc6X;--Pwf_%4z@+X00c-4rObq zLB*gbneI(c+G7esie1(h%3TnXf+U=DRT-3(Sq~&sSyBxK=olD}3PvTUutjJ#xnW83 z(EYdZrMqwD$+eoBN3x%|&NHmUeIk|>Aq0#W;*zZQK7XYtL{vLhuvfylCx#WV63qVJ78FvAg(-6_MtIx8o}ymkHz|M`FU z-|(fo?&NQL`3WAob;wSX@zZKK!T>wn4g;MSRRdCR81FHac#bwrAlaI#(3~E_+87@F z`?vG-JL~+n-+h|bK6sbW4fnFXags|{J1iq~Gz?P2RvlC`e4NsByG*(r%2GBKaiNe< z4Ii_JEWzHq0b8P%Rw)Oy@WfLT^Aep{J9Z2|yGop0Vbx5y{fOa-JC5>|`%ZKJ#yU0f zw}k+~+eOAp&#WoCj&dXvl-&eZU0`Ai6RnukHNX6D%G>9+c=`Q{d~|7#-9~{LLbXg; zSG3bP#(1pOl&T<=n&3PsM4WfD-HfWP(S`8cwb6{K5wrQ6vs>Hz_m_A1H@|#^Z-3!& z{-fWyms?6LD7%AZ^D4`SR>T5L0aoK;!%iFMw87T(V$rWEc+nr{`@WO>n_s@g zpS^H~i*cFVHbSwCU0q|oeU-_zi>wrZTaK@CaVO%HCDDRuz;|ftNydX$gsucil3gMu z;U5b%Ny0fyI}x-wS|nuXdi?+)?pMnPSaNVcsG=11z}gdfp9pPY$i;4-!lj+mz#*WN z6YD!IVlqrm50G@SsIwiKDW&nYGD4Q5N=Z4>#!CFV($oXX^6FuNAK=?v&RyE!zxW6L zB~Ltf8^8DE&++)ZM>#ftStzj{3KDDMH2`MQ3CcOfwM3MaB*sSLyvI`V@QLFb`JHbu zHU$RJTv=Y<{DyST|Y=F={hVFDbpM684-%#*Yp*vu=z+tO_P60*37><{^5Xcc z$|#bUcP+EFW8RGj!GQ~OB>s;d%+r5Xk%J=)S2&x?hk z5(M#7jD0#`>JdEgOV(nbnK{vb5ZRVHHJZv2)h?qE9TsCYRnV2pXLj9ZgAJykTp6? z*kWjgl3fuBl-8NgD^HgJDW2)rc8YCPFfR;Ofmg4>%V)3gqZi+1bEcTIhNKTujmPLz zqM{+S4x%CY7BN%_=%g_uQchdc4Xq(XaHA|)tbUheUusO5J zA!J7lJ`udd5=dTW`VCnWrm}URltd~oN~QV$^SlP5MA3>JQbHw#R@w8p4>C$JvZSX= zDRH;~8A+z>5+VeVARi~Qh!O7%rehy!Vlp>2!eF>c=OW#_Vb(R+K|wtjP}BmMD2yv0l&hB{FIr-bxr{)zy3X5rc^vIlFr3*QVYkT zq)L*h#Ze~H0+cZrEz$K!D^yXSO(A~PrUYZrM#O^A4hg1Uve#j&lGW99lX zN8EOiG;OJB&CR7@0xTb|xa~iBk|*B2mp^^(J>ERGh3g#0msSX&V3M0EZ}?a;3*36daQ{uWaNmt<+<((i zZeL$xiTwL^Efj*V*P|LmAVr5s77}c4PZ+FMGzDxbIIrR327dU~C4Tzc%WR+9#FmFi zOE*wd%S5HcmN`LP70iQ25&^SUGd)kZFHEm@qc~VV8x9EivY1kQ&ZVGEeSp+~f|;Bn zk+N5MBBygEa_CrY7IV#Gl2ADM==6m#I={Nk4iGo?ov#kKdwiCM^L0UX>iWk^DN&TQ z&;m0~Vr+p?27S;w{5RzKttp_-ojb?*%}cc7nrVv6gQuBBqN?#~najH!*LFHuRbrAp zfIh1QcTQc0Xnm@u>Qj)EgsA8g^Tw_ZJdRl?Q&ZFnl$t2ET!KU&7`J5ZQqRvzQTWeE z_Y@PA-2o)tRQKL6g@ry!cp+>gBPhLn-t{&%@|_3R{rQq6*At!iv7!~-+)>wKy2fyR zbC*%Q%#m9kfytDu^B?i2uV3V6@BMQgzT+mo{l&+4>gIw8FbhyRO`Gjjal9x0{v_y*s5@iWp6H!TFv=of9?FkA^w3dxycXQ?P1?uqTKaePRB|p3GC_Z^-^A6u@n?L1$3||op6&0m9kVoKj^n4V zp5x`W&U5?CH}Lf@ex9#CzRVFT%dihpAb3@df-6ZRq~SE0O-LfQMAf+qiuZ}Xwvhnu*3n1}4$oE!C+ zX)!5DBa>uGp_Bw^Xq_-BbKetUZI!jc zWQN?Zu!pR>WW$D;y=JPFH z{oo9*e((}6zI}nW?!B2OPaosHjhd6If;zj|9=4FsA#23r*;oOpv>Kp{XENPkX*9;7 z@CknJ&LzHd=fnKyjTwLPr@vq}k4$_)umxs3U}6o8k7!e|G+w5dbQI2GyB3u?oNWn( zBUw+-3a>_B2h_U8CWUTxQSA;(X2M!Ic=G-eeEzmf8maf`xW15HG!06o^x2e&m=rrZ zJA8cU5}lb~m{Y6BTvxR2H;)JXTT?(EIlRF!3r9|zV6I^99P>R-7c8?dU^h$|v@>)n z=w@9;s#u6n{$1t<`-Qf6Lh4-HCdj_GS(SR=ds6Dhk?Av$Zs9Bm`%m>TfPImi-3ycw zzIBRW9}?}=$_F3oGZ5&-*M$8?FV%_&%_T%9zk?4X6Pa)AV$>?5@iE%4%b5$?tPjSV zdhm<9{rWH1i8Fru#syw|?_cue2X5u}zxXis9?`_%3Y!sz#*+LD)i_22LCam&5-qHi z8%&tdOs+Ck1CEVWxn&GDK0e^FlaKPRe)a|*PbPe{yT!aMv4a&%F`|o_ww+^(l788m zKDHYcT&&p6SRQDWjKYK|vDu~4fuo03xOM#yfAIKSoLW(=FZT$_jFyh&qQq1cU5upU zCETG?L}eC%Sq|8(Y9_#?7M^`~lOMkFJ}-Z~#da9N@EG1~WJ?$YKH{1=YTjUj$Lh#@ zIu$Fvn9w~^gvMm9=6r8P2mxy?WnGbyqjL^p40g1{l@BkY2O}JoVrfLNvcmV?Im0hM z`Xj#b=-qtti3hm-Xu*v|!O#}?&V%!evg%(^(8P$FPf-@iLCJDCh8UQ(iHBB7Zd*}2 zeEKwh_R=!nefCY>_~bloxx{FFgZcJcnmS!T91&xIGBS$CBtdd~Lb-_Y0Ycuuy#{45 zwv;@}{U&oquiJG+J%EQ?6hn9Q-&)K!fdEs>I=Z8WoPNyOWb)JR+hwP-73vmwS*=RVuRL^aaqc97%rW} z7VAuBhWXwO+SW1}PAx_`Oo*hQ#Dl(Zvb$x@P|AM$VngPnu?=2aa$^E~_VW#ZAZ02> z*^@%%bt;e2Av@~Go6c5QGSTbz-GlpF7CMmy*b5**%g&bXkEnD8B@}2Y#kW<9X3S`@ zxKvi+xs$Qzs+NMeEJ%gCVGW@uNfwH-Wl(k~ca5P6Jovy-{@POy@VUESLqRuhSsx@M z$5F(*_zqGO&VC{LaED<}S@tNHrIKqMTx#HZKYxu^&u;S8xh9bj@I#52oX0A zlEjE2bPjwXg-8mZLSj%GIv?=f;b|5H8Y$sT%kuIXyL&reE%oX$omT8!oIqJJy7@7t z7eC;oGgo>4%qKj5a-DBJdPy@ZN3yImM!h%{}B8CEy~HQ>64YdUl} zfVyT0;X0rt8xJQvRrQSY+{zL*%Km=W(3M5LXm82hzG)>R1_ zmyzqdcA~!C2<(9M!88+r!Vmo{_HVDpQa-= zJ)iPQTwFRI2KyYnek`4GDSO?xgP!0o=wr%(Av!N8r2-l)T;E(=%TT^o+T^jdk_GbF z3n7c)^6wOqBo&1q-nu3m*(Wrqi%i`dT@_U0!|cvmUV7t0j^1!Pq1i>bIeXJh{`u2y z^7M0W@CRReg1`Gax4|4vjTFObM2cC8sUl7VjH#G*Q0hahk40QT1lKkUwdKZJET>Q0 z!*d^A=KHUG$SY?rveoT@-e6Q8B8`^0)^1^{nz|lR7bObtT}ztJpqa2bDk2Ak1(pE_Dq zoyWT%mS9RzYE98wd9@98R5No8d#PZ2`=dBo{^*x)@W(H`!{_fg&F_Ei0lskSkef;? z*jxnd=ImWP$I{_Luw3CBOgqJ}DpAH$yBU6W8?7}D4cEE#3y1i^gJ0xNU*6*{Uj2yo zE?lFoWn>vlK@2r9WcxuQo~{mu@(tLIqH9pjqms+?B#p8qQEO6g5N)2+WDaaHGKNfQ zv7yV=Pih1)k|eAB*`r#B62bymks@5E8)<>2D0w2H2y|mY)`}7r7kUPO&XkTQ2x&|q zqn43UFF`ve`i@|f2w;q&8&udqjVd*^TA>=P61`*IOqkCCyWVqkdz=6BKm70c>tB7G zuYUa&j;upUB{Rg|d#Ed-^Uyk~y22JE6Ga?Ca>TBaL)*)ttwVy$g(mvUcNY6haQmSrnZGQDzRD?q*%v>B>^3AXnKmgW z5R%XTxDR;b|Lzyi2jB`7(aL5oe4Sx1gEkVlp;e+ZL6EteOqvP{#eiglo)HH_QelWi zK`L^=Z4IW-STm>6o2dC!Zn@zwzyIYY_}zz2asyyn(32@AmPgP+oXuzh*pbB!M9Aq0 zL<%-4?#{?8p4@g?Bi=>v4JjgX2(+uy!EfMy>_#sj-Bn!@Ewb1A{zQ zR%xuZ>|NR1k9synbU`{vLv9t??J~B|#D;dW!3@UOYJhW|>A7v{@i8ct3EdtqUfki$ z?>x`HeDMrlc>F=W@Zbi=D>$k(%Nk1SF|MQRQ(~iLZ`LqaS{0Fbf@eohlev z^XdO^oBdudcvJuYfB;EEK~#<5LI2hi&_wYXEDFP{&DLUFAO(ZLV6~PF#)$iYifO@p z{&iPR6N2kG(0`dnqI}c!UlX)jLoWnS`)1_wyZ0pQjJzb1JsD#zB>Jv03#wA2x1?F1 zJBu-S&$HhD+54B?PhEtCcVo!BY!f3k1X?#^Pz@-JrE`(_&J?F2$`;h4Rd%PHaMjd^ z;mQbIud=y&g+KiMYy9z#Uf}Qlt#9%0?JJyI7U4_-lqhs*87s?rDLha;M^fyRqbLG} zY3VSWsx0ew9^u|QkMPU)_V~$*@AKA2=V_W9%`} zPq$$2Dl4kt-qRa=;lA6r@0J@lIu>zEy*C9V0V^RvXEeIX!(UzE(;THN4%kzM9W=WL z5ANM<_@iIE!`l~jm|mSgF``&n!$wPT1!@`@CQA%0_!g@?$~SmF#di}35fika0a1|7 zOYgc7gZa zJI@Pu-N?5ex{C)-jyXPnrE0*^(G8NHZLKHz-%^S zvblpB)cn8y^)vkGD{t_XuRg>VpFGL&A$T+`B^yO4p6v-@)1s>q3bC__M6@;RP4+O# zFc^$b%8C?1gD-0KfKS>;QxDNYczzT9^!sn|!mA%J=}MeF$?DNnVvJne+5oNOJ*OB1g{-VnVPcZ47)v(6}(ik=i5+DBR7v2SSPke4Z4kiz<4gReq% z2gnqi1Lyd!U;s&ke&Wg?1$0k=TR0~bHt*5~WmI-gk+2P|0>FR1TGkc1(1aAIJB4l?)y`!~ zca4p4;PE?d;7bqQ$o;G993oINV-O9oNe~R$l+>e=J|eGk0aH}$`iMhZHFnB^xrR3` z!(Y7g4&Q(A4H`S9ICc+>H+=lwd58tp)(mV-GKruJofi&wr4=@TaV;S>6uQLdfJr_V zpn8FCr6hv(>np^AdaV6IwqGA9^O^V0cNWF-qR=KTC{p{SNj&hl`*n;MlbT;^GVqsO zIXu2AzxjGY9$=--&y8Tc(KpzFG(*}6jV30o>UC5b!U zCqgiv8aXJOlO(~aC{f^zX#20RPkax}{ zo_^^yo_*&HqFbW0M_6BqoLE|CeHr|`;KB!<%bS-lZkq@0KF$~KyOsNHJj@Lh)U?#> zVUo@bh$J)Bh49P;s}w}vD$A6}PSEU{igN*;{TP1m>ifL#(PgG#1bPLQ4`mk+L(y}= z+Bvi>+B*>n`WZw=h%F&@Bp;!b*OWe4Dhh&@k|y+q_bQ^4#A63zbJDOOnLuae5=z35 zlsx!4hYR#4^@w_SBNMmFcc1%!XJ34ihi*H`x4!%&U%qX?Va60z%SMwtbOAMum zPV^A1H6aED#!<(P4PA26VfezA*ZJF@`vd;s*-!Z4&)?+2<`!LHX^IiE09`DhX;7mj zOwgo>LMg|v8o;b&va^e-2IACU#GOGAvl!Nba%fx00TH}VJaU|U$jzbFniwNxS?2e! z?HpDcp>Z4t*HAf(VX;0^L}_vUkY-e&a{_>@ut?}~ik>nkUCKJsfv7w>$(CuAMMX=D z9ic2Swn8OKh#oy05`Dm@LW?^Gz3K66hb%o19>y%$>)q4bM zi&6@o5?GBgmC!h}URV&K6HS;?mNmt26JeTIF!i#8=eUMM$5N#j4WQY(LYQuI z=j|u?%0mzGcOJW$qgBJ0IR!12MglP~C}rse1!W0d!L$?mNa>dg_JC^%wjI3iPRDni zd5#y}zf4oFqF0WIKd>D@P^88|=c$~>v<-AKqVvqX5x#y9=N`PEk)%Y3LEKP)%y1Rj zic%=&alWA_6*LX8^(bpGR47}ZZAC1^iqe$gIMXPNA8x>4osPu&(;5H8fAd3bJ~HI5 zKXMm;@VT40wqqI2kM3pdnrS{%n2@_Tn2<>6b8^5U62 ze(>_Uy!gRc)anLa&mh&Tjt_I&jq6z8%-fq>0H{D$zkUC8?p{hfe9tv zVn|0p!jO|A3wh49yfCz#M;i%=nIxDg&8~r~z-wFZ49gt;lpX1ICh@;T$7tq0}0?uR$8+?Zi3EPR6F0m5}w;ls* z0b}t+LfMjF1|%~e)nin-N;x{jdy`9C`rfm={O%gR^SQft;@+biQ#IF+AiyF&6_#mFGK!S+!Yg$@P$26JQqSTDf^PRHW{fCp^3qayg-1vZO)2QA ziWuZIQ&Vqlz?#v>KPSU{_V5Nd4>KPV)z%Rr|Kyc#h}k>x`x42CCp`|^jp{fB?T zbFbdc?|=CTp1gI$`be=EVE~jdv9h*8#IZHGhAS*ZHAGbvzB9xGZ4FH&iI;C&f$zU@ zj-R~t9_KeZh+|L#N=8(JA+GgA?}?!=fSp8ShgROZ2IB+TMYIFsHQFVjSD4s>@+4e# z1&E{=Bq%EODQLoX)+rMDshb?53$2KN2ZjuvWmSf3eg~1U1>n|yj7Dig)Ck{G*&INX z#oJlzopKy^${cmHq=g2pSy|p-?jn21kSMW(C5mbZ7Y$uAr5;*ptFe9uwX?(BM=G9t z=n0;DQscPWS2mLp)FyWV0$k9<5WVW`PV;rpXXkC6Fpkx z&@GR!>tJV+3$nt?>(X^t*P^-x)y|=9a-?%XSQO9_duU$U}brT$Fk`X zU7@&Y#O37qvkia#>btz~?ge5TqE}Ai=LzM+!9>SMksK+u`%^^}DO$XiNtcatwCXV0 zfiY-pPJ4u70s5R- zz}E}SxB9Cg#Yz48j}KltYg&GjuHT9R`p?hK)4RLdfV>C?H;#i>&!7A&zxZTk#DM}? z+Q|Ge=S^GEdyLq4X+;WscPLe2Akcri91)tN0)3SDr+=Ma_uDNNQHq&QbzrRXsYUf^ z7mohtAAJ0t!qMB`86Pm6!-hc72!}hFj%a%O9ZiafWJ;2)iKQZz5~GSONjA_nKy{ey z4xT-8g>#oK^U6CX_~IjX@!*Z?qykoYqz!{*K#7E5_*sJ~Nr0JUT`xzO>D$Su7lK;zAIt_r*CJ zbfk$3QH~T`SfzF7I60WZG(~^;6XK8avw^?X07XbE@Rfp+R>o zF*af#9wNylv}pP;KB1gP`+&;#unLio3uyX4sF)V_bMG>gK2=C7MA&@51a$G5^d!rD zv@9dhdEf0v-^xgM4oG8y(pgZJU+^61oRlJJC6mIu9%OQ3a#%{io*mMrfU1`mt*p~| zMK{?+kH_3}@(|Ol3oyCF(V^$_58cSOzi=;)-Zo|lD2bG_F8?74D9MR9B<1Lor(wpN zj%!h~$B0^6`~ZIb0et7D@ABT3;p!|g8{UjohP`VoDJ85@6jtG;yJ+uGU59cGI!ACF zvFnH~5sBHdH{=E=KmW-|6OwZV`oIcd5y(^%Wxiw-r| z8eLT4i){>Ts~8SWVT&WYd2NdeKlq5}-kI1Cej(lybG9A zVN^*8D6cUIMjBRYIC{!*k6PiLli%R&^B?ox*$=6%zQw6Q!yPvsPafOs{b z%Q4zVwCl3RvPb(C!VK+OY)m99MoZgA63%lnUM2vxTuh`RLR-kJC9weHQ!v_r0$_0# zWLm~z7QNso|0-Ac;1x4fMK(d5wIBNqAX2B8TtsKyx-#P6mBsStj7A^)nl=l|STe2d zpcUVzYm86-mVeoAtTMo9ltQP7`773D|Gr$m6$P|P{pjNQ&n>K0*!OxisO#%Za!uTS zpHfnke%9-#l#BrhnTLlUgnfan`+`T1ti{Hj#Lu`-gO8b(k#h3Zrx%o5dY`kjIMfeZ zY5ypa2R%?or%#v3`@H8K;MNBoCgnvJW5k3co01Q*c?Zz8C27BSerz;E9f>{?T?Cg= zlcJKb*Pt68^{f48_$Z?tQ8tl4Z$aR zM=BkHgx_eL1G^$O7jVa^bv)~wyK;%$s%G`}yEwFdNFvM0n@^B&zfuLLf@DOOUBN?aN!gu1s5|ny_4nvvdSSE_14;?OHHSkeE!%n)Z z!V;|^P~p6Rvc{AH%B3|5ZE+!yLd(b9HU1xe{0si{nTp?g;vT;J&<)fUmZ+%4D_ouK zF(@mBqwzuj8(oKTnby$mQL8{*$k6mFw+*@F)DztO%X579nYTG}@f_=;8we}QOr|Ye zH=|VwRgdIe>k`TZRB%#Q1u3FY4y6Ru6^e_vJ18xFsJ&~6q!}8t&M2eG99VKl0P$D6 zgs(?6(?Xyt(t?y-^Kz4@jrd%n7ZKt@Ej+N+h(w*6BT5;LCZBDk0?~Rf4wXs>6{!dq zQxHsKwsnnSZH<&Pe$ql+v2gmd^wzxQd4GKP?}H1AnQl5zl*GI@PynOtZi)^ikv6aiKOaFVTPbwRPVOj0nJ zP8f^^oIJfjXeV5G@0Xl9RP)dSC-|Kw@8YR@mpN97_}02z2Bv^uK@SCyl|w~t3nGq| zj>I)Orh1IW@Z27J|Jk#=^7a+B+>k4~it5lwhRc!J=4E2rv9dfucO5$yFET6)I7f7y zxFR`E=%Ubqycf|XpDvzdlF%b~`rsL$GfkIm)T1V)wk{YNlS zQ`o+VG89_V;izrRH5`|_O=7u@R&dF}Tc5z6z3>hnT-o8`#cifD(7MFh0fkvYmjl{a z2Qd)6C-@c>8kBEjzx9piC6u^h$y-JZgr#Yyc9IF0GVC1J! zXSHY!@|l+{NHz9tV5{VERT<{dOT5!)71t5Zjc?uknZ94W+q){U#7|!g$Pv6?&r4M&`>s&*}5)>QQ zVU13n6lRpEp*D#yn}E+AxW3E&w;ig>hfX9T&Ou1@J@OoajL7M-TS0DmVn4C?^!+JK z8Cpp^wo)i%<>1f~N=Fi38bXM~R^tQc4vekQrX-mGc5sw(e29;ySNQ*Y z=Xrkd;*j5c{0_cw_eoBSYc@tT6Tio7zRSvB70}F*#_J(#HP~VZw8YsS-F(Vmd5znu z6*j(jl1J`1$#;MJ9xuJS$@>?tu{K!6tS+%PZ`hqT=xRj7V|2`Z(jKKfN{dIdpvnf7 z3pS;#6bR%IwNm2z5KAeD@>+~JX|A6TDd}znZOPALT8IinbsqXBJnmbj$qNx=-rgrD zA~XS^4CFRgk-c^IPqml@zH%mbQYe8SmQ$1{?@-2*l)-IvR8>VW7~-O5>*548Fbt2} zLbQ>W&VRy(=g;xU`H#5wfAzN*0mE{DpH8vbQw%F8OE!V;zWx?JdFvdPrzL6mD5JKd zVt}7?>~8O2v|_lrN{6SJTm`>}ax;t*IuSmB3u1@nK?NhO8kxixlZXaMG98Fnov-r! zn_^msLFKs<{7I>lS-A3?9^8X^4T*fLvtKQ8NTX4iaD5hk%v@EueIDD-@)0In zRjsnqQ$Lqfd3_kbM3QzSov_MN7>_j$YYQrqn6#1YX+ycRMmJbzZff4{W?Vko@anbK zc4N$y~+i6zmB`mF{Ps|YFd^ErDYd5>)|KQHT>YY*EqMe1=Wyod6+d_5@wMw zaTK_9Ne9j(t zGkwYXmpYSOAH4F}znlEKxDRmVgU`~3Vf|)Zza0g1es3}zVv#G7qX7DU({rR%_HF)k z-P84HI%>awR_cH?i&>x^*Tur-LYXWSLrYi#Mt&p7lQ`7boRYX5Av$_ z3+G;Fuz*20@NZ)J7358;BpfbS6axLITh2X=4T>0(&;=X>Bc8gcw+M3yQNjrtYHf*f zC8{V%R^xU$hD%G>dWmK-W9B1OaTrr5c4^pr`vUJ?e3>`jy24lQx}C4xafrLu@@v#t zMiw+)4r?v`zy@)mu*NW|SAmH4Ui@!$mSh+Orp#N<{@=J5CnXW~TtPEq#IAyi0p7gi zdH&25e);ZYE?sOHow|o^4!A^85`1D)0j?wXmM*ra;Bc9y;e7_`V zBo+=^4lr1T)sUv0Qjd=?UO&uhmp|gAfARyKy7wmj;A@}bo)a}k$|Xh?cIF+mGOW}F z3p4@7+LD?X+E#2F8k2x&nnS91;)v$9zk3_s``H%XefkyNyL5r+-Tw|(|wJlgwxjxVU&_2Pn8`ua>x6ZulICd z#V7KeBQ7CP2UO4tp>fnIk5#3JRw_q^Q!JWVrHtgh6Tt*h@+4KDb;oE>vAexPn-ulx zGF2`7%+wj?RmH5?Woi95RoU?I?gcLH!KjKX6(xEIX+FoLK&OOaa>Yk3wy;OV>Ue|c zbc$;{Lk~yBOK25oXS>WN+c4V}21K?*(@uel*{3_8TpxlGiJ=cw5dLyZQD{6#iH2E{ z9p8u4o`MA)UQ&0=mN=(E-+ zlgHFX$z-B1U`mp)V6D(Obb+;o=p8D|7#LXA5#3y2we0xTlMnN^f9EkyEeriidq-@i ztkji+0}+|eXQXi;UhEG9B;=OhV;w5MxqyFOk=NdwZK=X@#ON?Cx!fXm2!t!7{tL<;vzZ z?_GS8*WUk#Z-4GSK7YpwN3~^4){QHu`f9R&)0vs0;K*=5#Aj48QV9nLY754Q7#}0_ z!^A>x7mcD(L%dmH8`uG^CivOgk?;KUC0={~3SL#1)e{nX-b6+k#^nH`BeThb&8x45&nl__ERG1P0Lrg{l#OyoG^na!WT%NKVtUf*yy!$mD zN7Z*98EsCQs3I!%d)$5l)lYOJbf`z2bw;4g;%rfwve6gNLiflui27Bl-cLIr_50|* zEmT8(b1BDFc8k$UKKH-9qx_BHaQs#j(D3Vv;p>dPe+|mK_~6sLVYS~q^+j|%K&$8v z)K7NX;7tZk9kKf_-*FNI8yKm%+58TR=cOBubu^dDrG!+5DTn=a>3p*-H z+f~>?qiuPhmk<|#`E0^qFvzhS9*wwUsH6x98UuR<&P90pBE0zF6<#`fl?xL`Dpxpi z$0}P_udy~9vb;W~C`x9t8QXh%%!8-U3U88FiYamP7T##WbOqXhc2V3mf&<@>QcFw? zF}g*}I(c*LX&j4}wSU7(3GHK$qi!7A`pk^8j`p~V^M{nmBlRbX=-#yEXYc+rS>yPv8I~A*glF-61!Lmv? zH)ETE!EglwGVV-)@o>Oc!{%hd@$s1d@ToQKyX`Cd*|Tr+{TJTnqs6pEt#lglT3*^!K0d2uzo$5?A@j?|)eR5s)4gO2z zH;Zth{Fpk6M5DA~ibT+wv{+|=iqafwCDa8K(NT%ULCJm5bAcm)q!oMT_gGq9p{~a? z(zizyi5~XrrTFpsS6Y>P17=;cN7?w zMnl51;rzvGScOaj93Dd4*~SLd7H z8&vGj){`2Kbphp)Ok<)(B~6de!A`4>;0SRmB1KVWkyI(Y3Uw?dx z1O2NjhJ}+5pY`|2e-ckjWmTRM(-% z|F)`kVFi4UTAR7g{dens>!bYpcl}lr&EZ-G@R z;pmhYY?RMme<(yze(NOTb*<5=AZed@&ZVF+Dkl-?AmIlYT@ln!W&VWDbEpF&ju>SV zJCJx7)vxq_3$IU^ACZgbf<^rCf(ONc_t!s)P8ldm`-Qm(P_hsudLj;`d`6!V7A;N$ zIgZ>QNN{o;Xhqw#I1IWPu{2u2Vc5R91!h1wTw?R`l%hIHd3uBBcKPwEpYZa#AMnaU zckqqJ@8QwYLk=m;Dix*C6k$$Co)#u=LnOR|H46`$0MdrT=)Ju17frkC%K)?S2`Mi)5lj>l&@? z!g)h#fc*m6WP}=PNJf)%BH0L5VRXx(E?L~B2@%S!nGaqZU!DoWAXF3xcc}Od?)moobaflpsgtj1&KN2C#P=eehNSmSLAFiFB1KeeL?g8}STxoQNk%-B z9T19=vMA}&90)iPGhl{h25bemHiP#*fgk?-49~s#9xXLXYqwBFPvcvS%+FC@hbbHFVJNn#U~0- zB}r9TUt+Sek<CE{WVpB9v%q#`LNCHH0d0t;UhAPJo!5ufue4h$eZ^}GM3T)!0s zw6@Y!`4n+UY{HdM#N<)Bq^_Ybk{VPN1#Jk#5<;PHO&*m;aM7WZj1vkBZRc1jheQ<^ zt&DKHqI|Yi1Psw@@TH8@gF#1&N+l`GSSS+}q^!^tXDlu8cTve<9DPO__frW~(IZ@$ z9%pFI^LzYN1vpt5Dr!Fk>2y?NhMAZX=Z%7f8 z>(LBJ9-daPrQqE;ymTe;=N~0LnJau4pz8t~8j=bat7$^u+U~9#(!~-kL`;YbqN1A5 zaq~Gk7*r^UUgC5UE(o0LQwe>0?D;v17%8#sZh#NAG(=$ zcP{e}|LAFcdh=nv_0(NFc-+ze%PFx`bZ8;)6MSKm3DTO zVIk{yX?<1hGYTS_!&({}RSwy1_b60Bn9i`>9;)ex6G&|?F}Enl)PmC-7W9l1J7UVB;+U@63k31+_k{z^`vMGz=-A30rB^^#U>)d=q$Yr) zC?I*quo$2tv>u8YbX_7j*fr6WsM4T{f`D*^%c@{$G@{VLU)LIf^2}0;G72h-_1C!T zROH)_J;*m7e3TO_6@$D_dQ~z7roe!LS}V{Up_@Z&h^5A;lB>}$*9Dh==PpM6?9~r= z_Pt9?x*C>FpnZuA1vVN84K{klTH}1A-JWA&N$`%)Ib!QjE{GLkC(pg=TA9Q+CsU0q z5=V+q=Hyr5`@AOeaawGPsi|B+o7>o zG|2>1Df>XOiWn_vKF1`5N}cGDlG0;YI2tx1E8rSCo zCD9~Vt?>(*m{1H+y&gas+nA!*e(K(rIls=@f;AG8o`tnhl|)^G8Gs(k`)UNHBq%FW zLL`K)AQ4m~)D^9tuv%9PD!V9q+t^55Vhn|XQrIm7rSK|XV%C-DfW{$nL_?sE+gbPi z<-a-CZ$$we)j}Wt8UD*X^Oe9IRcJxXq9PiLrbOe3u|oI!Vyyt-bOL#0h1oW8`umAmJgCnZgYG4j~E9^T(Fbqb}M36x;=v^{tGLxBERhdFtnU&tqB)zv03^Eu#t~qY+y^J1yYoB|9nPvK^I}^Q$%eZ0gz31$` z%x`^vU(ySr7;?Gh*&KL0A=K%`sk@mqCeV%;fU8RUFZDwUgPom?&RzD zmfU3&vpP^{&x)(iM7*C;V6jDos*|7<3S28%t`%T#u;4(k$*qS^@S~SLUHddGiL)}6#T$6DgJoDLo?m3b8!ww= zUT;FCr=-wef+JF5gYdhFVlAh&@PxZ^Ui{MK{N$6yqj5o~Fv`y{zCpJp2fAdzWE47z z%HGY%OMw=HIBiI@dV51~!y?%F^hx$(%Q3pCAD{Jg-MyirZBQeYXv5| z8jxuih{$Z&Jv3@VvVuhS2Scz1PsF+&wsf?i;p%u7>tNWo^c@Tbnqdm;j<0d_&_RCx zsVDj4$8Y9DWm!SE&Y^Bd23jjKHIl@wCn}t?sG?v7Tx7z9dWJ1mdGk8_^4$yk>g;7c zxYjWCD^RXLF~SxW>l3C8m=LoKU@O12iICk+Qj>&2(@Np2y$4^TmQo!%>Qc<>LxiQ` zIqiMqgPLBV0I2SncP*Bf4>ysF6lN1oo$_HREwlr29+aXhWh*O_#8hoThQL(vs7l%hM8m>_?gX9VG z2A9$Dz3BGbkkgtP=^{o8$!acoc>bL!FMaqKZ=buyhZnaPtRBh-08R3seIzxW)HJ9j zNK$5YH&LNRg&anb1I17&bI!BRc^8_N5UNIO(JF~hm=+yHd>^7lC527~8nYbAL z-G1A>r^Ftb+gZbP^oDNrNlNcwC%INox!#G&FZ3Uf(3$@%%ab@Z2{@gvy7nh9wU2($(o$JC%OSo$&13oF8gNodD1TB@Pp9jA-L%0UtDV znQ1dC2pMs8Z7Za}pic{)SJT@{crvbR?o zE2MbtS}$s;9kbwFcf!TRz35P%zqu{ab@y)gvrOHH$)lpmsbX1S9|9_fxUefRQs`Q= z5v4?(9Fiw$gVHYZDFZq>l<`C>ZCGU;$`+`c`iL=TRiTZe8ui$1xA<3o`4fKp;~(>f zPd~zc@q4E^+%NfHr{SiRf?j@~#(Sz{&@qYuiB*yqNx&lkDJvFEY*rK;XMO*a|NixN zxXfkRS&!M=(X`Wncct)N*QJz`K1jvP>iikjiY6-E;0AfbG zyhR!5f^|P8Wrv>pr1QrfTTrNxQV@jTiLFQZKnOt&u09AgBZ(kN<&?n~S{bw1&s?Pz zLMwK3_*^`*@Otk4lf!T#CBJ9=iC(d+oD4vc?m&@A&9Se7pjyw_gx~LXl3Lu6SF7rV!z1i3~|YQ zW67g+(L_mIyS<|YBvi7C4JLNtGS&GvxW#j0>BDB>+0OP=g0dK8QOTgK#gu)#f?29@ z14kRiYzzyI4>qaBS5enK;?~sx_kZag9=+ojM^+UZJqRH%Z^vk-a7I(DtwJ4%S_?-y zS118U#;_A$YT<(`@X`5g-u(D8UisitKHqML#VTtn2T7(6Q93Q5ZHaX)otSw|YCSIM zg-?H%qS-~$r;ur7DdaOsTJk5)flErpZ0Z~{Vj@PJU92KnrF^dW^&E!3*QM3s4B7!^ zlB6jVu#V^4iEdTa66h|>Ep>H*fGz=~7}nB7P;mg1DCIE5peRULhY(Bx(-3STl|TWh z(zKN&_8^poq%|%%@wUe?k5HQqlNT{}(%E%H<%7NglT%?+>c~2Ism_|R|KrL1zjY+& z-7GiaXjdc7*x9`yr-EckRHy|-q$6Nv@t;yMnX~ciBArm}@t5Sqo4twCIe>gY zB-x1?_uN9d`;vu&OIK1|0k_A;jTvo<|L))akYB$38f%A7Q*GSI z#cM6oIaFmqTTAh(l)_j=OXh=W50yr>7UL5sXuM7+9YxO;rD#$iE{Za7Q%Oj^q7pPe zAMH{u^gH`0mEzuUCqYVHd^z)Cyf`SuMo@d5U0pIFnu2hM&GMR^GFl+&I&{*|2&!#T z_TdJU4`{6jCd#7f3~fw=##4+o*jQO*cRuB3Z+* z**#^B$CIdVuE2POnoGf7RiN5y+`GQP9Z#R+-aC)-!(V;G^KYH!gU@TOPIlS9d6a1l z^SP(-!Z$QY0R?DB&v=|R8C_0Un2XT(v}|@df<*BcG)8I-C2lxc>ulec_U@62fXQwW zW>18*NYZ10_DSnB&(E}%f+yXhv`4i`fyFM-MO!N^lrJTlcj`D-q2qmfFd;h#Wu$m% zGfkZkiM{$fMmgMuARQ4MqjX1tk^(xXJQ7-Qa)^0O2A>bbK6jgPL6#BbxFm92g#Kh- z8wEGsm*rKq6Iti?yXdINU*c85B(tE>M4}`Mnv$q3DGGbjYUyO8l;r?Mix|)euQ?(@ z&E%lyJLp-GYZy0M3@T4wPkG{j+xee={V7f#SYcGpIXtLn>nJp@U>A|kD9|xNnqzcL z)6QwVCiT`y%5dJppTBpFAHV+@pKV3jP*J%}hWm$(vPT;=b04T@bLn!J2CEBJ2L;2lLv!^a z2i2U%?>@}e?zxk@HXV+=EP^DSoWvA!@oBS3l@-Bt?z;H=ab?o-y$^SI>C6>Axp0L^ z1LH8H7#83LL|rl&&+$GI<_)o_NzEJ@NrzQ!AVw<=OF=@fR1B!(3BD80h8qOldpv%F zQgTog07PhXF-qYqc8(I(C0)ZCr$_n^2?<#oG&?Y5Z*DER(XlI($-0KPbhPebx1|dg zF3ew31*V(F;bB4PZ6FS&~ao7*eJ2m4U)woukkR=RMjMSO=PtmKlUV zrS{57t)#PUl28+)4#XHGyiMnHPTlQKzkS#5L;<~5BINr`?q4ghx$DUK z@;gIAq)l=TZzEJ?NvSlYv$#Q@FgD`5n^bPA&9e!3KnF}3s0%eFMqM{Y9 zVOW|OU4fK~sAU_y?tLsi*GiDCPRNv7pJWBCpwS&VmU5`X-!VXM5VWNnGaYgZs|$$; z*;))BF3`EoRGsW2t&9~bw-g}Rh0T>DXG!$5vIcxZv=x|0umU$Erx~mt=HlgxT)ghN z`OskoE1P_>b&3Dsr*H7~d++nV`_r#7sv-jljM>|Sx`!-5I0j3?DA3e`KDM6y(c{X3 z|NXbW%IgnJ__sfQkLTZg3A1q3;RnC^ zj9}t@p(3jSqlxYV9CFyR^Dd_Ug3XA6;;~*DCN$0|d zTnq{CSS6c%!Xq(uHQpDg66CR$3#5!>lIa&JngycC(!U}48*I?j;`Idq0)kMQ799Ph zbwQS>j7ERK7EpDavutf8Z#4q|9Xh76&vUZ407i9!ZX?|(qX{`M$61Zd!`CRl8DcC@ zR1EqnVjUN2+|beA=re1!nO-`>!JF1NI8gk?8`+{ys`jDm5KE8PI%eZYoO?=LGU%@` zo^Q*%Oo^5#f;<}}kurH=8#4O7^szvorAQWxB_jhJ$2kTWE4lTz@ZnA=i#Ydq{BpB% z!IcFST8R^pY!`B9Oxk1}nqGi1aY3{(80}EXiT}JRFceg}LPhBYB%RQOrZ-f$zQsAH zcRr^a&)8qpoIcRw*}G5i(~JKXL!q0h@s$9v+rU$18r%K|^Wup*3$dPgm~ zjvbv!KG!mqx}dktsYvIDacv37k&HuYB`!!-p=?6igtCcfK^0m!R7D|k#Z};XU^Ts} zpsc;vC3gH21(qJkBysXod*0VNJ9aF*<8z&|(8iMs>EFWZccOrXrIQ&q7R}wZld@Vh zW|~G)Cb!G=QgNC^Q6W%Ol`xJPC_@9gS4oYhZwAb)C9{tfOHJ3R*UI680>ptM8cno_ zm!wTHQoKdSN`!?`gYn=s=&WSV?iwk-Fx4f{kv(X0NQ<0`a}lo8q9rFA`i=MHhI{ol z-NbA|)tSF{)Pj^lEKcQzXlvEYNAj{K{pNpR*ntwl03k zJqOl!@XkB9^VXvj7It?hs4%A2x45DLpe3OYWq++fxrkAozA0%_Lp$HbS#v_DRjDem5{o=0wh33Xk;EIfR*aB2|La#1|T zJ+8CLh_@y!Jm3GWHuS;=Htj_Pcik_tEmoIuwkW7|NsMBvW>iF5MYKl3n5-drncL2Z z7%2kIf_4ra``B`Y*&Osh(;xMj`s-XhcZSvVf=5mt<&isX=8vDck2?pTTTkBvY-(wn z8KeFC*qx7w$>E}*G*-k-x}!;Hv>Py=wltxpSFQ8pBde_53gv5`Fn;$FtQ)Y~f)5R- zKF$uHvea#)nR%@42^Tg7bnvvn6GAJUqv#i1gA|nr)w)h!5&_xXu~2?h`LNfK5n1r@ zvl9|=;itQ3?RN`(9wZ$yDWDFr*L3NP#*$2d(oRwyO$nyJn2Mk!uqtUs(xq@{m7#4~ zqKep+g0i2`YL1#tDC2~q&U4$E<>`Cw;Msc*au6u+H1lgX18e;OVDTy8Riw$UOlzS} z<_u7LiWphBndi51c`|3}R+toywn@yUirLgt&%Dr^5|~Cj_*EmtaLQpQ_*%NB-sDu+ zb}{GFLNMz^_mcNRp=ss)HpziO0)n#RR_dHi3=21cPFUN0{Svk5Z=+Po&(w>qquds? zx3^~R+?c@>lo4*V3gSSMzr=KY&N-D+p`}nZmSi198_{i9LHm_4!gVeRVj&5(IES(o z$(CR%uq7CWvrx1%dVWmNjEU17n&~QOKz83yEDt~7d@rjb1awM9^k*sSdVUM(&%p0U z0lffry5Fn4-*@&eQORHm$`G|Qu2mk~ITt{-PlIzzeyC-)CI-q%cLS7}s3W7lbL z3*=EpiwX{<3(y{A4M{ab)skY3PuXv^6gx5I7Q7K8EVoj{CQjmT1&!D%paE&IEH)-N z+bxXH*-Pw7EVp$O@$Z_jETNy>=YUGN9hAR3=7n6RNX#jExoG>*h^EjPv}=+# zU?e>Zt%*v^`SCevEQlGsaL6(hL2H^iQ1<%tR~^dF*=_0%I@*sQ7HOdmK`XqrL{$=0Nzj#8>={ejj4^3Wp`r3y zq}gQ-RB-#g0l)W^Z*y|9&%q6-^0@1dMi>V8*#u&RQ_>xug@(DR2__M=Ah{b1acaay z59W2vZ2KCeEx2ni`(Kplt-LNlC=4h|*r-yOnfGl%|_KoiS4v4%zio_d*h4*DKFW z1jWKSED3c*Darm!D!Z{{WL#|HQa(`Sf;oHp>I8(iM{8Z!klncWbsMzGNF*_lLf2Bx z9i&Y2P|;_kTX@gH-;YbhbR>3^qWlAt>ZmH+T-S6mH2J}Tl&S6zzYr{$MLJ~XCX|$g zVnm2qV#8A)xrizsN{fTiQ)E{GgWL;wr;)}-j9nEDu9vs7uHf62ChZZ5EqJzAb-iQd<34NF5pFMS>t8kz2SnT+OljCun^<7Oli3qM6R{+q=>!Yim^7 z5`9Z*8&YTqUML&7Rp4_t%`(cL!XlDBdtXX7maGTTIv>Du2npT6^9!`dFC+_p@lqY` z^J~{047>1YPCCbDclm`Whnu9u!IfmB>(dGLjLg5N^FE-mPr7m7EXpa86^lZw#Tx^* zBsoWNC8ipX3X66X+LdTspq0Z>QqeM;Ut`18to0O|m7+(II!1Nt+#dS8D5jMmDIuUq zEg(GUpt=sC;kWVnohYDhxc0O`$c81Np-!fkvR7>Cc&)iOk&|4)bS+d2k;GbQc>JW{ z+}T5%Ir9k@cdyB$);)sq`82P=IPn8c5v(EVnyBYe7{<8}PJ@?85lXQP3K@aU2mq%* zSig;qR`^$0%(eWc*svmGr2gECe&fhh7^X)$Y*Y0=6OjFY6TR*_mwtpX{vI2|Z^ z1=ba$Fvci@&8tO7o{%6ZiGa4qw06kzEk+0S_bYCD z^cY{d>n8ri_nzmoUCrfSiD5vg2bjX(FnBa`42@9>XMisGD@AeYNSzB>B)7$N=0r=! zLk67QLoJrXXCRA7NCm!PSo&#>xpomfy}+>*&DZX^gJlgSp{0iDt2 zPVu={n54yhUkC{oNMGiuX0akkp_0k^hLovaIv1|u5uakpwN)V=vR!wF&XfIbpTkQ8 zHd)WIuk%7+m?<5dAZ?Le7yKfGLquxb+P8;(F2*c-t>e_Kt$Bl&GethoD4rnSQsU!`i3~3urnT04Obbhtl$+)yvz>~_%+PxIW9@ZQQ^?muv<5{vZ5&V zdJlcz76Y3raMQQ%RH8EsLj zkl*VbNf+Y8V0z+;WJ^hKG=-p*R%{TjHdoN9VPGS+nbDtJ;b1TFjR)@JTaVqv@f9d) zPdTkAO3li_4It9s3BgnKdY~N*1!EMGObv2qv?*wlP&ZQU`b4$2Bh^VUtvxAfREo@I zHO=-68xlQjq1UI~-4Vn&%u%7qe*F2vx5PG~f=7q$z}j_R`~vBhXQQ&v<;{7j!zNZqH3OKA``AYw=#Q|9__?=)BXr#MQJo+-oTzFnfn-vlP#b&NLlMvW8?W z6aq8^V~I8&o?Iyu4d;kug)#EGvq#1)aV?}Rsw6Yu?^*OnJz@dSn4>VCU zP&#v~Wo!c3gFhurP}z4j(>OYS^Z#|Y|656d{+%eGV-x{`DI8n76NcE=oX6}1;V2_a%E5)wj#BCx6}4q^DG-@KLa_*O1V;Gcc>70zvM zvooKQTt%`yW(wv}OY5sQg3!>;cS-daqtr|@*5q7>r|LMLPN;#)}CVI(HmAfi^NP>7wes!3jgPGnz?;9T~}E=U$A zG`7_ESxeo{(7mh_Hx{2-OjiH4d86OW-Rs&&S2ncJFDyON#}R3KL(wy|4d{8pz|;&< zO`Ucb*&auSLmv7EPw?VrksrKzmX|-c#P#VG*a1OR%%Y)HJ(O{T)_|W8bU`sFNXF5Q zw~r?xJ$?o=%dqr;S~NiYyL~S_X7XaZe1CLOw8N1iG8AD%(eO zZV4*nmVQPRb(!acgvI2v1VN*tpzH0trtBrGwT#Cz^h%GJujv~j2LRR4H}ZYd*+MgB zVd}ynGt(?OI!8+QR)mIo?_aFBI^MI&Yfqx%=1j1{k79nP-7?rC;Q{e@4gal21(rBPy+D;f%1t~jEK%#KnDrs`~#f;!*I1|~g zdW=-T&8JrQ(wz_SqxZM@?i=TL^WrB=;xkiUvhRRl+dxnePk|ik3+&9>wWJbwulI7k3XRnO8ZT}F^6hP@L5s%BXj%&bZbqy8H z6X!GV0TU7~Ht5ESo6WpNw{r*$sh#6P4Y3gsZ4BUp1Z{;*DDM}vrY?jg#618>);XO4 zE#ZbnpR$ivAkm7JDJFqab&GPngRfHKRv44_b-)_&=kG*>;xuDX zrVAd)QS6Bvlq1>--O)PovsT*XIVbd!WGvA*qO~MviO$MF*2!T8Q$lZm8IB0e9Hj%p zLa{c`RH{X{TU05qUk85gOD8#TXpK{w1NLheq!t&aIqqHwU2us3;FZLh2c^jdnDhn% z(X{~9{q~ljzrC+~=`vP{wUu)?=csE>9ijD+lq}jpS(a4&K++Z0cV<|WI1=OqNVXe+ zsuhA38|5igVnYoX0c{UPI`Y5$(+BwXKmVMcJ^vb4r(=R!BPNU24s4Iz>pR%8Pp>?H zpY>=a+xU8hOP~f7epUh8CjB3B zsJqe1>x*8vU4o-{XfLV3MXe^uWaLdY$V8Tjt_02NM2{(Zy(TTlOp-J`g`~}eEWpDf zv=tvQt`I(sAvwG^XIXj|dvg4q0Jq(khhJ3$!&wdq#6CNX3Vbz0ceb#2^~QNCm{(x;t# zZY@d|QWRT?i z*+*zAn%$P|Sxs4%tZW`;r=7v}RiZ0VQD?{-Io+}-?lV2_Z16_oD#P4+iQcieC z0hC=rZRL^_!_J8#Z-`L|3jH?_{yL$}-uEDPmbzJ}7oPXaKkYYRT?_8A66(gH?VnPf ztFcpjEY=J06W^n4Epwl55MXPwN7v|nzj$rJO^?~dA(_09o9y?j3s_x)VDR&rsh>mZ zCC(X15nQP(#n>|FRg}QFE0;)vO@^gnx7p#~DDlL-ck->rPV>+)IBKBqz&t=Z2A7~O z-Iq2*cI!DwS5&3k&H!9TI(p@BKU3h+bQe=MY_6|SX;1BUX~G=m43#z*n}uC8r1=g- zIpnxn;cF*X*<2s;tBSFkZ7$H`KEULsycDfHBft z>JD>$Hl}V{j5R1+)}lm`7k}YoWbB2QH78kLprQ~ERhK+#)xs)p4~10Xw4n=ny;U#; zQ5yo9U=7Okz*ZtAvvJtibnJ4dx1>m?00`8l*L!8hpG2q?5bp*=czIdJ44vlP9oW1S~|E}*-v zo>D@~>Wbi$l%$-ph$+c7@_V!L2A0+GZx)&gmVU(mJZ14NT) zsF@qB6bU)_C~b+E%8`u0xPoLY#b}jzki=w)0jj@7Djc8)ZNp%7K&rQ?*ul+PY_r8i z6?yuh`}yXVPcpKR{gq}7C=(RT7<40J6R=c^HLIiEWb-Wo8e>goODa+Z{EigR zpPoO@XFEHbzkY@JN}rj6I!4+_pp7N7(BsnehO0YsYEyyfXCyU>#SeR8Y!>381hf<> z3ziiq6IkiDT&Lo{{qkYHe&1pK@|SP&(>KmAYYnCtvD-HE4J2Ix>&TSgyPZB4|HxPb_(DHPg{w|PAS23x`IOM>~Xzt5y@Zc zg`aMf#IvUE z!Q2Ny^|YZH3}}=F??5-C#$ZfMY&EDF6|}TFyaC+`jUpp}goutd+d1VnY{#=z9Uo3; zNS&`|(wWn5OR$b)3zRF+MTIU3v^9jJ#B(@Ag0r-3fYntBTH5+L13hPdFH+RowC6tO zf!mJq2Two4lXnm40cHyOdqC{Ndfk!6QSCAK1_Le()30 z>?*p2l@itpSRIypa_K7CwFDeRRpMMp+t%z%r&3t$-%r}vf#Ad|HiuP+l0~?XI*}c6 zVitX6sz=a!4jf&AOJ~1}`i+YEz4;VK%dRVGX`Z2$q2$G1CZt3PDJ@!^%Rged)AYr; zn=((nJA_L+e9!J|F{YIIHOC(oKdbZER*UY3(E6oN?p!xm_|ytYr;N+=t$c9PHX~x1 zXmZEJT6BMf%B-MlOL7WdSxTqbJ%5g4heq@Zq2b)Tf0NH9f%&!1c<96_{>wjnh|{+n z;N-ecD^#8RxvKCz(vPC}RM9M)$)68h&gq2~B{zwsnC(bX>&aZIK!5L3Kau?rx z=n+ozD%KHAEDH2+RmOx*_<3NiA`}i?6(lS(;93;Td~M-kfR|q%^WJ;!aOKSVeCL@* z_cDl7T-Z61|DTdVwJo{@+6EI6v7JGi0jajmpEsn?NZMfZd3_BzXvm}TdI(W$96Jz0 z2K=HXSZIip{7+@^ck1@PBt`7O`Q$5DBx(tk@a-u*Ct_^2Ec( z`28pE=j8qYCN-=oML|FXhiwJn$0UqagqZfI8FczH`3U*7hOHegU%gIQmJ}+8NyBgH z^*d2OZ)|L^zbM#mVBdiQG}bT+iTQ3z-C8PNvYTcMDR8>Sc-%mYf^OCUbDr_pE1WogD^J~X3-=v? zqYgGy#dtoY)QMhygp*gpbkb0!MCmG2YOwVVg)*$!0VjGeJY_htews(_xr6Wi>}9U) zY%y&DrW&I9L&h`1)_Bfzx5iZiDJXJyMrt~4sFFidNMH&+Ix(#Xv8Y~ z$va0J-~2Y8fAl_umpJdsHRyKCzO_mY&<&Ens0?MVAm~23eg|e_C`(Cej8WWRe8|s1 z5;Hr;!KB)3Q6_SMa7(d`9jf}{kqdqA)QjD;?OyV zi;K`g&q4P(>hxXv8^@A6jDT+oNT78jME~2FP(X{S`*ToP*3o+=k~)JYz{qrr>G|rRtG&s zHt?OVKFUA*&Nn%}*0N^jI3^@7vFW%T1cjf~*!~c-W)@((^-Pr_l|}+uhL&C6x%XQB z@|VA0cRuHl2Or{@`}T9H6dYos+Q3h*VtX2FABExKa}<k4jP86KeB*`H+=|<-cIcy2IlCn>HQi^08(G&!2#FJhda0RMYV5n`#6_>xCc}LRUx)^z!=yj zvE3vFh33sIc>A-Oi#s)EFJ9rw#VLN8s3{lwlSvV+bf(eh-0;k@R?}H zHNUaKUJ6Ldq)kwon62hIR9g7f*|Ehs6?ydZ&HVo3r?~&<3PW1@Y|~c?A8Ty3gOV3_~D+{c(7{KY0-`4AQqJXy6-az39&S2XJ+6zl51ZH*1bY4>jz!Iret3~d zeT90qMQTebSE5%Osa5z8fZkrA?(?G9Wr}-~4fKUO*@YP>a*J0Pl<}yjQBm5ZZ5+b*3t6M?X&k$|~E9=DBm*y!**>+`8)c z>ZxNqeQH04sy<2WStF^0aF`>+;OS*LOhrQZDarRZY83|#!^4LQ9y#_nFT8$%=U;o9 z&#rw=(~KDEA-Z2sR|9IFh(-~e+S7G*MTj<1K!+eOOvu)EDSId97P`cwhsEoY_t+&q zEVstH=v6BPw6O$Z#6MbtD;#B6Vyu>clme(P)9)#&`Z{6f8h7k3dG_h2c=F!cIlAH) z0@KNqY2C7KV->5QZ6cwGRKqpVga&BZB)-d55g`U-sOd+;|HdWLmU@>-%%kHdGkq$kS*du zrby)cGhlC%g0zSP-b1tFQc)0dNKDLy{@&~AM34)5P!=Si^kVo%x($909VG`ah-fgQ z(8`jG%VX5#u85PMByFU=E)Bth_lcl1&K2|=^h(33^Q@E&}ASgBa;H-z>&BVF;o z`X}GyKp%Q-Ly>Aw7H=gt@OrAz#$ksmcwpvX+CpnB%E{O~JB2fs=lt|nA91PCTxNr@ z@%;Bcdz*jtmpeRr+j0J@r%&_b&5l9;5W&xx*SnNOkM#rlF$s3Z;Ch8xwF$R`ucl zE-n04s1+tau*58MPZ`vJ&Z(svM{;lvdXK_^w#4j)l$^^k%>}M1v1Ng>3Z(;9dDd4- z(tH0k%J#;^h-cfNBi0y<)J*FHED0&qMn34@VqAYO@F!n;18C#g6 zXbQ!zuD~x|y~t}HU7*$yo)Z~j)qrU*3+abVB4`ord!A-V+GpOo=V~=om3NQaaFj zj!9FBc1&+~#$&f_@&`{p$P=g5=_e@b9rl-wg2e9l8l&Nw9K3WdzXJ(?nj1}{G&Zk{ z3!Fg(#DH7Cw{msF>gp;hD}5YL#otm7JAOwB=&o=sih`mr1PiUw6h(ngmO4t2ZHz%D zO>8}c1{(rewTo?Tv2mn`PX@0N8c~AlgdlxdGZ>6$Ck@&JZmue(z~umsZ7Lr6&S_rx z@D6_Y`uqI+rFXf!6X>rTq8#mKHjnJ=%)mKx6iYp&TUq41&YMpSUX1n$SzMOXQW52) zwWS;;I%&a~PE{nn&`R%#4i~2Ef5WvvpjD13je8B zs30fz#lEh*nC~YR;R>LHH?0lPNUui(QRFte{2QAzKI)t@CyQxNV05I3iWyQsk6Xjs z42iuSvnH^+eThrguW@aA%sXd?{J~?VId-66#R*8!Q*c0P0h$mgl%OA^MCmMsghw#} z{50{%hT^6t4srYbk{91P!z&+M=Iqu4U2HI18PM)}f|4MDsC3@^bQXF!XnbB&j4UkC zOLyJm3do7VoM>;z(p-cb7(o@Zagxra9XNw>Qm~k!AjW{TnxZNt5XCptZKP^jj;<>F z_0Kr6R`QJ}@8>HI-odd|7y<(#=P!K1(L+Ztg9;x!(`idpRaC=LYJUaO1aqI=0}!*gge@*xMi&&*#48fBk>^XFU1vDZc)dr?~gj8kU4MXZSDv@Eh=hU-9}!W3FBwvo()Y_dIMGxH}O8trCOd@5T_2J$xb?%qu!DJv>eJioVY8m zwbI#&OfBYE_JmuU{BBG++@oDdAcESnd4eTlIc`LGa#v_C{V(e}6q&0Tm%eZQaUGvh z%OSNB0jd=9%e46!NKwDHPMG`-GvchRtS{Q4wIe8vb`?=;lqs`V(4wty@wE$R?a_sy zta_A1ADClOO{H2^Tx4AZPThY82S*wmJ;o|LfmH`ru1s0oSBMCcNK}dzMXMBs9s!sE zSnxS3<${OT&%#e$dWDzY`iM5JFw-SFMS&TOu>G5u%q#xlSD*0muiodu5S1x`QVtt7U`>AFO@s2DK~-`8s^!)Pk8tnpNBHSmS9t!dPx$b{ zb++bP_%y_~7Nrx)S*%tx4W!hft<8SJ9j&cJ8AmihBG-c_`C5?Wm^t|Ai*fXN&xJwd zgh6A)nZ{`-<-o0-Lzfz~AcR&0N)u?tTaU^H zAkfg#ga)NFQTOm#Gl{U%3Qc2T;BthIuEDu$4d4CY%Zy`1+uML@$n~vVnyrTQR%3f3 znfINwoYq`)VFQ|2hEF5pL!1yy!9(Osfr%vz(Iw3|X#JbM;tn=DbK zVk8-%PA1(2)$Gw5yOh!!j>(H6`fuTL{f&FE62LC+*-Gyf(c*T~$pqaZ;{sCl#LxSS zF(_S#<3?9N+X7qxMTs_+I?m{qhF*~{VS;YASgSmD-n7cen~w5N{`g_cEV0@&>@Nz+ zvPV1LCZ@#7aG#7XRml1h0k3HlG};iA?Z{$#b%gHrJE6ZcjVH987$Kyv=ezw|c>PWk z&~@7|Uwi~SMiOf~rFjxMK!^}B+NYzm&vgu4b3`sB1JNr(4H%qE-XJMe7DtK}S2~P` z$yQCjD!IK9TEV4h;J|GKCsyy_^v(Nu@#71;diE;kwmzaQhV*aVPrV&6-bx$KH{yvL zEVS}DZHvUWb^;)l=o1R1a>R4g!j;uZ(!jM|@ZWB13CZ>ML7o@?aPg@u5OE1{UTz03 zit2?YG$h|`=3$}O@6b1;M5K{)A|}vLf-OQ&pdBGddpKmPw~!1zSyBRz6PG~GLNo6( zWprZFqJW+U#dsds2?;Y;W%ckHG*|iH>KWdCfYRv@_^nP}ZWXB}I=jk>mrxHtcTO}RR4dOKMft6w;m;$XW$>f6C z8dPDyI&>krb(1~7n$XaC5!3DOTMoCM@~vm@=BdZ-V{=6|#UY?**xKFZrbEZ@BxbG0 z+Jb5%g?#H_7CloPsa=70hArU3ZFugTEByS`v%LMub#!@vomokkw_ssyrDRwQX!H&j zcc%1?KEh8vxX#bs{x{ruaKuv&oZ#sP?%?iYCHogEQXt}KGpdV%pbaWUbTeb!CWtde zeZ%hVH9~K|J;x3*`ft9?n`hzQ|J5tJ^uigUt~ju7gL06#GQY%ZHpcab;B}^OSdw-` z+e%Vd3Pjz=!K9IRdZooBC;5Ab(Yw(DN?Gi*VwWU=LM~a#-b%+ z6XOj*8PSc{hzXJC3smsWXNiG1?KFCX`BoGh8IOKu8fq zL*X=|3iQ0@k<+*H%ma6F`q&0Xhp?)_(U4{yr~Bw^sh*}SrD^F83~gxm{Q5=Q`X*yt zv0GZUfpb&%)!WgIkKX8=#E2t>r40X=<#(_@~rhNC0b}zGf&l9&sK{NbwlkH(F>(c zn~GLxT3zgUnRic5A!8LUR)It@5Ku~*rl||G`|Z4bCkp7oI^on52A8>R1rVI0MeL)L z6Pia6HNN)JhDqrLgeTnuG{WDN1cHKxzb391SynXV#z;9PJfsg~V{b z;`si9+AHVW8A78$}e0Pj34ij}rQo;o`+LAnoTG|nHkkhe=#LU-9(Gzn@ znAVPzj2NFQvv6}T+4aFILokNWDX|wBs_45H_ioi#|>36Cl|%Nh|nbMs+_f!-y!&9QLcxh zA~cCMC6uaAql4J8&!wF?|NPHhok#iU>xcR2YiD@->{Vv;Xmu&xpr(7S3W7r!;X=|H zf;ECHwS@>u+ZGkFAGu05K9d{<6t%Q|ak9a7ZCRC*_}WZ%w+d{WQHB|P7dX1V&s~Rx z{OQw=a_hRL6U)a?V~m(~t&P^1B2l%<6^j_%NM1j!5z)z`y(RpYr~h zH!0Uf9NHMNJ!@%0No$<6bG<>S8r3F21VbW3O~MeJC4|f?jBz0PczoE-CRR&y8a`gUc@TfRu}TB|!~I<@CVh#9c-y@w_*C=vPt(Q&>!<4=86y&O%X$ zFS!AeCYUfsr)_M4QGd>jKAF7xB(-sQbB*TIZ9bn|@#*CVQe zNn`NM9KxJI4i1~mo9rr)6$H5xl8GoNC0&t7%J!*B=AjqBA!Hp1K`4hYisOcKuza4I znJeD8oMb1dMfJNBuqH{tF$=h}qfYL+b+od$piV9E^+@7SspLT2?ZQb3MZ7ckGu^9E z0tTUFU(}hRNldw;t2^U62_{3KvhRO1IVeTTNzPhFvN|7-65awXp`4;H4W_@1v4WcnX=HsP*KpP?2eTi zb3wNDh4!lJLPwt#=Mf76X8x95zY_&?^bJ0FreO|FI9P3)h^Zmzl3<}xff!nBEb$Ex zOMFo=w+(fYR-aV~r*pyGLY&P|{Smc;wuFe~()MMJtscnUj@=&Wi7KJ3q?PrpqDBVO z$srv7(#`zQgE#ZaJ7@XjI~Vw?H!l;+234W3ArkzYrmnH7r0lQagJO3&C4@lHGdSJS z&Uc9ISWMiLf#e9fBpQP)Jjv#qwWv_NKB=-K+kl%cHr%bBP?5*DK(IvgROH1bk(3~QnB2ZXp@JsP#yGb^3|R!#&Af6rrVuK}Cb{3Y#1~Q$mcCItptp8_hKlX+F5`AC;!dYg)ew^sq4A`7gQ`8+Mx0L=uQD@7 z(GZzMPqG?Y7-Bu4tSq)FiB{8EC8qewK#HiUqELaN-KFQZxNVqt@~)ft`onke@NFe4 z0IkQ@HRyzPj)-`V*Cb|1s6gGK?}2%yZBHz`8{vm9M_zpSRX)G8g-->I+K185_{gva zB%e39L`d1T51XHVBBV%7L8=ZgYlggZrQzLw{~rJRFJI?Ro_&(X?%BsZ2cbgYn!x@7 z3Tk2sc(qClP_7+B8!;~|m~(Q?(sG?41qaQ5TfYR4-}w|jfB6zWdGSp?zId66A!f8s z;(wb77L7F)l{`kJ%xyKOsA+;hNmWC{66Uqo?3LL?B?=o^QUyKAi}+V%=Z>7nB1o3X z!q3b{1%r16>q?aC4yFm5c$$}5V^QD(wQq?OSoXqeS`rq8F)$vF1zl=#tZ+`gQ%Ptb zpi$B8+1jag5e%WV&IyKyt^%@mup((qRGGWnxxPe)Qv;N;cpdO25{du?7^^eQC@|>t zFt(sg8gCV9P@;++I%!-zq0fxee$Ih4#~(cXAphuF4{+E*in|O;0YJ*N9>hpU1JD&A zN)`Bk3g{A5#)NI0h_Zr5x zltoSs&CV(z7oPD3lvER~L%R}FlsM-EeGcM--|zMCVTMgJhOy>AFLLtG8eh5lIFH?N zjANsM%`$V4eVx~COM_-w&*)?6^&QE;IKj0xv0JP%wy+CqQSy^lukeHC-sH^r2~Fsu z%bO|e3O-a&w^*Va+D(g%6MAVZRH_ij3@%#JM{Aw2%iQz?e4OEm5ur__c8c{8Zi&Y(#uQEMw9Q7MtI_<4&e2iUSt z(gxoJnmHq!W)tZ59L6bH6^KPbmzo(ZX?&Spdx2-}xrwho_5kid~@}FHe{-a+>iGXd7xE^zBD+vzo%P#Gy`hX{hVS;C=vk8;=XBiwU3 z^1bKY;hlFrz!gK*H}pY3dpC=^U#{s;a;`#dNj<$w>^emV#2N zjt6Fihoo#qpXCjj%s<{s=jhtIdyD-IE#_r;|KE1Sl$}EMgixkKPIG*1(nfe`NKjvtxtIAy^p!LJ*V2(|X~VNg~qu4dOi#nNzeWO(BAQGWm7J9zZ= zKC24a>s!pMqH>n9EOP-6@WIR2H->={6z^&qnW1q`jPWmec>g^7>tB7!`xmBMzBnZW zhqINm_F}*)4ZdCQ1Vi-bm{=CGNry$Fv?E}NYD7{2uM|yc_!ociA}_tU&a)4lZo5Sc6(`p#jz7D}qYrNK{hxls4_|th zH!gfY(cj1VMxVm=na?IncZ0ZgSi^iW#TosOc#G>P*7xO#Y zT`IkB%t$&e&8xf`M1#_~fKb^yEQe~uP5`Ja;F#Bm!WncWVIi$eB&$$PqcyCrud}sv z4L_eST3w;vv&`Bt^>mw|3k=ni%^p1Q&;$J8?>)vH`=DuR=DXK9FsiW0<3r5h6@_>Q ztG%ZF)~q2EMw|vJDWu=N2;YDH6MpvE2h2jn)=V*PE3_&}UMvfh4;jmEM2pc%;iHuT z6;MV5V@1yq^8uva+d%KD*d1Tz2d{j}+aH|e+Yj#J51%~EZTlSF!%#tA%R$p=AWESc z>VR>UvM8~@0GK4Wx-;YcjUIP?^#Bjt@fCjb^2faJ?s-1Cbd4)hSX;k|pbMsxhUwNW z7{k5;H=}}Q_xg2QrLihz@FMP6s*!00+U79?F}1XHgEEH76$}Q3!c6eZb%wg-UUF zVXI+h3fgVbAFScMrLH5*bjrwx%uL&ac9Al+xKz^yDQ>$hxm6~oxON*+J ziRas?$Q2%qv|T$9p~O&opdjQF-dMu*7GD1NJimDREpGelFc02)8>iMsOo2HG+a`uq zF%<0=X>QQ%o-u+H>J8|?npUi=Rot=$U%usje)7s1fAO<7dFR3>#Qq`FzI|*@0yLgp zVX2Z66v_=KjAd3gT-&)!Z!i?3D@a#b#MvF?uijHIwIv`4M4`WZn!VYpLdg6 z4C2M_HPLxeYL+?B-PQe>UgB#n>hI9Cp%gJ&0Hl-?vy=$MSVFOrUgA^#2Kva~MVac7 zDP!JbVhAV|@v+6mMA@^<(}cE;6g|i4zFXLe1<$>;%LgC-h$rv6gJ&MTiziNqcELP>RZ09#~V{^7w#z@4kzlzk7&Zymgkh&t2v0 znJxCOpI|zTG<8EV20d62OTu}>?sQIXZA6;SX@W=VNHme4gTz!DMW_pm?W0Ra(KCcN z#W&m7*)}6J<@RdAlXo5G>yO^ey|?URwUR~B1A2XxgkpxzfdnlDi1SFM8eALC=#6@; zI?V)lZw~KWhUeco%Pa4k<;u0dtdVrPqNvabybtIg2(GW^HwaG&DLc4;*su6pKnApy z;!Z0?jDeO!+eBV{=M3l1e#D!vALiL7PV?y9``9Q}nEeNj=yC+yKzD5;-x$7#sVb!!oN_tQ13*HQp6i!awH|(Ln8^4s1AY4oJs{oxg5lx zv!ATIk5DFB7br}L))hJ$La;-n~xc9Q~?~Xb@^bGpASf3BZ+^XKD(p5wYOgpTQ4ae4FRr_>gng zr!=Y0*w;i=VNDNbEGl|}m$tr237_gk1oI*+L)#oRu9&qm+O{R>L~q!m*DJBBYfL5+ zKEJZVzxeJaeDCM4@h89cHNNw;V^{?jTi9oy2!T~+aMqHdrVXC?d?sRVSK<^LTJ6!~ zXL#=sxb4WTeD%>=`N@kP@XJ>|PR!RFdm^5&8%Y*6D+qXeIy@saE7GYfh z-Pw-@s$rkDnW2gFDobSz!MDVAhD#IF?l~T~Ws|4wy@yBdJi(oZH2brq@T>`p+c~4b zDrT^X$J5SQN)^z?Vhmi@u!GRJYG6CTJDT{HqPpMb)K{G#Wg#FjNL`SV zLsbqXS%5YRhmBl7tHrF_o15MI;x`|17jqe~coJgM=>V5GAO1wkx1 z45&qskx$Lprf0cuUKG;H)_9Q{oIyfH5JGP2-DqK-zbv=tB;*C6_qpEp#Mp9e>k=EI zRkSOaPUdJ`v2o-y^W7cJp8tf;{`y_s`FNYR9=MIi?>@xc#|$fsm;je|ud#o$k?$iE z&Y_Z9yoNH?l-kn}@fc2wEE|ukbJxjre){UCy!h%lJ~{gty>dVO(SW&8OhTXyb0`e1 zHzN8-Fo6^WeNa~Tzexp>N?6xJ0By!kq_JbI5sO z+BSqFd}(hKhD2o@HW!MZ2rbNNg&p7axDl+n2UDw>zVq1bVJdKMA_2 zlp?l~)Ov`ZlcAY6SplC9N-5?p#{weC?i7J!owP8u9L(C7=-DAf;n<$<@Z(oL=Dklo z=f(T(;E6{b;LhWk1BGLP&`L@LBiF}fQBymu(Me-c#3)S}Jw_WwTCu+ehk9`Pw{PL~ zyASiTm)Cgit+RZ1Y0mY@4xzUnw|Nuoq=69etxz3`N@0Q`PFw2vl(H-d!IDBt3Pwbr zG050g5^f{hRI+-$;}vU^MjSmbOM)RIMbMH{hg$krP^iAJ&vfJcH?D=<*JjH(r7bGu zXp{h5$|5L|wrJG}R%3Pmkmy~db8?uGNa0`$sjg6krMs!mXLrx40EvVcz zP-JAjbIMT?TWt*?1?usbP)~7H$)K!=#Q{QE=aQfEfB%1fkMI9%KmYB2`NuqUO0fg1 zYs078V+Mt0SUHTVsGMH75+uNe0cFZ zX%HyZ4sz9%G_9dFmgIU^)g?PhA!Jk_suq$5o3JV3bfB;S!W`9389K{m-}Cf6r+M_m z5gs^sEBlPN zt)-3?`wreg8#1*ZLNl-N%^as9r7M_C<^-JxrV-i?q8o_u?_WSKi`kbyUmV)w618yg z@5DE|E0h;$x*&1(%X?cAE6db{dB-I4HZAQqT}YW$%NpWef4xidR)Yv)Wg6m=&mN9UB4p(b<^TW@0=c5m}a^)I# zZLYABEUhXrC;{uu(&4__Co(BToVl8%Td4kX0sSBQ+DqL_OMk|1{9GjTQCfBcOiJ>B z&xNIzaA+-Us%e6DxF5f9jO+E3t;>Or|NK=>9l6N;CvV~2aXY(+@vg1CAhdPd&nSylT>M?v_Rr5Y?kO>Z3)Y?dyJJ9Fd^@Sb zv&bYMJV&J6q-~@!k#@RGpky8#ZPMs@q$m%v|JK8dw=VLlPtNhq*`M;loBR0MBe(PD zT{m%j)37nxU_wJ5MT(B#q3T4`3P=v&I z;X5`sc>sD$(OiPiqE*R;>j91?DtwO2Fi1k%G(wvc!703h^K*Fdy(vF>{X^dPe2eo_ z#da)6b`2_rpYCFOL&_1+(I=w!=m1`MXj(yivelvL^1M26UCNe5%1g3kC{e};XE7z} zq?t64ez8JtZH+TKTfF=I*ZKMT*LdvSTX^>V!`!lez~PZB)Yl`}2Kow0S7H=|*_4<( z!(o|G-^kR@z$XUPh-YpoIep9hJpS-$e(>r!e*VrSKD^Q}nOsMW4v^Xebqjt*2-3AO zRl*jI6g)b#5{eOWqFL}_*AzTKsl9Q&Ff7lZBRWacHR749v*&o!xq!xG3o@0vHosxL zTl(n6diOUfQ#Irx7s*=OUjV2;SHD#BIhD@l1DUw^NKAQdOK0(5hsH*uMB9;-{?S^J zD?~gM9jX{ox>b}aNv=efhN=*;bC_OWJifxix9;PQpZp3>+;f~m198om&ufB@>>Kt_ zwxAw2v~{8wmb6~1x>{go4ypp(8?XhO-Aeq~&pzhmcQ5eXM`!T?27`U{H~LIxf$=y{ zmOb%~pU;^G2`W-SY~b3^iXVCu3}2j1bf#|z7j810QT8faVbDq8>n!ZGiWUQ-L(Jls z^_vfKes+!j&HweE@z|Y5_@DjpvpjT1!GYBwbHpdz#D+pE%FL}dDCTp|s4N%jS=}~x z6u0#pM~`WaAGn9d??1thU;CI}zIUEaCliLfeZ;j@YM%(opq0%c&iu@D6fj8DXlh)c zaLGfx4b7O%m6H4JI?m%KZsHG5Z?c&qdD?c03ZAkoaH@k=H1i}8+Dge`bv*MJXGxW2 z8+iQ^y!g_4y!6HgoH@6})R&aQgY<_7*q#WTODBa^5#(ZMW|6iskpFYB}G_hc>d;E znV0vv9Y;M z>t}3TILrE4NpJEwkKTTm|N86S=Bb+NCExDv)^xiB;sn&wOP{AzwC-d)h#M1X5o;;4sUr!JJ^pN$+>F#@(#avZ<|-& zdye~#Z}RNJCwSu2K5j0d9QA1t)9}=K^jyS++7uvGwzzVLRRPt`+1;J9Z?uo!I|6qc zKFsqc5A*MS@+Kc&oN(#d4&II!Rx4m2%qEQI0o@+}3LPtw_Gp)+a83bb6j}?VmXuJP z6(~R|1q9x!J@X(}3sIm}YLBDT-Or_DTVxq$tJs@?sd%o-4uPu}R_F z{ip@19TTXuK=GEnHg7B#|yIMtZBue190;{Jj4s{z)xPD^3M6s*^V_eH9jh$_qcK>LKJ1N+4c_~P_!7+ zvVHYEdMa{gRB-p^J|4g2AP?WVpSupj!5)NWm!b&SpBJLf%5_* z&!;=^`8Is-xwm=ilPjFLJf*QiRJDdi6Xrnjgf@_T?i!?QMHpnf`yj8CnE9qlVGrH# zNlC_n(ng9;9mO>u7mmhSS_&o}Vkn_k(x@SCo^LpF@fBWsOpQllU5#*39ZDRaw&S_h{lSN)@cC0S_HB96ERlciwRe-+SR4zkKT~+tc$T z-NO_mwk)Ad1l=P#OJRnDdP?#E?E@*cl4KY>I7vE7Aubg9WHF(lLt6yNQdpF-DC5vN z=Hw!~;IGO&QeyYGK)2*TsTTidF+Xlt|J2g_)K(79+JX+bV2C#yNcT9{QZ#qYL|SXG z;ttXk(Z*`LEg>n4sVI6CMr&F>C&nqxCk77YJD+mPfr9UR^;y3CrDNPW5J!iC#CUq0 z_5KKhAK9(oY6L(!@Ut3CrXareu_KZJ;o1TdY9MEe$Lk9b4s%YZjD5l-5aud zjFwbgt30uuV8eu-ny_zGbNi87xc81@+<)pgclF^g&<~!dJe5rtC(c8Oz`SW_YR_P_ zACF@fSsPN%atX1l{Mq|E{QR{Kc=?sLh%--b^Eijr4l!#K+dDIiDx@nFA{K>95?&Hp zPaE1Sw)dpa5`*xOlkO1XzsGK$1(d>H{tfvA+&CxH(jKy0cnc>vWg%f)0^qW42%&PQ zMAk0cILG8yvzR--v3O4U*NW}zCQ0_?$u@MBWD4mrrji&nfkFy-XGu1Jl2EDDQJ*H% zq-YonDjFKDoj*&@HQc-c_Z%+yldpV>ubmh%0`z>wuuzmeLp`2=U0F1{d=Rq*VUvj} zX>KfIN-jnC;2J#t@fN@Q;398-woN^qvbKK%ZRZT^h}sNj@(QAjUc9#(=wsCf3FJ9z4WlkC$4BUey3L1LpfSkW1fJR+!Q485}Cwv8SM z&!x$PTWyaMCksv=yocxB+2*f*^&ani@;UYNB4sh8zbffJl+lQhuz}^EKmCKRa@&CsHy^RAS+TB?61l+=aj8d4 z8s#-6N?~29nxqw#E-5T*oQC^uKgo;l@8_p)e85}hFW_{K{RcMKoz8?Kr;41ICyMXV zRP@Uh*K4@#(181oALjm}o7{J3g`2W-!F=aBE29B1idCM%;H(qmq;8qcwu$`#Q*D@= zlGeZ_;MGszhp(LDS08-Fv(rSlyn$Q^LKGGZPlL+Y$ax{C`E27(0KDzLR zlpuucOp|f}t)&~Z@J|j)1$4&3y4G;`byRB^fnLnp)CDGqPNAcWq)avxR}ER~j4@~} zbE>ncBU@#K{BvWD1;&c7GFp?J@CtgmA}EC}ExH6Bw+L~Uewo3JH4g&bej8M1e*kXOadyi2ebL_=cB1FI7K+ArR=^F?NxHcHl_?EV5 z2*DHUda>?BTVR914hHo1Z!&AAY44c;d-jTZV)rgJaM?aJrH+EsNlkzACL^ptDW1vb z^s?+v9_RyohhLIw(CY$HAw)Bst~W&j9F|-B#%`+TDQS?+H(25tDL>~D}MaS2mGUNeud-v`yA;c2bO~bcG8?LtyG+PY?UWYJ<4Cd_z6FGy+|)y@`CR8UK*1ZH=TW)P39;ENhZoR z8PfKGZc$qJUH(lEhCKn}uU)^Pt=F+T5>jl$B}dymu}CC^L<*v~7G%`0vVM?y(lQ=z zN%)91Fx`dHVFo23czl!Ct%V=&^bj@Zak-vz`STtA5C6|U<4gD6&R3s2%{_Ola9{*O zJR<^q5>{DaRG289xdMv|5^KvqiZuh>W38t+bl*CsZhMqpy?>Dx-ap4j=Pwdl4Z5T> zeQZu|D+|YZf53s2$dixU$;l%XH?I^7@eJ6ZLQ@ba`igcsr|hkuEwll)r!q#0!a}dd z=hJ|$3=`nZ^YFvh&hd-4&+*aKIg?NU74%jp20fH-VLlQ4x1W)wQ&KAjl-PROx)CvA zlJrIu1EGw!7MR>oiq63MO-Iz~A}<8w>16X}r)=q@qNEDDI_ksp@E_^(gmZhez^6qKwz zsFdvuwS;PzjrnaUR4J%hz{^427HBK)tqu}ib#V*a8eH9ifAi<(_={h@ z$+_)@y4)lwC+Mxw7;P7w4wYI`6KU#N#-rBQ)S^O5i~;Y(6WF)4Y`Zo1{Q<7O&hFf^3z!3^*s8br>$fiO)(4;P zvlEB;_G9<(*c~fumQW|dpah%9XPp9)BE*&u8oX_(o0j!rod(z;aeJk>_2HX&?3M$( z^v-Ae`EwsLPM$UhXE?@)P6?Y5E;ZbCY#$Gvx|N6T-sGkstRM~`j(~6HXfvQqkdmS3 z^|2U8^DM%%%(dluo0t|oQUNbqfdBC)FZ03&=a_^cx_^x5OMHOP%El7gIn;Afi0qDc z#o{V}4Hj`#moPJvKT-@i+$4eWMErt!@wZ(fN@HQAdgGoT2MLwBeP|DJQA_^MGOsdi zL#4kF&`EkpN1*q7mw&^nTFk#M9(I%ZLe4@LLWJC+R)g0XZzNt_>}4G)MRYFKDYUR3 zaw_BQ>>B%43QVkF>tjwHT;un?^cY`%=m@usawt}Pog%iV(m_=af~Q67PD7?`gvDzz z)L1UJiHmjOd#|45mCtr~{gW*&O%+s|l>HICYCviu*T*voUD020RK04iqa8i?24gA= zdsL37r5h}<^fLFlXZYKUKEv-w0o}EPwN}#BL19eiaVnGs=N!fu+B$(PQL!Yd2_Z}& zfuq2vKx$fwq9Wv*W20D?rFn}j#c=@@FhwAFL#_Ix>L!xj;QieRA70tvFMs*};VX~a z%^!X3Q64&JS+!!dRMIlQQlW%bX%zkb3iz7o^=nv_SXt?_(oWcLC5Kjq-1Y1+zW&HD ze*WG?e(>u1y#4V7ib8@$Gy{T$T8r?K) z3C(I@$)Xet9c0vPc?g6f+EUPVED$OA6h~IoL35#Jf3`5=DLunDz~Cor4!%ew)|dJI{r! zz&!TRc9Xsxh`n4$#BojXb5xp={FJtxN#WcWVyi?r7$oH@1&{YFDg@y*=P2Hk`GyHV z#f;9Bv|hF_$>Yc!qUdSoGjvhlj3cH*yM2vjHYHg}TTDt3?10^%v3*C36JB`#Gv4^% z1Ag|>%Y6C%6a0g3K8i=~(a<_dE1(}Oq~IybL8gy-LYNVo30gzXSVk0#D$DI(Il?oK z9O18C_=NAi_%0t``xNI!xRrHgGZD~H^f6i!nwAtN5~toXGN)n*1guKZzHVl6uXHZd zC`i!}m5~NdX~ZT^YjBpNa#~-qav%hp(WoUFMV8wpLtdQci8t zVpC{yH%Gj`JC}_@TsBOOhwcyLwRle~48?GW(cq^u3ZtlWAf{cyY>Um+$fNh%#2-9y zn#XQA#2S$m0xCAdS&h;K%2Wh2bqaVqPFWI`35pqk2FFapIKUMR-~00q`Q9(y9R3N!JLTlYYMVH04detK(g%W(^1!w zrf`Lf)wZS$4ar!vafG^NS~nCHoGUOz4?l-_jFR!~Ngq7Ef#|b(mAjS_U)^<^|9Oe^24|D(^oI^ z^2@Jq>B<$_x~3{h?!NO59(&+k?mba3AjfWd=%?OHvHS4zRizb`G`vsO{>?y_vqPGPzvwo%6&GB1VIc zhLH6$8bzpEQYyfD2@o^l-lMga13@AOsdW2Q?k+1Cp4M7oBi$WKBKj5`BgPnfEz!^^ zW=9Tk_)#ZRCl}$O0{D%!1dA?fCwj}C=|-co-@a02iCVSywUMlGh;fmz5Q2<6ZC!pv znkLWR+Q8tz0n$YvMZDDvdPADs9ZX0JhCPbPGHqrU6Y!*(6zqX8Xp=-noo(g z{m(%v|4}ccmr<3aKfggq7=>4>AY$+&5n?2>a7FH@9HfX*5rf7Aut64O6Edeb8?bv6 zJ{7dOBIp6pjv%eFIy}mc-nq!@XZ|f;zW*41^vwM{c-W$GTxiD(608+{6q+lOF-1zO ztnPzY!`4+8l-S9Hp4#Q$V4ZTMV)c=O96GSVJD+ax)92n~JeknWdlc1>(m8xEXsT8*|QOwmaq;TzKGu z00<8dgdqW%%p{pitEw(lR!dzWl_K;cy-9l1lcZPaL5hx$I{HCUcUMQ3y0X>jGij0@ zARGw~5Z(jV9=FXh)97K$wa>YiWF@Owp)NACBMvTb?zso|?6uaMV~+9v-=B_jw9+8O zkep^FxkF}*T5bhm>N0CN2d}OTfCF&r7rfTm^COojcNP)@H}l`_WrS?%(i5*FG=h0; z9?_9!%GzCnCRG`{cBv(T(D4(ezx)dA zqTuw^*Kzl)H*(`uaNKD}sYoqR8p0Zgr5DY|NHKEwUQ^nd3Jxrs0nP>3xA6b|#`}D- zv*OGr2kb5idYNGC1W6U*1t$?3J;C=7T2kopN2>^;zCe1(Mp=C}2m#agq}b)+Bp`Xj ze6-gw7)he&#$=)Ezz-8okso3dFzk7IwYVWW18D$$O2^0`y&ajs|VYIb7a z+EK+Hf8lyg-*`3O{pqVb{mR>XxVMjSCz(x85PW35KZlg4wl;||((moUWCERbLZi{Z z2r)GhI>eZqd{&Y|l{JnzdBbEWg|Rx;T$3~|o!t!0x54-`bh*Tc1``nP?~rJ(d++x57rjQcz2!gp=&uDXeA`{L_a|^5E$& z@!WIILx|ja_dVQn%}7&nJ#0H&DlW8wQ)?XBVstW)6%+%YUX(P z0RH~j_xbyuyvkc=8hNL5+&z!t@sK_vf`yM8*S**PR#+bEd zfx&Zd84`9tzaIT79^i{Hrm*ZJ}N zzkKWke)|3aJ2HdqTft7i7GMOEdJWVG`nMN}L=%y|C-t405$QFJH3G(AE}1u{HMoJn zNS!Sh#u$BWeobG$83nY+FX0Ks9Lvqm-PnmlOtN;^4N2Kqqp_n8z3$NsAX< z0K6e2AtZx0c>@y1PQS#sExK-pZ$9$|uf6jw58QDbk3M)O_g*O-11fT!xI@0-U^I#Dh1Cc=Yb8`2OQB^32okvFsKYw(&B;M~C+{t6-rv zNKp>hMSN_qR`pP@rBaN`3TF|MQlBxiq)9Y(}4%VnJldCA}$6-YQ76@CR)uA1bV1y>Y0AA<-%DK-oEQls^kMZ~#JQX>muf1hvm3?h zo8uB4o~Cf@7M72*T`z>OqO*>j=C|H7<-i)Sc`-L z>l*NdMxr}MET>vjhD6g>RCWVO$Nv0){euHKFZ^%+PydR~+;%Hs^MQB+eFz}rjs z$=mxp{?dEA^zL~+{Nw;a1&pz2OxX!V7b!vyvBAcDQdlb6Id`8WXz{ED&RoQ0gyJQ1 z2Z@k+Lh5r=`VkYkc6{#p_gU7^@P*_}f zj8tr~jDfd3yuaJ<^8fW)Jo4aeeC-R@a?7T60*e4!7PhIFl?I1rZ8M9W&$+F6P&>RKZK`bO72YoTMbGIc7Yi*dFmt z3r{~E_|{V|^YYv0IKLMuX4kVZImU7k>GwMtv!IOo5SAG4Nj{MRNEGmi7!4^J%n&d{ zPZB*yMia1DVw!+=s(lZRm;%WjVK?h)uZFry_Ko3}%MO%jV25OxhUAZ5(0$SE=tz@D zgqYHyo_TnvL<5i3O(SDkT?;KJn$N9kb)Z-buz!R@r;4dG0ktg5U;lOMYMyEhVl*LwluOhD34t^iOQ|1o6 zU{gcvR;12qAk0uCr=Q>NlXk1nu$s#Z&x3sJ*Yx$9Q$P=6|6#I6SW>hdCq@&d;|=|Lv>uz;xFIA`r{=UP%7SCoGTBJn{q?(e z`=Pt|i@$q;=U)E+J32)%8FOZT$z(Jll5j~28%xAUk0TJXeG-O|Qw|dl(bPLRaUo1Orn*Nu7|fRdNE+=w=4v8%O`T^CPBuiYU!Zjxe*cn# z5pr0QCk6D!kn*M)RHvFc2(5Oe0!TI4U{1E=`@mF}|ojJYT zg8CRmS!mK@=rDaC`4;0kNGdlFuiXXu4)HzGt6ovOvQ&-txrlBtAt0d#ubNXuq3MWq z&>DteTrSFe9k7N(?M9pIcqjBo(8RuIMZVE z(;-B~p37qi=SYOiHdeHNwyLX!hS@V>aQ&Paos=fA_0=>Z%QH+pru5 zCIQM-qtBMJ5QPu}twoFTa!OIcDnt(YKrxyz2i~8hqes?za?3EQsQ>+yj#H*|&1U zbMtR_9hwF&rER3Fe;z&tr0Ed7oi5QkA3?c_)(wM!a45%<$@`Spb&;&bjVwhNP?P2e zo-OZ5#ta>5!!K(TWs4AHA&hFL>*}hZiU*vU6l{bBzju)<%N1XE_*Opm+55Twv~Wu{ z2rBr%5JJSR`PBLSv#PINb};WDW$??cDfr-A;5$z~&v&1GjgOWVKf0RWHi=9qiZQZk z)V~t5`5ucm4(te#gcVOr9U(M?P#pd=YXC#W)(JWP;i%T-5Sz6oZ2cPRpnoF@=-;_w zB>(Bzy(DH(-RcuG6wrEq4;LvS)`M>mdc-JR%afZuMslQgPT>*giS#kxW5h}#dPnL4 z!Fy8jnAE9>1;tuP>uLKQLPt>@qaGh;nIb=Yc9$PK{Wed%a*8i}_9h;^=O(UnV~X*Z z6`BgvH=fC;#G_L;C&IKY*^mf+Nz=8IWzEOYbKCYNcm0p<=GilM^OxUxo_F7Qmm7{> z$46mKUmBe0m=%#pVVIZ_OGn57+A*uef%W(aafs2xDX|{0l8fX4vy&5_aIBvQ$$B+W zx(Naj!X+5HqjC_FO^ughe~wBwe$i`K2w^Dv4`2F6^)R5#^1O)T!;OS&PKkP&Ha>4m zQ6Nax%w=3r%0)(AT}^`M4au9VjRw=~;@lJ;r!;K|X$s>_s_8LW*YN7%1K#-8-{Tuk zkND%Se1QqoW%V;QoW3Hc^VJe0;t!ToE7(Jyi%8?a4>xaTY zj(R5O-qZoB2nU7XV=DH67xp{;?unOp{?!Y#X^Zjb6ir`}dX0HcQCa0abR^$G=&*XX zW9gBogbCXxq))ic5JSLAAf{eTKryqNQ?IfOJSJ-Ad7!C8j-*m1{aSORSP?AISdGoi zS9Bdhl9FDtpv9i?0__r+Oeo43J~>hn4K@+gEN&b>&1$tv>n%;Q;;(=30zZ28MSlBB z5A(;rb044Df?jm-OA$;EM&hXLm||muL)N5*sAtKn)61ycxp@l1%y;lfSIlj~ytaF&c zA;DaBr(gPShteu7fU%Ysta4*rmRRMK$-(0goE&cK)+lMi2*zs1^4M$)?EzIhpjb4F z!-89`negam@8HqT-N_BdlwL9dOz$zhSEG}R@{XB^<(LM`0U@h-wE@~%c)x>}-fVgN z*;jb>%@6o+FLJ<$SZrgbx zqUbZ85-w}SlLUf9qWB}M`vD1{?hT`LVJ^^2*0AZlsHSC;b?*A}ON=^c@)2t*?Z6tR z9+D#ALnH*z2Q|X3Oc|FOwAS;}Hy3>H@hd!W{U%?!?`l4KO~oEnE`vP65|NI|L|{(v z5iunbt6O*U4H6TZr2|uFqW~pR6s792hbcwV1(t2VSKA1hCivtB3;y=$*LeJu54fqaxg!OlYNq35p=M8(r&xLtO%qG&X{@l;ME|YpBLo$QOUA4|b^Go-wp=ijS zom@O8TWVuTa>sfw!5!(+MNt&&pno1Z&`7!G#qgQ!*+GDuhW&6pJ&s zw&$jk8$9&T{XFo%^_;3ymQ(GYXH*)fXCyIng<+Wk6RoUOOf(&=40xy4`lS!y*|&E1 z=HpNB{`o!Tony9r4ddBKq)9Z3C1$ap6b(fSDUpn$FKR+r5L}5dFtHjTAH|bQ$hA_; z*D9MJvm8p-R|`?^SDW;GP?JB0!8gCAuiuCQ8ZPZZAN}v6_qQhVMKxbZ3p7~qIdMoA z&14KAC*1|W3-l?{$E4k00YXQL5${`K)_}T{FtJBcWU;@`crsx!*(RmLa?!BrT8ycw z$_bCXc$Syne2gc5`T@W9h0pNNr)O-TH-9;D#C&0jQqg1v$So0S5n##nW=s=cp5Qa5 z;O2jR4^O_h;9Ea_nf-3Wf<)|hNixUyfWhGy;ZvJCz+{Jhe#4Al#1NfDg2CDXv1+K3 zki!|GCZ?^S^+u~qJ+NeB)36bxc!}fxurZu}|7hCUWrgz*RoX9n9qmB>{C#j(Ko2p} zM0IBq6XL=8xSsOGm}MR*t&NHjb64I&ilRwfJ}-tAnr4oh_0%=AZcHjG+{n|>(=HA$ z^$0hUyG$Seuv@ z4ok(l|JZxlZb>njX~ZrC(LhtENp;u2F7QqR-+206e*E&AtQaxcxCzr1gtla(ny^@D z2(Ownvz|X{AWG;XCgY||bV!Ify-V_eBw$j|Fp=oBJD>Dvk)-#3iv8LoDub0Y<;?}9 zqezNs#7Q~WBU%DZ@6Dk1*4kBXjTSNyBp7N};P+Q_sRvWRXah+OZ}fUMg(KP$XDqQ8 zVT+oBu;iORe3hqu@(TaqAOAL|uioPHwKZD?oKd4w1V$t*L5D9fAt7LmP*_XvBMTpx z6qe6!!R^0w9e3Y!g75zLMSk+yyPTh&rL!waTSKe}CKp>pv8FeAYoV$Ei=;v~Vrz&+ zR8(Byz-pj^u~w%-BI`q<{?iT~(Mu#8S_~T`YM0E|Lc<%R!%CsLQ4xZ*YpIClwiuiV z80je_(yw-y+KxINuwC>#c=wHb{YwvX_YE7=z=i!CMzawcQc@HsN7$cjE6%Fe2 zZ!t9ac|P!P_5l9$?_TEZk9T?RqjSs~A(b-6EOxYo>G=>Bt6s}cA*8y#jivyoTAZ5+|a=k$s_eN@V7lC8KTKalSYWiQ`v#3+~`>zHOFs+rRc#j#OqX*yP5B#K9!^Z^Hz>G&%6!=9NSnB_hMwDWmI# zMpBYPq@*}4q-_Dl>9k0E?lK$14#7tn#&dLEGe*+|kN!wnlB-jw0%kRgOoG)uahY(j zVSChaV%zcAYd*ynAH0)KU9WQxn_wnTPd1@zX?73jixM-QD#sa(SI23AzOuR>e6)ZU z-iGf!@iLFS@H%sG)Y~^QHWmB(OV~fhbh^cMS>RXgp~R6yu%0MA(Y7RSNkt+`Aeuxp z32!1QR!ex%WKxxJ=KVN=M2iUu8!!o#jfwn1hW)SG>o=x=UKdT5aUTwg=Ug16h&3IS zm1@{bzn(A*4%uGx?0;B58``WMcH&7gN9YK#!*mhjg)&-P5NvWx%M(a%@q39jMSQYI zImJ{ZrZB{|W@k0$?|%FVkNxB?dHCL&_@m$YEcf5)l-22bjyb3h97)HaK4PR|RE(%u zK{AYuQnL<-j4^!X_L?iNe}Hek_&y)*FFA9j!7TO(s}?E8*m8_ZV|tsr(Cdy0d9gS$ zb}|OBg4lqe(C)JFIwrPGWf^3{o@jw3hafpp)Pgi!X6_Wsvyaa5zxv<(OCJ2}J^a%@{w&RvaLU4_ zfofuL(dv0UMZ%)N)g!FcA0)&`=(UI~+y+&xlL#j(7S=JBF&A;Xm*BN?k#~0!-}>Rp zq~bV5^%)I6X@rS$^hL*Vb)MhTs0&gM99;o492g zwzWQI*|zktN3>-DXZHBR+Tigil}pAWyw^C*OYJWuATO zELGvy>tN9bf>tMBP}i*rasiWO~h0E<}sytg|%6Va(4j(dn{Z)p)3yON_<3 zQj=8+r>tLF5wpfT8iTlzYMxEXR1obv7ZRx=*mlLldLFp-27dq1`*`H$ZAD|H4nN=L zwvA&DBCCGEJbFwml&&I@Xy`GN>~@ibH`uXmGH)&68{d0}Z$I@4XW9{ajlnllB!KNK zCafqhOs&Jji0_v8b_KB`MqO)T>aeAwZxb;pfoH%~lBq9>57h3m9n5S&vJ}jytSigy zVlHH2ipsFf(lZlH#t14QC28)wzTYP4@27}Rl1xF8f+!V{F^HomE20%bOvJW%ra_J_*xD8EW*^DWxDfI@_20E53!;)4KovAtJBe+fWfM?$deCtOq z^2`hGv9s^-<&4=i*Kx3DFfp>Vv5o5^^POD|f-sqGvFH;)9NwVRtq^ei0ggRwWVkWC zN%St#nnX*YB~pt4TMjKXediNMDzVY%;UTFE)Y-#>#s6Qz@$bPa2x|g_#pLLCt*$b< zJuiwuLkyz2)dx4IzT%OKFKZb`Lh{!u%Qb{PJCO6pu-BMU30ce8cZ%zB23IVPZ;LX>^p_wG_>q z!Z|1{8->A^%NGLAK6k+4-Cb&e+EF6ZR=Yw0=!~PYfCMCYk_~#y zH4c%GjfGh=o>Y^H7@{OdR%rsc`>cAdBA@0HB124WSiiTBJJdmPL6t{j`P!{nwxDA+ zShJ;v;Lk&in!eTqmCJq|Vp~c2caRt$`W$I&j%>Uk{~X!ikb3PfCEa*6Q&rp5Rtlmq zw6df(5h){OY4Od9)hb}i5u3APG)+e}+9D;#M`s#RKf+em@zXcvyz!s>1rOd)^5q9^ z;`2A(!ZD!rky(mN3yYhmA0MA(Ct`56L|kq$M9pg#$w)3*mh`;y$ps#J?gM`E+C`{u zpluV*R@C(v-}NjH_DOVXPDV&v(uIz`_joV(P_T|~wwBoYOA_mbQFf9dn*-bRhBu^1 zrhHf$kk@NW)DU(c!-y~DqFdvmbxaz;AjWId>4`+(Xm_|U`@%i9%1T| zCV5u-=b^4JX{shyS74pf_fCX9>bQ{d3S?aI{JRId_2KvV-V-nK<@@g7(R**^=992h z)mUogC^2QcwMFP*HE(dnF&aBovE_I@qes|j4%n_{eErrjci;E`&%M+0r+@oHK3c%} zAT%yw>KgBAnm*EpNXiU)iA6qisSa8)nIz>&*^ojQO+mK567nI{C^v@QKrniLri_40 zR=LmON<=&&Jy=V?X!qHbUcYf*^Uwim2zHrZ#%mh-ifC|Q9 zC}vZ_e1)yXjOq!Fz?_aHs&Dl;79^xJND1#8zz?3A^PMN2>jolN~?sVsM+j|7_L{$ceRNTo8lS| zcR8VH*c?pW7%pX~hbKw$UXVNBqG(5?(Bjz?U<;xv6`5)@ z3@M2aovt-vDzFt|OF~ld@0x#Y2CcPHpeNSRMNgl4`lg^-p5yAGIa(Q@(QkFlc}!A2d4Cm~A6(#SwELWquJ{8}p>5Yo^B zH}2Bh4f4TeAei%O>f@XRm(3&=mzUM-(P})Y?I}>8@+es7489d&7r{sR&=FIj%ebV7nkr%| zL~lvfQ06YLN*1*{Vl+2p) zAx6OE0?v@NECqcE7*``ji6*o#cI#vD6wn&YMAq&2w8&@EezjVg7`qa*+;i9WRSF(E}s=>+;7TU6Se zz;iVvk6v{(SBy_`*G&!Idgfg|+`Y)M?+JDj!BEsWd#`ILV?pvzh{HPzg`o`|Z#~I$ z5a&44<6?&m0T&=eM+gNeT7}}q>iLfCswu!O=8#+>ewiwf)&hz87 zP_P2vc6Am{?rxx)_o82<-4!vM4cGZWATI<0*)4;rC>Z2yhmBs#t^YA zQbQ{OI1Yfb4Lttb1^(s-FYxNSyTtN1slJ&Yfx;y16n8z{YL4%<8DT?9@SP$6gC~U! zdM&mJ5+U@&KBE+g*br1wk$O@%l71P3N;dLIJLcA-L>V&e)($So!rHVpl93w#gNb^O zxoO#DB_DjG!iaVxlk|GHF^S%2@+B37vZObL)F)gh8J82L+ z^c*uwZoPWM7w^1{NA9?WZJ=PKQ`4!#vtqn$2rThTzzDsMlv&5y^d9ON^8kGb@9smj z0Y7@=By>ulX_naR7m?t>ds?3lCQ&fWl7es~ZBu_8 z(q_9DvxZoY7bz2r)2nhR_Io6DWX^5!N?K z@*yi=@;lszC4Fom6!_9oOdPF+MMU}F;qpA;U!T`+OaXo7!bL8e-(j@5%eloFx&XUA zv8<--*%|u>9gAgy^aVDSkUSDgBsKY@n{u{ZHWlR8F#59*O%e-WI-nDbC$lR(Ar3mc zginK`7iF*}QT_0s@iL;Hw;Co8b9XP85m6?5>#28m`-Ahm^5$v2eBTXx`fBC6wka~U zC8OyHdIHUAMes{T)r`8FP@oA{9$jcQEclI@k+o~=WsDsYH>L;rq%K_-0~JDV1gyhU znmE*%Kre=998nV90XG%#;PpC8onFn#R?6OJo5inKWz2^UDB}_BpF%otWJFG<;7vVmol0#k-JuzX`1H{YLE=XeC*OPK)MRSaqHlBGG7PH1>nJDyd%FXM@3^1JLpZl z8fjBDnkMc0q?9t@0Xs#M-?hbEw|$Xs{`3NW_Jg1D;#)t(ZJy+s zYd*y?j94stB=wAE6=gA^_nszZKZf*J+hdZt;ZyF=1XRNcJ!;o1wX>S(LN<3w%jtyq z`2$vM!>P>)<7&o*)k$!;* zJ+be!%k0&}>iZrE9Vxb2yv2+~4B2TL0+NenvRpv*_=9vHWGNA9kzTu(Q+`a%AyP4s zi>%COSWmiidX^t+O2N(y z!(I$)uZsS+UGEcX4Yg!i7U*8SMsq-p0?pr4(*-4Iv%-+0x<$GC$&}jcF=a+PR$vm- z={9`~^r>R$^I@=bP#1V-m~D?K*`qLq*|et0p*ayxY#T)d=)suw#tW zN=fmN6qU>sIW*krv=iM6#pgM`?zPDjBr6$WrR1nVENi2|CX*+>M%VoHnhpc?PpoK3 zWev#*-A5nr&R8=TMg-ja;Qz9QL^hx;_857oq%YnovkZum=MyE zzAH%P0NeIR*0zcVC`qV^$e{8LlcH`qDP;Cgj5TU*eMdmK<}klp-N14IJEA|fV`q9cU> z&SPAMxIznPBN%6K!80|MbbiI?<_#v3Q~cm3ukxd3|1<8n>vn$ctB-Q+R-qvXs5EwF zU5?`Q^ld}sro&%v@PSbQR{_UIaH047Z+`bQ?|kkw-+1yh{{ER4*rr7J5^ zfFd-M*0U{vKDI0ubLPv2(v5YvU~^QkYq7D%nk6Q6c+;zP+L9$DN0?FRuwWgg48)9s z3U>BV}Y?Fmi@g^u>I6@`o`V~Ly(%#6d;6=hKqD?{UY`m#qfn}W(foPSK% z-R1skH~89TKh6E8ui<#9Y+oJ!S5Q@up!MK=BE-meoYb_1GNgBn&^VogTx{T(7tZt2 zYwvLG`~@x^>~int@53x1e7Hk@05Um7A0c!-!FPy{#E{?f5Qu%Jhm#zTlzdN$K6^>D zupZXUbpf4%8ZU=~$FLsc;0%%wqfyp&vg`fy-^D~0vou2l>}4TCx@~An%%r?tXIX}b z&MlM8?!m)9kcFQr6%^wzrpQemN3ss20#hPlSsWy6HO15uTrtLv#>jMn-56u4$WC*C zS+Qixda9A7_s~nCvKBKM=k-rH`Wvp`GpBE&%2Tgy)iHL06b53CZyVBdOr)X(-rd_} zYhw#1Z~(mYLC<%de32i&_y+HsTd+(eF*YD0#Ff<6VSU244YBQ&z9l)xJ7n&5&}mJ` zUHB+EA&5iBNsN#@G5Oq!8sgHA9BM8trVf*c4QtX5Ry{<;4L5M(_1AF2RU6b1+RHWaG+tmG8b6@c3LWEs$67^`iP2z|@#aZlTk@0F zKH=>T|BfeKxS210?g4JUWs|G7X6yjV1Z98;hKU86<8y196di;`@+R1O5HZ-QW?I%H zBY2?O1GCt}EF&XZQdcE=!4s^(ix83}WQj0RLNURF6;=$PS5BlzB8ka1ORL58FxE>x zC!vKSZ}7l=jL4cbogK_cwV>Kru$W}B1X0#p=zr+7W`h5M0y-w`q^6;G&Xa?bbhDPE z+~SnOCbUr1grz9ik>6)ZgcPcWOB!n~F5d&jLoA4)zy#&_iq%n=!4ujgvVzdSxeEw13<|2XVPoGRT!3d zPHs4^`Rc7)f9eF^e)b*S-Z@KeS|%Geuxfhxc139C)JZwx)3T;AHOm%yBShm#Hj$i= zqE{oA>Ci;6yh>Wh1P%e4)>yEVGB-Tt0D^UNa?D%*FiekYe(Uf#P3p@MpJ=obohK7y z%;5UJ8Jb;5rz25QvcTnMJgRXo1(lx|p)4J#Yw4mOVN6|(nT(HNC)*SfxVZl@fAyVb zdH$tW`O@d^;LD%8gX^zy%qZwdY+m#S;WY}`HR@;Sk2A|woeo>3~m7gXrd6T zj(;?wBMDJ((SkR4Jf_~{WABO1(UKnQ&@qvMVeF!YcewE2Qvg9MU9!qEgnF~npLF$7%hKo=zAz?2wUkn9+74zU$tN+K1h z7=x{eHZ!12#PrM4WYMZY39CT_pLQjZzzJv0ZA> zIi0c(e7L`ZucvHnZfVE)9eCm=&-2`?Z}IjgJM1+e)h1iB<1E?$$?24`^K|W!*!F8u z4g+E|WZqp~nuVMYYqK9IDN~+Y)95ufO0~*VCastLftL~8|E%IN`=+5=H8jf&h@P@( z=zhUL=-1)(8&g0R&QV&UTEbqX6%rFhgwjG?l#Hrc2a}7Ki5r(*`pZwl=Ca?5F=k+N zSdWKg;9f>`B%2s=;L6}W8BkM0p_t87#$bF;w4P)vVhT+TG=|PcniQB$x0y_jac1WX zfAPJSdFt&w9=h)~?!V(YZne z#dAu1Mp>NZzj7rH-+m(xeCi~3UIinkquFM);CL}sL{x8e)MwQ2 zCgQL}n(ly&azsI5yG{K5oyYj{-N*RBD=q)8Z#>SsADkx@Q^rM&9aoq%%0v!5^0{t> zm7ZYoVZf=z(;G|jCEn)VE4gPZ zS&|VmMlr>hH%FK674-0G^0i8lXjJwRqdtMj=g$|t=BtaPi3yCQC~8a)`qtBuac<5s z+PsE1+vMH(C;aDs^Fx04;>&#Tk^6Yy{@eJ}mT*^jl5yFx>H;QpU>&nkf1n{EXjTek zQL^lGKy_sWe{d6g<)&--`a@UpXW#!ZKYZ~ewl}Y5bL%8$`UJg&&1*@iRgEeg$Q;RI z`znFUv(Z4Q?^S||g4#H(8BC%p6t7uMgcF+;#r$L1-5svnyplWay^%+5s(J8^YdP*l z04(MgnbtM4a=iZg4{M*#ovB6)(T!Oe_&7rE94~(afBwxUc;?k}wDtsjbqyEi;Eo;V z!qQ_FEoCvIow@Anx=)AdWr!%d)$C4C{rZTMj91l~5 zjLjsQU)Re(?uII9L1%F(SJQ)qEal=^jCPz84w55DnT=#cCNh-Z60z#C7+3EnM?sNl zia4UMwXWsX<7!Vaj*MJS6L;|kE2{m5TTdM0_x|8vzI@LKP68u5Tl82X_^!c~8~AAG zbI-+DrO-tWeM)q0#K+x=zJ$iY_g+o>*$*D)tqZ%D(Q#s!5$y&WcovHV=g-1wKho^Z znQe{fI$e*AAG{%%rV$iDDS3J`OjT1Zpk>fICv8*>le^1bk_~=o9jt}!A1N1LM1ENZ z`d1?|q-+d~xq*Y;4?_VxaGj6HH$<#Xi6jzYpT`b1-xn_99*1k4Cl0m%TVaY3Qk00* zLrpa~Nw68!W+S#RR7IpH17bZ@dyz8iQu+fn%PXiYj8PxQe7Rsc-9)l1DzqI1hHkl{ zumY9EcPpeWSc+k%?^wASyRpq2c=rJQ;=6D0?91=+%Ij~@1;cdnB;#XK+BR{p?=eyk zeW2@Bq)s{IHtC0&<9*IW7)-WFC-7O8WTYVI$yv3LM-HZI9IT?RG9s44^*qbY)t;Z9 zKbz%^IqKXQOKB{X&4+($sm-sa4*EByfc9Na@Se~IYGbiRJD1T1y57>P7Ay|-39Z9Y z>y5zR&ed0xU(|gbelw4eqZVW)-+YJ6%UnRktjRmFNDQQjp#vT9*`QLAtQzp5EmhLt z9OLnb#cIj^zNedxskUw)j!yE)?t(x6&hvctsb_fb&QI}`hwtUVTPIvUfvvJ2P|(vN zp+zv7+=l9tj57l;f##sW6pm^%<@zc7lP}-I%^$$uKl=`k{p>ByE#D$hVQob*8)GIL zgf`-rk=Qr5dZx*IT|f$rcNQPi@Z*AN=~B?7y4dLmKNByAI-Zolz>)dWVjR&pjJUkf zsTR#5>+4`pJ^HUa=Q+}WPV0g?Ree4cl9dOkkC!=iUcxs7!j^d#DLMNw3UNthf<8?4n1f-Ci!Hj;Jaxi1H(^C3KCaj-HL28rk)oPA05S3Di|yNAgXy?;Gyft~mXVzQFx=pW$Er z?Nhw);$uv&{|wV(*K%gx<6MO>2B}FDAW8cyUwN02J(c+o+2NXqQ zoD62Q%QWqB<8?D0z4sozboVx=1;%(5{T^NGIW`_MHWikhu3a#$w6OLVf-UH*N>f%S z&EfT3_^aV7A2Fuk7aW$sUqM}1(;8Ea!#C!7tm~QaqC-A3# z`yAhW?iH9Fr#gNu=MOy2)TAcRbPJjbD?a)dY79-&P%c-*TG{W(cNm`~8Brw#!@)&8 zLb*$s0up@=HOds7m@e7lw2+m<;F%mSAXf5}z^r{nmlV(Gu*m*ZIM9hhY5OIgHOEuIF>`^_*B$5D%`3V8)@zwCB!)UB)6LvNibzfwW;CU&s~KpKmEJMdGY-PotaY2u47h?30~Mg=tw~*U5#(Op4wZTCKw4gfzWsKU8}gu zp%_RBJLDf2#SRYdCDvxTja@%uBw16g%+dOYBZr@(G_B$K$dSpg52QY5IOP!z_^;#Z zH>Q9dRRwiXQk52?l0uvj>e4ZDusNQx+)Vh!vA?I3gI}h<`Z;_~Jo>P+)()kt%_JwX zMXz1Wp`ehXCu{+-Fn<^&B@-1+E(T)*cu#T#jrVMBZW5eh|6oot?=Tx1R3}c*cLyxv zF5i3hb)I|ib?&+GO1}2M9XxvPbzHvguN&+H#35b5;OjR*ZM(D>GCV7#WHGO z2uC{4uQRPD=7HSJPI!lFFoAVkyBI@O=;NZ`Xg zc=NpvS*|>rlashm^WLlPv$cJK@x}=HUEcWUJRg4eJ-+wM24DL8y?pUAr@0`JlZ9by z1V>8|JFFN)Z$)fTGuu2t1QyFg-+Qj#EV!Z2k?+laat}|ualp5qe2u5yIL9Xkfwl&z zw-_BiPP15Gd<1&c{pHY^6fEMkI8_&pMH@U$)6f@{+Sd@p}U#73bBT=rA z!$V6lS`-JMXeY#cS+Plm3dnGice8(WfVp%6@E za7BeFBT@+$&V3A3!4+3t&BnFe&` zV%uSiA%&8d%JoRR;(!ui#IZwhf`BuD+6dNqN?N8fhi~_(_vTz%Cw}Yx+xVT&-ow>} zrU$w{;hUC8HD!CM&)Iyjhm8%h*%;!SfY4BIU@W^BKJf7RS$OAM;2Yn5oZbDFgK!cl zr+8n|0uX4seP}(V(&sSD_gSv?DHE7jv0OG9Wgc~tAN0-=ItW2SsU-ya^0dEjEt}{ z!bpKJ779p3$L96~A9m^5^Nhj{*GwZ1eCm3>_RzgNc+-SQp9!l?WZ8Ap(-GCl>qx-+ zXU=fdsgvj`>4nKVC9c+CC#pd-ad!f7N*&H8Z|6-5v z9^ZLNQ_}Zv)fGVPI0!33+Y__-QgMJ;lIS(zQ4cSDZV>6$nUud)^y}9NaxzSihR0u< zA}J*dr55IrO~`{;d+q8yVn+W3*XozO(vfvtGICBZ+5DL&3Q3=TH7FZBh~+KCX5%M= zWXBfkf;pLjSd=<(uoc)6S5}0g#Mu%GORN)^4(kjf)5GE-MYqS*TO~K1nDK{S`y#jB zGGn{c=dA#`)arp9qg?y8r?Qor?gf%7@eVGuo;WJ`$ZHTv>)^%Ld;aE|kMZ)$@6#~B zO|HR9iBCFhC#cks7zhi!jy6S1NQ9t!Ta-xbT4+}oTOM|x^Rny2DCx*(9zqgb@Ac$X zkiqL&_F;0y!!OaW3u_c%R)`!v!wK;H`uR55ENXu}6&$}g1$5u{+J){Sb)n-gE9yM$ zJHu+VVmV*XwFW5ujpl{RyU>ukj%m;f<%MO45Y6yg4V2KrQP2^W8OA0;K8CSQEFy{~ zvjNzEu^LX1LdnkA6%-ZaY!fr8GC`qLPH%F!(Kb!r@zkpy@b=pu^7IQg^3_K^!)I>W zW_#kO(6AHJH`FFDvksGmD@_1bSSr-F<02flFy4aewx-;B%UAi{3vcu7Ctu)=_s`OG zp4uE^V>+Rq%;=;i1VgYMZ0^kWfoSv)Ku+kwdQGBoN^A>&*(I0X4WpW{+%r9>eoo^sD*zDkStaT zz!FpDT@R7T))Mi|Q%hq6O6X!>xj4WyhM65Pp`_>yCKlLo8#@}aT71Iu?_cD-{U`bU z^RM#He)mh?`KgHcAV2o~NWzvAA zdO890tRGXy)_4q35>k&h6>}VW)LaDK>)_e<;9JkU!qYFlgZK$`d4e>uG^-9DJ%uZ& zEAZ`{lzPHJ3(XSgdnyE*3PKz3ZNe1&x>%FYWjR%UxOQfyb6Ov6_26tG#LNvI?(>ww z5gol6fHh`08&dO_UW+NczXr)z%ESf45zQdeaA0fgHanN;3r_jAPK{+Lhh5Sy=6G^;G!s{h#I!9=wZtuZ3}dba9Ds2?~pGCDWp&kI+Y;fGbX&Qbs?4 zMe;1H#ar!0{`B2_p8VNc{P|-~)3Sv-c{9OJXc|vh)JTNg56@tHiAj;r?nA%e{MqxI z+C0JDY5{S@Xg19q&_M>1h(WbR$+tQzje|b6S1L|CWNQzJq=HJN);$GL|B6OoYtgJy zyqr8rTvytccc0-`m2a%SIzRtm_`{i@rMz=JnEPx2nuI8lj#W4iQTV0=CO;%^a8$J)}aTxw8&> zJr%zEvgDTe->3lyKCbaoW{3riA#+bHwyLR&(-Yj@E}^}Pe zFTQi06I&Jkpao@99IA$cSx%)J~ zefMdeeB}(^dF)kQef$vXe$_zRff#I65f%r~MO;0lG>Ooz z=-UO+2g<5iJGWC(gpp)n2V!t#jX0O_Xa!;mlm?e_gm26dtcQ(H?S>4W`!_7aDUp13 z^aHHB&3QB_O5#YvNO+Js58pTCMN4G831b||gu~8x%ESmG7;ADsgMldYsV5oFezRoR z!^a=J$Fx31A67KyKcX(i_`MDa!8;*1ODawvX3Uw@f)8I`@Z&fCoV#znmfw5eHokn@ zNp7ucAW-*nY5_vaxKwnIp!;C!dkP~IrDLMxA`0LupMv{ux{+7T-pJoP^)}ym?oD>$ zjNXn((#xd)jsH^=CCUsng%*5xgxR zn(P(OB)pV0b?J!CT?rmp+>sBUNmQ#m#8L|}7e+eG&_;A5NIoQCh{0>TwOEpkSyoeL z16Wd?V*&~RSFqaI0axJM7~`~ulu|)qO3F#iqWhS>+~oUjoa2YD{2343ewsh|`lCE_ zGt9hj$~k6eH`vl<{a;DI;d@76Dk_9=hFas$%7Wv7>kp`;N8E%U z6)UgLNdbzriY=5S9?OMJ*e`1K4ZPpOk6(*?=h;_z>79>Qc)`uCB!w*&-s-5|If~Fh zwlk(q_hsfGMF5oq0_x2c^Z+|+=%3qI7>1G0hf!XT0>^Ym`xc9Xyu3-tFx<#JqDE{ zI`A$aV?$LNLc7Ca_hYV^6nx<`r}@1H?&ZE4N{&}rJeLBpIabbf-|PRUGB^WW7x7(B zRh9%IOA>P#F$aD&hwr@bG2i~_&v@g53*b&coM6HXCl!UHOfYGf(bF#H*c7PDlKuI4 z_IExZaROq8t)`i{q4-rbQYZCngosH;w9qN(2tV(0!`H4&f5Rj$uaDZ)6g9^ya5b>9VuG4_RcxOZ?38jWyIxO~9SYv}*zA&yXb+<6a`VMGlJuk`%HYrIi*XJ^m7jf| zncfN|&Vj0G9<~L}l>~9QxiRpbopQWG56&QylB%i*C~c@NdO~-BE!$CrB^xI4mHY1C zpMLdG?zl>b4b%m=|R>*fV1Pt?7ISZY-yk+$veUj0@f8``zIk#s2Jpaz--7K;VO6eKYeg%;@1 z2R6oF8lh`e$f)}7yM+9Adi}-}&_`bb>g?zVOS@G0KTKM8Hh=Dv^b20YO*VYb{Mk!> zUnF;%qiSqpIK=!MevM!Rd>T^sbOAA>90RHeKekIb^r1&=M@kivdI+V~XEq_;kX(h7 zC1N*dQqS37*xUE~AOD|!$^Y>8zra@?x}KYk>4wtyC8?WJk0+GQq839vmG*lJ@IA%m zgd+5q6lh#zOv%aHPjTN(r})WBXZgY7&+^RAUZkF#rkb6k={oiRV$jL{n0{))2k=Z+%a!i|T9) zJksnuyic@aYEm|V3hOSkmiKuRPEnJ!23>o~6pF$87If1vnvsq*`EXzq`xvXG5)kP%_`wOqNYPO~CW<5!2`Yh6go%OC6)=AIT5i4Z7=QJ|tGv6r;G=^BI!4sx zgwghK=z8cpwh(;R(>6ZnQ352ttZM!z_$Iuu9etW!g$kFGP9< z`js4c&SG}3ljP^0y*wU9V(vO-owONji&3$HqIyHIQK2g&u&rwQ!oat%s)HP~fkE}2 z5~5C0tbWr-WMlgjd#j7c<`iQhKYa5%PyWaMir;2k+v_O}NG?*035(&n7@@S;j*0yl;oHx>$Mf%=Wv>&Yyb3oiG=2keBd=&90jsr zSN|?1D78k}&mI%~;Z$!;!O_Ws-W$4J47Wi{gWc2|P7MVO-+}d7A`~PuP&U+{9F0Xx znb(<83ujkCQ9(7%@*iCTOktQz#)u@^HW0iPX4VOHk?7hTma7A<*{-ChoK25t=Vp0ilObnJ7m!z;lx?N1)Q6|xpz%WPr0e!QV9bFNdl1>Q+iA?mm-sMPc zrAuYTcJ4e6?xZW;hApEDCEUHziuAhfgrmWk@+wZ@*)A*})p*3h}Xkb{?F&nR8 zO@q?rwV--t$Y4IaP(mj6; ze)zMG`Tp}imk$8kUFpHvG*A7kv?Rmw_dLxS-ZY=0;s>h zB&Er(tpbDJC+7Z78m7gC`n6J_e~y@QG5&#THOMz0v!~-41Tgrdw=~# z7SM-Nq4-OStvHyj81~Hcb8^|?HEifdWgl^%c%+ zbwL*aqn*tZls=G*#W9mba6rbH3;qK9_Hq$v1{A3V=bpLv?! zy7vbDXTSehu61LaU(&UEm}ilR0cw+V|DQU!Yps@VwFb|jW;RW;+vaPs~u zxbwzGc=uxDUw!*EUVisux`P8wY#c*O$@z;Pk-9)N+oTO1TRU8B39TU(N@FM_DofQj zI+jhUUnJ|og#yG9a2V^10apEul%6)jr$PF?Bs1@R`A?tX;cG{1GGZqL(sGaEvk8;hk=i!nD*=zn zpDZ|Im`Y^RIj*^GgZs8`=E=CjbXrmf^rA*S*Y}J@B}Njfi@RL2QSzC)@8oxGxt`l6 zD%Th%DE50zwX9Z9Sq(#w9*bc%GIXPwkJ}!q5pi7bmWQW)2H$(`1K!=~cyFhn51W{J zhAS$%RRi-mRQY=PmejXM(_-2Vx9Tyy$7Q;P_i6%+Y2b5b3|-%5?57rT8Uvj<>`AE) zgAs5bw-5i$T2m>PoPyV1Bdpg8@)`=6!7ny*eodYl6-1Whcp3TbeI}hB-KmMKDxXNgnTm|3*T~JNCm_!hejS+kO z95IP{b4)I{;$ya}$FWq$$72tix*jb7Z z1X^Md2*%(<@<9_MYBNDKR}hUQ6qbt-o_jCw+Qk)5y!{D3e)Vn6pV@`k6-cp3Tnejs zqVz%`7V$mOEpchC2ccXvORs5?1dj)3}wMiMIo?Qu8kxQ8PecvnjYGADUfE5m+BoCKr<_4`wI=qF-x62RW<)-m~d;twYH1*BDJ_ z5)k8%kONnOMS6>I2C<1CmH{qTLpan4uo`!rWvJEgQG zu5h$86p~1Ix@f5_1XHNY#Ec*stf|?ukv4WLBw)m_ajfR1V~%TYc!0-#+VK6yp5&bm zKSA7-)2C+4JJ_EuD6MvoeIIngC`&{PtFD3N3R8}&{yW;+vPw=HXM_f09vKsNeho8J1`03j_ymPVTwfA=Lb_(@z3eos>-$p$URTJ=Y@GIzhq;H_lAt+s^ zV`Z;Y2kAYDE+=~``C(wn9-7ts+Pte@7Y?Z`L%}9o*1R};j?HisUQ-oByNiRqRa|EJ zW_gtuqBVJaDTxDR!)alKD^%W9I4CWq0B41|swkYHa1E<|#mVDi#?o=zwtV?BxABj@ zatqhhy4=qUlqfAEnjWzZBZo)!mITF!MOg9i!47V;iK|AOY2l@};d{@Y;l&SjdG)=0 zLSNxVW2U7ebt~ekMOY%8A$Ec2JB-XpX#ui=*wP1&_?8qJZ1VV~!KS#5j!&ZT-HP;# z#F*E*=yN2xUvvCrkZll;&=Q7>gScK>Rn3vZwHQpFS}>+O=1ndeuYZ|&Kd;rl$oqY` zMw9&vHg}<;(lU%!c~&x6+M!b=^(_r-YSle=;_w5*zACYmnghiO;u1!BoC$199Mh_$ z-8+xzm)w2(Eqvv{JNO?wd@U!l1gdFUTwIY{2?!lt14GvQX<>*j9|C-Q(-TJ%5^!b? z-+1gNJp1t;?;a%1&m(60Caj&1nyAvq&TEok-_bRD7*?35h`O|vKpiGZ4pWk9SSD7{MD(TzF#IEvh3P8YErzEn31t`@$ek0&#J8Z-5D|vu|rC6^j!YP z{>o_De-B^3Q3Z6$G7YU~!)3q6dXRB>5jL=bhduh}OY)|iE;~`LInqf_YAK)EWAX}> zA7W+)li|8^masC6Lb3$k@I)(?H}>t8!ux<$2fh}bzI!*=y9}tN!#^=pgd_)l%#5+ zw33*z-rTN<+=A0iGlh1b0h~sOB8FtufcXzeZhq107ZuSkXlwHUDC;RXGL1OAejFx} zuVq23)3x&KD|bq@Z!LB(&KX@pkNm|QmTu8wBKVNc<5slGsRDAUzU6yMx&{raD&v`W&Q_qqxc4lyLZ-3rV$&Ya^Li zcT*r7Vg{3TpHhtZFq#7&EZ`HyBrqWd!DP}v>WEm3MD6Gpqsd%W4K*P^QBU!!h%+n7 z*weQSUFa#Nn@mpM$BFMhJaD<8eYk6-!KjYvP8@@&%O*#5KjitUJmB>SZu#A6=iL+Q5iswb)}iF1Yfl6PVa>=IjR? z-yShFdpvUcr}>kwJjmTAq39tUM7CxIPluMAO63Xbew(3-o(ugPscNE~5@%b?f%oR{ zji=A^%_raFtqYN!3D^_ZLMUSk`@0mYJ*4jdi|-utrFwB>L6QYXM~Z!>LG{=eapLIP z4ueIKA+!N0GAeMm7FjkEL*B#ufMLz%zx820tvk&!Jdi2n0_;*h%29dT(S~&#WFMC& z0Sa7>u^aw<=s_Q?vxYUon4}#~Tjp?&Ff0-XK?~@$)lCy+wb+edEpA-nN=KB4l|bPV zo0C!**{k!&YRR2fALr2r9^~_%xrrGl`MHMPh%E zrahor?K5$rlbgQFy!}r7SJ~_rhNfN0kyiuhBdV}w-IdN*)|5=^PiI(5K-h}%xm~bP6U#m z#j}<>S(lrl0`_Z%D>cqI_&}i35mf*a6Qwm+9BtcU_1oi9MOqx-Y>BlM2SG@#W(gGA z1*-t(feim|i!f?K5z0c8mop$kIa2PzXNMU>FvJE+D)D_HNTNo?eIW9Abj4NW-EYhhJF zv;r2kWQk=3tf<)mp8ufZd(XYY3m-2zkPYm{nANhUUv;<;aCi!nFtNjgj;>un(^3%- z-x0f>*fpwmPM$~$(qnXZt7Sy=>#znba9B4U%+Tl<0;$kp!{u1m!|Qt~a}>;}#jF)>2h_7ruAD@#_P$K{ZfkYR+$3WWs|bk+4@ z2w0*83dcbcX?hE0#Dpo`yoF^?;a3!N*#^6Tro9z!0w+SZr)@L)B3PNgLp zK`lq7A8BoVOHqxYx~C*M5e_q-72i7z`d4BjwQX zO8_HMA27v?S&>-uEoJPvvJn2GyBvRT*F*f*ub=1pFMr6h&%Va~!9JTCn`|FH#@=q= z-1!4$(_;jm2u97XDRzWdk$i)g9>Wr2G)d8zE+;p#Mq!c3Hl(D*b%=UDgqR-);Sy!! z&owXB!ma%L+ic>Eq-c?DjI~8RoEQ*I5W{pN48{}$Q;?|ixuk+1L|b9Kg?7&7Y=*5T zELNU_)dAIP#%N>8s4(oG`2~N$>~kFp@L&N zOv1z^WGT~b7b(gqD+FW4j09W{ZWZZ6hj$~Y@dUG6aB$%w#pE~}HPi?k?Bk|Fa+VfH zi=(5U#c%+81pMqg{P4LQUVYfBq%nygew}7_xVHWhuIzAC2icY6 z_+%N(*hXXHGiNuMOwq_FGO-oOS~X@Hi@1>%)2;wlY9x2*kiucC#T7!^9S{X(TN9?^ zMDitf+EceeSd*9CxZ!xKb)T#6- zfDxyU(-_0B_)qy?)=Xksp?hsADK2QS}Who?+rnAvC2&>*)_PU+9@ zzv-8+-@m$n@UZAI*>H|n^~-r8aoE=K znOkn<_a45N&)qTM1Q45!GPX>{HIu8aq>r##^f*&cnF7g53PXX6^l&sp`t*oqGFW~8 zJw1^^XU=12+CZ}(NT#Qdo=Img-e9_(;CEStbHuodDSAvXrVkaVFG(R0L(ZFs35mT* zqGHGx-H_!RmtMaxq&8ZUYZ7yKtqJQo=CCOk)~s(yI(@gGRk9f((T+T)*^FpWM4ibK zi~;WOi`VL3&)08E0sS9;d@j9s<|C3oXY>F+Tq_$@w;Dus{6|x9hS!i7X!7amvO)ja zMVy9Ytl`fb9qA8au9UJdX28Hi4TH$vYX}8Ut+tNPl8L$a)^U~=bykaq%ti+NyfKj& zdd#v_@nn^-w!{*#Vu>lTTsDYpxoV^0nyYo}xktjkmf&|clN)0G6NBENQa%6f(o|3GIou_x13jUgwy1g1 zTA(Gx^l7JE)14xLzHf;cfk-fGr@OUI-Q*HUc%pRcSoANZv19CnE=GL2 zqV=AT4CCo>ij6B+woAVK%zM22##z2}|2;f%|Bc-9Y3+8F)-e{Cq(q%kPUchizLkg( zVOrRX4(mv1NuLh*$G2R`eYc$8`P)CmcOQF^=U@Jq3m0}MM^|#)wWpXbI!zrkM$M7Y zK`8M+vO*9~uvruB6UJMN7bFTMWlgNf_r4gSQH`v29R*@RI#NK#OTvl<STdFVv;bM)b#C=KEPuwV!7b|{I4G4p<7S!#k+3ewyT6w1~!akgG5E5E=xQbIb4?&0yN8p zIslPCZofb=-K39^J_f3yWL8v+95k&58rT|>^7Gi?*Z~$8E&?x~hnGI;_`wUGu%gD- zSE$j?8n(78JeD@XsI;n!6~WXa3>|6N(Jyw{U0tLI+u55j1S@z3mio|jjybtb*GzM` zho?Y{fhb-(V7b8nA%lVrs~d0Sga{B0@IMJ1!plvab;RS z7bNSDq9i#3g&>7s3&Gli5zp~ih3OB7J3HKU>(zYqx4yz>Zm+o-m_;bsIi|2o>Vin5 z3v)z-$`mU5!O}#-G8tN{o&Vhc7h8DqL-_XNuk+-yud;{*ZgxFY>uHxQzS*b36PGL6 zZixg>Wehk&({}6}EU-zDbEy|37Fcqmc}&CzP9j~eM!}RK-O3X}E>uMKjzNR2E1Dj5 z(xCk}c}|yx$>}fNbJsXKIr`sn^b3Bjc)R2^EW0A>^)zO!hCTB9%AwL-QFO^;Qts~x z7;$>vsKH3Fn1uDPQAsPRi%$+xRRA4@iHuytrk2VqIXN!4X0zl!_}cGs&rLI~AEE5= zwqbi@F_ieWRlajkGMW^C(p%dO)p*x%v4>XeD-;Gs)>B(UiA7l@jyAR|sfY=zDJiRx z&>2G05SoT6^b~!EL{BY{3d16_EH17n{7DVX%Ix%%d`{Ord=^#f9J2;|xK8?pniTZe zh$=Z8E^$gKEe-3sW+FDaOmgHn zOaWa0tJMN;U>SQF(Q%1QiV>^2d=JIAB*jKI>}=|Z=tRg_A@)7C zaKzyA;vzZKR2VYhbxbiVD8oYK*F|^CW0g37{0H6(Q4Ij%F=BN=KvR{(I6|^&SQDoO z7ab->idca6G!h7=1#v_vNv32)B3fZDwCo(fsTovG%9cbJ-pLQ`Ode0#t&cX z`RwgC^3{j7I8I&=0G}dNTHs8J6N@+7kozlTSYg`(rpB=C3|EwnbeY37Y`V9Axh}c3G;5AW2JKlmh)W09; zlC2B1;p?N$tTfO;M~2zEqUIT!B^t(R5$%L=Y4Kf8x7s0jgYN~&BSB*e{kgmW8xWUr z(=8w2t!jz8AcWRp3xhaIvJM*sV+)cOm32_V*zr~uc=z#__|wOp1KWq5G^Y8M~ zyBD~y{18)A`aY#VQE2hh_7UqGrf~GDMp1X6MphlHdQ4kFFa*D3Y$rtT@wB;PzuwVx zSm3GSd6X%B;++ER*G{tE<|u>3Y}$3K$48&_Dw8G7oyvs~!Xh5TGF_ z4j@Q`2n{(R*<_PVcC)L?bXQhYx=Qc8iwqxe-8pCPy__Dtwa+;bnbquOJ64K25qWRK zJ@?*o&fa^i@B4p$lLXR_8ZLNv`^wRWT(9uYv;R7iY(tSji1)q6+NCKp<_bf2yK8SL5sLKbxtf-bK{b7W1etAv&odhg|~KG zMlCOqXsL45;ZVN3JPn1;M=#3IiJAqPdPr(OmxBC z&K}ipgBZYsK&hatO5t_ms6)er=|#5IkMOmdCR}&&OZ=chz1(VX1{WDsQ6=G- zDe)zhFoiz7u17oa-+SqB(s?sbsHn3|T2JMW0$KN}=EcP!K9?#(Cd<*LJh_zJTj;NY zn6kB71mB4-a?B&@n4L-V%2+hXVy09=X$jm(CVL)deVvX{Y$v18MHJK}K~xs648h2A z3aR90Z(iVqxBdmUefk#u)~|h@&u$5la(0#&=}1{uL_8e5< z#@sf9WB1kEb<=Hp@2N{X`obH$eRdnA70zhTg)~D+%jh@(^}2`$yOz|oVt7$liqQ~T zTAXv>A%;W>8F|bmRAl~ZN`f*;a%ARf3h6m>G|3i&Jw-=qFH}UCr9~duD|W#b%pI9V z((E*5sbWtNlF1^pA~#;y2_X4}g1sJ&a52#MmihiZbzM@A#%K-mG-rI|2%#;wG~4E> zm)~Ijy|>soevmI+f1EoHuVISZFPKD^lPZEu*@rbxP7(`Wa$-Q6KualBg+zvG!c4&v zFJI#KUpmF}GtZgzgM{NJar+6QG;Ql>n|*3KV6wSI-Fl|GvU#h8t41Pvjq(*Sn(WZf z$`mF0-fN#oA)#H$QzaI3CzaWteX$%R>x}-cRlQz>70++I6pzI`8B$8(ilZiv6hT(C zLOOjcq>`ixhLcTZT}K-oZJRyj%K_RNqP6V#mTFuRQeuDaGS#r)_{JJKHOw!+$L-f2 z_Jaed%4Eee(?Oo!v$24VjFku-Ge92q-VE3fehR2;!j|k_7#PAVDW&cZ&!hP8vG) zl#DF?i#ebwB9l%p{_`rx+M%`1PA4HdpTs;R%XCBfqN|tP|Hr8n>gPQy-;)p*R%J>V zS$nmdTb(oz7S2eTMGqw}GbUl=om@@ zcm6{djyQDm2&vm)cJTwE-{qDYkML_>`XXPu?^;fdpiFa0Kc~=PfsK^K7;A=jG`stA z4jvfefYVdhOHho3vT?@4ySwo39)Fdy7ca5@!4B(9V&1`e4z((*(0EMJSQW5Y$QQHc zd`ymxDOz<@h@jsgU{Q)zCJ)hPgMw^37+p^7%#(%u=Be!F#o~M>bj-Jpj>M=kdvT>f z>V>_zzLDBS_p2#E=|$0arJCrZ+cm)OFO2M-dIw{Zv&%CpE19~*V zN6-1$9@iW^$Upf1{7Zgs{UCqu+h61JcTPADT#kW*>+4tq@mB@7F5%{L5w=(hW=Opz z{7VlUweXt{9pj-pj`7Ejzs(PS_A0NOeTQyvfZ=dVxv|D<+H&gh4s|tTZEcM-Z-~lM z=z>;9jIQx^NW+-@vcZ|^Bjcq0=!@6opPU4k#VH@**{P4=U}f)7d8iU(tQW>yaV~ol zGjqxG^170GIpyuB_eRY-M2K<@eIP_f@QUaJO^G3(Ov)J{N(75KTN`QwvC~?-!i^@G zh>nI}vUj+Nh+#zLe43b3H5D3-F$EX)9BZQ?kG}X0FTU|EU%c&R{^r9E@Zd?si~%j6 zaQJr45YI3vLI^N0Ok<)P9T1gyknn(US#kdwoOpPPFWvE3{^B>)%kxKou>zaZpMIECt~xt&h1#HQ)vp4st9I8Fa_3FbmrBPYzaj2cMb$Orl+Hv6c8XLudOkOQXT7s8i{?FMq zuNWm-SxTiL7UT&$*2>ehz&jVt@S`VQ;D;~2%PV2RrDHd9p(t@JD5qFcmTEkt)(StH zvA=VUl3)7r>+M@zz-GH4?n%Sm~nhMlyH8dR8K2)0C*6-8O2ZG|_1ChpLr zj*ZDWTazQi{XNpf3*3Cog!}J*fM5IOr#Q9_n;Ovx5Eu+LF=)JVgmy+@HDx82=`|9>g!39CaT0G~Dc?9ixO^h!b5Px-J*kIr-7r#eJfBzAIV1snW8kS?pbX zRC>-YxXLj>)4Oo2q=+t5yel79)@Fma+bpd{&BwT7r7ONSA=J!$eSoQ6L+cq8Efp$cx5qm zL@$qsKG4h@k-%UuW-=b|+T}AaIY1Z{bijxE@bX)pr(S-GmrkAMoG*zumN3x zQXMh2Bqfs)u}{vgEvGQ5oU$8IAbL*-Ml2zXoa30S>U8Xzq<%6Q<^0Ex8?4;?#I$(( zddYb2IQEg6 zPC+y*W8OHs~Jg}eHEMFP-^8Z4a;?9S%2amZl2NjaJD{`Nae z){pbvp5q_cEm7?Fquv{P${ZXk`PT<F{viP_vI$RdeSFbA{*JSl6ll@1PDIH{Pv{EUbX3t_A zkVmJ{2a*Rul2KarLsps3M^XeWXaHI!69Nbn5KT@HD__i76^qM{|~h)!bp zgtF9=LwMua4-J5DV=o0bqFDwWVFthU*YSJA3O zm%J2DR>P>4kO1o?o>n6W+QJ{&$jCVe8m(d?;g(5fF)S0(5KK+4HomJF@Oje?NuiY$ z*9{OGJ+dMlNy$`7i~oAEBuc!}7?m(aXNzIs6Ax>Jv7Q)agb;|K0FyA)fbqa$2n^a8 zCoFvVj+^=ATdv{WV-u7QG&`3m*ESc0q?DmLH)9L)Op;baW#s9ne9Fa{i@Dq7+JhVX z)_15?3J!nuyoJdqo z+=2%%-2PC51=YfHd^B05AVESN;e6PqYDBRFxgnK_BDuhm@O};m! zpw`Jsfvz>lXrk35V~JLT*Z_J`Q&tnYpm8qYy50@RVb==A;{kOH%+H_VP^tLb1Gn;> zhwtWr+YJ*9H4#fIbRQ=^;R%h31@*Wl#ujC2I$$5sX*2`F#RRXu2T#248jnBqGVh(c zOp^+>?s2QBoXvDV}3+B-ep==onExYXNfc+>gu?64Zt2tw7z<5;SGQJRcU6 zv=rQeN~p4}YKr}IrgzPdB03SJID-r<=#LazkQ>sgirv0=R(j?B%70RBf|fK6jn?|A zHFrtd>G#a55t7V^BdHqn2&DvUFv&|ZMI;pkrmonYPtjJfF{vs1l;-?9tlP*v*A{&J z-iLYc_UpLw<|7mc!W(^uQwgIIl`gqF7blxxITU9OU}wLjD>ZI&lRXN~MtJRAc`fp{On_%LWJPtF(Jx&8GV+I%fFGY z1C_*rP~0~{risR^DIibfR^Pi7TANBjXS=FC_&C7t&wTWVH$5nM)z_1vE-ETpGbn`) z5?n35Vm ztJvigKGCa%bmovrfL&g+lJCDsC>t3a6>mm`j#f5Ijfmc~5H zXDO=T;}q>mDcWvISq=e>Dy8V1`-n>klN7q%VyA0Z8xJr#@q<@R@uQdi1)sg^E`Ig% zckrcaN6bk~gYfbyZ5bHD3R4lCV8g)HLPiaBvIzdjWMItH=rN(q&maMN^u4W`BB(gzTz zMLeySk-8CHJVr|pk2X?(YfrL4iW+UCnAQa`YJ551^5siV*Q_79h1Bfx*REpGAEt-`{rKCvJ5o-;D$&g57?sl-L;M#J?=JjyL@nbx9 z`!Sw)=?u@lafGz2^`Xksifzq`N|;HGU7@4t<&+-L*pzU|XYe@-zVb9d zC>%>mQR(>8!hK=Yfl6T(d!)(>@fE9Mc4z1tp;b4eeoglI8oJWP%%GHB{GOBo8Y^0d z{G$s6wTe_KqP4~pB|$4s7kTolybGB7z~LNG~{7ef;6s#ssTK4`XWDm`ZO=Uc9FepD9k$b`t__2 z4{%`)DojzGmFYyTCKH~JtA>7ndPM=95ojrJrNCJFZ^z}{9=)vjNwiZb(>TPhIV@bD z6uIW;|AI_?`X+O=USYL<`3pRHwo&Y9TM>L$(9A6JDGUoFE8rIsfc|6@(EqAQ>5aXP zt}=91b86lJ8m|&*SO}Kn3~JYc^F;sApYbPAIMh`O!0N}3JT~jRuHaR2Re>G-5_w+v z-Actw-H=jL#Z2K$X2ESzJr%Pbt1Z&hVn!HpOmfnE6oHnHWoa`rQJM>F#1GZ`0v7`H zU<2rwwgvOHrBz#`Q1ZwtXL;+r54rTUJGu4nkn4`Gvr%MGL==%tsUicV!F9wCghFEr z*2WswCFV0YHc%Wm0k>asGk4u^oZtJ|YrJskL#EA?YIKMuSRxuh~kCTyT^&Ul*^S8p)%*RrVE)ZSP z{W(V*Q<9)^N?T+cVljEcQhl6m1cLBwRW8H{aZ!+~s1^lu?-QhzIC`Kogi@$GC=s<8 zNwCyD5OofbFdl6SnxLpB2Wb@ST$rP^WpnE!+p*yX&%RB1dWYBEImv;)^)<%F2NWq% z8cU196B%eJB0BG|Rs<#~IVx)yD#biZsmzFR30t?o^#_k~>xsiW@$$R8`rdg?UARDp zB_@Tf3ydD%VomVUgcx0tY$xsys>PU=q#NP0dj(#4o)nj27BZht0*!3GA9C}W$o%yj zr;Ip+ND`@VGqp^3A75{`OM!)#7>ewT7Ef>8x!v4|+1B}E*p<0zOW*!A$* z2k>wH=vkh4@ohRiX6A;3dX1zkZWahGP^p5^pkQxjpX7shdi$LC=bc!ShE|H4=+Pl& z4|OSuWer(Q0bMZ=bp-w?FD^U!_Q@tp^5i(MvG^KlanWg|^0-AT-Bce6 zfrTW-@qI!YQSd0yftW=Xn?B}dSS>CM1%ZT5kr2e%E_h9;YwWP3nP0%FnivZRnxqqE zG-BFzyms~i|A+taf8q0Y-^4e+_y7;xeT?hJu&%|Rr)y`-_jfq3u_hrX%|31p#dwXP zG^hYYfIXKuY81b5?~uE$yO$rnc%DaIKg%1t7umBL%*_C-B_)f&Q>K8kT}MFE{r{g~-6%1CgAEI>Vf%;y3Nd29~!5L71R_|jaUt)6FCSTbqEVojq2 zQHhztkuuFA3qlBaW6LAzl#x1tIs1i93C|NrK1?X#I0r$Y#hxk`8YxM9ai}t9x-Xy& z!FY587a|O5%xIHRCHA{1Q*SYLlV-o;nK#aGcE=Hq4=6`tAaY?kV`DUCI={fEvQ&0J zz~Hb1B{umc1%^iB!Y(l=4%i86n{dsh=Ej3J@cajxeE)?Pc>nSq7cb6nzQm*rRIKog zBD9Hma7Z=<+oJRo<@ZU(5M3f#M|8bUrH5cd6%%zvpe3SvF^$RMO-&YEW^2HFrclNb z$nT-4MIfjPlqn^d&X&^n*a}q?7;6L!Eh3Z(RT^AblS)e{HO3?+<1s~=lcw9WyJr}> zT|RwylP`YeI=*n*VXm=oO#!0>sfDg-p_Zb(EG;g_Kr5tiib+P`K~)3{A&c^o3ZNT$ z4u{UpLos$#dO)cRgQ65#m{(j=z_n{|%YX9#|MZVvWsA@Pc9H20SsmBx(%7a@AbhYU^g7)~r(yAeC31>aL`raN#Zk%xX za^UF~-l9uGydI-Wf$}~4<}fkg+6K2b6RJj#w7}#g0W*4s@&O&4pwh`@n;|C+V(QZY z1NbgmX9f`#2boC8M=7vX4$vUD1!r1idXpS0qOXN6Cv#>O>)d~2Z(J12D^y4=e*G!i zg_1qFl`^t&<^UA56wZCbxrn@1e_v0^(^u$J3^1@QH7zaTIOA18NFIg5nug7)p}p`f z*N;1X{R^MsS3Y|OH>|-RKe7SfQxxz1bGs9Rn3s3V2%+? z&uv$dF98yOqw$M^IrZl^xs0yK9;VWAcU1k)r4Li-o1`m{puboybpGuz*BUX2;la5x zXKC9xXHK8Pw=>+{Ws0u(3;n%+RmUfyfZn-qfpa^TIJJF_PIZ)Z&Au&h`<}hMz&s6^ z>oL?57#&=QAwI5n{&^IRKM8UExs;EUFI{<|E;~fAbJCeIkdc|_vr~j3rG9}CpmD+4 zAm2F3W^-#uK}2PXUz3)LWz5}m0%mQ4t%g*}FdpO)_wI~V6{yh~(P^A>q)t;%V2c4M zX?#pzH>i((ipSo&z>DwyA@`g-%y&M24`03a7}wQMRAbhwAalnb4-_Fl<6v_OZvE0B?!WC2KYrs9|L)1R*kwXAYqVMlW}N~`=h3D5c-P2P&XrOs zdxR?D%3}lx$vko$awl$3I>&KqFTB?r3$KzP_W5{93g)B(3#-hlRO74Hg?N96$3SL@ z5c-QEkLDJOV2lzg9laE62|;C&LWP)VJS;_X2oi0y5iWH`0F}y_f_?0`5uaSNCuxf^ zGV0Z~B*a8$Jo7?f3xg_#kP6n147qsjbu`vY;>qkE5aB2(Wn_+UNM$E< zp(J>l4Os0`c;dx{BB@U3FP?zGAGAVgL&Rjy;1Z<^ zk|~5sUQ{`R!-6TmN~5K$l9=pLkqSey3T;(J(KJRmiCdmurkJ1Sx*>e=<~#W6J-2Yn zk&;bd-Ad;ptRX^5;^g7ur?2q6;1! z6@@LNK$ts7n&ayg2KXPobt~Wa)Ghq>A3ernZ@!5cA7-?EjGf(Wj2(m0q(b0Dok!~i zO*G=$s=Z~A;<}f4_Y7wlk2E0|l*&$b<+jwv0(>@e4Paq%9tu zlLSkmsYrG}DhFW8Mfj3yW)#M=ZaqUY#i&ahIc)j*!}s!?FWt{ATjGRgvrn(t7(;9c zu|um8GaBU<24*cd4W=#$lk^laG{~IK2IDc-3jUxw`PMu89 zTp~D+4jvOc+Iw&z`2DQqTXsVwm zs6{Z2QbB&JzDiew#7Xz=N@!44Wjd2WC684R8(ONg&p7Nd*+0j3zIr>q{`ot(WmB>Y z$|#Uaib{C>E??WFl^AORQ7HnJeJs04(OS5W;PF=*zWeBNy!_6GbZLmS2Z?D!vSWxf zF|;^8h2&Ae5{=0y@rpUsTMAO_bk*OW@xduVNmc9|{InN8~ zO}2&?`xN^#j|+lc zF8NpTb5cr#7|>>kZuT4{?>*Kej4}AwVv$WV1#6bTlnVb8p^GeZ@$DR~95zItqA?|EeS>+s%VTex<(1cemmfZIgunT<2l%D?kK@o3 z#TrF)7!~Cr8&o6`v*00E1{SfvGY(SAhEl8_GTb^D@tyl0;D;|==8=~^;EZ#GB$N(4 zp3vxhl2(L}Fh)_(r#?wX-_vtK2&9lO%3w^9!HkG5GLNc7G}?-?z2`Y= zp-aeOrWOl*FBGLmp)=pC=biOx^~6d8mdE1GIjk`xABax4rM{a}6&1lZOYXB$nIEhc z1-no|GRl)IN=0mfq$8m>^;3alWTdThDI9DSP(Go<6s-$XJ0VpS+G}F4U=6`2y8TY< zx}v23qA^Tc#sBl4|1OimC;0X6{4z%mYYrQQsRrO$LYPvU601v6S>ZC;s8BLJ@ScfE zY}%5ws^r!OuIF2~UeAx8d5a(Z>}_5-b&ghb6l;fZ4TPvkPC;iW&4{urpsn$01}4yT z4J1u5s7N8=n-*M$E)}tB0ih72;7M8vJ)Og8j49b#j#2=Z)8k}btnFa)S7%HarQ z4K6n+wk)V7Blca3Hi^NoCKZOpHIzQGHK^D>^8pjT&wVGh_>Iqhim%>Ku?3XQQN%gW ziZvM}u_)0DAVT3GG?Bqt!G0*1=}4yor7F1G&Dkgi`HHMDzsFpi8{qTD6gU3n=lId<9l!U~OT2jYG;4!RS`B;ih-NufYTapQ45po$u83zX@Eg3uXKbi%03scL68R1QPY+Tgtx z>P*oW#aawwjZkW0wL$a>tVIvT*s_rCNuJVp>MAf$EoOd}aXICeK7SW~`&Yiitw(B9 za2&#+jThv*Q^IYx15lbS1w0XtrUmvZ*vw;($R9`#+F@{X}65;1;KBX!w?R-XGF!$(kPn=k~Lwyu1O1X0F1Byb*6f&(b%H(NJ zMw^YziH~;i_dZr#X}QOO0$bL!#uAmn6ctLh_$0h$o1cSsEk#*VnUX0HhsM?r);8GR zEr_9IViU|Rl6F4e`nAZXubc39zV;Qa+caFW(J?}ylQe)Xg2PZ5z-pW?=v;$J23rhi zkXm6UfE&Q`@51l=;3*z|^#j^+0)vyZbIl}dQihV?3OpXt9HSbPn&W*$l@(Dr3gbzB zPV!J1F+fRrsaNO=%(5&|O5wc6*t|!ij7~4?1#>t`Ul-7e2(yqdUn@GT7SmiIMwWlj zvX7BD>MMng((>f``?DANCao7WjHKx*QwL=@0!Hbc!Dn9b0$87kE0M?_FQqI~wkB2h#^OKhi6A)@eN=aixtucv~9#uggt$o9s%2v^U@}Y;w!t0nfa9k!RmH z%?IapXzh?V>Zb%TzhClxoBUC0u-0O&SdrOeh($)Mi-eAvHnhTJHFoLO?Im~xA~8z% zY9E3kAvn^&#Qsgon@A*}vS4Q!lBO~@aHR-doE8O1FJe*q%RxqNDRX!M!piGZi0z8!8>K$zzm7MJ=Pxs7X2JF(sQ{p78JFs!&XQ z;@yiKv%Ska@qhmpeC3M|@r{SB=eiA8FDeWbO?2$`_6^6A^}<#(Uh;rAbXmJcqU zVr{rVvA%`21Lm`ieIH0wi5(jB%s}Vp<_(?eB(y|pk}Y8nNzReHh$8Xi*PQ7a+Ka16 zOv~N97bYT6+qyCWMr34KM6iZr4d?;UjwrXbL=ZjQA+~#r#s#(ZxaoN+x5r4&`24-s z^PAuK5)a%wmL#-h%4VIIT|UitP(igOBHO4SB)m>IW$mMw%WibSTjgSdx)M$YhKpwQ41k1tYYNzPS=ffW{aJ>k3KQ@j_{g zg?ZOd4oXyg?Q8|Wv;ioGVFhnc?qXNpvHJ`jkE04*} zDD;yTbw$j~N8L^Or9A7XRO&M%!UCYtD|Lf3QgPup)B^;)6GvZXT4ey)U{*A;(&#Oy5|JSe9Omd03mf&EC3>1=ST%2!n>HR6spE||Q-u*Xx z>&y4^%`aTf(J@p}Gt!D0uqrXB!B3%eQ>sx7l>+6!&oN<-((iFowZZXgM%;7FHN1TD zah`bX6wkbNii_{RL9Oo3+_Ah)vn-$&(*&JI-YE-`bjnJ8WHj9SZ>PSJ%?OT4Xy1ob zgvF>#9%q&UP@S$EK`&2u{-hsN_W>(QK6cN)T`VuESH#CfBla}$D>V5ZO|Gj#} zrY{$TDx>I15}}gLA`@+qsBsyUn$VGy!3LevtP(LXLpBsP*M~XF?39H z1^W$FS&GW?`9pC1SC8?)t;cxz^hN&X-~B#2u3*l9U?+G})5etfF9sDn)@tmqCi$gM zH#m=XURJeaq!5W2AzN%JvdO3(*;GX?pi7|!Sc_{Ks0K3gHJ}SiSzC%qlWfB2K-bRL z9M@d4v4-0@M|o(yKKnrVDp{ubpYkRve-XN(&M?zOMgQ^5H z7w2$c2kasEpo23ly!y^1-g^0UhV3q&y5Sba3RH}&Sqwii(#M#lx3N<7Yg5H7Z}xm4G;=29()7VWe84?G#z8M z(jp7Va`3O#7+YqPQ+TneuqZ2tXVfF8w&>;&jAyc5Q7BJp&tTmSTf>H%j*R#_-}zO( zb>DT2fzW!^N<&qRh;Bx?c?^ie&eOVmjIOZtfS8NtDG(^}3SQlXA3S}Yr{6fusY{N% zeb8OR%}WN1v8knC=%6xin5h)LLB|&Fn=I(_ixfeU6Z^m91&B#5 z-|syVEyZ*XoamKxW--a^8}Ai|rd||idPwu?ePNa2)>}m8k^fQzNair-okSJ6h}N0w z3`!d*mbF2flGxu*#^(E~1Y2dQP3EiHBD)7Al5t{fr}bjZDYTLOEqHWJw=)6OhKbW3 zzRkMd=9`~7!LQwaEB72NIW|a4a2Py3dR)p=jVRZdN%GX|T5*{jF1LYDtWg@v4)Dw= zc>2|CzW?LrxikfDuV*+pOiC4QZ%S|hs(@N}{Fli4ev15GBo%oQpmQ z=I7TAAFEwTAyfH6-V;{+pMQ=?fqdiYPyRDhEPwtZuJGr@tYBrbp=ACM7U`n0x2gYv zK>sx!g`iZpj8rH?EKRmeOax`{Wq~h6Wgq_>*HMoFFaDmgq1hE&{InSF|2!1>>KkR@ zQ}zZ=kGp1jbfw~#|lf6psv6U zN0}(DagE2Q5?va`I?#nFA$1(KV@8JyPHbJv%||vl^{QfI6{R*Ag^|~E#W~SS3p=GW z%4DjAmBch`)vGG<8?f?@WF$sG_EbhV(J7HaE}T;?*HuD%vhq8V(!z}(t*G3Wh;%*& zi?j&6qIgdWPj6COUQm(6NKNGthmHzCs7?0U?S+F0t&$WUI%b}?6&`S($fqJfwe#!ab~WGaaYrbD%Jp=B0AwO8ZA#Ad>7tSL4IoZh>{KmMH`^V7$l=UboqG+)2( z1Shv(vbMpc{XJYWWpiVV(b^WX;AnzoROfg$5@iaQPGWj%1BXw*y(bQE|INS2_kZ>} z-+SUE-o3a(EDutxZQxWb^n}ZMlv=`Ax~?O1A){u6Slfkc`4v|_!ctVIW9HqKQV6Kr zI21WyaBL~6Qq=M)U~Ixxnn*|6%&5m}4C{iTy~y7Ab8K11*YCcLZ+-SI9=LwMI)IPp zrlHaatu2yPq+xvvv}D9MU_Z6YLr2s#-2nCn@YWn2dn@wR<%^s-`#xN5xa-g+)o6=0 z!B}hFZ#-}B?DN!_bEr`B*y%m)K752{yD;f;%XZ11*IBMfUviZQJMR#453Rn zpKzJtL^YI=a`2?!62ox*l!`OF>1`P%0mJ z3-P5ZqWJt<@%@)AEiQ^gouKGFm6{g4{T2^ibBHhBaX-KIz+rB(!gF?emuPiF7bPA| zvNcxgepuIUqkP!z5~?Al8n6pIzYR~ldXYz-eU}&BI8PHsOg65i)FUqM%t_spNj(M? zm|i}E)l+%z)R=@NsUTrnQRV4zUURiHP$?S$pnL|%mWaOY@tazlc%S7ZlqEkdwWOl5$_c`B;k1}pGSyLSw-}o zHY!}#;!PprR%5VsgpVz2hi~T1a~JqO{eyqX{kLDsZ~po>xaYPB`}=VF7?Oq7LDP8( zqZtmiD1a1NYNIJlWEdTBzK<;iY}lHUw~T16y`QZZC^Aj8e;vIzDJ9{QRaHgQ1vVLp z$IYmujwL>3Zh2aT1A5=ne(VJ*WlnlRc#13j%;Ke%g@B?M6jzR<@;JJGqgPV8)Ut3U zEz{a0@_UIcsGhn5;u_IUC>GsVT1+fdG>Zg86|>N>Pk=)NN;29Nu4hy+BRmo%Oj2k% zlnQ8Fi3L`wvAV;C4&|ZKEpt_|=MD2vFhsMryGKz>7#=>zbLY?U)Ia${e(=Nze(m8; z@zCu@xMpp_#(08@k*N=02Y7^fu%=*AE5Kp^6FZ8|V`Ic7&5^AkH+}sU9=!Eh9)0aY ze)Q6Nyz=3@L_J`zc7SqHQmKOE6J5-xb5fYHz}B_!VHdVg%K~Jfz>Pjnc8iQaTiNi7 z60D&d52ZlCqjjRJ4fUv`Fo_8rG?y{EGuCzB<`e6D?cQ7Y@;%2mQ3_~XhlbG2sVd=o zq71uxb0UVpq^3zQ3(zF!Y(=zi33zP}Ub_U3yndEfKfFMv6QzgaNMAD-jYw@&fl>C=2>tKy5dUc-IYA7*WGfWmu>hk=Kt0lNnKE`e_u zPX<&eQTmQI~Pvv?J0fH42GIY6s4#d!9@f^$hK^ah`xDXkO(gAA?#h?_?7m27MR(lRk z64A|w(+e=)=2OSVeEET|@}>K4=H??qHh_6^iPi@Wj5pAeF>T}7Zv*A9W~WW)T45A; z5{^Wdk>@?F_~XYf@z{%}c=oMJTymP$4k*h3&KT0Xm00EZ9N)}H^BG|dqk4b_LX7z2 z=~5Eje2l2nq2e49rowYx6m{aEyZF86kIEDPwA;==8xzpqoaXH5N=KJ^mPRl!z% zcQdbbmD}9&n){QG@>-Qso^mQ+-*m5V*YmmR`Ru9Z$Z9JhTy05q$$OR}x<{QWu!R)R zg@w|hjLtM^FXB6+^D-;8XJw8AERg-ZYIphaiIRuEa3>F4Go%L8{tR0g29tF{(#(>k zRl*vQRYumvA_W`AMt?(@;5a^_& zt4)h8H9Kywdh@UlvVEM5-qp?&Krb~D{b5fbNaFwMQ^dwdh>;M%t0YNzNwNmp?Wv4q zOo=Ihm>mSP#s|%Ca)8dwD5`_h#gL!9evX&_Z~qGq-g_rsd*~jTo5ma(iHW)`WHi^i zeLAn{8po)z)V8J`RQb6&65tAPSI|ntdMZ;X(~6i$MISxdH#J&iNP+z>h)$`d)CJ}$vXoxB!(c}<|kOV2xS-gr8MY~qGj2b1fu+Fz)1?M74J3(~K z3==zs7L>9005flCLrL75GZ~FRm+Z_MC=M_@et?%R?DFFO`}er_+;Lejbar1SD`TmnH@ywg= zbN1pkkqItUXjM{F157c%b)Mu?R{Ix%+QdkVy`w?zv6@9&2DB=PT12JT0$mg+YiNT9 z9Vjb9RaF=p>D-jgdxomxXwh-aR>5cQx{I$ra6KpM>?1s#qiM0j3Trh!WT|dZP)b3@psQLw_{M2dSe}3&Z4cfb(6! zPEw4vt|MI7=8v9zhxf;dr(SuD2kyL%uRU-Nw{46V0HY3uV?n>mv8G^v>l)H*2FXzk z2A~2(4D6?ZF`7HJ;P697xZ}FRJoenH{OpZWoNab!Qw>RDY{h6&>3fo zT2U+&b)E=Bbg_9RF;?6c{zK3!%=w?I@gSw*go>q0FvZPB%0%4Lv z#W^ZX(P<{OX}%C7G9_`?AXBi?(%ZM^FQ?w$e|7KZk;s01SXk37_m&0Nk_%t0b?*Ih zL%;YA@kU>a+*KbCr5EQzkZW0Qv@()aV8j+vWlK<$Sx`253Wq8R;lpZHE zNk$VTpTHDQ88F7M2fW_GW3TM+qeq|Oh1cI_&leP<1Jt7}k{)p3{rAAs3`~I;2EzW7 z`E(EE9Ay!RdWzQtoo-~mPzn_cMrpa;6{INOOUOy4a%Lo$>uU-%Nv@apyzvN?euZnR6f$r^Plfoo}<>MW!evyt(L;+nTOPLDF zR8Xl3!PH7(vY3=8P!yC{Rg-j0SRGaUB^>|JZ2A1PxZuVLZA0Zz{1pgvzDd;T_ogdl z0cxdKS1UgsmWt{X>>*>VDceQ~YALZQ8NDEh3#}4DNf+g!*D(rZrISTn*+i){wvY%^ z6~xCl?$71Mwie1winRedvwi;Xne+Vg)j#0Adrt7sr%v*|I_4WUTh}2AiLGidB2rS4KP!)oQf6wk z_(5U~n0jrBA_ygL<*CqD`l_bof^zk>Bmb>L8?T%@d4>rUJuz>N zGHUI;baU*p(voJD3`*OKj3+|UcwLcHfsPiP0$K+Vekm{h$3YXiDXE=NXc@38g^Wc_ zMP*>Rw~N-6@n}Mbu(!XDN+Z?|-^GtUIL%}K=->0{TaWQ~zV%tYc-Mrr07D#y>w*^P zLyAgcs*2RNP`;&|wVXJ9m}xg-Z|YeeO!(WkP58!b5Ao=8C;8sfZ}Q|B#fN*5wh3aF zS5!3fmS)zHl0?+Y=vO9Dg7o>k!Fa4GGtyOL!IN;GO(9Msqd`T&QIt^HNYm{wZ}u4u zEXOu#zH`epeB)C$a?3$+#b~x?37=Q*D;;%psQgHYJs!)Z0-ek z>ct&?@UvHV;lpjtS0nuTVL|H3l1eGUY|eg4ysT)-3+MUm*Zu?d-*_$Gx&Jdfc*wFPw-Ey!2}#0Hs`WLwj=g7k z;WDEGhgq|N`qjX=gw1OeH;-@O^Y`4!Kl#xcyt@OJxA*X_LFt-^q4NRnI_lvlM-xYh zlJ-vG%%ew#fDSD>hU`Tv37z7=A?`w^u;O)V6}ptB(2%IAg3Ym~*uTVQZaKs^KK~F8 z-F1Y6Kx`5^w5-*ZwWHTT=a{z*$rjjph||y}L=?&#hhol<{RF3`@a$XggC}0+i5K6- zjyKs49Vta@l!l^G2EEtPPNxiXAci>=Eg`h{c8XGo#s{K`B-<~@F(b$wJ~o)RpVyE? z3cY(pre|c@MohWE%f)l=)4a5uV=*~f2(Lb-U|Q@$EBn9|2=rBC#Hd(=o5r?oU~0fU>FXhTSmc5h1CUZOUZ*zGc(?!$bJE-aH#4c@Ug+m~E`q@*EKjt(u_ zlPC^Y$%r-Ha?jRze=d5ntv~r#X@E?RnO#-0EPl>PQT!1e^wkBz$6O7u$%T!R0|a>5Zt?0}StkgOzn5p(c~AsK^GezAeY5X7BA1>r&WoMdcZ@JK!&I!E}J0y>`^(y%mYp5nYn~Dnx=&?o1)^BnV(TxaW2@sco}Ug>UxC7 zaA`irOpep~H6D5OG|#{O&-ms8xA6DA^9AlYQF5sX3~D2zS0G|ZDNv)ZrlhJ3-QGT< z(K@5e0rQ}Q_p9JrpE}CzHyq`6U%bpuU;cpCU;lu%YcXkziJH17vE>k-gH$B$wjf4N zN=1JEoY?tkiL}+(F+drEDGHP^Bm%yhqeF+TA{%y33xvz#(=47W=Oji$^wNT&3g&96P(xZ()%->efkaFc=H^WyAnUXhN2$fqe2%$ zl=sYbX873*J05Umuj2>Le!y(DPwFDxCob;nW2+&hs?bU?C`uaVs1BUu^6Vn>XgTj% zF1&V;*UtQyU%LBKeCysVj#(I^snJxXAclbPjxuRR>zgp2K~c)rl#*~i1LFgR$vPbQ z`?vDQi}2GYp5xuqmuaF$6>Io%NJ_;5b&5U+4>)LIG^8N3wb+T(noi<>tE0jyD~>`r za7F8c(TPe0QkpZcE$hRYYuDiK{*7;Q-_3_OG0JwMjpI;VU{ftQ^kH4_Z_aA?oXWu-}<<=02HQ4cB3hF_L363yph+ab7E7zcvNBJ2k zcDQ!V{;a{E2q|KX7R#=b1CmmQykM6pMUE5;8EYry^; zCZPlBBqH-3)RI#t`*HjTK)0+RR@m z3lBVRRXU<@f3_#^pV9HjD4{8z82z+EaXViBuFY1LQp;|?v zAfp*F`eub6Ej4y-jJ(f_c23wsW3=!ZV-9Q~b=V;4ap*`oWdUTwyKM$maelvLX0k6U zQ14%$aUNrb;0zHhK`sRRtRWdosfFT_bjfJzI9I$VTZ95|vg{g;_q9&#m*IvLD5rc!2u%)H0Dq^xUO@l?TJ~Y^_Ws@mi z{q(i`##ip)`U;%iW!;Ziw>sZN5JMxeCnn(yh)G$=J`%*xC~t$+q+YYwb&xzb(AI)pW~V> zu1KJ3ijc5Ap=gX& zW3TbZ3vaSL2Q@swI8Lywq(6ox;G-8xU!Inv-~>zwiY~hB@>BufXG!cq@s!Dn)ny&= zT9I@Pd~q$_w}f#d7LhJF5(Py*No~$BsG_WC+9=x4VoXU29_=H>=d{~Cpr&t_Vx|ga z*A{V!%8f<}#NZcV(Io=jYj?6>H-j=Mitv2lMwRIz0=!+xt%l_k!x%&K9VUTMdg1tQ zv<2reMYV9RoXrwtQ9&aVuWB$L_>N?1Qoph2KVt>|pV9G&D4>&ynY$&$o7lc&{+L8? zpi{&oL3Wi+nLg2f|MF-3X%XeCzvoX4M5`#^;1&NEuln4qeBMWy{t4MXE8qdJhzHeV z_qLT^mKNWTAFGyM?@?|Ygqx>=MunVUl{&N+Z&KBVhzZ#@$G1Z7DVKm~a@1E!LYXm^ z7y?miFcrp>)OAHWKgV~Uc$4Q|eVuPVd^g{I_#SRLRpFRL5{_eee_KxfMmw)(EUVP^T?Boas4jy7>HfO#+r>rWfwGlXn zo6qrKMll#;2MITyi7#{%58xCcvG>GFQK%^~N%7pyludBpaRTMMAw#G)wR4j3z0iWP#NpIMh*PcMd^ybOLc&mDpGn zA!+f!4l2;0Y4gi-0j!&0TZ2voL1(PP4uvjikclqZ(e4a;s z_5y$Z8+Y-Qdv4_R<0Z2QdX_jm*66ZCX+!8*wC@PcfmW1NjV0S##e|A2x7nJLpFPff zw;tyQPo3d=PrS;T=iVczAqNf|VS6?w1Q<=mM5CB>j?O#Evce9xNU@_BRIH5$bX~*V z?m5b2IXoFtwjFEA@xWcz^X<=_ z>?lE>-=D$b&wt3HFTKavcEEn8z-(aZ8e3G5G&bmbUCH?mE+=9uCFpFF%{x+%f&^^n zn4_FE1S4)LApt?5I!#g~Ar&|?q*Dry<$wBjf5c<2Z1If;@8_Xgk8z~b%w~~IB1hKO z7fEQLnKO?OGaN8BB^A)6mXT^uSPrW(C+{5d*_-d-u~!n`ed0BK_S(xFKYjyyE-`l= zU6fSA5rIJ0b#&e_7_SR2-vv-EuiYA*o90PvX?9Ly=DXZ{e8fX{-^pk1KEW*~);Opk zwT?+u2+JyZ+Wnb?yA+v{V@n*clVBz+9vTH__TY^RiGTUyH+bvZjPqyr=$t`O$Xyh` z5Q#n~1bVS@Oum)Gx6l!i2j7y2gb*M?*Lp%oIUc&DAT5N)DM>yr^%a( zQQ5jK3vRW|K|~OB0;|wgc+jR8pobGwJ;K=mofdI!Pzt32RoO7qfl{@E`DG4PHMiVw zfY01`fN$TsL6M)aSt#(u)7nOdHj1bUnnXs$!IcHGAU*efsiD&R_)X8h|Hh zJ%!e;V}_g5c7WfWqB?1cQpo4ii(`z+Lf4eft;B4r1)Q5qT3E;yF%nIp%ap#5EGi{T zpLswatV9*}TV_-VgTh7$EbHrn{!^2w8;O;D7D1(Z-HJGWi5rVFSaHGB=!NjB*GT_P zUR|g3+t;7=_=p+7$69(U$%I(-#A=@;zyL=@1g$EqqdeN6Y%A6M|f zesLS1Kizx5pFE{e*=)Z59`SXJi_arDB`XR~F9f;eLXwS}fON9T5OhR^APa8@i$BTO zoK)l}t3bE6$J81QZjCX+o7mYs&+q=x8$9vc2Yl;`pW)jNUyrI_dVa>CvE}ff#N+5< zgI6_)l0pjtrK3l4OmzH`?G_ulm#zWdxM{`DXIl-ECegK}^kHyyo`-OG`k zOWSl^gDx~hJtWW(d@JL|;GyeCE}^=Fc0Qv*5p4`ntyl&cDST28abb!{M1*}{P7=;x zQg$(BRb<4ce*-_}-1R!erJZ3O_p9x|ejRfcIWFY(kHv>pFbfVN{nn*P0MjE-p05%I4e=aiPN~7>z3qZXF_QY%tr~ zWqWU%fBgS_gdhLtCBFLb{e0s~Cpj@zyw^YxW*iz-3~YfCatB@GaI-mDmuOQkN{S6r zLx5ckH*Ub%*N<|?{YUx!Q?K#J({FHo`%N}BuOWsZmoM!TqUONX7DZ7oZ6e7Wr(PeC z%#@wkSybvcxK*(hTB_Z*dGNaH`1ZZ`@wrp&HnBs>PZa(kP}1SxM`v? zbV-oTsAVGZ+7A5j%V&7v?f3X#XNrrZSYfCNTh!ELg-#0BIbw$tOL-^t-r;>8T`yD$ zQW6We5apzJC#X?xpkU=Zq$r4Z(h7qWq(~_uC2H*`kG_4DXW#yP?z`!FzWw#@>1Z-+FXxsjHF$rQ*8V755&xjn}?#8~^hkK1rma zQ3IM-GjB^=fKnUAr9sd3Fo?+2*NHB5%)<G_k$%+SVzMjwBc?0*}u*n3W zXU*p=!$F0MK3^k|!N_EBXh#SN4>Xj_l@!st!21{BM^C=bA3gaZA6#gedyTb~P00Ul-%mfRzVbX)R(q(I;y2X`294N2l8b7iNv0PF z3e>EOg#YL$>zp=9JoRl!vIWkHaByw&5SRD%N&6kuMonSCxha!j;>e)^-R|p@agWls zT(h;#-}>fP_{xKa7$qo^XeDe4xwzCak&B>nX{};IX%kUfW=PP@zJUt?-o60e`{|3k z{=p^Qd~ciGxuz_(sM3h`LSWurq%0F5bfnG`eV45TJt?%=t2`sSQDwSYPmIXA5*4I~ z4MChWLh9`%#JwlVdaTkF*3WXz{_3{>zuco2q6?ERZ!y_zBQ1Nh1(4UHd?{l4sRemz z`dEi9#!acBEhgKC>QdKoyxwrxIGt84tuqbUK})O@$dAW8XXW zF75ID?>xzmpMHn`=5KwKuiZXmuZ5k9mpHyzQ|p?Dr8j|#1R@EoL>fs746UJS=In*U z#(14yzvmimzvDOf!^eKc<4>OA@`vv+2?wc06>eP8L{Af1x*kz3YX}|2T2iY}s=;WD z)~z%aUSm{6R57QAiD*!vGUY~t5!EzN<*TYk7_#7S5hLG=|J2H+C)Mzh-`HQ7YJp-b zh(@{4jw>*N(t<)PuHUc;|^<3Yag znRO1-Lr#ZCn(eVsTQ-V{svc0~bVLHsAv5_Qlp2cEu~n7aw+@HCb}OH{{aU{JgXekY z!)+SpIDY*}l&v{;=`x+0bNJv9q8f8yy9G7n(0WB`I_&NT+;ih$zVn?g@tLDrTvx+- z%D-=6Oi(c>H}Jt>tsq2b&Y9AJgk@fR@{Z)BfKDN&RvJiNqY8u9fD&<*GGLSy zmXR{d)H>rM8<^yH?EQ6?!8_51JPGdD~)T#vbgSnU;E!hWl>2g9E&{z8uCn_2gfIKi$Ez&X5Qg;9gS3wjy<#DVLg`R_XiLnGQQ6HS z<|0okFc#G(!UYkQXq_<0FLW+*YO?mo*bG-0>{>Oatp0|0TL$L5%sB*DRb1-RoCVU({aI_@2~G=1+B6R$Lc6e zWnov!?kXrN98IMJfsSM}+AIW+Da1u_?mc+#3DHq_N6)-WQGpLABZ~Z}6|QZl1~u9$ zybsK~hOW(#zsZu)gwesIHjrx-*IS;drnE{28^X2gxhhCKLRJ;YC*+T-!(-{ZpU0`oLvJb~62%%Ed` z=NubDh3d{T*gnVICn~;q|HC|Z(-96E#U>G&DYFiSqX_`bT;!#L(TGAhJf4=wOc@$m zGDWIQNg86HX*xN# zJ`2$bm6Q5(Z#E{)Y3DOanu{-kL?e4cGKg^08sQq6NFSL!+PaSI%V)uRinS9Y-SWu0 zmwENlqug?IgJ1o^{oJsjxy8cfpr#F=+J<2YU<#aof)p0CD$q(XB;fouc9!`1b(`FD z{2+Iq9P{+MJ3RlvW!}4d0cY2+!wnn`?;IhuSk-W#m~wa$x$~L{cO2c~>vvzvwS{M$ zeN1eLtw-xxY|@l;Qp15|Fj&I_vy_+xg*PJt1!1k=@zaT)zWhE^CIKiK2!ek7Ia zj1P=S?LH~Y=v;$}tpo+SNOWH4Fg~wwUc`UeuvgRRkq5EV(rIzS*uUA<#;wx)G{?f{#-WSH|sxiAoL~e%O zh*+kFYT@LQY;RLn%5|rW{9PABr74pZ)V>%Hiy^5PLOFs`3TQO6O0hYvIdWh~oL;24 z^fsl9T)&pM``QhD>o>m2-PartcbvTo9Gr|`v!vZQM^z8y_fZg&1Q03H?<+9Ha;^(> zrD0ma_ny1Rzj@>tUO6+Ru@lUJTk*4mpCv-8sa;3WdTiIB2t*obY+NV5KX{0lzL5jP zB;+P6-gf~zG%=-2*%TU|GW|56Pmm>xKLa{bc~%R=Uu4U+{*e45CBnpaNRwF=`&T#3;@XN#!r8m7o%RMI+W59ek3G zkNQuqyiY9G+ACA2ulydJdAG8t=i)kVBswe+75PC?{5w_5hVsb99{I;KuY8$b|JtW%r-^F|g)Jek zVK}v5ei0RH9Xw3a%n4C*&2W<=7&|K5n|FL-6L5-u}Lu_I!O9iRAR@JLROk;30zsw zcQQ9Rf*2R)&H`w0Y2kltfJVJ^? zo_^;;PW{Ut@yJt$_}jnqFgG45xnZIys*0I|uIU&Xjjk>a7|B=6BG zp|mC%MRbB%V}&anTmq#jbU`u&JLhJgC#dlj#jqg6hSq7`n@zd&{x+}w_ILTr4M+LP z?Kg7oH4{!4*cjHNi2STdZqwL-Ql3GXs1;1CWo#qc?HO*b4sha@nmewo`OzyE`RS{t zdF$dn)BOurGh{d_IkYk4jJ!ce#ZBH@;pC!>NTdmVshvt8wWR;yF@#0s5(z;a>dQh%I7LKLm#*9BloaughI#Y9Wu1CBKTGnDGQ~OPG|$s$bym-qVX`6WGmr3 zt71`5tL&hFDNuHZDu-YPQal%x*g%d-W;^GZb{80rHKn`Eq@456J-6|#hwtNo+eefE zn714p7}R7y*uR7+E2{AbJOnI36?mn3X$=W+Q+fSzOTAU`?jHQ}-+z)nc;YqO;2`Dt z4NNb$1S(m}tWbQk>u_#|Zax(%PGLlk;<`-L2x6<~T^4ux1z2xu%to3n*>&O-*J+OzsrVD(m4yj`;9*c5l&3TY-$hCdgGv)hxEwtX-(vaHE%)%uTetJw zpT5pxFP-7^-ZoCH0sOYk%VSUdQy%{Gt$gQ;pXRf-4Y{U@%v9b%j@UPa>IehiNQO3 z{R?;SgLC~8$O+T0`pmoMytiBy}{Qq&3GZgau! z@!gl+=ke!X<5R~E@r}>i#b<9l#9nw_XWp9g^y?q;qo2J@6H8dXo{6gL^2{n~nN|?wNV-B0nAeD_mUFH3B7Kk?lAIU%kvv9)F%a<^)Ou z{RGcTBNR0$C;^aC?_{wO)%}S&Vm2CEPB+pD0^J|7Wy$qzw5(;i&rBeq)dHjXg*`qo z1$2L;o+F4910gF?d-{ev=t>j$|9?GtmyXpNTt-(}SQZ6(jLD0=&Z0XH=)5to__#!( z1p$?FptTm2cGTHY&0y;h221M`u9=I;Y-zyl;!j_KQB7#3q{2WoW@j3icF>+nTt4#* zfA7nmWlak_!0;>P*Awg-!@! zW|zL>JpxT&!HHHW5xtl5pGSEy=uF`-sHkY#7PP`t71n5C2srOhMMY%`yq~jwVJbxJ;$RjzrmXqc8Pif<7+4mVqEf)QR)kAN zTqsoMi9TSpq11+83PR^|dZt`HDmyahkTTyt5i&ZhIBMMe|eA7KYE_0-n)he@4k(@j>2Ii zd9lbJ2WaYINR>3W8AO9FER}}XT&A-nx7ZDi-+qLz+w-WP!AUJ+P0O@1#O|B;G%;@!@Lxa-+%w;d;I9xH#oiRP=muz4A235>#;6S z$AoGnVm&3XA;Sx2Ir)r|#Ym~ZwM|APGdDH_RC2kvjSC7}j9zpPT`MD+6l9&t=S-%Z zIkxI5t1z({TO!XtuXz60BcsnT^PqL^iFHyLc+Q-8Wn?W8#b5ptg`$zy9ih#$NJrxvZ&HB6+g&Sw=2% zL!npbh*D!*$=ClyJw7o7w9ZJEwH9S9d;5}Z(=-ji)U=JGswz64JEmM9tX^z=BGkf) zjb#*NUp%P%yZTOR)%D{~dnxpYI%5hzxR($07W<+^Klor!ciM@z)B{$Ki z#W>87or$!DuEQ``I%}vtMQi0kUu*_pflf;SC-zGz^JcX*i`NrV5Y@I;q~M8I+Ejo} zM4OQv-$7@gDr9AywPM7dENxO4Ge8YTG{!JbiudOo2M?4Y1dfp+2_MU#adS^_2BQ_q z$_veoMD)fNx>Jk`OVW;-l7UtnyhCyKjkojurQ7-aKYETA-#p7Z=jM#+LwG&m;*KLY zpdNy1&;uFshWU&XJyij5KBL*bNI9rU(V?P8=Kuwr)5Rpo#;~@&N$UeeS<`hhFqRMk zr72{CS4ud^Ny1-5PAKnd2tkmn#Pa$;FE(SX`?fyje^2?`$6UbYk#dxuL(F=Cs3BM} zVCotQEt^9%g0^jmG2%ljNWu|Bt4y~QDo5CxUrab^%ldQNmoNf2`;Y+7^_O*Ap{p1mT`700c&ChJ0SVvJ1QbkgRQh~1|F1)mW z@)Wvd!)hEY3d5np>okYu9XUc`kX*iQ%jFIo6PO`xdrGl6VWKTN(u&gnXJW^;E_q=O ze*EGEo_+aMc4mQK2E_6>^8t$VL59;Z81|QwaE0>?MUWD$Wqr8ba#{T~6XO7Go94dt#WALXvedCSsS+ z6ckl07L!roLt^F{Tv0L_tnq#~#S;lE9dN(>u^j#8dmF zx8R3Qzsh5;yvLbY!WA3n@sLOX4r1#tZ9sPowrfz`3==wBO8Dprd7`3&P%mN-paADc zQQR1Gk|J8tN2P!+N<-5$6vp7YR;Eq_aE@|N6M|nL&b@eWu~w^?5zZyx09T8teqNEY zbV^!id6dZpJEED;3S5X3)qpN0FqWbkGIx=nG?Yd5dqAvrZDFP7WwjDI@th0~(Rccg{ti>DOPgbjm?u!()te zUANeKLy+6FFB+{?_!&6o#BbZVymznCMzZL8g^L}ps0Gp$HOR*ax|S$$54tQLcXe9j zM>+E!|Fh)tgta;^pYnbhrSRTU6!JzK+8R@pC8-nFlHOt+w9qfRUt9+c_#_q3%90W| z@5L)J7j0IRIEx@UN=k^;<4>Y+WSWnB{tMnIecWsNd0O4o*Q-bizezdzrX#Wlcahs? zfkf*_wqOFCgEmq!vdF7Mhz$@>(V)D_KCF@mrGf<;(M2gXLdGu86IGOSsm2u+Zw1ZJ zC@gAW=@e0vYYHF4UPt%l0l6Gq3LP`#*V+Ctp5I z0VvkSB-b(9*@mRqxb`G_moGx-q=*g%LPiu*K%q&|pff*J z@=Ptt2ck(}jMTK*@~5XgOKN!PdnrLNgk+XoB4Uo)U5R_m3#?lC`;u)F7QrjMdH$k^ z)bWbPFZ;aQbkfNt5?40zm{BjS1PP0>iKM7dCP2(F%_?DHhgK3`6AIx~`xIq#tTd{y z#85MjiOy-J(>-?HxXhX9(>(s{2LJ0{yN}}=Lneh-#c5zr%F}PVJtUy66Z5Q#|_aoDcUCtvX13XdPV) zY1+iR^|&2}RTU5r6^0|~j-)%1l0r+o*%SEOlrP@y}Sqj<4Y?V*BdatVfoGG81 zEg3sw^7SE#1i628Bq%5D9I+72eTecrbb+QI1xsz$aB%=S(rHbs#sodbV=()HfAp^& z?y-RL8M|9Iw^vS0Tyz|Rkq{T0`^E-QqiS? zE_00~5X7NEhj9^HgYg~4x5OalJEm;W8FZ#RIa1C#NGU9)2jX}l!8WV+SW-&7v1MbF zlt9%R=l3UbCG6_zGqyVYhJ{Y+7y0NNyOv(${p&YZJWguz+&Cg&kTwRTO|})c{O?X* zO#krMfnUf1>l0Hz_kL_KLZJ(+jTA)zLE<%?b2LrIymJ(cKJx8-clRezqF3$jeo>Aq z`QBVfe@<6_zS8-oc*TPSN$FiWvOq3ZbFoj#%ZN+w6W#w()&KISh(^R~Nolk%(6K~^ zfbn8~hLr_VmkC`#Dj^ktpcCF|g7RpsGx7x*i@_6B!YSA-BHK+sS0&lh025o*3YZ`U z_AwSB97+Kl9E1jw5|cs2NDmnq&4D{7+Al>5q{&FU*O>{XhtIX=KwIolXOGG$}%3rero_E*AZ=CpiALfDi-gV zPta*eJ8XeHpxGF4)(cJGl7`>;=>;Bn<`u?=uH(!F1$szX53y=UOl3ZoLUVC_G^Pq9 zIQz9k1L@`%3-zz-tL$6Zu#H1uBN*hpxoX>pT zq5)R`+F_L-ZYt&?S{W1(V`>Ur5s;)!V@H@lA_T|T**@FTf_E;S=D9P0uRm}T_a0Sj z6cc6$Vn~8YiEndBZ=6xd`yM@I+|U15$Ro4`Wu=8yus5HxIUX?s&IFieB>JUYc;u<~ zdHTgUAD->l-ctL5Acc9MSv&;t!i{llu|T>RMLIj*kLtRT`W;7!bF za_Fq}LGJTJ5-mc$549g)_ctLRw1`BGU$#kzOKf|dI?lNKRLK`_xiM=NCS=K{cHg=N zB&t|B^RhcXV?5r(V>s9C5)4#!L}@EP{rp`>gVmYOiS2X1rV8mgY_|lj)~cafV6x>S zewh`|stpjIutBM1wo^@xgawHQ&x71*MNf$zJJicsSH8bv)~-6DF-E)yF+`R=u;`$&0SUj(LGm}_`rH)I(mVVlC=u$wU*S)V-e>b04{C~2|PW<>6 zt=egt5k$2 ziIhARU7!o}K_&{`=mLAz3IE6c+keUzzwveMyX!8dIVBD}4o|b}sLM(>d27Lr8B^r2 z1OXH1+JHPFcHbs9U;hB#ef$JJ`T4WF_Wt{v`RIM7+m~@3Sz9mhbT51o8j#Wg*+j^2XwKvQ` zGSM5XWP3yLSaBpQHZAbBfT%vTxEfQ|6h(!tgxEn76EB@_`M>-Zf5E@}@iu?-2Vdaf zyVNA9rQ@jE1cGu;J8eyi(}cS&c8DpIe;ijxiOEww7^P|~fe(S#1b+0)Iezrqdz|k^ z_~Uo+=3dLOtsM-8F2Q{6SxT2X35DK?ZjtXuSiO%v`vFFh4=TFM5(1lywvN~Cb6*^- z)3;JuIRU4ERH&Z~F$_WieV*X4%Y2**sq;I()Lb%HQCG$=X! zID!5VHAI_}O!d=MIUYE$(ZX8|{P2|z`R>y%@ao$gyJt2Tk4`Z?wnH=9XYc$zmB0~a zNu{MbxS;4_*Acy*R8$Zfh~5JYM34AhI2QGJ9g3-_ZW}2Lg;nYk0z)JuEu3vEh+b(( z*@__}(ChTRm7B)kh$Qe?c9FiIw)7n5Y=@c0H)X+g${{&@)`5s68k_4rwWLcnA7+hc zA)P}})LYpN9A_gAsS8Asc92qskrrnYMQN$)Nc8)J`587U;mh~m!hi7f2l>(smI)9R z4W>whZibL3t1LpyaT)=r$732IXH(1B)-#zLWeI%n;YWn?=XvO+o3gc>P$q*d46W#M znWDk?i1Dqu&xAw>4Z$~v4}`A8`H1*1bRxv7sZ#9HFs6}C-I20w-KvwiHcn{Hz~FD6 zBejQpFNMPbPEndwGAbsFto}dnak1wmd5NOTgSFyXP)hc}!VK%w8by>ECqqu^SI^5M^4 z0!8zuUF!%m3?)>4y%)d!U-p`N{+=#Em@FXAZR7zhqo*0HQ9+U-YQ3GCSU>Rfw5ZBf zZvjP6jMW_@Y06*>5fePpS*$eJ=&{jdkWWtlof!57&WhtrTkz;#e3ui?y~gi;`71np zRyxt@tWjiowkY%D$=on zq#UM_G9Pw`M(Gm_$-=;#2$ltbX$=L)_91Hs)=E4(wB8a!0-Nr>E503&+trd6NULHQ z!>XX@{cH7$GfgTfdBS84wUSN$OI?l|F6NkSLuA$dJ#>)omHsIs&`Ms{ja>|ZFtmijz<*yyIzMG?%OD{N0y$?!Wy1 z@`cOBeEEiB{PCA=!>~ZZ%?(IRFcpm{5ey^hym(X~cF@>LUS`Tt55phK;IVgi`R=Q4 z^TSu(;f;C1)~6^oH*m?}7jv5ZeQdj6>PvY|@@@Nk$$ zr>LjogAtjRMi%}7WKpuHBTh(yHD&(&MyVMN)fu1%Q$?FAEuK+_4RHk`j;bz*p+!tb zStN=g3!-VDZJEfNZ#{TBzxVau;*RSprji*t(y=)b#CN#TWzo1HQP8DCmkh>O76@lT zhqoK}2|P82AASEPy#LY*eC3v#x%VchQ%{ot?IG!bDkK%tx-JsD^4IC~Eqe4|8bsZJ zLLA0dLPVlRVhhsgT@IchkZO1ivv?jA-s(X`_so=?|MlOp@VgJY8bsl_xz~@OHR{-c zKCi`RR!aQ_Upa_NJJS97ziOZK&QN*Us?aFuU(A8NWGEc}p1q=h z|13EyB*nq_UjY!wUbQA$Hm$X+(&1D5@H1n-fkbTR{kS1XB$=dnf>9A14f{yAEK)Nu zVS~OUiF9;y#!&=NUsVkx>En~z(Fx+lh{xVK#{ii?X1^o<=|AV;>u=G@Mkab<42$7 z-Lq%t_FJr(Qn?Xb3YenM0!Wl&Y;*gPkbR|#0&y18^TDhd^h-=xaEBJh+0V6KlqCg{ zWEOuej8)y7(aWBDnUt21lE!wM)y}N#UFkaydGWufot!;74t;L0#frJO>)ltf2$3Fb z>06-Ltzh_NNl2-;RI|Al7YIfzwLy$fvu2o%_yia@v+V8fQ6#neOVJa8C#Hx`k(iXiLTr)HVth*s+8Hp3!OOizp^>cXAZEInj*)si z_xDxDviJDa$0K6;mObH+e&Dm#PV4J0faLomM)E__zh#f)j4bQHO4k*f%kCVScw;QN zL*l@VGvB!c$wV9D)K$X>UE5OE1*6)M(u~F8EL9mfb#j|)P95cc@kig_@YqZH{P2lqdGwJ-*$xd~xc4i}QRaSa z)HXGV*2v3@Li?CVp|=uEn9h>g0^=jnCXCOt0I%Y}n3f1Fkybl)Lsub-}>%v zePdV*`^9r$a(sgDZ7l_|?*zoG4>7rb*24O8aOE{WWp|(+JQ;4&MV;?eS4|(3jm=HA zwvVvAvxQ?uTKqi%{kMMg4jg4!a>dRjt%qh7S+oYXgh^|u7FmQa{{-sBp^q>9Q{rJI z@8Qq)t@dA~e>GYb|D2HHKsi(JC4jtp{0ZuT4Cd zBL515O@fV%Dq4&+EQ`pTL}?=~2t-RAvKw9knr+@Y+Yv`MaPp3my!`G*{BQry|D3O1 zb1nbuTVLXeC0uqKHXXRSgzU(WXpvG2mUgj6iiYjU7TZO|{=t&gHx$ze_nvax_z!O5 zYxm#Azx&D4eE+eRc=OyYWnC~H@323QglLFTWMQAGa}@xeT1#8HOItZ&!HwdZPeqjPTMVC9g- zJSlVAi5k7$(*QyZQmXBuQ@hV7g4jf|0aIDpqR}xgGbJE-d~B)dn7{cpH*8q8H81%>Jy6$NZ1GPjNc3T77mUq5|< zfA`pHr0JCu<#EFKNb-h>SZsS9x?NI$Fn2VImgT{WB3g>^2J^jLLQwaDm^>l1#MJ4D z#y5Hh3~JG-)D5LR#o&=l!%*QgI^Sj0e(tGJiI|I6ea8Cdqd&|7hv@(pZ7GNU{~|Pc zh1%rzc6b(zn0)ZbUe6{WqPB7(y&l3~3zrj64c3*|0$f>XC&$)cCYi>e1+=vV)>@oR zjOz&^3u4+Or5RhBmg{f0oG(9gA78oiD()D=79K}O?1h$M2r1F}L|Ie>EFQyB5|o0= zQ+yYAdkH^zHSyi&-{h};{vtCsqB?mmUAxCS%MtqmrE}C0!F03)=3eT;J=Goqc*$wDbpzDA-xAL_&rbEiSaDt^-Te^Ezvm3^?r zffl8121(8?Y>-K8JtZyEixz%?N5jwxsR^O|+kQ#E z_Vu|bpp(~AWnnDd$ASIX&-)l7UGOwfT_4D-zrnK(0OcYEQDp9r-fpND^Y{GC{<@1$ zzW=_?p=;q9xr(qs0~e4?We|v_18IN?q|JB2;-WfgXfUZ&PI5>J6Al*lJyie>Q3Tfh z3U%@j$Ud4v%GJ9Ht)jHqFWImmZV(w`AuXsSQPx>-vs{7`Hb!Ge zF!KrP^abB`(s0dp?%@90ZsyN_@Fb5u_a0}?FB#QGX>F}7M`P4?H8_lDXhV@K&g8gd z>j;I(ak>d{7Hq^sLA)VJ!UW|hYSEgArlDuz#F*Q(F&A4z{T=`by^JuAe;DkrbG3C5 zhwpG9XAb>SznS;W96d)gs&6Wa@~y&LgeZX&)o+$$5u<`F9Wa|a7l1efpG8oCX+0tc zbZtlHm&69>45qRmmW}Zds?mgC412Q$Ay_uX$Cyjtz1?%Xb9R?oPfs}F7#u}($_X}F ziqt8(pOGeG`ooD*Qd~&fa{L%`U`ODeeeqf@D-GX&_9Y~gyi?3UMj$1|R+wPaJ}w$c zT5SfVA1y;LL`k|16ix{~L75Kl_28XikekI{Q&BoZZNex<%?k(^DWM2IGH zGELCdbnJP@fHgUS*CB;f4!+awM{+`PqSlc%DmO8-B%pSd3Pop~hf!LvuT zRx97&4wIiolS7F_MRp>^%7#w#`M^4&t4Mhm#1?9@Vb$K#yZrT5J9kDbRt%*{I1`EO z9-%qU=D6d|TQBFK2XE)TJFn!5ZP*6JBu1GtA3~?jCeGrF!xWBr@L&sCV2C*F(&PH>g2dGrCj+TKl8WL*?5aZ~ zeP2-b+Vx?NYj0V-tYo-c9W&YMh|?7jT+!FZTQpCWkr)aw(9`hj93hd(!* z228GyR=SsUaIL3s4Bwg$4^hB3N~aY8=d1!Fm+1AmDWJ>35<^ffUtu^{dfL{LsB`48 zBB6C%(*&VwIx1V?qfk}Q1{hmWVUzXh4@;gFd9{lvQx{^uVKmk>wb@90Xm9Tz)TIOK>Fz0t*8{ z_QA|?*5OJ+7Y!~!9TG%CFcqD%P#F;1XcBF5t?gLKNVHE2C=3pL#L0!t5b3_gsQMn@SP(t(V& zX-8wuG&TS4U%bJ;c;Z>^yzwgj(eHkhFW)vMU|4pJonnJF%qe^Iw2k<##S|7}Eu|Bh zZkHp4atB)+$8RjS_w*O}@iQ0r-V<-|$P4dtzHKPWE#j!+;Gm<6EoEsalVeK7#2C)U z2(G~GY|$-eusFa^E7H8tB=HVRXAv}wO~j}ZM@bg3q*YK$h*>bELci1}J)tqRf^q?a zF{sg&&BCO9`t)d}ASUA5MtPknkdoSxwO&*52!8NIhm7J3b2|-VEw zDrlF1vbMB!flY~G<}t}bRTHddKXur$#$wT@L^lN=5+=fpm2mn?r}^p)SMb9(-{-%0 z{AJFKj^WLOMT{(3t0=P=yon^!P?ZsDJ<@iBrXfa60Zc~n!&p*A!G;PU5lz6`RtMeh zYd0pTMWIPTit5p8>Jgy{nZKI1=Gc*JAQoC|OIqScR8dGcym55mh{Xs>M{=H2L_#^j zW?xp{CCb7v8cp!YYA_lBA0k!h=ma_oi_S9&3w7Ob1(u32!VHiCW=+R(<_X=B!YA6eV7EC(VT9Hv zLKg|0Kq?77GF$G0?!JRo+|78U;Xo;L$^-u>-d$iNzu+_7p?1 zmS8N&R76{-IM5U-bfna7o)JcqDH|JrZ?Mi`tBywIiolx@ld7gFEOZOP@+^~b$-Q@7 z&hI>YCttktBv&4V8gM}Y3TK6-FDM-pwnA*fe7;L`9#@XAw&Z*a>_toG;5_h)m*KlV zeVNCfdy{#buyj-Wbc51H?4skC5tiKnRhm(AgeqqdbdoSQM!*EHt--e)$y5lQ5ChhB z#589a<{0C_Hbhx!_rXU+n`4CymY6iMJF%it$=aR_Xm=uaZ1ii4q7IS^J)`31lswiZ zEH%UlE{qW4NIp?bDm?pC(=l_eGssy(OM{b&M5Y@W^moO)h6^Mkc&iYfNl7{P(PVcY zSu3P-g>q31VfsnhS0O29M3C3sln>VH5J@t*En@gIpuF!&3J#H0zcvo>LiwKcy!X}Z zTQm(xN{XT&gbr7ggxFyWMDLOA?-A&~^~)gYt;%Zb1&tdPg9@6s_ym|$;p>7bdM+tz zPFLzuY*?MX4xt9WR9?F-5Q_gDai~870xm1R(E%0Aue$%+yUf#a;t^?a;t8hA2nJx| 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

@ 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ð5)&!;&=}l42dny!=^T+CF|SkPZ>p1 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%0D4yX>b#yLSQa!PTC|H_$Xz4U0;Swqa(m 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 Uh|v$~I-Cq1jwtF;oiYOTA4rk|z5oCK literal 526230 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%0DjZdLOIUw7%X~d8S?)Y8J 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�E<9fzp`zJC)$*C_k2SUwiswt2UlFxC7k4<^ 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≦@BmZk7)<6EGhaNn8?>p~(@a^C6 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⋙H&HV}E4&3z9cggQU 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 AD*ylh From bf36b395c17df73525a36877c2a90400896c64e0 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 18 Mar 2024 07:27:30 +0300 Subject: [PATCH 0078/1195] feat: display texture of dropped items! --- prismarine-viewer/viewer/lib/entities.js | 68 +++++++++++++++++-- .../viewer/lib/worldDataEmitter.ts | 2 +- prismarine-viewer/viewer/prepare/atlas.ts | 4 +- src/index.ts | 26 ++++++- 4 files changed, 89 insertions(+), 11 deletions(-) diff --git a/prismarine-viewer/viewer/lib/entities.js b/prismarine-viewer/viewer/lib/entities.js index 422f8ed9..404b22b7 100644 --- a/prismarine-viewer/viewer/lib/entities.js +++ b/prismarine-viewer/viewer/lib/entities.js @@ -79,7 +79,7 @@ function getEntityMesh (entity, scene, options, overrides) { } export class Entities extends EventEmitter { - constructor (scene) { + constructor(scene) { super() this.scene = scene this.entities = {} @@ -88,6 +88,8 @@ export class Entities extends EventEmitter { this.onSkinUpdate = () => { } this.clock = new THREE.Clock() this.visible = true + this.itemsTexture = null + this.getItemUv = undefined } clear () { @@ -110,7 +112,7 @@ export class Entities extends EventEmitter { } } - setVisible(visible, /** @type {THREE.Object3D?} */entity = null) { + setVisible (visible, /** @type {THREE.Object3D?} */entity = null) { this.visible = visible for (const mesh of entity ? [entity] : Object.values(this.entities)) { mesh.visible = visible @@ -205,9 +207,9 @@ export class Entities extends EventEmitter { if (!playerObject.backEquipment) { playerObject.backEquipment = 'cape' } - }, () => {}) + }, () => { }) } - }, () => {}) + }, () => { }) playerObject.cape.visible = false @@ -258,7 +260,60 @@ export class Entities extends EventEmitter { if (!this.entities[entity.id] && !entity.delete) { const group = new THREE.Group() let mesh - if (entity.name === 'player') { + if (entity.name === 'item') { + /** @type {any} */ + //@ts-ignore + const item = entity.metadata?.find(m => typeof m === 'object' && m !== null && m.itemCount) + if (item) { + const textureUv = this.getItemUv?.(item.itemId ?? item.blockId) + if (textureUv) { + const { u, v, size, su, sv, texture } = textureUv + const itemsTexture = texture.clone() + itemsTexture.flipY = true + itemsTexture.offset.set(u, 1 - v - (sv ?? size)) + itemsTexture.repeat.set(su ?? size, sv ?? size) + itemsTexture.needsUpdate = true + itemsTexture.magFilter = THREE.NearestFilter + itemsTexture.minFilter = THREE.NearestFilter + const itemsTextureFlipped = itemsTexture.clone() + itemsTextureFlipped.repeat.x *= -1 + itemsTextureFlipped.needsUpdate = true + itemsTextureFlipped.offset.set(u + (su ?? size), 1 - v - (sv ?? size)) + const material = new THREE.MeshStandardMaterial({ + map: itemsTexture, + transparent: true, + alphaTest: 0.1, + }) + const materialFlipped = new THREE.MeshStandardMaterial({ + map: itemsTextureFlipped, + transparent: true, + alphaTest: 0.1, + }) + mesh = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 0.0), [ + // top left and right bottom are black box materials others are transparent + new THREE.MeshBasicMaterial({ color: 0x000000 }), new THREE.MeshBasicMaterial({ color: 0x000000 }), + new THREE.MeshBasicMaterial({ color: 0x000000 }), new THREE.MeshBasicMaterial({ color: 0x000000 }), + material, materialFlipped + ]) + mesh.scale.set(0.5, 0.5, 0.5) + mesh.position.set(0, 0.2, 0) + // set faces + // mesh.position.set(targetPos.x + 0.5 + 2, targetPos.y + 0.5, targetPos.z + 0.5) + // viewer.scene.add(mesh) + const clock = new THREE.Clock() + mesh.onBeforeRender = () => { + const delta = clock.getDelta() + mesh.rotation.y += delta + } + //@ts-ignore + group.additionalCleanup = () => { + // important: avoid texture memory leak and gpu slowdown + itemsTexture.dispose() + itemsTextureFlipped.dispose() + } + } + } + } else if (entity.name === 'player') { // CREATE NEW PLAYER ENTITY const wrapper = new THREE.Group() /** @type {PlayerObject & { animation?: PlayerAnimation }} */ @@ -331,7 +386,7 @@ export class Entities extends EventEmitter { } } // not player - const displayText = entity.metadata?.[3] && this.displaySimpleText(entity.metadata[2]); + const displayText = entity.metadata?.[3] && this.displaySimpleText(entity.metadata[2]) if (entity.name !== 'player' && displayText) { addNametag({ ...entity, username: displayText }, this.entitiesOptions, this.entities[entity.id].children.find(c => c.name === 'mesh')) } @@ -379,6 +434,7 @@ export class Entities extends EventEmitter { } if (entity.delete && e) { + if (e.additionalCleanup) e.additionalCleanup() this.emit('remove', entity) this.scene.remove(e) dispose3(e) diff --git a/prismarine-viewer/viewer/lib/worldDataEmitter.ts b/prismarine-viewer/viewer/lib/worldDataEmitter.ts index f79a8a55..fb17a994 100644 --- a/prismarine-viewer/viewer/lib/worldDataEmitter.ts +++ b/prismarine-viewer/viewer/lib/worldDataEmitter.ts @@ -132,7 +132,7 @@ export class WorldDataEmitter extends EventEmitter { this.loadedChunks[`${pos.x},${pos.z}`] = true } } else { - console.debug('skipped loading chunk', dx, dz, '>', this.viewDistance) + // console.debug('skipped loading chunk', dx, dz, '>', this.viewDistance) } } diff --git a/prismarine-viewer/viewer/prepare/atlas.ts b/prismarine-viewer/viewer/prepare/atlas.ts index 7399b196..cb30b727 100644 --- a/prismarine-viewer/viewer/prepare/atlas.ts +++ b/prismarine-viewer/viewer/prepare/atlas.ts @@ -31,13 +31,11 @@ export type JsonAtlas = { [file: string]: { u: number, v: number, - su: number, - sv: number } } } -export const makeTextureAtlas = (input: string[], getInputData: (name) => {contents: string, tileWidthMult?: number}, tilesCount = input.length, suSvOptimize: 'remove' | null = null): { +export const makeTextureAtlas = (input: string[], getInputData: (name) => { contents: string, tileWidthMult?: number }, tilesCount = input.length, suSvOptimize: 'remove' | null = null): { image: Buffer, canvas: Canvas, json: JsonAtlas diff --git a/src/index.ts b/src/index.ts index a36ea9a1..16df449c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,7 +7,7 @@ import './devtools' import './entities' import './globalDomListeners' import initCollisionShapes from './getCollisionShapes' -import { onGameLoad } from './playerWindows' +import { itemsAtlases, onGameLoad } from './playerWindows' import { supportedVersions } from 'minecraft-protocol' import './menus/components/button' @@ -25,6 +25,8 @@ import './menus/pause_screen' import './menus/keybinds_screen' import 'core-js/features/array/at' import 'core-js/features/promise/with-resolvers' + +import itemsPng from 'prismarine-viewer/public/textures/items.png' import { initWithRenderer, statsEnd, statsStart } from './topRightStats' import PrismarineBlock from 'prismarine-block' @@ -135,6 +137,28 @@ if (isFirefox) { // Create viewer const viewer: import('prismarine-viewer/viewer/lib/viewer').Viewer = new Viewer(renderer, options.numWorkers) window.viewer = viewer +new THREE.TextureLoader().load(itemsPng, (texture) => { + viewer.entities.itemsTexture = texture + // todo unify + viewer.entities.getItemUv = (id) => { + const name = loadedData.items[id]?.name + const uv = itemsAtlases.latest.textures[name] + if (!uv) { + const uvBlock = viewer.world.downloadedBlockStatesData[name]?.variants?.['']?.[0].model?.elements?.[0]?.faces?.north.texture + if (!uvBlock) return + return { + ...uvBlock, + size: Math.abs(uvBlock.su), + texture: viewer.world.material.map + } + } + return { + ...uv, + size: itemsAtlases.latest.size, + texture: viewer.entities.itemsTexture + } + } +}) viewer.entities.entitiesOptions = { fontFamily: 'mojangles' } From b632bf03e46749ed70a0bec402965451d1539c4b Mon Sep 17 00:00:00 2001 From: Vitaly Date: Mon, 18 Mar 2024 09:52:16 +0300 Subject: [PATCH 0079/1195] regression in app status hide --- src/index.ts | 2 +- src/playerWindows.ts | 4 ++-- src/react/AppStatusProvider.tsx | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index 16df449c..968dbc7c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -563,7 +563,7 @@ async function connect (connectOptions: { bot.on('kicked', (kickReason) => { console.log('User was kicked!', kickReason) - setLoadingScreenStatus(`The Minecraft server kicked you. Kick reason: ${kickReason}`, true) + setLoadingScreenStatus(`The Minecraft server kicked you. Kick reason: ${typeof kickReason === 'object' ? JSON.stringify(kickReason) : kickReason}`, true) destroyAll() }) diff --git a/src/playerWindows.ts b/src/playerWindows.ts index eff7262c..b94d0f02 100644 --- a/src/playerWindows.ts +++ b/src/playerWindows.ts @@ -87,7 +87,7 @@ export const onGameLoad = (onLoad) => { // todo format bot._client.emit('chat', { message: JSON.stringify({ - text: `[client error] cannot open unimplemented window ${win.id} (${win.type}). Slots: ${win.slots.map(item => getItemName(item) ?? '(empty)').join(', ')}` + text: `[client error] cannot open unimplemented window ${win.id} (${win.type}). Slots: ${win.slots.map(item => getItemName(item)).filter(Boolean).join(', ')}` }) }) bot.currentWindow?.['close']() @@ -296,7 +296,7 @@ export const getItemName = (item: import('prismarine-item').Item | null) => { const customName = itemNbt.display?.Name if (!customName) return const parsed = mojangson.simplify(mojangson.parse(customName)) - // todo display damage and full text renderer from sign renderer + // todo display full text renderer from sign renderer const text = flat(parsed).map(x => x.text) return text } diff --git a/src/react/AppStatusProvider.tsx b/src/react/AppStatusProvider.tsx index c8d7f696..52c95383 100644 --- a/src/react/AppStatusProvider.tsx +++ b/src/react/AppStatusProvider.tsx @@ -73,6 +73,9 @@ export default () => { window.loadedData = undefined if (activeModalStacks['main-menu']) { insertActiveModalStack('main-menu') + if (activeModalStack.at(-1)?.reactType === 'app-status') { + hideModal(undefined, undefined, { force: true }) // workaround: hide loader that was shown on world loading + } } else { hideModal(undefined, undefined, { force: true }) } From e1cc9833ba1f67e97700ceb231c68a9d6ab185ec Mon Sep 17 00:00:00 2001 From: Vitaly Date: Mon, 18 Mar 2024 10:50:33 +0300 Subject: [PATCH 0080/1195] add auto deploy to s.mcraft.fun for every next push --- .github/workflows/next-deploy.yml | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 .github/workflows/next-deploy.yml diff --git a/.github/workflows/next-deploy.yml b/.github/workflows/next-deploy.yml new file mode 100644 index 00000000..5b07310e --- /dev/null +++ b/.github/workflows/next-deploy.yml @@ -0,0 +1,40 @@ +name: Vercel Deploy Next +env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} +on: + push: + branches: + - next +jobs: + deploy: + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + ref: refs/pull/${{ github.event.issue.number }}/head + - name: Install Global Dependencies + run: npm install --global vercel pnpm + - name: Pull Vercel Environment Information + run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }} + - name: Build Project Artifacts + run: vercel build --token=${{ secrets.VERCEL_TOKEN }} + - run: pnpm build-storybook + - name: Copy playground files + run: node prismarine-viewer/esbuild.mjs && cp prismarine-viewer/public/index.html .vercel/output/static/playground.html && cp prismarine-viewer/public/playground.js .vercel/output/static/playground.js + - name: Download Generated Sounds map + run: node scripts/downloadSoundsMap.mjs + - name: Deploy Project Artifacts to Vercel + uses: mathiasvr/command-output@v2.0.0 + with: + run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} + id: deploy + - name: Set deployment alias + run: vercel alias set ${{ steps.deploy.outputs.stdout }} ${{ secrets.TEST_PREVIEW_DOMAIN }} --token=${{ secrets.VERCEL_TOKEN }} + # - uses: mshick/add-pr-comment@v2 + # with: + # message: | + # Deployed to Vercel Preview: ${{ steps.deploy.outputs.stdout }} From 1454259c3132c8c904d79a93e339bc68054e8487 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 19 Mar 2024 11:13:04 +0300 Subject: [PATCH 0081/1195] fix icon & ci --- .github/workflows/next-deploy.yml | 2 -- assets/manifest.json | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/next-deploy.yml b/.github/workflows/next-deploy.yml index 5b07310e..93c46aeb 100644 --- a/.github/workflows/next-deploy.yml +++ b/.github/workflows/next-deploy.yml @@ -14,8 +14,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 - with: - ref: refs/pull/${{ github.event.issue.number }}/head - name: Install Global Dependencies run: npm install --global vercel pnpm - name: Pull Vercel Environment Information diff --git a/assets/manifest.json b/assets/manifest.json index e6e2068e..9ec96f08 100644 --- a/assets/manifest.json +++ b/assets/manifest.json @@ -6,7 +6,7 @@ "icons": [ { "src": "favicon.png", - "sizes": "512x512" + "sizes": "720x720" } ], "background_color": "#349474", From 14460a62b26c4941208c3d8e2e818d37ae036906 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 21 Mar 2024 06:32:14 +0300 Subject: [PATCH 0082/1195] feat: allow copying maps to device memory from external providers (eg zip, remote) from pause menu feat: display broken worlds warning fix: fs didn't reset on world unload feat: allow full warps support (eg Greenfield maps)! with a way to set your own --- package.json | 2 +- pnpm-lock.yaml | 15 ++++++--- src/browserfs.ts | 49 +++++++++++++++++++++++++++--- src/index.ts | 7 +++-- src/loadSave.ts | 24 ++++++++++++--- src/menus/pause_screen.js | 30 +++++++++++++----- src/react/Singleplayer.tsx | 17 +++++++++-- src/react/SingleplayerProvider.tsx | 21 +++++++++++-- 8 files changed, 137 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 18077e28..309ca50a 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "esbuild": "^0.19.3", "esbuild-plugin-polyfill-node": "^0.3.0", "express": "^4.18.2", - "flying-squid": "npm:@zardoy/flying-squid@^0.0.10", + "flying-squid": "npm:@zardoy/flying-squid@^0.0.12", "fs-extra": "^11.1.1", "iconify-icon": "^1.0.8", "jszip": "^3.10.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d61b5d64..174d0b0c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,8 +85,8 @@ importers: specifier: ^4.18.2 version: 4.18.2 flying-squid: - specifier: npm:@zardoy/flying-squid@^0.0.10 - version: /@zardoy/flying-squid@0.0.10 + specifier: npm:@zardoy/flying-squid@^0.0.12 + version: /@zardoy/flying-squid@0.0.12 fs-extra: specifier: ^11.1.1 version: 11.1.1 @@ -5655,8 +5655,8 @@ packages: tslib: 1.14.1 dev: true - /@zardoy/flying-squid@0.0.10: - resolution: {integrity: sha512-uMpNRjYWbBAgWUld4pIPOIM3vBtcR4LWuBBBwDALhZDIRU+Iu7kHjbUD0OfBzayYn78qB3T1d6dJj4oRa0M7Jg==} + /@zardoy/flying-squid@0.0.12: + resolution: {integrity: sha512-wFvdROB9iEucdYamBLXhKKGiUdprjxJsSo0Mk4UKMUoau9G3oly1tVfkuVZc9mQm0NSLOx8oSPA3uCNUT9lAgw==} engines: {node: '>=8'} hasBin: true dependencies: @@ -5688,6 +5688,7 @@ packages: typed-emitter: 1.4.0 uuid-1345: 1.0.2 vec3: 0.1.8 + yaml: 2.4.1 yargs: 17.7.2 transitivePeerDependencies: - encoding @@ -15303,6 +15304,12 @@ packages: engines: {node: '>= 14'} dev: true + /yaml@2.4.1: + resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + engines: {node: '>= 14'} + hasBin: true + dev: false + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} diff --git a/src/browserfs.ts b/src/browserfs.ts index d9670b14..4d776fab 100644 --- a/src/browserfs.ts +++ b/src/browserfs.ts @@ -28,6 +28,7 @@ browserfs.configure({ }) export const forceCachedDataPaths = {} +export const forceRedirectPaths = {} //@ts-expect-error fs.promises = new Proxy(Object.fromEntries(['readFile', 'writeFile', 'stat', 'mkdir', 'rmdir', 'unlink', 'rename', /* 'copyFile', */'readdir'].map(key => [key, promisify(fs[key])])), { @@ -36,14 +37,20 @@ fs.promises = new Proxy(Object.fromEntries(['readFile', 'writeFile', 'stat', 'mk return (...args) => { // browser fs bug: if path doesn't start with / dirname will return . which would cause infinite loop, so we need to normalize paths if (typeof args[0] === 'string' && !args[0].startsWith('/')) args[0] = '/' + args[0] + const toRemap = Object.entries(forceRedirectPaths).find(([from]) => args[0].startsWith(from)) + if (toRemap) { + args[0] = args[0].replace(toRemap[0], toRemap[1]) + } // Write methods // todo issue one-time warning (in chat I guess) - if (fsState.isReadonly) { + const readonly = fsState.isReadonly && !(args[0].startsWith('/data') && !fsState.inMemorySave) // allow copying worlds from external providers such as zip + if (readonly) { if (oneOf(p, 'readFile', 'writeFile') && forceCachedDataPaths[args[0]]) { if (p === 'readFile') { return Promise.resolve(forceCachedDataPaths[args[0]]) } else if (p === 'writeFile') { forceCachedDataPaths[args[0]] = args[1] + console.debug('Skipped writing to readonly fs', args[0]) return Promise.resolve() } } @@ -322,7 +329,19 @@ export const possiblyCleanHandle = (callback = () => { }) => { } } -export const copyFilesAsyncWithProgress = async (pathSrc: string, pathDest: string) => { +export const copyFilesAsyncWithProgress = async (pathSrc: string, pathDest: string, throwRootNotExist = true) => { + const stat = await existsViaStats(pathSrc) + if (!stat) { + if (throwRootNotExist) throw new Error(`Cannot copy. Source directory ${pathSrc} does not exist`) + console.debug('source directory does not exist', pathSrc) + return + } + if (!stat.isDirectory()) { + await fs.promises.writeFile(pathDest, await fs.promises.readFile(pathSrc)) + console.debug('copied single file', pathSrc, pathDest) + return + } + try { setLoadingScreenStatus('Copying files') let filesCount = 0 @@ -339,21 +358,35 @@ export const copyFilesAsyncWithProgress = async (pathSrc: string, pathDest: stri } })) } + console.debug('Counting files', pathSrc) await countFiles(pathSrc) + console.debug('counted', filesCount) let copied = 0 await copyFilesAsync(pathSrc, pathDest, (name) => { copied++ - setLoadingScreenStatus(`Copying files (${copied}/${filesCount}) ${name}...`) + setLoadingScreenStatus(`Copying files (${copied}/${filesCount}): ${name}`) }) } finally { setLoadingScreenStatus(undefined) } } +export const existsViaStats = async (path: string) => { + try { + return await fs.promises.stat(path) + } catch (e) { + return false + } +} + export const copyFilesAsync = async (pathSrc: string, pathDest: string, fileCopied?: (name) => void) => { // query: can't use fs.copy! use fs.promises.writeFile and readFile const files = await fs.promises.readdir(pathSrc) + if (!await existsViaStats(pathDest)) { + await fs.promises.mkdir(pathDest, { recursive: true }) + } + // Use Promise.all to parallelize file/directory copying await Promise.all(files.map(async (file) => { const curPathSrc = join(pathSrc, file) @@ -365,8 +398,14 @@ export const copyFilesAsync = async (pathSrc: string, pathDest: string, fileCopi await copyFilesAsync(curPathSrc, curPathDest, fileCopied) } else { // Copy file - await fs.promises.writeFile(curPathDest, await fs.promises.readFile(curPathSrc)) - fileCopied?.(file) + try { + await fs.promises.writeFile(curPathDest, await fs.promises.readFile(curPathSrc)) + console.debug('copied file', curPathSrc, curPathDest) + } catch (err) { + console.error('Error copying file', curPathSrc, curPathDest, err) + throw err + } + fileCopied?.(curPathDest) } })) } diff --git a/src/index.ts b/src/index.ts index 968dbc7c..1c14c7d1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -355,13 +355,16 @@ async function connect (connectOptions: { //@ts-expect-error window.bot = bot = undefined } + resetStateAfterDisconnect() + cleanFs() + removeAllListeners() + } + const cleanFs = () => { if (singleplayer && !fsState.inMemorySave) { possiblyCleanHandle(() => { // todo: this is not enough, we need to wait for all async operations to finish }) } - resetStateAfterDisconnect() - removeAllListeners() } const onPossibleErrorDisconnect = () => { // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison diff --git a/src/loadSave.ts b/src/loadSave.ts index d8531344..626b06f6 100644 --- a/src/loadSave.ts +++ b/src/loadSave.ts @@ -1,11 +1,12 @@ import fs from 'fs' +import path from 'path' import { supportedVersions } from 'flying-squid/dist/lib/version' import * as nbt from 'prismarine-nbt' import { proxy } from 'valtio' import { gzip } from 'node-gzip' import { options } from './optionsStorage' import { nameToMcOfflineUUID, disconnect } from './flyingSquidUtils' -import { forceCachedDataPaths } from './browserfs' +import { forceCachedDataPaths, forceRedirectPaths, mkdirRecursive } from './browserfs' import { isMajorVersionGreater } from './utils' import { activeModalStacks, insertActiveModalStack, miscUiState } from './globalState' @@ -43,6 +44,14 @@ export const readLevelDat = async (path) => { } export const loadSave = async (root = '/world') => { + // todo test + if (miscUiState.gameLoaded) { + await disconnect() + await new Promise(resolve => { + setTimeout(resolve) + }) + } + const disablePrompts = options.disableLoadPrompts // todo do it in singleplayer as well @@ -51,6 +60,10 @@ export const loadSave = async (root = '/world') => { // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete forceCachedDataPaths[key] } + for (const key in forceRedirectPaths) { + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete + delete forceRedirectPaths[key] + } // todo check jsHeapSizeLimit const warnings: string[] = [] @@ -105,6 +118,7 @@ export const loadSave = async (root = '/world') => { if (fsState.isReadonly) { forceCachedDataPaths[playerDatPath] = playerDat } else { + await mkdirRecursive(path.dirname(playerDatPath)) await fs.promises.writeFile(playerDatPath, playerDat) } } @@ -136,10 +150,12 @@ export const loadSave = async (root = '/world') => { alert('Note: the world is saved only on /save or disconnect! Ensure you have backup!') } - // todo fix these - if (miscUiState.gameLoaded) { - await disconnect() + // improve compatibility with community saves + const rootRemapFiles = ['Warp files'] + for (const rootRemapFile of rootRemapFiles) { + forceRedirectPaths[path.join(root, rootRemapFile)] = path.join(root, '..', rootRemapFile) } + // todo reimplement if (activeModalStacks['main-menu']) { insertActiveModalStack('main-menu') diff --git a/src/menus/pause_screen.js b/src/menus/pause_screen.js index ce376645..ff3226a7 100644 --- a/src/menus/pause_screen.js +++ b/src/menus/pause_screen.js @@ -1,15 +1,18 @@ //@ts-check +const { join } = require('path') const { LitElement, html, css } = require('lit') const { subscribe } = require('valtio') const { subscribeKey } = require('valtio/utils') +const { usedServerPathsV1 } = require('flying-squid/dist/lib/modules/world') const { hideCurrentModal, showModal, miscUiState, notification, openOptionsMenu } = require('../globalState') const { fsState } = require('../loadSave') -const { openGithub } = require('../utils') +const { openGithub, setLoadingScreenStatus } = require('../utils') const { disconnect } = require('../flyingSquidUtils') const { closeWan, openToWanAndCopyJoinLink, getJoinLink } = require('../localServerMultiplayer') -const { uniqueFileNameFromWorldName, copyFilesAsyncWithProgress } = require('../browserfs') +const { uniqueFileNameFromWorldName, copyFilesAsyncWithProgress, existsViaStats, mkdirRecursive } = require('../browserfs') const { showOptionsModal } = require('../react/SelectOption') const { openURL } = require('./components/common') +const fs = require('fs').promises class PauseScreen extends LitElement { static get styles () { @@ -69,10 +72,23 @@ class PauseScreen extends LitElement { } const action = await showOptionsModal('World actions...', ['Save to browser memory']) if (action === 'Save to browser memory') { - //@ts-expect-error - const { worldFolder } = localServer.options - const savePath = await uniqueFileNameFromWorldName(worldFolder.split('/').pop(), `/data/worlds`) - await copyFilesAsyncWithProgress(worldFolder, savePath) + setLoadingScreenStatus('Saving world') + try { + //@ts-expect-error + const { worldFolder } = localServer.options + const saveRootPath = await uniqueFileNameFromWorldName(worldFolder.split('/').pop(), `/data/worlds`) + await mkdirRecursive(saveRootPath) + for (const copyPath of [...usedServerPathsV1, 'icon.png']) { + const srcPath = join(worldFolder, copyPath) + const savePath = join(saveRootPath, copyPath) + // eslint-disable-next-line no-await-in-loop + await copyFilesAsyncWithProgress(srcPath, savePath, false) + } + } catch (err) { + void showOptionsModal(`Error while saving the world: ${err.message}`, []) + } finally { + setLoadingScreenStatus(undefined) + } } } @@ -83,7 +99,7 @@ class PauseScreen extends LitElement { return html`

- + this.openWorldActions()}>

Game Menu

diff --git a/src/react/Singleplayer.tsx b/src/react/Singleplayer.tsx index e806c02b..1ab2b446 100644 --- a/src/react/Singleplayer.tsx +++ b/src/react/Singleplayer.tsx @@ -65,12 +65,15 @@ interface Props { disabledProviders?: string[] isReadonly?: boolean error?: string + warning?: string + warningAction?: () => void + warningActionLabel?: string onWorldAction (action: 'load' | 'export' | 'delete' | 'edit', worldName: string): void onGeneralAction (action: 'cancel' | 'create'): void } -export default ({ worldData, onGeneralAction, onWorldAction, activeProvider, setActiveProvider, providerActions, providers, disabledProviders, error, isReadonly }: Props) => { +export default ({ worldData, onGeneralAction, onWorldAction, activeProvider, setActiveProvider, providerActions, providers, disabledProviders, error, isReadonly, warning, warningAction, warningActionLabel }: Props) => { const containerRef = useRef() const firstButton = useRef(null!) @@ -129,7 +132,17 @@ export default ({ worldData, onGeneralAction, onWorldAction, activeProvider, set :
{error || 'Loading (#dev check console if loading too long)...'}
+ }}>{error || 'Loading (check #dev console if loading too long)...'}

Qm8TZ;=t4szmO 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 9*^r)zDZvYiYJs=SyY2vbT~4Z`uF# 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

+ } + { + warning && }
diff --git a/src/react/SingleplayerProvider.tsx b/src/react/SingleplayerProvider.tsx index 8a081663..349c85c7 100644 --- a/src/react/SingleplayerProvider.tsx +++ b/src/react/SingleplayerProvider.tsx @@ -16,6 +16,7 @@ import GoogleButton from './GoogleButton' const worldsProxy = proxy({ value: null as null | WorldProps[], + brokenWorlds: [] as string[], selectedProvider: 'local' as 'local' | 'google', error: '', }) @@ -40,8 +41,10 @@ const providersEnableFeatures = { export const readWorlds = (abortController: AbortController) => { if (abortController.signal.aborted) return - worldsProxy.error = ''; + worldsProxy.error = '' + worldsProxy.brokenWorlds = []; (async () => { + const brokenWorlds = [] as string[] try { const loggedIn = !!googleProviderData.accessToken worldsProxy.value = null @@ -72,9 +75,10 @@ export const readWorlds = (abortController: AbortController) => { detail: `${levelDat.Version?.Name ?? 'unknown version'}, ${folder}`, size, } satisfies WorldProps - }))).filter(x => { + }))).filter((x, i) => { if (x.status === 'rejected') { console.warn(x.reason) + brokenWorlds.push(worlds[i]) return false } return true @@ -87,6 +91,7 @@ export const readWorlds = (abortController: AbortController) => { worldsProxy.value = null worldsProxy.error = err.message } + worldsProxy.brokenWorlds = brokenWorlds })().catch((err) => { // todo it still doesn't work for some reason! worldsProxy.error = err.message @@ -128,7 +133,7 @@ export const loadGoogleDriveApi = async () => { const Inner = () => { const worlds = useSnapshot(worldsProxy).value as WorldProps[] | null - const { selectedProvider, error } = useSnapshot(worldsProxy) + const { selectedProvider, error, brokenWorlds } = useSnapshot(worldsProxy) const readWorldsAbortController = useRef(new AbortController()) useEffect(() => { @@ -260,6 +265,16 @@ const Inner = () => { setActiveProvider={(provider) => { worldsProxy.selectedProvider = provider as any }} + warning={brokenWorlds.length ? `Some worlds are broken: ${brokenWorlds.join(', ')}` : undefined} + warningAction={async () => { + for (const brokenWorld of worldsProxy.brokenWorlds) { + setLoadingScreenStatus(`Removing broken world ${brokenWorld}`) + // eslint-disable-next-line no-await-in-loop + await removeFileRecursiveAsync(`${getWorldsPath()}/${brokenWorld}`) + } + setLoadingScreenStatus(undefined) + }} + warningActionLabel='Remove broken worlds' onWorldAction={async (action, worldName) => { const worldPath = `${getWorldsPath()}/${worldName}` const openInGoogleDrive = () => { From d7bdf3633db407b3210c85cad9c241d4c8f784f2 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 21 Mar 2024 07:24:22 +0300 Subject: [PATCH 0083/1195] feat: new reworked notifications feat: support for world icons in singleplayer menu --- package.json | 7 +-- pnpm-lock.yaml | 17 ++++--- src/dragndrop.ts | 7 ++- src/globalState.ts | 13 ----- src/index.ts | 11 ++-- src/loadSave.ts | 1 + src/menus/notification.js | 81 ------------------------------ src/menus/pause_screen.js | 4 +- src/react/Notification.tsx | 71 ++++++++++++++++++++++++++ src/react/NotificationProvider.tsx | 67 ++++++++++++++++++++++++ src/react/Singleplayer.tsx | 9 ++-- src/react/SingleplayerProvider.tsx | 12 +++++ src/react/singleplayer.module.css | 4 +- src/reactUi.tsx | 30 +++++++---- src/soundSystem.ts | 7 ++- src/texturePack.ts | 6 +-- src/utils.ts | 7 +-- 17 files changed, 214 insertions(+), 140 deletions(-) delete mode 100644 src/menus/notification.js create mode 100644 src/react/Notification.tsx create mode 100644 src/react/NotificationProvider.tsx diff --git a/package.json b/package.json index 309ca50a..375372f4 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,9 @@ "esbuild": "^0.19.3", "esbuild-plugin-polyfill-node": "^0.3.0", "express": "^4.18.2", - "flying-squid": "npm:@zardoy/flying-squid@^0.0.12", + "flying-squid": "npm:@zardoy/flying-squid@^0.0.13", "fs-extra": "^11.1.1", + "google-drive-browserfs": "github:zardoy/browserfs#google-drive", "iconify-icon": "^1.0.8", "jszip": "^3.10.1", "lit": "^2.8.0", @@ -61,6 +62,7 @@ "node-gzip": "^1.1.2", "peerjs": "^1.5.0", "pretty-bytes": "^6.1.1", + "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", "qrcode.react": "^3.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -74,8 +76,7 @@ "title-case": "3.x", "ua-parser-js": "^1.0.37", "valtio": "^1.11.1", - "workbox-build": "^7.0.0", - "google-drive-browserfs": "github:zardoy/browserfs#google-drive" + "workbox-build": "^7.0.0" }, "devDependencies": { "@storybook/addon-essentials": "^7.4.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 174d0b0c..d3ed94c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,8 +85,8 @@ importers: specifier: ^4.18.2 version: 4.18.2 flying-squid: - specifier: npm:@zardoy/flying-squid@^0.0.12 - version: /@zardoy/flying-squid@0.0.12 + specifier: npm:@zardoy/flying-squid@^0.0.13 + version: /@zardoy/flying-squid@0.0.13 fs-extra: specifier: ^11.1.1 version: 11.1.1 @@ -123,6 +123,9 @@ importers: pretty-bytes: specifier: ^6.1.1 version: 6.1.1 + prismarine-provider-anvil: + specifier: github:zardoy/prismarine-provider-anvil#everything + version: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0) qrcode.react: specifier: ^3.1.0 version: 3.1.0(react@18.2.0) @@ -5655,8 +5658,8 @@ packages: tslib: 1.14.1 dev: true - /@zardoy/flying-squid@0.0.12: - resolution: {integrity: sha512-wFvdROB9iEucdYamBLXhKKGiUdprjxJsSo0Mk4UKMUoau9G3oly1tVfkuVZc9mQm0NSLOx8oSPA3uCNUT9lAgw==} + /@zardoy/flying-squid@0.0.13: + resolution: {integrity: sha512-K4vjMx+pi+Xbmm/m6xb17hml8w+0Bk89SiqGuDiB5zaRcTup7K5iqmZ2STQRrTZkjxSNh+eX26R67x2l0XHBIg==} engines: {node: '>=8'} hasBin: true dependencies: @@ -5671,7 +5674,7 @@ packages: minecraft-data: 3.62.0 minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f mkdirp: 2.1.6 - moment: 2.29.4 + moment: 2.30.1 needle: 2.9.1 node-gzip: 1.1.2 node-rsa: 1.1.1 @@ -11149,8 +11152,8 @@ packages: dependencies: nearley: 2.20.1 - /moment@2.29.4: - resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + /moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} dev: false /moo@0.5.2: diff --git a/src/dragndrop.ts b/src/dragndrop.ts index 83aeb99f..034b7b9b 100644 --- a/src/dragndrop.ts +++ b/src/dragndrop.ts @@ -4,7 +4,8 @@ import * as nbt from 'prismarine-nbt' import RegionFile from 'prismarine-provider-anvil/src/region' import { versions } from 'minecraft-data' import { openWorldDirectory, openWorldZip } from './browserfs' -import { isGameActive, showNotification } from './globalState' +import { isGameActive } from './globalState' +import { showNotification } from './react/NotificationProvider' const parseNbt = promisify(nbt.parse) const simplifyNbt = nbt.simplify @@ -100,9 +101,7 @@ async function handleDroppedFile (file: File) { alert('Couldn\'t parse nbt, ensure you are opening .dat or file (or .zip/folder with a world)') throw err }) - showNotification({ - message: `${file.name} data available in browser console`, - }) + showNotification(`${file.name} data available in browser console`) console.log('raw', parsed) console.log('simplified', nbt.simplify(parsed)) } diff --git a/src/globalState.ts b/src/globalState.ts index adaf4361..749b3a8f 100644 --- a/src/globalState.ts +++ b/src/globalState.ts @@ -158,17 +158,4 @@ export const gameAdditionalState = proxy({ window.gameAdditionalState = gameAdditionalState -// rename current (non-stackable) notification to one-time (system) notification -const initialNotification = { - show: false, - autoHide: true, - message: '', - type: 'info', -} -export const notification = proxy(initialNotification) - -export const showNotification = (newNotification: Partial) => { - Object.assign(notification, { show: true, ...newNotification }, initialNotification) -} - // todo restore auto-save on interval for player data! (or implement it in flying squid since there is already auto-save for world) diff --git a/src/index.ts b/src/index.ts index 1c14c7d1..e10f60a9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -60,7 +60,6 @@ import { insertActiveModalStack, isGameActive, miscUiState, - notification } from './globalState' @@ -95,6 +94,8 @@ import { downloadSoundsIfNeeded } from './soundSystem' import { ua } from './react/utils' import { handleMovementStickDelta, joystickPointer } from './react/TouchAreasControls' import { possiblyHandleStateVariable } from './googledrive' +import flyingSquidEvents from './flyingSquidEvents' +import { hideNotification, notificationProxy } from './react/NotificationProvider' window.debug = debug window.THREE = THREE @@ -366,6 +367,7 @@ async function connect (connectOptions: { }) } } + let lastPacket = undefined as string | undefined const onPossibleErrorDisconnect = () => { // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison if (lastPacket && bot?._client && bot._client.state !== 'play') { @@ -373,6 +375,7 @@ async function connect (connectOptions: { } } const handleError = (err) => { + console.error(err) errorAbortController.abort() if (isCypress()) throw err if (miscUiState.gameLoaded) return @@ -471,6 +474,7 @@ async function connect (connectOptions: { setLoadingScreenStatus(newStatus, false, false, true) }) }) + flyingSquidEvents() } let initialLoadingText: string @@ -570,7 +574,6 @@ async function connect (connectOptions: { destroyAll() }) - let lastPacket = undefined as string | undefined const packetBeforePlay = (_, __, ___, fullBuffer) => { lastPacket = fullBuffer.toString() } @@ -676,7 +679,9 @@ async function connect (connectOptions: { } function changeCallback () { - notification.show = false + if (notificationProxy.id === 'pointerlockchange') { + hideNotification() + } if (renderer.xr.isPresenting) return // todo if (!pointerLock.hasPointerLock && activeModalStack.length === 0) { showModal(pauseMenu) diff --git a/src/loadSave.ts b/src/loadSave.ts index 626b06f6..965b1a7c 100644 --- a/src/loadSave.ts +++ b/src/loadSave.ts @@ -60,6 +60,7 @@ export const loadSave = async (root = '/world') => { // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete forceCachedDataPaths[key] } + // eslint-disable-next-line guard-for-in for (const key in forceRedirectPaths) { // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete forceRedirectPaths[key] diff --git a/src/menus/notification.js b/src/menus/notification.js deleted file mode 100644 index 0ac6db16..00000000 --- a/src/menus/notification.js +++ /dev/null @@ -1,81 +0,0 @@ -//@ts-check - -// create lit element -const { LitElement, html, css } = require('lit') -const { subscribe } = require('valtio') -const { notification } = require('../globalState') - -class Notification extends LitElement { - static get properties () { - return { - renderHtml: { type: Boolean }, - } - } - - constructor () { - super() - this.renderHtml = false - let timeout - subscribe(notification, () => { - if (timeout) clearTimeout(timeout) - this.requestUpdate() - if (!notification.show) return - this.renderHtml = true - if (!notification.autoHide) return - timeout = setTimeout(() => { - notification.show = false - }, 3000) - }) - } - - render () { - if (!this.renderHtml) return - const show = notification.show && notification.message - return html` -
- ${notification.message} -
- ` - } - - ontransitionend = (event) => { - if (event.propertyName !== 'opacity') return - - if (!notification.show) { - this.renderHtml = false - } - } - - static get styles () { - return css` - .notification { - position: absolute; - bottom: 0; - right: 0; - min-width: 200px; - padding: 10px; - white-space: nowrap; - font-size: 12px; - color: #fff; - text-align: center; - background: #000; - opacity: 0; - transition: opacity 0.3s ease-in-out; - } - - .notification-info { - background: #000; - } - - .notification-error { - background: #d00; - } - - .notification-show { - opacity: 1; - } - ` - } -} - -window.customElements.define('pmui-notification', Notification) diff --git a/src/menus/pause_screen.js b/src/menus/pause_screen.js index ff3226a7..3473dfc5 100644 --- a/src/menus/pause_screen.js +++ b/src/menus/pause_screen.js @@ -4,7 +4,7 @@ const { LitElement, html, css } = require('lit') const { subscribe } = require('valtio') const { subscribeKey } = require('valtio/utils') const { usedServerPathsV1 } = require('flying-squid/dist/lib/modules/world') -const { hideCurrentModal, showModal, miscUiState, notification, openOptionsMenu } = require('../globalState') +const { hideCurrentModal, showModal, miscUiState, openOptionsMenu } = require('../globalState') const { fsState } = require('../loadSave') const { openGithub, setLoadingScreenStatus } = require('../utils') const { disconnect } = require('../flyingSquidUtils') @@ -143,8 +143,6 @@ class PauseScreen extends LitElement { show () { this.focus() - // todo? - notification.show = false } onReturnPress () { diff --git a/src/react/Notification.tsx b/src/react/Notification.tsx new file mode 100644 index 00000000..6ebd49e2 --- /dev/null +++ b/src/react/Notification.tsx @@ -0,0 +1,71 @@ +import { Transition } from 'react-transition-group' +import PixelartIcon from './PixelartIcon' + +// slide up +const startStyle = { opacity: 0, transform: 'translateY(100%)' } +const endExitStyle = { opacity: 0, transform: 'translateY(-100%)' } +const endStyle = { opacity: 1, transform: 'translateY(0)' } + +const stateStyles = { + entering: startStyle, + entered: endStyle, + exiting: endExitStyle, + exited: endExitStyle, +} +const duration = 200 +const basicStyle = { + transition: `${duration}ms ease-in-out all`, +} + +// save pass: login + +export default ({ type = 'message', message, subMessage = '', open, icon = '', action = undefined as (() => void) | undefined }) => { + const isError = type === 'error' + icon ||= isError ? 'alert' : 'message' + + return + {state => { + const addStyles = { ...basicStyle, ...stateStyles[state] } + + return
+ +
+
+ {message} +
+
{subMessage}
+
+
+ }} +
+ +} diff --git a/src/react/NotificationProvider.tsx b/src/react/NotificationProvider.tsx new file mode 100644 index 00000000..2f27a595 --- /dev/null +++ b/src/react/NotificationProvider.tsx @@ -0,0 +1,67 @@ +import React, { useEffect } from 'react' +import { proxy, useSnapshot } from 'valtio' +import Notification from './Notification' + +type NotificationType = React.ComponentProps & { + autoHide: boolean + id: string +} + +// todo stacking +export const notificationProxy = proxy({ + message: '', + open: false, + type: 'message', + subMessage: '', + icon: '', + autoHide: true, + id: '', +} satisfies NotificationType as NotificationType) + +export const showNotification = ( + message: string, + subMessage = '', + isError = false, + icon = '', + action = undefined as (() => void) | undefined, + autoHide = true +) => { + notificationProxy.message = message + notificationProxy.subMessage = subMessage + notificationProxy.type = isError ? 'error' : 'message' + notificationProxy.icon = icon + notificationProxy.open = true + notificationProxy.autoHide = autoHide + notificationProxy.action = action +} +export const hideNotification = () => { + // openNotification('') // reset + notificationProxy.open = false +} + +export default () => { + const { autoHide, message, open, icon, type, subMessage } = useSnapshot(notificationProxy) + + useEffect(() => { + if (autoHide && open) { + setTimeout(() => { + hideNotification() + }, 7000) + } + }, [autoHide, open]) + + // test + // useEffect(() => { + // setTimeout(() => { + // openNotification('test', 'test', false, 'message') + // }, 1000) + // }, []) + + return +} diff --git a/src/react/Singleplayer.tsx b/src/react/Singleplayer.tsx index 1ab2b446..c00ffc8c 100644 --- a/src/react/Singleplayer.tsx +++ b/src/react/Singleplayer.tsx @@ -14,6 +14,7 @@ import Tabs from './Tabs' export interface WorldProps { name: string title: string + iconBase64?: string size?: number lastPlayed?: number isFocused?: boolean @@ -22,7 +23,7 @@ export interface WorldProps { onInteraction?(interaction: 'enter' | 'space') } -const World = ({ name, isFocused, title, lastPlayed, size, detail = '', onFocus, onInteraction }: WorldProps) => { +const World = ({ name, isFocused, title, lastPlayed, size, detail = '', onFocus, onInteraction, iconBase64 }: WorldProps) => { const timeRelativeFormatted = useMemo(() => { if (!lastPlayed) return const formatter = new Intl.RelativeTimeFormat('en', { numeric: 'auto' }) @@ -47,7 +48,7 @@ const World = ({ name, isFocused, title, lastPlayed, size, detail = '', onFocus, onInteraction?.(e.code === 'Enter' ? 'enter' : 'space') } }} onDoubleClick={() => onInteraction?.('enter')}> - + world preview
{title}
{timeRelativeFormatted} {detail.slice(-30)}
@@ -123,8 +124,8 @@ export default ({ worldData, onGeneralAction, onWorldAction, activeProvider, set } { worldData - ? worldData.filter(data => data.title.toLowerCase().includes(search.toLowerCase())).map(({ name, title, size, lastPlayed, detail }) => ( - { + ? worldData.filter(data => data.title.toLowerCase().includes(search.toLowerCase())).map(({ name, size, detail, ...rest }) => ( + { if (interaction === 'enter') onWorldAction('load', name) else if (interaction === 'space') firstButton.current?.focus() }} detail={detail} /> diff --git a/src/react/SingleplayerProvider.tsx b/src/react/SingleplayerProvider.tsx index 349c85c7..32d175f4 100644 --- a/src/react/SingleplayerProvider.tsx +++ b/src/react/SingleplayerProvider.tsx @@ -30,12 +30,14 @@ const providersEnableFeatures = { calculateSize: true, delete: true, export: true, + icon: true }, google: { calculateSize: false, // TODO delete: false, export: false, + icon: true } } @@ -67,12 +69,22 @@ export const readWorlds = (abortController: AbortController) => { size += stat.size } } + let iconBase64 = '' + if (providersEnableFeatures[provider].icon) { + const iconPath = `${worldsPath}/${folder}/icon.png` + try { + iconBase64 = await fs.promises.readFile(iconPath, 'base64') + } catch { + // ignore + } + } const levelName = levelDat.LevelName as string | undefined return { name: folder, title: levelName ?? folder, lastPlayed: levelDat.LastPlayed && longArrayToNumber(levelDat.LastPlayed), detail: `${levelDat.Version?.Name ?? 'unknown version'}, ${folder}`, + iconBase64, size, } satisfies WorldProps }))).filter((x, i) => { diff --git a/src/react/singleplayer.module.css b/src/react/singleplayer.module.css index 44f9f83a..3258ba29 100644 --- a/src/react/singleplayer.module.css +++ b/src/react/singleplayer.module.css @@ -36,9 +36,11 @@ } .world_image { height: 100%; - filter: grayscale(1); aspect-ratio: 1; } +.world_image.image_missing { + filter: grayscale(1); +} .world_root.world_focused { border-color: white; } diff --git a/src/reactUi.tsx b/src/reactUi.tsx index 45415578..1d8ac242 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -1,6 +1,5 @@ //@ts-check -import { renderToDom } from '@zardoy/react-util' - +import { renderToDom, ErrorBoundary } from '@zardoy/react-util' import { useSnapshot } from 'valtio' import { QRCodeSVG } from 'qrcode.react' import { createPortal } from 'react-dom' @@ -22,9 +21,10 @@ import widgets from './react/widgets' import { useIsWidgetActive } from './react/utils' import GlobalSearchInput from './GlobalSearchInput' import TouchAreasControlsProvider from './react/TouchAreasControlsProvider' +import NotificationProvider from './react/NotificationProvider' -const Portal = ({ children, to }) => { - return createPortal(children, to) +const RobustPortal = ({ children, to }) => { + return createPortal({children}, to) } const DisplayQr = () => { @@ -57,7 +57,7 @@ const InGameUi = () => { if (!gameLoaded) return return <> - + {/* apply scaling */} @@ -65,13 +65,13 @@ const InGameUi = () => { - + - + {/* becaues of z-index */} - + } @@ -90,7 +90,7 @@ const App = () => { return
- + @@ -98,10 +98,20 @@ const App = () => { - + +
} +const PerComponentErrorBoundary = ({ children }) => { + return children.map((child, i) => { + // notfic + const componentNameClean = (child.type.name || child.type.displayName || 'Unknown').replaceAll(/__|_COMPONENT/g, '') + console.error(`UI component ${componentNameClean} crashed!`, componentNameClean, error.message) + return null + }}>{child}) +} + renderToDom(, { strictMode: false, selector: '#react-root', diff --git a/src/soundSystem.ts b/src/soundSystem.ts index 520cd837..09c87d4b 100644 --- a/src/soundSystem.ts +++ b/src/soundSystem.ts @@ -3,9 +3,10 @@ import { Vec3 } from 'vec3' import { versionToNumber } from 'prismarine-viewer/viewer/prepare/utils' import { loadScript } from 'prismarine-viewer/viewer/lib/utils' import type { Block } from 'prismarine-block' -import { miscUiState, showNotification } from './globalState' +import { miscUiState } from './globalState' import { options } from './optionsStorage' import { loadOrPlaySound } from './basicSounds' +import { showNotification } from './react/NotificationProvider' subscribeKey(miscUiState, 'gameLoaded', async () => { if (!miscUiState.gameLoaded) return @@ -21,9 +22,7 @@ subscribeKey(miscUiState, 'gameLoaded', async () => { if (!soundsMap) { console.warn('No sounds map for version', bot.version, 'supported versions are', Object.keys(allSoundsMap).join(', ')) - showNotification({ - message: 'No sounds map for version ' + bot.version, - }) + showNotification('Warning', 'No sounds map for version ' + bot.version) return } diff --git a/src/texturePack.ts b/src/texturePack.ts index 3af09a87..6ace186b 100644 --- a/src/texturePack.ts +++ b/src/texturePack.ts @@ -9,7 +9,7 @@ import blocksFileNames from '../generated/blocks.json' import type { BlockStates } from './playerWindows' import { copyFilesAsync, copyFilesAsyncWithProgress, mkdirRecursive, removeFileRecursiveAsync } from './browserfs' import { setLoadingScreenStatus } from './utils' -import { showNotification } from './globalState' +import { showNotification } from './react/NotificationProvider' export const resourcePackState = proxy({ resourcePackInstalled: false, @@ -96,9 +96,7 @@ export const completeTexturePackInstall = async (name?: string) => { await genTexturePackTextures(viewer.version) } setLoadingScreenStatus(undefined) - showNotification({ - message: 'Texturepack installed!', - }) + showNotification('Texturepack installed') await updateTexturePackInstalledState() } diff --git a/src/utils.ts b/src/utils.ts index e8658acf..61ceeeb8 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,6 +1,7 @@ -import { hideModal, isGameActive, miscUiState, notification, showModal } from './globalState' +import { hideModal, isGameActive, miscUiState, showModal } from './globalState' import { options } from './optionsStorage' import { appStatusState } from './react/AppStatusProvider' +import { notificationProxy, showNotification } from './react/NotificationProvider' export const goFullscreen = async (doToggle = false) => { if (!document.fullscreenElement) { @@ -32,8 +33,8 @@ export const pointerLock = { void goFullscreen() } const displayBrowserProblem = () => { - notification.show = true - notification.message = navigator['keyboard'] ? 'Browser Limitation: Click on screen, enable Auto Fullscreen or F11' : 'Browser Limitation: Click on screen or use fullscreen in Chrome' + showNotification('Browser Delay Limitation', navigator['keyboard'] ? 'Click on screen, enable Auto Fullscreen or F11' : 'Click on screen or use fullscreen in Chrome') + notificationProxy.id = 'pointerlockchange' } if (!(document.fullscreenElement && navigator['keyboard']) && this.justHitEscape) { displayBrowserProblem() From 1cb54315e3a5421bc3038c8e62661eed4488722b Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 21 Mar 2024 08:57:34 +0300 Subject: [PATCH 0084/1195] feat: now ui never fully crashes and instead disables problematic component feat: /home & /sethome commands --- package.json | 2 +- pnpm-lock.yaml | 8 ++++---- src/reactUi.tsx | 5 ++--- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 375372f4..6bf9a456 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "esbuild": "^0.19.3", "esbuild-plugin-polyfill-node": "^0.3.0", "express": "^4.18.2", - "flying-squid": "npm:@zardoy/flying-squid@^0.0.13", + "flying-squid": "npm:@zardoy/flying-squid@^0.0.15", "fs-extra": "^11.1.1", "google-drive-browserfs": "github:zardoy/browserfs#google-drive", "iconify-icon": "^1.0.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d3ed94c4..33f87a07 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,8 +85,8 @@ importers: specifier: ^4.18.2 version: 4.18.2 flying-squid: - specifier: npm:@zardoy/flying-squid@^0.0.13 - version: /@zardoy/flying-squid@0.0.13 + specifier: npm:@zardoy/flying-squid@^0.0.15 + version: /@zardoy/flying-squid@0.0.15 fs-extra: specifier: ^11.1.1 version: 11.1.1 @@ -5658,8 +5658,8 @@ packages: tslib: 1.14.1 dev: true - /@zardoy/flying-squid@0.0.13: - resolution: {integrity: sha512-K4vjMx+pi+Xbmm/m6xb17hml8w+0Bk89SiqGuDiB5zaRcTup7K5iqmZ2STQRrTZkjxSNh+eX26R67x2l0XHBIg==} + /@zardoy/flying-squid@0.0.15: + resolution: {integrity: sha512-VooP9XuzNQVL3y0zlaU5wStRm1vfQIXAzVNHuvMoMgyIyOiD7A59QzVZT93GAoTyUBHTwqweXMPQftjywUy62A==} engines: {node: '>=8'} hasBin: true dependencies: diff --git a/src/reactUi.tsx b/src/reactUi.tsx index 1d8ac242..2b474adc 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -21,7 +21,7 @@ import widgets from './react/widgets' import { useIsWidgetActive } from './react/utils' import GlobalSearchInput from './GlobalSearchInput' import TouchAreasControlsProvider from './react/TouchAreasControlsProvider' -import NotificationProvider from './react/NotificationProvider' +import NotificationProvider, { showNotification } from './react/NotificationProvider' const RobustPortal = ({ children, to }) => { return createPortal({children}, to) @@ -105,9 +105,8 @@ const App = () => { const PerComponentErrorBoundary = ({ children }) => { return children.map((child, i) => { - // notfic const componentNameClean = (child.type.name || child.type.displayName || 'Unknown').replaceAll(/__|_COMPONENT/g, '') - console.error(`UI component ${componentNameClean} crashed!`, componentNameClean, error.message) + showNotification(`UI component ${componentNameClean} crashed!`, 'Please report this. Use console to see more info.', true, undefined) return null }}>{child}) } From b627e0078fabf2a4ff89375d5cc00df1aa9f43f1 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 21 Mar 2024 08:58:01 +0300 Subject: [PATCH 0085/1195] add missing file --- src/flyingSquidEvents.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/flyingSquidEvents.ts diff --git a/src/flyingSquidEvents.ts b/src/flyingSquidEvents.ts new file mode 100644 index 00000000..28358a91 --- /dev/null +++ b/src/flyingSquidEvents.ts @@ -0,0 +1,9 @@ +import { showNotification } from './react/NotificationProvider' + +export default () => { + localServer!.on('warpsLoaded', () => { + showNotification(`${localServer!.warps.length} Warps loaded`, 'Use /warp to teleport to a warp point.', false, 'label-alt', () => { + // todo open warp command + }) + }) +} From 64a18380856a2543f74466a46b01cc17af88c094 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 21 Mar 2024 09:23:47 +0300 Subject: [PATCH 0086/1195] fix lint --- src/browserfs.ts | 1 + src/menus/pause_screen.js | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browserfs.ts b/src/browserfs.ts index 4d776fab..42159b49 100644 --- a/src/browserfs.ts +++ b/src/browserfs.ts @@ -30,6 +30,7 @@ browserfs.configure({ export const forceCachedDataPaths = {} export const forceRedirectPaths = {} +window.fs = fs //@ts-expect-error fs.promises = new Proxy(Object.fromEntries(['readFile', 'writeFile', 'stat', 'mkdir', 'rmdir', 'unlink', 'rename', /* 'copyFile', */'readdir'].map(key => [key, promisify(fs[key])])), { get (target, p: string, receiver) { diff --git a/src/menus/pause_screen.js b/src/menus/pause_screen.js index 3473dfc5..0f47395c 100644 --- a/src/menus/pause_screen.js +++ b/src/menus/pause_screen.js @@ -12,7 +12,6 @@ const { closeWan, openToWanAndCopyJoinLink, getJoinLink } = require('../localSer const { uniqueFileNameFromWorldName, copyFilesAsyncWithProgress, existsViaStats, mkdirRecursive } = require('../browserfs') const { showOptionsModal } = require('../react/SelectOption') const { openURL } = require('./components/common') -const fs = require('fs').promises class PauseScreen extends LitElement { static get styles () { From 64f16cbd4ccd8ef9cd61d6e93a969ccc646f343c Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 21 Mar 2024 10:05:09 +0300 Subject: [PATCH 0087/1195] fix flying squid ambient typings --- src/createLocalServer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/createLocalServer.ts b/src/createLocalServer.ts index 6c5b2fa9..44bc2187 100644 --- a/src/createLocalServer.ts +++ b/src/createLocalServer.ts @@ -5,7 +5,6 @@ const { createMCServer } = require('flying-squid/dist') export const startLocalServer = (serverOptions) => { const passOptions = { ...serverOptions, Server: LocalServer } const server: NonNullable = createMCServer(passOptions) - //@ts-expect-error browser patch server.formatMessage = (message) => `[server] ${message}` server.options = passOptions //@ts-expect-error todo remove From dba4043b3e6346ccd54b941ac3244c6e54bab19c Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 21 Mar 2024 10:28:32 +0300 Subject: [PATCH 0088/1195] fix: disable useless second stats panel on ios --- src/flyingSquidEvents.ts | 5 ++++- src/react/ChatContainer.tsx | 3 +-- src/react/OptionsRenderApp.tsx | 4 ---- src/topRightStats.ts | 5 ++++- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/flyingSquidEvents.ts b/src/flyingSquidEvents.ts index 28358a91..6bcde9fc 100644 --- a/src/flyingSquidEvents.ts +++ b/src/flyingSquidEvents.ts @@ -1,9 +1,12 @@ +import { showModal } from './globalState' +import { chatInputValueGlobal } from './react/ChatContainer' import { showNotification } from './react/NotificationProvider' export default () => { localServer!.on('warpsLoaded', () => { showNotification(`${localServer!.warps.length} Warps loaded`, 'Use /warp to teleport to a warp point.', false, 'label-alt', () => { - // todo open warp command + chatInputValueGlobal.value = '/warp ' + showModal({ reactType: 'chat' }) }) }) } diff --git a/src/react/ChatContainer.tsx b/src/react/ChatContainer.tsx index e965a326..86a3641a 100644 --- a/src/react/ChatContainer.tsx +++ b/src/react/ChatContainer.tsx @@ -1,8 +1,7 @@ -import { proxy, subscribe, useSnapshot } from 'valtio' +import { proxy, subscribe } from 'valtio' import { useEffect, useMemo, useRef, useState } from 'react' import { isCypress } from '../standaloneUtils' import { MessageFormatPart } from '../botUtils' -import { miscUiState } from '../globalState' import { MessagePart } from './MessageFormatted' import './ChatContainer.css' import { isIos } from './utils' diff --git a/src/react/OptionsRenderApp.tsx b/src/react/OptionsRenderApp.tsx index b46e924f..8167f820 100644 --- a/src/react/OptionsRenderApp.tsx +++ b/src/react/OptionsRenderApp.tsx @@ -1,11 +1,7 @@ import { useSnapshot } from 'valtio' import { activeModalStack, hideCurrentModal } from '../globalState' import { OptionsGroupType } from '../optionsGuiScheme' -import { uniqueFileNameFromWorldName, copyFilesAsyncWithProgress } from '../browserfs' -import { fsState } from '../loadSave' -import Button from './Button' import OptionsGroup from './OptionsGroup' -import { showOptionsModal } from './SelectOption' export default () => { const { reactType } = useSnapshot(activeModalStack).at(-1) ?? {} diff --git a/src/topRightStats.ts b/src/topRightStats.ts index a105ac6b..a508a2c2 100644 --- a/src/topRightStats.ts +++ b/src/topRightStats.ts @@ -4,6 +4,7 @@ import { isCypress } from './standaloneUtils' const stats = new Stats() const stats2 = new Stats() +const hasRamPanel = stats2.dom.children.length === 3 const statsGl = new StatsGl({ minimal: true }) // in my case values are good: gpu: < 0.5, cpu < 0.15 @@ -34,7 +35,9 @@ const addStatsGlStat = (canvas) => { addStat(container) } addStat(stats.dom) -addStat(stats2.dom) +if (hasRamPanel) { + addStat(stats2.dom) +} const hideStats = localStorage.hideStats || isCypress() if (hideStats) { From ca45288b5d449e630f6cec95b9ba65ebe2f73009 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 22 Mar 2024 07:18:29 +0300 Subject: [PATCH 0089/1195] ci: update preview message --- .github/workflows/preview.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 1db1bb9e..8fcfbdc2 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -45,3 +45,5 @@ jobs: with: message: | Deployed to Vercel Preview: ${{ steps.deploy.outputs.stdout }} + [Playground](${{ steps.deploy.outputs.stdout }}/playground.html) + [Storybook](${{ steps.deploy.outputs.stdout }}/storybook/) From 85c0eb8c5b74359c39903f8a4bb0b221fb0756fd Mon Sep 17 00:00:00 2001 From: gguio <109200692+gguio@users.noreply.github.com> Date: Sat, 23 Mar 2024 17:21:36 +0400 Subject: [PATCH 0090/1195] feat: Sign editor with formatting support! (+2 settings) (#86) Co-authored-by: gguio Co-authored-by: Vitaly Turovsky --- .storybook/preview.tsx | 9 +- package.json | 5 + pnpm-lock.yaml | 541 +++++++++++++++++++++++++++- src/controls.ts | 9 + src/markdownToFormattedText.test.ts | 39 ++ src/markdownToFormattedText.ts | 58 +++ src/optionsGuiScheme.tsx | 16 + src/optionsStorage.ts | 3 + src/react/SignEditor.css | 115 ++++++ src/react/SignEditor.stories.tsx | 25 ++ src/react/SignEditor.tsx | 81 +++++ src/react/SignEditorProvider.tsx | 84 +++++ src/react/prosemirror-markdown.ts | 77 ++++ src/reactUi.tsx | 6 +- vitest.config.ts | 1 + 15 files changed, 1060 insertions(+), 9 deletions(-) create mode 100644 src/markdownToFormattedText.test.ts create mode 100644 src/markdownToFormattedText.ts create mode 100644 src/react/SignEditor.css create mode 100644 src/react/SignEditor.stories.tsx create mode 100644 src/react/SignEditor.tsx create mode 100644 src/react/SignEditorProvider.tsx create mode 100644 src/react/prosemirror-markdown.ts diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 1241b47c..a8a219f1 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -7,11 +7,12 @@ import './storybook.css' const preview: Preview = { decorators: [ - (Story) => ( -
+ (Story, c) => { + const noScaling = c.parameters.noScaling + return
-
- ), +
; + }, ], parameters: { actions: { argTypesRegex: "^on[A-Z].*" }, diff --git a/package.json b/package.json index 6bf9a456..8d6bfbf6 100644 --- a/package.json +++ b/package.json @@ -62,11 +62,16 @@ "node-gzip": "^1.1.2", "peerjs": "^1.5.0", "pretty-bytes": "^6.1.1", + "prosemirror-example-setup": "^1.2.2", + "prosemirror-markdown": "^1.12.0", + "prosemirror-state": "^1.4.3", + "prosemirror-view": "^1.33.1", "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", "qrcode.react": "^3.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-transition-group": "^4.4.5", + "remark": "^15.0.1", "sanitize-filename": "^1.6.3", "skinview3d": "^3.0.1", "source-map-js": "^1.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 33f87a07..759690ff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -126,6 +126,18 @@ importers: prismarine-provider-anvil: specifier: github:zardoy/prismarine-provider-anvil#everything version: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0) + prosemirror-example-setup: + specifier: ^1.2.2 + version: 1.2.2 + prosemirror-markdown: + specifier: ^1.12.0 + version: 1.12.0 + prosemirror-state: + specifier: ^1.4.3 + version: 1.4.3 + prosemirror-view: + specifier: ^1.33.1 + version: 1.33.1 qrcode.react: specifier: ^3.1.0 version: 3.1.0(react@18.2.0) @@ -138,6 +150,9 @@ importers: react-transition-group: specifier: ^4.4.5 version: 4.4.5(react-dom@18.2.0)(react@18.2.0) + remark: + specifier: ^15.0.1 + version: 15.0.1 sanitize-filename: specifier: ^1.6.3 version: 1.6.3 @@ -4992,6 +5007,12 @@ packages: '@types/node': 20.8.10 dev: true + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 0.7.34 + dev: false + /@types/detect-port@1.3.3: resolution: {integrity: sha512-bV/jQlAJ/nPY3XqSatkGpu+nGzou+uSwrH1cROhn+jBFg47yaNH+blW4C7p9KhopC7QxCv/6M86s37k8dMk0Yg==} dev: true @@ -5113,6 +5134,12 @@ packages: resolution: {integrity: sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==} dev: true + /@types/mdast@4.0.3: + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + dependencies: + '@types/unist': 2.0.8 + dev: false + /@types/mdx@2.0.8: resolution: {integrity: sha512-r7/zWe+f9x+zjXqGxf821qz++ld8tp6Z4jUS6qmPZUXH6tfh4riXOhAqb12tWGWAevCFtMt1goLWkQMqIJKpsA==} dev: true @@ -5137,6 +5164,10 @@ packages: resolution: {integrity: sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==} dev: true + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + dev: false + /@types/node-fetch@2.6.6: resolution: {integrity: sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==} dependencies: @@ -5293,7 +5324,10 @@ packages: /@types/unist@2.0.8: resolution: {integrity: sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==} - dev: true + + /@types/unist@3.0.2: + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + dev: false /@types/webxr@0.5.7: resolution: {integrity: sha512-Rcgs5c2eNFnHp53YOjgtKfl/zWX1Y+uFGUwlSXrWcZWu3yhANRezmph4MninmqybUYT6g9ZE0aQ9QIdPkLR3Kg==} @@ -5944,7 +5978,6 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true /aria-hidden@1.2.3: resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} @@ -6226,6 +6259,10 @@ packages: resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} dev: false + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -6715,6 +6752,10 @@ packages: resolution: {integrity: sha512-CAtbGEDulyjzs05RXy3uKcwqeztz/dMEuAc1Xu9NQBsbrhuGMneL0u9Dj5SoutLKBFYun8txxYIwhjtLNfUmCA==} dev: false + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + /check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: @@ -7103,6 +7144,10 @@ packages: sha.js: 2.4.11 dev: true + /crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + dev: false + /cross-spawn@6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} @@ -7342,6 +7387,12 @@ packages: engines: {node: '>=10'} dev: true + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: false + /decompress-response@4.2.1: resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} engines: {node: '>=8'} @@ -7460,7 +7511,6 @@ packages: /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - dev: true /des.js@1.1.0: resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} @@ -7515,6 +7565,12 @@ packages: - supports-color dev: true + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7812,7 +7868,6 @@ packages: /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - dev: true /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} @@ -9989,6 +10044,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -10500,6 +10560,12 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + /linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + dependencies: + uc.micro: 2.1.0 + dev: false + /listr2@3.14.0(enquirer@2.4.1): resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} engines: {node: '>=10.0.0'} @@ -10655,6 +10721,10 @@ packages: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} dev: false + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + /looks-same@8.2.3: resolution: {integrity: sha512-0LK5r4+9t2D56XPVNH3hhG4o0yBYUdeu9FEd8z0ZCs/2fR9zJQj+6ob6ued8iHk3yddrSAdUA+9YGVK2FBMGUw==} engines: {node: '>= 12.0.0'} @@ -10800,6 +10870,18 @@ packages: resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} dev: true + /markdown-it@14.0.0: + resolution: {integrity: sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + dev: false + /markdown-to-jsx@7.3.2(react@18.2.0): resolution: {integrity: sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==} engines: {node: '>= 10'} @@ -10829,14 +10911,63 @@ packages: unist-util-visit: 2.0.3 dev: true + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + dependencies: + '@types/mdast': 4.0.3 + unist-util-is: 6.0.0 + dev: false + + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: false + /mdast-util-to-string@1.1.0: resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} dev: true + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.3 + dev: false + /mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} dev: false + /mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + dev: false + /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -10892,6 +11023,181 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + dev: false + + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + dev: false + + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + dev: false + + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + dev: false + + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4(supports-color@8.1.1) + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -11618,6 +11924,10 @@ packages: wcwidth: 1.0.1 dev: true + /orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + dev: false + /os-browserify@0.3.0: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} dev: true @@ -12252,6 +12562,120 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 + /prosemirror-commands@1.5.2: + resolution: {integrity: sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==} + dependencies: + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + + /prosemirror-dropcursor@1.8.1: + resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.33.1 + dev: false + + /prosemirror-example-setup@1.2.2: + resolution: {integrity: sha512-pHJc656IgYm249RNp0eQaWNmnyWGk6OrzysWfYI4+NwE14HQ7YNYOlRBLErUS6uCAHIYJLNXf0/XCmf1OCtNbQ==} + dependencies: + prosemirror-commands: 1.5.2 + prosemirror-dropcursor: 1.8.1 + prosemirror-gapcursor: 1.3.2 + prosemirror-history: 1.3.2 + prosemirror-inputrules: 1.4.0 + prosemirror-keymap: 1.2.2 + prosemirror-menu: 1.2.4 + prosemirror-schema-list: 1.3.0 + prosemirror-state: 1.4.3 + dev: false + + /prosemirror-gapcursor@1.3.2: + resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} + dependencies: + prosemirror-keymap: 1.2.2 + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-view: 1.33.1 + dev: false + + /prosemirror-history@1.3.2: + resolution: {integrity: sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==} + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.33.1 + rope-sequence: 1.3.4 + dev: false + + /prosemirror-inputrules@1.4.0: + resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==} + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + + /prosemirror-keymap@1.2.2: + resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} + dependencies: + prosemirror-state: 1.4.3 + w3c-keyname: 2.2.8 + dev: false + + /prosemirror-markdown@1.12.0: + resolution: {integrity: sha512-6F5HS8Z0HDYiS2VQDZzfZP6A0s/I0gbkJy8NCzzDMtcsz3qrfqyroMMeoSjAmOhDITyon11NbXSzztfKi+frSQ==} + dependencies: + markdown-it: 14.0.0 + prosemirror-model: 1.19.4 + dev: false + + /prosemirror-menu@1.2.4: + resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.5.2 + prosemirror-history: 1.3.2 + prosemirror-state: 1.4.3 + dev: false + + /prosemirror-model@1.19.4: + resolution: {integrity: sha512-RPmVXxUfOhyFdayHawjuZCxiROsm9L4FCUA6pWI+l7n2yCBsWy9VpdE1hpDHUS8Vad661YLY9AzqfjLhAKQ4iQ==} + dependencies: + orderedmap: 2.1.1 + dev: false + + /prosemirror-schema-list@1.3.0: + resolution: {integrity: sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==} + dependencies: + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + + /prosemirror-state@1.4.3: + resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} + dependencies: + prosemirror-model: 1.19.4 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.33.1 + dev: false + + /prosemirror-transform@1.8.0: + resolution: {integrity: sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==} + dependencies: + prosemirror-model: 1.19.4 + dev: false + + /prosemirror-view@1.33.1: + resolution: {integrity: sha512-62qkYgSJIkwIMMCpuGuPzc52DiK1Iod6TWoIMxP4ja6BTD4yO8kCUL64PZ/WhH/dJ9fW0CDO39FhH1EMyhUFEg==} + dependencies: + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + dev: false + /protodef-validator@1.3.1: resolution: {integrity: sha512-lZ5FWKZYR9xOjpMw1+EfZRfCjzNRQWPq+Dk+jki47Sikl2EeWEPnTfnJERwnU/EwFq6us+0zqHHzSsmLeYX+Lg==} hasBin: true @@ -12315,6 +12739,11 @@ packages: pump: 2.0.1 dev: true + /punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + dev: false + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -12920,6 +13349,17 @@ packages: unist-util-visit: 2.0.3 dev: true + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + /remark-slug@6.1.0: resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} dependencies: @@ -12928,6 +13368,25 @@ packages: unist-util-visit: 2.0.3 dev: true + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 + dev: false + + /remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + dependencies: + '@types/mdast': 4.0.3 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + /request-progress@3.0.0: resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} dependencies: @@ -13066,6 +13525,10 @@ packages: optionalDependencies: fsevents: 2.3.3 + /rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + dev: false + /rtl-css-js@1.16.1: resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} dependencies: @@ -14162,6 +14625,10 @@ packages: engines: {node: '>=12'} dev: true + /trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + dev: false + /truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} dependencies: @@ -14337,6 +14804,10 @@ packages: resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} dev: false + /uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + dev: false + /ufo@1.3.1: resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} dev: true @@ -14396,6 +14867,18 @@ packages: diff: 2.2.3 dev: false + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.1 + dev: false + /union@0.5.0: resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} engines: {node: '>= 0.8.0'} @@ -14431,6 +14914,18 @@ packages: resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} dev: true + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + /unist-util-visit-parents@3.1.1: resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} dependencies: @@ -14438,6 +14933,13 @@ packages: unist-util-is: 4.1.0 dev: true + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + dev: false + /unist-util-visit@2.0.3: resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} dependencies: @@ -14446,6 +14948,14 @@ packages: unist-util-visit-parents: 3.1.1 dev: true + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -14680,6 +15190,21 @@ packages: core-util-is: 1.0.2 extsprintf: 1.3.0 + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + dev: false + + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: false + /vite-node@0.34.6(@types/node@20.8.0): resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} engines: {node: '>=v14.18.0'} @@ -14837,6 +15362,10 @@ packages: - terser dev: true + /w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + dev: false + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: @@ -15389,6 +15918,10 @@ packages: react: 18.2.0 dev: false + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false + github.com/PrismarineJS/mineflayer/195b3cbd70a110080af9b77a4659991c5d9e484a: resolution: {tarball: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/195b3cbd70a110080af9b77a4659991c5d9e484a} name: mineflayer diff --git a/src/controls.ts b/src/controls.ts index a02f76c4..48c05179 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -22,6 +22,10 @@ subscribe(customKeymaps, () => { localStorage.keymap = JSON.parse(customKeymaps) }) +const controlOptions = { + preventDefault: true +} + export const contro = new ControMax({ commands: { general: { @@ -58,6 +62,7 @@ export const contro = new ControMax({ } }, }, { + defaultControlOptions: controlOptions, target: document, captureEvents () { return bot && isGameActive(false) @@ -71,6 +76,10 @@ export const contro = new ControMax({ window.controMax = contro export type Command = CommandEventArgument['command'] +export const setDoPreventDefault = (state: boolean) => { + controlOptions.preventDefault = state +} + const setSprinting = (state: boolean) => { bot.setControlState('sprint', state) gameAdditionalState.isSprinting = state diff --git a/src/markdownToFormattedText.test.ts b/src/markdownToFormattedText.test.ts new file mode 100644 index 00000000..5c1d5f35 --- /dev/null +++ b/src/markdownToFormattedText.test.ts @@ -0,0 +1,39 @@ +import { describe, expect, it } from 'vitest' +import markdownToFormattedText from './markdownToFormattedText' + +describe('markdownToFormattedText', () => { + it('should convert markdown to formatted text', () => { + const markdown = '**bold** *italic* [link](https://example.com) k `code`' + const text = markdownToFormattedText(markdown) + const command = '/data merge block ~ ~ ~ {Text1:\'' + JSON.stringify(text[0]) + '\',Text2: \'' + JSON.stringify(text[1]) + '\',Text3:\'' + JSON.stringify(text[2]) + '\',Text4:\'' + JSON.stringify(text[3]) + '\'}' // mojangson + expect(text).toMatchInlineSnapshot(` + [ + [ + [ + { + "bold": true, + "text": "bold", + }, + { + "text": " ", + }, + { + "italic": true, + "text": "italic", + }, + { + "text": " ", + }, + { + "text": " k ", + }, + "code", + ], + ], + "", + "", + "", + ] + `) + }) +}) diff --git a/src/markdownToFormattedText.ts b/src/markdownToFormattedText.ts new file mode 100644 index 00000000..5a09917d --- /dev/null +++ b/src/markdownToFormattedText.ts @@ -0,0 +1,58 @@ +import { remark } from 'remark' + +export default (markdown: string) => { + const arr = markdown.split('\n\n') + const lines = ['', '', '', ''] + for (const [i, ast] of arr.map(md => remark().parse(md)).entries()) { + lines[i] = transformToMinecraftJSON(ast as Element) + } + return lines +} + +function transformToMinecraftJSON (element: Element): any { + switch (element.type) { + case 'root': { + if (!element.children) return + return element.children.map(child => transformToMinecraftJSON(child)).filter(Boolean) + } + case 'paragraph': { + if (!element.children) return + const transformedChildren = element.children.map(child => transformToMinecraftJSON(child)).filter(Boolean) + return transformedChildren.flat() + } + case 'strong': { + if (!element.children) return + return [{ bold: true, text: element.children[0].value }] + } + case 'text': { + return { text: element.value } + } + case 'emphasis': { + if (!element.children) return + return [{ italic: true, text: element.children[0].value }] + } + default: + // todo leave untouched eg links + return element.value + } +} + +interface Position { + start: { + line: number; + column: number; + offset: number; + }; + end: { + line: number; + column: number; + offset: number; + }; + } + + interface Element { + type: string; + children?: Element[]; + value?: string; + position: Position; + } diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index c0b64979..13e6388b 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -152,6 +152,22 @@ export const guiOptionsScheme: { }, chatSelect: { }, + }, + { + custom () { + return Sign Editor + }, + autoSignEditor: { + text: 'Enable Sign Editor', + }, + wysiwygSignEditor: { + text: 'WYSIWG Editor', + values: [ + 'auto', + 'always', + 'never' + ], + }, } ], controls: [ diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts index 63ad0b98..8490053c 100644 --- a/src/optionsStorage.ts +++ b/src/optionsStorage.ts @@ -75,6 +75,9 @@ const defaultOptions = { autoRespawn: false, mutedSounds: [] as string[], plugins: [] as Array<{ enabled: boolean, name: string, description: string, script: string }>, + /** Wether to popup sign editor on server action */ + autoSignEditor: true, + wysiwygSignEditor: 'auto' as 'auto' | 'always' | 'never', } const migrateOptions = (options: Partial>) => { diff --git a/src/react/SignEditor.css b/src/react/SignEditor.css new file mode 100644 index 00000000..ae7e874b --- /dev/null +++ b/src/react/SignEditor.css @@ -0,0 +1,115 @@ +.signs-editor-container { + position: fixed; + inset: 0; + background-color: rgba(0, 0, 0, 0.4); + display: flex; + justify-content: center; + align-items: center; +} + +.signs-editor-inner-container { + position: relative; + width: 700px; + aspect-ratio: 2; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.signs-editor-bg-image { + position: absolute; + z-index: -1; + width: 100%; + height: 100%; + image-rendering: pixelated; +} + +.sign-editor { + font: inherit; + font-size: 420%; + width: 90%; + max-height: 90%; + background-color: rgba(255, 255, 255, 0); + border-width: 0px; + overflow: auto; + outline: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + box-sizing: border-box; + resize: none; + text-align: center; +} + +/* @media (min-width: 1200px) { */ +/* .sign-editor { */ +/* font-size: 400%; */ +/* } */ +/* } */ + +.ProseMirror p { + font-size: 420%; + text-align: center; +} + +@media (max-width: 850px) { + .ProseMirror p { + font-size: 310%; + } + .sign-editor { + font-size: 310%; + } + .signs-editor-inner-container { + width: 500px; + } +} + +@media (max-width: 550px) { + .ProseMirror p { + font-size: 180%; + } + .sign-editor { + font-size: 180%; + } + .signs-editor-inner-container { + width: 300px; + } +} + +@media (max-width: 350px) { + .ProseMirror p { + font-size: 130%; + } + .sign-editor { + font-size: 130%; + } + .signs-editor-inner-container { + width: 220px; + } +} + +.wysiwyg-editor { + color: black; + max-height: 100%; + overflow: hidden; + width: 90%; + margin: 0px; + white-space: pre-wrap; + border: 1px solid #ccc; +} + +.sign-editor-button { + position: absolute; + right: 0px; + bottom: 0px; + width: 75px; +} + +.ProseMirror-menubar { + background-color: rgba(255, 255, 255, 0.7); +} + +.ProseMirror { + +} diff --git a/src/react/SignEditor.stories.tsx b/src/react/SignEditor.stories.tsx new file mode 100644 index 00000000..05d968f9 --- /dev/null +++ b/src/react/SignEditor.stories.tsx @@ -0,0 +1,25 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import SignEditor from './SignEditor' + +const meta: Meta = { + component: SignEditor, + render (args) { + return { + console.log('handleClick', result) + }} /> + } +} + +export default meta +type Story = StoryObj; + +export const Primary: Story = { + args: { + handleInput () {}, + isWysiwyg: false + }, + parameters: { + noScaling: true + }, +} diff --git a/src/react/SignEditor.tsx b/src/react/SignEditor.tsx new file mode 100644 index 00000000..ffea0784 --- /dev/null +++ b/src/react/SignEditor.tsx @@ -0,0 +1,81 @@ +import { useEffect, useRef } from 'react' +import { focusable } from 'tabbable' +import markdownToFormattedText from '../markdownToFormattedText' +import { ProseMirrorView } from './prosemirror-markdown' +import Button from './Button' +import 'prosemirror-view/style/prosemirror.css' +import 'prosemirror-menu/style/menu.css' +import './SignEditor.css' + + +const imageSource = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAMCAYAAAB4MH11AAABbElEQVR4AY3BQY6cMBBA0Q+yQZZVi+ndcJVcKGfMgegdvShKVtuokzGSWwwiUd7rfv388Vst0UgMXCobmgsSA5VaQmKgUks0EgNHji8SA9W8GJCQwVNpLhzJ4KFs4B1HEgPVvBiQkMFTaS44tYTEQDXdIkfiHbuyobmguaDPFzIWGrWExEA13SJH4h1uzS/WbPyvroM1v6jWbFRrNv7GfX5EdmXjzTvUEjJ4zjQXjiQGdmXjzTvUEjJ4HF/UEt/kQqW5UEkMzIshY08jg6dRS3yTC5XmgpsXY7pFztQSEgPNJCNv3lGpJVSfTLfImVpCYsB1HdwfxpU1G9eeNF0H94dxZc2G+/yI7MoG3vEv82LI2NNIDLyVDbzjzFE2mnkxZOy5IoNnkpFGc2FXNpp5MWTsOXJ4h1qikrGnkhjYlY1m1icy9lQSA+TCzjvUEpWMPZXEwK5suPvDOFuzcdZ1sOYX1ZqNas3GlTUbzR+jQbEAcs8ZQAAAAABJRU5ErkJggg==' + +type Props = { + handleInput: (target: HTMLInputElement) => void, + isWysiwyg: boolean, + handleClick?: (view: ResultType) => void +} + +export type ResultType = { + plainText: string[] +} | { + dataText: string[] +} + +export default ({ handleInput, isWysiwyg, handleClick }: Props) => { + const prosemirrorContainer = useRef(null) + const editorView = useRef(null) + + useEffect(() => { + if (isWysiwyg) { + editorView.current = new ProseMirrorView(prosemirrorContainer.current, '') + } + }, [isWysiwyg]) + + return
{ + let { code } = e + if ((e.target as HTMLElement).matches('input') && e.key === 'Enter') code = 'ArrowDown' + if (code === 'ArrowDown' || code === 'ArrowUp') { + e.preventDefault() + const dir = code === 'ArrowDown' ? 1 : -1 + const elements = focusable(e.currentTarget) + const focusedElemIndex = elements.indexOf(document.activeElement as HTMLElement) + if (focusedElemIndex === -1) return + const nextElem = elements[focusedElemIndex + dir] + nextElem?.focus() + } + }}> +
+ + {isWysiwyg ? ( +

+ ) : [1, 2, 3, 4].map((value, index) => { + return { + handleInput(e.currentTarget) + }} /> + }) + } +
+
+} diff --git a/src/react/SignEditorProvider.tsx b/src/react/SignEditorProvider.tsx new file mode 100644 index 00000000..b6ade625 --- /dev/null +++ b/src/react/SignEditorProvider.tsx @@ -0,0 +1,84 @@ +import { useMemo, useEffect, useState, useRef } from 'react' +import { showModal, hideModal } from '../globalState' +import { setDoPreventDefault } from '../controls' +import { options } from '../optionsStorage' +import { useIsModalActive } from './utils' +import SignEditor, { ResultType } from './SignEditor' + + +const isWysiwyg = async () => { + const items = await bot.tabComplete('/', true, true) + const commands = new Set(['data']) + for (const item of items) { + if (commands.has(item.match as unknown as string)) { + return true + } + } + return false +} + +export default () => { + const [location, setLocation] = useState<{x: number, y: number, z: number} | null>(null) + const [isFrontText, setIsFrontText] = useState(true) + const text = useRef(['', '', '', '']) + const [enableWysiwyg, setEnableWysiwyg] = useState(false) + const isModalActive = useIsModalActive('signs-editor-screen') + + const handleClick = (result: ResultType) => { + hideModal({ reactType: 'signs-editor-screen' }) + if ('plainText' in result) { + bot._client.write('update_sign', { + location, + isFrontText, + text1: result.plainText[0], + text2: result.plainText[1], + text3: result.plainText[2], + text4: result.plainText[3] + }) + } else { + if (!location) return + const command = `/data merge block ${location.x} ${location.y} ${location.z} {Text1:'` + JSON.stringify(result.dataText[0]) + '\',Text2: \'' + JSON.stringify(result.dataText[1]) + '\',Text3:\'' + JSON.stringify(result.dataText[2]) + '\',Text4:\'' + JSON.stringify(result.dataText[3]) + '\'}' // mojangson + bot.chat(command) + } + } + + const handleInput = (target: HTMLInputElement) => { + const smallSymbols = /[()[\]{} ]/ + const largeSymbols = /[;|',.]/ + let addLength = 0 + for (const letter of target.value) { + if (smallSymbols.test(letter)) { + addLength += 1 - 1 / 1.46 + } else if (largeSymbols.test(letter)) { + addLength += 1 - 1 / 3 + } + } + text.current[Number(target.dataset.key)] = target.value + target.setAttribute('maxlength', `${15 + Math.ceil(addLength)}`) + } + + useEffect(() => { + setDoPreventDefault(!isModalActive) // disable e.preventDefault() since we might be using wysiwyg editor which doesn't use textarea and need default browser behavior to ensure characters are being typed in contenteditable container. Ideally we should do e.preventDefault() only when either ctrl, cmd (meta) or alt key is pressed. + }, [isModalActive]) + + useMemo(() => { + bot._client.on('open_sign_entity', (packet) => { + if (!options.autoSignEditor) return + setIsFrontText((packet as any).isFrontText ?? true) + setLocation(prev => packet.location) + showModal({ reactType: 'signs-editor-screen' }) + if (options.wysiwygSignEditor === 'auto') { + void isWysiwyg().then((value) => { + setEnableWysiwyg(value) + }) + } else if (options.wysiwygSignEditor === 'always') { + setEnableWysiwyg(true) + } else { + setEnableWysiwyg(false) + } + }) + }, []) + + if (!isModalActive) return null + return +} diff --git a/src/react/prosemirror-markdown.ts b/src/react/prosemirror-markdown.ts new file mode 100644 index 00000000..9bb90bcc --- /dev/null +++ b/src/react/prosemirror-markdown.ts @@ -0,0 +1,77 @@ +import { EditorView } from 'prosemirror-view' +import { EditorState } from 'prosemirror-state' +import { schema, defaultMarkdownParser, defaultMarkdownSerializer } from 'prosemirror-markdown' +import { exampleSetup, buildMenuItems } from 'prosemirror-example-setup' +import { MarkSpec } from 'prosemirror-model' +import { toggleMark } from 'prosemirror-commands' + +export class ProseMirrorView { + view + + constructor (target, content) { + console.log('schema.marks', schema.marks) + //@ts-expect-error + schema.marks.textColor = { + spec: { + attrs: { color: {} }, + inline: true, + parseDOM: [ + { + style: 'color', + getAttrs: value => ({ color: value }) + } + ], + toDOM: mark => ['span', { style: `color: ${mark.attrs.color}` }, 0] + }, + } + + const fullMenu = buildMenuItems(schema).fullMenu as Array> + fullMenu[0] = fullMenu[0].filter(item => item.spec.title !== 'Add or remove link' && item.spec.title !== 'Toggle code font') + fullMenu.splice(3, 1); // remove the insert list, quote & checkbox menu + (fullMenu[1][0] as any).options.label = 'Color' // check-build error: fullMenu[1][0].options.label = 'Color' + // fullMenu[1][0].content[0].spec.label = 'Red' + // fullMenu[1][0].content[0].spec.run = (state, dispatch, view) => { + // console.log('state', state) + // // make

...

+ // const { from, to } = state.selection + // const { tr } = state + // console.log(schema.marks) + // tr.addMark(from, to, schema.marks.textColor.create({ color: 'red' })) + // dispatch(tr) + // toggleMark(schema.marks.textColor, { color: 'red' })(state, dispatch, view) + // } + fullMenu[1].splice(1, 1) // remove the type menu + console.log('fullMenu', fullMenu) + this.view = new EditorView(target, { + state: EditorState.create({ + doc: defaultMarkdownParser.parse(content) ?? undefined, + plugins: exampleSetup({ + schema, + menuContent: fullMenu, + }), + }), + attributes (state) { + return { + autocorrect: 'off', + autocapitalize: 'off', + spellcheck: 'false', + autofocus: 'true', + } + }, + }) + } + + get content () { + const content = defaultMarkdownSerializer.serialize(this.view.state.doc) + console.log('content', content) + return content + } + + focus () { + this.view.focus() + } + + destroy () { + this.view.destroy() + } +} diff --git a/src/reactUi.tsx b/src/reactUi.tsx index 2b474adc..aa1d74dd 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -15,6 +15,7 @@ import EnterFullscreenButton from './react/EnterFullscreenButton' import ChatProvider from './react/ChatProvider' import TitleProvider from './react/TitleProvider' import ScoreboardProvider from './react/ScoreboardProvider' +import SignEditorProvider from './react/SignEditorProvider' import SoundMuffler from './react/SoundMuffler' import TouchControls from './react/TouchControls' import widgets from './react/widgets' @@ -66,7 +67,10 @@ const InGameUi = () => { - + + + + {/* becaues of z-index */} diff --git a/vitest.config.ts b/vitest.config.ts index fc9d1e49..9a992a52 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,6 +5,7 @@ export default defineConfig({ test: { include: [ '../../src/botUtils.test.ts', + '../../src/markdownToFormattedText.test.ts', 'sign-renderer/tests.test.ts' ], }, From 2ee21d5f7d198a312bf8a143dd7cea853f8ac028 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 23 Mar 2024 19:21:06 +0300 Subject: [PATCH 0091/1195] fix: improve google integration ux by saving last folder + fix creating worlds --- src/googledrive.ts | 30 +++---- src/react/SingleplayerProvider.tsx | 132 +++++++++++++++-------------- 2 files changed, 85 insertions(+), 77 deletions(-) diff --git a/src/googledrive.ts b/src/googledrive.ts index 2128ae2f..3846add3 100644 --- a/src/googledrive.ts +++ b/src/googledrive.ts @@ -25,9 +25,9 @@ export const useGoogleLogIn = () => { const login = useGoogleLogin({ onSuccess (tokenResponse) { localStorage.hasEverLoggedIn = true - googleProviderData.accessToken = tokenResponse.access_token - googleProviderData.expiresIn = ref(new Date(Date.now() + tokenResponse.expires_in * 1000)) - googleProviderData.hasEverLoggedIn = true + googleProviderState.accessToken = tokenResponse.access_token + googleProviderState.expiresIn = ref(new Date(Date.now() + tokenResponse.expires_in * 1000)) + googleProviderState.hasEverLoggedIn = true }, // prompt: hasEverLoggedIn ? 'none' : 'consent', scope: SCOPES, @@ -35,12 +35,12 @@ export const useGoogleLogIn = () => { onError (error) { const accessDenied = error.error === 'access_denied' || error.error === 'invalid_scope' || (error as any).error_subtype === 'access_denied' if (accessDenied) { - googleProviderData.hasEverLoggedIn = false + googleProviderState.hasEverLoggedIn = false } } }) return () => login({ - prompt: googleProviderData.hasEverLoggedIn ? 'none' : 'consent' + prompt: googleProviderState.hasEverLoggedIn ? 'none' : 'consent' }) } @@ -61,11 +61,11 @@ export const possiblyHandleStateVariable = async () => { async callback (response) { if (response.error) { setLoadingScreenStatus('Error: ' + response.error, true) - googleProviderData.hasEverLoggedIn = false + googleProviderState.hasEverLoggedIn = false return } setLoadingScreenStatus('Opening world in read only mode...') - googleProviderData.accessToken = response.access_token + googleProviderState.accessToken = response.access_token await mountGoogleDriveFolder(true, parsed.ids[0]) await loadInMemorySave('/google') } @@ -73,14 +73,14 @@ export const possiblyHandleStateVariable = async () => { const choice = await showOptionsModal('Select an action...', ['Login']) if (choice === 'Login') { tokenClient.requestAccessToken({ - prompt: googleProviderData.hasEverLoggedIn ? '' : 'consent', + prompt: googleProviderState.hasEverLoggedIn ? '' : 'consent', }) } else { window.close() } } -export const googleProviderData = proxy({ +export const googleProviderState = proxy({ accessToken: (localStorage.saveAccessToken ? localStorage.accessToken : null) as string | null, hasEverLoggedIn: !!(localStorage.hasEverLoggedIn), isReady: false, @@ -92,18 +92,18 @@ export const googleProviderData = proxy({ } | null }) -subscribe(googleProviderData, () => { - localStorage.googleReadonlyMode = googleProviderData.readonlyMode - localStorage.lastSelectedFolder = googleProviderData.lastSelectedFolder ? JSON.stringify(googleProviderData.lastSelectedFolder) : null - if (googleProviderData.hasEverLoggedIn) { +subscribe(googleProviderState, () => { + localStorage.googleReadonlyMode = googleProviderState.readonlyMode + localStorage.lastSelectedFolder = googleProviderState.lastSelectedFolder ? JSON.stringify(googleProviderState.lastSelectedFolder) : null + if (googleProviderState.hasEverLoggedIn) { localStorage.hasEverLoggedIn = true } else { delete localStorage.hasEverLoggedIn } - if (localStorage.saveAccessToken && googleProviderData) { + if (localStorage.saveAccessToken && googleProviderState) { // For testing only - localStorage.accessToken = googleProviderData.accessToken || null + localStorage.accessToken = googleProviderState.accessToken || null } else { delete localStorage.accessToken } diff --git a/src/react/SingleplayerProvider.tsx b/src/react/SingleplayerProvider.tsx index 32d175f4..8eb3af0f 100644 --- a/src/react/SingleplayerProvider.tsx +++ b/src/react/SingleplayerProvider.tsx @@ -7,7 +7,7 @@ import { googleDriveGetFileIdFromPath, mountExportFolder, mountGoogleDriveFolder import { hideCurrentModal, showModal } from '../globalState' import { haveDirectoryPicker, setLoadingScreenStatus } from '../utils' import { exportWorld } from '../builtinCommands' -import { googleProviderData, useGoogleLogIn, GoogleDriveProvider, isGoogleDriveAvailable, APP_ID } from '../googledrive' +import { googleProviderState, useGoogleLogIn, GoogleDriveProvider, isGoogleDriveAvailable, APP_ID } from '../googledrive' import Singleplayer, { WorldProps } from './Singleplayer' import { useIsModalActive } from './utils' import { showOptionsModal } from './SelectOption' @@ -18,6 +18,7 @@ const worldsProxy = proxy({ value: null as null | WorldProps[], brokenWorlds: [] as string[], selectedProvider: 'local' as 'local' | 'google', + selectedGoogleId: '', error: '', }) @@ -48,7 +49,7 @@ export const readWorlds = (abortController: AbortController) => { (async () => { const brokenWorlds = [] as string[] try { - const loggedIn = !!googleProviderData.accessToken + const loggedIn = !!googleProviderState.accessToken worldsProxy.value = null if (worldsProxy.selectedProvider === 'google' && !loggedIn) { worldsProxy.value = [] @@ -135,7 +136,7 @@ export const loadGoogleDriveApi = async () => { gapi.load('client', () => { gapi.load('client:picker', () => { void gapi.client.load('https://www.googleapis.com/discovery/v1/apis/drive/v3/rest').then(() => { - googleProviderData.isReady = true + googleProviderState.isReady = true resolve() }) }) @@ -145,24 +146,17 @@ export const loadGoogleDriveApi = async () => { const Inner = () => { const worlds = useSnapshot(worldsProxy).value as WorldProps[] | null - const { selectedProvider, error, brokenWorlds } = useSnapshot(worldsProxy) + const { selectedProvider, error, brokenWorlds, selectedGoogleId } = useSnapshot(worldsProxy) const readWorldsAbortController = useRef(new AbortController()) - useEffect(() => { - return () => { - worldsProxy.selectedProvider = 'local' - } - }, []) - // 3rd party providers useEffect(() => { if (selectedProvider !== 'google') return void loadGoogleDriveApi() }, [selectedProvider]) - const [selectedGoogleId, setSelectedGoogleId] = useState('') - const loggedIn = !!useSnapshot(googleProviderData).accessToken - const googleDriveReadonly = useSnapshot(googleProviderData).readonlyMode + const loggedIn = !!useSnapshot(googleProviderState).accessToken + const googleDriveReadonly = useSnapshot(googleProviderState).readonlyMode useEffect(() => { (async () => { @@ -171,7 +165,7 @@ const Inner = () => { worldsProxy.value = [] return } - await mountGoogleDriveFolder(googleProviderData.readonlyMode, selectedGoogleId) + await mountGoogleDriveFolder(googleProviderState.readonlyMode, selectedGoogleId) const exists = async (path) => { try { await fs.promises.stat(path) @@ -199,21 +193,74 @@ const Inner = () => { const googleLogIn = useGoogleLogIn() - const isGoogleProviderReady = useSnapshot(googleProviderData).isReady - const providerActions = selectedProvider === 'google' ? isGoogleProviderReady ? loggedIn ? { + const googlePicker = useRef/* */(null as any) + + useEffect(() => { + return () => { + googlePicker.current?.dispose() + } + }) + + const selectGoogleFolder = async () => { + if (googleProviderState.lastSelectedFolder) { + // ask to use saved previous fodler + const choice = await showOptionsModal(`Use previously selected folder "${googleProviderState.lastSelectedFolder.name}"?`, ['Yes', 'No']) + if (!choice) return + if (choice === 'Yes') { + worldsProxy.selectedGoogleId = googleProviderState.lastSelectedFolder.id + return + } + } + + const { google } = window + + const view = new google.picker.DocsView(google.picker.ViewId.FOLDERS) + .setIncludeFolders(true) + .setMimeTypes('application/vnd.google-apps.folder') + .setSelectFolderEnabled(true) + .setParent('root') + + + googlePicker.current = new google.picker.PickerBuilder() + .enableFeature(google.picker.Feature.NAV_HIDDEN) + .enableFeature(google.picker.Feature.MULTISELECT_ENABLED) + .setDeveloperKey('AIzaSyBTiHpEqaLL7mEcrsnSS4M-z8cpRH5UwY0') + .setAppId(APP_ID) + .setOAuthToken(googleProviderState.accessToken) + .addView(view) + .addView(new google.picker.DocsUploadView()) + .setTitle('Select a folder with your worlds') + .setCallback((data) => { + if (data.action === google.picker.Action.PICKED) { + googleProviderState.lastSelectedFolder = { + id: data.docs[0].id, + name: data.docs[0].name, + } + worldsProxy.selectedGoogleId = data.docs[0].id + } + }) + .build() + googlePicker.current.setVisible(true) + } + + const isGoogleProviderReady = useSnapshot(googleProviderState).isReady + const providerActions = loggedIn && selectedProvider === 'google' && isGoogleProviderReady && !selectedGoogleId ? { + 'Select Folder': selectGoogleFolder + } : selectedProvider === 'google' ? isGoogleProviderReady ? loggedIn ? { 'Log Out' () { - googleProviderData.hasEverLoggedIn = false - googleProviderData.accessToken = null - googleProviderData.lastSelectedFolder = null - window.google.accounts.oauth2.revoke(googleProviderData.accessToken) + googleProviderState.hasEverLoggedIn = false + googleProviderState.accessToken = null + googleProviderState.lastSelectedFolder = null + window.google.accounts.oauth2.revoke(googleProviderState.accessToken) }, async [`Read Only: ${googleDriveReadonly ? 'ON' : 'OFF'}`] () { - if (googleProviderData.readonlyMode) { + if (googleProviderState.readonlyMode) { const choice = await showOptionsModal('[Unstable Feature] Enabling world save might corrupt your worlds, eg remove entities (note: you can always restore previous version of files in Drive)', ['Continue']) if (choice !== 'Continue') return } - googleProviderData.readonlyMode = !googleProviderData.readonlyMode + googleProviderState.readonlyMode = !googleProviderState.readonlyMode }, + 'Select Folder': selectGoogleFolder, // 'Worlds Path': { // googleProviderData.worldsPath = e.target.value // }} /> @@ -224,48 +271,9 @@ const Inner = () => { } : undefined // end - useEffect(() => { - let picker - if (loggedIn && selectedProvider === 'google' && isGoogleProviderReady) { - const { google } = window - - const view = new google.picker.DocsView(google.picker.ViewId.FOLDERS) - .setIncludeFolders(true) - .setMimeTypes('application/vnd.google-apps.folder') - .setSelectFolderEnabled(true) - .setParent('root') - - - picker = new google.picker.PickerBuilder() - .enableFeature(google.picker.Feature.NAV_HIDDEN) - .enableFeature(google.picker.Feature.MULTISELECT_ENABLED) - .setDeveloperKey('AIzaSyBTiHpEqaLL7mEcrsnSS4M-z8cpRH5UwY0') - .setAppId(APP_ID) - .setOAuthToken(googleProviderData.accessToken) - .addView(view) - .addView(new google.picker.DocsUploadView()) - .setTitle('Select a folder with your worlds') - .setCallback((data) => { - if (data.action === google.picker.Action.PICKED) { - googleProviderData.lastSelectedFolder = { - id: data.docs[0].id, - name: data.docs[0].name, - } - setSelectedGoogleId(data.docs[0].id) - } - }) - .build() - picker.setVisible(true) - } - - return () => { - if (picker) picker.dispose() - } - }, [selectedProvider, loggedIn]) - return Date: Sun, 24 Mar 2024 05:06:29 +0300 Subject: [PATCH 0092/1195] hotfix for signeditor & arrows in wysiwyg --- src/react/SignEditor.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/react/SignEditor.tsx b/src/react/SignEditor.tsx index ffea0784..e3af3139 100644 --- a/src/react/SignEditor.tsx +++ b/src/react/SignEditor.tsx @@ -35,6 +35,8 @@ export default ({ handleInput, isWysiwyg, handleClick }: Props) => { return
{ + // arrow down/up, Enter to navigate between lines + if (isWysiwyg) return // todo let { code } = e if ((e.target as HTMLElement).matches('input') && e.key === 'Enter') code = 'ArrowDown' if (code === 'ArrowDown' || code === 'ArrowUp') { From 5d6032c05dc70c2071c85417817f24cd5a07b022 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 24 Mar 2024 09:46:03 +0300 Subject: [PATCH 0093/1195] cache pnpm, force 18 node --- .github/workflows/preview.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 8fcfbdc2..ef1d7773 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -21,6 +21,10 @@ jobs: uses: actions/checkout@v2 with: ref: refs/pull/${{ github.event.issue.number }}/head + - uses: actions/setup-node@v4 + with: + node-version: 18 + cache: "pnpm" - name: Install Global Dependencies run: npm install --global vercel pnpm - name: Pull Vercel Environment Information From 625d4c1c1970e7ac98b63039d555efe584e3734a Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 25 Mar 2024 03:44:32 +0300 Subject: [PATCH 0094/1195] migrate to cypress 10 for native m1 support --- cypress.config.ts | 16 +++++++ cypress.json | 11 ----- .../superflat-world #0.png | Bin .../superflat-world #1.png | Bin .../superflat-world #2.png | Bin cypress/{integration => e2e}/index.spec.ts | 0 cypress/support/{index.js => e2e.js} | 0 package.json | 4 +- pnpm-lock.yaml | 40 ++++++------------ 9 files changed, 32 insertions(+), 39 deletions(-) create mode 100644 cypress.config.ts delete mode 100644 cypress.json rename cypress/{integration => e2e}/__image_snapshots__/superflat-world #0.png (100%) rename cypress/{integration => e2e}/__image_snapshots__/superflat-world #1.png (100%) rename cypress/{integration => e2e}/__image_snapshots__/superflat-world #2.png (100%) rename cypress/{integration => e2e}/index.spec.ts (100%) rename cypress/support/{index.js => e2e.js} (100%) diff --git a/cypress.config.ts b/cypress.config.ts new file mode 100644 index 00000000..ae01d42f --- /dev/null +++ b/cypress.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'cypress' + +export default defineConfig({ + video: false, + chromeWebSecurity: false, + e2e: { + // We've imported your old cypress plugins here. + // You may want to clean this up later by importing these. + setupNodeEvents(on, config) { + return require('./cypress/plugins/index.js')(on, config) + }, + baseUrl: 'http://localhost:8080', + specPattern: 'cypress/e2e/**/*.spec.ts', + excludeSpecPattern: ['**/__snapshots__/*', '**/__image_snapshots__/*'], + }, +}) diff --git a/cypress.json b/cypress.json deleted file mode 100644 index 63bfb351..00000000 --- a/cypress.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/cypress-io/cypress/188b9a742ee2ef51102167bfd84b3696a3f72a26/cli/schema/cypress.schema.json", - "baseUrl": "http://localhost:8080", - "testFiles": "**/*.spec.ts", - "video": false, - "chromeWebSecurity": false, - "ignoreTestFiles": [ - "**/__snapshots__/*", - "**/__image_snapshots__/*" - ] -} diff --git a/cypress/integration/__image_snapshots__/superflat-world #0.png b/cypress/e2e/__image_snapshots__/superflat-world #0.png similarity index 100% rename from cypress/integration/__image_snapshots__/superflat-world #0.png rename to cypress/e2e/__image_snapshots__/superflat-world #0.png diff --git a/cypress/integration/__image_snapshots__/superflat-world #1.png b/cypress/e2e/__image_snapshots__/superflat-world #1.png similarity index 100% rename from cypress/integration/__image_snapshots__/superflat-world #1.png rename to cypress/e2e/__image_snapshots__/superflat-world #1.png diff --git a/cypress/integration/__image_snapshots__/superflat-world #2.png b/cypress/e2e/__image_snapshots__/superflat-world #2.png similarity index 100% rename from cypress/integration/__image_snapshots__/superflat-world #2.png rename to cypress/e2e/__image_snapshots__/superflat-world #2.png diff --git a/cypress/integration/index.spec.ts b/cypress/e2e/index.spec.ts similarity index 100% rename from cypress/integration/index.spec.ts rename to cypress/e2e/index.spec.ts diff --git a/cypress/support/index.js b/cypress/support/e2e.js similarity index 100% rename from cypress/support/index.js rename to cypress/support/e2e.js diff --git a/package.json b/package.json index 8d6bfbf6..881be9cc 100644 --- a/package.json +++ b/package.json @@ -62,11 +62,11 @@ "node-gzip": "^1.1.2", "peerjs": "^1.5.0", "pretty-bytes": "^6.1.1", + "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", "prosemirror-example-setup": "^1.2.2", "prosemirror-markdown": "^1.12.0", "prosemirror-state": "^1.4.3", "prosemirror-view": "^1.33.1", - "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", "qrcode.react": "^3.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -103,7 +103,7 @@ "constants-browserify": "^1.0.0", "contro-max": "^0.1.1", "crypto-browserify": "^3.12.0", - "cypress": "^9.5.4", + "cypress": "^10.11.0", "cypress-esbuild-preprocessor": "^1.0.2", "eslint": "^8.50.0", "eslint-config-zardoy": "^0.2.17", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 759690ff..483f0277 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,7 +68,7 @@ importers: version: 2.8.5 cypress-plugin-snapshots: specifier: ^1.4.4 - version: 1.4.4(cypress@9.5.4) + version: 1.4.4(cypress@10.11.0) debug: specifier: ^4.3.4 version: 4.3.4(supports-color@8.1.1) @@ -246,8 +246,8 @@ importers: specifier: ^3.12.0 version: 3.12.0 cypress: - specifier: ^9.5.4 - version: 9.5.4 + specifier: ^10.11.0 + version: 10.11.0 cypress-esbuild-preprocessor: specifier: ^1.0.2 version: 1.0.2 @@ -5357,7 +5357,7 @@ packages: resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: - '@types/node': 20.8.10 + '@types/node': 20.11.19 optional: true /@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2): @@ -6621,7 +6621,6 @@ packages: function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.1 - dev: true /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -7223,13 +7222,13 @@ packages: resolution: {integrity: sha512-JsFnm6fBQt/OEzstknJ1KLMTuUERUaG0ZB9fk0KdNUlZqxaVEoQ9/pFvKmqRfzUe2y00cWD++ptccQA4tNAAlQ==} dev: true - /cypress-plugin-snapshots@1.4.4(cypress@9.5.4): + /cypress-plugin-snapshots@1.4.4(cypress@10.11.0): resolution: {integrity: sha512-rijq3RTEZNtxQA4KCUwjXinmE1Ww+z6cQW0B14iodFM/HlX5LN16XT/2QS3X1nUXRKt0QdTrAC5MQfMUrjBkSQ==} engines: {node: '>=8.2.1'} peerDependencies: cypress: ^4.5.0 dependencies: - cypress: 9.5.4 + cypress: 10.11.0 diff2html: 2.12.2 fs-extra: 7.0.1 image-size: 0.7.5 @@ -7251,8 +7250,8 @@ packages: - utf-8-validate dev: false - /cypress@9.5.4: - resolution: {integrity: sha512-6AyJAD8phe7IMvOL4oBsI9puRNOWxZjl8z1lgixJMcgJ85JJmyKeP6uqNA0dI1z14lmJ7Qklf2MOgP/xdAqJ/Q==} + /cypress@10.11.0: + resolution: {integrity: sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==} engines: {node: '>=12.0.0'} hasBin: true requiresBuild: true @@ -7276,7 +7275,7 @@ packages: dayjs: 1.11.9 debug: 4.3.4(supports-color@8.1.1) enquirer: 2.4.1 - eventemitter2: 6.4.9 + eventemitter2: 6.4.7 execa: 4.1.0 executable: 4.1.1 extract-zip: 2.0.1(supports-color@8.1.1) @@ -7294,7 +7293,7 @@ packages: pretty-bytes: 5.6.0 proxy-from-env: 1.0.0 request-progress: 3.0.0 - semver: 7.5.4 + semver: 7.6.0 supports-color: 8.1.1 tmp: 0.2.1 untildify: 4.0.0 @@ -7458,7 +7457,6 @@ packages: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - dev: true /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} @@ -7999,12 +7997,10 @@ packages: engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 - dev: true /es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - dev: true /es-iterator-helpers@1.0.17: resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} @@ -8624,8 +8620,8 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} - /eventemitter2@6.4.9: - resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + /eventemitter2@6.4.7: + resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -9096,7 +9092,6 @@ packages: /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true /function.prototype.name@1.1.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} @@ -9170,7 +9165,6 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.1 - dev: true /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} @@ -9466,7 +9460,6 @@ packages: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: es-define-property: 1.0.0 - dev: true /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} @@ -9520,7 +9513,6 @@ packages: engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 - dev: true /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} @@ -11792,7 +11784,6 @@ packages: /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} @@ -12751,7 +12742,6 @@ packages: /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - dev: false /puppeteer-core@2.1.1: resolution: {integrity: sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==} @@ -12785,7 +12775,7 @@ packages: resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.4 + side-channel: 1.0.5 /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} @@ -13705,7 +13695,6 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 - dev: true /set-function-name@2.0.1: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} @@ -13797,7 +13786,6 @@ packages: es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - dev: true /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -14607,7 +14595,7 @@ packages: engines: {node: '>=6'} dependencies: psl: 1.9.0 - punycode: 2.3.0 + punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 From 501d353ac09c99c82c6fa082b77b0f16e2671979 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 25 Mar 2024 08:19:56 +0300 Subject: [PATCH 0095/1195] fix vercel preview deploy --- .github/workflows/preview.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index ef1d7773..2a5f5665 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -21,6 +21,7 @@ jobs: uses: actions/checkout@v2 with: ref: refs/pull/${{ github.event.issue.number }}/head + - run: npm i -g pnpm - uses: actions/setup-node@v4 with: node-version: 18 From 6997e78cf1fb47eb6abb9bd65304731205ece2b6 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Mon, 25 Mar 2024 09:57:26 +0300 Subject: [PATCH 0096/1195] fix warps display for greenfield & click action --- src/loadSave.ts | 6 ++++-- src/react/Notification.tsx | 4 ++-- src/react/NotificationProvider.tsx | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/loadSave.ts b/src/loadSave.ts index 965b1a7c..a707da4d 100644 --- a/src/loadSave.ts +++ b/src/loadSave.ts @@ -6,7 +6,7 @@ import { proxy } from 'valtio' import { gzip } from 'node-gzip' import { options } from './optionsStorage' import { nameToMcOfflineUUID, disconnect } from './flyingSquidUtils' -import { forceCachedDataPaths, forceRedirectPaths, mkdirRecursive } from './browserfs' +import { existsViaStats, forceCachedDataPaths, forceRedirectPaths, mkdirRecursive } from './browserfs' import { isMajorVersionGreater } from './utils' import { activeModalStacks, insertActiveModalStack, miscUiState } from './globalState' @@ -154,7 +154,9 @@ export const loadSave = async (root = '/world') => { // improve compatibility with community saves const rootRemapFiles = ['Warp files'] for (const rootRemapFile of rootRemapFiles) { - forceRedirectPaths[path.join(root, rootRemapFile)] = path.join(root, '..', rootRemapFile) + if (await existsViaStats(path.join(root, '..', rootRemapFile))) { + forceRedirectPaths[path.join(root, rootRemapFile)] = path.join(root, '..', rootRemapFile) + } } // todo reimplement diff --git a/src/react/Notification.tsx b/src/react/Notification.tsx index 6ebd49e2..0f3a6325 100644 --- a/src/react/Notification.tsx +++ b/src/react/Notification.tsx @@ -36,7 +36,7 @@ export default ({ type = 'message', message, subMessage = '', open, icon = '', a position: 'fixed', top: 0, right: 0, - width: '160px', + width: '155px', whiteSpace: 'nowrap', fontSize: '9px', display: 'flex', @@ -45,7 +45,7 @@ export default ({ type = 'message', message, subMessage = '', open, icon = '', a padding: '3px 8px', background: isError ? 'rgba(255, 0, 0, 0.7)' : 'rgba(0, 0, 0, 0.7)', borderRadius: '0 0 0 5px', - pointerEvents: action ? 'auto' : 'none', + pointerEvents: action ? '' : 'none', zIndex: 1200, // even above stats ...addStyles }}> diff --git a/src/react/NotificationProvider.tsx b/src/react/NotificationProvider.tsx index 2f27a595..e5ceb0b3 100644 --- a/src/react/NotificationProvider.tsx +++ b/src/react/NotificationProvider.tsx @@ -40,7 +40,7 @@ export const hideNotification = () => { } export default () => { - const { autoHide, message, open, icon, type, subMessage } = useSnapshot(notificationProxy) + const { autoHide, message, open, icon, type, subMessage, action } = useSnapshot(notificationProxy) useEffect(() => { if (autoHide && open) { @@ -58,6 +58,7 @@ export default () => { // }, []) return Date: Mon, 25 Mar 2024 13:47:01 +0300 Subject: [PATCH 0097/1195] three shake three.js (#94) --- scripts/esbuildPlugins.mjs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts/esbuildPlugins.mjs b/scripts/esbuildPlugins.mjs index 07938c6e..95d88b8e 100644 --- a/scripts/esbuildPlugins.mjs +++ b/scripts/esbuildPlugins.mjs @@ -27,7 +27,8 @@ const plugins = [ build.onLoad({ filter: /minecraft-data[\/\\]data.js$/, }, (args) => { - const version = supportedVersions.at(-1); + const version = supportedVersions.at(-1) + if (!version) throw new Error('unreachable') const data = MCData(version) const defaultVersionsObj = { // default protocol data, needed for auto-version @@ -47,6 +48,14 @@ const plugins = [ }, () => { throw new Error('hit banned package') }) + + build.onResolve({ + filter: /^three$/, + }, async ({ kind, resolveDir }) => { + return { + path: (await build.resolve('three/src/Three.js', { kind, resolveDir })).path, + } + }) } }, { From 07491fd72c45cea6030e888723639266ae4ea78e Mon Sep 17 00:00:00 2001 From: gguio <109200692+gguio@users.noreply.github.com> Date: Tue, 26 Mar 2024 17:00:11 +0400 Subject: [PATCH 0098/1195] feat: effects + system indicators in hud! (#95) Co-authored-by: gguio --- prismarine-viewer/viewer/lib/worldrenderer.ts | 1 + src/browserfs.ts | 24 +++- src/globalState.ts | 1 + src/index.ts | 2 + src/loadSave.ts | 4 +- src/react/IndicatorEffects.css | 35 ++++++ src/react/IndicatorEffects.stories.tsx | 35 ++++++ src/react/IndicatorEffects.tsx | 111 ++++++++++++++++ src/react/IndicatorEffectsProvider.tsx | 118 ++++++++++++++++++ src/react/effectsImages.ts | 76 +++++++++++ src/reactUi.tsx | 2 + src/utils.ts | 6 + 12 files changed, 413 insertions(+), 2 deletions(-) create mode 100644 src/react/IndicatorEffects.css create mode 100644 src/react/IndicatorEffects.stories.tsx create mode 100644 src/react/IndicatorEffects.tsx create mode 100644 src/react/IndicatorEffectsProvider.tsx create mode 100644 src/react/effectsImages.ts diff --git a/prismarine-viewer/viewer/lib/worldrenderer.ts b/prismarine-viewer/viewer/lib/worldrenderer.ts index 1b67a342..a3c0f79c 100644 --- a/prismarine-viewer/viewer/lib/worldrenderer.ts +++ b/prismarine-viewer/viewer/lib/worldrenderer.ts @@ -342,6 +342,7 @@ export class WorldRenderer { } setSectionDirty (pos, value = true) { + this.renderUpdateEmitter.emit('dirty', pos, value) this.cleanChunkTextures(pos.x, pos.z) // todo don't do this! // Dispatch sections to workers based on position // This guarantees uniformity accross workers and that a given section diff --git a/src/browserfs.ts b/src/browserfs.ts index 42159b49..ebe8acfd 100644 --- a/src/browserfs.ts +++ b/src/browserfs.ts @@ -60,7 +60,18 @@ fs.promises = new Proxy(Object.fromEntries(['readFile', 'writeFile', 'stat', 'mk if (p === 'open' && fsState.isReadonly) { args[1] = 'r' // read-only, zipfs throw otherwise } - return target[p](...args) + if (p === 'readFile') { + fsState.openReadOperations++ + } else if (p === 'writeFile') { + fsState.openWriteOperations++ + } + return target[p](...args).finally(() => { + if (p === 'readFile') { + fsState.openReadOperations-- + } else if (p === 'writeFile') { + fsState.openWriteOperations-- + } + }) } } }) @@ -77,7 +88,18 @@ fs.promises.open = async (...args) => { return } + if (x === 'read') { + fsState.openReadOperations++ + } else if (x === 'write' || x === 'close') { + fsState.openWriteOperations++ + } fs[x](fd, ...args, (err, bytesRead, buffer) => { + if (x === 'read') { + fsState.openReadOperations-- + } else if (x === 'write' || x === 'close') { + // todo that's not correct + fsState.openWriteOperations-- + } if (err) throw err // todo if readonly probably there is no need to open at all (return some mocked version - check reload)? if (x === 'write' && !fsState.isReadonly) { diff --git a/src/globalState.ts b/src/globalState.ts index 749b3a8f..392d5fd9 100644 --- a/src/globalState.ts +++ b/src/globalState.ts @@ -129,6 +129,7 @@ export type AppConfig = { export const miscUiState = proxy({ currentDisplayQr: null as string | null, currentTouch: null as boolean | null, + hasErrors: false, singleplayer: false, flyingSquid: false, wanOpened: false, diff --git a/src/index.ts b/src/index.ts index e10f60a9..162f19a2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -318,6 +318,7 @@ async function connect (connectOptions: { server?: string; singleplayer?: any; username: string; password?: any; proxy?: any; botVersion?: any; serverOverrides?; serverOverridesFlat?; peerId?: string }) { if (miscUiState.gameLoaded) return + miscUiState.hasErrors = false lastConnectOptions.value = connectOptions document.getElementById('play-screen').style = 'display: none;' removePanorama() @@ -378,6 +379,7 @@ async function connect (connectOptions: { console.error(err) errorAbortController.abort() if (isCypress()) throw err + miscUiState.hasErrors = true if (miscUiState.gameLoaded) return setLoadingScreenStatus(`Error encountered. ${err}`, true) diff --git a/src/loadSave.ts b/src/loadSave.ts index a707da4d..655fbea8 100644 --- a/src/loadSave.ts +++ b/src/loadSave.ts @@ -17,7 +17,9 @@ export const fsState = proxy({ isReadonly: false, syncFs: false, inMemorySave: false, - saveLoaded: false + saveLoaded: false, + openReadOperations: 0, + openWriteOperations: 0, }) const PROPOSE_BACKUP = true diff --git a/src/react/IndicatorEffects.css b/src/react/IndicatorEffects.css new file mode 100644 index 00000000..2902bfee --- /dev/null +++ b/src/react/IndicatorEffects.css @@ -0,0 +1,35 @@ +.effectsScreen-container { + position: fixed; + top: 6%; + left: 0px; + z-index: -1; + pointer-events: none; +} + +.indicators-container { + display: flex; + font-size: 0.7em; +} + +.effects-container { + display: flex; + flex-direction: column; +} + +.effect-box { + display: flex; + align-items: center; +} + +.effect-box__image { + width: 23px; + margin-right: 3px; +} + +.effect-box__time { + font-size: 0.65rem; +} + +.effect-box__level { + font-size: 0.45rem; +} diff --git a/src/react/IndicatorEffects.stories.tsx b/src/react/IndicatorEffects.stories.tsx new file mode 100644 index 00000000..455718fe --- /dev/null +++ b/src/react/IndicatorEffects.stories.tsx @@ -0,0 +1,35 @@ +import 'iconify-icon' + +import type { Meta, StoryObj } from '@storybook/react' + +import IndicatorEffects, { defaultIndicatorsState } from './IndicatorEffects' +import { images } from './effectsImages' + +const meta: Meta = { + component: IndicatorEffects +} + +export default meta +type Story = StoryObj; + +export const Primary: Story = { + args: { + indicators: defaultIndicatorsState, + effects: [ + { + image: images.glowing, + time: 200, + level: 255, + removeEffect (image: string) {}, + reduceTime (image: string) {} + }, + { + image: images.absorption, + time: 30, + level: 99, + removeEffect (image: string) {}, + reduceTime (image: string) {} + } + ], + } +} diff --git a/src/react/IndicatorEffects.tsx b/src/react/IndicatorEffects.tsx new file mode 100644 index 00000000..b767cc23 --- /dev/null +++ b/src/react/IndicatorEffects.tsx @@ -0,0 +1,111 @@ +import { useMemo, useEffect, useRef } from 'react' +import PixelartIcon from './PixelartIcon' +import './IndicatorEffects.css' + + + +function formatTime (seconds: number): string { + if (seconds < 0) return '' + const minutes = Math.floor(seconds / 60) + const remainingSeconds = seconds % 60 + const formattedMinutes = String(minutes).padStart(2, '0') + const formattedSeconds = String(remainingSeconds).padStart(2, '0') + return `${formattedMinutes}:${formattedSeconds}` +} + +export type EffectType = { + image: string, + time: number, + level: number, + removeEffect: (image: string) => void, + reduceTime: (image: string) => void +} + +const EffectBox = ({ image, time, level }: Pick) => { + + const formattedTime = useMemo(() => formatTime(time), [time]) + + return
+ +
+ {formattedTime ? ( + // if time is negative then effect is shown without time. + // Component should be removed manually with time = 0 +
{formattedTime}
+ ) : null } + {level > 0 && level < 256 ? ( +
{level + 1}
+ ) : null } +
+
+} + +export const defaultIndicatorsState = { + chunksLoading: false, + readingFiles: false, + readonlyFiles: false, + writingFiles: false, // saving + appHasErrors: false, +} + +const indicatorIcons: Record = { + chunksLoading: 'add-grid', + readingFiles: 'arrow-bar-down', + writingFiles: 'arrow-bar-up', + appHasErrors: 'alert', + readonlyFiles: 'file-off', +} + +export default ({ indicators, effects }: {indicators: typeof defaultIndicatorsState, effects: readonly EffectType[]}) => { + const effectsRef = useRef(effects) + useEffect(() => { + effectsRef.current = effects + }, [effects]) + + useEffect(() => { + // todo use more precise timer for each effect + const interval = setInterval(() => { + for (const [index, effect] of effectsRef.current.entries()) { + if (effect.time === 0) { + // effect.removeEffect(effect.image) + return + } + effect.reduceTime(effect.image) + } + }, 1000) + + return () => { + clearInterval(interval) + } + }, []) + + const indicatorsMapped = Object.entries(defaultIndicatorsState).map(([key, state]) => ({ + icon: indicatorIcons[key], + // preserve order + state: indicators[key], + })) + return
+
+ { + indicatorsMapped.map((indicator) =>
+ +
) + } +
+
+ { + effects.map( + (effect) => + ) + } +
+
+} diff --git a/src/react/IndicatorEffectsProvider.tsx b/src/react/IndicatorEffectsProvider.tsx new file mode 100644 index 00000000..00b78d8a --- /dev/null +++ b/src/react/IndicatorEffectsProvider.tsx @@ -0,0 +1,118 @@ +import { proxy, useSnapshot } from 'valtio' +import { useEffect, useMemo } from 'react' +import { inGameError } from '../utils' +import { fsState } from '../loadSave' +import { miscUiState } from '../globalState' +import IndicatorEffects, { EffectType, defaultIndicatorsState } from './IndicatorEffects' +import { images } from './effectsImages' + +export const state = proxy({ + indicators: { + chunksLoading: false + }, + effects: [] as EffectType[] +}) + +export const addEffect = (newEffect: Omit) => { + const effectIndex = getEffectIndex(newEffect as EffectType) + if (typeof effectIndex === 'number') { + state.effects[effectIndex].time = newEffect.time + state.effects[effectIndex].level = newEffect.level + } else { + const effect = { ...newEffect, reduceTime, removeEffect } + state.effects.push(effect) + } +} + +const removeEffect = (image: string) => { + for (const [index, effect] of (state.effects).entries()) { + if (effect.image === image) { + state.effects.splice(index, 1) + } + } +} + +const reduceTime = (image: string) => { + for (const [index, effect] of (state.effects).entries()) { + if (effect.image === image) { + effect.time -= 1 + } + } +} + +const getEffectIndex = (newEffect: EffectType) => { + for (const [index, effect] of (state.effects).entries()) { + if (effect.image === newEffect.image) { + return index + } + } + return null +} + +export default () => { + const stateIndicators = useSnapshot(state.indicators) + const { hasErrors } = useSnapshot(miscUiState) + const { isReadonly, openReadOperations, openWriteOperations } = useSnapshot(fsState) + const allIndicators: typeof defaultIndicatorsState = { + readonlyFiles: isReadonly, + writingFiles: openWriteOperations > 0, + readingFiles: openReadOperations > 0, + appHasErrors: hasErrors, + ...stateIndicators, + } + + useEffect(() => { + let alreadyWaiting = false + const listener = () => { + if (alreadyWaiting) return + state.indicators.chunksLoading = true + alreadyWaiting = true + void viewer.waitForChunksToRender().then(() => { + state.indicators.chunksLoading = false + alreadyWaiting = false + }) + } + viewer.world.renderUpdateEmitter.on('dirty', listener) + + return () => { + viewer.world.renderUpdateEmitter.off('dirty', listener) + } + }, []) + + const effects = useSnapshot(state.effects) + + useMemo(() => { + const effectsImages = Object.fromEntries(loadedData.effectsArray.map((effect) => { + const nameKebab = effect.name.replaceAll(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`).slice(1) + return [effect.id, images[nameKebab]] + })) + bot.on('entityEffect', (entity, effect) => { + if (entity.id !== bot.entity.id) return + const image = effectsImages[effect.id] ?? null + if (!image) { + inGameError(`received unknown effect id ${effect.id}}`) + return + } + const newEffect = { + image, + time: effect.duration / 20, // duration received in ticks + level: effect.amplifier, + } + addEffect(newEffect) + }) + bot.on('entityEffectEnd', (entity, effect) => { + if (entity.id !== bot.entity.id) return + const image = effectsImages[effect.id] ?? null + if (!image) { + inGameError(`received unknown effect id ${effect.id}}}`) + return + } + removeEffect(image) + }) + }, []) + + return +} diff --git a/src/react/effectsImages.ts b/src/react/effectsImages.ts new file mode 100644 index 00000000..21421e0f --- /dev/null +++ b/src/react/effectsImages.ts @@ -0,0 +1,76 @@ +import absorption from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/absorption.png' +import glowing from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/glowing.png' +import instant_health from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/instant_health.png' +import nausea from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/nausea.png' +import slow_falling from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/slow_falling.png' +import weakness from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/weakness.png' +import bad_omen from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/bad_omen.png' +import haste from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/haste.png' +import invisibility from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/invisibility.png' +import night_vision from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/night_vision.png' +import slowness from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/slowness.png' +import wither from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/wither.png' +import blindness from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/blindness.png' +import health_boost from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/health_boost.png' +import jump_boost from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/jump_boost.png' +import poison from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/poison.png' +import speed from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/speed.png' +import conduit_power from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/conduit_power.png' +import hero_of_the_village from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/hero_of_the_village.png' +import levitation from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/levitation.png' +import regeneration from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/regeneration.png' +import strength from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/strength.png' +import dolphins_grace from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/dolphins_grace.png' +import hunger from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/hunger.png' +import luck from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/luck.png' +import resistance from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/resistance.png' +import unluck from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/unluck.png' +import fire_resistance from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/fire_resistance.png' +import instant_damage from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/instant_damage.png' +import mining_fatigue from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/mining_fatigue.png' +import saturation from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/saturation.png' +import water_breathing from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/water_breathing.png' +import darkness from 'minecraft-assets/minecraft-assets/data/1.20.2/mob_effect/darkness.png' + +interface Images { + [key: string]: string; +} + +// Export an object containing image URLs +export const images: Images = { + absorption, + glowing, + instant_health, + nausea, + slow_falling, + weakness, + bad_omen, + haste, + invisibility, + night_vision, + slowness, + wither, + blindness, + health_boost, + jump_boost, + poison, + speed, + conduit_power, + hero_of_the_village, + levitation, + regeneration, + strength, + dolphins_grace, + hunger, + luck, + resistance, + unluck, + bad_luck: unluck, + good_luck: luck, + fire_resistance, + instant_damage, + mining_fatigue, + saturation, + water_breathing, + darkness +} diff --git a/src/reactUi.tsx b/src/reactUi.tsx index aa1d74dd..d56cb805 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -16,6 +16,7 @@ import ChatProvider from './react/ChatProvider' import TitleProvider from './react/TitleProvider' import ScoreboardProvider from './react/ScoreboardProvider' import SignEditorProvider from './react/SignEditorProvider' +import IndicatorEffectsProvider from './react/IndicatorEffectsProvider' import SoundMuffler from './react/SoundMuffler' import TouchControls from './react/TouchControls' import widgets from './react/widgets' @@ -65,6 +66,7 @@ const InGameUi = () => { + diff --git a/src/utils.ts b/src/utils.ts index 61ceeeb8..39bf940e 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -20,6 +20,12 @@ export const toNumber = (val) => { return isNaN(num) ? undefined : num } +export const inGameError = (err) => { + console.error(err) + // todo report + miscUiState.hasErrors = true +} + export const pointerLock = { get hasPointerLock () { return document.pointerLockElement From 1c45ded8055c73e64c09c4f1cad0f7551973a451 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 28 Mar 2024 01:41:48 +0300 Subject: [PATCH 0099/1195] fix page loadeding indicator showing sometimes --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 162f19a2..3a8fbd5c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -919,7 +919,7 @@ downloadAndOpenFile().then((downloadAction) => { const initialLoader = document.querySelector('.initial-loader') as HTMLElement | null if (initialLoader) { initialLoader.style.opacity = '0' - window.pageLoaded = true } +window.pageLoaded = true void possiblyHandleStateVariable() From f2803b9b3ac399dc84802e6041732e59bd52fe84 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 6 Apr 2024 15:22:50 +0300 Subject: [PATCH 0100/1195] remove alias set --- .github/workflows/preview.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 2a5f5665..02598446 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -42,10 +42,6 @@ jobs: with: run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} id: deploy - - name: Set deployment alias - # only if on branch next - if: github.ref == 'refs/heads/next' - run: vercel alias set ${{ steps.deploy.outputs.stdout }} ${{ secrets.TEST_PREVIEW_DOMAIN }} --token=${{ secrets.VERCEL_TOKEN }} - uses: mshick/add-pr-comment@v2 with: message: | From b89aab72d0a92d8129024f5d3c8168b59befa633 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Tue, 9 Apr 2024 03:28:55 +0300 Subject: [PATCH 0101/1195] ci: text aliases --- .github/workflows/next-deploy.yml | 8 +++++++- scripts/githubActions.mjs | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 scripts/githubActions.mjs diff --git a/.github/workflows/next-deploy.yml b/.github/workflows/next-deploy.yml index 93c46aeb..d7d4d322 100644 --- a/.github/workflows/next-deploy.yml +++ b/.github/workflows/next-deploy.yml @@ -2,6 +2,7 @@ name: Vercel Deploy Next env: VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} + ALIASES: ${{ vars.ALIASES }} on: push: branches: @@ -30,8 +31,13 @@ jobs: with: run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} id: deploy + - name: Get deployment alias + run: node scripts/githubActions.mjs getAlias + - run: echo $OUTPUT + env: + OUTPUT: ${{ steps.repos.outputs.alias }} - name: Set deployment alias - run: vercel alias set ${{ steps.deploy.outputs.stdout }} ${{ secrets.TEST_PREVIEW_DOMAIN }} --token=${{ secrets.VERCEL_TOKEN }} + run: vercel alias set ${{ steps.deploy.outputs.stdout }} ${{ secrets.TEST_PREVIEW_DOMAIN }} --token=${{ secrets.VERCEL_TOKEN }} --scope=zaro # - uses: mshick/add-pr-comment@v2 # with: # message: | diff --git a/scripts/githubActions.mjs b/scripts/githubActions.mjs new file mode 100644 index 00000000..f392da55 --- /dev/null +++ b/scripts/githubActions.mjs @@ -0,0 +1,23 @@ +const fns = { + async getAlias () { + const aliasesRaw = process.env.ALIASES + if (!aliasesRaw) throw new Error('No aliases found') + const aliases = aliasesRaw.split('\n').map((x) => x.search('=')) + const githubActionsPull = process.env.GITHUB_REF.match(/refs\/pull\/(\d+)\/merge/) + if (!githubActionsPull) throw new Error(`Not a pull request, got ${process.env.GITHUB_REF}`) + const prNumber = githubActionsPull[1] + const alias = aliases.find((x) => x[0] === prNumber) + if (alias) { + console.log('Found alias', alias[1]) + // set github output + console.log(`::set-output name=alias::${alias[1]}`) + } + } +} + +const fn = fns[process.argv[2]] +if (fn) { + fn() +} else { + console.error('Function not found') +} From ac3448c74502e6e23c357c1614bc81dab3beb354 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Tue, 9 Apr 2024 03:47:03 +0300 Subject: [PATCH 0102/1195] ci: set custom mcraft aliases for PRs! (#99) --- .github/workflows/next-deploy.yml | 5 ----- .github/workflows/preview.yml | 7 +++++++ scripts/githubActions.mjs | 15 ++++++++++++--- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/.github/workflows/next-deploy.yml b/.github/workflows/next-deploy.yml index d7d4d322..7ee33ac0 100644 --- a/.github/workflows/next-deploy.yml +++ b/.github/workflows/next-deploy.yml @@ -31,11 +31,6 @@ jobs: with: run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} id: deploy - - name: Get deployment alias - run: node scripts/githubActions.mjs getAlias - - run: echo $OUTPUT - env: - OUTPUT: ${{ steps.repos.outputs.alias }} - name: Set deployment alias run: vercel alias set ${{ steps.deploy.outputs.stdout }} ${{ secrets.TEST_PREVIEW_DOMAIN }} --token=${{ secrets.VERCEL_TOKEN }} --scope=zaro # - uses: mshick/add-pr-comment@v2 diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 02598446..44c55480 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -2,6 +2,7 @@ name: Vercel Deploy Preview env: VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} + ALIASES: ${{ vars.ALIASES }} on: issue_comment: types: [created] @@ -48,3 +49,9 @@ jobs: Deployed to Vercel Preview: ${{ steps.deploy.outputs.stdout }} [Playground](${{ steps.deploy.outputs.stdout }}/playground.html) [Storybook](${{ steps.deploy.outputs.stdout }}/storybook/) + - name: Get deployment alias + run: node scripts/githubActions.mjs getAlias + id: alias + - name: Set deployment alias + if: ${{ steps.alias.outputs.alias != '' }} + run: vercel alias set ${{ steps.deploy.outputs.stdout }} ${{ steps.alias.outputs.alias }} --token=${{ secrets.VERCEL_TOKEN }} --scope=zaro diff --git a/scripts/githubActions.mjs b/scripts/githubActions.mjs index f392da55..ac218f56 100644 --- a/scripts/githubActions.mjs +++ b/scripts/githubActions.mjs @@ -1,20 +1,29 @@ +//@ts-check +import fs from 'fs' +import os from 'os' + const fns = { async getAlias () { const aliasesRaw = process.env.ALIASES if (!aliasesRaw) throw new Error('No aliases found') - const aliases = aliasesRaw.split('\n').map((x) => x.search('=')) + const aliases = aliasesRaw.split('\n').map((x) => x.split('=')) const githubActionsPull = process.env.GITHUB_REF.match(/refs\/pull\/(\d+)\/merge/) if (!githubActionsPull) throw new Error(`Not a pull request, got ${process.env.GITHUB_REF}`) const prNumber = githubActionsPull[1] const alias = aliases.find((x) => x[0] === prNumber) if (alias) { - console.log('Found alias', alias[1]) // set github output - console.log(`::set-output name=alias::${alias[1]}`) + setOutput('alias', alias[1]) } } } +function setOutput(key, value) { + // Temporary hack until core actions library catches up with github new recommendations + const output = process.env['GITHUB_OUTPUT'] + fs.appendFileSync(output, `${key}=${value}${os.EOL}`) +} + const fn = fns[process.argv[2]] if (fn) { fn() From 0b15ac9ba099c5e1183003efdbb5576e06d531bb Mon Sep 17 00:00:00 2001 From: Vitaly Date: Tue, 9 Apr 2024 15:59:35 +0300 Subject: [PATCH 0103/1195] ci: improve aliases set --- .github/workflows/preview.yml | 6 +++++- scripts/githubActions.mjs | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 44c55480..cdefd2e2 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -49,9 +49,13 @@ jobs: Deployed to Vercel Preview: ${{ steps.deploy.outputs.stdout }} [Playground](${{ steps.deploy.outputs.stdout }}/playground.html) [Storybook](${{ steps.deploy.outputs.stdout }}/storybook/) + - run: git checkout next scripts/githubActions.mjs - name: Get deployment alias run: node scripts/githubActions.mjs getAlias id: alias + env: + ALIASES: ${{ env.ALIASES }} + PULL_URL: ${{ github.event.comment.issue.pull_request.url }} - name: Set deployment alias - if: ${{ steps.alias.outputs.alias != '' }} + if: ${{ steps.alias.outputs.alias != '' && steps.alias.outputs.alias != 'mcraft.fun' && steps.alias.outputs.alias != 's.mcraft.fun' }} run: vercel alias set ${{ steps.deploy.outputs.stdout }} ${{ steps.alias.outputs.alias }} --token=${{ secrets.VERCEL_TOKEN }} --scope=zaro diff --git a/scripts/githubActions.mjs b/scripts/githubActions.mjs index ac218f56..ba7b8566 100644 --- a/scripts/githubActions.mjs +++ b/scripts/githubActions.mjs @@ -7,7 +7,7 @@ const fns = { const aliasesRaw = process.env.ALIASES if (!aliasesRaw) throw new Error('No aliases found') const aliases = aliasesRaw.split('\n').map((x) => x.split('=')) - const githubActionsPull = process.env.GITHUB_REF.match(/refs\/pull\/(\d+)\/merge/) + const githubActionsPull = process.env.PULL_URL?.split('/').at(-1) if (!githubActionsPull) throw new Error(`Not a pull request, got ${process.env.GITHUB_REF}`) const prNumber = githubActionsPull[1] const alias = aliases.find((x) => x[0] === prNumber) From 2a396d118792ca7000f734928dcd9b19ca052f24 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 9 Apr 2024 16:40:32 +0300 Subject: [PATCH 0104/1195] ci: disable next checkout as its not available in some repoes --- .github/workflows/preview.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index cdefd2e2..52f8bc29 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -49,7 +49,7 @@ jobs: Deployed to Vercel Preview: ${{ steps.deploy.outputs.stdout }} [Playground](${{ steps.deploy.outputs.stdout }}/playground.html) [Storybook](${{ steps.deploy.outputs.stdout }}/storybook/) - - run: git checkout next scripts/githubActions.mjs + # - run: git checkout next scripts/githubActions.mjs - name: Get deployment alias run: node scripts/githubActions.mjs getAlias id: alias From bf655b075b686285c1163d9d511f457c101d58a8 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 11 Apr 2024 05:14:16 +0300 Subject: [PATCH 0105/1195] ci: try sticky messages --- .github/workflows/preview.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 52f8bc29..f0cdc190 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -45,6 +45,7 @@ jobs: id: deploy - uses: mshick/add-pr-comment@v2 with: + refresh-message-position: true message: | Deployed to Vercel Preview: ${{ steps.deploy.outputs.stdout }} [Playground](${{ steps.deploy.outputs.stdout }}/playground.html) From be87a57192cae816b695ab6d2f8611ca2e0b022c Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 11 Apr 2024 05:18:14 +0300 Subject: [PATCH 0106/1195] fix indicator not disappearing sometimes --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index 3a8fbd5c..99f433e6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -919,6 +919,7 @@ downloadAndOpenFile().then((downloadAction) => { const initialLoader = document.querySelector('.initial-loader') as HTMLElement | null if (initialLoader) { initialLoader.style.opacity = '0' + initialLoader.style.pointerEvents = 'none' } window.pageLoaded = true From df0bf14f14ddc3f99dc0a8f37c9c1d6547be867c Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 11 Apr 2024 05:19:32 +0300 Subject: [PATCH 0107/1195] ci: post deploy message on each deploy --- .github/workflows/preview.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index f0cdc190..6ce2b927 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -45,7 +45,7 @@ jobs: id: deploy - uses: mshick/add-pr-comment@v2 with: - refresh-message-position: true + allow-repeats: true message: | Deployed to Vercel Preview: ${{ steps.deploy.outputs.stdout }} [Playground](${{ steps.deploy.outputs.stdout }}/playground.html) From 4d74730742b9a6dc08f2433faa1ec98f2e7cfa71 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Thu, 11 Apr 2024 05:36:54 +0300 Subject: [PATCH 0108/1195] ci: fix pull url in the preview script --- .github/workflows/preview.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 6ce2b927..03990d04 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -56,7 +56,7 @@ jobs: id: alias env: ALIASES: ${{ env.ALIASES }} - PULL_URL: ${{ github.event.comment.issue.pull_request.url }} + PULL_URL: ${{ github.event.issue.pull_request.url }} - name: Set deployment alias if: ${{ steps.alias.outputs.alias != '' && steps.alias.outputs.alias != 'mcraft.fun' && steps.alias.outputs.alias != 's.mcraft.fun' }} run: vercel alias set ${{ steps.deploy.outputs.stdout }} ${{ steps.alias.outputs.alias }} --token=${{ secrets.VERCEL_TOKEN }} --scope=zaro From da44ad40fc322bf4f85610c31f7fbae729488b0a Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sun, 14 Apr 2024 23:22:23 +0300 Subject: [PATCH 0109/1195] feat: allow to setup temporary options & commands overrides in QS that wont be saved --- src/index.ts | 10 +++++++++- src/optionsStorage.ts | 13 +++++++++++-- src/react/OptionsItems.tsx | 11 ++++++++--- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/index.ts b/src/index.ts index 99f433e6..bbbb060d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -315,7 +315,7 @@ const cleanConnectIp = (host: string | undefined, defaultPort: string | undefine } async function connect (connectOptions: { - server?: string; singleplayer?: any; username: string; password?: any; proxy?: any; botVersion?: any; serverOverrides?; serverOverridesFlat?; peerId?: string + server?: string; singleplayer?: any; username: string; password?: any; proxy?: any; botVersion?: any; serverOverrides?; serverOverridesFlat?; peerId?: string; ignoreQs?: boolean }) { if (miscUiState.gameLoaded) return miscUiState.hasErrors = false @@ -826,6 +826,14 @@ async function connect (connectOptions: { document.dispatchEvent(new Event('cypress-world-ready')) }) }) + + if (!connectOptions.ignoreQs) { + const qs = new URLSearchParams(window.location.search) + for (let command of qs.getAll('command')) { + if (!command.startsWith('/')) command = `/${command}` + bot.chat(command) + } + } } listenGlobalEvents() diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts index 8490053c..9e13bf47 100644 --- a/src/optionsStorage.ts +++ b/src/optionsStorage.ts @@ -3,6 +3,7 @@ import { proxy, subscribe } from 'valtio/vanilla' // weird webpack configuration bug: it cant import valtio/utils in this file import { subscribeKey } from 'valtio/utils' +import { omitObj } from '@zardoy/utils' const defaultOptions = { renderDistance: 2, @@ -80,6 +81,12 @@ const defaultOptions = { wysiwygSignEditor: 'auto' as 'auto' | 'always' | 'never', } +const qsOptionsRaw = new URLSearchParams(location.search).getAll('setting') +export const qsOptions = Object.fromEntries(qsOptionsRaw.map(o => { + const [key, value] = o.split(':') + return [key, JSON.parse(value)] +})) + const migrateOptions = (options: Partial>) => { if (options.highPerformanceGpu) { options.gpuPreference = 'high-performance' @@ -96,7 +103,8 @@ export type AppOptions = typeof defaultOptions export const options: AppOptions = proxy({ ...defaultOptions, - ...migrateOptions(JSON.parse(localStorage.options || '{}')) + ...migrateOptions(JSON.parse(localStorage.options || '{}')), + ...qsOptions }) window.options = window.settings = options @@ -112,7 +120,8 @@ Object.defineProperty(window, 'debugChangedOptions', { }) subscribe(options, () => { - localStorage.options = JSON.stringify(options) + const saveOptions = omitObj(options, ...Object.keys(qsOptions) as [any]) + localStorage.options = JSON.stringify(saveOptions) }) type WatchValue = >(proxy: T, callback: (p: T) => void) => void diff --git a/src/react/OptionsItems.tsx b/src/react/OptionsItems.tsx index 5c0941e6..74e82051 100644 --- a/src/react/OptionsItems.tsx +++ b/src/react/OptionsItems.tsx @@ -2,7 +2,7 @@ import { useSnapshot } from 'valtio' import { noCase } from 'change-case' import { titleCase } from 'title-case' import { useMemo } from 'react' -import { options } from '../optionsStorage' +import { options, qsOptions } from '../optionsStorage' import Button from './Button' import Slider from './Slider' import Screen from './Screen' @@ -30,6 +30,11 @@ export type OptionMeta = GeneralItem & ({ render: () => React.ReactNode, }) +// todo not reactive +const isDisabled = (id) => { + return qsOptions.includes(id) +} + export const OptionButton = ({ item }: { item: Extract }) => { const optionValue = useSnapshot(options)[item.id!] @@ -74,7 +79,7 @@ export const OptionButton = ({ item }: { item: Extract { + return { options[item.id!] = value }} unit={item.unit} valueDisplay={valueDisplay} updateOnDragEnd={item.delayApply} /> } From 889e652455c3f5b576d78910abb7298c1133bac9 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Mon, 15 Apr 2024 02:04:33 +0300 Subject: [PATCH 0110/1195] fix: Make hideable vercel live feedback --- src/index.ts | 4 +++- src/react/OptionsItems.tsx | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index bbbb060d..7fd99b14 100644 --- a/src/index.ts +++ b/src/index.ts @@ -871,7 +871,9 @@ document.body.addEventListener('touchend', (e) => { activeTouch = undefined }) document.body.addEventListener('touchstart', (e) => { - if (!isGameActive(true)) return + const ignoreElem = (e.target as HTMLElement).matches('vercel-live-feedback') + if (!isGameActive(true) || ignoreElem) return + // we always prevent default behavior to disable magnifier on ios, but by doing so we also disable click events e.preventDefault() let firstClickable // todo remove composedPath and this workaround when lit-element is fully dropped const path = e.composedPath() as Array<{ click?: () => void }> diff --git a/src/react/OptionsItems.tsx b/src/react/OptionsItems.tsx index 74e82051..9351d66b 100644 --- a/src/react/OptionsItems.tsx +++ b/src/react/OptionsItems.tsx @@ -32,7 +32,7 @@ export type OptionMeta = GeneralItem & ({ // todo not reactive const isDisabled = (id) => { - return qsOptions.includes(id) + return Object.keys(qsOptions).includes(id) } export const OptionButton = ({ item }: { item: Extract }) => { From aafdb6469435ce3869fd4a21b2a6436ebc69abd2 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Mon, 15 Apr 2024 05:44:25 +0300 Subject: [PATCH 0111/1195] outdated commit hints in ci!! (#101) --- .github/workflows/ci.yml | 9 +++- package.json | 3 ++ prismarine-viewer/package.json | 2 +- .../viewer/prepare/generateTextures.ts | 6 +-- .../viewer/prepare/postinstall.ts | 12 +++++ scripts/outdatedGitPackages.mjs | 52 +++++++++++++++++++ scripts/updateGitPackages.mjs | 26 ---------- 7 files changed, 77 insertions(+), 33 deletions(-) create mode 100644 prismarine-viewer/viewer/prepare/postinstall.ts create mode 100644 scripts/outdatedGitPackages.mjs delete mode 100644 scripts/updateGitPackages.mjs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fe7c8ba6..3bc45b5e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,10 @@ jobs: uses: actions/checkout@master - name: Install pnpm run: npm i -g pnpm - # todo this needs investigating fixing + - uses: actions/setup-node@v4 + with: + node-version: 18 + # cache: "pnpm" - run: pnpm install - run: pnpm lint - run: pnpm check-build @@ -24,3 +27,7 @@ jobs: with: name: cypress-images path: cypress/integration/__image_snapshots__/ + - run: node scripts/outdatedGitPackages.mjs + # if: github.ref == 'refs/heads/next' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/package.json b/package.json index 881be9cc..d6ea6655 100644 --- a/package.json +++ b/package.json @@ -144,6 +144,9 @@ "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", "minecraft-protocol": "github:zardoy/minecraft-protocol#everything", "react": "^18.2.0" + }, + "updateConfig": { + "ignoreDependencies": [] } } } diff --git a/prismarine-viewer/package.json b/prismarine-viewer/package.json index 529aa9ae..7d7b6b81 100644 --- a/prismarine-viewer/package.json +++ b/prismarine-viewer/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "postinstall": "pnpm generate-textures && node buildWorker.mjs", - "generate-textures": "tsx viewer/prepare/generateTextures.ts" + "generate-textures": "tsx viewer/prepare/postinstall.ts" }, "author": "PrismarineJS", "license": "MIT", diff --git a/prismarine-viewer/viewer/prepare/generateTextures.ts b/prismarine-viewer/viewer/prepare/generateTextures.ts index b9a5e3e5..2a196ccb 100644 --- a/prismarine-viewer/viewer/prepare/generateTextures.ts +++ b/prismarine-viewer/viewer/prepare/generateTextures.ts @@ -1,6 +1,6 @@ import path from 'path' import { makeBlockTextureAtlas } from './atlas' -import { McAssets, prepareBlocksStates } from './modelsBuilder' +import { prepareBlocksStates } from './modelsBuilder' import mcAssets from 'minecraft-assets' import fs from 'fs-extra' import { prepareMoreGeneratedBlocks } from './moreGeneratedBlocks' @@ -9,10 +9,6 @@ import { generateItemsAtlases } from './genItemsAtlas' const publicPath = path.resolve(__dirname, '../../public') const texturesPath = path.join(publicPath, 'textures') -if (fs.existsSync(texturesPath) && !process.argv.includes('-f')) { - console.log('textures folder already exists, skipping...') - process.exit(0) -} fs.mkdirSync(texturesPath, { recursive: true }) const blockStatesPath = path.join(publicPath, 'blocksStates') diff --git a/prismarine-viewer/viewer/prepare/postinstall.ts b/prismarine-viewer/viewer/prepare/postinstall.ts new file mode 100644 index 00000000..bf70d26c --- /dev/null +++ b/prismarine-viewer/viewer/prepare/postinstall.ts @@ -0,0 +1,12 @@ +import path from 'path' +import fs from 'fs' + +const publicPath = path.resolve(__dirname, '../../public') +const texturesPath = path.join(publicPath, 'textures') + +if (fs.existsSync(texturesPath) && !process.argv.includes('-f')) { + console.log('textures folder already exists, skipping...') + process.exit(0) +} else { + import('./generateTextures') +} diff --git a/scripts/outdatedGitPackages.mjs b/scripts/outdatedGitPackages.mjs new file mode 100644 index 00000000..c6a3b2d5 --- /dev/null +++ b/scripts/outdatedGitPackages.mjs @@ -0,0 +1,52 @@ +// pnpm bug workaround +import fs from 'fs' +import { parse } from 'yaml' +import _ from 'lodash' + +const lockfile = parse(fs.readFileSync('./pnpm-lock.yaml', 'utf8')) +const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8')) +const depsKeys = ['dependencies', 'devDependencies'] + +const githubToken = process.env.GITHUB_TOKEN +const ignoreDeps = packageJson.pnpm?.updateConfig?.ignoreDependencies ?? [] + +const outdatedDeps = [] + +const allDepsObj = {} + +for (const [key, val] of Object.entries(lockfile.importers)) { + // Object.assign(allDepsObj, val) + _.merge(allDepsObj, val) +} + +for (const [depsKey, deps] of Object.entries(allDepsObj)) { + for (const [depName, { specifier, version }] of Object.entries(deps)) { + if (ignoreDeps.includes(depName)) continue + if (!specifier.startsWith('github:')) continue + // console.log('checking github:', depName, version, specifier) + + let possiblyBranch = specifier.match(/#(.*)$/)?.[1] ?? '' + if (possiblyBranch) possiblyBranch = `/${possiblyBranch}` + const sha = version.split('/').slice(3).join('/').replace(/\(.+/, '') + const repo = version.split('/').slice(1, 3).join('/') + + const lastCommitJson = await fetch(`https://api.github.com/repos/${repo}/commits${possiblyBranch}?per_page=1`, { + headers: { + Authorization: githubToken ? `token ${githubToken}` : undefined, + }, + }).then(res => res.json()) + + const lastCommitActual = lastCommitJson ?? lastCommitJson[0] + const lastCommitActualSha = Array.isArray(lastCommitActual) ? lastCommitActual[0]?.sha : lastCommitActual?.sha + if (lastCommitActualSha === undefined) debugger + if (sha !== lastCommitActualSha) { + // console.log(`Outdated ${depName} github.com/${repo} : ${sha} -> ${lastCommitActualSha} (${lastCommitActual.commit.message})`) + outdatedDeps.push({ depName, repo, sha, lastCommitActualSha }) + } + } + +} + +if (outdatedDeps.length) { + throw new Error(`Outdated dependencies found: \n${outdatedDeps.map(({ depName, repo, sha, lastCommitActualSha }) => `${depName} github.com/${repo} : ${sha} -> ${lastCommitActualSha}`).join('\n')}`) +} diff --git a/scripts/updateGitPackages.mjs b/scripts/updateGitPackages.mjs deleted file mode 100644 index 14524587..00000000 --- a/scripts/updateGitPackages.mjs +++ /dev/null @@ -1,26 +0,0 @@ -// pnpm bug workaround -import fs from 'fs' -import { parse } from 'yaml' - -const lockfile = parse(fs.readFileSync('./pnpm-lock.yaml', 'utf8')) - -const depsKeys = ['dependencies', 'devDependencies'] - -for (const importer of Object.values(lockfile.importers)) { - for (const depsKey of depsKeys) { - for (const [depName, { specifier, version }] of Object.entries(importer[depsKey])) { - if (!specifier.startsWith('github:')) continue - let branch = specifier.match(/#(.*)$/)?.[1] ?? '' - if (branch) branch = `/${branch}` - const sha = version.split('/').slice(3).join('/').replace(/\(.+/, '') - const repo = version.split('/').slice(1, 3).join('/') - const lastCommitJson = await fetch(`https://api.github.com/repos/${repo}/commits${branch}?per_page=1`).then(res => res.json()) - const lastCommitActual = lastCommitJson ?? lastCommitJson[0] - const lastCommitActualSha = lastCommitActual?.sha - if (lastCommitActualSha === undefined) debugger - if (sha !== lastCommitActualSha) { - console.log(`Outdated ${depName} github.com/${repo} : ${sha} -> ${lastCommitActualSha} (${lastCommitActual.commit.message})`) - } - } - } -} From 954169d1b9d1f96e36cce33914a442a10236b8b0 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Mon, 15 Apr 2024 05:45:14 +0300 Subject: [PATCH 0112/1195] enable outdated deps check only on next --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3bc45b5e..cbd12318 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,6 +28,6 @@ jobs: name: cypress-images path: cypress/integration/__image_snapshots__/ - run: node scripts/outdatedGitPackages.mjs - # if: github.ref == 'refs/heads/next' + if: github.ref == 'refs/heads/next' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 10662bcbc06221aabc4b86aa33e7dcd28d40c002 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Tue, 16 Apr 2024 05:24:47 +0300 Subject: [PATCH 0113/1195] feat: Add auto jump (disabled by default for PC & Gamepad users) (#100) --- package.json | 2 + pnpm-lock.yaml | 546 ++++++++++++++++++++++++++++----------- src/entities.ts | 31 +++ src/optionsGuiScheme.tsx | 7 + src/optionsStorage.ts | 1 + 5 files changed, 442 insertions(+), 145 deletions(-) diff --git a/package.json b/package.json index d6ea6655..b91bb11e 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "@dimaka/interface": "0.0.3-alpha.0", "@floating-ui/react": "^0.26.1", "@mui/base": "5.0.0-beta.34", + "@nxg-org/mineflayer-auto-jump": "^0.7.5", "@nxg-org/mineflayer-tracker": "^1.2.1", "@react-oauth/google": "^0.12.1", "@types/gapi": "^0.0.47", @@ -136,6 +137,7 @@ }, "pnpm": { "overrides": { + "@nxg-org/mineflayer-physics-util": "1.5.8", "three": "0.154.0", "diamond-square": "github:zardoy/diamond-square", "prismarine-block": "github:zardoy/prismarine-block#next-era", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 483f0277..4c43c6ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: + '@nxg-org/mineflayer-physics-util': 1.5.8 three: 0.154.0 diamond-square: github:zardoy/diamond-square prismarine-block: github:zardoy/prismarine-block#next-era @@ -27,6 +28,9 @@ importers: '@mui/base': specifier: 5.0.0-beta.34 version: 5.0.0-beta.34(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@nxg-org/mineflayer-auto-jump': + specifier: ^0.7.5 + version: 0.7.5 '@nxg-org/mineflayer-tracker': specifier: ^1.2.1 version: 1.2.1 @@ -186,7 +190,7 @@ importers: optionalDependencies: systeminformation: specifier: ^5.21.22 - version: 5.21.24 + version: 5.22.7 devDependencies: '@storybook/addon-essentials': specifier: ^7.4.6 @@ -202,13 +206,13 @@ importers: version: 7.4.6(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@storybook/react-vite': specifier: ^7.4.6 - version: 7.4.6(react-dom@18.2.0)(react@18.2.0)(rollup@2.79.1)(typescript@5.2.2)(vite@4.5.2) + version: 7.4.6(react-dom@18.2.0)(react@18.2.0)(rollup@2.79.1)(typescript@5.2.2)(vite@4.5.3) '@storybook/web-components': specifier: ^7.4.6 version: 7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0) '@storybook/web-components-vite': specifier: ^7.4.6 - version: 7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(vite@4.5.2) + version: 7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(vite@4.5.3) '@types/lodash-es': specifier: ^4.17.9 version: 4.17.9 @@ -256,7 +260,7 @@ importers: version: 8.50.0 eslint-config-zardoy: specifier: ^0.2.17 - version: 0.2.17(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.33.2)(eslint@8.50.0)(typescript@5.2.2) + version: 0.2.17(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.34.1)(eslint@8.50.0)(typescript@5.2.2) events: specifier: ^3.3.0 version: 3.3.0 @@ -436,15 +440,15 @@ packages: default-browser-id: 3.0.0 dev: true - /@azure/msal-common@14.7.0: - resolution: {integrity: sha512-WexujW5jKWib7xtIxR7fEVyd5xcA3FNwenELy2HO4YC/ivTFdsEcDhtpKQuRUHqXRwxoqBblyZzTAhBm4v6fHA==} + /@azure/msal-common@14.9.0: + resolution: {integrity: sha512-yzBPRlWPnTBeixxLNI3BBIgF5/bHpbhoRVuuDBnYjCyWRavaPUsKAHUDYLqpGkBLDciA6TCc6GOxN4/S3WiSxg==} engines: {node: '>=0.8.0'} - /@azure/msal-node@2.6.3: - resolution: {integrity: sha512-ojjJqUwb297T5Tcln4PbJANFEqRXfbQXcyOrtdr1HQYIo+dSuCT/o0nG6bFVihf6fcNykDwJLCQPVXzTkx/oGg==} + /@azure/msal-node@2.7.0: + resolution: {integrity: sha512-wXD8LkUvHICeSWZydqg6o8Yvv+grlBEcmLGu+QEI4FcwFendbTEZrlSygnAXXSOCVaGAirWLchca35qrgpO6Jw==} engines: {node: '>=16'} dependencies: - '@azure/msal-common': 14.7.0 + '@azure/msal-common': 14.9.0 jsonwebtoken: 9.0.2 uuid: 8.3.2 @@ -3138,7 +3142,7 @@ packages: regenerator-runtime: 0.13.11 dev: false - /@joshwooding/vite-plugin-react-docgen-typescript@0.2.1(typescript@5.2.2)(vite@4.5.2): + /@joshwooding/vite-plugin-react-docgen-typescript@0.2.1(typescript@5.2.2)(vite@4.5.3): resolution: {integrity: sha512-ou4ZJSXMMWHqGS4g8uNRbC5TiTWxAgQZiVucoUrOCWuPrTbkpJbmVyIi9jU72SBry7gQtuMEDp4YR8EEXAg7VQ==} peerDependencies: typescript: '>= 4.3.x' @@ -3152,7 +3156,7 @@ packages: magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.2.2) typescript: 5.2.2 - vite: 4.5.2 + vite: 4.5.3 dev: true /@jridgewell/gen-mapping@0.3.3: @@ -3337,6 +3341,19 @@ packages: dev: false optional: true + /@nxg-org/mineflayer-auto-jump@0.7.5: + resolution: {integrity: sha512-wvPLPW06nxz9/WimNdReF41I6mSQcxAcJFFBmN9geaSdnPkr8GVxq6daJSDwXXktNsh8/NBusJhMkJGh6eNnZg==} + dependencies: + '@nxg-org/mineflayer-physics-util': 1.5.8 + strict-event-emitter-types: 2.0.0 + dev: false + + /@nxg-org/mineflayer-physics-util@1.5.8: + resolution: {integrity: sha512-KmCkAqpUo8BbuRdIBs6+V2hWHehz++PRz3lRwIsb47CuG0u4sgLYh37RY3ifAznC6uWvmPK+q3B4ZXwJzPy1MQ==} + dependencies: + '@nxg-org/mineflayer-util-plugin': 1.8.3 + dev: false + /@nxg-org/mineflayer-tracker@1.2.1: resolution: {integrity: sha512-SI1ffF8zvg3/ZNE021Ja2W0FZPN+WbQDZf8yFqOcXtPRXAtM9W6HvoACdzXep8BZid7WYgYLIgjKpB+9RqvCNQ==} dependencies: @@ -4370,7 +4387,7 @@ packages: - supports-color dev: true - /@storybook/builder-vite@7.4.6(typescript@5.2.2)(vite@4.5.2): + /@storybook/builder-vite@7.4.6(typescript@5.2.2)(vite@4.5.3): resolution: {integrity: sha512-xV9STYK+TkqWWTf2ydm6jx+7P70fjD2UPd1XTUw08uKszIjhuuxk+bG/OF5R1E25mPunAKXm6kBFh351AKejBg==} peerDependencies: '@preact/preset-vite': '*' @@ -4405,7 +4422,7 @@ packages: remark-slug: 6.1.0 rollup: 3.29.4 typescript: 5.2.2 - vite: 4.5.2 + vite: 4.5.3 transitivePeerDependencies: - encoding - supports-color @@ -4746,7 +4763,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/react-vite@7.4.6(react-dom@18.2.0)(react@18.2.0)(rollup@2.79.1)(typescript@5.2.2)(vite@4.5.2): + /@storybook/react-vite@7.4.6(react-dom@18.2.0)(react@18.2.0)(rollup@2.79.1)(typescript@5.2.2)(vite@4.5.3): resolution: {integrity: sha512-jkjnrf3FxzR5wcmebXRPflrsM4WIDjWyW/NVFJwxi5PeIOk7fE7/QAPrm4NFRUu2Q7DeuH3oLKsw8bigvUI9RA==} engines: {node: '>=16'} peerDependencies: @@ -4754,17 +4771,17 @@ packages: react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 vite: ^3.0.0 || ^4.0.0 dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.2.2)(vite@4.5.2) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.2.2)(vite@4.5.3) '@rollup/pluginutils': 5.0.5(rollup@2.79.1) - '@storybook/builder-vite': 7.4.6(typescript@5.2.2)(vite@4.5.2) + '@storybook/builder-vite': 7.4.6(typescript@5.2.2)(vite@4.5.3) '@storybook/react': 7.4.6(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@vitejs/plugin-react': 3.1.0(vite@4.5.2) + '@vitejs/plugin-react': 3.1.0(vite@4.5.3) ast-types: 0.14.2 magic-string: 0.30.4 react: 18.2.0 react-docgen: 6.0.0-alpha.3 react-dom: 18.2.0(react@18.2.0) - vite: 4.5.2 + vite: 4.5.3 transitivePeerDependencies: - '@preact/preset-vite' - encoding @@ -4866,14 +4883,14 @@ packages: file-system-cache: 2.3.0 dev: true - /@storybook/web-components-vite@7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(vite@4.5.2): + /@storybook/web-components-vite@7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(vite@4.5.3): resolution: {integrity: sha512-L/y6MTLbqfHaM0faK9Yl8n5PIyW4daZrtk7NfaOT6UjgNFjOx3o4CctYew6oj90cNk5HdZQX2OZny043GxDLZw==} engines: {node: ^14.18 || >=16} peerDependencies: react: ^18.2.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/builder-vite': 7.4.6(typescript@5.2.2)(vite@4.5.2) + '@storybook/builder-vite': 7.4.6(typescript@5.2.2)(vite@4.5.3) '@storybook/core-server': 7.4.6 '@storybook/node-logger': 7.4.6 '@storybook/web-components': 7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0) @@ -5184,6 +5201,13 @@ packages: /@types/node@20.11.19: resolution: {integrity: sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==} + requiresBuild: true + dependencies: + undici-types: 5.26.5 + optional: true + + /@types/node@20.12.7: + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} dependencies: undici-types: 5.26.5 @@ -5248,10 +5272,10 @@ packages: '@types/scheduler': 0.16.3 csstype: 3.1.2 - /@types/readable-stream@4.0.10: - resolution: {integrity: sha512-AbUKBjcC8SHmImNi4yK2bbjogQlkFSg7shZCcicxPQapniOlajG8GCc39lvXzCWX4lLRRs7DM3VAeSlqmEVZUA==} + /@types/readable-stream@4.0.11: + resolution: {integrity: sha512-R3eUMUTTKoIoaz7UpYLxvZCrOmCRPRbAmoDDHKcimTEySltaJhF8hLzj4+EzyDifiX5eK6oDQGSfmNnXjxZzYQ==} dependencies: - '@types/node': 20.11.19 + '@types/node': 20.12.7 safe-buffer: 5.1.2 /@types/resolve@1.17.1: @@ -5534,7 +5558,7 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@vitejs/plugin-react@3.1.0(vite@4.5.2): + /@vitejs/plugin-react@3.1.0(vite@4.5.3): resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -5545,7 +5569,7 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.11) magic-string: 0.27.0 react-refresh: 0.14.0 - vite: 4.5.2 + vite: 4.5.3 transitivePeerDependencies: - supports-color dev: true @@ -5718,7 +5742,7 @@ packages: prismarine-nbt: 2.5.0 prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0) prismarine-windows: 2.9.0 - prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 + prismarine-world: github.com/zardoy/prismarine-world/6ae6f009d38460de284f8c226c665f04cbad9465 random-seed: 0.3.0 range: 0.0.3 readline: 1.3.0 @@ -6014,11 +6038,35 @@ packages: is-string: 1.0.7 dev: true + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + dev: true + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + dev: true + /array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} @@ -6039,12 +6087,21 @@ packages: es-shim-unscopables: 1.0.0 dev: true + /array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + /array.prototype.tosorted@1.1.3: resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 dev: true @@ -6068,11 +6125,11 @@ packages: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.2 + is-shared-array-buffer: 1.0.3 dev: true /arraybuffer.slice@0.0.7: @@ -6157,12 +6214,6 @@ packages: /async@3.2.5: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - /asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - dependencies: - has-symbols: 1.0.3 - dev: true - /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -6174,9 +6225,11 @@ packages: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - /available-typed-arrays@1.0.6: - resolution: {integrity: sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==} + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 dev: true /aws-sign2@0.7.0: @@ -6188,7 +6241,7 @@ packages: /axios@0.21.4(debug@4.3.4): resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.5(debug@4.3.4) + follow-redirects: 1.15.6(debug@4.3.4) transitivePeerDependencies: - debug @@ -7305,6 +7358,33 @@ packages: dependencies: assert-plus: 1.0.0 + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + /dayjs@1.11.9: resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==} @@ -7945,17 +8025,21 @@ packages: unbox-primitive: 1.0.2 which-typed-array: 1.1.11 - /es-abstract@1.22.4: - resolution: {integrity: sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==} + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.6 + available-typed-arrays: 1.0.7 call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 es-define-property: 1.0.0 es-errors: 1.3.0 - es-set-tostringtag: 2.0.2 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 @@ -7963,15 +8047,16 @@ packages: globalthis: 1.0.3 gopd: 1.0.1 has-property-descriptors: 1.0.2 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.4 is-callable: 1.2.7 - is-negative-zero: 2.0.2 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 + is-shared-array-buffer: 1.0.3 is-string: 1.0.7 is-typed-array: 1.1.13 is-weakref: 1.0.2 @@ -7979,17 +8064,17 @@ packages: object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.0 + safe-array-concat: 1.1.2 safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.1 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 unbox-primitive: 1.0.2 - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 dev: true /es-define-property@1.0.0: @@ -8002,31 +8087,37 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - /es-iterator-helpers@1.0.17: - resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} + /es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} engines: {node: '>= 0.4'} dependencies: - asynciterator.prototype: 1.0.0 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 es-errors: 1.3.0 - es-set-tostringtag: 2.0.2 + es-set-tostringtag: 2.0.3 function-bind: 1.1.2 get-intrinsic: 1.2.4 globalthis: 1.0.3 has-property-descriptors: 1.0.2 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 internal-slot: 1.0.7 iterator.prototype: 1.1.2 - safe-array-concat: 1.1.0 + safe-array-concat: 1.1.2 dev: true /es-module-lexer@0.9.3: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} dev: true + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: true + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} @@ -8035,13 +8126,13 @@ packages: has: 1.0.3 has-tostringtag: 1.0.0 - /es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 - hasown: 2.0.1 + hasown: 2.0.2 dev: true /es-shim-unscopables@1.0.0: @@ -8053,7 +8144,7 @@ packages: /es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 dev: true /es-to-primitive@1.2.1: @@ -8228,7 +8319,7 @@ packages: eslint: 8.50.0 dev: true - /eslint-config-xo-react@0.27.0(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.33.2)(eslint@8.50.0): + /eslint-config-xo-react@0.27.0(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.34.1)(eslint@8.50.0): resolution: {integrity: sha512-wiV215xQIn71XZyyVfaOXHaFpR1B14IJttwOjMi/eqUK1s+ojJdHr7eHqTLaGUfh6FKgWha1QNwePlIXx7mBUg==} engines: {node: '>=12'} peerDependencies: @@ -8237,7 +8328,7 @@ packages: eslint-plugin-react-hooks: '>=4.3.0' dependencies: eslint: 8.50.0 - eslint-plugin-react: 7.33.2(eslint@8.50.0) + eslint-plugin-react: 7.34.1(eslint@8.50.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.50.0) dev: true @@ -8266,7 +8357,7 @@ packages: eslint: 8.50.0 dev: true - /eslint-config-zardoy@0.2.17(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.33.2)(eslint@8.50.0)(typescript@5.2.2): + /eslint-config-zardoy@0.2.17(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.34.1)(eslint@8.50.0)(typescript@5.2.2): resolution: {integrity: sha512-d31WsjyVSQqHbzTpBSmH96+nw5gwY2yhDbZatU89gr+U8ou1FRUkJSApYJUgmcINt8AQocj1RDDAVYmVSILZgQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: @@ -8286,7 +8377,7 @@ packages: eslint: 8.50.0 eslint-config-prettier: 8.10.0(eslint@8.50.0) eslint-config-xo: 0.43.1(eslint@8.50.0) - eslint-config-xo-react: 0.27.0(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.33.2)(eslint@8.50.0) + eslint-config-xo-react: 0.27.0(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.34.1)(eslint@8.50.0) eslint-config-xo-typescript: 1.0.1(@typescript-eslint/eslint-plugin@6.1.0)(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2) eslint-plugin-eslint-comments: 3.2.0(eslint@8.50.0) eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.7.3)(eslint@8.50.0) @@ -8420,29 +8511,31 @@ packages: eslint: 8.50.0 dev: true - /eslint-plugin-react@7.33.2(eslint@8.50.0): - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + /eslint-plugin-react@7.34.1(eslint@8.50.0): + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 + array.prototype.toreversed: 1.1.2 array.prototype.tosorted: 1.1.3 doctrine: 2.1.0 - es-iterator-helpers: 1.0.17 + es-iterator-helpers: 1.0.18 eslint: 8.50.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.10 + string.prototype.matchall: 4.0.11 dev: true /eslint-plugin-sonarjs@0.19.0(eslint@8.50.0): @@ -8973,8 +9066,8 @@ packages: debug: 4.3.4(supports-color@8.1.1) dev: true - /follow-redirects@1.15.5(debug@4.3.4): - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + /follow-redirects@1.15.6(debug@4.3.4): + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -9465,6 +9558,11 @@ packages: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: true + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} @@ -9514,6 +9612,13 @@ packages: dependencies: function-bind: 1.1.2 + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -9811,8 +9916,8 @@ packages: engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 - hasown: 2.0.1 - side-channel: 1.0.5 + hasown: 2.0.2 + side-channel: 1.0.6 dev: true /invariant@2.2.4: @@ -9913,7 +10018,14 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 + dev: true + + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 dev: true /is-date-object@1.0.5: @@ -9987,8 +10099,9 @@ packages: dev: false optional: true - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} dev: true /is-module@1.0.0: @@ -10006,6 +10119,11 @@ packages: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: true + /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} @@ -10065,8 +10183,9 @@ packages: engines: {node: '>=0.10.0'} dev: false - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} dev: true /is-shared-array-buffer@1.0.2: @@ -10074,6 +10193,13 @@ packages: dependencies: call-bind: 1.0.2 + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + dev: true + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -10100,7 +10226,7 @@ packages: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 dev: true /is-typedarray@1.0.0: @@ -10110,8 +10236,9 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} dev: true /is-weakref@1.0.2: @@ -10119,8 +10246,9 @@ packages: dependencies: call-bind: 1.0.2 - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + /is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 @@ -10201,8 +10329,8 @@ packages: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.5 - set-function-name: 2.0.1 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 dev: true /jackspeak@2.3.0: @@ -10290,8 +10418,8 @@ packages: regenerator-runtime: 0.13.11 dev: false - /jose@4.15.4: - resolution: {integrity: sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==} + /jose@4.15.5: + resolution: {integrity: sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==} /jpeg-js@0.3.7: resolution: {integrity: sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==} @@ -10466,10 +10594,10 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.flat: 1.3.2 object.assign: 4.1.5 - object.values: 1.1.7 + object.values: 1.2.0 dev: true /jszip@3.10.1: @@ -11815,29 +11943,32 @@ packages: object-keys: 1.1.1 dev: true - /object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-object-atoms: 1.0.0 dev: true - /object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 dev: true - /object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + /object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 dev: true /object.values@1.1.7: @@ -11849,6 +11980,15 @@ packages: es-abstract: 1.22.2 dev: true + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + /omggif@1.0.10: resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} dev: false @@ -12296,6 +12436,11 @@ packages: - supports-color dev: true + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: true + /postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -12304,13 +12449,13 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.2.0 dev: true /potpack@1.0.2: @@ -12376,13 +12521,13 @@ packages: engines: {node: '>= 0.8'} dev: true - /prismarine-auth@2.4.1: - resolution: {integrity: sha512-DwDI3Ucxf/eThJJo5QVzlywFrJulL1fK1z6F8bybvddim8YgudRksQc3w4cE2m0hPPHfE1BRd5lh1NpedrixMQ==} + /prismarine-auth@2.4.2: + resolution: {integrity: sha512-Cq4woGobnFYYfMBDh1WITW+Vs98toN91qAFBvBitwV7IwJaiSAh2Nl+WPUEGeg5eLBoSPpSyCVT8P2oi7Cav8g==} dependencies: - '@azure/msal-node': 2.6.3 + '@azure/msal-node': 2.7.0 '@xboxreplay/xboxlive-auth': 3.3.3(debug@4.3.4) debug: 4.3.4(supports-color@8.1.1) - jose: 4.15.4 + jose: 4.15.5 node-fetch: 2.7.0 smart-buffer: 4.2.0 uuid-1345: 1.0.2 @@ -12483,7 +12628,7 @@ packages: minecraft-data: 3.62.0 prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-nbt: 2.2.1 - prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 + prismarine-world: github.com/zardoy/prismarine-world/6ae6f009d38460de284f8c226c665f04cbad9465 vec3: 0.1.8 dev: false @@ -13243,13 +13388,13 @@ packages: strip-indent: 4.0.0 dev: true - /reflect.getprototypeof@1.0.5: - resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==} + /reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 globalthis: 1.0.3 @@ -13297,7 +13442,7 @@ packages: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 - set-function-name: 2.0.1 + set-function-name: 2.0.2 dev: true /regexpp@3.2.0: @@ -13546,8 +13691,8 @@ packages: has-symbols: 1.0.3 isarray: 2.0.5 - /safe-array-concat@1.1.0: - resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} dependencies: call-bind: 1.0.7 @@ -13704,6 +13849,16 @@ packages: functions-have-names: 1.2.3 has-property-descriptors: 1.0.0 + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + /set-harmonic-interval@1.0.1: resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} engines: {node: '>=6.9'} @@ -13787,6 +13942,16 @@ packages: get-intrinsic: 1.2.4 object-inspect: 1.13.1 + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + dev: true + /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} dev: true @@ -14017,6 +14182,11 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: true + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: @@ -14175,6 +14345,10 @@ packages: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} dev: true + /strict-event-emitter-types@2.0.0: + resolution: {integrity: sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==} + dev: false + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -14204,6 +14378,25 @@ packages: regexp.prototype.flags: 1.5.1 set-function-name: 2.0.1 side-channel: 1.0.4 + dev: false + + /string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + dev: true /string.prototype.padend@3.1.4: resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} @@ -14222,6 +14415,16 @@ packages: define-properties: 1.2.1 es-abstract: 1.22.2 + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: @@ -14229,6 +14432,14 @@ packages: define-properties: 1.2.1 es-abstract: 1.22.2 + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: @@ -14236,6 +14447,15 @@ packages: define-properties: 1.2.1 es-abstract: 1.22.2 + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + /string_decoder@0.10.31: resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} requiresBuild: true @@ -14349,8 +14569,8 @@ packages: resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} dev: true - /systeminformation@5.21.24: - resolution: {integrity: sha512-xQada8ByGGFoRXJaUptGgddn3i7IjtSdqNdCKzB8xkzsM7pHnfLYBWxkPdGzhZ0Z/l+W1yo+aZQZ74d2isj8kw==} + /systeminformation@5.22.7: + resolution: {integrity: sha512-AWxlP05KeHbpGdgvZkcudJpsmChc2Y5Eo/GvxG/iUA/Aws5LZKHAMSeAo+V+nD+nxWZaxrwpWcnx4SH3oxNL3A==} engines: {node: '>=8.0.0'} os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true @@ -14735,8 +14955,8 @@ packages: get-intrinsic: 1.2.1 is-typed-array: 1.1.12 - /typed-array-buffer@1.0.1: - resolution: {integrity: sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==} + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -14753,6 +14973,17 @@ packages: has-proto: 1.0.1 is-typed-array: 1.1.12 + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + /typed-array-byte-offset@1.0.0: resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} engines: {node: '>= 0.4'} @@ -14763,6 +14994,18 @@ packages: has-proto: 1.0.1 is-typed-array: 1.1.12 + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: @@ -14770,6 +15013,18 @@ packages: for-each: 0.3.3 is-typed-array: 1.1.12 + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + dev: true + /typed-emitter@1.4.0: resolution: {integrity: sha512-weBmoo3HhpKGgLBOYwe8EB31CzDFuaK7CCL+axXhUYhn4jo6DSkHnbefboCF5i4DQ2aMFe0C/FdTWcPdObgHyg==} @@ -15250,8 +15505,8 @@ packages: optionalDependencies: fsevents: 2.3.3 - /vite@4.5.2: - resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==} + /vite@4.5.3: + resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -15279,7 +15534,7 @@ packages: optional: true dependencies: esbuild: 0.18.20 - postcss: 8.4.35 + postcss: 8.4.38 rollup: 3.29.4 optionalDependencies: fsevents: 2.3.3 @@ -15451,17 +15706,18 @@ packages: is-weakref: 1.0.2 isarray: 2.0.5 which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.14 + which-collection: 1.0.2 + which-typed-array: 1.1.15 dev: true - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 dev: true /which-typed-array@1.1.11: @@ -15474,11 +15730,11 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 - /which-typed-array@1.1.14: - resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.6 + available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 @@ -15929,7 +16185,7 @@ packages: prismarine-recipe: 1.3.1(prismarine-registry@1.7.0) prismarine-registry: 1.7.0 prismarine-windows: 2.9.0 - prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 + prismarine-world: github.com/zardoy/prismarine-world/6ae6f009d38460de284f8c226c665f04cbad9465 protodef: 1.15.0 typed-emitter: 1.4.0 vec3: 0.1.8 @@ -15989,7 +16245,7 @@ packages: version: 1.45.0 engines: {node: '>=14'} dependencies: - '@types/readable-stream': 4.0.10 + '@types/readable-stream': 4.0.11 aes-js: 3.1.2 buffer-equal: 1.0.1 debug: 4.3.4(supports-color@8.1.1) @@ -16000,7 +16256,7 @@ packages: minecraft-folder-path: 1.2.0 node-fetch: 2.7.0 node-rsa: 0.4.2 - prismarine-auth: 2.4.1 + prismarine-auth: 2.4.2 prismarine-nbt: 2.5.0 prismarine-realms: 1.3.2 protodef: 1.15.0 @@ -16037,8 +16293,8 @@ packages: - minecraft-data dev: false - github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-world/tar.gz/c358222204d21fe7d45379fbfcefb047f926c786} + github.com/zardoy/prismarine-world/6ae6f009d38460de284f8c226c665f04cbad9465: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465} name: prismarine-world version: 3.6.2 engines: {node: '>=8.0.0'} diff --git a/src/entities.ts b/src/entities.ts index 0889c9ed..58c445f1 100644 --- a/src/entities.ts +++ b/src/entities.ts @@ -1,9 +1,39 @@ import { Entity } from 'prismarine-entity' import tracker from '@nxg-org/mineflayer-tracker' +import { loader as autoJumpPlugin } from '@nxg-org/mineflayer-auto-jump' +import { subscribeKey } from 'valtio/utils' import { options, watchValue } from './optionsStorage' +import { miscUiState } from './globalState' + + +const updateAutoJump = () => { + if (!bot?.autoJumper) return + const autoJump = options.autoJump === 'auto' ? miscUiState.currentTouch && !miscUiState.usingGamepadInput : options.autoJump === 'always' + bot.autoJumper.setOpts({ + jumpIntoWater: false, + jumpOnAllEdges: false, + // strictBlockCollision: true, + }) + if (autoJump) { + bot.autoJumper.enable() + } else { + bot.autoJumper.disable() + } +} +subscribeKey(options, 'autoJump', () => { + updateAutoJump() +}) +subscribeKey(miscUiState, 'usingGamepadInput', () => { + updateAutoJump() +}) +subscribeKey(miscUiState, 'currentTouch', () => { + updateAutoJump() +}) customEvents.on('gameLoaded', () => { bot.loadPlugin(tracker) + bot.loadPlugin(autoJumpPlugin) + updateAutoJump() // todo cleanup (move to viewer, also shouldnt be used at all) const playerPerAnimation = {} as Record @@ -13,6 +43,7 @@ customEvents.on('gameLoaded', () => { window.debugEntityMetadata[e.username] = e // todo entity spawn timing issue, check perf if (viewer.entities.entities[e.id]?.playerObject) { + // todo throttle! bot.tracker.trackEntity(e) const { playerObject } = viewer.entities.entities[e.id] playerObject.backEquipment = e.equipment.some((item) => item?.name === 'elytra') ? 'elytra' : 'cape' diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index 13e6388b..b54f3498 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -208,6 +208,13 @@ export const guiOptionsScheme: { touchControlsType: { values: [['classic', 'Classic'], ['joystick-buttons', 'New']], }, + autoJump: { + values: [ + 'always', + 'auto', + 'never' + ], + }, }, { custom () { diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts index 9e13bf47..25c8b3c7 100644 --- a/src/optionsStorage.ts +++ b/src/optionsStorage.ts @@ -71,6 +71,7 @@ const defaultOptions = { showCursorBlockInSpectator: false, renderEntities: true, chatSelect: false, + autoJump: 'auto' as 'auto' | 'always' | 'never', // advanced bot options autoRespawn: false, From 219f525409cea9e3e92229f2e6e522a9c2d5fae9 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 16 Apr 2024 06:37:22 +0300 Subject: [PATCH 0114/1195] support for custom input keys / gamepad buttons (no ui yet) --- package.json | 2 +- pnpm-lock.yaml | 9 +++++---- src/controls.ts | 11 ++++++++--- src/index.ts | 2 +- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index b91bb11e..d6969dc2 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "browserify-zlib": "^0.2.0", "buffer": "^6.0.3", "constants-browserify": "^1.0.0", - "contro-max": "^0.1.1", + "contro-max": "^0.1.2", "crypto-browserify": "^3.12.0", "cypress": "^10.11.0", "cypress-esbuild-preprocessor": "^1.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c43c6ba..b9857220 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -244,8 +244,8 @@ importers: specifier: ^1.0.0 version: 1.0.0 contro-max: - specifier: ^0.1.1 - version: 0.1.1(typescript@5.2.2) + specifier: ^0.1.2 + version: 0.1.2(typescript@5.2.2) crypto-browserify: specifier: ^3.12.0 version: 3.12.0 @@ -7091,8 +7091,9 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - /contro-max@0.1.1(typescript@5.2.2): - resolution: {integrity: sha512-H+bzJWxiuxu98Tz8iGs1occMkRlr9fOzfOKeflVU8bD5teAEiJu8zjVnNSbweLQIR+Vhdynygv18N69t97rVAw==} + /contro-max@0.1.2(typescript@5.2.2): + resolution: {integrity: sha512-mY9aRQ9on/iyzvyhb4OD/10WRRKulVd92F7cxMFVn3rq5EwI+gZitGpHN2mp9+IzwRgBJrOKr1C051b3YlEktQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: emittery: 0.10.2 lodash-es: 4.17.21 diff --git a/src/controls.ts b/src/controls.ts index 48c05179..90ca29bf 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -16,8 +16,8 @@ import { showOptionsModal } from './react/SelectOption' import widgets from './react/widgets' import { getItemFromBlock } from './botUtils' -// doesnt seem to work for now -const customKeymaps = proxy(JSON.parse(localStorage.keymap || '{}')) +// todo move this to shared file with component +export const customKeymaps = proxy(JSON.parse(localStorage.keymap || '{}')) subscribe(customKeymaps, () => { localStorage.keymap = JSON.parse(customKeymaps) }) @@ -322,11 +322,16 @@ document.addEventListener('keydown', (e) => { if (!isGameActive(false)) return if (hardcodedPressedKeys.has('F3')) { const keybind = f3Keybinds.find((v) => v.key === e.code) - if (keybind) keybind.action() + if (keybind) { + keybind.action() + e.stopPropagation() + } return } hardcodedPressedKeys.add(e.code) +}, { + capture: true, }) document.addEventListener('keyup', (e) => { hardcodedPressedKeys.delete(e.code) diff --git a/src/index.ts b/src/index.ts index 7fd99b14..edbd8a92 100644 --- a/src/index.ts +++ b/src/index.ts @@ -871,7 +871,7 @@ document.body.addEventListener('touchend', (e) => { activeTouch = undefined }) document.body.addEventListener('touchstart', (e) => { - const ignoreElem = (e.target as HTMLElement).matches('vercel-live-feedback') + const ignoreElem = (e.target as HTMLElement).matches('vercel-live-feedback') || (e.target as HTMLElement).closest('.hotbar') if (!isGameActive(true) || ignoreElem) return // we always prevent default behavior to disable magnifier on ios, but by doing so we also disable click events e.preventDefault() From f747ff1c2b9dd8e11826a384874721642b56e166 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 16 Apr 2024 06:43:24 +0300 Subject: [PATCH 0115/1195] feat: auto parkour mode! (implies auto-jump) --- src/entities.ts | 9 ++++++--- src/optionsGuiScheme.tsx | 3 +++ src/optionsStorage.ts | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/entities.ts b/src/entities.ts index 58c445f1..59a43772 100644 --- a/src/entities.ts +++ b/src/entities.ts @@ -8,10 +8,10 @@ import { miscUiState } from './globalState' const updateAutoJump = () => { if (!bot?.autoJumper) return - const autoJump = options.autoJump === 'auto' ? miscUiState.currentTouch && !miscUiState.usingGamepadInput : options.autoJump === 'always' + const autoJump = options.parkourMode || (options.autoJump === 'auto' ? miscUiState.currentTouch && !miscUiState.usingGamepadInput : options.autoJump === 'always') bot.autoJumper.setOpts({ - jumpIntoWater: false, - jumpOnAllEdges: false, + jumpIntoWater: options.parkourMode, + jumpOnAllEdges: options.parkourMode, // strictBlockCollision: true, }) if (autoJump) { @@ -23,6 +23,9 @@ const updateAutoJump = () => { subscribeKey(options, 'autoJump', () => { updateAutoJump() }) +subscribeKey(options, 'parkourMode', () => { + updateAutoJump() +}) subscribeKey(miscUiState, 'usingGamepadInput', () => { updateAutoJump() }) diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index b54f3498..71ea9cd3 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -221,6 +221,9 @@ export const guiOptionsScheme: { const { touchControlsType } = useSnapshot(options) return
}) - }) + }) : [] return
diff --git a/src/watchOptions.ts b/src/watchOptions.ts index a6eea6e7..6bb97b29 100644 --- a/src/watchOptions.ts +++ b/src/watchOptions.ts @@ -33,15 +33,6 @@ export const watchOptionsAfterViewerInit = () => { viewer.entities.setDebugMode(o.showChunkBorders ? 'basic' : 'none') }) - watchValue(options, o => { - if (o.antiAliasing) { - viewer.enableFxaaScene() - } else { - viewer.enableFXAA = false - viewer.composer = undefined - } - }) - watchValue(options, o => { viewer.entities.setVisible(o.renderEntities) }) From 53a6d788a9cfc22fb47f397993c7865eccf9fb05 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Tue, 16 Apr 2024 10:28:49 +0300 Subject: [PATCH 0119/1195] feat: Add lighting support for < 1.12 with smooth lighting (#98) (newer versions are available experimentally under option) --- README.MD | 2 +- package.json | 1 + pnpm-lock.yaml | 3 + prismarine-viewer/viewer/lib/mesher/mesher.ts | 6 +- prismarine-viewer/viewer/lib/mesher/models.ts | 29 ++++++-- prismarine-viewer/viewer/lib/mesher/world.ts | 67 +++++++++++++++---- prismarine-viewer/viewer/lib/viewer.ts | 21 ++++++ .../viewer/lib/worldDataEmitter.ts | 8 +++ .../viewer/lib/worldrendererCommon.ts | 5 +- .../viewer/lib/worldrendererThree.ts | 14 ++++ src/dayCycle.ts | 7 +- src/index.ts | 14 ++-- src/menus/components/debug_overlay.js | 8 ++- src/optionsGuiScheme.tsx | 4 ++ src/optionsStorage.ts | 2 + src/watchOptions.ts | 14 ++++ 16 files changed, 172 insertions(+), 33 deletions(-) diff --git a/README.MD b/README.MD index dd6806f4..4431fe03 100644 --- a/README.MD +++ b/README.MD @@ -71,7 +71,7 @@ Instead I recommend setting `options.debugLogNotFrequentPackets`. Also you can u - `viewer.world.sectionObjects` - Object with all active chunk sections (geometries) in the world. Each chunk section is a Three.js mesh or group. - `debugSceneChunks` - The same as above, but relative to current bot position (e.g. 0,0 is the current chunk). - `debugChangedOptions` - See what options are changed. Don't change options here. -- `localServer` - Only for singleplayer mode/host. Flying Squid server instance, see it's documentation for more. +- `localServer`/`server` - Only for singleplayer mode/host. Flying Squid server instance, see it's documentation for more. - `localServer.overworld.storageProvider.regions` - See ALL LOADED region files with all raw data. - `nbt.simplify(someNbt)` - Simplifies nbt data, so it's easier to read. diff --git a/package.json b/package.json index c6ca5bd2..ef3c2719 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,7 @@ "title-case": "3.x", "ua-parser-js": "^1.0.37", "valtio": "^1.11.1", + "vec3": "^0.1.7", "workbox-build": "^7.0.0" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b9857220..e281eb90 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -184,6 +184,9 @@ importers: valtio: specifier: ^1.11.1 version: 1.11.2(@types/react@18.2.20)(react@18.2.0) + vec3: + specifier: ^0.1.7 + version: 0.1.8 workbox-build: specifier: ^7.0.0 version: 7.0.0 diff --git a/prismarine-viewer/viewer/lib/mesher/mesher.ts b/prismarine-viewer/viewer/lib/mesher/mesher.ts index a241a6f1..a51b2da7 100644 --- a/prismarine-viewer/viewer/lib/mesher/mesher.ts +++ b/prismarine-viewer/viewer/lib/mesher/mesher.ts @@ -1,6 +1,3 @@ -//@ts-check -/* global postMessage self */ - import { World } from './world' import { Vec3 } from 'vec3' import { getSectionGeometry, setRendererData } from './models' @@ -53,6 +50,9 @@ self.onmessage = ({ data }) => { blockStatesReady = true } else if (data.type === 'dirty') { const loc = new Vec3(data.x, data.y, data.z) + world.skyLight = data.skyLight + world.smoothLighting = data.smoothLighting + world.enableLighting = data.enableLighting setSectionDirty(loc, data.value) } else if (data.type === 'chunk') { world.addColumn(data.x, data.z, data.chunk) diff --git a/prismarine-viewer/viewer/lib/mesher/models.ts b/prismarine-viewer/viewer/lib/mesher/models.ts index 4ed00e98..c6f35f31 100644 --- a/prismarine-viewer/viewer/lib/mesher/models.ts +++ b/prismarine-viewer/viewer/lib/mesher/models.ts @@ -108,10 +108,10 @@ const elemFaces = { } } -function getLiquidRenderHeight (world, block, type) { +function getLiquidRenderHeight (world, block, type, pos) { if (!block || block.type !== type) return 1 / 9 if (block.metadata === 0) { // source block - const blockAbove = world.getBlock(block.position.offset(0, 1, 0)) + const blockAbove = world.getBlock(pos.offset(0, 1, 0)) if (blockAbove && blockAbove.type === type) return 1 return 8 / 9 } @@ -122,7 +122,8 @@ function renderLiquid (world, cursor, texture, type, biome, water, attr) { const heights: number[] = [] for (let z = -1; z <= 1; z++) { for (let x = -1; x <= 1; x++) { - heights.push(getLiquidRenderHeight(world, world.getBlock(cursor.offset(x, 0, z)), type)) + const pos = cursor.offset(x, 0, z) + heights.push(getLiquidRenderHeight(world, world.getBlock(pos), type, pos)) } } const cornerHeights = [ @@ -238,6 +239,9 @@ function buildRotationMatrix (axis, degree) { } function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr, globalMatrix, globalShift, block: Block, biome) { + const position = cursor + // const key = `${position.x},${position.y},${position.z}` + // if (!globalThis.allowedBlocks.includes(key)) return const cullIfIdentical = block.name.indexOf('glass') >= 0 for (const face in element.faces) { @@ -310,6 +314,9 @@ function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr } const aos: number[] = [] + const neighborPos = position.plus(new Vec3(...dir)) + let baseLightLevel = world.getLight(neighborPos) + const baseLight = baseLightLevel / 15 for (const pos of corners) { let vertex = [ (pos[0] ? maxx : minx), @@ -345,6 +352,18 @@ function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr const side2 = world.getBlock(cursor.offset(...side2Dir)) const corner = world.getBlock(cursor.offset(...cornerDir)) + let cornerLightResult = 15 + if (world.smoothLighting) { + const side1Light = world.getLight(cursor.plus(new Vec3(...side1Dir)), true) + const side2Light = world.getLight(cursor.plus(new Vec3(...side2Dir)), true) + const cornerLight = world.getLight(cursor.plus(new Vec3(...cornerDir)), true) + // interpolate + cornerLightResult = Math.min( + Math.min(side1Light, side2Light), + cornerLight + ) + } + const side1Block = world.shouldMakeAo(side1) ? 1 : 0 const side2Block = world.shouldMakeAo(side2) ? 1 : 0 const cornerBlock = world.shouldMakeAo(corner) ? 1 : 0 @@ -352,11 +371,11 @@ function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr // TODO: correctly interpolate ao light based on pos (evaluate once for each corner of the block) const ao = (side1Block && side2Block) ? 0 : (3 - (side1Block + side2Block + cornerBlock)) - light = (ao + 1) / 4 + light = (ao + 1) / 4 * cornerLightResult / 15 aos.push(ao) } - attr.colors.push(tint[0] * light, tint[1] * light, tint[2] * light) + attr.colors.push(baseLight * tint[0] * light, baseLight * tint[1] * light, baseLight * tint[2] * light) } if (doAO && aos[0] + aos[3] >= aos[1] + aos[2]) { diff --git a/prismarine-viewer/viewer/lib/mesher/world.ts b/prismarine-viewer/viewer/lib/mesher/world.ts index 4cc64a4d..eebe8cc7 100644 --- a/prismarine-viewer/viewer/lib/mesher/world.ts +++ b/prismarine-viewer/viewer/lib/mesher/world.ts @@ -10,13 +10,6 @@ function columnKey (x, z) { return `${x},${z}` } -function posInChunk (pos) { - pos = pos.floored() - pos.x &= 15 - pos.z &= 15 - return pos -} - function isCube (shapes) { if (!shapes || shapes.length !== 1) return false const shape = shapes[0] @@ -29,21 +22,46 @@ export type WorldBlock = Block & { isCube: boolean } + export class World { + enableLighting = true + skyLight = 15 + smoothLighting = true outputFormat = 'threeJs' as 'threeJs' | 'webgl' - Chunk: any/* import('prismarine-chunk/types/index').PCChunk */ - columns = {} + Chunk: typeof import('prismarine-chunk/types/index').PCChunk + columns = {} as { [key: string]: import('prismarine-chunk/types/index').PCChunk } blockCache = {} biomeCache: { [id: number]: mcData.Biome } constructor(version) { - this.Chunk = Chunks(version) + this.Chunk = Chunks(version) as any this.biomeCache = mcData(version).biomes } + getLight (pos: Vec3, isNeighbor = false) { + if (!this.enableLighting) return 15 + // const key = `${pos.x},${pos.y},${pos.z}` + // if (lightsCache.has(key)) return lightsCache.get(key) + const column = this.getColumnByPos(pos) + if (!column || !hasChunkSection(column, pos)) return 15 + let result = Math.min( + 15, + Math.max( + column.getBlockLight(posInChunk(pos)), + Math.min(this.skyLight, column.getSkyLight(posInChunk(pos))) + ) + 2 + ) + // lightsCache.set(key, result) + if (result === 2 && this.getBlock(pos)?.name.match(/_stairs|slab/)) { // todo this is obviously wrong + result = this.getLight(pos.offset(0, 1, 0)) + } + if (isNeighbor && result === 2) result = 15 // TODO + return result + } + addColumn (x, z, json) { const chunk = this.Chunk.fromJson(json) - this.columns[columnKey(x, z)] = chunk + this.columns[columnKey(x, z)] = chunk as any return chunk } @@ -67,6 +85,10 @@ export class World { return true } + getColumnByPos (pos: Vec3) { + return this.getColumn(Math.floor(pos.x / 16) * 16, Math.floor(pos.z / 16) * 16) + } + getBlock (pos: Vec3): WorldBlock | null { const key = columnKey(Math.floor(pos.x / 16) * 16, Math.floor(pos.z / 16) * 16) @@ -80,12 +102,18 @@ export class World { if (!this.blockCache[stateId]) { const b = column.getBlock(locInChunk) + //@ts-expect-error b.isCube = isCube(b.shapes) this.blockCache[stateId] = b + Object.defineProperty(b, 'position', { + get () { + throw new Error('position is not reliable, use pos parameter instead of block.position') + } + }) } const block = this.blockCache[stateId] - block.position = loc + // block.position = loc // it overrides position of all currently loaded blocks block.biome = this.biomeCache[column.getBiome(locInChunk)] ?? this.biomeCache[1] ?? this.biomeCache[0] if (block.name === 'redstone_ore') block.transparent = false return block @@ -95,3 +123,18 @@ export class World { return block?.isCube && !ignoreAoBlocks.includes(block.name) } } + +// todo export in chunk instead +const hasChunkSection = (column, pos) => { + if (column._getSection) return column._getSection(pos) + if (column.sections) return column.sections[pos.y >> 4] + if (column.skyLightSections) return column.skyLightSections[getLightSectionIndex(pos, column.minY)] +} + +function posInChunk (pos) { + return new Vec3(Math.floor(pos.x) & 15, Math.floor(pos.y), Math.floor(pos.z) & 15) +} + +function getLightSectionIndex (pos, minY = 0) { + return Math.floor((pos.y - minY) / 16) + 1 +} diff --git a/prismarine-viewer/viewer/lib/viewer.ts b/prismarine-viewer/viewer/lib/viewer.ts index ebc84300..2e00a6e1 100644 --- a/prismarine-viewer/viewer/lib/viewer.ts +++ b/prismarine-viewer/viewer/lib/viewer.ts @@ -169,6 +169,27 @@ export class Viewer { this.world.chunksLength = d === 0 ? 1 : generateSpiralMatrix(d).length }) + emitter.on('updateLight', ({ pos }) => { + if (this.world instanceof WorldRendererThree) this.world.updateLight(pos.x, pos.z) + }) + + emitter.on('time', (timeOfDay) => { + let skyLight = 15 + if (timeOfDay < 0 || timeOfDay > 24000) { + throw new Error("Invalid time of day. It should be between 0 and 24000."); + } else if (timeOfDay <= 6000 || timeOfDay >= 18000) { + skyLight = 15; + } else if (timeOfDay > 6000 && timeOfDay < 12000) { + skyLight = 15 - ((timeOfDay - 6000) / 6000) * 15; + } else if (timeOfDay >= 12000 && timeOfDay < 18000) { + skyLight = ((timeOfDay - 12000) / 6000) * 15; + } + + if (this.world.skyLight === skyLight) return + this.world.skyLight = skyLight + ;(this.world as WorldRendererThree).rerenderAllChunks?.() + }) + emitter.emit('listening') } diff --git a/prismarine-viewer/viewer/lib/worldDataEmitter.ts b/prismarine-viewer/viewer/lib/worldDataEmitter.ts index c88c4355..cfcee0e4 100644 --- a/prismarine-viewer/viewer/lib/worldDataEmitter.ts +++ b/prismarine-viewer/viewer/lib/worldDataEmitter.ts @@ -68,8 +68,16 @@ export class WorldDataEmitter extends EventEmitter { const stateId = newBlock.stateId ? newBlock.stateId : ((newBlock.type << 4) | newBlock.metadata) this.emitter.emit('blockUpdate', { pos: oldBlock.position, stateId }) }, + time: () => { + this.emitter.emit('time', bot.time.timeOfDay) + }, } satisfies Partial + bot._client.on('update_light', ({ chunkX, chunkZ }) => { + const chunkPos = new Vec3(chunkX * 16, 0, chunkZ * 16) + this.loadChunk(chunkPos) + }) + this.emitter.on('listening', () => { this.emitter.emit('blockEntities', new Proxy({}, { get (_target, posKey, receiver) { diff --git a/prismarine-viewer/viewer/lib/worldrendererCommon.ts b/prismarine-viewer/viewer/lib/worldrendererCommon.ts index d5d11004..7e4d5cab 100644 --- a/prismarine-viewer/viewer/lib/worldrendererCommon.ts +++ b/prismarine-viewer/viewer/lib/worldrendererCommon.ts @@ -37,6 +37,9 @@ export abstract class WorldRendererCommon texturesVersion?: string viewDistance = -1 chunksLength = 0 + skyLight = 15 + smoothLighting = true + enableLighting = true abstract outputFormat: 'threeJs' | 'webgl' @@ -222,7 +225,7 @@ export abstract class WorldRendererCommon // is always dispatched to the same worker const hash = mod(Math.floor(pos.x / 16) + Math.floor(pos.y / 16) + Math.floor(pos.z / 16), this.workers.length) this.sectionsOutstanding.set(key, (this.sectionsOutstanding.get(key) ?? 0) + 1) - this.workers[hash].postMessage({ type: 'dirty', x: pos.x, y: pos.y, z: pos.z, value }) + this.workers[hash].postMessage({ type: 'dirty', x: pos.x, y: pos.y, z: pos.z, value, skyLight: this.skyLight, smoothLighting: this.smoothLighting, enableLighting: this.enableLighting }) } // Listen for chunk rendering updates emitted if a worker finished a render and resolve if the number diff --git a/prismarine-viewer/viewer/lib/worldrendererThree.ts b/prismarine-viewer/viewer/lib/worldrendererThree.ts index d8115b9a..0e9c7982 100644 --- a/prismarine-viewer/viewer/lib/worldrendererThree.ts +++ b/prismarine-viewer/viewer/lib/worldrendererThree.ts @@ -176,6 +176,20 @@ export class WorldRendererThree extends WorldRendererCommon { return group } + updateLight (chunkX: number, chunkZ: number) { + // set all sections in the chunk dirty + for (let y = this.worldConfig.minY; y < this.worldConfig.worldHeight; y += 16) { + this.setSectionDirty(new Vec3(chunkX, y, chunkZ)) + } + } + + rerenderAllChunks () { // todo not clear what to do with loading chunks + for (const key of Object.keys(this.sectionObjects)) { + const [x, y, z] = key.split(',').map(Number) + this.setSectionDirty(new Vec3(x, y, z)) + } + } + updateShowChunksBorder (value: boolean) { this.showChunkBorders = value for (const object of Object.values(this.sectionObjects)) { diff --git a/src/dayCycle.ts b/src/dayCycle.ts index b4bf58d8..0d5043e7 100644 --- a/src/dayCycle.ts +++ b/src/dayCycle.ts @@ -35,8 +35,9 @@ export default () => { // todo need to think wisely how to set these values & also move directional light around! const colorInt = Math.max(int, 0.1) viewer.scene.background = new THREE.Color(dayColor.r * colorInt, dayColor.g * colorInt, dayColor.b * colorInt) - viewer.ambientLight.intensity = Math.max(int, 0.25) - // directional light - viewer.directionalLight.intensity = Math.min(int, 0.5) + if (!options.newVersionsLighting && bot.supportFeature('blockStateId')) { + viewer.ambientLight.intensity = Math.max(int, 0.25) + viewer.directionalLight.intensity = Math.min(int, 0.5) + } }) } diff --git a/src/index.ts b/src/index.ts index bccc1e71..0476a665 100644 --- a/src/index.ts +++ b/src/index.ts @@ -746,6 +746,7 @@ async function connect (connectOptions: { console.log('Done!') + // todo cleanup these onGameLoad(async () => { if (!viewer.world.downloadedBlockStatesData && !viewer.world.customBlockStatesData) { await new Promise(resolve => { @@ -765,11 +766,14 @@ async function connect (connectOptions: { }) if (!connectOptions.ignoreQs) { - const qs = new URLSearchParams(window.location.search) - for (let command of qs.getAll('command')) { - if (!command.startsWith('/')) command = `/${command}` - bot.chat(command) - } + // todo cleanup + customEvents.on('gameLoaded', () => { + const qs = new URLSearchParams(window.location.search) + for (let command of qs.getAll('command')) { + if (!command.startsWith('/')) command = `/${command}` + bot.chat(command) + } + }) } } diff --git a/src/menus/components/debug_overlay.js b/src/menus/components/debug_overlay.js index 6cee482a..a79a940a 100644 --- a/src/menus/components/debug_overlay.js +++ b/src/menus/components/debug_overlay.js @@ -237,8 +237,10 @@ class DebugOverlay extends LitElement { return html`

${name}: ${typeof value === 'boolean' ? html`${value}` : value}

` } - const skyL = this.bot.world.getSkyLight(this.bot.entity.position) - const biomeId = this.bot.world.getBiome(this.bot.entity.position) + const botBlock = bot.entity.position.floored() + const skyL = bot.world.getSkyLight(botBlock) + const blockL = bot.world.getBlockLight(botBlock) + const biomeId = bot.world.getBiome(botBlock) return html`
@@ -251,7 +253,7 @@ class DebugOverlay extends LitElement {

Packets: ${this.packetsString}

Facing (viewer): ${rot[0].toFixed(3)} ${rot[1].toFixed(3)}

Facing (minecraft): ${quadsDescription[minecraftQuad]} (${minecraftYaw.toFixed(1)} ${(rot[1] * -180 / Math.PI).toFixed(1)})

-

Light: ${skyL} (${skyL} sky)

+

Light: ${blockL} (${skyL} sky)

Biome: minecraft:${window.loadedData.biomesArray[biomeId]?.name ?? 'unknown biome'}

Day: ${this.bot.time.day}

diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index 025324c3..f1ac35ca 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -50,6 +50,10 @@ export const guiOptionsScheme: { dayCycleAndLighting: { text: 'Day Cycle', }, + smoothLighting: {}, + newVersionsLighting: { + text: 'Lighting in newer versions', + } }, ], main: [ diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts index 783c724a..af284b62 100644 --- a/src/optionsStorage.ts +++ b/src/optionsStorage.ts @@ -74,6 +74,8 @@ const defaultOptions = { /** Actually might be useful */ showCursorBlockInSpectator: false, renderEntities: true, + smoothLighting: true, + newVersionsLighting: false, chatSelect: false, autoJump: 'auto' as 'auto' | 'always' | 'never', autoParkour: false, diff --git a/src/watchOptions.ts b/src/watchOptions.ts index 6bb97b29..cfed6afa 100644 --- a/src/watchOptions.ts +++ b/src/watchOptions.ts @@ -1,6 +1,7 @@ // not all options are watched here import { subscribeKey } from 'valtio/utils' +import { WorldRendererThree } from 'prismarine-viewer/viewer/lib/worldrendererThree' import { options, watchValue } from './optionsStorage' import { reloadChunks } from './utils' import { miscUiState } from './globalState' @@ -36,4 +37,17 @@ export const watchOptionsAfterViewerInit = () => { watchValue(options, o => { viewer.entities.setVisible(o.renderEntities) }) + + viewer.world.smoothLighting = options.smoothLighting + subscribeKey(options, 'smoothLighting', () => { + viewer.world.smoothLighting = options.smoothLighting; + (viewer.world as WorldRendererThree).rerenderAllChunks() + }) + subscribeKey(options, 'newVersionsLighting', () => { + viewer.world.enableLighting = !bot.supportFeature('blockStateId') || options.newVersionsLighting; + (viewer.world as WorldRendererThree).rerenderAllChunks() + }) + customEvents.on('gameLoaded', () => { + viewer.world.enableLighting = !bot.supportFeature('blockStateId') || options.newVersionsLighting + }) } From 19a5d03602296203623bd2d2f25697222ddf0242 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 16 Apr 2024 23:35:07 +0300 Subject: [PATCH 0120/1195] fix: fix critical position audio play memory leak --- prismarine-viewer/viewer/lib/viewer.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/prismarine-viewer/viewer/lib/viewer.ts b/prismarine-viewer/viewer/lib/viewer.ts index 2e00a6e1..f0c7e79b 100644 --- a/prismarine-viewer/viewer/lib/viewer.ts +++ b/prismarine-viewer/viewer/lib/viewer.ts @@ -125,11 +125,12 @@ export class Viewer { this.scene.add(sound) // set sound position sound.position.set(position.x, position.y, position.z) - sound.play() sound.onEnded = () => { this.scene.remove(sound) sound.disconnect() + audioLoader.manager.itemEnd(path) } + sound.play() }) } @@ -176,18 +177,18 @@ export class Viewer { emitter.on('time', (timeOfDay) => { let skyLight = 15 if (timeOfDay < 0 || timeOfDay > 24000) { - throw new Error("Invalid time of day. It should be between 0 and 24000."); + throw new Error("Invalid time of day. It should be between 0 and 24000.") } else if (timeOfDay <= 6000 || timeOfDay >= 18000) { - skyLight = 15; + skyLight = 15 } else if (timeOfDay > 6000 && timeOfDay < 12000) { - skyLight = 15 - ((timeOfDay - 6000) / 6000) * 15; + skyLight = 15 - ((timeOfDay - 6000) / 6000) * 15 } else if (timeOfDay >= 12000 && timeOfDay < 18000) { - skyLight = ((timeOfDay - 12000) / 6000) * 15; + skyLight = ((timeOfDay - 12000) / 6000) * 15 } if (this.world.skyLight === skyLight) return this.world.skyLight = skyLight - ;(this.world as WorldRendererThree).rerenderAllChunks?.() + ; (this.world as WorldRendererThree).rerenderAllChunks?.() }) emitter.emit('listening') From 7aeb13f9fec7c24e620e5e72addafbe070f94132 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 17 Apr 2024 00:52:51 +0300 Subject: [PATCH 0121/1195] up autojump --- package.json | 3 +- pnpm-lock.yaml | 108 +++---------------------------------------------- 2 files changed, 6 insertions(+), 105 deletions(-) diff --git a/package.json b/package.json index ef3c2719..6513fbeb 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,7 @@ "dependencies": { "@dimaka/interface": "0.0.3-alpha.0", "@floating-ui/react": "^0.26.1", - "@mui/base": "5.0.0-beta.34", - "@nxg-org/mineflayer-auto-jump": "^0.7.5", + "@nxg-org/mineflayer-auto-jump": "^0.7.7", "@nxg-org/mineflayer-tracker": "^1.2.1", "@react-oauth/google": "^0.12.1", "@types/gapi": "^0.0.47", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e281eb90..a0348616 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,12 +25,9 @@ importers: '@floating-ui/react': specifier: ^0.26.1 version: 0.26.1(react-dom@18.2.0)(react@18.2.0) - '@mui/base': - specifier: 5.0.0-beta.34 - version: 5.0.0-beta.34(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) '@nxg-org/mineflayer-auto-jump': - specifier: ^0.7.5 - version: 0.7.5 + specifier: ^0.7.7 + version: 0.7.7 '@nxg-org/mineflayer-tracker': specifier: ^1.2.1 version: 1.2.1 @@ -1694,13 +1691,6 @@ packages: dependencies: regenerator-runtime: 0.14.0 - /@babel/runtime@7.23.9: - resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.0 - dev: false - /@babel/template@7.22.5: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} @@ -2580,25 +2570,12 @@ packages: dependencies: '@floating-ui/utils': 0.1.6 - /@floating-ui/core@1.6.0: - resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} - dependencies: - '@floating-ui/utils': 0.2.1 - dev: false - /@floating-ui/dom@1.5.3: resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} dependencies: '@floating-ui/core': 1.5.0 '@floating-ui/utils': 0.1.6 - /@floating-ui/dom@1.6.1: - resolution: {integrity: sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==} - dependencies: - '@floating-ui/core': 1.6.0 - '@floating-ui/utils': 0.2.1 - dev: false - /@floating-ui/react-dom@2.0.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==} peerDependencies: @@ -2609,17 +2586,6 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} - peerDependencies: - react: ^18.2.0 - react-dom: '>=16.8.0' - dependencies: - '@floating-ui/dom': 1.6.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - /@floating-ui/react@0.26.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-5gyJIJ2tZOPMgmZ/vEcVhdmQiy75b7LPO71sYIiDsxGcZ4hxLuygQWCuT0YXHqppt//Eese+L6t5KnX/gZ3tVA==} peerDependencies: @@ -2636,10 +2602,6 @@ packages: /@floating-ui/utils@0.1.6: resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} - /@floating-ui/utils@0.2.1: - resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} - dev: false - /@gar/promisify@1.1.3: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} requiresBuild: true @@ -3242,58 +3204,6 @@ packages: engines: {node: '>= 10'} dev: false - /@mui/base@5.0.0-beta.34(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-e2mbTGTtReD/y5RFwnhkl1Tgl3XwgJhY040IlfkTVaU9f5LWrVhEnpRsYXu3B1CtLrwiWs4cu7aMHV9yRd4jpw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^18.2.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.9 - '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) - '@mui/types': 7.2.13(@types/react@18.2.20) - '@mui/utils': 5.15.7(@types/react@18.2.20)(react@18.2.0) - '@popperjs/core': 2.11.8 - '@types/react': 18.2.20 - clsx: 2.1.0 - prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@mui/types@7.2.13(@types/react@18.2.20): - resolution: {integrity: sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.20 - dev: false - - /@mui/utils@5.15.7(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-8qhsxQRNV6aEOjjSk6YQIYJxkF5klhj8oG1FEEU4z6HV78TjNqRxMP08QGcdsibEbez+nihAaz6vu83b4XqbAg==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.23.9 - '@types/prop-types': 15.7.11 - '@types/react': 18.2.20 - prop-types: 15.8.1 - react: 18.2.0 - react-is: 18.2.0 - dev: false - /@ndelangen/get-tarball@3.0.9: resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} dependencies: @@ -3344,8 +3254,8 @@ packages: dev: false optional: true - /@nxg-org/mineflayer-auto-jump@0.7.5: - resolution: {integrity: sha512-wvPLPW06nxz9/WimNdReF41I6mSQcxAcJFFBmN9geaSdnPkr8GVxq6daJSDwXXktNsh8/NBusJhMkJGh6eNnZg==} + /@nxg-org/mineflayer-auto-jump@0.7.7: + resolution: {integrity: sha512-50FYsz5rxBuLzOh7wqmg9iN9zdVGD+QjuaPcw/mD7q8Bq6Bq+o1/DfXfpoNGIHaDag80q6FJSpc73MI3Scid8g==} dependencies: '@nxg-org/mineflayer-physics-util': 1.5.8 strict-event-emitter-types: 2.0.0 @@ -5238,10 +5148,6 @@ packages: resolution: {integrity: sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==} dev: true - /@types/prop-types@15.7.11: - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - dev: false - /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} @@ -6931,11 +6837,6 @@ packages: engines: {node: '>=6'} dev: false - /clsx@2.1.0: - resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} - engines: {node: '>=6'} - dev: false - /color-convert@0.5.3: resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==} dev: false @@ -13117,6 +13018,7 @@ packages: /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true /react-popper@2.3.0(@popperjs/core@2.11.8)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==} From 9a8ff32f5ac1bdbfa486cd2a32d2ca2fe11ac22c Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 17 Apr 2024 05:34:20 +0300 Subject: [PATCH 0122/1195] a few minor but important world renderer fixes & impr --- cypress.config.ts | 23 ++++++++++++++++++- prismarine-viewer/viewer/lib/mesher/mesher.ts | 5 ++++ prismarine-viewer/viewer/lib/mesher/world.ts | 2 +- prismarine-viewer/viewer/lib/viewer.ts | 1 + prismarine-viewer/viewer/lib/viewerWrapper.ts | 6 +---- .../viewer/lib/worldrendererCommon.ts | 8 +++++++ .../viewer/lib/worldrendererThree.ts | 7 ++++++ src/index.ts | 10 ++++++-- src/soundSystem.ts | 1 - src/utils.ts | 12 ++++++++-- 10 files changed, 63 insertions(+), 12 deletions(-) diff --git a/cypress.config.ts b/cypress.config.ts index ae01d42f..f9bd9478 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -6,7 +6,28 @@ export default defineConfig({ e2e: { // We've imported your old cypress plugins here. // You may want to clean this up later by importing these. - setupNodeEvents(on, config) { + setupNodeEvents (on, config) { + // https://medium.com/automation-with-donald/get-memory-consumption-of-web-app-with-cypress-84e2656e5a0f + on('before:browser:launch', (browser = { + name: "", + family: "chromium", + channel: "", + displayName: "", + version: "", + majorVersion: "", + path: "", + isHeaded: false, + isHeadless: false + }, launchOptions) => { + if (browser.family === 'chromium' && browser.name !== 'electron') { + // auto open devtools + launchOptions.args.push('--enable-precise-memory-info') + } + + return launchOptions + + }) + return require('./cypress/plugins/index.js')(on, config) }, baseUrl: 'http://localhost:8080', diff --git a/prismarine-viewer/viewer/lib/mesher/mesher.ts b/prismarine-viewer/viewer/lib/mesher/mesher.ts index a51b2da7..28859a3e 100644 --- a/prismarine-viewer/viewer/lib/mesher/mesher.ts +++ b/prismarine-viewer/viewer/lib/mesher/mesher.ts @@ -38,6 +38,10 @@ function setSectionDirty (pos, value = true) { } } +const softCleanup = () => { + world.blockCache = {} +} + self.onmessage = ({ data }) => { const globalVar: any = globalThis @@ -58,6 +62,7 @@ self.onmessage = ({ data }) => { world.addColumn(data.x, data.z, data.chunk) } else if (data.type === 'unloadChunk') { world.removeColumn(data.x, data.z) + if (Object.keys(world.columns).length === 0) softCleanup() } else if (data.type === 'blockUpdate') { const loc = new Vec3(data.pos.x, data.pos.y, data.pos.z).floored() world.setBlockStateId(loc, data.stateId) diff --git a/prismarine-viewer/viewer/lib/mesher/world.ts b/prismarine-viewer/viewer/lib/mesher/world.ts index eebe8cc7..c27d2b8d 100644 --- a/prismarine-viewer/viewer/lib/mesher/world.ts +++ b/prismarine-viewer/viewer/lib/mesher/world.ts @@ -127,8 +127,8 @@ export class World { // todo export in chunk instead const hasChunkSection = (column, pos) => { if (column._getSection) return column._getSection(pos) - if (column.sections) return column.sections[pos.y >> 4] if (column.skyLightSections) return column.skyLightSections[getLightSectionIndex(pos, column.minY)] + if (column.sections) return column.sections[pos.y >> 4] } function posInChunk (pos) { diff --git a/prismarine-viewer/viewer/lib/viewer.ts b/prismarine-viewer/viewer/lib/viewer.ts index f0c7e79b..85c15719 100644 --- a/prismarine-viewer/viewer/lib/viewer.ts +++ b/prismarine-viewer/viewer/lib/viewer.ts @@ -168,6 +168,7 @@ export class Viewer { emitter.on('renderDistance', (d) => { this.world.viewDistance = d this.world.chunksLength = d === 0 ? 1 : generateSpiralMatrix(d).length + this.world.allChunksFinished = Object.keys(this.world.finishedChunks).length === this.world.chunksLength }) emitter.on('updateLight', ({ pos }) => { diff --git a/prismarine-viewer/viewer/lib/viewerWrapper.ts b/prismarine-viewer/viewer/lib/viewerWrapper.ts index 43604231..c6419dff 100644 --- a/prismarine-viewer/viewer/lib/viewerWrapper.ts +++ b/prismarine-viewer/viewer/lib/viewerWrapper.ts @@ -111,10 +111,6 @@ export class ViewerWrapper { if (this.renderer) { this.renderer.setSize(width, height) } - // canvas updated by renderer - - // if (viewer.composer) { - // viewer.updateComposerSize() - // } + viewer.world.handleResize() } } diff --git a/prismarine-viewer/viewer/lib/worldrendererCommon.ts b/prismarine-viewer/viewer/lib/worldrendererCommon.ts index 7e4d5cab..08dfa2c7 100644 --- a/prismarine-viewer/viewer/lib/worldrendererCommon.ts +++ b/prismarine-viewer/viewer/lib/worldrendererCommon.ts @@ -40,6 +40,8 @@ export abstract class WorldRendererCommon skyLight = 15 smoothLighting = true enableLighting = true + allChunksFinished = false + handleResize = () => { } abstract outputFormat: 'threeJs' | 'webgl' @@ -76,6 +78,7 @@ export abstract class WorldRendererCommon const allFinished = Object.keys(this.finishedChunks).length === this.chunksLength if (allFinished) { this.allChunksLoaded?.() + this.allChunksFinished = true } } @@ -127,6 +130,8 @@ export abstract class WorldRendererCommon this.active = false this.loadedChunks = {} this.sectionsOutstanding = new Map() + this.finishedChunks = {} + this.allChunksFinished = false for (const worker of this.workers) { worker.postMessage({ type: 'reset' }) } @@ -198,6 +203,8 @@ export abstract class WorldRendererCommon for (const worker of this.workers) { worker.postMessage({ type: 'unloadChunk', x, z }) } + this.allChunksFinished = Object.keys(this.finishedChunks).length === this.chunksLength + delete this.finishedChunks[`${x},${z}`] } setBlockStateId (pos: Vec3, stateId: number) { @@ -215,6 +222,7 @@ export abstract class WorldRendererCommon setSectionDirty (pos: Vec3, value = true) { if (this.viewDistance === -1) throw new Error('viewDistance not set') + this.allChunksFinished = false const distance = this.getDistance(pos) if (distance[0] > this.viewDistance || distance[1] > this.viewDistance) return const key = `${Math.floor(pos.x / 16) * 16},${Math.floor(pos.y / 16) * 16},${Math.floor(pos.z / 16) * 16}` diff --git a/prismarine-viewer/viewer/lib/worldrendererThree.ts b/prismarine-viewer/viewer/lib/worldrendererThree.ts index 0e9c7982..05d9a76f 100644 --- a/prismarine-viewer/viewer/lib/worldrendererThree.ts +++ b/prismarine-viewer/viewer/lib/worldrendererThree.ts @@ -7,6 +7,7 @@ import { renderSign } from '../sign-renderer/' import { chunkPos, sectionPos } from './simpleUtils' import { WorldRendererCommon } from './worldrendererCommon' import * as tweenJs from '@tweenjs/tween.js' +import { BloomPass, RenderPass, UnrealBloomPass, EffectComposer, WaterPass, GlitchPass } from 'three-stdlib' function mod (x, n) { return ((x % n) + n) % n @@ -20,6 +21,10 @@ export class WorldRendererThree extends WorldRendererCommon { chunkTextures = new Map() signsCache = new Map() + get tilesRendered () { + return Object.values(this.sectionObjects).reduce((acc, obj) => acc + (obj as any).tilesCount, 0) + } + constructor(public scene: THREE.Scene, public renderer: THREE.WebGLRenderer, public camera: THREE.PerspectiveCamera, numWorkers = 4) { super(numWorkers) } @@ -87,6 +92,8 @@ export class WorldRendererThree extends WorldRendererCommon { boxHelper.name = 'helper' object.add(boxHelper) object.name = 'chunk' + //@ts-ignore + object.tilesCount = data.geometry.positions.length / 3 / 4 if (!this.showChunkBorders) { boxHelper.visible = false } diff --git a/src/index.ts b/src/index.ts index 0476a665..c6981fd3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -759,8 +759,14 @@ async function connect (connectOptions: { if (appStatusState.isError) return setLoadingScreenStatus(undefined) - void viewer.waitForChunksToRender().then(() => { - console.log('All done and ready!') + const start = Date.now() + let done = false + void viewer.world.renderUpdateEmitter.on('update', () => { + // todo might not emit as servers simply don't send chunk if it's empty + if (!viewer.world.allChunksFinished || done) return + done = true + console.log('All done and ready! In', (Date.now() - start) / 1000, 's') + viewer.render() // ensure the last state is rendered document.dispatchEvent(new Event('cypress-world-ready')) }) }) diff --git a/src/soundSystem.ts b/src/soundSystem.ts index 09c87d4b..e48f8e60 100644 --- a/src/soundSystem.ts +++ b/src/soundSystem.ts @@ -40,7 +40,6 @@ subscribeKey(miscUiState, 'gameLoaded', async () => { return } if (!options.volume) return - console.debug('play sound', soundId) const parts = soundString.split(';') const soundVolume = +parts[0]! const soundName = parts[1]! diff --git a/src/utils.ts b/src/utils.ts index 39bf940e..fc73514c 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -161,11 +161,19 @@ let prevRenderDistance = options.renderDistance export const setRenderDistance = () => { assertDefined(worldView) const { renderDistance: singleplayerRenderDistance, multiplayerRenderDistance } = options - const renderDistance = miscUiState.singleplayer ? singleplayerRenderDistance : multiplayerRenderDistance + let renderDistance = miscUiState.singleplayer ? singleplayerRenderDistance : multiplayerRenderDistance + const zeroRenderDistance = miscUiState.singleplayer && renderDistance === 0 + if (zeroRenderDistance) { + renderDistance = 1 // mineflayer limitation workaround + } bot.setSettings({ viewDistance: renderDistance }) - worldView.viewDistance = renderDistance + if (zeroRenderDistance) { + localServer!.players[0].view = 0 + renderDistance = 0 + } + worldView.updateViewDistance(renderDistance) prevRenderDistance = renderDistance } export const reloadChunks = async () => { From dd3c3310071c05d9b8bb9b225be658ed297a57cd Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 17 Apr 2024 07:24:40 +0300 Subject: [PATCH 0123/1195] fix: super critical performance fix for some blocks like snow/soul sand chore: finally a convenient way to debug mesher, now covered by test --- package.json | 3 +- pnpm-lock.yaml | 53 +++++++++++-------- prismarine-viewer/viewer/lib/mesher/models.ts | 42 ++++++++++++--- .../viewer/lib/mesher/test/mesherTester.ts | 53 +++++++++++++++++++ .../viewer/lib/mesher/test/playground.ts | 17 ++++++ .../viewer/lib/mesher/test/tests.test.ts | 48 +++++++++++++++++ server.js | 6 +++ vitest.config.ts | 1 + 8 files changed, 195 insertions(+), 28 deletions(-) create mode 100644 prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts create mode 100644 prismarine-viewer/viewer/lib/mesher/test/playground.ts create mode 100644 prismarine-viewer/viewer/lib/mesher/test/tests.test.ts diff --git a/package.json b/package.json index 6513fbeb..5eafb8f5 100644 --- a/package.json +++ b/package.json @@ -150,7 +150,8 @@ "minecraft-data": "3.62.0", "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", "minecraft-protocol": "github:zardoy/minecraft-protocol#everything", - "react": "^18.2.0" + "react": "^18.2.0", + "prismarine-chunk": "github:zardoy/prismarine-chunk" }, "updateConfig": { "ignoreDependencies": [] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a0348616..6d448375 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,7 @@ overrides: prismarine-provider-anvil: github:zardoy/prismarine-provider-anvil#everything minecraft-protocol: github:zardoy/minecraft-protocol#everything react: ^18.2.0 + prismarine-chunk: github:zardoy/prismarine-chunk importers: @@ -94,6 +95,9 @@ importers: google-drive-browserfs: specifier: github:zardoy/browserfs#google-drive version: github.com/zardoy/browserfs/ab58ae8ef00e3a31db01909e365e6cb5188436e0 + gsap: + specifier: ^3.12.5 + version: 3.12.5 iconify-icon: specifier: ^1.0.8 version: 1.0.8 @@ -367,8 +371,8 @@ importers: specifier: github:zardoy/prismarine-block#next-era version: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chunk: - specifier: ^1.22.0 - version: 1.35.0(minecraft-data@3.62.0) + specifier: github:zardoy/prismarine-chunk + version: github.com/zardoy/prismarine-chunk/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b(minecraft-data@3.62.0) prismarine-schematic: specifier: ^1.2.0 version: 1.2.3 @@ -5645,7 +5649,7 @@ packages: needle: 2.9.1 node-gzip: 1.1.2 node-rsa: 1.1.1 - prismarine-chunk: 1.35.0(minecraft-data@3.62.0) + prismarine-chunk: github.com/zardoy/prismarine-chunk/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b(minecraft-data@3.62.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 @@ -9398,6 +9402,10 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true + /gsap@3.12.5: + resolution: {integrity: sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ==} + dev: false + /gunzip-maybe@1.4.2: resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} hasBin: true @@ -12457,21 +12465,6 @@ packages: prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 - /prismarine-chunk@1.35.0(minecraft-data@3.62.0): - resolution: {integrity: sha512-Q1lElMUle7wWxWdQjbZo3j2/dLNG325j90IcbbMmBTnHdQSWIjWFe792XOz3RVBlvrhRJEiZk38S6/eQTQ9esw==} - engines: {node: '>=14'} - dependencies: - prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) - prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 - prismarine-nbt: 2.2.1 - prismarine-registry: 1.7.0 - smart-buffer: 4.2.0 - uint4: 0.1.2 - vec3: 0.1.8 - xxhash-wasm: 0.4.2 - transitivePeerDependencies: - - minecraft-data - /prismarine-entity@2.3.1: resolution: {integrity: sha512-HOv8l7IetHNf4hwZ7V/W4vM3GNl+e6VCtKDkH9h02TRq7jWngsggKtJV+VanCce/sNwtJUhJDjORGs728ep4MA==} dependencies: @@ -16083,7 +16076,7 @@ packages: prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chat: 1.9.1 - prismarine-chunk: 1.35.0(minecraft-data@3.62.0) + prismarine-chunk: github.com/zardoy/prismarine-chunk/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b(minecraft-data@3.62.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 @@ -16128,7 +16121,7 @@ packages: version: 1.3.0 dependencies: minecraft-data: 3.62.0 - prismarine-chunk: 1.35.0(minecraft-data@3.62.0) + prismarine-chunk: github.com/zardoy/prismarine-chunk/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b(minecraft-data@3.62.0) random-seed: 0.3.0 vec3: 0.1.8 dev: false @@ -16185,13 +16178,31 @@ packages: prismarine-nbt: 2.2.1 prismarine-registry: 1.7.0 + github.com/zardoy/prismarine-chunk/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b(minecraft-data@3.62.0): + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b} + id: github.com/zardoy/prismarine-chunk/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b + name: prismarine-chunk + version: 1.35.0 + engines: {node: '>=14'} + dependencies: + prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) + prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + prismarine-nbt: 2.5.0 + prismarine-registry: 1.7.0 + smart-buffer: 4.2.0 + uint4: 0.1.2 + vec3: 0.1.8 + xxhash-wasm: 0.4.2 + transitivePeerDependencies: + - minecraft-data + github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0): resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f} id: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f name: prismarine-provider-anvil version: 2.7.0 dependencies: - prismarine-chunk: 1.35.0(minecraft-data@3.62.0) + prismarine-chunk: github.com/zardoy/prismarine-chunk/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b(minecraft-data@3.62.0) prismarine-nbt: 2.5.0 uint4: 0.1.2 vec3: 0.1.8 diff --git a/prismarine-viewer/viewer/lib/mesher/models.ts b/prismarine-viewer/viewer/lib/mesher/models.ts index c6f35f31..9b3a1ecd 100644 --- a/prismarine-viewer/viewer/lib/mesher/models.ts +++ b/prismarine-viewer/viewer/lib/mesher/models.ts @@ -5,6 +5,7 @@ import { Block } from 'prismarine-block' const tints: any = {} let blockStates: BlockStatesOutput +let needTiles = false let tintsData try { @@ -118,6 +119,15 @@ function getLiquidRenderHeight (world, block, type, pos) { return ((block.metadata >= 8 ? 8 : 7 - block.metadata) + 1) / 9 } +const isCube = (block) => { + if (!block) return false + if (block.isCube) return true + if (!block.variant) block.variant = getModelVariants(block) + return block.variant.every(v => v?.model?.elements.every(e => { + return e.from[0] === 0 && e.from[1] === 0 && e.from[2] === 0 && e.to[0] === 16 && e.to[1] === 16 && e.to[2] === 16 + })) +} + function renderLiquid (world, cursor, texture, type, biome, water, attr) { const heights: number[] = [] for (let z = -1; z <= 1; z++) { @@ -140,7 +150,7 @@ function renderLiquid (world, cursor, texture, type, biome, water, attr) { const neighbor = world.getBlock(cursor.offset(...dir)) if (!neighbor) continue if (neighbor.type === type) continue - if ((neighbor.isCube && !isUp) || neighbor.material === 'plant' || neighbor.getProperties().waterlogged) continue + if ((isCube(neighbor) && !isUp) || neighbor.material === 'plant' || neighbor.getProperties().waterlogged) continue let tint = [1, 1, 1] if (water) { @@ -238,6 +248,8 @@ function buildRotationMatrix (axis, degree) { return matrix } +let needRecompute = false + function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr, globalMatrix, globalShift, block: Block, biome) { const position = cursor // const key = `${position.x},${position.y},${position.z}` @@ -253,9 +265,9 @@ function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr const neighbor = world.getBlock(cursor.plus(new Vec3(...dir))) if (neighbor) { if (cullIfIdentical && neighbor.type === block.type) continue - if (!neighbor.transparent && neighbor.isCube) continue + if (!neighbor.transparent && isCube(neighbor)) continue } else { - continue + needRecompute = true } } @@ -378,6 +390,18 @@ function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr attr.colors.push(baseLight * tint[0] * light, baseLight * tint[1] * light, baseLight * tint[2] * light) } + if (needTiles) { + attr.tiles[`${cursor.x},${cursor.y},${cursor.z}`] ??= { + block: block.name, + faces: [], + } + attr.tiles[`${cursor.x},${cursor.y},${cursor.z}`].faces.push({ + face, + neighbor: `${neighborPos.x},${neighborPos.y},${neighborPos.z}`, + // texture: eFace.texture.name, + }) + } + if (doAO && aos[0] + aos[3] >= aos[1] + aos[2]) { attr.indices.push( ndx, ndx + 3, ndx + 2, @@ -406,6 +430,7 @@ export function getSectionGeometry (sx, sy, sz, world: World) { t_colors: [], t_uvs: [], indices: [], + tiles: {}, // todo this can be removed here signs: {} } as Record @@ -438,11 +463,15 @@ export function getSectionGeometry (sx, sy, sz, world: World) { for (const variant of block.variant) { if (!variant || !variant.model) continue - if (block.name === 'water') { + const isWaterlogged = block.getProperties().waterlogged + if (block.name === 'water' || isWaterlogged) { + const waterBlock = block.name === 'water' ? block : { name: 'water', metadata: 0 } + const variant = getModelVariants(waterBlock as any)[0] renderLiquid(world, cursor, variant.model.textures.particle, block.type, biome, true, attr) } else if (block.name === 'lava') { renderLiquid(world, cursor, variant.model.textures.particle, block.type, biome, false, attr) - } else { + } + if (block.name !== "water") { let globalMatrix = null as any let globalShift = null as any @@ -555,6 +584,7 @@ function getModelVariants (block: import('prismarine-block').Block) { return [] } -export const setRendererData = (_blockStates: BlockStatesOutput | null) => { +export const setRendererData = (_blockStates: BlockStatesOutput | null, _needTiles = false) => { blockStates = _blockStates! + needTiles = _needTiles } diff --git a/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts b/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts new file mode 100644 index 00000000..15ec165b --- /dev/null +++ b/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts @@ -0,0 +1,53 @@ +import { setRendererData, getSectionGeometry } from '../models' +import { World as MesherWorld } from '../world' +import ChunkLoader from 'prismarine-chunk' +import { Vec3 } from 'vec3' +import MinecraftData from 'minecraft-data' + +export const setup = (version, initialBlocks: [number[], string][]) => { + const mcData = MinecraftData(version) + const blockStates = require(`../../../../public/blocksStates/${version}.json`) + const mesherWorld = new MesherWorld(version) + const Chunk = ChunkLoader(version) + const chunk1 = new Chunk(undefined as any) + + const pos = new Vec3(2, 5, 2) + for (const [addPos, name] of initialBlocks) { + chunk1.setBlockStateId(pos.offset(addPos[0], addPos[1], addPos[2]), mcData.blocksByName[name].defaultState!) + } + + const getGeometry = () => { + const sectionGeometry = getSectionGeometry(0, 0, 0, mesherWorld) + const centerFaces = sectionGeometry.tiles[`${pos.x},${pos.y},${pos.z}`]?.faces.length ?? 0 + const totalTiles = Object.values(sectionGeometry.tiles).reduce((acc, val: any) => acc + val.faces.length, 0) + const centerTileNeighbors = Object.entries(sectionGeometry.tiles).reduce((acc, [key, val]: any) => { + return acc + val.faces.filter((face: any) => face.neighbor === `${pos.x},${pos.y},${pos.z}`).length + }, 0) + return { + centerFaces, + totalTiles, + centerTileNeighbors + } + } + + setRendererData(blockStates, true) + mesherWorld.addColumn(0, 0, chunk1.toJson()) + + return { + mesherWorld, + getGeometry, + pos, + mcData + } +} + +// surround it +const addPositions = [ + // [[0, 0, 0], 'diamond_block'], + [[1, 0, 0], 'stone'], + [[-1, 0, 0], 'stone'], + [[0, 1, 0], 'stone'], + [[0, -1, 0], 'stone'], + [[0, 0, 1], 'stone'], + [[0, 0, -1], 'stone'], +] diff --git a/prismarine-viewer/viewer/lib/mesher/test/playground.ts b/prismarine-viewer/viewer/lib/mesher/test/playground.ts new file mode 100644 index 00000000..6e9e7b10 --- /dev/null +++ b/prismarine-viewer/viewer/lib/mesher/test/playground.ts @@ -0,0 +1,17 @@ +import { setup } from './mesherTester' + +const addPositions = [ + // [[0, 0, 0], 'diamond_block'], + [[1, 0, 0], 'stone'], + [[-1, 0, 0], 'stone'], + [[0, 1, 0], 'stone'], + [[0, -1, 0], 'stone'], + [[0, 0, 1], 'stone'], + [[0, 0, -1], 'stone'], +] as const + +const { mesherWorld, getGeometry, pos, mcData } = setup('1.18.1', addPositions as any) + +// mesherWorld.setBlockStateId(pos, mcData.blocksByName.soul_sand.defaultState) + +// console.log(getGeometry().centerTileNeighbors) diff --git a/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts b/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts new file mode 100644 index 00000000..67439b1d --- /dev/null +++ b/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts @@ -0,0 +1,48 @@ +import { test, expect } from 'vitest' +import { setup } from './mesherTester' + +const version = '1.18.1' + +const addPositions = [ + // [[0, 0, 0], 'diamond_block'], + [[1, 0, 0], 'stone'], + [[-1, 0, 0], 'stone'], + [[0, 1, 0], 'stone'], + [[0, -1, 0], 'stone'], + [[0, 0, 1], 'stone'], + [[0, 0, -1], 'stone'], +] as const + +test('Known blocks are not rendered', () => { + const { mesherWorld, getGeometry, pos, mcData } = setup(version, addPositions as any) + + let time = 0 + let times = 0 + const invalidBlocks = {}/* as {[number, number]} */ + for (const block of mcData.blocksArray) { + if (block.maxStateId! - block.minStateId! > 100) continue + for (let i = block.minStateId!; i <= block.maxStateId!; i++) { + if (block.transparent) continue + mesherWorld.setBlockStateId(pos, i) + const start = performance.now() + const { centerFaces, totalTiles, centerTileNeighbors } = getGeometry() + time += performance.now() - start + times++ + if (centerFaces === 0 && centerTileNeighbors !== 0) { + if (invalidBlocks[block.name]) continue + invalidBlocks[block.name] = [i - block.minStateId!, centerTileNeighbors] + // console.log('INVALID', block.name, centerTileNeighbors, i - block.minStateId) + } + } + } + console.log('Average time', time / times) + // Fully expected + expect(invalidBlocks).toMatchInlineSnapshot(` + { + "powder_snow": [ + 0, + 6, + ], + } + `) +}) diff --git a/server.js b/server.js index da40e163..d757024b 100644 --- a/server.js +++ b/server.js @@ -40,6 +40,12 @@ app.get('/config.json', (req, res, next) => { 'defaultProxy': '', // use current url (this server) }) }) +// add headers to enable shared array buffer +app.use((req, res, next) => { + res.setHeader('Cross-Origin-Opener-Policy', 'same-origin') + res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp') + next() +}) app.use(express.static(path.join(__dirname, './dist'))) const portArg = process.argv.indexOf('--port') diff --git a/vitest.config.ts b/vitest.config.ts index 9a992a52..f6d2416c 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -6,6 +6,7 @@ export default defineConfig({ include: [ '../../src/botUtils.test.ts', '../../src/markdownToFormattedText.test.ts', + 'lib/mesher/test/tests.test.ts', 'sign-renderer/tests.test.ts' ], }, From 17e13d30b12f1cbb61b7f410a920cf80f224cfb8 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 17 Apr 2024 08:03:49 +0300 Subject: [PATCH 0124/1195] add mc data types --- package.json | 2 +- scripts/genMcDataTypes.ts | 13 +++++++++++++ src/mcDataTypes.ts | 6 ++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 scripts/genMcDataTypes.ts create mode 100644 src/mcDataTypes.ts diff --git a/package.json b/package.json index 5eafb8f5..13e5cd36 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "start": "node scripts/build.js copyFilesDev && node scripts/prepareData.mjs && node esbuild.mjs --watch", "start-watch-script": "nodemon -w esbuild.mjs --watch", "build": "node scripts/build.js copyFiles && node scripts/prepareData.mjs -f && node esbuild.mjs --minify --prod", - "check-build": "tsc && pnpm test-unit && pnpm build", + "check-build": "tsc && pnpm test-unit --run && pnpm build", "test:cypress": "cypress run", "test-unit": "vitest", "test:e2e": "start-test http-get://localhost:8080 test:cypress", diff --git a/scripts/genMcDataTypes.ts b/scripts/genMcDataTypes.ts new file mode 100644 index 00000000..f5b15069 --- /dev/null +++ b/scripts/genMcDataTypes.ts @@ -0,0 +1,13 @@ +import minecraftData from 'minecraft-data' +import fs from 'fs' + +const data = minecraftData('1.20.1') + +let types = '' +types += `\nexport type BlockNames = ${Object.keys(data.blocksByName).map(blockName => `'${blockName}'`).join(' | ')};` +types += `\nexport type ItemNames = ${Object.keys(data.itemsByName).map(blockName => `'${blockName}'`).join(' | ')};` +types += `\nexport type EntityNames = ${Object.keys(data.entitiesByName).map(blockName => `'${blockName}'`).join(' | ')};` +types += `\nexport type BiomesNames = ${Object.keys(data.biomesByName).map(blockName => `'${blockName}'`).join(' | ')};` +types += `\nexport type EnchantmentNames = ${Object.keys(data.enchantmentsByName).map(blockName => `'${blockName}'`).join(' | ')};` + +fs.writeFileSync('./src/mcDataTypes.ts', types, 'utf8') diff --git a/src/mcDataTypes.ts b/src/mcDataTypes.ts new file mode 100644 index 00000000..8f4f05e3 --- /dev/null +++ b/src/mcDataTypes.ts @@ -0,0 +1,6 @@ + +export type BlockNames = 'air' | 'stone' | 'granite' | 'polished_granite' | 'diorite' | 'polished_diorite' | 'andesite' | 'polished_andesite' | 'grass_block' | 'dirt' | 'coarse_dirt' | 'podzol' | 'cobblestone' | 'oak_planks' | 'spruce_planks' | 'birch_planks' | 'jungle_planks' | 'acacia_planks' | 'cherry_planks' | 'dark_oak_planks' | 'mangrove_planks' | 'bamboo_planks' | 'bamboo_mosaic' | 'oak_sapling' | 'spruce_sapling' | 'birch_sapling' | 'jungle_sapling' | 'acacia_sapling' | 'cherry_sapling' | 'dark_oak_sapling' | 'mangrove_propagule' | 'bedrock' | 'water' | 'lava' | 'sand' | 'suspicious_sand' | 'red_sand' | 'gravel' | 'suspicious_gravel' | 'gold_ore' | 'deepslate_gold_ore' | 'iron_ore' | 'deepslate_iron_ore' | 'coal_ore' | 'deepslate_coal_ore' | 'nether_gold_ore' | 'oak_log' | 'spruce_log' | 'birch_log' | 'jungle_log' | 'acacia_log' | 'cherry_log' | 'dark_oak_log' | 'mangrove_log' | 'mangrove_roots' | 'muddy_mangrove_roots' | 'bamboo_block' | 'stripped_spruce_log' | 'stripped_birch_log' | 'stripped_jungle_log' | 'stripped_acacia_log' | 'stripped_cherry_log' | 'stripped_dark_oak_log' | 'stripped_oak_log' | 'stripped_mangrove_log' | 'stripped_bamboo_block' | 'oak_wood' | 'spruce_wood' | 'birch_wood' | 'jungle_wood' | 'acacia_wood' | 'cherry_wood' | 'dark_oak_wood' | 'mangrove_wood' | 'stripped_oak_wood' | 'stripped_spruce_wood' | 'stripped_birch_wood' | 'stripped_jungle_wood' | 'stripped_acacia_wood' | 'stripped_cherry_wood' | 'stripped_dark_oak_wood' | 'stripped_mangrove_wood' | 'oak_leaves' | 'spruce_leaves' | 'birch_leaves' | 'jungle_leaves' | 'acacia_leaves' | 'cherry_leaves' | 'dark_oak_leaves' | 'mangrove_leaves' | 'azalea_leaves' | 'flowering_azalea_leaves' | 'sponge' | 'wet_sponge' | 'glass' | 'lapis_ore' | 'deepslate_lapis_ore' | 'lapis_block' | 'dispenser' | 'sandstone' | 'chiseled_sandstone' | 'cut_sandstone' | 'note_block' | 'white_bed' | 'orange_bed' | 'magenta_bed' | 'light_blue_bed' | 'yellow_bed' | 'lime_bed' | 'pink_bed' | 'gray_bed' | 'light_gray_bed' | 'cyan_bed' | 'purple_bed' | 'blue_bed' | 'brown_bed' | 'green_bed' | 'red_bed' | 'black_bed' | 'powered_rail' | 'detector_rail' | 'sticky_piston' | 'cobweb' | 'grass' | 'fern' | 'dead_bush' | 'seagrass' | 'tall_seagrass' | 'piston' | 'piston_head' | 'white_wool' | 'orange_wool' | 'magenta_wool' | 'light_blue_wool' | 'yellow_wool' | 'lime_wool' | 'pink_wool' | 'gray_wool' | 'light_gray_wool' | 'cyan_wool' | 'purple_wool' | 'blue_wool' | 'brown_wool' | 'green_wool' | 'red_wool' | 'black_wool' | 'moving_piston' | 'dandelion' | 'torchflower' | 'poppy' | 'blue_orchid' | 'allium' | 'azure_bluet' | 'red_tulip' | 'orange_tulip' | 'white_tulip' | 'pink_tulip' | 'oxeye_daisy' | 'cornflower' | 'wither_rose' | 'lily_of_the_valley' | 'brown_mushroom' | 'red_mushroom' | 'gold_block' | 'iron_block' | 'bricks' | 'tnt' | 'bookshelf' | 'chiseled_bookshelf' | 'mossy_cobblestone' | 'obsidian' | 'torch' | 'wall_torch' | 'fire' | 'soul_fire' | 'spawner' | 'oak_stairs' | 'chest' | 'redstone_wire' | 'diamond_ore' | 'deepslate_diamond_ore' | 'diamond_block' | 'crafting_table' | 'wheat' | 'farmland' | 'furnace' | 'oak_sign' | 'spruce_sign' | 'birch_sign' | 'acacia_sign' | 'cherry_sign' | 'jungle_sign' | 'dark_oak_sign' | 'mangrove_sign' | 'bamboo_sign' | 'oak_door' | 'ladder' | 'rail' | 'cobblestone_stairs' | 'oak_wall_sign' | 'spruce_wall_sign' | 'birch_wall_sign' | 'acacia_wall_sign' | 'cherry_wall_sign' | 'jungle_wall_sign' | 'dark_oak_wall_sign' | 'mangrove_wall_sign' | 'bamboo_wall_sign' | 'oak_hanging_sign' | 'spruce_hanging_sign' | 'birch_hanging_sign' | 'acacia_hanging_sign' | 'cherry_hanging_sign' | 'jungle_hanging_sign' | 'dark_oak_hanging_sign' | 'crimson_hanging_sign' | 'warped_hanging_sign' | 'mangrove_hanging_sign' | 'bamboo_hanging_sign' | 'oak_wall_hanging_sign' | 'spruce_wall_hanging_sign' | 'birch_wall_hanging_sign' | 'acacia_wall_hanging_sign' | 'cherry_wall_hanging_sign' | 'jungle_wall_hanging_sign' | 'dark_oak_wall_hanging_sign' | 'mangrove_wall_hanging_sign' | 'crimson_wall_hanging_sign' | 'warped_wall_hanging_sign' | 'bamboo_wall_hanging_sign' | 'lever' | 'stone_pressure_plate' | 'iron_door' | 'oak_pressure_plate' | 'spruce_pressure_plate' | 'birch_pressure_plate' | 'jungle_pressure_plate' | 'acacia_pressure_plate' | 'cherry_pressure_plate' | 'dark_oak_pressure_plate' | 'mangrove_pressure_plate' | 'bamboo_pressure_plate' | 'redstone_ore' | 'deepslate_redstone_ore' | 'redstone_torch' | 'redstone_wall_torch' | 'stone_button' | 'snow' | 'ice' | 'snow_block' | 'cactus' | 'clay' | 'sugar_cane' | 'jukebox' | 'oak_fence' | 'pumpkin' | 'netherrack' | 'soul_sand' | 'soul_soil' | 'basalt' | 'polished_basalt' | 'soul_torch' | 'soul_wall_torch' | 'glowstone' | 'nether_portal' | 'carved_pumpkin' | 'jack_o_lantern' | 'cake' | 'repeater' | 'white_stained_glass' | 'orange_stained_glass' | 'magenta_stained_glass' | 'light_blue_stained_glass' | 'yellow_stained_glass' | 'lime_stained_glass' | 'pink_stained_glass' | 'gray_stained_glass' | 'light_gray_stained_glass' | 'cyan_stained_glass' | 'purple_stained_glass' | 'blue_stained_glass' | 'brown_stained_glass' | 'green_stained_glass' | 'red_stained_glass' | 'black_stained_glass' | 'oak_trapdoor' | 'spruce_trapdoor' | 'birch_trapdoor' | 'jungle_trapdoor' | 'acacia_trapdoor' | 'cherry_trapdoor' | 'dark_oak_trapdoor' | 'mangrove_trapdoor' | 'bamboo_trapdoor' | 'stone_bricks' | 'mossy_stone_bricks' | 'cracked_stone_bricks' | 'chiseled_stone_bricks' | 'packed_mud' | 'mud_bricks' | 'infested_stone' | 'infested_cobblestone' | 'infested_stone_bricks' | 'infested_mossy_stone_bricks' | 'infested_cracked_stone_bricks' | 'infested_chiseled_stone_bricks' | 'brown_mushroom_block' | 'red_mushroom_block' | 'mushroom_stem' | 'iron_bars' | 'chain' | 'glass_pane' | 'melon' | 'attached_pumpkin_stem' | 'attached_melon_stem' | 'pumpkin_stem' | 'melon_stem' | 'vine' | 'glow_lichen' | 'oak_fence_gate' | 'brick_stairs' | 'stone_brick_stairs' | 'mud_brick_stairs' | 'mycelium' | 'lily_pad' | 'nether_bricks' | 'nether_brick_fence' | 'nether_brick_stairs' | 'nether_wart' | 'enchanting_table' | 'brewing_stand' | 'cauldron' | 'water_cauldron' | 'lava_cauldron' | 'powder_snow_cauldron' | 'end_portal' | 'end_portal_frame' | 'end_stone' | 'dragon_egg' | 'redstone_lamp' | 'cocoa' | 'sandstone_stairs' | 'emerald_ore' | 'deepslate_emerald_ore' | 'ender_chest' | 'tripwire_hook' | 'tripwire' | 'emerald_block' | 'spruce_stairs' | 'birch_stairs' | 'jungle_stairs' | 'command_block' | 'beacon' | 'cobblestone_wall' | 'mossy_cobblestone_wall' | 'flower_pot' | 'potted_torchflower' | 'potted_oak_sapling' | 'potted_spruce_sapling' | 'potted_birch_sapling' | 'potted_jungle_sapling' | 'potted_acacia_sapling' | 'potted_cherry_sapling' | 'potted_dark_oak_sapling' | 'potted_mangrove_propagule' | 'potted_fern' | 'potted_dandelion' | 'potted_poppy' | 'potted_blue_orchid' | 'potted_allium' | 'potted_azure_bluet' | 'potted_red_tulip' | 'potted_orange_tulip' | 'potted_white_tulip' | 'potted_pink_tulip' | 'potted_oxeye_daisy' | 'potted_cornflower' | 'potted_lily_of_the_valley' | 'potted_wither_rose' | 'potted_red_mushroom' | 'potted_brown_mushroom' | 'potted_dead_bush' | 'potted_cactus' | 'carrots' | 'potatoes' | 'oak_button' | 'spruce_button' | 'birch_button' | 'jungle_button' | 'acacia_button' | 'cherry_button' | 'dark_oak_button' | 'mangrove_button' | 'bamboo_button' | 'skeleton_skull' | 'skeleton_wall_skull' | 'wither_skeleton_skull' | 'wither_skeleton_wall_skull' | 'zombie_head' | 'zombie_wall_head' | 'player_head' | 'player_wall_head' | 'creeper_head' | 'creeper_wall_head' | 'dragon_head' | 'dragon_wall_head' | 'piglin_head' | 'piglin_wall_head' | 'anvil' | 'chipped_anvil' | 'damaged_anvil' | 'trapped_chest' | 'light_weighted_pressure_plate' | 'heavy_weighted_pressure_plate' | 'comparator' | 'daylight_detector' | 'redstone_block' | 'nether_quartz_ore' | 'hopper' | 'quartz_block' | 'chiseled_quartz_block' | 'quartz_pillar' | 'quartz_stairs' | 'activator_rail' | 'dropper' | 'white_terracotta' | 'orange_terracotta' | 'magenta_terracotta' | 'light_blue_terracotta' | 'yellow_terracotta' | 'lime_terracotta' | 'pink_terracotta' | 'gray_terracotta' | 'light_gray_terracotta' | 'cyan_terracotta' | 'purple_terracotta' | 'blue_terracotta' | 'brown_terracotta' | 'green_terracotta' | 'red_terracotta' | 'black_terracotta' | 'white_stained_glass_pane' | 'orange_stained_glass_pane' | 'magenta_stained_glass_pane' | 'light_blue_stained_glass_pane' | 'yellow_stained_glass_pane' | 'lime_stained_glass_pane' | 'pink_stained_glass_pane' | 'gray_stained_glass_pane' | 'light_gray_stained_glass_pane' | 'cyan_stained_glass_pane' | 'purple_stained_glass_pane' | 'blue_stained_glass_pane' | 'brown_stained_glass_pane' | 'green_stained_glass_pane' | 'red_stained_glass_pane' | 'black_stained_glass_pane' | 'acacia_stairs' | 'cherry_stairs' | 'dark_oak_stairs' | 'mangrove_stairs' | 'bamboo_stairs' | 'bamboo_mosaic_stairs' | 'slime_block' | 'barrier' | 'light' | 'iron_trapdoor' | 'prismarine' | 'prismarine_bricks' | 'dark_prismarine' | 'prismarine_stairs' | 'prismarine_brick_stairs' | 'dark_prismarine_stairs' | 'prismarine_slab' | 'prismarine_brick_slab' | 'dark_prismarine_slab' | 'sea_lantern' | 'hay_block' | 'white_carpet' | 'orange_carpet' | 'magenta_carpet' | 'light_blue_carpet' | 'yellow_carpet' | 'lime_carpet' | 'pink_carpet' | 'gray_carpet' | 'light_gray_carpet' | 'cyan_carpet' | 'purple_carpet' | 'blue_carpet' | 'brown_carpet' | 'green_carpet' | 'red_carpet' | 'black_carpet' | 'terracotta' | 'coal_block' | 'packed_ice' | 'sunflower' | 'lilac' | 'rose_bush' | 'peony' | 'tall_grass' | 'large_fern' | 'white_banner' | 'orange_banner' | 'magenta_banner' | 'light_blue_banner' | 'yellow_banner' | 'lime_banner' | 'pink_banner' | 'gray_banner' | 'light_gray_banner' | 'cyan_banner' | 'purple_banner' | 'blue_banner' | 'brown_banner' | 'green_banner' | 'red_banner' | 'black_banner' | 'white_wall_banner' | 'orange_wall_banner' | 'magenta_wall_banner' | 'light_blue_wall_banner' | 'yellow_wall_banner' | 'lime_wall_banner' | 'pink_wall_banner' | 'gray_wall_banner' | 'light_gray_wall_banner' | 'cyan_wall_banner' | 'purple_wall_banner' | 'blue_wall_banner' | 'brown_wall_banner' | 'green_wall_banner' | 'red_wall_banner' | 'black_wall_banner' | 'red_sandstone' | 'chiseled_red_sandstone' | 'cut_red_sandstone' | 'red_sandstone_stairs' | 'oak_slab' | 'spruce_slab' | 'birch_slab' | 'jungle_slab' | 'acacia_slab' | 'cherry_slab' | 'dark_oak_slab' | 'mangrove_slab' | 'bamboo_slab' | 'bamboo_mosaic_slab' | 'stone_slab' | 'smooth_stone_slab' | 'sandstone_slab' | 'cut_sandstone_slab' | 'petrified_oak_slab' | 'cobblestone_slab' | 'brick_slab' | 'stone_brick_slab' | 'mud_brick_slab' | 'nether_brick_slab' | 'quartz_slab' | 'red_sandstone_slab' | 'cut_red_sandstone_slab' | 'purpur_slab' | 'smooth_stone' | 'smooth_sandstone' | 'smooth_quartz' | 'smooth_red_sandstone' | 'spruce_fence_gate' | 'birch_fence_gate' | 'jungle_fence_gate' | 'acacia_fence_gate' | 'cherry_fence_gate' | 'dark_oak_fence_gate' | 'mangrove_fence_gate' | 'bamboo_fence_gate' | 'spruce_fence' | 'birch_fence' | 'jungle_fence' | 'acacia_fence' | 'cherry_fence' | 'dark_oak_fence' | 'mangrove_fence' | 'bamboo_fence' | 'spruce_door' | 'birch_door' | 'jungle_door' | 'acacia_door' | 'cherry_door' | 'dark_oak_door' | 'mangrove_door' | 'bamboo_door' | 'end_rod' | 'chorus_plant' | 'chorus_flower' | 'purpur_block' | 'purpur_pillar' | 'purpur_stairs' | 'end_stone_bricks' | 'torchflower_crop' | 'pitcher_crop' | 'pitcher_plant' | 'beetroots' | 'dirt_path' | 'end_gateway' | 'repeating_command_block' | 'chain_command_block' | 'frosted_ice' | 'magma_block' | 'nether_wart_block' | 'red_nether_bricks' | 'bone_block' | 'structure_void' | 'observer' | 'shulker_box' | 'white_shulker_box' | 'orange_shulker_box' | 'magenta_shulker_box' | 'light_blue_shulker_box' | 'yellow_shulker_box' | 'lime_shulker_box' | 'pink_shulker_box' | 'gray_shulker_box' | 'light_gray_shulker_box' | 'cyan_shulker_box' | 'purple_shulker_box' | 'blue_shulker_box' | 'brown_shulker_box' | 'green_shulker_box' | 'red_shulker_box' | 'black_shulker_box' | 'white_glazed_terracotta' | 'orange_glazed_terracotta' | 'magenta_glazed_terracotta' | 'light_blue_glazed_terracotta' | 'yellow_glazed_terracotta' | 'lime_glazed_terracotta' | 'pink_glazed_terracotta' | 'gray_glazed_terracotta' | 'light_gray_glazed_terracotta' | 'cyan_glazed_terracotta' | 'purple_glazed_terracotta' | 'blue_glazed_terracotta' | 'brown_glazed_terracotta' | 'green_glazed_terracotta' | 'red_glazed_terracotta' | 'black_glazed_terracotta' | 'white_concrete' | 'orange_concrete' | 'magenta_concrete' | 'light_blue_concrete' | 'yellow_concrete' | 'lime_concrete' | 'pink_concrete' | 'gray_concrete' | 'light_gray_concrete' | 'cyan_concrete' | 'purple_concrete' | 'blue_concrete' | 'brown_concrete' | 'green_concrete' | 'red_concrete' | 'black_concrete' | 'white_concrete_powder' | 'orange_concrete_powder' | 'magenta_concrete_powder' | 'light_blue_concrete_powder' | 'yellow_concrete_powder' | 'lime_concrete_powder' | 'pink_concrete_powder' | 'gray_concrete_powder' | 'light_gray_concrete_powder' | 'cyan_concrete_powder' | 'purple_concrete_powder' | 'blue_concrete_powder' | 'brown_concrete_powder' | 'green_concrete_powder' | 'red_concrete_powder' | 'black_concrete_powder' | 'kelp' | 'kelp_plant' | 'dried_kelp_block' | 'turtle_egg' | 'sniffer_egg' | 'dead_tube_coral_block' | 'dead_brain_coral_block' | 'dead_bubble_coral_block' | 'dead_fire_coral_block' | 'dead_horn_coral_block' | 'tube_coral_block' | 'brain_coral_block' | 'bubble_coral_block' | 'fire_coral_block' | 'horn_coral_block' | 'dead_tube_coral' | 'dead_brain_coral' | 'dead_bubble_coral' | 'dead_fire_coral' | 'dead_horn_coral' | 'tube_coral' | 'brain_coral' | 'bubble_coral' | 'fire_coral' | 'horn_coral' | 'dead_tube_coral_fan' | 'dead_brain_coral_fan' | 'dead_bubble_coral_fan' | 'dead_fire_coral_fan' | 'dead_horn_coral_fan' | 'tube_coral_fan' | 'brain_coral_fan' | 'bubble_coral_fan' | 'fire_coral_fan' | 'horn_coral_fan' | 'dead_tube_coral_wall_fan' | 'dead_brain_coral_wall_fan' | 'dead_bubble_coral_wall_fan' | 'dead_fire_coral_wall_fan' | 'dead_horn_coral_wall_fan' | 'tube_coral_wall_fan' | 'brain_coral_wall_fan' | 'bubble_coral_wall_fan' | 'fire_coral_wall_fan' | 'horn_coral_wall_fan' | 'sea_pickle' | 'blue_ice' | 'conduit' | 'bamboo_sapling' | 'bamboo' | 'potted_bamboo' | 'void_air' | 'cave_air' | 'bubble_column' | 'polished_granite_stairs' | 'smooth_red_sandstone_stairs' | 'mossy_stone_brick_stairs' | 'polished_diorite_stairs' | 'mossy_cobblestone_stairs' | 'end_stone_brick_stairs' | 'stone_stairs' | 'smooth_sandstone_stairs' | 'smooth_quartz_stairs' | 'granite_stairs' | 'andesite_stairs' | 'red_nether_brick_stairs' | 'polished_andesite_stairs' | 'diorite_stairs' | 'polished_granite_slab' | 'smooth_red_sandstone_slab' | 'mossy_stone_brick_slab' | 'polished_diorite_slab' | 'mossy_cobblestone_slab' | 'end_stone_brick_slab' | 'smooth_sandstone_slab' | 'smooth_quartz_slab' | 'granite_slab' | 'andesite_slab' | 'red_nether_brick_slab' | 'polished_andesite_slab' | 'diorite_slab' | 'brick_wall' | 'prismarine_wall' | 'red_sandstone_wall' | 'mossy_stone_brick_wall' | 'granite_wall' | 'stone_brick_wall' | 'mud_brick_wall' | 'nether_brick_wall' | 'andesite_wall' | 'red_nether_brick_wall' | 'sandstone_wall' | 'end_stone_brick_wall' | 'diorite_wall' | 'scaffolding' | 'loom' | 'barrel' | 'smoker' | 'blast_furnace' | 'cartography_table' | 'fletching_table' | 'grindstone' | 'lectern' | 'smithing_table' | 'stonecutter' | 'bell' | 'lantern' | 'soul_lantern' | 'campfire' | 'soul_campfire' | 'sweet_berry_bush' | 'warped_stem' | 'stripped_warped_stem' | 'warped_hyphae' | 'stripped_warped_hyphae' | 'warped_nylium' | 'warped_fungus' | 'warped_wart_block' | 'warped_roots' | 'nether_sprouts' | 'crimson_stem' | 'stripped_crimson_stem' | 'crimson_hyphae' | 'stripped_crimson_hyphae' | 'crimson_nylium' | 'crimson_fungus' | 'shroomlight' | 'weeping_vines' | 'weeping_vines_plant' | 'twisting_vines' | 'twisting_vines_plant' | 'crimson_roots' | 'crimson_planks' | 'warped_planks' | 'crimson_slab' | 'warped_slab' | 'crimson_pressure_plate' | 'warped_pressure_plate' | 'crimson_fence' | 'warped_fence' | 'crimson_trapdoor' | 'warped_trapdoor' | 'crimson_fence_gate' | 'warped_fence_gate' | 'crimson_stairs' | 'warped_stairs' | 'crimson_button' | 'warped_button' | 'crimson_door' | 'warped_door' | 'crimson_sign' | 'warped_sign' | 'crimson_wall_sign' | 'warped_wall_sign' | 'structure_block' | 'jigsaw' | 'composter' | 'target' | 'bee_nest' | 'beehive' | 'honey_block' | 'honeycomb_block' | 'netherite_block' | 'ancient_debris' | 'crying_obsidian' | 'respawn_anchor' | 'potted_crimson_fungus' | 'potted_warped_fungus' | 'potted_crimson_roots' | 'potted_warped_roots' | 'lodestone' | 'blackstone' | 'blackstone_stairs' | 'blackstone_wall' | 'blackstone_slab' | 'polished_blackstone' | 'polished_blackstone_bricks' | 'cracked_polished_blackstone_bricks' | 'chiseled_polished_blackstone' | 'polished_blackstone_brick_slab' | 'polished_blackstone_brick_stairs' | 'polished_blackstone_brick_wall' | 'gilded_blackstone' | 'polished_blackstone_stairs' | 'polished_blackstone_slab' | 'polished_blackstone_pressure_plate' | 'polished_blackstone_button' | 'polished_blackstone_wall' | 'chiseled_nether_bricks' | 'cracked_nether_bricks' | 'quartz_bricks' | 'candle' | 'white_candle' | 'orange_candle' | 'magenta_candle' | 'light_blue_candle' | 'yellow_candle' | 'lime_candle' | 'pink_candle' | 'gray_candle' | 'light_gray_candle' | 'cyan_candle' | 'purple_candle' | 'blue_candle' | 'brown_candle' | 'green_candle' | 'red_candle' | 'black_candle' | 'candle_cake' | 'white_candle_cake' | 'orange_candle_cake' | 'magenta_candle_cake' | 'light_blue_candle_cake' | 'yellow_candle_cake' | 'lime_candle_cake' | 'pink_candle_cake' | 'gray_candle_cake' | 'light_gray_candle_cake' | 'cyan_candle_cake' | 'purple_candle_cake' | 'blue_candle_cake' | 'brown_candle_cake' | 'green_candle_cake' | 'red_candle_cake' | 'black_candle_cake' | 'amethyst_block' | 'budding_amethyst' | 'amethyst_cluster' | 'large_amethyst_bud' | 'medium_amethyst_bud' | 'small_amethyst_bud' | 'tuff' | 'calcite' | 'tinted_glass' | 'powder_snow' | 'sculk_sensor' | 'calibrated_sculk_sensor' | 'sculk' | 'sculk_vein' | 'sculk_catalyst' | 'sculk_shrieker' | 'oxidized_copper' | 'weathered_copper' | 'exposed_copper' | 'copper_block' | 'copper_ore' | 'deepslate_copper_ore' | 'oxidized_cut_copper' | 'weathered_cut_copper' | 'exposed_cut_copper' | 'cut_copper' | 'oxidized_cut_copper_stairs' | 'weathered_cut_copper_stairs' | 'exposed_cut_copper_stairs' | 'cut_copper_stairs' | 'oxidized_cut_copper_slab' | 'weathered_cut_copper_slab' | 'exposed_cut_copper_slab' | 'cut_copper_slab' | 'waxed_copper_block' | 'waxed_weathered_copper' | 'waxed_exposed_copper' | 'waxed_oxidized_copper' | 'waxed_oxidized_cut_copper' | 'waxed_weathered_cut_copper' | 'waxed_exposed_cut_copper' | 'waxed_cut_copper' | 'waxed_oxidized_cut_copper_stairs' | 'waxed_weathered_cut_copper_stairs' | 'waxed_exposed_cut_copper_stairs' | 'waxed_cut_copper_stairs' | 'waxed_oxidized_cut_copper_slab' | 'waxed_weathered_cut_copper_slab' | 'waxed_exposed_cut_copper_slab' | 'waxed_cut_copper_slab' | 'lightning_rod' | 'pointed_dripstone' | 'dripstone_block' | 'cave_vines' | 'cave_vines_plant' | 'spore_blossom' | 'azalea' | 'flowering_azalea' | 'moss_carpet' | 'pink_petals' | 'moss_block' | 'big_dripleaf' | 'big_dripleaf_stem' | 'small_dripleaf' | 'hanging_roots' | 'rooted_dirt' | 'mud' | 'deepslate' | 'cobbled_deepslate' | 'cobbled_deepslate_stairs' | 'cobbled_deepslate_slab' | 'cobbled_deepslate_wall' | 'polished_deepslate' | 'polished_deepslate_stairs' | 'polished_deepslate_slab' | 'polished_deepslate_wall' | 'deepslate_tiles' | 'deepslate_tile_stairs' | 'deepslate_tile_slab' | 'deepslate_tile_wall' | 'deepslate_bricks' | 'deepslate_brick_stairs' | 'deepslate_brick_slab' | 'deepslate_brick_wall' | 'chiseled_deepslate' | 'cracked_deepslate_bricks' | 'cracked_deepslate_tiles' | 'infested_deepslate' | 'smooth_basalt' | 'raw_iron_block' | 'raw_copper_block' | 'raw_gold_block' | 'potted_azalea_bush' | 'potted_flowering_azalea_bush' | 'ochre_froglight' | 'verdant_froglight' | 'pearlescent_froglight' | 'frogspawn' | 'reinforced_deepslate' | 'decorated_pot'; +export type ItemNames = 'air' | 'stone' | 'granite' | 'polished_granite' | 'diorite' | 'polished_diorite' | 'andesite' | 'polished_andesite' | 'deepslate' | 'cobbled_deepslate' | 'polished_deepslate' | 'calcite' | 'tuff' | 'dripstone_block' | 'grass_block' | 'dirt' | 'coarse_dirt' | 'podzol' | 'rooted_dirt' | 'mud' | 'crimson_nylium' | 'warped_nylium' | 'cobblestone' | 'oak_planks' | 'spruce_planks' | 'birch_planks' | 'jungle_planks' | 'acacia_planks' | 'cherry_planks' | 'dark_oak_planks' | 'mangrove_planks' | 'bamboo_planks' | 'crimson_planks' | 'warped_planks' | 'bamboo_mosaic' | 'oak_sapling' | 'spruce_sapling' | 'birch_sapling' | 'jungle_sapling' | 'acacia_sapling' | 'cherry_sapling' | 'dark_oak_sapling' | 'mangrove_propagule' | 'bedrock' | 'sand' | 'suspicious_sand' | 'suspicious_gravel' | 'red_sand' | 'gravel' | 'coal_ore' | 'deepslate_coal_ore' | 'iron_ore' | 'deepslate_iron_ore' | 'copper_ore' | 'deepslate_copper_ore' | 'gold_ore' | 'deepslate_gold_ore' | 'redstone_ore' | 'deepslate_redstone_ore' | 'emerald_ore' | 'deepslate_emerald_ore' | 'lapis_ore' | 'deepslate_lapis_ore' | 'diamond_ore' | 'deepslate_diamond_ore' | 'nether_gold_ore' | 'nether_quartz_ore' | 'ancient_debris' | 'coal_block' | 'raw_iron_block' | 'raw_copper_block' | 'raw_gold_block' | 'amethyst_block' | 'budding_amethyst' | 'iron_block' | 'copper_block' | 'gold_block' | 'diamond_block' | 'netherite_block' | 'exposed_copper' | 'weathered_copper' | 'oxidized_copper' | 'cut_copper' | 'exposed_cut_copper' | 'weathered_cut_copper' | 'oxidized_cut_copper' | 'cut_copper_stairs' | 'exposed_cut_copper_stairs' | 'weathered_cut_copper_stairs' | 'oxidized_cut_copper_stairs' | 'cut_copper_slab' | 'exposed_cut_copper_slab' | 'weathered_cut_copper_slab' | 'oxidized_cut_copper_slab' | 'waxed_copper_block' | 'waxed_exposed_copper' | 'waxed_weathered_copper' | 'waxed_oxidized_copper' | 'waxed_cut_copper' | 'waxed_exposed_cut_copper' | 'waxed_weathered_cut_copper' | 'waxed_oxidized_cut_copper' | 'waxed_cut_copper_stairs' | 'waxed_exposed_cut_copper_stairs' | 'waxed_weathered_cut_copper_stairs' | 'waxed_oxidized_cut_copper_stairs' | 'waxed_cut_copper_slab' | 'waxed_exposed_cut_copper_slab' | 'waxed_weathered_cut_copper_slab' | 'waxed_oxidized_cut_copper_slab' | 'oak_log' | 'spruce_log' | 'birch_log' | 'jungle_log' | 'acacia_log' | 'cherry_log' | 'dark_oak_log' | 'mangrove_log' | 'mangrove_roots' | 'muddy_mangrove_roots' | 'crimson_stem' | 'warped_stem' | 'bamboo_block' | 'stripped_oak_log' | 'stripped_spruce_log' | 'stripped_birch_log' | 'stripped_jungle_log' | 'stripped_acacia_log' | 'stripped_cherry_log' | 'stripped_dark_oak_log' | 'stripped_mangrove_log' | 'stripped_crimson_stem' | 'stripped_warped_stem' | 'stripped_oak_wood' | 'stripped_spruce_wood' | 'stripped_birch_wood' | 'stripped_jungle_wood' | 'stripped_acacia_wood' | 'stripped_cherry_wood' | 'stripped_dark_oak_wood' | 'stripped_mangrove_wood' | 'stripped_crimson_hyphae' | 'stripped_warped_hyphae' | 'stripped_bamboo_block' | 'oak_wood' | 'spruce_wood' | 'birch_wood' | 'jungle_wood' | 'acacia_wood' | 'cherry_wood' | 'dark_oak_wood' | 'mangrove_wood' | 'crimson_hyphae' | 'warped_hyphae' | 'oak_leaves' | 'spruce_leaves' | 'birch_leaves' | 'jungle_leaves' | 'acacia_leaves' | 'cherry_leaves' | 'dark_oak_leaves' | 'mangrove_leaves' | 'azalea_leaves' | 'flowering_azalea_leaves' | 'sponge' | 'wet_sponge' | 'glass' | 'tinted_glass' | 'lapis_block' | 'sandstone' | 'chiseled_sandstone' | 'cut_sandstone' | 'cobweb' | 'grass' | 'fern' | 'azalea' | 'flowering_azalea' | 'dead_bush' | 'seagrass' | 'sea_pickle' | 'white_wool' | 'orange_wool' | 'magenta_wool' | 'light_blue_wool' | 'yellow_wool' | 'lime_wool' | 'pink_wool' | 'gray_wool' | 'light_gray_wool' | 'cyan_wool' | 'purple_wool' | 'blue_wool' | 'brown_wool' | 'green_wool' | 'red_wool' | 'black_wool' | 'dandelion' | 'poppy' | 'blue_orchid' | 'allium' | 'azure_bluet' | 'red_tulip' | 'orange_tulip' | 'white_tulip' | 'pink_tulip' | 'oxeye_daisy' | 'cornflower' | 'lily_of_the_valley' | 'wither_rose' | 'torchflower' | 'pitcher_plant' | 'spore_blossom' | 'brown_mushroom' | 'red_mushroom' | 'crimson_fungus' | 'warped_fungus' | 'crimson_roots' | 'warped_roots' | 'nether_sprouts' | 'weeping_vines' | 'twisting_vines' | 'sugar_cane' | 'kelp' | 'moss_carpet' | 'pink_petals' | 'moss_block' | 'hanging_roots' | 'big_dripleaf' | 'small_dripleaf' | 'bamboo' | 'oak_slab' | 'spruce_slab' | 'birch_slab' | 'jungle_slab' | 'acacia_slab' | 'cherry_slab' | 'dark_oak_slab' | 'mangrove_slab' | 'bamboo_slab' | 'bamboo_mosaic_slab' | 'crimson_slab' | 'warped_slab' | 'stone_slab' | 'smooth_stone_slab' | 'sandstone_slab' | 'cut_sandstone_slab' | 'petrified_oak_slab' | 'cobblestone_slab' | 'brick_slab' | 'stone_brick_slab' | 'mud_brick_slab' | 'nether_brick_slab' | 'quartz_slab' | 'red_sandstone_slab' | 'cut_red_sandstone_slab' | 'purpur_slab' | 'prismarine_slab' | 'prismarine_brick_slab' | 'dark_prismarine_slab' | 'smooth_quartz' | 'smooth_red_sandstone' | 'smooth_sandstone' | 'smooth_stone' | 'bricks' | 'bookshelf' | 'chiseled_bookshelf' | 'decorated_pot' | 'mossy_cobblestone' | 'obsidian' | 'torch' | 'end_rod' | 'chorus_plant' | 'chorus_flower' | 'purpur_block' | 'purpur_pillar' | 'purpur_stairs' | 'spawner' | 'chest' | 'crafting_table' | 'farmland' | 'furnace' | 'ladder' | 'cobblestone_stairs' | 'snow' | 'ice' | 'snow_block' | 'cactus' | 'clay' | 'jukebox' | 'oak_fence' | 'spruce_fence' | 'birch_fence' | 'jungle_fence' | 'acacia_fence' | 'cherry_fence' | 'dark_oak_fence' | 'mangrove_fence' | 'bamboo_fence' | 'crimson_fence' | 'warped_fence' | 'pumpkin' | 'carved_pumpkin' | 'jack_o_lantern' | 'netherrack' | 'soul_sand' | 'soul_soil' | 'basalt' | 'polished_basalt' | 'smooth_basalt' | 'soul_torch' | 'glowstone' | 'infested_stone' | 'infested_cobblestone' | 'infested_stone_bricks' | 'infested_mossy_stone_bricks' | 'infested_cracked_stone_bricks' | 'infested_chiseled_stone_bricks' | 'infested_deepslate' | 'stone_bricks' | 'mossy_stone_bricks' | 'cracked_stone_bricks' | 'chiseled_stone_bricks' | 'packed_mud' | 'mud_bricks' | 'deepslate_bricks' | 'cracked_deepslate_bricks' | 'deepslate_tiles' | 'cracked_deepslate_tiles' | 'chiseled_deepslate' | 'reinforced_deepslate' | 'brown_mushroom_block' | 'red_mushroom_block' | 'mushroom_stem' | 'iron_bars' | 'chain' | 'glass_pane' | 'melon' | 'vine' | 'glow_lichen' | 'brick_stairs' | 'stone_brick_stairs' | 'mud_brick_stairs' | 'mycelium' | 'lily_pad' | 'nether_bricks' | 'cracked_nether_bricks' | 'chiseled_nether_bricks' | 'nether_brick_fence' | 'nether_brick_stairs' | 'sculk' | 'sculk_vein' | 'sculk_catalyst' | 'sculk_shrieker' | 'enchanting_table' | 'end_portal_frame' | 'end_stone' | 'end_stone_bricks' | 'dragon_egg' | 'sandstone_stairs' | 'ender_chest' | 'emerald_block' | 'oak_stairs' | 'spruce_stairs' | 'birch_stairs' | 'jungle_stairs' | 'acacia_stairs' | 'cherry_stairs' | 'dark_oak_stairs' | 'mangrove_stairs' | 'bamboo_stairs' | 'bamboo_mosaic_stairs' | 'crimson_stairs' | 'warped_stairs' | 'command_block' | 'beacon' | 'cobblestone_wall' | 'mossy_cobblestone_wall' | 'brick_wall' | 'prismarine_wall' | 'red_sandstone_wall' | 'mossy_stone_brick_wall' | 'granite_wall' | 'stone_brick_wall' | 'mud_brick_wall' | 'nether_brick_wall' | 'andesite_wall' | 'red_nether_brick_wall' | 'sandstone_wall' | 'end_stone_brick_wall' | 'diorite_wall' | 'blackstone_wall' | 'polished_blackstone_wall' | 'polished_blackstone_brick_wall' | 'cobbled_deepslate_wall' | 'polished_deepslate_wall' | 'deepslate_brick_wall' | 'deepslate_tile_wall' | 'anvil' | 'chipped_anvil' | 'damaged_anvil' | 'chiseled_quartz_block' | 'quartz_block' | 'quartz_bricks' | 'quartz_pillar' | 'quartz_stairs' | 'white_terracotta' | 'orange_terracotta' | 'magenta_terracotta' | 'light_blue_terracotta' | 'yellow_terracotta' | 'lime_terracotta' | 'pink_terracotta' | 'gray_terracotta' | 'light_gray_terracotta' | 'cyan_terracotta' | 'purple_terracotta' | 'blue_terracotta' | 'brown_terracotta' | 'green_terracotta' | 'red_terracotta' | 'black_terracotta' | 'barrier' | 'light' | 'hay_block' | 'white_carpet' | 'orange_carpet' | 'magenta_carpet' | 'light_blue_carpet' | 'yellow_carpet' | 'lime_carpet' | 'pink_carpet' | 'gray_carpet' | 'light_gray_carpet' | 'cyan_carpet' | 'purple_carpet' | 'blue_carpet' | 'brown_carpet' | 'green_carpet' | 'red_carpet' | 'black_carpet' | 'terracotta' | 'packed_ice' | 'dirt_path' | 'sunflower' | 'lilac' | 'rose_bush' | 'peony' | 'tall_grass' | 'large_fern' | 'white_stained_glass' | 'orange_stained_glass' | 'magenta_stained_glass' | 'light_blue_stained_glass' | 'yellow_stained_glass' | 'lime_stained_glass' | 'pink_stained_glass' | 'gray_stained_glass' | 'light_gray_stained_glass' | 'cyan_stained_glass' | 'purple_stained_glass' | 'blue_stained_glass' | 'brown_stained_glass' | 'green_stained_glass' | 'red_stained_glass' | 'black_stained_glass' | 'white_stained_glass_pane' | 'orange_stained_glass_pane' | 'magenta_stained_glass_pane' | 'light_blue_stained_glass_pane' | 'yellow_stained_glass_pane' | 'lime_stained_glass_pane' | 'pink_stained_glass_pane' | 'gray_stained_glass_pane' | 'light_gray_stained_glass_pane' | 'cyan_stained_glass_pane' | 'purple_stained_glass_pane' | 'blue_stained_glass_pane' | 'brown_stained_glass_pane' | 'green_stained_glass_pane' | 'red_stained_glass_pane' | 'black_stained_glass_pane' | 'prismarine' | 'prismarine_bricks' | 'dark_prismarine' | 'prismarine_stairs' | 'prismarine_brick_stairs' | 'dark_prismarine_stairs' | 'sea_lantern' | 'red_sandstone' | 'chiseled_red_sandstone' | 'cut_red_sandstone' | 'red_sandstone_stairs' | 'repeating_command_block' | 'chain_command_block' | 'magma_block' | 'nether_wart_block' | 'warped_wart_block' | 'red_nether_bricks' | 'bone_block' | 'structure_void' | 'shulker_box' | 'white_shulker_box' | 'orange_shulker_box' | 'magenta_shulker_box' | 'light_blue_shulker_box' | 'yellow_shulker_box' | 'lime_shulker_box' | 'pink_shulker_box' | 'gray_shulker_box' | 'light_gray_shulker_box' | 'cyan_shulker_box' | 'purple_shulker_box' | 'blue_shulker_box' | 'brown_shulker_box' | 'green_shulker_box' | 'red_shulker_box' | 'black_shulker_box' | 'white_glazed_terracotta' | 'orange_glazed_terracotta' | 'magenta_glazed_terracotta' | 'light_blue_glazed_terracotta' | 'yellow_glazed_terracotta' | 'lime_glazed_terracotta' | 'pink_glazed_terracotta' | 'gray_glazed_terracotta' | 'light_gray_glazed_terracotta' | 'cyan_glazed_terracotta' | 'purple_glazed_terracotta' | 'blue_glazed_terracotta' | 'brown_glazed_terracotta' | 'green_glazed_terracotta' | 'red_glazed_terracotta' | 'black_glazed_terracotta' | 'white_concrete' | 'orange_concrete' | 'magenta_concrete' | 'light_blue_concrete' | 'yellow_concrete' | 'lime_concrete' | 'pink_concrete' | 'gray_concrete' | 'light_gray_concrete' | 'cyan_concrete' | 'purple_concrete' | 'blue_concrete' | 'brown_concrete' | 'green_concrete' | 'red_concrete' | 'black_concrete' | 'white_concrete_powder' | 'orange_concrete_powder' | 'magenta_concrete_powder' | 'light_blue_concrete_powder' | 'yellow_concrete_powder' | 'lime_concrete_powder' | 'pink_concrete_powder' | 'gray_concrete_powder' | 'light_gray_concrete_powder' | 'cyan_concrete_powder' | 'purple_concrete_powder' | 'blue_concrete_powder' | 'brown_concrete_powder' | 'green_concrete_powder' | 'red_concrete_powder' | 'black_concrete_powder' | 'turtle_egg' | 'sniffer_egg' | 'dead_tube_coral_block' | 'dead_brain_coral_block' | 'dead_bubble_coral_block' | 'dead_fire_coral_block' | 'dead_horn_coral_block' | 'tube_coral_block' | 'brain_coral_block' | 'bubble_coral_block' | 'fire_coral_block' | 'horn_coral_block' | 'tube_coral' | 'brain_coral' | 'bubble_coral' | 'fire_coral' | 'horn_coral' | 'dead_brain_coral' | 'dead_bubble_coral' | 'dead_fire_coral' | 'dead_horn_coral' | 'dead_tube_coral' | 'tube_coral_fan' | 'brain_coral_fan' | 'bubble_coral_fan' | 'fire_coral_fan' | 'horn_coral_fan' | 'dead_tube_coral_fan' | 'dead_brain_coral_fan' | 'dead_bubble_coral_fan' | 'dead_fire_coral_fan' | 'dead_horn_coral_fan' | 'blue_ice' | 'conduit' | 'polished_granite_stairs' | 'smooth_red_sandstone_stairs' | 'mossy_stone_brick_stairs' | 'polished_diorite_stairs' | 'mossy_cobblestone_stairs' | 'end_stone_brick_stairs' | 'stone_stairs' | 'smooth_sandstone_stairs' | 'smooth_quartz_stairs' | 'granite_stairs' | 'andesite_stairs' | 'red_nether_brick_stairs' | 'polished_andesite_stairs' | 'diorite_stairs' | 'cobbled_deepslate_stairs' | 'polished_deepslate_stairs' | 'deepslate_brick_stairs' | 'deepslate_tile_stairs' | 'polished_granite_slab' | 'smooth_red_sandstone_slab' | 'mossy_stone_brick_slab' | 'polished_diorite_slab' | 'mossy_cobblestone_slab' | 'end_stone_brick_slab' | 'smooth_sandstone_slab' | 'smooth_quartz_slab' | 'granite_slab' | 'andesite_slab' | 'red_nether_brick_slab' | 'polished_andesite_slab' | 'diorite_slab' | 'cobbled_deepslate_slab' | 'polished_deepslate_slab' | 'deepslate_brick_slab' | 'deepslate_tile_slab' | 'scaffolding' | 'redstone' | 'redstone_torch' | 'redstone_block' | 'repeater' | 'comparator' | 'piston' | 'sticky_piston' | 'slime_block' | 'honey_block' | 'observer' | 'hopper' | 'dispenser' | 'dropper' | 'lectern' | 'target' | 'lever' | 'lightning_rod' | 'daylight_detector' | 'sculk_sensor' | 'calibrated_sculk_sensor' | 'tripwire_hook' | 'trapped_chest' | 'tnt' | 'redstone_lamp' | 'note_block' | 'stone_button' | 'polished_blackstone_button' | 'oak_button' | 'spruce_button' | 'birch_button' | 'jungle_button' | 'acacia_button' | 'cherry_button' | 'dark_oak_button' | 'mangrove_button' | 'bamboo_button' | 'crimson_button' | 'warped_button' | 'stone_pressure_plate' | 'polished_blackstone_pressure_plate' | 'light_weighted_pressure_plate' | 'heavy_weighted_pressure_plate' | 'oak_pressure_plate' | 'spruce_pressure_plate' | 'birch_pressure_plate' | 'jungle_pressure_plate' | 'acacia_pressure_plate' | 'cherry_pressure_plate' | 'dark_oak_pressure_plate' | 'mangrove_pressure_plate' | 'bamboo_pressure_plate' | 'crimson_pressure_plate' | 'warped_pressure_plate' | 'iron_door' | 'oak_door' | 'spruce_door' | 'birch_door' | 'jungle_door' | 'acacia_door' | 'cherry_door' | 'dark_oak_door' | 'mangrove_door' | 'bamboo_door' | 'crimson_door' | 'warped_door' | 'iron_trapdoor' | 'oak_trapdoor' | 'spruce_trapdoor' | 'birch_trapdoor' | 'jungle_trapdoor' | 'acacia_trapdoor' | 'cherry_trapdoor' | 'dark_oak_trapdoor' | 'mangrove_trapdoor' | 'bamboo_trapdoor' | 'crimson_trapdoor' | 'warped_trapdoor' | 'oak_fence_gate' | 'spruce_fence_gate' | 'birch_fence_gate' | 'jungle_fence_gate' | 'acacia_fence_gate' | 'cherry_fence_gate' | 'dark_oak_fence_gate' | 'mangrove_fence_gate' | 'bamboo_fence_gate' | 'crimson_fence_gate' | 'warped_fence_gate' | 'powered_rail' | 'detector_rail' | 'rail' | 'activator_rail' | 'saddle' | 'minecart' | 'chest_minecart' | 'furnace_minecart' | 'tnt_minecart' | 'hopper_minecart' | 'carrot_on_a_stick' | 'warped_fungus_on_a_stick' | 'elytra' | 'oak_boat' | 'oak_chest_boat' | 'spruce_boat' | 'spruce_chest_boat' | 'birch_boat' | 'birch_chest_boat' | 'jungle_boat' | 'jungle_chest_boat' | 'acacia_boat' | 'acacia_chest_boat' | 'cherry_boat' | 'cherry_chest_boat' | 'dark_oak_boat' | 'dark_oak_chest_boat' | 'mangrove_boat' | 'mangrove_chest_boat' | 'bamboo_raft' | 'bamboo_chest_raft' | 'structure_block' | 'jigsaw' | 'turtle_helmet' | 'scute' | 'flint_and_steel' | 'apple' | 'bow' | 'arrow' | 'coal' | 'charcoal' | 'diamond' | 'emerald' | 'lapis_lazuli' | 'quartz' | 'amethyst_shard' | 'raw_iron' | 'iron_ingot' | 'raw_copper' | 'copper_ingot' | 'raw_gold' | 'gold_ingot' | 'netherite_ingot' | 'netherite_scrap' | 'wooden_sword' | 'wooden_shovel' | 'wooden_pickaxe' | 'wooden_axe' | 'wooden_hoe' | 'stone_sword' | 'stone_shovel' | 'stone_pickaxe' | 'stone_axe' | 'stone_hoe' | 'golden_sword' | 'golden_shovel' | 'golden_pickaxe' | 'golden_axe' | 'golden_hoe' | 'iron_sword' | 'iron_shovel' | 'iron_pickaxe' | 'iron_axe' | 'iron_hoe' | 'diamond_sword' | 'diamond_shovel' | 'diamond_pickaxe' | 'diamond_axe' | 'diamond_hoe' | 'netherite_sword' | 'netherite_shovel' | 'netherite_pickaxe' | 'netherite_axe' | 'netherite_hoe' | 'stick' | 'bowl' | 'mushroom_stew' | 'string' | 'feather' | 'gunpowder' | 'wheat_seeds' | 'wheat' | 'bread' | 'leather_helmet' | 'leather_chestplate' | 'leather_leggings' | 'leather_boots' | 'chainmail_helmet' | 'chainmail_chestplate' | 'chainmail_leggings' | 'chainmail_boots' | 'iron_helmet' | 'iron_chestplate' | 'iron_leggings' | 'iron_boots' | 'diamond_helmet' | 'diamond_chestplate' | 'diamond_leggings' | 'diamond_boots' | 'golden_helmet' | 'golden_chestplate' | 'golden_leggings' | 'golden_boots' | 'netherite_helmet' | 'netherite_chestplate' | 'netherite_leggings' | 'netherite_boots' | 'flint' | 'porkchop' | 'cooked_porkchop' | 'painting' | 'golden_apple' | 'enchanted_golden_apple' | 'oak_sign' | 'spruce_sign' | 'birch_sign' | 'jungle_sign' | 'acacia_sign' | 'cherry_sign' | 'dark_oak_sign' | 'mangrove_sign' | 'bamboo_sign' | 'crimson_sign' | 'warped_sign' | 'oak_hanging_sign' | 'spruce_hanging_sign' | 'birch_hanging_sign' | 'jungle_hanging_sign' | 'acacia_hanging_sign' | 'cherry_hanging_sign' | 'dark_oak_hanging_sign' | 'mangrove_hanging_sign' | 'bamboo_hanging_sign' | 'crimson_hanging_sign' | 'warped_hanging_sign' | 'bucket' | 'water_bucket' | 'lava_bucket' | 'powder_snow_bucket' | 'snowball' | 'leather' | 'milk_bucket' | 'pufferfish_bucket' | 'salmon_bucket' | 'cod_bucket' | 'tropical_fish_bucket' | 'axolotl_bucket' | 'tadpole_bucket' | 'brick' | 'clay_ball' | 'dried_kelp_block' | 'paper' | 'book' | 'slime_ball' | 'egg' | 'compass' | 'recovery_compass' | 'bundle' | 'fishing_rod' | 'clock' | 'spyglass' | 'glowstone_dust' | 'cod' | 'salmon' | 'tropical_fish' | 'pufferfish' | 'cooked_cod' | 'cooked_salmon' | 'ink_sac' | 'glow_ink_sac' | 'cocoa_beans' | 'white_dye' | 'orange_dye' | 'magenta_dye' | 'light_blue_dye' | 'yellow_dye' | 'lime_dye' | 'pink_dye' | 'gray_dye' | 'light_gray_dye' | 'cyan_dye' | 'purple_dye' | 'blue_dye' | 'brown_dye' | 'green_dye' | 'red_dye' | 'black_dye' | 'bone_meal' | 'bone' | 'sugar' | 'cake' | 'white_bed' | 'orange_bed' | 'magenta_bed' | 'light_blue_bed' | 'yellow_bed' | 'lime_bed' | 'pink_bed' | 'gray_bed' | 'light_gray_bed' | 'cyan_bed' | 'purple_bed' | 'blue_bed' | 'brown_bed' | 'green_bed' | 'red_bed' | 'black_bed' | 'cookie' | 'filled_map' | 'shears' | 'melon_slice' | 'dried_kelp' | 'pumpkin_seeds' | 'melon_seeds' | 'beef' | 'cooked_beef' | 'chicken' | 'cooked_chicken' | 'rotten_flesh' | 'ender_pearl' | 'blaze_rod' | 'ghast_tear' | 'gold_nugget' | 'nether_wart' | 'potion' | 'glass_bottle' | 'spider_eye' | 'fermented_spider_eye' | 'blaze_powder' | 'magma_cream' | 'brewing_stand' | 'cauldron' | 'ender_eye' | 'glistering_melon_slice' | 'allay_spawn_egg' | 'axolotl_spawn_egg' | 'bat_spawn_egg' | 'bee_spawn_egg' | 'blaze_spawn_egg' | 'cat_spawn_egg' | 'camel_spawn_egg' | 'cave_spider_spawn_egg' | 'chicken_spawn_egg' | 'cod_spawn_egg' | 'cow_spawn_egg' | 'creeper_spawn_egg' | 'dolphin_spawn_egg' | 'donkey_spawn_egg' | 'drowned_spawn_egg' | 'elder_guardian_spawn_egg' | 'ender_dragon_spawn_egg' | 'enderman_spawn_egg' | 'endermite_spawn_egg' | 'evoker_spawn_egg' | 'fox_spawn_egg' | 'frog_spawn_egg' | 'ghast_spawn_egg' | 'glow_squid_spawn_egg' | 'goat_spawn_egg' | 'guardian_spawn_egg' | 'hoglin_spawn_egg' | 'horse_spawn_egg' | 'husk_spawn_egg' | 'iron_golem_spawn_egg' | 'llama_spawn_egg' | 'magma_cube_spawn_egg' | 'mooshroom_spawn_egg' | 'mule_spawn_egg' | 'ocelot_spawn_egg' | 'panda_spawn_egg' | 'parrot_spawn_egg' | 'phantom_spawn_egg' | 'pig_spawn_egg' | 'piglin_spawn_egg' | 'piglin_brute_spawn_egg' | 'pillager_spawn_egg' | 'polar_bear_spawn_egg' | 'pufferfish_spawn_egg' | 'rabbit_spawn_egg' | 'ravager_spawn_egg' | 'salmon_spawn_egg' | 'sheep_spawn_egg' | 'shulker_spawn_egg' | 'silverfish_spawn_egg' | 'skeleton_spawn_egg' | 'skeleton_horse_spawn_egg' | 'slime_spawn_egg' | 'sniffer_spawn_egg' | 'snow_golem_spawn_egg' | 'spider_spawn_egg' | 'squid_spawn_egg' | 'stray_spawn_egg' | 'strider_spawn_egg' | 'tadpole_spawn_egg' | 'trader_llama_spawn_egg' | 'tropical_fish_spawn_egg' | 'turtle_spawn_egg' | 'vex_spawn_egg' | 'villager_spawn_egg' | 'vindicator_spawn_egg' | 'wandering_trader_spawn_egg' | 'warden_spawn_egg' | 'witch_spawn_egg' | 'wither_spawn_egg' | 'wither_skeleton_spawn_egg' | 'wolf_spawn_egg' | 'zoglin_spawn_egg' | 'zombie_spawn_egg' | 'zombie_horse_spawn_egg' | 'zombie_villager_spawn_egg' | 'zombified_piglin_spawn_egg' | 'experience_bottle' | 'fire_charge' | 'writable_book' | 'written_book' | 'item_frame' | 'glow_item_frame' | 'flower_pot' | 'carrot' | 'potato' | 'baked_potato' | 'poisonous_potato' | 'map' | 'golden_carrot' | 'skeleton_skull' | 'wither_skeleton_skull' | 'player_head' | 'zombie_head' | 'creeper_head' | 'dragon_head' | 'piglin_head' | 'nether_star' | 'pumpkin_pie' | 'firework_rocket' | 'firework_star' | 'enchanted_book' | 'nether_brick' | 'prismarine_shard' | 'prismarine_crystals' | 'rabbit' | 'cooked_rabbit' | 'rabbit_stew' | 'rabbit_foot' | 'rabbit_hide' | 'armor_stand' | 'iron_horse_armor' | 'golden_horse_armor' | 'diamond_horse_armor' | 'leather_horse_armor' | 'lead' | 'name_tag' | 'command_block_minecart' | 'mutton' | 'cooked_mutton' | 'white_banner' | 'orange_banner' | 'magenta_banner' | 'light_blue_banner' | 'yellow_banner' | 'lime_banner' | 'pink_banner' | 'gray_banner' | 'light_gray_banner' | 'cyan_banner' | 'purple_banner' | 'blue_banner' | 'brown_banner' | 'green_banner' | 'red_banner' | 'black_banner' | 'end_crystal' | 'chorus_fruit' | 'popped_chorus_fruit' | 'torchflower_seeds' | 'pitcher_pod' | 'beetroot' | 'beetroot_seeds' | 'beetroot_soup' | 'dragon_breath' | 'splash_potion' | 'spectral_arrow' | 'tipped_arrow' | 'lingering_potion' | 'shield' | 'totem_of_undying' | 'shulker_shell' | 'iron_nugget' | 'knowledge_book' | 'debug_stick' | 'music_disc_13' | 'music_disc_cat' | 'music_disc_blocks' | 'music_disc_chirp' | 'music_disc_far' | 'music_disc_mall' | 'music_disc_mellohi' | 'music_disc_stal' | 'music_disc_strad' | 'music_disc_ward' | 'music_disc_11' | 'music_disc_wait' | 'music_disc_otherside' | 'music_disc_relic' | 'music_disc_5' | 'music_disc_pigstep' | 'disc_fragment_5' | 'trident' | 'phantom_membrane' | 'nautilus_shell' | 'heart_of_the_sea' | 'crossbow' | 'suspicious_stew' | 'loom' | 'flower_banner_pattern' | 'creeper_banner_pattern' | 'skull_banner_pattern' | 'mojang_banner_pattern' | 'globe_banner_pattern' | 'piglin_banner_pattern' | 'goat_horn' | 'composter' | 'barrel' | 'smoker' | 'blast_furnace' | 'cartography_table' | 'fletching_table' | 'grindstone' | 'smithing_table' | 'stonecutter' | 'bell' | 'lantern' | 'soul_lantern' | 'sweet_berries' | 'glow_berries' | 'campfire' | 'soul_campfire' | 'shroomlight' | 'honeycomb' | 'bee_nest' | 'beehive' | 'honey_bottle' | 'honeycomb_block' | 'lodestone' | 'crying_obsidian' | 'blackstone' | 'blackstone_slab' | 'blackstone_stairs' | 'gilded_blackstone' | 'polished_blackstone' | 'polished_blackstone_slab' | 'polished_blackstone_stairs' | 'chiseled_polished_blackstone' | 'polished_blackstone_bricks' | 'polished_blackstone_brick_slab' | 'polished_blackstone_brick_stairs' | 'cracked_polished_blackstone_bricks' | 'respawn_anchor' | 'candle' | 'white_candle' | 'orange_candle' | 'magenta_candle' | 'light_blue_candle' | 'yellow_candle' | 'lime_candle' | 'pink_candle' | 'gray_candle' | 'light_gray_candle' | 'cyan_candle' | 'purple_candle' | 'blue_candle' | 'brown_candle' | 'green_candle' | 'red_candle' | 'black_candle' | 'small_amethyst_bud' | 'medium_amethyst_bud' | 'large_amethyst_bud' | 'amethyst_cluster' | 'pointed_dripstone' | 'ochre_froglight' | 'verdant_froglight' | 'pearlescent_froglight' | 'frogspawn' | 'echo_shard' | 'brush' | 'netherite_upgrade_smithing_template' | 'sentry_armor_trim_smithing_template' | 'dune_armor_trim_smithing_template' | 'coast_armor_trim_smithing_template' | 'wild_armor_trim_smithing_template' | 'ward_armor_trim_smithing_template' | 'eye_armor_trim_smithing_template' | 'vex_armor_trim_smithing_template' | 'tide_armor_trim_smithing_template' | 'snout_armor_trim_smithing_template' | 'rib_armor_trim_smithing_template' | 'spire_armor_trim_smithing_template' | 'wayfinder_armor_trim_smithing_template' | 'shaper_armor_trim_smithing_template' | 'silence_armor_trim_smithing_template' | 'raiser_armor_trim_smithing_template' | 'host_armor_trim_smithing_template' | 'angler_pottery_sherd' | 'archer_pottery_sherd' | 'arms_up_pottery_sherd' | 'blade_pottery_sherd' | 'brewer_pottery_sherd' | 'burn_pottery_sherd' | 'danger_pottery_sherd' | 'explorer_pottery_sherd' | 'friend_pottery_sherd' | 'heart_pottery_sherd' | 'heartbreak_pottery_sherd' | 'howl_pottery_sherd' | 'miner_pottery_sherd' | 'mourner_pottery_sherd' | 'plenty_pottery_sherd' | 'prize_pottery_sherd' | 'sheaf_pottery_sherd' | 'shelter_pottery_sherd' | 'skull_pottery_sherd' | 'snort_pottery_sherd'; +export type EntityNames = 'allay' | 'area_effect_cloud' | 'armor_stand' | 'arrow' | 'axolotl' | 'bat' | 'bee' | 'blaze' | 'block_display' | 'boat' | 'camel' | 'cat' | 'cave_spider' | 'chest_boat' | 'chest_minecart' | 'chicken' | 'cod' | 'command_block_minecart' | 'cow' | 'creeper' | 'dolphin' | 'donkey' | 'dragon_fireball' | 'drowned' | 'egg' | 'elder_guardian' | 'end_crystal' | 'ender_dragon' | 'ender_pearl' | 'enderman' | 'endermite' | 'evoker' | 'evoker_fangs' | 'experience_bottle' | 'experience_orb' | 'eye_of_ender' | 'falling_block' | 'firework_rocket' | 'fox' | 'frog' | 'furnace_minecart' | 'ghast' | 'giant' | 'glow_item_frame' | 'glow_squid' | 'goat' | 'guardian' | 'hoglin' | 'hopper_minecart' | 'horse' | 'husk' | 'illusioner' | 'interaction' | 'iron_golem' | 'item' | 'item_display' | 'item_frame' | 'fireball' | 'leash_knot' | 'lightning_bolt' | 'llama' | 'llama_spit' | 'magma_cube' | 'marker' | 'minecart' | 'mooshroom' | 'mule' | 'ocelot' | 'painting' | 'panda' | 'parrot' | 'phantom' | 'pig' | 'piglin' | 'piglin_brute' | 'pillager' | 'polar_bear' | 'potion' | 'pufferfish' | 'rabbit' | 'ravager' | 'salmon' | 'sheep' | 'shulker' | 'shulker_bullet' | 'silverfish' | 'skeleton' | 'skeleton_horse' | 'slime' | 'small_fireball' | 'sniffer' | 'snow_golem' | 'snowball' | 'spawner_minecart' | 'spectral_arrow' | 'spider' | 'squid' | 'stray' | 'strider' | 'tadpole' | 'text_display' | 'tnt' | 'tnt_minecart' | 'trader_llama' | 'trident' | 'tropical_fish' | 'turtle' | 'vex' | 'villager' | 'vindicator' | 'wandering_trader' | 'warden' | 'witch' | 'wither' | 'wither_skeleton' | 'wither_skull' | 'wolf' | 'zoglin' | 'zombie' | 'zombie_horse' | 'zombie_villager' | 'zombified_piglin' | 'player' | 'fishing_bobber'; +export type BiomesNames = 'badlands' | 'bamboo_jungle' | 'basalt_deltas' | 'beach' | 'birch_forest' | 'cherry_grove' | 'cold_ocean' | 'crimson_forest' | 'dark_forest' | 'deep_cold_ocean' | 'deep_dark' | 'deep_frozen_ocean' | 'deep_lukewarm_ocean' | 'deep_ocean' | 'desert' | 'dripstone_caves' | 'end_barrens' | 'end_highlands' | 'end_midlands' | 'eroded_badlands' | 'flower_forest' | 'forest' | 'frozen_ocean' | 'frozen_peaks' | 'frozen_river' | 'grove' | 'ice_spikes' | 'jagged_peaks' | 'jungle' | 'lukewarm_ocean' | 'lush_caves' | 'mangrove_swamp' | 'meadow' | 'mushroom_fields' | 'nether_wastes' | 'ocean' | 'old_growth_birch_forest' | 'old_growth_pine_taiga' | 'old_growth_spruce_taiga' | 'plains' | 'river' | 'savanna' | 'savanna_plateau' | 'small_end_islands' | 'snowy_beach' | 'snowy_plains' | 'snowy_slopes' | 'snowy_taiga' | 'soul_sand_valley' | 'sparse_jungle' | 'stony_peaks' | 'stony_shore' | 'sunflower_plains' | 'swamp' | 'taiga' | 'the_end' | 'the_void' | 'warm_ocean' | 'warped_forest' | 'windswept_forest' | 'windswept_gravelly_hills' | 'windswept_hills' | 'windswept_savanna' | 'wooded_badlands'; +export type EnchantmentNames = 'protection' | 'fire_protection' | 'feather_falling' | 'blast_protection' | 'projectile_protection' | 'respiration' | 'aqua_affinity' | 'thorns' | 'depth_strider' | 'frost_walker' | 'binding_curse' | 'soul_speed' | 'swift_sneak' | 'sharpness' | 'smite' | 'bane_of_arthropods' | 'knockback' | 'fire_aspect' | 'looting' | 'sweeping' | 'efficiency' | 'silk_touch' | 'unbreaking' | 'fortune' | 'power' | 'punch' | 'flame' | 'infinity' | 'luck_of_the_sea' | 'lure' | 'loyalty' | 'impaling' | 'riptide' | 'channeling' | 'multishot' | 'quick_charge' | 'piercing' | 'mending' | 'vanishing_curse'; \ No newline at end of file From d604ff12aed47d3476f8aa37ad321dd34fdcadcb Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 17 Apr 2024 08:39:08 +0300 Subject: [PATCH 0125/1195] a few important regression fixes --- prismarine-viewer/viewer/lib/mesher/models.ts | 18 ++++++++++++++++-- prismarine-viewer/viewer/lib/utils.web.js | 6 +++--- src/panorama.ts | 6 ++++-- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/prismarine-viewer/viewer/lib/mesher/models.ts b/prismarine-viewer/viewer/lib/mesher/models.ts index 9b3a1ecd..c9e2bd3b 100644 --- a/prismarine-viewer/viewer/lib/mesher/models.ts +++ b/prismarine-viewer/viewer/lib/mesher/models.ts @@ -120,7 +120,7 @@ function getLiquidRenderHeight (world, block, type, pos) { } const isCube = (block) => { - if (!block) return false + if (!block || block.transparent) return false if (block.isCube) return true if (!block.variant) block.variant = getModelVariants(block) return block.variant.every(v => v?.model?.elements.every(e => { @@ -147,7 +147,8 @@ function renderLiquid (world, cursor, texture, type, biome, water, attr) { const { dir, corners } = elemFaces[face] const isUp = dir[1] === 1 - const neighbor = world.getBlock(cursor.offset(...dir)) + const neighborPos = cursor.offset(...dir) + const neighbor = world.getBlock(neighborPos) if (!neighbor) continue if (neighbor.type === type) continue if ((isCube(neighbor) && !isUp) || neighbor.material === 'plant' || neighbor.getProperties().waterlogged) continue @@ -161,6 +162,18 @@ function renderLiquid (world, cursor, texture, type, biome, water, attr) { tint = [tint[0] * m, tint[1] * m, tint[2] * m] } + if (needTiles) { + attr.tiles[`${cursor.x},${cursor.y},${cursor.z}`] ??= { + block: 'water', + faces: [], + } + attr.tiles[`${cursor.x},${cursor.y},${cursor.z}`].faces.push({ + face, + neighbor: `${neighborPos.x},${neighborPos.y},${neighborPos.z}`, + // texture: eFace.texture.name, + }) + } + const u = texture.u const v = texture.v const su = texture.su @@ -268,6 +281,7 @@ function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr if (!neighbor.transparent && isCube(neighbor)) continue } else { needRecompute = true + continue } } diff --git a/prismarine-viewer/viewer/lib/utils.web.js b/prismarine-viewer/viewer/lib/utils.web.js index cbb94222..ffa22808 100644 --- a/prismarine-viewer/viewer/lib/utils.web.js +++ b/prismarine-viewer/viewer/lib/utils.web.js @@ -3,12 +3,12 @@ const THREE = require('three') const textureCache = {} function loadTexture (texture, cb, onLoad) { - if (!textureCache[texture]) { + const cached = textureCache[texture] + if (!cached) { textureCache[texture] = new THREE.TextureLoader().load(texture, onLoad) - } else { - onLoad?.() } cb(textureCache[texture]) + if (cached) onLoad?.() } function loadJSON (url, callback) { diff --git a/src/panorama.ts b/src/panorama.ts index 1f614371..3d7aec32 100644 --- a/src/panorama.ts +++ b/src/panorama.ts @@ -69,7 +69,8 @@ export async function addPanoramaCubeMap () { shouldDisplayPanorama = true let time = 0 - viewer.camera = new THREE.PerspectiveCamera(85, window.innerWidth / window.innerHeight, 0.05, 1000) + viewer.camera.fov = 85 + viewer.camera.near = 0.05 viewer.camera.updateProjectionMatrix() viewer.camera.position.set(0, 0, 0) viewer.camera.rotation.set(0, 0, 0) @@ -119,7 +120,8 @@ export async function addPanoramaCubeMap () { export function removePanorama () { shouldDisplayPanorama = false if (!panoramaCubeMap) return - viewer.camera = new THREE.PerspectiveCamera(options.fov, window.innerWidth / window.innerHeight, 0.1, 1000) + viewer.camera.fov = options.fov + viewer.camera.near = 0.1 viewer.camera.updateProjectionMatrix() viewer.scene.remove(panoramaCubeMap) panoramaCubeMap = null From fd42c9cc98ee38c0330fa0e1e4870e624ab8810a Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 18 Apr 2024 08:10:31 +0300 Subject: [PATCH 0126/1195] fix test in ci --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cbd12318..b2f04c43 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,8 +15,9 @@ jobs: node-version: 18 # cache: "pnpm" - run: pnpm install - - run: pnpm lint - run: pnpm check-build + - run: pnpm test-unit + - run: pnpm lint - run: nohup pnpm prod-start & - run: nohup pnpm test-mc-server & - uses: cypress-io/github-action@v5 From 2d3ab6c43a980632915bce2a059062c917671203 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 18 Apr 2024 09:47:55 +0300 Subject: [PATCH 0127/1195] feat: Almost full entities rendering. Mobs are now rendered correctly --- esbuild.mjs | 3 +- package.json | 3 +- pnpm-lock.yaml | 36 +++- prismarine-viewer/esbuild.mjs | 1 + prismarine-viewer/examples/playground.ts | 7 +- prismarine-viewer/test/parallel.js | 20 --- prismarine-viewer/test/simple.test.js | 12 -- prismarine-viewer/test/viewer.test.js | 109 ------------- prismarine-viewer/viewer/index.js | 2 +- prismarine-viewer/viewer/lib/entities.js | 30 +++- .../lib/entity/{Entity.js => EntityMesh.js} | 154 +++++++++++++++--- .../viewer/lib/entity/externalTextures.json | 1 + .../viewer/lib/entity/objModels.js | 3 + .../viewer/lib/worldrendererCommon.ts | 4 +- 14 files changed, 198 insertions(+), 187 deletions(-) delete mode 100644 prismarine-viewer/test/parallel.js delete mode 100644 prismarine-viewer/test/simple.test.js delete mode 100644 prismarine-viewer/test/viewer.test.js rename prismarine-viewer/viewer/lib/entity/{Entity.js => EntityMesh.js} (57%) create mode 100644 prismarine-viewer/viewer/lib/entity/externalTextures.json create mode 100644 prismarine-viewer/viewer/lib/entity/objModels.js diff --git a/esbuild.mjs b/esbuild.mjs index 6f7f903e..fad9047d 100644 --- a/esbuild.mjs +++ b/esbuild.mjs @@ -80,7 +80,8 @@ const buildOptions = { '.png': 'dataurl', '.map': 'empty', '.vert': 'text', - '.frag': 'text' + '.frag': 'text', + '.obj': 'text', }, write: false, // todo would be better to enable? diff --git a/package.json b/package.json index 13e5cd36..4f7a9dbb 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "start": "node scripts/build.js copyFilesDev && node scripts/prepareData.mjs && node esbuild.mjs --watch", "start-watch-script": "nodemon -w esbuild.mjs --watch", "build": "node scripts/build.js copyFiles && node scripts/prepareData.mjs -f && node esbuild.mjs --minify --prod", - "check-build": "tsc && pnpm test-unit --run && pnpm build", + "check-build": "tsc && pnpm build", "test:cypress": "cypress run", "test-unit": "vitest", "test:e2e": "start-test http-get://localhost:8080 test:cypress", @@ -44,6 +44,7 @@ "@xmcl/text-component": "^2.1.3", "@zardoy/react-util": "^0.2.0", "@zardoy/utils": "^0.0.11", + "adm-zip": "^0.5.12", "browserfs": "github:zardoy/browserfs#build", "change-case": "^5.1.2", "compression": "^1.7.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6d448375..68d89fb2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,6 +56,9 @@ importers: '@zardoy/utils': specifier: ^0.0.11 version: 0.0.11 + adm-zip: + specifier: ^0.5.12 + version: 0.5.12 browserfs: specifier: github:zardoy/browserfs#build version: github.com/zardoy/browserfs/e60ca69e74888e057a96a468afe1d62347d3f56f @@ -95,9 +98,6 @@ importers: google-drive-browserfs: specifier: github:zardoy/browserfs#google-drive version: github.com/zardoy/browserfs/ab58ae8ef00e3a31db01909e365e6cb5188436e0 - gsap: - specifier: ^3.12.5 - version: 3.12.5 iconify-icon: specifier: ^1.0.8 version: 1.0.8 @@ -5754,6 +5754,11 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /adm-zip@0.5.12: + resolution: {integrity: sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==} + engines: {node: '>=6.0'} + dev: false + /aes-js@3.1.2: resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} @@ -9402,10 +9407,6 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true - /gsap@3.12.5: - resolution: {integrity: sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ==} - dev: false - /gunzip-maybe@1.4.2: resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} hasBin: true @@ -16121,7 +16122,7 @@ packages: version: 1.3.0 dependencies: minecraft-data: 3.62.0 - prismarine-chunk: github.com/zardoy/prismarine-chunk/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b(minecraft-data@3.62.0) + prismarine-chunk: github.com/zardoy/prismarine-chunk/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) random-seed: 0.3.0 vec3: 0.1.8 dev: false @@ -16196,6 +16197,25 @@ packages: transitivePeerDependencies: - minecraft-data + github.com/zardoy/prismarine-chunk/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0): + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f} + id: github.com/zardoy/prismarine-chunk/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f + name: prismarine-chunk + version: 1.35.0 + engines: {node: '>=14'} + dependencies: + prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) + prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + prismarine-nbt: 2.5.0 + prismarine-registry: 1.7.0 + smart-buffer: 4.2.0 + uint4: 0.1.2 + vec3: 0.1.8 + xxhash-wasm: 0.4.2 + transitivePeerDependencies: + - minecraft-data + dev: false + github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0): resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f} id: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f diff --git a/prismarine-viewer/esbuild.mjs b/prismarine-viewer/esbuild.mjs index 91b787db..9614a3ad 100644 --- a/prismarine-viewer/esbuild.mjs +++ b/prismarine-viewer/esbuild.mjs @@ -52,6 +52,7 @@ const buildOptions = { metafile: true, loader: { '.png': 'dataurl', + '.obj': 'text', }, plugins: [ { diff --git a/prismarine-viewer/examples/playground.ts b/prismarine-viewer/examples/playground.ts index 8563791e..bc9294ac 100644 --- a/prismarine-viewer/examples/playground.ts +++ b/prismarine-viewer/examples/playground.ts @@ -1,7 +1,6 @@ import _ from 'lodash' -import { WorldDataEmitter, Viewer, MapControls } from '../viewer' +import { WorldDataEmitter, Viewer } from '../viewer' import { Vec3 } from 'vec3' -import { Schematic } from 'prismarine-schematic' import BlockLoader from 'prismarine-block' import ChunkLoader from 'prismarine-chunk' import WorldLoader from 'prismarine-world' @@ -11,7 +10,7 @@ import { toMajor } from '../viewer/lib/version' import { loadScript } from '../viewer/lib/utils' import JSZip from 'jszip' import { TWEEN_DURATION } from '../viewer/lib/entities' -import Entity from '../viewer/lib/entity/Entity' +import { EntityMesh } from '../viewer/lib/entity/EntityMesh' globalThis.THREE = THREE //@ts-ignore @@ -355,7 +354,7 @@ async function main () { // prev = !prev // }, 1000) - Entity.getStaticData(params.entity) + EntityMesh.getStaticData(params.entity) // entityRotationFolder.destroy() // entityRotationFolder = gui.addFolder('entity metadata') // entityRotationFolder.add(params, 'entityRotate') diff --git a/prismarine-viewer/test/parallel.js b/prismarine-viewer/test/parallel.js deleted file mode 100644 index 10c4b252..00000000 --- a/prismarine-viewer/test/parallel.js +++ /dev/null @@ -1,20 +0,0 @@ -const nodeIndex = parseInt(process.env.CIRCLE_NODE_INDEX) -const nodeTotal = parseInt(process.env.CIRCLE_NODE_TOTAL) -const parallel = process.env.CIRCLE_NODE_INDEX !== undefined && process.env.CIRCLE_NODE_TOTAL !== undefined -const viewer = require('../') - -// expected values : -// (0,4,10) -> (0,2) -// (1,4,10) -> (3,5) -// (2,4,10) -> (6,8) -// (3,4,10) -> (9,9) -function testedRange (nodeIndex, nodeTotal, numberOfVersions) { - const nbFirsts = Math.ceil(numberOfVersions / nodeTotal) - if (nodeIndex === (nodeTotal - 1)) { return { firstVersion: nbFirsts * nodeIndex, lastVersion: numberOfVersions - 1 } } - - return { firstVersion: nodeIndex * nbFirsts, lastVersion: (nodeIndex + 1) * nbFirsts - 1 } -} -console.log({ nodeIndex, nodeTotal, versions: viewer.supportedVersions.length }) -const { firstVersion, lastVersion } = parallel ? testedRange(nodeIndex, nodeTotal, viewer.supportedVersions.length) : { firstVersion: 0, lastVersion: viewer.supportedVersions.length - 1 } - -module.exports = { firstVersion, lastVersion } diff --git a/prismarine-viewer/test/simple.test.js b/prismarine-viewer/test/simple.test.js deleted file mode 100644 index b58cf9ae..00000000 --- a/prismarine-viewer/test/simple.test.js +++ /dev/null @@ -1,12 +0,0 @@ -/* eslint-env jest */ -/* global page */ - -describe('Google', () => { - beforeAll(async () => { - await page.goto('https://google.com') - }, 20000) - - it('should display "google" text on page', async () => { - await expect(page).toMatch('google') - }, 20000) -}) diff --git a/prismarine-viewer/test/viewer.test.js b/prismarine-viewer/test/viewer.test.js deleted file mode 100644 index 168154dc..00000000 --- a/prismarine-viewer/test/viewer.test.js +++ /dev/null @@ -1,109 +0,0 @@ -/* eslint-env jest */ -/* global page */ - -const supportedVersions = require('../').supportedVersions - -const path = require('path') -const MC_SERVER_PATH = path.join(__dirname, 'server') -const os = require('os') - -const Wrap = require('minecraft-wrap').Wrap - -const { firstVersion, lastVersion } = require('./parallel') - -const download = require('minecraft-wrap').download - -supportedVersions.forEach(function (supportedVersion, i) { - if (!(i >= firstVersion && i <= lastVersion)) { return } - - const PORT = Math.round(30000 + Math.random() * 20000) - const mcData = require('minecraft-data')(supportedVersion) - const version = mcData.version - const MC_SERVER_JAR_DIR = process.env.MC_SERVER_JAR_DIR || os.tmpdir() - const MC_SERVER_JAR = MC_SERVER_JAR_DIR + '/minecraft_server.' + version.minecraftVersion + '.jar' - const wrap = new Wrap(MC_SERVER_JAR, MC_SERVER_PATH + '_' + supportedVersion, { - minMem: 1024, - maxMem: 1024 - }) - wrap.on('line', function (line) { - console.log(line) - }) - - describe('client ' + version.minecraftVersion, function () { - beforeAll(download.bind(null, version.minecraftVersion, MC_SERVER_JAR), 3 * 60 * 1000) - - afterAll(function (done) { - wrap.deleteServerData(function (err) { - if (err) { console.log(err) } - done(err) - }) - }, 3 * 60 * 1000) - - describe('offline', function () { - beforeAll(function (done) { - console.log(new Date() + 'starting server ' + version.minecraftVersion) - wrap.startServer({ - 'online-mode': 'false', - 'server-port': PORT, - motd: 'test1234', - 'max-players': 120 - }, function (err) { - if (err) { console.log(err) } - console.log(new Date() + 'started server ' + version.minecraftVersion) - done(err) - }) - }, 3 * 60 * 1000) - - afterAll(function (done) { - console.log(new Date() + 'stopping server' + version.minecraftVersion) - wrap.stopServer(function (err) { - if (err) { console.log(err) } - console.log(new Date() + 'stopped server ' + version.minecraftVersion) - done(err) - }) - }, 3 * 60 * 1000) - - it('doesn\'t crash', function (done) { - console.log('test') - done() - }) - - it('starts the viewer', function (done) { - const mineflayer = require('mineflayer') - const mineflayerViewer = require('../').mineflayer - setTimeout(() => done(new Error('too slow !!!')), 180000) - - const bot = mineflayer.createBot({ - username: 'Bot', - port: PORT, - version: supportedVersion - }) - - bot.once('spawn', () => { - mineflayerViewer(bot, { port: 3000 }) - - function exit (err) { - bot.viewer.close() - bot.end() - done(err) - } - - page.goto('http://localhost:3000').then(() => { - page.on('console', msg => console.log('PAGE LOG:', msg.text())) - - page.on('error', err => { - exit(err) - }) - - page.on('pageerror', pageerr => { - exit(pageerr) - }) - setTimeout(() => { - page.screenshot({ path: path.join(__dirname, `test_${supportedVersion}.png`) }).then(() => exit()).catch(err => exit(err)) - }, 120000) - }).catch(err => exit(err)) - }) - }, 180000) - }) - }) -}) diff --git a/prismarine-viewer/viewer/index.js b/prismarine-viewer/viewer/index.js index 36cfd94b..39ee4f54 100644 --- a/prismarine-viewer/viewer/index.js +++ b/prismarine-viewer/viewer/index.js @@ -2,6 +2,6 @@ module.exports = { Viewer: require('./lib/viewer').Viewer, WorldDataEmitter: require('./lib/worldDataEmitter').WorldDataEmitter, MapControls: require('./lib/controls').MapControls, - Entity: require('./lib/entity/Entity'), + Entity: require('./lib/entity/EntityMesh'), getBufferFromStream: require('./lib/simpleUtils').getBufferFromStream } diff --git a/prismarine-viewer/viewer/lib/entities.js b/prismarine-viewer/viewer/lib/entities.js index 404b22b7..d97784d4 100644 --- a/prismarine-viewer/viewer/lib/entities.js +++ b/prismarine-viewer/viewer/lib/entities.js @@ -2,7 +2,7 @@ const THREE = require('three') const TWEEN = require('@tweenjs/tween.js') -const Entity = require('./entity/Entity') +const Entity = require('./entity/EntityMesh') const { dispose3 } = require('./dispose') const EventEmitter = require('events') import { PlayerObject, PlayerAnimation } from 'skinview3d' @@ -13,6 +13,7 @@ import { WalkingGeneralSwing } from './entity/animations' import { NameTagObject } from 'skinview3d/libs/nametag' import { flat, fromFormattedString } from '@xmcl/text-component' import mojangson from 'mojangson' +import externalTexturesJson from './entity/externalTextures.json' export const TWEEN_DURATION = 50 // todo should be 100 @@ -62,12 +63,14 @@ function getEntityMesh (entity, scene, options, overrides) { try { // https://github.com/PrismarineJS/prismarine-viewer/pull/410 const entityName = entity.name.toLowerCase() - const e = new Entity('1.16.4', entityName, scene, overrides) + const e = new Entity.EntityMesh('1.16.4', entityName, scene, overrides) - addNametag(entity, options, e.mesh) - return e.mesh + if (e.mesh) { + addNametag(entity, options, e.mesh) + return e.mesh + } } catch (err) { - console.log(err) + reportError?.(err) } } @@ -75,11 +78,15 @@ function getEntityMesh (entity, scene, options, overrides) { geometry.translate(0, entity.height / 2, 0) const material = new THREE.MeshBasicMaterial({ color: 0xff_00_ff }) const cube = new THREE.Mesh(geometry, material) + addNametag({ + username: entity.name, + height: entity.height, + }, options, cube) return cube } export class Entities extends EventEmitter { - constructor(scene) { + constructor (scene) { super() this.scene = scene this.entities = {} @@ -257,6 +264,11 @@ export class Entities extends EventEmitter { } update (/** @type {import('prismarine-entity').Entity & {delete?, pos}} */entity, overrides) { + let isPlayerModel = entity.name === 'player' + if (entity.name === 'zombie' || entity.name === 'zombie_villager' || entity.name === 'husk') { + isPlayerModel = true + overrides.texture = `textures/1.16.4/entity/${entity.name === 'zombie_villager' ? 'zombie_villager/zombie_villager.png' : `zombie/${entity.name}.png`}` + } if (!this.entities[entity.id] && !entity.delete) { const group = new THREE.Group() let mesh @@ -313,7 +325,7 @@ export class Entities extends EventEmitter { } } } - } else if (entity.name === 'player') { + } else if (isPlayerModel) { // CREATE NEW PLAYER ENTITY const wrapper = new THREE.Group() /** @type {PlayerObject & { animation?: PlayerAnimation }} */ @@ -369,8 +381,8 @@ export class Entities extends EventEmitter { this.emit('add', entity) - if (entity.name === 'player') { - this.updatePlayerSkin(entity.id, '', stevePng) + if (isPlayerModel) { + this.updatePlayerSkin(entity.id, '', overrides?.texture || stevePng) } this.setDebugMode(this.debugMode, group) this.setVisible(this.visible, group) diff --git a/prismarine-viewer/viewer/lib/entity/Entity.js b/prismarine-viewer/viewer/lib/entity/EntityMesh.js similarity index 57% rename from prismarine-viewer/viewer/lib/entity/Entity.js rename to prismarine-viewer/viewer/lib/entity/EntityMesh.js index 881ad8c9..6acb665a 100644 --- a/prismarine-viewer/viewer/lib/entity/Entity.js +++ b/prismarine-viewer/viewer/lib/entity/EntityMesh.js @@ -1,7 +1,9 @@ //@ts-check -/* global THREE */ - -const entities = require('./entities.json') +import { OBJLoader } from 'three-stdlib' +import entities from './entities.json' +import { externalModels } from './objModels' +import externalTexturesJson from './externalTextures.json' +// import { loadTexture } from globalThis.isElectron ? '../utils.electron.js' : '../utils'; const { loadTexture } = globalThis.isElectron ? require('../utils.electron.js') : require('../utils') const elemFaces = { @@ -175,7 +177,7 @@ function getMesh (texture, jsonModel, overrides = {}) { const rootBones = [] for (const jsonBone of jsonModel.bones) { - if (jsonBone.parent) bones[jsonBone.parent].add(bones[jsonBone.name]) + if (jsonBone.parent && bones[jsonBone.parent]) bones[jsonBone.parent].add(bones[jsonBone.name]) else { rootBones.push(bones[jsonBone.name]) } @@ -213,28 +215,136 @@ function getMesh (texture, jsonModel, overrides = {}) { return mesh } -// TODO! -const entitiesMap = { - // item: null, - 'glow_squid': 'squid' +export const knownNotHandled = [ + 'area_effect_cloud', 'block_display', + 'chest_boat', 'end_crystal', + 'falling_block', 'furnace_minecart', + 'giant', 'glow_item_frame', + 'glow_squid', 'illusioner', + 'interaction', 'item', + 'item_display', 'item_frame', + 'lightning_bolt', 'marker', + 'painting', 'spawner_minecart', + 'spectral_arrow', 'text_display', + 'tnt', 'trader_llama', 'zombie_horse' +] + +export const temporaryMap = { + 'furnace_minecart': 'minecart', + 'spawner_minecart': 'minecart', + 'chest_minecart': 'minecart', + 'hopper_minecart': 'minecart', + 'command_block_minecart': 'minecart', + 'tnt_minecart': 'minecart', + 'glow_squid': 'squid', + 'trader_llama': 'llama', + 'chest_boat': 'boat', + 'spectral_arrow': 'arrow', + 'husk': 'zombie', + 'zombie_horse': 'horse', + 'donkey': 'horse', + 'skeleton_horse': 'horse', + 'mule': 'horse', + 'ocelot': 'cat', + // 'falling_block': 'block', + // 'lightning_bolt': 'lightning', } -// const unknownEntitiesSet = new Set() - const getEntity = (name) => { - let mappedValue = entitiesMap[name] - if (mappedValue) name = mappedValue - return entities[name] } -class Entity { - constructor (version, type, scene, /** @type {{textures?, rotation?: Record}} */overrides = {}) { - const e = getEntity(type) +// const externalModelsTextures = { +// allay: 'allay/allay', +// axolotl: 'axolotl/axolotl_blue', +// blaze: 'blaze', +// camel: 'camel/camel', +// cat: 'cat/black', +// chicken: 'chicken', +// cod: 'fish/cod', +// creeper: 'creeper/creeper', +// dolphin: 'dolphin', +// ender_dragon: 'enderdragon/dragon', +// enderman: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAY5JREFUaN7lWNESgzAI8yv8/z/tXjZPHSShYitb73rXedo1AQJ0WchY17WhudQZ7TS18Qb5AXtY/yUBO8tXIaCRqRNwXlcgwDJgmAALfBUP8AjYEdHnAZUIAGdvPy+CnobJIVw9DVIPEABawuEyyvYx1sMIMP8fAbUO7ukBImZmCCEP2AhglnRip8vio7MIxYEsaVkdeYNjYfbN/BBA1twP9AxpB0qlMwj48gBP5Ji1rXc8nfBImk6A5+KqShNwdTwgKy0xYRzdS4yoY651W8EDRwGVJEDVITGtjiEAaEBq3o4SwGqRVAKsdVYIsAzDCACV6VwCFMBCpqLvgudzQ6CnjL5afmeX4pdE0LIQuYCBzZbQfT4rC6COUQGn9B3MQ28pSIxDSDdNrKdQSZJ7lDurMeZm6iEjKVENh8cQgBowBFK5gEHhsO3xFA/oKXp6vg8RoHaD2QRkiaDnAYcZAcB+E6GTRVAhQCVJyVImKOUiBLW3KL4jzU2POHp64RIQ/ADO6D6Ry1gl9tlN1Xm+AK8s2jHadDijAAAAAElFTkSuQmCC', +// endermite: 'endermite', +// fox: 'fox/fox', +// frog: 'frog/cold_frog', +// ghast: 'ghast/ghast', +// goat: 'goat/goat', +// guardian: 'guardian', +// horse: 'horse/horse_brown', +// llama: 'llama/creamy', +// minecart: 'minecart', +// parrot: 'parrot/parrot_grey', +// piglin: 'piglin/piglin', +// pillager: 'illager/pillager', +// rabbit: 'rabbit/brown', +// sheep: 'sheep/sheep', +// shulker: 'shulker/shulker', +// sniffer: 'sniffer/sniffer', +// spider: 'spider/spider', +// tadpole: 'tadpole/tadpole', +// turtle: 'turtle/big_sea_turtle', +// vex: 'illager/vex', +// villager: 'villager/villager', +// warden: 'warden/warden', +// witch: 'witch', +// wolf: 'wolf/wolf', +// zombie_villager: 'zombie_villager/zombie_villager' +// } +export class EntityMesh { + constructor (version, type, scene, /** @type {{textures?, rotation?: Record}} */overrides = {}) { + let originalType = type + const mappedValue = temporaryMap[type] + if (mappedValue) type = mappedValue + + if (externalModels[type]) { + const objLoader = new OBJLoader() + let texturePath = externalTexturesJson[type] + if (originalType === 'zombie_horse') { + texturePath = `textures/${version}/entity/horse/horse_zombie.png` + } + if (originalType === 'skeleton_horse') { + texturePath = `textures/${version}/entity/horse/horse_skeleton.png` + } + if (originalType === 'donkey') { + texturePath = `textures/${version}/entity/horse/donkey.png` + } + if (originalType === 'mule') { + texturePath = `textures/${version}/entity/horse/mule.png` + } + if (originalType === 'ocelot') { + texturePath = `textures/${version}/entity/cat/ocelot.png` + } + if (!texturePath) throw new Error(`No texture for ${type}`) + const texture = new THREE.TextureLoader().load(texturePath) + texture.minFilter = THREE.NearestFilter + texture.magFilter = THREE.NearestFilter + const material = new THREE.MeshBasicMaterial({ + map: texture, + transparent: true, + }) + const obj = objLoader.parse(externalModels[type]) + this.mesh = obj + obj.traverse((child) => { + if (child instanceof THREE.Mesh) { + child.material = material + // todo + if (child.name === 'Head layer') child.visible = false + if (child.name === 'Head' && overrides.rotation?.head) { // todo + child.rotation.x -= (overrides.rotation.head.x ?? 0) * Math.PI / 180 + child.rotation.y -= (overrides.rotation.head.y ?? 0) * Math.PI / 180 + child.rotation.z -= (overrides.rotation.head.z ?? 0) * Math.PI / 180 + } + } + }) + return + } + + const e = getEntity(type) if (!e) { - // if (unknownEntitiesSet.has(type)) throw new Error('ignore...') - // unknownEntitiesSet.add(type) + if (knownNotHandled.includes(type)) return throw new Error(`Unknown entity ${type}`) } @@ -256,6 +366,12 @@ class Entity { } static getStaticData (name) { + name = temporaryMap[name] || name + if (externalModels[name]) { + return { + boneNames: [] // todo + } + } const e = getEntity(name) if (!e) throw new Error(`Unknown entity ${name}`) return { @@ -263,5 +379,3 @@ class Entity { } } } - -module.exports = Entity diff --git a/prismarine-viewer/viewer/lib/entity/externalTextures.json b/prismarine-viewer/viewer/lib/entity/externalTextures.json new file mode 100644 index 00000000..a5ec3d13 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/externalTextures.json @@ -0,0 +1 @@ +{"allay":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAV1BMVEUAAAA4jNkuh9Ypg9FBnNpCm9r///+c/P+A/P9k+/9N8/hM6f9Q2f8+5eo94PdG0P821+4s1ewiz/8syf8ox/8bxPNNq+wQwf8os+hCnNpCm9oep9s0h8D7j8AOAAAABnRSTlMAoKCg3PODq/XXAAAA60lEQVR42tWP0W7DIAxFb9OtwdA6xQ3rzZL//84BD0nRljzsZdqxZCx8hLio3Lz4GwtYMWLDi4jnPM+vwogNKTTC43Elr6vgRMQ1wvM5ktsbvRPXN38wGxKHMmnI9M65vgxavwsg2WCpCvlSg6iqlCF4ceKbFEGZVC+5NFFXYUtxZzILl1xmiffoxUcA5DUHKULZp6iqsQzU6KNWYcxBUMnp8A2mwWxAhTPR0qRYFs6sDT+zTMZpWj5pO8L0wamexJ9xXvm10J27rrQ94dSdOqC0PSFXPV4JRuwRzIxGHMB38O14j4N9Wf4/vgDzpRGDwkNeQQAAAABJRU5ErkJggg==","axolotl":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAP1BMVEUAAACvsv+zsPmmqv+nn/+GkPXWhCt+iOyBb+d1b/9odutodOyTWuRbb+NlZfS0W0xsV+JpVuNNWc82QZ86AGw+Ir4cAAAAAXRSTlMAQObYZgAAAUdJREFUeNrtk9FugzAMRXG4twFS1jbl/791cbJUQnuAmE2VKk5cKpDukeNA9zeAhP4mwDlgahdAEoDm1dAukIzmlXaB/HBcUGbQJCBkBejgkMrt3j5WeYGD0iAglkXkehVZFlBQ2b0FkKjtE2CjIIYEUfIhESdMCUyWoyBFZPZI+Nks8OUs/f7kXSsLgCxwiRbBl9YRgddazcC5lhnc/T1VFdQObDMIwdJBRQQhYNWBTTCXYzR0AMZIyOy9c373FuQFGXLJLzYFEJQvQSHKgwKwJQAF1BWqIBC6hNlKbAg0GPXyjDHkeqoj6iVAn4DdP/NQhuHxsAr6HroAswB52QUcySTgeGQGg3J8lPY55h7Q9705XQdpEgwaHXVhtHZQX6Whew+X+mfldsn5W3fEYM9fVjfm/pXShd1g38UrdvuIGZycnJy8kW/CDQ5IMRlUUgAAAABJRU5ErkJggg==","blaze":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAJ1BMVEUAAAD//////4T/+Ef/1Sj8shf8lgDReACrdQGLNAFsMQBfAgExDgs044iSAAAAAXRSTlMAQObYZgAAAPdJREFUeNrdzzFuAjEQheH3vNR4xtCkibyQA4CSCyAlfZocIjdKm4sFxAHwGKVmQo21Ts9X//IbE1evBfpBjG9ozXDlJZkKTkAr4IpShNVkMjiJ7wuUkwEJhcAmAzFGNcTJoFisJZph6heJiG7xDLT4XKRC4KiubvSf24kY6hiLnVPMVfE+NhPbo2Y3YVBfPA2/Q3PkchGGx++H4yZvd3GdNrjBr32FeDzPUdN88Mvn7QRHHiSX9SkMwnxYNTdkq7sDlMsLkZHRBEwBGaBpKnQ6GqsVegLIfrDOfOkGI0W7gQTN6JhJQlcYCOm+oJyjHyD+F7jg7v0B5TtIgi1mkx4AAAAASUVORK5CYII=","camel":"data:image/png;base64,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","cat":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAATlBMVEXv9O3r8Oj72bPW1sz71Wf2ymD1yF7ywFnxv1jvt1Pqq0uvdh57bWJjSy9KMBc6Kh0RDxgAAADq6urOzs6vr7C+c3NanRJWU18kJDEcGCdfq47cAAAAEnRSTlMAAAAAAAAAAAAAAAAAAAAAAACVcz0/AAABUUlEQVR42t3T3VrCMAyA4Yi1SmtlSxSS+79Rkz6R0dEywTO/0rPyPst+IFhiMSJyAW+amJBFA08EEWBeBQtQ/1BKuRuY5yAusACo4ABSBUpFxbsCPkJKDgiLgAktANYYOFhyDlxQgFCFbUA6VaGg9lsAj3LExmBCi1i8MdDNBWJ5GBDmFmBhFuE7ANQWgInVY+q8B8wh58w8gy2rBxASIRJ2gVwBOOf3oAFQ6wL1kP0QeQU0AhRdIb5eAe+15V1vAWqB/X4E2PgrADtA3O/XgJ3WTSDeCJi8zcc4eAo+QroBsC7hC4AMOAspxGQNAUZdTDwAtkdAQrTdALQAMYX4FkIYA1VwoNZ+CynqCLeuIOSkAYyAqRZjFyDNAe8FytIOLuoCNv3hkLPtkP3k8xNc1RthZ6YiPwAMmmoAHUC028DGCKevkwg8DnxafwDmO/uHwDebkIAap1EwrQAAAABJRU5ErkJggg==","chicken":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAALVBMVEUAAAD////i4uL85XDT09PhzGLGxsbgu2nTrlrQqT/Bk0OWcjRjVkH/AAAAAADtfCsnAAAAAXRSTlMAQObYZgAAAO9JREFUeNrtzMFJxFAQxvFZrGAewaMwwxQg2IA7fMzZElQecxZswHZc7CAd2MM72IlJVoXEbATP+7998OMj2kmHW6LXQ9/T0AUt25UuB/D+dgQ317+AXLZ7OgxN4vmJ5vGxforGXhbgSj9ElFqjrxYXomN+GriqmqG1H3E3B7DmQN0A0Wpk0laqKlw2gKv9AdycbRNE1dgA1SOy0hTWQCIrgqaUlnGBqkLY4aeAq0FYfT/OFRBQVGERWQddAKh7ZuFVUCwqorow8166jgVzoBaZWV2FRZS5iM2BYwKwBzEfjJSYg/zOIx7hDk86948+AcUmS5dD8ZFCAAAAAElFTkSuQmCC","cod":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAJFBMVEX///8AAADr2sPWxa3KtJXCqIW2lmusiVmScVqEZVEiHyYAAAB2QJV6AAAAAnRSTlMAAHaTzTgAAACbSURBVHja7coxCsJAEIXh5w18RSRiZQT7sAS8Rgyz2kbYIN5CiDBbx8CewHM6QS3sLf1hivl4yMc626+ZCgKQzENVF6eSsaCVkRCRfCiZhFYwcM4t+13SqFdOwS6/Vw+5HA3qFyz7beOqriX9ezFsKmlcySn4lFKMMQiJGYWwR9VQyTnGmggh3M7eeyGBQ0u4TwZkR/C7P/weVk/OOkCzBdD8ogAAAABJRU5ErkJggg==","creeper":"data:image/png;base64,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","dolphin":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAP1BMVEX///+wwc2In7V8gp1ZV3NXVHBIRWP////D0uO/0Nu9y92wxNmwwc2lutCmuc2dssmSo7qKmrGAhqJrcY4ICR+8V/49AAAAB3RSTlMAAAAAAAAAVWTqWAAAAc1JREFUeNrt1GGPokAMxvFRz9sd2+kz5fb7f9ZrmYECnuDmkn3FL0oaSf8RJaT7iB6Pz8/Hg3J3u91+mzRCITtVIJwNS3JcUzMHSlkErtfr3fQAPQxB8uhVYPAA5xHf3fQNSguU6eSLwJ9hHXBpROTXR5S7F4GcLTBd5ioQP9BuwJF4gWU/wAt2tumBpnQRINoEhGUORIHeDggE0gJlWgLKPHUvLkEEqLUCIhZAVQXsaCoAP2q38yMG1Y8vdcOg7utD9VsBFgNf9zfEcO7eCuTMvdG3bb0X+K3AL3sDzGmlFNpVZskB22xxR9sRENkGUAqA4rDWPoqPk+OngIaKWdVnaVAVo2pDBKotGl+KQhurUa1zQAQjMRHICywCE3/vSrq2h0+/8KnDvC5s95m5D6ntR4BZLpfL+BgRv7WEKKY0Y03d3UWALZ5GlLMAkjPFdBQgskCOQKbl4ThQiEoEQHlEiGkRwItA3OsKalsa07cCg+/51hBTBGQvIIJxTWHUJ0Bk/V8AEXsKpD3M8Ux1ywCI8F5AwJD/CAhUtBUkFYeNMvlXQABVf3kCHgBq1YVagQgcid2N6tIxEWGXZ+ykScdie4En6XQ6nU6n00/7C3s4RNq7Xn9vAAAAAElFTkSuQmCC","ender_dragon":"data:image/png;base64,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","enderman":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAY5JREFUaN7lWNESgzAI8yv8/z/tXjZPHSShYitb73rXedo1AQJ0WchY17WhudQZ7TS18Qb5AXtY/yUBO8tXIaCRqRNwXlcgwDJgmAALfBUP8AjYEdHnAZUIAGdvPy+CnobJIVw9DVIPEABawuEyyvYx1sMIMP8fAbUO7ukBImZmCCEP2AhglnRip8vio7MIxYEsaVkdeYNjYfbN/BBA1twP9AxpB0qlMwj48gBP5Ji1rXc8nfBImk6A5+KqShNwdTwgKy0xYRzdS4yoY651W8EDRwGVJEDVITGtjiEAaEBq3o4SwGqRVAKsdVYIsAzDCACV6VwCFMBCpqLvgudzQ6CnjL5afmeX4pdE0LIQuYCBzZbQfT4rC6COUQGn9B3MQ28pSIxDSDdNrKdQSZJ7lDurMeZm6iEjKVENh8cQgBowBFK5gEHhsO3xFA/oKXp6vg8RoHaD2QRkiaDnAYcZAcB+E6GTRVAhQCVJyVImKOUiBLW3KL4jzU2POHp64RIQ/ADO6D6Ry1gl9tlN1Xm+AK8s2jHadDijAAAAAElFTkSuQmCC","endermite":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAADR0lEQVRo3u2Y61ITQRCF5wGsEhESCrkloiEhITctQG4xiQQRuRuIKPrH93+Etr8OHQOloPyQbJKu6prNzu5mz+nuMz0bwpWtL+7LVqkl69lzWU5tS3IiJ9NjL+TZ0+cyF89I6LJ66di8+qoZ5mLpkIhnuqfD6KO4+e/stvse1OqFc9EXk1rpSCAD4G1Pysx46hoBq4Vv5mvZZpifzBuYvyXgtvseDHi9qF44k7N4yXwzeyicf1dsaTY0ZDW9K5WlExvVw1buOOg1YS2zF/TeUM03yaDwdun0Gvju47vuezDTP5dq/pMBfZP+YOPyy4bsvv5u55mnJJhTANKzQO5rRBaQ5fmqFBKbUkxWZGXhvUW/VmgaaH5TFmTGXFfd3kzz21K/501T3qKoGWCCSCbUVBNUtKwcOKeiJRNPZiU+MmOORiS6BDKSBADcvHjeIcEBVwqnspE9MgIgBLCTowkjITYyLVNj8zIbW2D+j7Xf80bd4lrvDv6fMyCSte/WKH0xEfMRcXPA1Hwlf3JnBiCKCOLG4kHnOZExIs8L+0gpAN6WR40+vQHgOefNEeBjj6esR/AMWEvvGQn+nChlgC53TfGRqOOoP/2BAlMCdkTB6crwWbZLF7Y6+HWsIlzLvGZA5zlRygB7YR8BbYAU+Eb2wIBxjHMe8FzD0klvwDzHdo0e+3MiQwAR5YV99PpfvVr7iaodZz7K/soP6w+cAL8G4LaXUIL8OZEigKj62O78diy9yQCAA5RmiPTmOgjgHPNEnBaZ+5wAnhMlAtidtZc7dYRONynmCjIoAUEjHzTyJpAInp3XJRPRY2QViKwRsc3cUafOKQGEDWdOI29LG0RBAOA18qb27AsgJNIEmKJfEcCIOwnUsjY7oa+NKLt6m+Jn2moPAZBDc0Oa9zMBmtotaZS/At7qmpRWAsgOAx+pxuY+GWDKXbwwEm7u7yHCxY7a7zv7BbxljupbVuimiBECEDxteoyIvrOd8qUBZROk67+pPEABTjZo+9sBjx70tfnX3tRUOSQnsmHgbCV/aV9t+Vw9M54aPAL4Xk8GaDfYG5+s/1MjZILHqE2Q7ev53Ra/Zuj7PgDxAyhC6B80BqoPGNrQhja0Qbaf/P4PM3XaxMkAAAAASUVORK5CYII=","fox":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAgBAMAAACm+uYvAAAAJ1BMVEWAgIAAAAD59PTn2dPVtp/nj0G0j4PifCHMaSCwUSKOPyRWPzQGBA4kh8LGAAAAAnRSTlMAAHaTzTgAAAGUSURBVHjahdAxb9NAFAfw8wRIDLkFEsSCG4kMHVAzwAiV5W9gXUdA1omugPWOEdpwzxthaP2qLhnrD9ClHaKuvQ/Vv2OnrZuhf1myrJ/+vvdO6YcZ8p/4jdZqoKLB87AchKCQqA9X2+F1HJa3sNuCUv/3ZfRV/q3hMP4E0A8DSABN46knV1prUYm4FJGK/d4KyJgyTfP74FZQZOZvkiSfG2AA86xYwyHg4x0U9AgUtAlDZiYibvN7Mknyb5PJeKxGVQelIPM4RjVG1Ahl7CF41XU9j8e3IG77bfb9yssJYKHXAWCf5kctoIwnArySra3pdLqzI3UD7RwK0f0cTD/cAS7rwL5TK0D5HjzJfmK7TYhedoBPDCsiHfgf4b0LQWvnOE9S9n5WuAaSXazVgO/AFRn1piIuARUTGQNQEtTg2ekyAghAmAz1wXXgjSGAVFwPWU4WOPyXTeyx95R1cAaQhSZyNrWeiIoWShkB5gDObcpEM9qEfAXG9MC50ua2whlmD3ARzu2Ly+vzL5pZjuy+MPvC3QC9wfXEFSoo+QAAAABJRU5ErkJggg==","frog":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAQlBMVEUAAAD9trb/ioq+rWqxnl+mkE9/oFjlXl5zlktjkC6NdEVWgCLMPj5NgDBGaypJax46Whk3VBkxRhRGKiktJi0uHRCwcSzMAAAAAXRSTlMAQObYZgAAAadJREFUeNrFleFShDAMhBEoZ1x1Qz3f/1VtQm9qgVoZf7h0pqWXr2k2M8eQJMBwSSJSvStpow0sUmdgCHMIbEQTIgCo5CMkzNM0zaEBgPf7x0SNUfUBhHmeQwOoiq4zTPOUhk32BF+VomvAlDAPT1jY+LRxXrQlqA638G3lHkKQxFL0i501vxzus2WIyunjfidUYwb8uClU98mr7CyRFGwrh4ecUwABj61Iwlt15zcwSeHjAGgS379fILxTk+I2mt0gCRmyXpNs5qeJZ4BQKQW43ToABITgEgAU4DaOt58Bwp/fAxChlAzj0zj2gOcKGK8Brh6wyBmw6bv9SCMpAybfy408ZPB4UlUpAp/pBAEbBTiqZO7V4Nm1NESU/BFYdsDSBaQCpAvIDpAWUOwnSBDwSSTt2foUICT7SqVPjx3qaeOUsHBTjOoiAdrr0BCEGK5Ilg7wtwwgrEj3ZKXscnM9AFRCBO5JZE0IGc/+xbIpCV53v8eVjQ9K3qdgV1zro8hrtuIKkC3Cr53dPFIqcxG9EjaPTIPb1DGpVmlEaUNHa924dfgHfQFwmyc0LyT5NwAAAABJRU5ErkJggg==","ghast":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAIVBMVEUAAAD////5+fnw8PDl5OTk4uLd2trYzMydmZlzc3NLSkr5ldknAAAAAXRSTlMAQObYZgAAAYdJREFUeNp9ksGN2zAQRdmDO5iBfN95JlWAgeRuAkLOZuRNzgrcQYLdBoJVOoirjCmRYDYy8i//wIc/n+Q4J7gs6YgdJxFRBBNXVQENRE8yZZG187sKkEIGLi/z/HL5D/Blvt3mH+8Ay044ZgBeb3e90QDVCkz94QFgpbGugOmvDPy2vxNYgMPnDFCAloCoLgDXqf9wfJBgKwAfU/+M8S9AGQH9MXzDSskGYJQRgcMEurkmDSCxfSiABtCeegsssuJbQETFTKS6q6r/v/FOl/1wXSrRtQOESDh1F6aeZG12mKBvC6N9Bq6nBtA8xApM5vCJRxpXAAdgEfg6f/80/wS8wggrMCwjbCl33T09Zw+6dqolB5/Yw45p9xRAORMiaB2hQLTRlLSWHNTXBHICwD6Jv0Qg3E3CGTDWLffOJ7B9NFkTRP1ZYbTRkyCaUxiS6TCyaBhNwwgoOQGcMsp+RBRe38CE4axrhxhKAlYqALmEEqIpRA9D+SwTikQpt1n93R5IcTOKi/wBKsTOnkkgxrkAAAAASUVORK5CYII=","goat":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAMFBMVEUAAAD////6+vrw7+zq597b1cLArJCenp6ciHaDg4OFcmF0c3NXV1dNTU1APj40MzImjJ+xAAAAAXRSTlMAQObYZgAAA5JJREFUeNqNk71u7EQUx0eb9YqKZ4jOeFPchjAze4s0rObDQrcy9ngU3QKixDNaueAFaChIFFHQR4IGci2078ADoER5g0g8ANqKHs7YeONsyIqf5HP88fP5j3dt8r+ZAAOokPxVQaDgvc/J9Q8bgsQ24oCnlFehfVWYUMrAuT0CMAZVE8JpCFer8O1HfRtFCKVUFdbeVRVuZ7O+jSfQOGEdqkrHKwm2XQHAhRYFaYzOk76Nn0Kg0GCEBW2O8lnfxk8hMCK0rjJSSrNM+razBtc0vtAppOnhpG9PQlJFmjbYAiTY5bRvO4IL+BS1qWqXJ33bFVzjv7z//f5h88fHfXsREXxOxuwKIbhd4YDSyiDaDpQUAXb4TNAaBdxiQQGQ4+H5U7CZ1kbXeL0rRQqAznZCFDDC1tZWOpbzFCPE0wQKtdHZ5/H277pSUEjnczYIBxSsMVGwUbBRoGNhmrLaZeZdVdf2g4mlECk9eiuXg7Dg/tQZ8+Gytu+rWC4WgtIL9SRIu3KZD5d1cFkshRGpkmqISLLitlmFq6v2arXKYvk5M9qWehBmzrbfN6v21za2WG5xSbW3+fN3nkrgez9Myrgkw9DQ/c3h681WONCCA+wRJlQoyvcJAJwPE3zmry79zIbTlcuHCEbVdpE2tb62iTSZM8ttBJdCkZ4UZG3lRKZHRh+OItgQYebSGj0t7Fzb5RAhmIRBcM464xPvTf20BsqVGtbw5/2P95vN8NoPEamiQP4TCsAAIMUe97oXmo/d7rQCzijITq2QYiSkwAAFilWim9LT6+vrchwRBd7BUKAvBQZM/itIBhyi8CyCoUGV4lwA7okXE1IZ71NKCRFn6fnuBCrRUFpbISSTUnUTKoA363Uv8KKUkluFApOqKBcVMhbUpCykKpVdCCnL4sAQJKF8K9hJXZbleSEW87K059OcRIQ+GYR8mkxre14sjua2TqakF7R+txVwYELK6fz4GDseJwhRNApbEjIlx8tlMhwlREIU9sDYyX4B2Jsd4eGGjPnk79eF7v1N/+oaQnpuvrm5ITPnvD9be8Uov+DATXMLKem5++nujiSZ83W+/oqDMJVm9LP3t1yMJySLrC5z/wUHjjD6aeX5gvQ8/vb4SMjbk18u4mdhBLLQzjmddZ9dTvBTuCekyZOWtHi+MsY4pLWOEGqEJJuHzYaQszyZkbZFpaNt16EhhLuFIhuEoDF78ZP9A0Obf2KBegjhAAAAAElFTkSuQmCC","guardian":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAhFBMVEX///+rjEZQjnQtWUcAAADX1c/Y1cvX1czX1MzX08vW083X08rW08vX0snW0snV0crAuq7Auq3Auaq+ua3dkET/gi+DpZy5k2Syk0/wdyjecipqlYPsZCqFhmBmiYDLZSNdf3XeSSh4dVCmXCxOeWbUQSDKPBxBcVpkW1BgVko5ZVJ5CxKoxgN0AAAABXRSTlMAAAAAAMJrBrEAAAOASURBVHjapZaJcttIDAW5lvfIHtnLYiLDee4kzwsL+///F45I66AkW467akSoIHRhhjOkuq5bLper4fL/wHAhiscBItiMIYSgm+j76GOga1xdXXWD4PNy2epHQ9q1HrAz0+mneCswfeB+K/i8Wi6HsZoEA4vFojtP4E1vO8GmvvWw5QUBEd4TrFabBj53F9LbEfZOcLt8WN2ubi8WTEu7J1g9DPUPt5cLPBM83N3e3g2C6+tu4PqYmaCPxk5w99/9XRsvCaLR9+G0Y8ID3f3916/DuO8azwmMgTA4WuQWp7uvEy8KYFObOQpsR4K7S4kJ7Izod1MYaSvwetoivk2wWAyCGR4PUNmZbawHnOWLBTQeqxgZj3PBWQEHbhPRD2TfrlNuOqCmPQs2I6M/I0hCAleAgtwKNrmeMhIux1lBLwklknpy1l0rbfXinMD0SEDTxDwXLlVt2tubwrrbY02fNZFxlEMoKpB2gsfDHz2G/fev735+/6/NcU6yC0lxVtDbv7z78aff39s6EiRylRFxdgoB//z25x/v/kKa5ygD0T778/tAYMCS5rmKsoTKz9wFYRc4kee3OBU0byJtBZr9SFkViAqsnG8yQGpDz0whWqmi0DynPU4eJmy6xUDLffz06UueP+xnBMkueXPz4UvW9ws+thZEveaBkmV2325ubj59gXqFgPV6r4OhhQ9DD4cCIZ0XPK7Xj/MO8lDgFwWzNcjZDBC6cArddBcOkcyld6Htgx+6GXq+g2z6Z8HivEDPCSyxGchInN3K50A22Iim8ZNAESnFgKTjg5URaEyiAZA4mEK4CtPcCs97rngqEukcW5gJsgzGZTEThBKaYaynEjutQ0FRxs4T5z8kmbGF5nJVumYCtdo28NFDVEjpafZ22lQWsw5Mtmo4fg8IcE6fzjKm8EwALrBPvQckV1S5QrgYMDYHAoHBzjqeQogKRVRIY49ZTjQT2K288NEiQiE1C5AeV6o83wdNXRiYC4KUhFNIZELl0SLKgKn2oflG0saaaMCYsdOZYCQlceo9gJTQrttvB4JdOAVItCcTgl0sYIqRnuKUOBJk2i1pp/fi9BS3a/va4nK6uxqReqHFq7naCix5X3B9kiNB9yToUzJvEVi8SSBDvlXwpjVAAl19h6BX3wNm2ng4/SqB3MCVU5T1OgGokfb0/LVpczpVfuqPyjdt8tQvCjuwWwAAAABJRU5ErkJggg==","horse":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAh1BMVEUAAAD///+lpaWGhoareS2nbh92dnZxcXGPaR1jY2OKVS6AXCJyVBp2SShRUVFvQh9hOh1FPC9ZMxc2NDdOLBM2MCZTJQ5OIgsrKi1JHwkqJR0/Gwg6GAUhHiEfHBcuEwQpDwMjEQcmDQEiDgMbDQUcCAAZBgAPBwMNBgMQAgAIAAABAQEAAAAaegGbAAAAAXRSTlMAQObYZgAABHpJREFUeNqllouaojgQhTOzuurYitKsNCS7pR1lF2fe//n21CUBvMznN3MISYVQP5VKEN0LKitT6Z6rKovNZlMUm6KsnCtgVlVRpbFduYMw8qIKq0zlDkAgd+WrgNKqDNiIilcBmwXXi6rAPARQKOD1CCqroNVWAd++IYJfBVQ7+IOwq55M+PmF1WKLUlRlWRRlWRUPAbufXNiutihlIRE8m8KiwjLxQqHCWVaLtJgFlr6sxqtfoYstURQvRQBgwcAxgB/GusvY8wvVo8HX9Tog+IASRTfbetp9Dqjr3wL4+nCofYxEU8BisX3anQLgf/CRoOjqEELycCuzcvex6voARKQQKGImaPJWUmPoPpb41xQgIplJ3jvuJQXOQTAAKcCErTdspPtljMT5R+w1/CPbZB03SPfv47cRLl9+IHYR1T++AKEdDO7/Ev2TWqci6G8U7XiJAM6ASASeuKOA5Xw2my/b1I4AHyjaCd5z1BFCg04g7WCwnWoCiNEAsnJZ3LPufgh9ZCbA+8fH+yQRCB1Rj7Wftfv5DKHP25Hpa68FHnzYLmDdAdoW5etXhD4yzZGLVAZgZFAAP2e5tAiW6z//WC/bkalugpDWpnA6Se7uALP523qmUzDT3P10CieIRi/yev325vZwBA2lHZleUiA1ceN42U7fz+fvJ1kPKAN0/RFPOzLFjbimyC0DTud/z+f/zifyQnCm9qE83EicI/lIEQA6nUUAgKAAn0VpfxiY/YiiFhwOPichIAuyMl4BbB/QC1GVART1iAQBENAogOS9NACccaCPYQtBAeFGznSAyBLQNPIDpYBAcQLYrlar7Ttqad+3E0CMY4AiAKABcDwenQn29YrmBgAnTgNcFZEB4RlA36JHABQFxEcR9N3n8fjZ9RNAfpsBgIQShEB3EbA/E6QT4x0gzyFQAlxVvZYLnAG5TACQ8Q2AIhEIub/KgdKhvly6z8/ucuFbWYEoeC/mQWQNACFCaDq4dz28u65Hm3IgN3ueqnxf1c8A0wjgBoB4d5DlIEWARFoEYwQ6CMAAcNPH94zIOZBlgz8RI2ALoc4QW0YMX3sGcLniHHIAwS2IP9zNURGyjBkAP10CnNMcjJJoADFqi0AUCF62kHzc5MBLEjUJFoFUDEhz0EejdGxMc+DtwyxmbRGg4CAK9tGSh+dqkgOLIJg3BAMCwFNMe/k60ZCDNIc8AwPAm68TO0O3gCEH+isfIEFoIoM0zKXhbcTbi9OanIMUAE2SCJjNLAPIwdFOFOSg7zkHtvJp8sZLyyjmeEwb7/PX0Y23b9PoLmzYsMVoGrXQGgMyf4/Dwc67rpGmwc2ocBm12kIffic9hEpax3Zjg3Kr5L6BakHZ7jSKAOEScGraXEAl4UkcHDp8feOZYIZctBswPV0ye/0AgDSGPMXGs4TTsKFJys8PqvRXLAihEQQqGPII8UTRAGVA86H+pAcMRyR7WEOGPGTQZECNDcsgsYJVLnLrs9hBx1hqycUkHrUvqxgONt9iUv+p7ocjlD66/wNdcSNfhkmkngAAAABJRU5ErkJggg==","llama":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAMAAADlCI9NAAAAVFBMVEUAAAD868b14rjx3K/v2anr057jypXMqX7EonmlpaW6mnOvkW2liWaGhoareS2nbh92dnaiayOPaR2AXCJyVBpjUT1FPC9BOy82MCYzKSMqJR0fHBcP+iOkAAAAAXRSTlMAQObYZgAAA3lJREFUeNrtV0t22zAMJDAg+0ulxm7URr3/PYsPmUiMXja0vPJYJMbyAiOAGjynN7ACCmVkPO0AButlC1ueRnEkgBydAHBA45afIICJ8bEG/htvdhHRcI4APIGU7wVAauUB4wJiUX6OgAIymjaACLNLEBjPxJRZTjkDh4Ag5EHEuCUvym8pgOgTAZFWdw3Gc4EU3LQCpPhEQJbs2TXGpxTbbyygKNIhcom8UpRVbiwNQxS0AytEuvaqMs+YlWz4jQQwMdEL8wuRUgaaAIFyhkjN27ILwgvcjIhsx5AAZiL+8kWDUiiqAHddAL0AAM2TiWvVBgXw9x9PTz++814Ac61H2SFMUAFiplq2dAaYTctRC/RCawCFbQ1B4oFaopwC4OZ9uwJ49+HpowWg0QqAHCgVKdCsf18CEYn7cWbIdx61QQf3AhQQRc67FrgEA9roHK0AVXQCwIAAbj8NSt2R2xvC8R6eI6COYOwFZEEMZmlngGm0BYi3Gf0hjFZDcu58KH7xJhA5GRmCBLCjFpRqTGK3cHgEAGZhrkYA8Fjx+etXIl1MtaDOkgCsS7JsBcRcZF+ul2ngDEROejUBrxTgGuMQKnojMgAMRdWMsRYwRSt1cSy/m9gSSVbsBCjEhHH1oiEfgCVn9h3vb3bMl3oCvABdE9pAYpACAxUAwTP7jhbIQvJBAM3fIfttqS4wZkQIv4+AoI0nWP2lHEDCDaoCDAgQ1ONskQXuL4ibSRD171sQXYCA6ykEBgRYqpAB1tWiHD/U8tfxr8U0imimeNoMiImp3+VtIG3cebnM0zRf1hbTKCQjQ0R0N6Iri4SoQwFrhzSKLJLjgywwgqzL4wcBy3vplf65SRcsP8xbxFjRLS7lBwKmdZknLf28bmgaQv2H4SEr8Ri8pN6ZlnXV69u31eNyky54Ul1xOQ1eckm9M9ljX66/fl4vq9Hn5+d5uAKezD7FVv1W99Q7k2Wd5t/XaV6DXqZpVEDpbCZvQuqdabHE02xZGx0X8AlS70xLvP/zrPGdpvPQO9N6hFMF9M50bxw4033RO9PRMDoVvTMdDaNT0TvT0TA6Fb0zbSbQcpcu9M7kE8hH0LqhZwrosJlAm7mU7od47FmH0Bpz6eev6+XuAqbpMmt0ev2t9J4CZheg17qh6X6ICTSHDzR6TwHrIdIDDzzwwAMPjOA/NfpDB1xAY2EAAAAASUVORK5CYII=","minecart":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAAM1BMVEUAAADBxMW2ubqvsrOprq+epKaUl5iMkJKFiYt1g4ludXlsdHhham5SVVZNUVI/QkMaGx04QmSDAAAAAXRSTlMAQObYZgAAATFJREFUeNrtk9FuwyAMRVMa7jWzwf3/rx3QLmsiOlpV2lOPk+BYypFRzLIs53A6hXA617sSzsurEABTSkRPsLxGAIEYI0ACiCAC4tqp5fbARGApJavRsLoggLHGyrWvmAoOIPSWtiamgmw7MgIhcQuAM0G+U+TcBERcY+wNgJwJPO9wBAq3Blo+E+wM7ghSIRqkVGaCPV3w9RsTQUVAMRMC+MlkUHusISVfLlkoW8ZRbRmTRFXNTG9YZ1wdCoTqXsy8dNysuJtQ7Z6JoBTV0rlmrk3gB0zHW2gCU7XS6ZlrugrKxp+Ccuyg3ATljscC0eLtM/d+aX+tVfOy46GAQwGfFsiwA5HnBRwK+O4W/k/w/m+U4SDJ84MkMhxlmY7y8TCVGy8fpsR+WnXDGuPq8mHIN8fuL8tkDiT4AAAAAElFTkSuQmCC","parrot":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAP1BMVEUAAAD/////7nn/6j3/5TPGxsa7u7vZra23t7ewsLCoqKienp6ZmZmWlpaRkZGQkJD3cwmGhoYlJSUPDw8AAAD7udxiAAAAAXRSTlMAQObYZgAAANJJREFUeNrN0tEKwjAMBdDGxpnbZqtx/v+32jYMN9QKPnkhYdBDk0EDHSIQ0CGBDkEV/pFgahtgBhxEZu7nSGj1Ajg6SAmpVQe4M98hgHCMVUAgqklbObgyXwGhXczUWlXg10Z+bj/4i3X19gra1KJrDfVGakcARdFyqyEHS353w35J2oGiBRO8++miqrU2MJdZIN6pJy+Lz3Cgs04yeaees6qeByMypZQo548jLDdl9mnE8D18B+EyBiG4+AGMduBwCi2/g+BiAAJ/BTwEW/4XPABsMA1LwNN2rAAAAABJRU5ErkJggg==","piglin":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAWlBMVEUAAAD/gID/////7aj/5bX12iryuobMzIPCwnTooHTVlXreihzJgmWHh1e6ZkWtVTKiWTplXEOhPjiESzOXQyKNNQ1rOSR6JiF2Kw08OS5TKxpgIwo6GgwhHhyEOBusAAAAAnRSTlMABHH+CSEAAAKgSURBVHja7ZZxU9swDMXDWAMSRspwYiDQ7/81pyd5Vzzf3Oz4t78GRU2kF9m5Hm8y7h8sMM34zMQrcKZj3BvTRHMVoHVVJwRm41n1eSDwYFSB2QW0AoG4psY0JgRAK5BeiV7TWCD2wLt7AXkhehE1Du1BL6CPKT0quL4HgMgFxIBAy6xt3hICsYniHBRIzET+6Ij1jxg3/NUyXxEwiK0wiITZBJC3And3d10uzCzKjOkNOzGrX6wKJoUVpiTJQ5MbVseyqpX9SEQWmHUV+4obhI8LQCd5aHJDBALCRLIaQuRfWSRhBK51M7bKQ5MbqwpLjAyB5Kmw6AoFToZAgNCE0OQQMIXEGHkFtU3UUsUU9XX6DnlocgNNql4HvEuRAzWO/Kx342xMFXbibWwb81TJOS+oOyQg9reK8mafqbLkJR8UEFEW3nRjzDBV8nJwAgGs1qoY5DKB0QrEukrJZc9BcXz7S6AiolspC8AMIJeLQME9xC9JJppL3FmKen/J1moPsOhFzfi4gXNZvMuKdiL0xmPLVjBaHTBiK1DQH8lealfyB1mIsbEqIABcBETQKjiDYsRi84I0WwYp6yeilFgSp/iFBgJVSMchBeTsR82RVgFiCIAJgMRkihBn/w0XI9ZS+/GxtK1LXyaQVnkHn3acLDhlh6TIkQms6s05/Tw9vQUfJzs+3v45Aa4mXCTCCnh3nj73T0wQOY6oQyT080WAqcKO70H2F9tsQq3zpzdLOJ/P7+/nX+84I8SqvT//2QKEv+umGzdu3ABH/cLAFxwVGPuC4xMs353AGAmM/ELvC8b0fqHzBUN6v9D7gjG9X+h8wZjeL3S+YEzvFzpfMKb3C91/5TG9XxD5zgTy3xP0fqHzBWN6v9D5gjG9X7jmC34DNs5yRa6KJBYAAAAASUVORK5CYII=","pillager":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAflBMVEWnra0CAgIAAAD////Hzs6Trq2VoKCVnJyVm5uTmZmQlpaOk5OLkZGKkJCIjo6EiYlmh4VzeXlwdXVobm5nbm5SWFhQVlYyZjx2QypfNiEmR0daLzg5Ojk5OTlPKxlLJi0fNjYqKikeKio+Hg8lJSU2GB4yFwkeHRwjEBQUFBN24XvqAAAAA3RSTlMAAAD6dsTeAAACP0lEQVR42u2VYZOaMBCG1TOCDUYQemeqRDEq8v//YN9laQYckaAzbT/ckyPEmXsfdhlnnUwbwlBKGS7CBjmZfn6m6WQ6G2DiBHUegrTmFUHIpGeQSorT9fcEixANvCt4rwVm4V5ig7/AvQRJ+AuQQPOSgjjwzYHPw4Im267AnaW3wIXbdxINC9zDZUPbADwEHMnztZTrPOc467wEa+SJc54vl3l+bgqADPgJJHf78SXl1wd/oDgb1sMCeg4yifqxXC5Vwk93DAsSMoBE/QQqkZxPEvrDNSxIWJGyIOW4Y1gwG+BfCS4Nt4YXBJso2ngLTsBe7bUlQB6GMQLkrYfAvwJq4Z0KYEDeR3C6QzOGBEb/wQCtRwjMZbVabQ7G5Qk/weFCa3fYIb874Nxa/YLj0QkuN1r49/0eEZxbq1dw/AWDp8C/haLwbMGa7XarjTa2UwGWXwXNW7a6Zqu7EQ8BPfoKDDSEfcJDAYWtIQlTMBVvXR4KIDaoHApotLmWTFWUZVGVXXoEhquHgS4nAF6C2Qi+Bd8CYi60ibIoe1mAvAmy4C2BzWB4XSCszdDDaAGHxVzE2jCxGC2IYyHimAcOBPFoAWY34MFJuxMU+5pyPhei5PPDCcRD9niiHaP34AQlJg+oRFGIqgA9A6Q9XGlrC0oSxKCi/FiBfcJdC27R5gQ49662gN8VV0ibE7jCUOWzH5KiNrgOuwJXEZ7aJ7jd4QT3pfa1oJTKAqWCDPcsU9noL5IKAhUFUaRqAvX/TKTfnHu1gRak8lQAAAAASUVORK5CYII=","rabbit":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAMFBMVEUAAAD02ezy2Ovx1unxzue0pZSkjXOUgWKUfWKLdVp7aUpqWUFjVENhU0NZTDtSSDkNYhzDAAAAAXRSTlMAQObYZgAAAYBJREFUeNp10L1uE0EUxfERBdhQ0PAivAFPgUJHFT5ewC7TBJ8LBW4i3TM0VEgz09B6ptiOV+ARkjJt5GJyNbubtZLdv7zro52fJWtdq5aqENe3prV37vl2v959dK2SCsERQBrYwtoNwOdAP4AVrAsDZ7iUAWSG6B/AZtsAvsgl6VqBjGkEL84/NcAPvBoBlSnFfmL37z/Exxi/xj8x9kBVUsptBsX1DRjtCIAbUkjqSptZYflSyikA0HVdm8dM0pdaK87x7WwC9qTNZ+/ckH7G1Xv7RVCIj+3emXrzdgT0geJczaH9JcKnarlHGSDhoynOg2PJQYUqPpVuDtRjUVGIip3PAedrf7kVLtz0NYXarkUAEBBgGQgVBBeBMlKC+kUQfLQPEyGK3WYLi3RT2adDyr7kYAAbWD6dgpJKLnYr2UBfKqegDh0jx2JH96TVz9tpzLX+MYJf8+Bl+juNuV7FEeQFcPg9jbleH/YDuNvPA3s+jcd9L+1FqEiqVlZMZ/eZmCL8uK8JdAAAAABJRU5ErkJggg==","sheep":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAAM1BMVEX////w+fz49vUAAAD////49vXs7Oze3t7S0tL/uLjmlJTAnoa3lHuviGtXRjoICAgAAABdC2QvAAAABHRSTlMAAAAAs5NmmgAAAhFJREFUeNqdkgFy2zAMBOMqONC+hdv/v7YRqCSMPO0kvpFEUhKWwBEv29Rl5MgcUo7U5dDLf7Qdep9cFNJINeEpQCoyx8id8BxgSJHaAXoOIMWRQ16+oUfAyNSMH08BRg5lu/jDDC6HUhEjMzWGfgQYmRE5QhkairGv1PVo/GoFNrKjsLG3bX/7AZA0rjcL25R8u3YpzZgAsANbwvEI2H/lhn6/2q9/xI02oouZAFsIBTZRnAHz90psqKzUrrYz3wEdCzZlcwJ0sVIm12v1Yq73awKEsNMCYThnoOP863ar2Qf79mN/vpvIYWBgsk6Af+tyQaCQcTFnDso29vcAKDG2yxZ0KCaDFTBad7hvb/MVICTseZloK3ohFg+0jcwGDOmUQSJCJjFB0DxhFsCmdq4z0DkDu2MKBcZWBUQQWkvYs8j7m8bYthWAbRVk2SSeHRGmlhKUYx567piHDKiykacHiTAWZmnlJnS8RmoFkBK2FdgUvYjp62Jib69j+ArQh22JwGkC265PQG/erT8fK+AwHkOY6JEG+hPgclFlCoxZASZQKKd5CMsWRCwmGibDprBXgA0gCQKZBgWBlwzALkw15wxIEhMVMtjOjo71FIr5CSj8FYCxQVHYCQSAzdrKmIIy9aaTB02WfZwfIthhImLxwEf9xT48tDImpveRBFAErCUUZeZNA76lD8B9VdX9p4C/n54rtHuYBiAAAAAASUVORK5CYII=","shulker":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAzFBMVEWOYI4AAAD////m8K3h6KjT1ZrHw426tnmzr3GsqGujdqOjdKOjcqOec56ecp6ecZ6ecJ6ebp6ebZ6Xa5eXapeXaZeXZ5eXZpeXZZePZ4+PZo+PZY+PZI+OZI6PY4+OY46OYY6OYI6MYYyMYIyMXoyJYImHYYeJX4mHYIeHX4eHXoeHXIeHW4d/XH+BWoF/W3+BWYF/Wn9/WX9/WH9/V39/Vn93V3d3VXd3VHd3Und3UHdwUHBwT3BwTnBuT25wTHBuTG5uS25uSm4AAADM1DMFAAAAAnRSTlMAAHaTzTgAAASDSURBVHja5ZN/e5s2EMdpk2Xrthg8dKfYuMVet4U7sTr86CRskuL2/b+nnUiN/Xh7nhT2574guNOdPjoJEby6ULFYlEWSbGtp5Sr5ayM6xnr7QsFlR9I4JtswuYbZunITBOc5LwMWlhGZpOUKjK1HAwpCpTWAQq2U4v1oQM3gpQBiRMzay/iLgJUlRAWAKBi2xWjA0rGK1R2AFga5ajSgYI34fAMCP44H0B0opTQqQEQevweJywCw3wJUxpWjAe8aAwBKAfR7UE/YAwC8Q+URCBOWUFKMKlaACCJqzw+SmJtv+Iy50szSSEPWlKMBya5h43ZM1nJmXTEaYIu6bauybevicV9V7Yu/c7EMk+JduCyW0bJIwmybhCtvl8l8IbGsTEKxZ6tiEa2KJJK45C3mSz9uu5xlwdKxJUeWHTnecbtyxpkdu9yxv/ZLlzXkjDXea8w+OeY6FovaYE6NQdMwsDOKXBlJBMUG6t/lTOiaLSuWnMyVoXEEvS9viQeJ7Q8/+AuQWqkIUWkQyYPalTWAIF3gZSSegyiOAaVTKiiNQp+qfBa7emsQlEIEgdyxqwqGGJWSBNCKmqrIUAN6Oorv6iBxJI4IY60cp0njfQ+RHsebd45RpMUFbWm9sKRVjH4IgvhBRE5s6YoRFdsqMo1CD9DyMk01zy0o6NNjJFuGPl8jgC+LXOUrSDdp2jdQ1EoF6dr78lTQ70mart9u0rdpisD7lSXx5ZIbNbfB1sBwOEK/5uzkz8X/kzE9+rfUFIWBwZ/5Cu6dSQeAy9f3jk6+zHYvbQBak0r+egA43gRzY0/E3FUh2VMCuTLkZohHZMsod+sBmLsy+N09nBJ+/dDeu4chIfztw/7efThN8P7h031zlv/+YR9441Kbr/L2oTscum64uxf/xkt1xCLKmTNmw58nALr80PX6fOj4MAXAncmNlxgvL2Fz4XZ5ZwTiJSR+Gg/gjg7S2AjniSdUIOP6S9afT1qCr5sOxhdiDjQNcJDLc7ibAqDOPLEcJpnfs0YDpOp+C5npMKkCX7c/SE9yC2LCUc46zpmIc8PUTQHQ8U96kuckALHpb5GhlwGXv3Mnkqll+v7570d5dhtGURRGx85ZeBvezue3Rz+chdE8nIdDfC7ZMmQAhICgENNhACoFZ/6tUggAp3iM+hgPnhMkrPTwBSONWqtzICAinIAQK1QDwBMV4NkMMwRBxCfAnfZTDBP8on3B6hmwXcoKNUAMAD8nW1Mns9DPqATy07L4Y5tE8xkoP0D9uCqzIpHFgxaiBolnQWIpZkdgHGtyvF5YFtsAO5ZG6dLbO4O0Y2QrccnLXQ7kqI8HBTfsZIQ8M0u23LKTniZrSHrJlaWxfUTiufRVEheW5R1Jy3ZlsEyrtkzL9mNayPvjp9W6eqylr07rtko/7pO0fpT4XmJttSnbZVpLbvlYie/7vh6k6+urq+vrm5s3b25uXo3SEXAl+i+Aq17/V4Df/3Ndf9W3A64uNBbw/T/0Q68RS/B6/eXq6svrZ/u7XiMBNzd+CycDjhs5BfA3y7f3PUOzujsAAAAASUVORK5CYII=","sniffer":"data:image/png;base64,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","spider":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAKlBMVEUAAACSiX+MgndgVEhPRTxHPjWoDg49NC0yKyYmIBsmHxoaFA88AgIiAADotIQjAAAAAXRSTlMAQObYZgAAAgpJREFUeNp10rFu1EAQBuB7B8RDUCIs0tB5rUuUNAivfBKvkI5b/eNLyVkzg6hQYGfyAkn6oDwAFUUqUvA4rHTGthTlb7b4P+3urHZV4uqqsuKbHdNNz3S9A5V1NUVIVW0leQfOCuQvhNzTDJhF3W6RlUvJV5R7przjBSBxu5KbHmV73OJaUc7DBDIVIKs5zuSU4nSIkYotgSUox25z0GAtfe+qk+GWN0PCARhI1fgwyJhjpOb7QDQBN0DVJ9BRiJmhB8CQAlhlAfZNaxAfb8ziwuSLQeqmrdx8BMJi0qsvBrms6hP3AuZIFxNYRJBj6L5W9d8UYg8SGcGmjSlRFuOB1/vqz7v6mLYbcscIEoYOAjNLoB+/6urtbwarGabB2q4juBnR5dnj+fnZ4wlDM2QEbQhdVHXOoLr69PBwVFfM0sNmgEE9g5Ve34U3dTh9IcZu/0Gsw2atboDL6f37u48vL+7E4c4jaD80YU2ult0v/NvP01d+707CGMG2DVVH5uNrPk0a2oog7vYM4G1qgN6FngEAgZmc8aQKMTSBgY62KbShCwIKaTODGPhztU6csA11FTgJQhNpBuGoNM2QIGDsQx0ktfF4ARKDIiKYmUAhdMZtxzIDYN+g5xLJVO4Aw8BYAG9L7waQeiaQGwlIZ5ARu9g7a9Yc0wYFK+kCeAbgDvfegdK7qyy+4z9b0kGP3NmJngAAAABJRU5ErkJggg==","tadpole":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEUAAABtUz1jSTNTOSNJLxlEKhQWCgDfr9AwAAAAAXRSTlMAQObYZgAAADdJREFUeNpjYGAyCglgAAFGRVcHMINNzMgARBuliSUZGQEZzkZGxsHODNiAs6KwA5RlYsBAOQAAqGUGQPKmAvcAAAAASUVORK5CYII=","turtle":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABABAMAAAAg+GJMAAAAMFBMVEUAAAD////K0JHCt4ComnNHv0qUi2OCiFQ/pEI4jTopfUkwcj8gakMlZDMbWzExMTA/pVLKAAAAAXRSTlMAQObYZgAABDNJREFUeNqd1s9r40YUB/DAZr1Z3JT+By2S6XnRiJyD9ZjmtBRSUbWnQITMQlgKXeJL6aGxlpltD2VZjKY2uRW2JodAlxAxm9DD4satYnKuI7OH0qUkEfQ/6Iwk/7isrNnvSUb2h5n3pHlekqkG9AVC60vvnLuEPJsCDxMRL01pYIWQ1hRwo+T6leeBixUA234MsJV98Cxdxx5YFuDSwG3b/tzFX8nLigtoDZngpdlSAHYbOYCMmoZMBaAa+LaIQ0/i+GKpsm1ouqYhFYARCRCWAZamGcLACkD4ITn+nvzXyQCUAWvlgdWQBQGlrBNLYFn8WO7BVABGTQ/Aa56kQAUAtBoAzgHl3DI0rV4XVVQDVvyWtT4FdE0dcDbr9yaAbiJ1wN80Pkqv7riWoWsIGmrAXX9Py4BbKN2CjhQBsolmQE0dWAlaZlaDZWTUTFNDpirwDNazGnhQr2mAVWsQMjf7cgWQ2IJuYjWgGoZTwHIxbIMqwHl7AmCrpmMFYBkAHhx5YfpSt971ZL7tt8yC35Y5Vfdq97JLxoiFkNwBqJyq5Ds9B8IgIIQ89lzLQGZ5wHmqTQBGbZ+0AOmarius4CnKAR4y33E+Qyapm6R8DeietZ4DzJft2CAy5YcjbYEEKp5nU992GKEAIMu4VRLotPGP2aWF0AZlbQCsMl2rnaMJQEQC9gIZCFQAfvTgMAd8/wvKfpU9MKHkXCSs7fE2iGx8uuQ4NmX8uGVstJA5edpNE0q/W7IHtHNMZPIVpPMaewtr8tYuWHJezwD1pPN6rRiocnbm22TQ4SPO/2XsivOLOcAwFgNhNyBdxnnMTznrnPITNWCV8796vd6IixE75pyfxvEMSOf1x8XAe6PLg2ESHYwuo+RG7CJOrn+b3kznNS4G7kT9YZIk/eh3r/FtEg2T5lzT5bxetIJlgETkbxDBjWbTA1ifA3StEKiOX0H28oDIcMSvB75t0+jqMAd0ExUC798IADdFdgVwniSsG9hOl+2/zu6n8xoXrSDuAzSaMi7g81HI6B+93oCyw5IPUvXkDVgZsA2f3PAwePLcdnpkBtQWAWNAzTRfm/djzsgvsgbPaX5EyHm9CHCnwMOYd3uB/Ov600EOuHJee4VFvGx4GbDb2ImTq5eBWAHp8kkR5bzGBcDqOJqtYGcYhzSSXRjQvAbpvMaFW7h8NAW+kTVwRBfOnEkN0nldCPB5YCQAW3Th5ylQcQGKpr0EmtMapMCXogZPJFCQghXsR2kbD4blANmFeUB0IRgQ26FnndclAdkFKwdAdiH44YyQSD6JpSK70NjNa9DciTlnpBtFAe2UB8YwXcF9CTCxggErD8RvADLgkXiZRjzsMkK7jJcFVuN/5l7nm3icRCFjL4fJRdkuXPfngCi54uxP1hEzonQX4v7sRMLnMefhfpIwXrAFhXyw4P7/kgmYSeJwxJwAAAAASUVORK5CYII=","vex":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAMFBMVEUAAABthJtgeY9Ta4H////z+Pzg6fHG2eqivNWUrMOGn7eCl6t5kqp6j6RthJtgcoMKluMvAAAABHRSTlMAoKCgEjok+wAAAPlJREFUeNq1yL1Kw1AAhuE3hxYrRYm5gmivQL0Hwa1LnAtCFpdOjuKY4KBjfnYhIUPWEnIBhgxZRSjHC8hp3KWxkg5ndfD5pu8FDqNAKQkwKXIE9Fuj3zCQjECYDCaPs4tOQP9pDME4B1MAbIwTgJEwv2yixPcCPw2igGkcljlZ3YfP33WSJTB9yhG25HaJPLUBtkCdvl5fpVlVVRy3ntdQZW+eX6e77UIcNqAke0eq+JCgGvam4apoUGqtHtC067K9Q1O+l2WMJl9RvPAnl7+0L5Ao9NBB16GxZpZloTGFeWYC47l7DzrXcUF3sHTQjW9YoHMW4zn/5QeNK1xt8XQSVQAAAABJRU5ErkJggg==","villager":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAbFBMVEX///++iGy3gnKze2J6enpra2thYWFUVFRUU1NISElMODM9LSkAAAD///++iGy3gnKUj4m1e2eze2KBfXl/e3eja01vbWqQXkNjYmAAlhFUU1N1Ry93QjVcQjpISElMODM9LSkzJBEjIyMjGBTjk4HHAAAADXRSTlMAAAAAAAAAAAAAAAAA7Uh4SAAAAn9JREFUeNrtlN1ymzAQRm3cuG5C9oMFJIW0idu+/zt2/wieiTNAk0ufgdEKs0cryWJXB0RguUEO1/Xzc871Irs3AViTQdnYLgAzGfmPkFnT9V4tiAI+IyCB/19AVgA+KyCaF9FZL3iDlfUCAl0AjpYmFgWagjkJfjNCtCwgml7niyrmcJ0gho7mQkDrBJALsAhwyYY1IAP4bahgdmKFgBme8PjE/PRI3mMGG1gWxMpnE3GetmFiWQA/yJl/CpzJutggYAYYIjAyQfu8XlAv8DWCb5sFqW2Btk2llJSKctwqIAFJ8oVFQRL+ChcCEKGlKwJSQLRfENBHFYCMZYG+2F6tAOauFgRtC8K1RYSdVqhgd6eCUmIUxTtdKknySXchOYOQEhkAmNmm4YJ5FPWM0nRdbKNGZRxHH2KElx8CRmWCvu+7roxd17nADE1qhdR0RfP1mQZMbAqwnxcT9KnYS5Lc903Tq0U6jVTt+Xo5SesWCUMvIheUMvh5GnwqqpKUJPU0jUSik57jnyswABWgitMYU2MjZlw0X9ppDbpOTMSkwCCQCXw+FBe4uGGUdehGy3950ScaEC4/duwCaWHPorEdGSM/0mMRRlKYogD2bZzGZvuJIa+/SFIQYfCjqvb7w6EKDiYAGe5h4DU4/3o9ezSzF94JGK4IC84Tr+d3PHzwTbTqvQVkqjMlSEa5KjhYLUElPJxOD8r9/cmjGQJxJmMgQVN2B0UCbUxxPJ2+OyI4BnfKEcAwxF95mARL1BcAnJmcTIRqq0DzQsCZwJsEUIgGFUCIKmiTQEceZsGwRlBPQGHY3EOQB2Jalz9XAB11crFWUH+Sm+AmuAlugi8T/AM2/NtEbUTDnAAAAABJRU5ErkJggg==","warden":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAOVBMVEUAAADR1ra7w5sp3+uir4aBmYhudXsAkpVAV2wFYl0HSFcDQVAXKC8GLjcLISoRGyERFRoNEhcFBBJsUoYuAAAAAXRSTlMAQObYZgAABmJJREFUeNrtmuti4ygMhWMChEYrjtn3f9iVEG7r4E7iSyf7wyfcbGetzxIixTuXbyqloICdiCHDJV1+U0UEgFNiAOUdAIZApObfBlAUoLwToBCVE+B1gNvl+laA6+12e68HPoTgvXOAru8FYNrpgbJCAJwIgLHwhW4Sgo8jAfCjcSMIzgXAnJGZSO1f9wFgydiP4pS4fSNnMX+Rx98JIMLUQNQYRD0Mknog2bnMdDXrh4UAOQPIZl/GvWuiGwYXJ4DL5VgAZKDkYhqBRwIwwCKA8dKqTCkE9xoAGkAZpf+QRjQHADjF4NQDLsTEwHOApBFb4QELey7lH+WwwyZoZX0gUQiJ0XtgfxZkoHa1GQuQH6YhGCyyCDwHsOdf4YEMMz9qJ70AzASNwTBoBPAKAKWwDgBoIBMA5vYtBhaBg0LQA4xFalaGDsAYRHYexwNkmGGhGBUDetQgMF8Jf2EOQAHQ7FehmwPMthIy/9YcUAoNv3R2+F2wRLQk/J05kAH1/fJK2BCZJ7DjFiJ8AejwwxC+AeDLCRwCl1cBSAnW/hjZ43+OUeZCSrDR8SHof45nMhb1gI4PBFgnMBvYGwC6deBoEd3vdyKWXkV/cVdmMrMiae/0FgC6VQQpSSj+OgCpWhDoHSEww1MM3uIBc32bjG/wgJrV5qZNeg5wvdyOzgJqifCaB2Rjfj02BDf6ss89QG//4/A5UC3fTU8BrnRo5IkSiexAC7VLVuyKXZo8QHwAADMR852ll08temCH2lpzl5rbN5pZ3Znf6MJ7AVRZpPeXponaqczI+mFmaUi/ALQkUAIizvsAckaWCjVXTRXpqvSoIGsjKmUc60mUCUCccBGEvI+gAMVqwchjgRRoq6q2pVfr9Vt6AANoDNe9LjDrKjNq4uW3JbDuG4BoL8BMI1jUUCZBy3e9fscVAFkbsCUFN5zZrs2EXwIwcfm3Sga9+r3i9Ot5EAAKq3ETd6Ff+CO52uf7/TAAyLOrxA8ovZjLXLY47gdosTb7ED0Q9CHIfwTI2zwwFuR6Tya2tyUwtv4d5aTpd2N+rz6BV2zNOAOQjtHfrP9/SXcmsU/fAHLptAoAmAYvzQF7fuJFD5jwIkC/De4VQ4gdgKbhPATo77BqRbTUIlr8DjP3bCYsjfMWAHusZYBhGLAUjHYSHcEKgH5164XBDeoF1K6UUYuJWejMNApg/VYAspndS9+Vs5c6DMkNbNlrzz4MSqUCSs6zNWMdABPRTyEIzg1JanCDspSmUXn0pDkggwhZR2s9MLY58GMIvHMuSaMM3g0oTc6FWmoIMiElUK72sSEE9/pZBhCrUaowBO8FIFdsOCcnXfUAQCknKZSBzZPwfuflEHjnozdzMm4GgODkggFkCi47KYHyawBLGc3Mi6tYEKvRe6cgUgGU0QCC90JQjIBCILP/IsD4sNhC0n0aPgL4GAQgSgkegHlAD/Tajr8Jx5bKDiySdEdjmANEr7a8lz7FYAAZiDGFmLYDmMRsqinupbo4OGEA8xwgBIEQ6z5SSp8eoETKsBnAHGBWw+CEw2kfKtFsIUoxqAvEGFEitOCBiUmv7fPA4LyYFPmkzZTb83e/lNT3UQZMjGICM4goxk0AaE+BwfsghoUjSpXeSTcHYOIkDDFxYhFKExh6aSMAGoDzwUz66M0Z0rnwAKBOSMykNjGFD9UJnDYCQM1XAK8Q3kfp1BnehzkAbNdO0j2+zFYA3gegGeakSO8FQKsM5wBgUbVf9FPy7I/6zQBjBQiaSGK7proUn2JI84mFwlLkU83PNEpFv7au8UBKFH2qa11QBrVOibqdNOx5l7QdoGAEJSIxqg4IMUWtxMRzgF77AQosgjbF1XBIOohEBH4GMFq7C6CJRYlTrHlGHLUB49c98Imv1kgYki1zicGMsgQAaw8DaAJQ85wsz2p5uIVZBSxk+A4xO8gbtmY1FQtamjPAsDs+TlilrC0BBqHVrphpbN6cVpMsH0jBwn/MRAARMZqj6hAytEFZElbvDdGs9wD0RL3/Ta9Mwp5jtLrln4Pgs8ULAE+0CmASNkzCowBW7w27hQ3WaYP1AP3e8DkAFt9NWIatA9i0NyyosGDriqV5aWmOVQD93lCV/3yPKYlrpdKl+RqATXtDeqI1ACv3hsfrx73hqVOnTp06derUqVOnTp06derU/1n/AR0CP3Q2vq+HAAAAAElFTkSuQmCC","witch":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACACAMAAACMX59YAAAAmVBMVEUAAAD///+2qJWrn42rnYmmmoijlIOgkoCPj4+YiXeWdliWdFcltDWUc1Z6d3eAcl6PbFNra2uQXkN6XnBhYWFoWUwMixp1Ry8vaDVaTTZMTExHT0hQQy0/Pz9IPCc6OjpANSQkQCg1Lh0dPAkxKRwoKCgsKRg2F1guJxonJiYwFE0YKRoTLgEeHh4oEEIdCy8REREVByUKDAvCurIkAAAAAXRSTlMAQObYZgAAA1lJREFUeNrtloFS2kAQhiPphVJbKVq10XDG2Ba4mjvx/R+u/+5yR1U0d2SqYyefgcuO+T/2NoYxyw4PMyLPlVL5KN+gsuz8/Pg46+bw65dPtEoeginjBdFAkAvTEkwVxen1eoJRjg30FfTbgjAKQ0wlD0NQTEKQNq98ntcANhU3fQkVile1talogRJBkQsiIFG3QPnrVQHkNBhAt8BHCgKFxBURJSh8/hcjFeULECXwMzs4KYqTAwpLXgxFtwBXkWM6/gDGU0kHugUTMoDpeHx6Oh5PleQnExy0dAsmrICAmUp8S/ZeKQum/BFIFUyYWIEGP0GMYAEM+OeCgnkVQQNqCJrlcqlBDXBWqVGuKlSE1lVZVpW2wAtoeSxoWEB1XZVaKV2WqEBVleCBwNEaBFoEsm4Epaa3RgQlTvHmSGCQdxCYIKglWEOAbpdNAxclaoR8hWZwOGedgcABWkVQe0ENFY4lIIFmgVQaabw4CPzKglrX/MkNTuigAJpmQaUbrl4WIMXD07JKhHagMfiGigYmHFXVIahl9UNssANUAGdIw7FTgMslSAMAItAiCDpsCT/ZLubzppHcfD4D4tFVSV1UGwHycOwWXMwR/Hg0w3JBAuwaR83AQhORHtDjbgGYHc1mtH4DMjbN1DpUPKnseRZ+eRFjrbPWGKx88vev4gQGOQPYZJIFoQO7swNZXsSGLTzpYNEpcIA7gEHOxRY7RBFgBs4L/BycW6P0HaBar52VLxz7tAMJiUC6ySwiEBiZMucd8oR5IkAqCMS1EVi+2iwMFw5hEUTAAkuC2xsIaENUCdEC9EICRGy6wPEMsGkvWKcK1jKDrcAlbmENgoArt7/A7CFwDwRuDwFP0W+BJ5J+GyEwj+6CSRQYEZitgH6iBU4ExgtMssAaayCgR5QqK/8B2PgtWMsCePhhIB+wCX8H4PYGQdKJAG9JHYjAypNhKQ0ShshXs8DtIXCISMECrliYpbEK3AcSBS2zv6C9Y9pB8IaC/rfRkyZYRfKsoI0kspGOzrtuQdtHcEe8R0H/GfS/C23gd/uYNMH19+u9BFcbLs8+n11ePSSpgxU6WLUeea6TJsiz2xd88tsJ+m8h9osj+gvl3QnA6j7rBQ+uD9z2wMDAwMDAwH/EH571WWMJHeH4AAAAAElFTkSuQmCC","wolf":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAAw1BMVEXt5+jk3t/c3Nzf2dnW0NHKxsfIwsO3t7ferIWzs7Nu1Je3q6WhoaGdnU10oIaBgYEatVh+dnBegyJlZi1iWkAodi5WVlZUVFRERERHQjs+PTBENiY5ODVDNSWAAHY/MCQzMzMtLSg1Kh8sLCo0KR4ZGRkAAAD////k2Nnd2tvV0NDTz8/Kx8jJwcLBvr7UtaTOr5bEq5ywqqefmpaalZGnj36ajIiVhnmheFuUe2iBdm2Mb1JJQjk5PD85ODUtLSgSFBY76smzAAAAJ3RSTlMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/HzzAAADR0lEQVR42s2UbXfbNgyF6Wli41WZqm3NtkQOZ3ZVwwCFbShO6r6k/v+/ahdwtjOp/dJvvZT5gqP7HAC2GYZhWFDBYBIilsvLy5Ty8HsPiY4yirIQBgtfX1/HLlbD/xUcQIXh51JI1ut1TumiXyz6SKKkAi4AzEQGCLH7AhCpFDxMmBmAlNIffYw9MlMgPewrAPDHKWCxiAtmEFjYyogIrNd//frixU8/lyKIF4htdUAIsxIETiEAfMPGQRmDC0HzGt1Xz6AKUwAXJxC8VAgkb+TgIgIacV//7UE1K8Fsb477/fGN+Q1HAFw9e5auErZi5KcVANcsA+D3H+7vP+yFvA9CvBZhr8qmU4dP9Ukx3AzABP/DAwjE9hbGb1TcYnYCynCOksJYpwCR/cM9QfcPe3lSApWwAgJ5AbazPhhqCkgpvdwddnjOzlLKOZnEatH/CKKEgJ0w5CuA7WHrgL8dkNMVLMKj18BWxegBIgVHZQrIOb/cHDYO+CGfAIl1VMHjDYRvFATYQ9hMAb9Am08bJHF2dg6Z/wqq+9j3nf3wYmhjFWOoY+xirOowBWw3Nzc3R3w22+1utz0fHqFl09Z919e1WAqS61hBDsA6B4Bg/g36cNidP5bySKVtYmeDCkSr6nl8jiy6PkYsU8Dh+Omk4+EEIHosVFV17LouFhKlEioQapj7LoZYTwE2NaucXl9cvLa9XwSLUHW9DaERDayRd4ghdH++whzngM+f373LKwA+fnz/dvCLIIaqRgv6qGKAEJxQhVcd0ghfBSQHvH2P0I8h4O3Tt6Cqo+riZK8i9MV98HThcVZMQsyDiLVO7CjYEGYqSlSFAABYUwDx6T/YwEesTANWOIRxNCuRFLZWLtGqpmmW7QxAzGZdqllUDFBOAMvA9pgVuTRt2yyXmOYZCDOsjYqjeGAqEBPEBSIERkCaJue2BWbeA7jwcYACMbAl4CWI+NYBVAyQVmkOuNPxTvVubAUWJZQAJxh2ZAD8RKNyaVv7r+c5AH6MUbMKwW5NZKtamP26RgiPjkwruLMxpgBhvr29ZTEAmwsAtq3gMdbpNDIjfSBWaTUFrFJOVlvGQHrAm9XNPmEAwCqc7UWbpoDh2/WdAf4B+LQj08eGOFAAAAAASUVORK5CYII=","zombie":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAclBMVEUAAAAAzMyPj495nGVxlVtvlVxtlVtnkFYAr69ph1Z6d3cAqKgAnp5ae0gAmZlra2tXdUdOezZhYWFIdTJJcTVWScwAf39KaS0+aS07Yi9MTExGOqU2WiUAaGg4UiYAW1s/Pz86MYkwKHImIVsoKCgaGho5R/XAAAAAAXRSTlMAQObYZgAAAkJJREFUeNrtk2FzmzAMhpPNm+0akmjVqFRGEsPy///iXtnlml27laRfeWwswZ0eI3NsZkRFVWwUdHMrIqzKitKC3C4gVjhgOQLVOwQEAcvdAmViwZQiuKOFsj2J3i1gZWEVrAqEbxaIlkHMAni5QK15VRSpwTI/UFuYFnx/q2ZCQYyMEq5PSKWMJW8gZSv//av75rneqcJFxMqLemdiiq1zLraR6llimEtk2fdnpvZycfFyaeGScggkqKclLQjqWShG1RhR/XIKCEgWtCByLJs96tOTPiIROoogMhEvO0QWqf+AWqXdsQIEWfhP/AS/wXy//VXYji/Mz8N2G5iIPxYcC28EW0CsnxOwqnyqhTf/yQhy3/fjNE096Lru1CRl0dR0oGlSCAn5bteZYI7vCcYiGIYuhUa1CQH5kFIAVRbAHP8S9FeCoQhC2XgAKSDB8h9BroIMQc79aRhOwQwoqzkyTMt3Ke3m+CrIVWAxwzacTiZIRQBCgwyXgAgEtGAzk/tcdh6R2ETNkEyAOSCfBcykLjovyuy9j68CVPUAS4lWZB3AkQa8b1WlJMzqW9eykvhD9O8IkM1foR5Bg3wwlzlQJ967loQ0Ru+vD7EKMjJggnJsuKosYZpA2TsXiVnjdQvnsxVa+fm8B93QdbanlRUBkoBFWMk574RF/PUbPJ9R+OVhj/BsgnEap1xIoZsmyO1EcyYI0IFXQTz4+CoA+4f93uIPAMHYF3JTcyRokkmodbFVEo6HeNisrKysrKysrPyDP68WY0lh7YK7AAAAAElFTkSuQmCC","zombie_villager":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAt1BMVEVskkNwbWdVczVjW1tWYC5jVC9IYC4/WChUSSg4TSM4OyExPSUuNyQAAAD///+Iqlt3oEd2kk9skkOCe3RyhFFmij9ffzdwbWdedUVXdUdVczVjW1tUZkBOazBgXjhOaC1HZTdQVzdUTU1PUTNBWSiZKys/WChcQjpURypDTCQ4TSNKPj42TCpJQSRMODNCNzcxRB8vQh44OyExPSUsPRw7MTEyNyQqOSE9LSk2MiAzJBEgKxgjIyNApSiHAAAADnRSTlMAAAAAAAAAAAAAAAAAAKroblcAAAMeSURBVHja7dF/X9s2EMfxrGs3oGtxHXTSztIuE+mtyG1+2HNKxp7/49pXIoHSUhxe65/52E6cmHs7MpMXuxxR3p0iFF6+3Gz+vPztlxdP9AZN9h8IfQ1c/vEMgMkgItV/kYbN5upys/nw4dWhAOarGkS4Ay6vthmYfL8HAHNViD2w3VxdbbfPAGoMV1VVuz2w/fTpeUBt6ro6r4yWwtnZycnJ2dmrgwHMwqjODbmADgeIqrx6Q5XBKvALSlRyOCZjAJM5ZyJig0dgKkN3sw4HjwMEwTAFNlRfuIpDnkIF4DAOMAsRgGAMuYvzEBwmQRTG0SGAGlYX5hfv8AjfzYMT54QzwJ4OAkRFHc//Kc2ZhJQ9xvHCBwDCAkGE3r4P4f1bkuxB9ThRFR4FNCVFqQ9zFHp8wr7OX616XBsFUt+vUwbmf6M5ZtI6rYHgwqpfrQ4BUhb6eanv0rpba5dS32G8GwdOT1+f5iYjjQG/PvmHTwE/o5/Q5EFWhVnUNnc9FxBCfChgUd91/et7gDGu9AjgyNHnm8833wIQvgDoe7+A6to9CnQQvgQYgDwCmLqmGwhjS1Bh4scAMiQPgCZnse2zdmqbiHkS2Qm2URG11iEict47T6gAbRObaNvYNjhpbIyxzIsw42War8a4U/M8Nod5vQdibNs4DC0MGzNgpzGlJEiTLfMQUIwYNo68I3WexO2BdgCgQ3awNVlJuzrcGpP5FVkhckCIRLGLuwVaTaopJLyBGuK9gPmptRbfNFMc1qozZfFCglQKoIgDOeagA7Ym3zEOXa7MN1gASBBRlQwZQ96JOBwF4MCeidg5puQ4YMELPNgO5UeXsWVEgAYVJlMALkIBKIAAwHnH0SI8FE2xybddYr5tmzZFJAwAeWYIorcACzE5KC4wBwDLYVgu24gwPeR57KlFHpN1XRsiZgehACKz2wUJ+xnOF7uu/1pcL77Kq6caZUD2/0ZFAk9zM9XrfYvrb1L1TPXvNbFnhwqQEPOKZbVKaZW0aWIpvy+bZVOypUYT7vFx9tGz9zOcFuDN/+gIHIEjcASOwBH44cB/1lQM4ZNhKecAAAAASUVORK5CYII="} \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/objModels.js b/prismarine-viewer/viewer/lib/entity/objModels.js new file mode 100644 index 00000000..bfd6b114 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/objModels.js @@ -0,0 +1,3 @@ +import * as externalModels from './exportedModels' + +export { externalModels } diff --git a/prismarine-viewer/viewer/lib/worldrendererCommon.ts b/prismarine-viewer/viewer/lib/worldrendererCommon.ts index 08dfa2c7..427bc446 100644 --- a/prismarine-viewer/viewer/lib/worldrendererCommon.ts +++ b/prismarine-viewer/viewer/lib/worldrendererCommon.ts @@ -159,7 +159,7 @@ export abstract class WorldRendererCommon texture.minFilter = THREE.NearestFilter texture.flipY = false this.material.map = texture - }, (tex) => { + }, () => { this.downloadedTextureImage = this.material.map!.image const loadBlockStates = async () => { return new Promise(resolve => { @@ -174,7 +174,7 @@ export abstract class WorldRendererCommon } loadBlockStates().then((blockStates) => { for (const worker of this.workers) { - worker.postMessage({ type: 'rendererData', json: blockStates, textureSize: tex.image.width, outputFormat: this.outputFormat }) + worker.postMessage({ type: 'rendererData', json: blockStates, textureSize: this.material.map!.image.width, outputFormat: this.outputFormat }) } }) }) From d47a92bf3575d0cc8ef3f13b2dd0059831ffad65 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 18 Apr 2024 09:57:55 +0300 Subject: [PATCH 0128/1195] add new entity models --- .../viewer/lib/entity/exportedModels.js | 38 + .../viewer/lib/entity/externalTextures.json | 2 +- .../viewer/lib/entity/models/allay.obj | 325 ++ .../viewer/lib/entity/models/axolotl.obj | 509 +++ .../viewer/lib/entity/models/blaze.obj | 601 ++++ .../viewer/lib/entity/models/boat.obj | 417 +++ .../viewer/lib/entity/models/camel.obj | 1061 ++++++ .../viewer/lib/entity/models/cat.obj | 509 +++ .../viewer/lib/entity/models/chicken.obj | 371 ++ .../viewer/lib/entity/models/cod.obj | 371 ++ .../viewer/lib/entity/models/creeper.obj | 279 ++ .../viewer/lib/entity/models/dolphin.obj | 371 ++ .../viewer/lib/entity/models/ender_dragon.obj | 2993 +++++++++++++++++ .../viewer/lib/entity/models/enderman.obj | 325 ++ .../viewer/lib/entity/models/endermite.obj | 187 + .../viewer/lib/entity/models/fox.obj | 463 +++ .../viewer/lib/entity/models/frog.obj | 739 ++++ .../viewer/lib/entity/models/ghast.obj | 463 +++ .../viewer/lib/entity/models/goat.obj | 601 ++++ .../viewer/lib/entity/models/guardian.obj | 1015 ++++++ .../viewer/lib/entity/models/horse.obj | 1061 ++++++ .../viewer/lib/entity/models/llama.obj | 509 +++ .../viewer/lib/entity/models/minecart.obj | 233 ++ .../viewer/lib/entity/models/parrot.obj | 509 +++ .../viewer/lib/entity/models/piglin.obj | 739 ++++ .../viewer/lib/entity/models/pillager.obj | 371 ++ .../viewer/lib/entity/models/rabbit.obj | 555 +++ .../viewer/lib/entity/models/sheep.obj | 555 +++ .../viewer/lib/entity/models/shulker.obj | 141 + .../viewer/lib/entity/models/sniffer.obj | 693 ++++ .../viewer/lib/entity/models/spider.obj | 509 +++ .../viewer/lib/entity/models/tadpole.obj | 95 + .../viewer/lib/entity/models/turtle.obj | 371 ++ .../viewer/lib/entity/models/vex.obj | 325 ++ .../viewer/lib/entity/models/villager.obj | 509 +++ .../viewer/lib/entity/models/warden.obj | 463 +++ .../viewer/lib/entity/models/witch.obj | 647 ++++ .../viewer/lib/entity/models/wolf.obj | 509 +++ .../viewer/lib/entity/models/zombie.obj | 325 ++ .../lib/entity/models/zombie_villager.obj | 463 +++ src/panorama.ts | 4 +- 41 files changed, 21223 insertions(+), 3 deletions(-) create mode 100644 prismarine-viewer/viewer/lib/entity/exportedModels.js create mode 100644 prismarine-viewer/viewer/lib/entity/models/allay.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/axolotl.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/blaze.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/boat.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/camel.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/cat.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/chicken.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/cod.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/creeper.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/dolphin.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/ender_dragon.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/enderman.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/endermite.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/fox.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/frog.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/ghast.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/goat.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/guardian.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/horse.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/llama.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/minecart.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/parrot.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/piglin.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/pillager.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/rabbit.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/sheep.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/shulker.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/sniffer.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/spider.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/tadpole.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/turtle.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/vex.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/villager.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/warden.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/witch.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/wolf.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/zombie.obj create mode 100644 prismarine-viewer/viewer/lib/entity/models/zombie_villager.obj diff --git a/prismarine-viewer/viewer/lib/entity/exportedModels.js b/prismarine-viewer/viewer/lib/entity/exportedModels.js new file mode 100644 index 00000000..b43658ec --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/exportedModels.js @@ -0,0 +1,38 @@ +export { default as allay } from './models/allay.obj' +export { default as axolotl } from './models/axolotl.obj' +export { default as blaze } from './models/blaze.obj' +export { default as camel } from './models/camel.obj' +export { default as cat } from './models/cat.obj' +export { default as chicken } from './models/chicken.obj' +export { default as cod } from './models/cod.obj' +export { default as creeper } from './models/creeper.obj' +export { default as dolphin } from './models/dolphin.obj' +export { default as ender_dragon } from './models/ender_dragon.obj' +export { default as enderman } from './models/enderman.obj' +export { default as endermite } from './models/endermite.obj' +export { default as fox } from './models/fox.obj' +export { default as frog } from './models/frog.obj' +export { default as ghast } from './models/ghast.obj' +export { default as goat } from './models/goat.obj' +export { default as guardian } from './models/guardian.obj' +export { default as horse } from './models/horse.obj' +export { default as llama } from './models/llama.obj' +export { default as minecart } from './models/minecart.obj' +export { default as parrot } from './models/parrot.obj' +export { default as piglin } from './models/piglin.obj' +export { default as pillager } from './models/pillager.obj' +export { default as rabbit } from './models/rabbit.obj' +// export { default as sheep } from './models/sheep.obj' +export { default as shulker } from './models/shulker.obj' +export { default as sniffer } from './models/sniffer.obj' +export { default as spider } from './models/spider.obj' +export { default as tadpole } from './models/tadpole.obj' +export { default as turtle } from './models/turtle.obj' +export { default as vex } from './models/vex.obj' +export { default as villager } from './models/villager.obj' +export { default as warden } from './models/warden.obj' +export { default as witch } from './models/witch.obj' +export { default as wolf } from './models/wolf.obj' +export { default as zombie_villager } from './models/zombie_villager.obj' +export { default as zombie } from './models/zombie.obj' +export { default as boat } from './models/boat.obj' diff --git a/prismarine-viewer/viewer/lib/entity/externalTextures.json b/prismarine-viewer/viewer/lib/entity/externalTextures.json index a5ec3d13..82ad82a8 100644 --- a/prismarine-viewer/viewer/lib/entity/externalTextures.json +++ b/prismarine-viewer/viewer/lib/entity/externalTextures.json @@ -1 +1 @@ -{"allay":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAV1BMVEUAAAA4jNkuh9Ypg9FBnNpCm9r///+c/P+A/P9k+/9N8/hM6f9Q2f8+5eo94PdG0P821+4s1ewiz/8syf8ox/8bxPNNq+wQwf8os+hCnNpCm9oep9s0h8D7j8AOAAAABnRSTlMAoKCg3PODq/XXAAAA60lEQVR42tWP0W7DIAxFb9OtwdA6xQ3rzZL//84BD0nRljzsZdqxZCx8hLio3Lz4GwtYMWLDi4jnPM+vwogNKTTC43Elr6vgRMQ1wvM5ktsbvRPXN38wGxKHMmnI9M65vgxavwsg2WCpCvlSg6iqlCF4ceKbFEGZVC+5NFFXYUtxZzILl1xmiffoxUcA5DUHKULZp6iqsQzU6KNWYcxBUMnp8A2mwWxAhTPR0qRYFs6sDT+zTMZpWj5pO8L0wamexJ9xXvm10J27rrQ94dSdOqC0PSFXPV4JRuwRzIxGHMB38O14j4N9Wf4/vgDzpRGDwkNeQQAAAABJRU5ErkJggg==","axolotl":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAP1BMVEUAAACvsv+zsPmmqv+nn/+GkPXWhCt+iOyBb+d1b/9odutodOyTWuRbb+NlZfS0W0xsV+JpVuNNWc82QZ86AGw+Ir4cAAAAAXRSTlMAQObYZgAAAUdJREFUeNrtk9FugzAMRXG4twFS1jbl/791cbJUQnuAmE2VKk5cKpDukeNA9zeAhP4mwDlgahdAEoDm1dAukIzmlXaB/HBcUGbQJCBkBejgkMrt3j5WeYGD0iAglkXkehVZFlBQ2b0FkKjtE2CjIIYEUfIhESdMCUyWoyBFZPZI+Nks8OUs/f7kXSsLgCxwiRbBl9YRgddazcC5lhnc/T1VFdQObDMIwdJBRQQhYNWBTTCXYzR0AMZIyOy9c373FuQFGXLJLzYFEJQvQSHKgwKwJQAF1BWqIBC6hNlKbAg0GPXyjDHkeqoj6iVAn4DdP/NQhuHxsAr6HroAswB52QUcySTgeGQGg3J8lPY55h7Q9705XQdpEgwaHXVhtHZQX6Whew+X+mfldsn5W3fEYM9fVjfm/pXShd1g38UrdvuIGZycnJy8kW/CDQ5IMRlUUgAAAABJRU5ErkJggg==","blaze":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAJ1BMVEUAAAD//////4T/+Ef/1Sj8shf8lgDReACrdQGLNAFsMQBfAgExDgs044iSAAAAAXRSTlMAQObYZgAAAPdJREFUeNrdzzFuAjEQheH3vNR4xtCkibyQA4CSCyAlfZocIjdKm4sFxAHwGKVmQo21Ts9X//IbE1evBfpBjG9ozXDlJZkKTkAr4IpShNVkMjiJ7wuUkwEJhcAmAzFGNcTJoFisJZph6heJiG7xDLT4XKRC4KiubvSf24kY6hiLnVPMVfE+NhPbo2Y3YVBfPA2/Q3PkchGGx++H4yZvd3GdNrjBr32FeDzPUdN88Mvn7QRHHiSX9SkMwnxYNTdkq7sDlMsLkZHRBEwBGaBpKnQ6GqsVegLIfrDOfOkGI0W7gQTN6JhJQlcYCOm+oJyjHyD+F7jg7v0B5TtIgi1mkx4AAAAASUVORK5CYII=","camel":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAATlBMVEUAAAD8w2n1ul3prUrbnz3xi1ywmYjLkzfrdTmoilu4gieqg0Scf1DaZiyMcEV/b2OnTiFtX0h3XTNfUj5VSENfSCN/ORlJPzBRIQwvKBwTHWK4AAAAAXRSTlMAQObYZgAACApJREFUeNrtmItiqzYMho2kE7VeKbRJGX3/F110sQ0xlNC0y85Z/6aJLwJ92EYWhBC6U4iil5fjy0uYCppGPmEiRIyRtSBFkVVYC66maQCbs8JH+iuYDgngeDxuAwAwovQhInA0GpAazwAauBbgcAgGcBTNAUBOBLPrB0A+awrAaADMMwDYAkjmXQb4+wIAFQDDkgAQHKCWHnYNgGsdABpYBXgCYI58K0BUMRMicTRlAAQAXAbAx8dHfGLmpxUAaK4D4OwfkLkCwBpAqZ6ezgBPT1Iu/fsXoQOwAAAgOYH6yLeZFKQOJut8fX17ent9XQcAhD0ARAhYAAQH3t7ftfb+/gZClwHwTZgeXx8RpfxpgOcCQITqQ1YBJ4DJCCQAdIDz9aukgPjZNWBBJ68AI5DpiIEIVFEEKmEUFAyAKCswf8PyGsAtgBeLu+5fgG0VEHEQbwXA2QhFFNbUFBkANHMB6HVlgGMGkHa3YDIAZUKKMZIUzL+OwToAFE+N/+UmrQBOASTurgGgE5Ao+Qe7F8KaAJNrkTlzlLME3ucwE4QMgJCngIg5gBO4Y/sxrQMgpqtEQkLU7wwiVflUQ8h2E6iIWKRxAI1A/8mmAUQY1qReHbdIWmDWWgGwDjupSVQFVIfyXQq4FBdXMok9Nub+LPk2AA4I6ZILCC7dBSuZxB4b88zEImIDELcZIJWJkJAqgKVMYo+N+0ciGwsFmM5ALhLLnwJsbeQ7bAyAAIGYMgAnAiz+mVj11QDqH4EsCjrAljYziWJj3RyLagAktI8RMIUtbWQSRZHZt9lVAGZxTc+EhEZA2wBLmQQvAcy7DbkGiM9Hfubjc0S3C5uqMwmRpjIi9Hs7+AAROYAQ14P0fDw+H+XrYiAbFTBYQc/pIqLLTEIVfBNSC+JQ+tVadX2sUvcKAAbARUQXmYRfMjg0s1bNf14FeuD1sUq2J2iQUH8b4qnoMpMg8RIaE5OIA3m3E7AYXR+rfGdH39fTNfjv5UaOZxUAJhuB1A0GIEbboaIApG1U3bh/MoIagAjnI7AEQLQHAETEBCIFiHJmKyxlEgVANJkCQAMQo+tjlR+ZvHjcIbddzCTyIiRi4ckGnnCL0YeximcAlkawpRWN+08El5mENTqAj1SIeiw5tk3iZqwqAN7MYuMAZQSWMwmPAzGyAzAno+VoWcWq2RSgYzFj0/gApDNVmYSYCTSILZtN7k0cXAPMY5V8pgBGpABGkgGqTIItnRWB+YuBrBOdwGxmmscq8zGZAo4mRmjm/mOVSVhCb4rmTwDIbdhBLwDqWGWMDhCTHIBUalllEjOAyOs2M1WhQk1qgPouWM4kygjYFPDEhsxmH8D6CCxmEtMRiGs2M63HqnoNlEUgzcuZBJp0KtdsZlqPVfVd4P6dYDmTQJPBrtjMNI9VVSByaPYRyABmVCsDmMK2qlhVRULzawCRZkbogvwE0yBKgeQ3Nc9VAUxiVQ3gCbcGy2ozcgDKTzBi5G8TGqloq1mU73ChKlaJlwwAYHcOAfgUuOYAVN4IEBIgkdZUVACkWAOUWFUBgG2HbJsh1GtAz5sB0F9pIBFpbQ7gPVc/GdUJSfJfRiCfFwHBLpKJDZkQtZUEUcTWVwOsxyqwlIwtJQOOsQxAAdA29a5dFEk5jcHaDICjnfv6JyN7s4SMoIk5c0kIHIAFwNeQHipOSBxZFcVWARij7bY1wHqsUv+AhKAEpH3qRWTH6hVb3GPx7GKeNiMjl8fXfU9GnhVL0c5WQvEXyV+q6o8WSoMWbQq0XDq1Vo5LQv/dCeDnqAWz54LKJru/GcCvL6uUPVsldD+1XTm4AEDYI7DrnF0hpjKQrzzKLTgbIRsbx4MI+wHyO8lyJSAVL4p/JQD3KJ354ss7TDsuWh/uBGgAmTC/1wWgNOeAFE2EkNYEJTutMEKzC2BcADACBPRNldK6xwkApnuCiqH5NwABjwSwBTDUAHIK9sQIPLpaK6ImSfKFmJ9Bix0xa6t2ap8W9gHYhHuMRf2j6GsCiSPbh9DnPLqVZyZgrQAOJwUK6+pXXrJH4pxykzqBRgGSCHWWtS9bMkWwPduWMpMVkrP24eGh7YfhQwDf6/NG6/Eb9cxS1T9m5UTpy3Zi6f49qfWJrC67d79tGyrZLehZrCgngQAYI6f9V+v5CTbb6wSopO5coVb7IAr/ltqhFw1t+D7p/I6iUGsYx2GQr3A/Cdmt8on73DgO/RDuqr7t/1yAdq3WnSqAr/dSolldO5xuXgPbXsqOWtcOh677srtgWK2N7sTVjaXYnU5fEwfavu+G3gdRCl3ft63GnrYagTtEwjVqL/SC+uvXL8Gt274PSgfMh6w19Uttfy7AMPbmYRyG3jQstX3n9jOI9Ne11BZ+9KMf/eh30tj37XkLa/t+vBdAa7oXwJABhh+A/yVAOw69J3L9MPbjXGFRnrkmm9t0dpnTmHFsLxKNsKgzrxCb5a0AYXKGuzzq3x+gHwpL/wPwA/AD8F+OA22/0fW7ArTTveCjzait6KquT6mf7oYfbUb9sLGMvjsfuD/AuNH13QDDuNF1f4D7Pxd0J1F3pycjf4vbHQ4b8aKqjEPvMzDus9zWNoCfd7C3bTst9wMMVWWv5e37Xl3ZtvxjAA790FWn3WN5O8DYySry17ujlK0STKk+mqUbjl/22qAbxlM57eTNbnKQ62JZUL3/9kDUnfur8LnD8vZANI5V/L7J0r12G4XqtFXFtd/Sx32j8N0Ap9N24R/eOq3aGiGdPwAAAABJRU5ErkJggg==","cat":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAATlBMVEXv9O3r8Oj72bPW1sz71Wf2ymD1yF7ywFnxv1jvt1Pqq0uvdh57bWJjSy9KMBc6Kh0RDxgAAADq6urOzs6vr7C+c3NanRJWU18kJDEcGCdfq47cAAAAEnRSTlMAAAAAAAAAAAAAAAAAAAAAAACVcz0/AAABUUlEQVR42t3T3VrCMAyA4Yi1SmtlSxSS+79Rkz6R0dEywTO/0rPyPst+IFhiMSJyAW+amJBFA08EEWBeBQtQ/1BKuRuY5yAusACo4ABSBUpFxbsCPkJKDgiLgAktANYYOFhyDlxQgFCFbUA6VaGg9lsAj3LExmBCi1i8MdDNBWJ5GBDmFmBhFuE7ANQWgInVY+q8B8wh58w8gy2rBxASIRJ2gVwBOOf3oAFQ6wL1kP0QeQU0AhRdIb5eAe+15V1vAWqB/X4E2PgrADtA3O/XgJ3WTSDeCJi8zcc4eAo+QroBsC7hC4AMOAspxGQNAUZdTDwAtkdAQrTdALQAMYX4FkIYA1VwoNZ+CynqCLeuIOSkAYyAqRZjFyDNAe8FytIOLuoCNv3hkLPtkP3k8xNc1RthZ6YiPwAMmmoAHUC028DGCKevkwg8DnxafwDmO/uHwDebkIAap1EwrQAAAABJRU5ErkJggg==","chicken":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAALVBMVEUAAAD////i4uL85XDT09PhzGLGxsbgu2nTrlrQqT/Bk0OWcjRjVkH/AAAAAADtfCsnAAAAAXRSTlMAQObYZgAAAO9JREFUeNrtzMFJxFAQxvFZrGAewaMwwxQg2IA7fMzZElQecxZswHZc7CAd2MM72IlJVoXEbATP+7998OMj2kmHW6LXQ9/T0AUt25UuB/D+dgQ317+AXLZ7OgxN4vmJ5vGxforGXhbgSj9ElFqjrxYXomN+GriqmqG1H3E3B7DmQN0A0Wpk0laqKlw2gKv9AdycbRNE1dgA1SOy0hTWQCIrgqaUlnGBqkLY4aeAq0FYfT/OFRBQVGERWQddAKh7ZuFVUCwqorow8166jgVzoBaZWV2FRZS5iM2BYwKwBzEfjJSYg/zOIx7hDk86948+AcUmS5dD8ZFCAAAAAElFTkSuQmCC","cod":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAJFBMVEX///8AAADr2sPWxa3KtJXCqIW2lmusiVmScVqEZVEiHyYAAAB2QJV6AAAAAnRSTlMAAHaTzTgAAACbSURBVHja7coxCsJAEIXh5w18RSRiZQT7sAS8Rgyz2kbYIN5CiDBbx8CewHM6QS3sLf1hivl4yMc626+ZCgKQzENVF6eSsaCVkRCRfCiZhFYwcM4t+13SqFdOwS6/Vw+5HA3qFyz7beOqriX9ezFsKmlcySn4lFKMMQiJGYWwR9VQyTnGmggh3M7eeyGBQ0u4TwZkR/C7P/weVk/OOkCzBdD8ogAAAABJRU5ErkJggg==","creeper":"data:image/png;base64,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","dolphin":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAP1BMVEX///+wwc2In7V8gp1ZV3NXVHBIRWP////D0uO/0Nu9y92wxNmwwc2lutCmuc2dssmSo7qKmrGAhqJrcY4ICR+8V/49AAAAB3RSTlMAAAAAAAAAVWTqWAAAAc1JREFUeNrt1GGPokAMxvFRz9sd2+kz5fb7f9ZrmYECnuDmkn3FL0oaSf8RJaT7iB6Pz8/Hg3J3u91+mzRCITtVIJwNS3JcUzMHSlkErtfr3fQAPQxB8uhVYPAA5xHf3fQNSguU6eSLwJ9hHXBpROTXR5S7F4GcLTBd5ioQP9BuwJF4gWU/wAt2tumBpnQRINoEhGUORIHeDggE0gJlWgLKPHUvLkEEqLUCIhZAVQXsaCoAP2q38yMG1Y8vdcOg7utD9VsBFgNf9zfEcO7eCuTMvdG3bb0X+K3AL3sDzGmlFNpVZskB22xxR9sRENkGUAqA4rDWPoqPk+OngIaKWdVnaVAVo2pDBKotGl+KQhurUa1zQAQjMRHICywCE3/vSrq2h0+/8KnDvC5s95m5D6ntR4BZLpfL+BgRv7WEKKY0Y03d3UWALZ5GlLMAkjPFdBQgskCOQKbl4ThQiEoEQHlEiGkRwItA3OsKalsa07cCg+/51hBTBGQvIIJxTWHUJ0Bk/V8AEXsKpD3M8Ux1ywCI8F5AwJD/CAhUtBUkFYeNMvlXQABVf3kCHgBq1YVagQgcid2N6tIxEWGXZ+ykScdie4En6XQ6nU6n00/7C3s4RNq7Xn9vAAAAAElFTkSuQmCC","ender_dragon":"data:image/png;base64,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","enderman":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAY5JREFUaN7lWNESgzAI8yv8/z/tXjZPHSShYitb73rXedo1AQJ0WchY17WhudQZ7TS18Qb5AXtY/yUBO8tXIaCRqRNwXlcgwDJgmAALfBUP8AjYEdHnAZUIAGdvPy+CnobJIVw9DVIPEABawuEyyvYx1sMIMP8fAbUO7ukBImZmCCEP2AhglnRip8vio7MIxYEsaVkdeYNjYfbN/BBA1twP9AxpB0qlMwj48gBP5Ji1rXc8nfBImk6A5+KqShNwdTwgKy0xYRzdS4yoY651W8EDRwGVJEDVITGtjiEAaEBq3o4SwGqRVAKsdVYIsAzDCACV6VwCFMBCpqLvgudzQ6CnjL5afmeX4pdE0LIQuYCBzZbQfT4rC6COUQGn9B3MQ28pSIxDSDdNrKdQSZJ7lDurMeZm6iEjKVENh8cQgBowBFK5gEHhsO3xFA/oKXp6vg8RoHaD2QRkiaDnAYcZAcB+E6GTRVAhQCVJyVImKOUiBLW3KL4jzU2POHp64RIQ/ADO6D6Ry1gl9tlN1Xm+AK8s2jHadDijAAAAAElFTkSuQmCC","endermite":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAADR0lEQVRo3u2Y61ITQRCF5wGsEhESCrkloiEhITctQG4xiQQRuRuIKPrH93+Etr8OHQOloPyQbJKu6prNzu5mz+nuMz0bwpWtL+7LVqkl69lzWU5tS3IiJ9NjL+TZ0+cyF89I6LJ66di8+qoZ5mLpkIhnuqfD6KO4+e/stvse1OqFc9EXk1rpSCAD4G1Pysx46hoBq4Vv5mvZZpifzBuYvyXgtvseDHi9qF44k7N4yXwzeyicf1dsaTY0ZDW9K5WlExvVw1buOOg1YS2zF/TeUM03yaDwdun0Gvju47vuezDTP5dq/pMBfZP+YOPyy4bsvv5u55mnJJhTANKzQO5rRBaQ5fmqFBKbUkxWZGXhvUW/VmgaaH5TFmTGXFfd3kzz21K/501T3qKoGWCCSCbUVBNUtKwcOKeiJRNPZiU+MmOORiS6BDKSBADcvHjeIcEBVwqnspE9MgIgBLCTowkjITYyLVNj8zIbW2D+j7Xf80bd4lrvDv6fMyCSte/WKH0xEfMRcXPA1Hwlf3JnBiCKCOLG4kHnOZExIs8L+0gpAN6WR40+vQHgOefNEeBjj6esR/AMWEvvGQn+nChlgC53TfGRqOOoP/2BAlMCdkTB6crwWbZLF7Y6+HWsIlzLvGZA5zlRygB7YR8BbYAU+Eb2wIBxjHMe8FzD0klvwDzHdo0e+3MiQwAR5YV99PpfvVr7iaodZz7K/soP6w+cAL8G4LaXUIL8OZEigKj62O78diy9yQCAA5RmiPTmOgjgHPNEnBaZ+5wAnhMlAtidtZc7dYRONynmCjIoAUEjHzTyJpAInp3XJRPRY2QViKwRsc3cUafOKQGEDWdOI29LG0RBAOA18qb27AsgJNIEmKJfEcCIOwnUsjY7oa+NKLt6m+Jn2moPAZBDc0Oa9zMBmtotaZS/At7qmpRWAsgOAx+pxuY+GWDKXbwwEm7u7yHCxY7a7zv7BbxljupbVuimiBECEDxteoyIvrOd8qUBZROk67+pPEABTjZo+9sBjx70tfnX3tRUOSQnsmHgbCV/aV9t+Vw9M54aPAL4Xk8GaDfYG5+s/1MjZILHqE2Q7ev53Ra/Zuj7PgDxAyhC6B80BqoPGNrQhja0Qbaf/P4PM3XaxMkAAAAASUVORK5CYII=","fox":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAgBAMAAACm+uYvAAAAJ1BMVEWAgIAAAAD59PTn2dPVtp/nj0G0j4PifCHMaSCwUSKOPyRWPzQGBA4kh8LGAAAAAnRSTlMAAHaTzTgAAAGUSURBVHjahdAxb9NAFAfw8wRIDLkFEsSCG4kMHVAzwAiV5W9gXUdA1omugPWOEdpwzxthaP2qLhnrD9ClHaKuvQ/Vv2OnrZuhf1myrJ/+vvdO6YcZ8p/4jdZqoKLB87AchKCQqA9X2+F1HJa3sNuCUv/3ZfRV/q3hMP4E0A8DSABN46knV1prUYm4FJGK/d4KyJgyTfP74FZQZOZvkiSfG2AA86xYwyHg4x0U9AgUtAlDZiYibvN7Mknyb5PJeKxGVQelIPM4RjVG1Ahl7CF41XU9j8e3IG77bfb9yssJYKHXAWCf5kctoIwnArySra3pdLqzI3UD7RwK0f0cTD/cAS7rwL5TK0D5HjzJfmK7TYhedoBPDCsiHfgf4b0LQWvnOE9S9n5WuAaSXazVgO/AFRn1piIuARUTGQNQEtTg2ekyAghAmAz1wXXgjSGAVFwPWU4WOPyXTeyx95R1cAaQhSZyNrWeiIoWShkB5gDObcpEM9qEfAXG9MC50ua2whlmD3ARzu2Ly+vzL5pZjuy+MPvC3QC9wfXEFSoo+QAAAABJRU5ErkJggg==","frog":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAQlBMVEUAAAD9trb/ioq+rWqxnl+mkE9/oFjlXl5zlktjkC6NdEVWgCLMPj5NgDBGaypJax46Whk3VBkxRhRGKiktJi0uHRCwcSzMAAAAAXRSTlMAQObYZgAAAadJREFUeNrFleFShDAMhBEoZ1x1Qz3f/1VtQm9qgVoZf7h0pqWXr2k2M8eQJMBwSSJSvStpow0sUmdgCHMIbEQTIgCo5CMkzNM0zaEBgPf7x0SNUfUBhHmeQwOoiq4zTPOUhk32BF+VomvAlDAPT1jY+LRxXrQlqA638G3lHkKQxFL0i501vxzus2WIyunjfidUYwb8uClU98mr7CyRFGwrh4ecUwABj61Iwlt15zcwSeHjAGgS379fILxTk+I2mt0gCRmyXpNs5qeJZ4BQKQW43ToABITgEgAU4DaOt58Bwp/fAxChlAzj0zj2gOcKGK8Brh6wyBmw6bv9SCMpAybfy408ZPB4UlUpAp/pBAEbBTiqZO7V4Nm1NESU/BFYdsDSBaQCpAvIDpAWUOwnSBDwSSTt2foUICT7SqVPjx3qaeOUsHBTjOoiAdrr0BCEGK5Ilg7wtwwgrEj3ZKXscnM9AFRCBO5JZE0IGc/+xbIpCV53v8eVjQ9K3qdgV1zro8hrtuIKkC3Cr53dPFIqcxG9EjaPTIPb1DGpVmlEaUNHa924dfgHfQFwmyc0LyT5NwAAAABJRU5ErkJggg==","ghast":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAIVBMVEUAAAD////5+fnw8PDl5OTk4uLd2trYzMydmZlzc3NLSkr5ldknAAAAAXRSTlMAQObYZgAAAYdJREFUeNp9ksGN2zAQRdmDO5iBfN95JlWAgeRuAkLOZuRNzgrcQYLdBoJVOoirjCmRYDYy8i//wIc/n+Q4J7gs6YgdJxFRBBNXVQENRE8yZZG187sKkEIGLi/z/HL5D/Blvt3mH+8Ay044ZgBeb3e90QDVCkz94QFgpbGugOmvDPy2vxNYgMPnDFCAloCoLgDXqf9wfJBgKwAfU/+M8S9AGQH9MXzDSskGYJQRgcMEurkmDSCxfSiABtCeegsssuJbQETFTKS6q6r/v/FOl/1wXSrRtQOESDh1F6aeZG12mKBvC6N9Bq6nBtA8xApM5vCJRxpXAAdgEfg6f/80/wS8wggrMCwjbCl33T09Zw+6dqolB5/Yw45p9xRAORMiaB2hQLTRlLSWHNTXBHICwD6Jv0Qg3E3CGTDWLffOJ7B9NFkTRP1ZYbTRkyCaUxiS6TCyaBhNwwgoOQGcMsp+RBRe38CE4axrhxhKAlYqALmEEqIpRA9D+SwTikQpt1n93R5IcTOKi/wBKsTOnkkgxrkAAAAASUVORK5CYII=","goat":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAMFBMVEUAAAD////6+vrw7+zq597b1cLArJCenp6ciHaDg4OFcmF0c3NXV1dNTU1APj40MzImjJ+xAAAAAXRSTlMAQObYZgAAA5JJREFUeNqNk71u7EQUx0eb9YqKZ4jOeFPchjAze4s0rObDQrcy9ngU3QKixDNaueAFaChIFFHQR4IGci2078ADoER5g0g8ANqKHs7YeONsyIqf5HP88fP5j3dt8r+ZAAOokPxVQaDgvc/J9Q8bgsQ24oCnlFehfVWYUMrAuT0CMAZVE8JpCFer8O1HfRtFCKVUFdbeVRVuZ7O+jSfQOGEdqkrHKwm2XQHAhRYFaYzOk76Nn0Kg0GCEBW2O8lnfxk8hMCK0rjJSSrNM+razBtc0vtAppOnhpG9PQlJFmjbYAiTY5bRvO4IL+BS1qWqXJ33bFVzjv7z//f5h88fHfXsREXxOxuwKIbhd4YDSyiDaDpQUAXb4TNAaBdxiQQGQ4+H5U7CZ1kbXeL0rRQqAznZCFDDC1tZWOpbzFCPE0wQKtdHZ5/H277pSUEjnczYIBxSsMVGwUbBRoGNhmrLaZeZdVdf2g4mlECk9eiuXg7Dg/tQZ8+Gytu+rWC4WgtIL9SRIu3KZD5d1cFkshRGpkmqISLLitlmFq6v2arXKYvk5M9qWehBmzrbfN6v21za2WG5xSbW3+fN3nkrgez9Myrgkw9DQ/c3h681WONCCA+wRJlQoyvcJAJwPE3zmry79zIbTlcuHCEbVdpE2tb62iTSZM8ttBJdCkZ4UZG3lRKZHRh+OItgQYebSGj0t7Fzb5RAhmIRBcM464xPvTf20BsqVGtbw5/2P95vN8NoPEamiQP4TCsAAIMUe97oXmo/d7rQCzijITq2QYiSkwAAFilWim9LT6+vrchwRBd7BUKAvBQZM/itIBhyi8CyCoUGV4lwA7okXE1IZ71NKCRFn6fnuBCrRUFpbISSTUnUTKoA363Uv8KKUkluFApOqKBcVMhbUpCykKpVdCCnL4sAQJKF8K9hJXZbleSEW87K059OcRIQ+GYR8mkxre14sjua2TqakF7R+txVwYELK6fz4GDseJwhRNApbEjIlx8tlMhwlREIU9sDYyX4B2Jsd4eGGjPnk79eF7v1N/+oaQnpuvrm5ITPnvD9be8Uov+DATXMLKem5++nujiSZ83W+/oqDMJVm9LP3t1yMJySLrC5z/wUHjjD6aeX5gvQ8/vb4SMjbk18u4mdhBLLQzjmddZ9dTvBTuCekyZOWtHi+MsY4pLWOEGqEJJuHzYaQszyZkbZFpaNt16EhhLuFIhuEoDF78ZP9A0Obf2KBegjhAAAAAElFTkSuQmCC","guardian":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAhFBMVEX///+rjEZQjnQtWUcAAADX1c/Y1cvX1czX1MzX08vW083X08rW08vX0snW0snV0crAuq7Auq3Auaq+ua3dkET/gi+DpZy5k2Syk0/wdyjecipqlYPsZCqFhmBmiYDLZSNdf3XeSSh4dVCmXCxOeWbUQSDKPBxBcVpkW1BgVko5ZVJ5CxKoxgN0AAAABXRSTlMAAAAAAMJrBrEAAAOASURBVHjapZaJcttIDAW5lvfIHtnLYiLDee4kzwsL+///F45I66AkW467akSoIHRhhjOkuq5bLper4fL/wHAhiscBItiMIYSgm+j76GOga1xdXXWD4PNy2epHQ9q1HrAz0+mneCswfeB+K/i8Wi6HsZoEA4vFojtP4E1vO8GmvvWw5QUBEd4TrFabBj53F9LbEfZOcLt8WN2ubi8WTEu7J1g9DPUPt5cLPBM83N3e3g2C6+tu4PqYmaCPxk5w99/9XRsvCaLR9+G0Y8ID3f3916/DuO8azwmMgTA4WuQWp7uvEy8KYFObOQpsR4K7S4kJ7Izod1MYaSvwetoivk2wWAyCGR4PUNmZbawHnOWLBTQeqxgZj3PBWQEHbhPRD2TfrlNuOqCmPQs2I6M/I0hCAleAgtwKNrmeMhIux1lBLwklknpy1l0rbfXinMD0SEDTxDwXLlVt2tubwrrbY02fNZFxlEMoKpB2gsfDHz2G/fev735+/6/NcU6yC0lxVtDbv7z78aff39s6EiRylRFxdgoB//z25x/v/kKa5ygD0T778/tAYMCS5rmKsoTKz9wFYRc4kee3OBU0byJtBZr9SFkViAqsnG8yQGpDz0whWqmi0DynPU4eJmy6xUDLffz06UueP+xnBMkueXPz4UvW9ws+thZEveaBkmV2325ubj59gXqFgPV6r4OhhQ9DD4cCIZ0XPK7Xj/MO8lDgFwWzNcjZDBC6cArddBcOkcyld6Htgx+6GXq+g2z6Z8HivEDPCSyxGchInN3K50A22Iim8ZNAESnFgKTjg5URaEyiAZA4mEK4CtPcCs97rngqEukcW5gJsgzGZTEThBKaYaynEjutQ0FRxs4T5z8kmbGF5nJVumYCtdo28NFDVEjpafZ22lQWsw5Mtmo4fg8IcE6fzjKm8EwALrBPvQckV1S5QrgYMDYHAoHBzjqeQogKRVRIY49ZTjQT2K288NEiQiE1C5AeV6o83wdNXRiYC4KUhFNIZELl0SLKgKn2oflG0saaaMCYsdOZYCQlceo9gJTQrttvB4JdOAVItCcTgl0sYIqRnuKUOBJk2i1pp/fi9BS3a/va4nK6uxqReqHFq7naCix5X3B9kiNB9yToUzJvEVi8SSBDvlXwpjVAAl19h6BX3wNm2ng4/SqB3MCVU5T1OgGokfb0/LVpczpVfuqPyjdt8tQvCjuwWwAAAABJRU5ErkJggg==","horse":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAh1BMVEUAAAD///+lpaWGhoareS2nbh92dnZxcXGPaR1jY2OKVS6AXCJyVBp2SShRUVFvQh9hOh1FPC9ZMxc2NDdOLBM2MCZTJQ5OIgsrKi1JHwkqJR0/Gwg6GAUhHiEfHBcuEwQpDwMjEQcmDQEiDgMbDQUcCAAZBgAPBwMNBgMQAgAIAAABAQEAAAAaegGbAAAAAXRSTlMAQObYZgAABHpJREFUeNqllouaojgQhTOzuurYitKsNCS7pR1lF2fe//n21CUBvMznN3MISYVQP5VKEN0LKitT6Z6rKovNZlMUm6KsnCtgVlVRpbFduYMw8qIKq0zlDkAgd+WrgNKqDNiIilcBmwXXi6rAPARQKOD1CCqroNVWAd++IYJfBVQ7+IOwq55M+PmF1WKLUlRlWRRlWRUPAbufXNiutihlIRE8m8KiwjLxQqHCWVaLtJgFlr6sxqtfoYstURQvRQBgwcAxgB/GusvY8wvVo8HX9Tog+IASRTfbetp9Dqjr3wL4+nCofYxEU8BisX3anQLgf/CRoOjqEELycCuzcvex6voARKQQKGImaPJWUmPoPpb41xQgIplJ3jvuJQXOQTAAKcCErTdspPtljMT5R+w1/CPbZB03SPfv47cRLl9+IHYR1T++AKEdDO7/Ev2TWqci6G8U7XiJAM6ASASeuKOA5Xw2my/b1I4AHyjaCd5z1BFCg04g7WCwnWoCiNEAsnJZ3LPufgh9ZCbA+8fH+yQRCB1Rj7Wftfv5DKHP25Hpa68FHnzYLmDdAdoW5etXhD4yzZGLVAZgZFAAP2e5tAiW6z//WC/bkalugpDWpnA6Se7uALP523qmUzDT3P10CieIRi/yev325vZwBA2lHZleUiA1ceN42U7fz+fvJ1kPKAN0/RFPOzLFjbimyC0DTud/z+f/zifyQnCm9qE83EicI/lIEQA6nUUAgKAAn0VpfxiY/YiiFhwOPichIAuyMl4BbB/QC1GVART1iAQBENAogOS9NACccaCPYQtBAeFGznSAyBLQNPIDpYBAcQLYrlar7Ttqad+3E0CMY4AiAKABcDwenQn29YrmBgAnTgNcFZEB4RlA36JHABQFxEcR9N3n8fjZ9RNAfpsBgIQShEB3EbA/E6QT4x0gzyFQAlxVvZYLnAG5TACQ8Q2AIhEIub/KgdKhvly6z8/ucuFbWYEoeC/mQWQNACFCaDq4dz28u65Hm3IgN3ueqnxf1c8A0wjgBoB4d5DlIEWARFoEYwQ6CMAAcNPH94zIOZBlgz8RI2ALoc4QW0YMX3sGcLniHHIAwS2IP9zNURGyjBkAP10CnNMcjJJoADFqi0AUCF62kHzc5MBLEjUJFoFUDEhz0EejdGxMc+DtwyxmbRGg4CAK9tGSh+dqkgOLIJg3BAMCwFNMe/k60ZCDNIc8AwPAm68TO0O3gCEH+isfIEFoIoM0zKXhbcTbi9OanIMUAE2SCJjNLAPIwdFOFOSg7zkHtvJp8sZLyyjmeEwb7/PX0Y23b9PoLmzYsMVoGrXQGgMyf4/Dwc67rpGmwc2ocBm12kIffic9hEpax3Zjg3Kr5L6BakHZ7jSKAOEScGraXEAl4UkcHDp8feOZYIZctBswPV0ye/0AgDSGPMXGs4TTsKFJys8PqvRXLAihEQQqGPII8UTRAGVA86H+pAcMRyR7WEOGPGTQZECNDcsgsYJVLnLrs9hBx1hqycUkHrUvqxgONt9iUv+p7ocjlD66/wNdcSNfhkmkngAAAABJRU5ErkJggg==","llama":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAMAAADlCI9NAAAAVFBMVEUAAAD868b14rjx3K/v2anr057jypXMqX7EonmlpaW6mnOvkW2liWaGhoareS2nbh92dnaiayOPaR2AXCJyVBpjUT1FPC9BOy82MCYzKSMqJR0fHBcP+iOkAAAAAXRSTlMAQObYZgAAA3lJREFUeNrtV0t22zAMJDAg+0ulxm7URr3/PYsPmUiMXja0vPJYJMbyAiOAGjynN7ACCmVkPO0AButlC1ueRnEkgBydAHBA45afIICJ8bEG/htvdhHRcI4APIGU7wVAauUB4wJiUX6OgAIymjaACLNLEBjPxJRZTjkDh4Ag5EHEuCUvym8pgOgTAZFWdw3Gc4EU3LQCpPhEQJbs2TXGpxTbbyygKNIhcom8UpRVbiwNQxS0AytEuvaqMs+YlWz4jQQwMdEL8wuRUgaaAIFyhkjN27ILwgvcjIhsx5AAZiL+8kWDUiiqAHddAL0AAM2TiWvVBgXw9x9PTz++814Ac61H2SFMUAFiplq2dAaYTctRC/RCawCFbQ1B4oFaopwC4OZ9uwJ49+HpowWg0QqAHCgVKdCsf18CEYn7cWbIdx61QQf3AhQQRc67FrgEA9roHK0AVXQCwIAAbj8NSt2R2xvC8R6eI6COYOwFZEEMZmlngGm0BYi3Gf0hjFZDcu58KH7xJhA5GRmCBLCjFpRqTGK3cHgEAGZhrkYA8Fjx+etXIl1MtaDOkgCsS7JsBcRcZF+ul2ngDEROejUBrxTgGuMQKnojMgAMRdWMsRYwRSt1cSy/m9gSSVbsBCjEhHH1oiEfgCVn9h3vb3bMl3oCvABdE9pAYpACAxUAwTP7jhbIQvJBAM3fIfttqS4wZkQIv4+AoI0nWP2lHEDCDaoCDAgQ1ONskQXuL4ibSRD171sQXYCA6ykEBgRYqpAB1tWiHD/U8tfxr8U0imimeNoMiImp3+VtIG3cebnM0zRf1hbTKCQjQ0R0N6Iri4SoQwFrhzSKLJLjgywwgqzL4wcBy3vplf65SRcsP8xbxFjRLS7lBwKmdZknLf28bmgaQv2H4SEr8Ri8pN6ZlnXV69u31eNyky54Ul1xOQ1eckm9M9ljX66/fl4vq9Hn5+d5uAKezD7FVv1W99Q7k2Wd5t/XaV6DXqZpVEDpbCZvQuqdabHE02xZGx0X8AlS70xLvP/zrPGdpvPQO9N6hFMF9M50bxw4033RO9PRMDoVvTMdDaNT0TvT0TA6Fb0zbSbQcpcu9M7kE8hH0LqhZwrosJlAm7mU7od47FmH0Bpz6eev6+XuAqbpMmt0ev2t9J4CZheg17qh6X6ICTSHDzR6TwHrIdIDDzzwwAMPjOA/NfpDB1xAY2EAAAAASUVORK5CYII=","minecart":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAAM1BMVEUAAADBxMW2ubqvsrOprq+epKaUl5iMkJKFiYt1g4ludXlsdHhham5SVVZNUVI/QkMaGx04QmSDAAAAAXRSTlMAQObYZgAAATFJREFUeNrtk9FuwyAMRVMa7jWzwf3/rx3QLmsiOlpV2lOPk+BYypFRzLIs53A6hXA617sSzsurEABTSkRPsLxGAIEYI0ACiCAC4tqp5fbARGApJavRsLoggLHGyrWvmAoOIPSWtiamgmw7MgIhcQuAM0G+U+TcBERcY+wNgJwJPO9wBAq3Blo+E+wM7ghSIRqkVGaCPV3w9RsTQUVAMRMC+MlkUHusISVfLlkoW8ZRbRmTRFXNTG9YZ1wdCoTqXsy8dNysuJtQ7Z6JoBTV0rlmrk3gB0zHW2gCU7XS6ZlrugrKxp+Ccuyg3ATljscC0eLtM/d+aX+tVfOy46GAQwGfFsiwA5HnBRwK+O4W/k/w/m+U4SDJ84MkMhxlmY7y8TCVGy8fpsR+WnXDGuPq8mHIN8fuL8tkDiT4AAAAAElFTkSuQmCC","parrot":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAP1BMVEUAAAD/////7nn/6j3/5TPGxsa7u7vZra23t7ewsLCoqKienp6ZmZmWlpaRkZGQkJD3cwmGhoYlJSUPDw8AAAD7udxiAAAAAXRSTlMAQObYZgAAANJJREFUeNrN0tEKwjAMBdDGxpnbZqtx/v+32jYMN9QKPnkhYdBDk0EDHSIQ0CGBDkEV/pFgahtgBhxEZu7nSGj1Ajg6SAmpVQe4M98hgHCMVUAgqklbObgyXwGhXczUWlXg10Z+bj/4i3X19gra1KJrDfVGakcARdFyqyEHS353w35J2oGiBRO8++miqrU2MJdZIN6pJy+Lz3Cgs04yeaees6qeByMypZQo548jLDdl9mnE8D18B+EyBiG4+AGMduBwCi2/g+BiAAJ/BTwEW/4XPABsMA1LwNN2rAAAAABJRU5ErkJggg==","piglin":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAWlBMVEUAAAD/gID/////7aj/5bX12iryuobMzIPCwnTooHTVlXreihzJgmWHh1e6ZkWtVTKiWTplXEOhPjiESzOXQyKNNQ1rOSR6JiF2Kw08OS5TKxpgIwo6GgwhHhyEOBusAAAAAnRSTlMABHH+CSEAAAKgSURBVHja7ZZxU9swDMXDWAMSRspwYiDQ7/81pyd5Vzzf3Oz4t78GRU2kF9m5Hm8y7h8sMM34zMQrcKZj3BvTRHMVoHVVJwRm41n1eSDwYFSB2QW0AoG4psY0JgRAK5BeiV7TWCD2wLt7AXkhehE1Du1BL6CPKT0quL4HgMgFxIBAy6xt3hICsYniHBRIzET+6Ij1jxg3/NUyXxEwiK0wiITZBJC3And3d10uzCzKjOkNOzGrX6wKJoUVpiTJQ5MbVseyqpX9SEQWmHUV+4obhI8LQCd5aHJDBALCRLIaQuRfWSRhBK51M7bKQ5MbqwpLjAyB5Kmw6AoFToZAgNCE0OQQMIXEGHkFtU3UUsUU9XX6DnlocgNNql4HvEuRAzWO/Kx342xMFXbibWwb81TJOS+oOyQg9reK8mafqbLkJR8UEFEW3nRjzDBV8nJwAgGs1qoY5DKB0QrEukrJZc9BcXz7S6AiolspC8AMIJeLQME9xC9JJppL3FmKen/J1moPsOhFzfi4gXNZvMuKdiL0xmPLVjBaHTBiK1DQH8lealfyB1mIsbEqIABcBETQKjiDYsRi84I0WwYp6yeilFgSp/iFBgJVSMchBeTsR82RVgFiCIAJgMRkihBn/w0XI9ZS+/GxtK1LXyaQVnkHn3acLDhlh6TIkQms6s05/Tw9vQUfJzs+3v45Aa4mXCTCCnh3nj73T0wQOY6oQyT080WAqcKO70H2F9tsQq3zpzdLOJ/P7+/nX+84I8SqvT//2QKEv+umGzdu3ABH/cLAFxwVGPuC4xMs353AGAmM/ELvC8b0fqHzBUN6v9D7gjG9X+h8wZjeL3S+YEzvFzpfMKb3C91/5TG9XxD5zgTy3xP0fqHzBWN6v9D5gjG9X7jmC34DNs5yRa6KJBYAAAAASUVORK5CYII=","pillager":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAflBMVEWnra0CAgIAAAD////Hzs6Trq2VoKCVnJyVm5uTmZmQlpaOk5OLkZGKkJCIjo6EiYlmh4VzeXlwdXVobm5nbm5SWFhQVlYyZjx2QypfNiEmR0daLzg5Ojk5OTlPKxlLJi0fNjYqKikeKio+Hg8lJSU2GB4yFwkeHRwjEBQUFBN24XvqAAAAA3RSTlMAAAD6dsTeAAACP0lEQVR42u2VYZOaMBCG1TOCDUYQemeqRDEq8v//YN9laQYckaAzbT/ckyPEmXsfdhlnnUwbwlBKGS7CBjmZfn6m6WQ6G2DiBHUegrTmFUHIpGeQSorT9fcEixANvCt4rwVm4V5ig7/AvQRJ+AuQQPOSgjjwzYHPw4Im267AnaW3wIXbdxINC9zDZUPbADwEHMnztZTrPOc467wEa+SJc54vl3l+bgqADPgJJHf78SXl1wd/oDgb1sMCeg4yifqxXC5Vwk93DAsSMoBE/QQqkZxPEvrDNSxIWJGyIOW4Y1gwG+BfCS4Nt4YXBJso2ngLTsBe7bUlQB6GMQLkrYfAvwJq4Z0KYEDeR3C6QzOGBEb/wQCtRwjMZbVabQ7G5Qk/weFCa3fYIb874Nxa/YLj0QkuN1r49/0eEZxbq1dw/AWDp8C/haLwbMGa7XarjTa2UwGWXwXNW7a6Zqu7EQ8BPfoKDDSEfcJDAYWtIQlTMBVvXR4KIDaoHApotLmWTFWUZVGVXXoEhquHgS4nAF6C2Qi+Bd8CYi60ibIoe1mAvAmy4C2BzWB4XSCszdDDaAGHxVzE2jCxGC2IYyHimAcOBPFoAWY34MFJuxMU+5pyPhei5PPDCcRD9niiHaP34AQlJg+oRFGIqgA9A6Q9XGlrC0oSxKCi/FiBfcJdC27R5gQ49662gN8VV0ibE7jCUOWzH5KiNrgOuwJXEZ7aJ7jd4QT3pfa1oJTKAqWCDPcsU9noL5IKAhUFUaRqAvX/TKTfnHu1gRak8lQAAAAASUVORK5CYII=","rabbit":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAMFBMVEUAAAD02ezy2Ovx1unxzue0pZSkjXOUgWKUfWKLdVp7aUpqWUFjVENhU0NZTDtSSDkNYhzDAAAAAXRSTlMAQObYZgAAAYBJREFUeNp10L1uE0EUxfERBdhQ0PAivAFPgUJHFT5ewC7TBJ8LBW4i3TM0VEgz09B6ptiOV+ARkjJt5GJyNbubtZLdv7zro52fJWtdq5aqENe3prV37vl2v959dK2SCsERQBrYwtoNwOdAP4AVrAsDZ7iUAWSG6B/AZtsAvsgl6VqBjGkEL84/NcAPvBoBlSnFfmL37z/Exxi/xj8x9kBVUsptBsX1DRjtCIAbUkjqSptZYflSyikA0HVdm8dM0pdaK87x7WwC9qTNZ+/ckH7G1Xv7RVCIj+3emXrzdgT0geJczaH9JcKnarlHGSDhoynOg2PJQYUqPpVuDtRjUVGIip3PAedrf7kVLtz0NYXarkUAEBBgGQgVBBeBMlKC+kUQfLQPEyGK3WYLi3RT2adDyr7kYAAbWD6dgpJKLnYr2UBfKqegDh0jx2JH96TVz9tpzLX+MYJf8+Bl+juNuV7FEeQFcPg9jbleH/YDuNvPA3s+jcd9L+1FqEiqVlZMZ/eZmCL8uK8JdAAAAABJRU5ErkJggg==","sheep":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAAM1BMVEX////w+fz49vUAAAD////49vXs7Oze3t7S0tL/uLjmlJTAnoa3lHuviGtXRjoICAgAAABdC2QvAAAABHRSTlMAAAAAs5NmmgAAAhFJREFUeNqdkgFy2zAMBOMqONC+hdv/v7YRqCSMPO0kvpFEUhKWwBEv29Rl5MgcUo7U5dDLf7Qdep9cFNJINeEpQCoyx8id8BxgSJHaAXoOIMWRQ16+oUfAyNSMH08BRg5lu/jDDC6HUhEjMzWGfgQYmRE5QhkairGv1PVo/GoFNrKjsLG3bX/7AZA0rjcL25R8u3YpzZgAsANbwvEI2H/lhn6/2q9/xI02oouZAFsIBTZRnAHz90psqKzUrrYz3wEdCzZlcwJ0sVIm12v1Yq73awKEsNMCYThnoOP863ar2Qf79mN/vpvIYWBgsk6Af+tyQaCQcTFnDso29vcAKDG2yxZ0KCaDFTBad7hvb/MVICTseZloK3ohFg+0jcwGDOmUQSJCJjFB0DxhFsCmdq4z0DkDu2MKBcZWBUQQWkvYs8j7m8bYthWAbRVk2SSeHRGmlhKUYx567piHDKiykacHiTAWZmnlJnS8RmoFkBK2FdgUvYjp62Jib69j+ArQh22JwGkC265PQG/erT8fK+AwHkOY6JEG+hPgclFlCoxZASZQKKd5CMsWRCwmGibDprBXgA0gCQKZBgWBlwzALkw15wxIEhMVMtjOjo71FIr5CSj8FYCxQVHYCQSAzdrKmIIy9aaTB02WfZwfIthhImLxwEf9xT48tDImpveRBFAErCUUZeZNA76lD8B9VdX9p4C/n54rtHuYBiAAAAAASUVORK5CYII=","shulker":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAzFBMVEWOYI4AAAD////m8K3h6KjT1ZrHw426tnmzr3GsqGujdqOjdKOjcqOec56ecp6ecZ6ecJ6ebp6ebZ6Xa5eXapeXaZeXZ5eXZpeXZZePZ4+PZo+PZY+PZI+OZI6PY4+OY46OYY6OYI6MYYyMYIyMXoyJYImHYYeJX4mHYIeHX4eHXoeHXIeHW4d/XH+BWoF/W3+BWYF/Wn9/WX9/WH9/V39/Vn93V3d3VXd3VHd3Und3UHdwUHBwT3BwTnBuT25wTHBuTG5uS25uSm4AAADM1DMFAAAAAnRSTlMAAHaTzTgAAASDSURBVHja5ZN/e5s2EMdpk2Xrthg8dKfYuMVet4U7sTr86CRskuL2/b+nnUiN/Xh7nhT2574guNOdPjoJEby6ULFYlEWSbGtp5Sr5ayM6xnr7QsFlR9I4JtswuYbZunITBOc5LwMWlhGZpOUKjK1HAwpCpTWAQq2U4v1oQM3gpQBiRMzay/iLgJUlRAWAKBi2xWjA0rGK1R2AFga5ajSgYI34fAMCP44H0B0opTQqQEQevweJywCw3wJUxpWjAe8aAwBKAfR7UE/YAwC8Q+URCBOWUFKMKlaACCJqzw+SmJtv+Iy50szSSEPWlKMBya5h43ZM1nJmXTEaYIu6bauybevicV9V7Yu/c7EMk+JduCyW0bJIwmybhCtvl8l8IbGsTEKxZ6tiEa2KJJK45C3mSz9uu5xlwdKxJUeWHTnecbtyxpkdu9yxv/ZLlzXkjDXea8w+OeY6FovaYE6NQdMwsDOKXBlJBMUG6t/lTOiaLSuWnMyVoXEEvS9viQeJ7Q8/+AuQWqkIUWkQyYPalTWAIF3gZSSegyiOAaVTKiiNQp+qfBa7emsQlEIEgdyxqwqGGJWSBNCKmqrIUAN6Oorv6iBxJI4IY60cp0njfQ+RHsebd45RpMUFbWm9sKRVjH4IgvhBRE5s6YoRFdsqMo1CD9DyMk01zy0o6NNjJFuGPl8jgC+LXOUrSDdp2jdQ1EoF6dr78lTQ70mart9u0rdpisD7lSXx5ZIbNbfB1sBwOEK/5uzkz8X/kzE9+rfUFIWBwZ/5Cu6dSQeAy9f3jk6+zHYvbQBak0r+egA43gRzY0/E3FUh2VMCuTLkZohHZMsod+sBmLsy+N09nBJ+/dDeu4chIfztw/7efThN8P7h031zlv/+YR9441Kbr/L2oTscum64uxf/xkt1xCLKmTNmw58nALr80PX6fOj4MAXAncmNlxgvL2Fz4XZ5ZwTiJSR+Gg/gjg7S2AjniSdUIOP6S9afT1qCr5sOxhdiDjQNcJDLc7ibAqDOPLEcJpnfs0YDpOp+C5npMKkCX7c/SE9yC2LCUc46zpmIc8PUTQHQ8U96kuckALHpb5GhlwGXv3Mnkqll+v7570d5dhtGURRGx85ZeBvezue3Rz+chdE8nIdDfC7ZMmQAhICgENNhACoFZ/6tUggAp3iM+hgPnhMkrPTwBSONWqtzICAinIAQK1QDwBMV4NkMMwRBxCfAnfZTDBP8on3B6hmwXcoKNUAMAD8nW1Mns9DPqATy07L4Y5tE8xkoP0D9uCqzIpHFgxaiBolnQWIpZkdgHGtyvF5YFtsAO5ZG6dLbO4O0Y2QrccnLXQ7kqI8HBTfsZIQ8M0u23LKTniZrSHrJlaWxfUTiufRVEheW5R1Jy3ZlsEyrtkzL9mNayPvjp9W6eqylr07rtko/7pO0fpT4XmJttSnbZVpLbvlYie/7vh6k6+urq+vrm5s3b25uXo3SEXAl+i+Aq17/V4Df/3Ndf9W3A64uNBbw/T/0Q68RS/B6/eXq6svrZ/u7XiMBNzd+CycDjhs5BfA3y7f3PUOzujsAAAAASUVORK5CYII=","sniffer":"data:image/png;base64,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","spider":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAKlBMVEUAAACSiX+MgndgVEhPRTxHPjWoDg49NC0yKyYmIBsmHxoaFA88AgIiAADotIQjAAAAAXRSTlMAQObYZgAAAgpJREFUeNp10rFu1EAQBuB7B8RDUCIs0tB5rUuUNAivfBKvkI5b/eNLyVkzg6hQYGfyAkn6oDwAFUUqUvA4rHTGthTlb7b4P+3urHZV4uqqsuKbHdNNz3S9A5V1NUVIVW0leQfOCuQvhNzTDJhF3W6RlUvJV5R7przjBSBxu5KbHmV73OJaUc7DBDIVIKs5zuSU4nSIkYotgSUox25z0GAtfe+qk+GWN0PCARhI1fgwyJhjpOb7QDQBN0DVJ9BRiJmhB8CQAlhlAfZNaxAfb8ziwuSLQeqmrdx8BMJi0qsvBrms6hP3AuZIFxNYRJBj6L5W9d8UYg8SGcGmjSlRFuOB1/vqz7v6mLYbcscIEoYOAjNLoB+/6urtbwarGabB2q4juBnR5dnj+fnZ4wlDM2QEbQhdVHXOoLr69PBwVFfM0sNmgEE9g5Ve34U3dTh9IcZu/0Gsw2atboDL6f37u48vL+7E4c4jaD80YU2ult0v/NvP01d+707CGMG2DVVH5uNrPk0a2oog7vYM4G1qgN6FngEAgZmc8aQKMTSBgY62KbShCwIKaTODGPhztU6csA11FTgJQhNpBuGoNM2QIGDsQx0ktfF4ARKDIiKYmUAhdMZtxzIDYN+g5xLJVO4Aw8BYAG9L7waQeiaQGwlIZ5ARu9g7a9Yc0wYFK+kCeAbgDvfegdK7qyy+4z9b0kGP3NmJngAAAABJRU5ErkJggg==","tadpole":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEUAAABtUz1jSTNTOSNJLxlEKhQWCgDfr9AwAAAAAXRSTlMAQObYZgAAADdJREFUeNpjYGAyCglgAAFGRVcHMINNzMgARBuliSUZGQEZzkZGxsHODNiAs6KwA5RlYsBAOQAAqGUGQPKmAvcAAAAASUVORK5CYII=","turtle":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABABAMAAAAg+GJMAAAAMFBMVEUAAAD////K0JHCt4ComnNHv0qUi2OCiFQ/pEI4jTopfUkwcj8gakMlZDMbWzExMTA/pVLKAAAAAXRSTlMAQObYZgAABDNJREFUeNqd1s9r40YUB/DAZr1Z3JT+By2S6XnRiJyD9ZjmtBRSUbWnQITMQlgKXeJL6aGxlpltD2VZjKY2uRW2JodAlxAxm9DD4satYnKuI7OH0qUkEfQ/6Iwk/7isrNnvSUb2h5n3pHlekqkG9AVC60vvnLuEPJsCDxMRL01pYIWQ1hRwo+T6leeBixUA234MsJV98Cxdxx5YFuDSwG3b/tzFX8nLigtoDZngpdlSAHYbOYCMmoZMBaAa+LaIQ0/i+GKpsm1ouqYhFYARCRCWAZamGcLACkD4ITn+nvzXyQCUAWvlgdWQBQGlrBNLYFn8WO7BVABGTQ/Aa56kQAUAtBoAzgHl3DI0rV4XVVQDVvyWtT4FdE0dcDbr9yaAbiJ1wN80Pkqv7riWoWsIGmrAXX9Py4BbKN2CjhQBsolmQE0dWAlaZlaDZWTUTFNDpirwDNazGnhQr2mAVWsQMjf7cgWQ2IJuYjWgGoZTwHIxbIMqwHl7AmCrpmMFYBkAHhx5YfpSt971ZL7tt8yC35Y5Vfdq97JLxoiFkNwBqJyq5Ds9B8IgIIQ89lzLQGZ5wHmqTQBGbZ+0AOmarius4CnKAR4y33E+Qyapm6R8DeietZ4DzJft2CAy5YcjbYEEKp5nU992GKEAIMu4VRLotPGP2aWF0AZlbQCsMl2rnaMJQEQC9gIZCFQAfvTgMAd8/wvKfpU9MKHkXCSs7fE2iGx8uuQ4NmX8uGVstJA5edpNE0q/W7IHtHNMZPIVpPMaewtr8tYuWHJezwD1pPN6rRiocnbm22TQ4SPO/2XsivOLOcAwFgNhNyBdxnnMTznrnPITNWCV8796vd6IixE75pyfxvEMSOf1x8XAe6PLg2ESHYwuo+RG7CJOrn+b3kznNS4G7kT9YZIk/eh3r/FtEg2T5lzT5bxetIJlgETkbxDBjWbTA1ifA3StEKiOX0H28oDIcMSvB75t0+jqMAd0ExUC798IADdFdgVwniSsG9hOl+2/zu6n8xoXrSDuAzSaMi7g81HI6B+93oCyw5IPUvXkDVgZsA2f3PAwePLcdnpkBtQWAWNAzTRfm/djzsgvsgbPaX5EyHm9CHCnwMOYd3uB/Ov600EOuHJee4VFvGx4GbDb2ImTq5eBWAHp8kkR5bzGBcDqOJqtYGcYhzSSXRjQvAbpvMaFW7h8NAW+kTVwRBfOnEkN0nldCPB5YCQAW3Th5ylQcQGKpr0EmtMapMCXogZPJFCQghXsR2kbD4blANmFeUB0IRgQ26FnndclAdkFKwdAdiH44YyQSD6JpSK70NjNa9DciTlnpBtFAe2UB8YwXcF9CTCxggErD8RvADLgkXiZRjzsMkK7jJcFVuN/5l7nm3icRCFjL4fJRdkuXPfngCi54uxP1hEzonQX4v7sRMLnMefhfpIwXrAFhXyw4P7/kgmYSeJwxJwAAAAASUVORK5CYII=","vex":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAMFBMVEUAAABthJtgeY9Ta4H////z+Pzg6fHG2eqivNWUrMOGn7eCl6t5kqp6j6RthJtgcoMKluMvAAAABHRSTlMAoKCgEjok+wAAAPlJREFUeNq1yL1Kw1AAhuE3hxYrRYm5gmivQL0Hwa1LnAtCFpdOjuKY4KBjfnYhIUPWEnIBhgxZRSjHC8hp3KWxkg5ndfD5pu8FDqNAKQkwKXIE9Fuj3zCQjECYDCaPs4tOQP9pDME4B1MAbIwTgJEwv2yixPcCPw2igGkcljlZ3YfP33WSJTB9yhG25HaJPLUBtkCdvl5fpVlVVRy3ntdQZW+eX6e77UIcNqAke0eq+JCgGvam4apoUGqtHtC067K9Q1O+l2WMJl9RvPAnl7+0L5Ao9NBB16GxZpZloTGFeWYC47l7DzrXcUF3sHTQjW9YoHMW4zn/5QeNK1xt8XQSVQAAAABJRU5ErkJggg==","villager":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAbFBMVEX///++iGy3gnKze2J6enpra2thYWFUVFRUU1NISElMODM9LSkAAAD///++iGy3gnKUj4m1e2eze2KBfXl/e3eja01vbWqQXkNjYmAAlhFUU1N1Ry93QjVcQjpISElMODM9LSkzJBEjIyMjGBTjk4HHAAAADXRSTlMAAAAAAAAAAAAAAAAA7Uh4SAAAAn9JREFUeNrtlN1ymzAQRm3cuG5C9oMFJIW0idu+/zt2/wieiTNAk0ufgdEKs0cryWJXB0RguUEO1/Xzc871Irs3AViTQdnYLgAzGfmPkFnT9V4tiAI+IyCB/19AVgA+KyCaF9FZL3iDlfUCAl0AjpYmFgWagjkJfjNCtCwgml7niyrmcJ0gho7mQkDrBJALsAhwyYY1IAP4bahgdmKFgBme8PjE/PRI3mMGG1gWxMpnE3GetmFiWQA/yJl/CpzJutggYAYYIjAyQfu8XlAv8DWCb5sFqW2Btk2llJSKctwqIAFJ8oVFQRL+ChcCEKGlKwJSQLRfENBHFYCMZYG+2F6tAOauFgRtC8K1RYSdVqhgd6eCUmIUxTtdKknySXchOYOQEhkAmNmm4YJ5FPWM0nRdbKNGZRxHH2KElx8CRmWCvu+7roxd17nADE1qhdR0RfP1mQZMbAqwnxcT9KnYS5Lc903Tq0U6jVTt+Xo5SesWCUMvIheUMvh5GnwqqpKUJPU0jUSik57jnyswABWgitMYU2MjZlw0X9ppDbpOTMSkwCCQCXw+FBe4uGGUdehGy3950ScaEC4/duwCaWHPorEdGSM/0mMRRlKYogD2bZzGZvuJIa+/SFIQYfCjqvb7w6EKDiYAGe5h4DU4/3o9ezSzF94JGK4IC84Tr+d3PHzwTbTqvQVkqjMlSEa5KjhYLUElPJxOD8r9/cmjGQJxJmMgQVN2B0UCbUxxPJ2+OyI4BnfKEcAwxF95mARL1BcAnJmcTIRqq0DzQsCZwJsEUIgGFUCIKmiTQEceZsGwRlBPQGHY3EOQB2Jalz9XAB11crFWUH+Sm+AmuAlugi8T/AM2/NtEbUTDnAAAAABJRU5ErkJggg==","warden":"data:image/png;base64,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","witch":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACACAMAAACMX59YAAAAmVBMVEUAAAD///+2qJWrn42rnYmmmoijlIOgkoCPj4+YiXeWdliWdFcltDWUc1Z6d3eAcl6PbFNra2uQXkN6XnBhYWFoWUwMixp1Ry8vaDVaTTZMTExHT0hQQy0/Pz9IPCc6OjpANSQkQCg1Lh0dPAkxKRwoKCgsKRg2F1guJxonJiYwFE0YKRoTLgEeHh4oEEIdCy8REREVByUKDAvCurIkAAAAAXRSTlMAQObYZgAAA1lJREFUeNrtloFS2kAQhiPphVJbKVq10XDG2Ba4mjvx/R+u/+5yR1U0d2SqYyefgcuO+T/2NoYxyw4PMyLPlVL5KN+gsuz8/Pg46+bw65dPtEoeginjBdFAkAvTEkwVxen1eoJRjg30FfTbgjAKQ0wlD0NQTEKQNq98ntcANhU3fQkVile1talogRJBkQsiIFG3QPnrVQHkNBhAt8BHCgKFxBURJSh8/hcjFeULECXwMzs4KYqTAwpLXgxFtwBXkWM6/gDGU0kHugUTMoDpeHx6Oh5PleQnExy0dAsmrICAmUp8S/ZeKQum/BFIFUyYWIEGP0GMYAEM+OeCgnkVQQNqCJrlcqlBDXBWqVGuKlSE1lVZVpW2wAtoeSxoWEB1XZVaKV2WqEBVleCBwNEaBFoEsm4Epaa3RgQlTvHmSGCQdxCYIKglWEOAbpdNAxclaoR8hWZwOGedgcABWkVQe0ENFY4lIIFmgVQaabw4CPzKglrX/MkNTuigAJpmQaUbrl4WIMXD07JKhHagMfiGigYmHFXVIahl9UNssANUAGdIw7FTgMslSAMAItAiCDpsCT/ZLubzppHcfD4D4tFVSV1UGwHycOwWXMwR/Hg0w3JBAuwaR83AQhORHtDjbgGYHc1mtH4DMjbN1DpUPKnseRZ+eRFjrbPWGKx88vev4gQGOQPYZJIFoQO7swNZXsSGLTzpYNEpcIA7gEHOxRY7RBFgBs4L/BycW6P0HaBar52VLxz7tAMJiUC6ySwiEBiZMucd8oR5IkAqCMS1EVi+2iwMFw5hEUTAAkuC2xsIaENUCdEC9EICRGy6wPEMsGkvWKcK1jKDrcAlbmENgoArt7/A7CFwDwRuDwFP0W+BJ5J+GyEwj+6CSRQYEZitgH6iBU4ExgtMssAaayCgR5QqK/8B2PgtWMsCePhhIB+wCX8H4PYGQdKJAG9JHYjAypNhKQ0ShshXs8DtIXCISMECrliYpbEK3AcSBS2zv6C9Y9pB8IaC/rfRkyZYRfKsoI0kspGOzrtuQdtHcEe8R0H/GfS/C23gd/uYNMH19+u9BFcbLs8+n11ePSSpgxU6WLUeea6TJsiz2xd88tsJ+m8h9osj+gvl3QnA6j7rBQ+uD9z2wMDAwMDAwH/EH571WWMJHeH4AAAAAElFTkSuQmCC","wolf":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAAw1BMVEXt5+jk3t/c3Nzf2dnW0NHKxsfIwsO3t7ferIWzs7Nu1Je3q6WhoaGdnU10oIaBgYEatVh+dnBegyJlZi1iWkAodi5WVlZUVFRERERHQjs+PTBENiY5ODVDNSWAAHY/MCQzMzMtLSg1Kh8sLCo0KR4ZGRkAAAD////k2Nnd2tvV0NDTz8/Kx8jJwcLBvr7UtaTOr5bEq5ywqqefmpaalZGnj36ajIiVhnmheFuUe2iBdm2Mb1JJQjk5PD85ODUtLSgSFBY76smzAAAAJ3RSTlMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/HzzAAADR0lEQVR42s2UbXfbNgyF6Wli41WZqm3NtkQOZ3ZVwwCFbShO6r6k/v+/ahdwtjOp/dJvvZT5gqP7HAC2GYZhWFDBYBIilsvLy5Ty8HsPiY4yirIQBgtfX1/HLlbD/xUcQIXh51JI1ut1TumiXyz6SKKkAi4AzEQGCLH7AhCpFDxMmBmAlNIffYw9MlMgPewrAPDHKWCxiAtmEFjYyogIrNd//frixU8/lyKIF4htdUAIsxIETiEAfMPGQRmDC0HzGt1Xz6AKUwAXJxC8VAgkb+TgIgIacV//7UE1K8Fsb477/fGN+Q1HAFw9e5auErZi5KcVANcsA+D3H+7vP+yFvA9CvBZhr8qmU4dP9Ukx3AzABP/DAwjE9hbGb1TcYnYCynCOksJYpwCR/cM9QfcPe3lSApWwAgJ5AbazPhhqCkgpvdwddnjOzlLKOZnEatH/CKKEgJ0w5CuA7WHrgL8dkNMVLMKj18BWxegBIgVHZQrIOb/cHDYO+CGfAIl1VMHjDYRvFATYQ9hMAb9Am08bJHF2dg6Z/wqq+9j3nf3wYmhjFWOoY+xirOowBWw3Nzc3R3w22+1utz0fHqFl09Z919e1WAqS61hBDsA6B4Bg/g36cNidP5bySKVtYmeDCkSr6nl8jiy6PkYsU8Dh+Omk4+EEIHosVFV17LouFhKlEioQapj7LoZYTwE2NaucXl9cvLa9XwSLUHW9DaERDayRd4ghdH++whzngM+f373LKwA+fnz/dvCLIIaqRgv6qGKAEJxQhVcd0ghfBSQHvH2P0I8h4O3Tt6Cqo+riZK8i9MV98HThcVZMQsyDiLVO7CjYEGYqSlSFAABYUwDx6T/YwEesTANWOIRxNCuRFLZWLtGqpmmW7QxAzGZdqllUDFBOAMvA9pgVuTRt2yyXmOYZCDOsjYqjeGAqEBPEBSIERkCaJue2BWbeA7jwcYACMbAl4CWI+NYBVAyQVmkOuNPxTvVubAUWJZQAJxh2ZAD8RKNyaVv7r+c5AH6MUbMKwW5NZKtamP26RgiPjkwruLMxpgBhvr29ZTEAmwsAtq3gMdbpNDIjfSBWaTUFrFJOVlvGQHrAm9XNPmEAwCqc7UWbpoDh2/WdAf4B+LQj08eGOFAAAAAASUVORK5CYII=","zombie":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAclBMVEUAAAAAzMyPj495nGVxlVtvlVxtlVtnkFYAr69ph1Z6d3cAqKgAnp5ae0gAmZlra2tXdUdOezZhYWFIdTJJcTVWScwAf39KaS0+aS07Yi9MTExGOqU2WiUAaGg4UiYAW1s/Pz86MYkwKHImIVsoKCgaGho5R/XAAAAAAXRSTlMAQObYZgAAAkJJREFUeNrtk2FzmzAMhpPNm+0akmjVqFRGEsPy///iXtnlml27laRfeWwswZ0eI3NsZkRFVWwUdHMrIqzKitKC3C4gVjhgOQLVOwQEAcvdAmViwZQiuKOFsj2J3i1gZWEVrAqEbxaIlkHMAni5QK15VRSpwTI/UFuYFnx/q2ZCQYyMEq5PSKWMJW8gZSv//av75rneqcJFxMqLemdiiq1zLraR6llimEtk2fdnpvZycfFyaeGScggkqKclLQjqWShG1RhR/XIKCEgWtCByLJs96tOTPiIROoogMhEvO0QWqf+AWqXdsQIEWfhP/AS/wXy//VXYji/Mz8N2G5iIPxYcC28EW0CsnxOwqnyqhTf/yQhy3/fjNE096Lru1CRl0dR0oGlSCAn5bteZYI7vCcYiGIYuhUa1CQH5kFIAVRbAHP8S9FeCoQhC2XgAKSDB8h9BroIMQc79aRhOwQwoqzkyTMt3Ke3m+CrIVWAxwzacTiZIRQBCgwyXgAgEtGAzk/tcdh6R2ETNkEyAOSCfBcykLjovyuy9j68CVPUAS4lWZB3AkQa8b1WlJMzqW9eykvhD9O8IkM1foR5Bg3wwlzlQJ967loQ0Ru+vD7EKMjJggnJsuKosYZpA2TsXiVnjdQvnsxVa+fm8B93QdbanlRUBkoBFWMk574RF/PUbPJ9R+OVhj/BsgnEap1xIoZsmyO1EcyYI0IFXQTz4+CoA+4f93uIPAMHYF3JTcyRokkmodbFVEo6HeNisrKysrKysrPyDP68WY0lh7YK7AAAAAElFTkSuQmCC","zombie_villager":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAt1BMVEVskkNwbWdVczVjW1tWYC5jVC9IYC4/WChUSSg4TSM4OyExPSUuNyQAAAD///+Iqlt3oEd2kk9skkOCe3RyhFFmij9ffzdwbWdedUVXdUdVczVjW1tUZkBOazBgXjhOaC1HZTdQVzdUTU1PUTNBWSiZKys/WChcQjpURypDTCQ4TSNKPj42TCpJQSRMODNCNzcxRB8vQh44OyExPSUsPRw7MTEyNyQqOSE9LSk2MiAzJBEgKxgjIyNApSiHAAAADnRSTlMAAAAAAAAAAAAAAAAAAKroblcAAAMeSURBVHja7dF/X9s2EMfxrGs3oGtxHXTSztIuE+mtyG1+2HNKxp7/49pXIoHSUhxe65/52E6cmHs7MpMXuxxR3p0iFF6+3Gz+vPztlxdP9AZN9h8IfQ1c/vEMgMkgItV/kYbN5upys/nw4dWhAOarGkS4Ay6vthmYfL8HAHNViD2w3VxdbbfPAGoMV1VVuz2w/fTpeUBt6ro6r4yWwtnZycnJ2dmrgwHMwqjODbmADgeIqrx6Q5XBKvALSlRyOCZjAJM5ZyJig0dgKkN3sw4HjwMEwTAFNlRfuIpDnkIF4DAOMAsRgGAMuYvzEBwmQRTG0SGAGlYX5hfv8AjfzYMT54QzwJ4OAkRFHc//Kc2ZhJQ9xvHCBwDCAkGE3r4P4f1bkuxB9ThRFR4FNCVFqQ9zFHp8wr7OX616XBsFUt+vUwbmf6M5ZtI6rYHgwqpfrQ4BUhb6eanv0rpba5dS32G8GwdOT1+f5iYjjQG/PvmHTwE/o5/Q5EFWhVnUNnc9FxBCfChgUd91/et7gDGu9AjgyNHnm8833wIQvgDoe7+A6to9CnQQvgQYgDwCmLqmGwhjS1Bh4scAMiQPgCZnse2zdmqbiHkS2Qm2URG11iEict47T6gAbRObaNvYNjhpbIyxzIsw42War8a4U/M8Nod5vQdibNs4DC0MGzNgpzGlJEiTLfMQUIwYNo68I3WexO2BdgCgQ3awNVlJuzrcGpP5FVkhckCIRLGLuwVaTaopJLyBGuK9gPmptRbfNFMc1qozZfFCglQKoIgDOeagA7Ym3zEOXa7MN1gASBBRlQwZQ96JOBwF4MCeidg5puQ4YMELPNgO5UeXsWVEgAYVJlMALkIBKIAAwHnH0SI8FE2xybddYr5tmzZFJAwAeWYIorcACzE5KC4wBwDLYVgu24gwPeR57KlFHpN1XRsiZgehACKz2wUJ+xnOF7uu/1pcL77Kq6caZUD2/0ZFAk9zM9XrfYvrb1L1TPXvNbFnhwqQEPOKZbVKaZW0aWIpvy+bZVOypUYT7vFx9tGz9zOcFuDN/+gIHIEjcASOwBH44cB/1lQM4ZNhKecAAAAASUVORK5CYII="} \ No newline at end of file +{"allay":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAV1BMVEUAAAA4jNkuh9Ypg9FBnNpCm9r///+c/P+A/P9k+/9N8/hM6f9Q2f8+5eo94PdG0P821+4s1ewiz/8syf8ox/8bxPNNq+wQwf8os+hCnNpCm9oep9s0h8D7j8AOAAAABnRSTlMAoKCg3PODq/XXAAAA60lEQVR42tWP0W7DIAxFb9OtwdA6xQ3rzZL//84BD0nRljzsZdqxZCx8hLio3Lz4GwtYMWLDi4jnPM+vwogNKTTC43Elr6vgRMQ1wvM5ktsbvRPXN38wGxKHMmnI9M65vgxavwsg2WCpCvlSg6iqlCF4ceKbFEGZVC+5NFFXYUtxZzILl1xmiffoxUcA5DUHKULZp6iqsQzU6KNWYcxBUMnp8A2mwWxAhTPR0qRYFs6sDT+zTMZpWj5pO8L0wamexJ9xXvm10J27rrQ94dSdOqC0PSFXPV4JRuwRzIxGHMB38O14j4N9Wf4/vgDzpRGDwkNeQQAAAABJRU5ErkJggg==","axolotl":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAP1BMVEUAAACvsv+zsPmmqv+nn/+GkPXWhCt+iOyBb+d1b/9odutodOyTWuRbb+NlZfS0W0xsV+JpVuNNWc82QZ86AGw+Ir4cAAAAAXRSTlMAQObYZgAAAUdJREFUeNrtk9FugzAMRXG4twFS1jbl/791cbJUQnuAmE2VKk5cKpDukeNA9zeAhP4mwDlgahdAEoDm1dAukIzmlXaB/HBcUGbQJCBkBejgkMrt3j5WeYGD0iAglkXkehVZFlBQ2b0FkKjtE2CjIIYEUfIhESdMCUyWoyBFZPZI+Nks8OUs/f7kXSsLgCxwiRbBl9YRgddazcC5lhnc/T1VFdQObDMIwdJBRQQhYNWBTTCXYzR0AMZIyOy9c373FuQFGXLJLzYFEJQvQSHKgwKwJQAF1BWqIBC6hNlKbAg0GPXyjDHkeqoj6iVAn4DdP/NQhuHxsAr6HroAswB52QUcySTgeGQGg3J8lPY55h7Q9705XQdpEgwaHXVhtHZQX6Whew+X+mfldsn5W3fEYM9fVjfm/pXShd1g38UrdvuIGZycnJy8kW/CDQ5IMRlUUgAAAABJRU5ErkJggg==","blaze":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAJ1BMVEUAAAD//////4T/+Ef/1Sj8shf8lgDReACrdQGLNAFsMQBfAgExDgs044iSAAAAAXRSTlMAQObYZgAAAPdJREFUeNrdzzFuAjEQheH3vNR4xtCkibyQA4CSCyAlfZocIjdKm4sFxAHwGKVmQo21Ts9X//IbE1evBfpBjG9ozXDlJZkKTkAr4IpShNVkMjiJ7wuUkwEJhcAmAzFGNcTJoFisJZph6heJiG7xDLT4XKRC4KiubvSf24kY6hiLnVPMVfE+NhPbo2Y3YVBfPA2/Q3PkchGGx++H4yZvd3GdNrjBr32FeDzPUdN88Mvn7QRHHiSX9SkMwnxYNTdkq7sDlMsLkZHRBEwBGaBpKnQ6GqsVegLIfrDOfOkGI0W7gQTN6JhJQlcYCOm+oJyjHyD+F7jg7v0B5TtIgi1mkx4AAAAASUVORK5CYII=","boat":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABABAMAAAAg+GJMAAAAG1BMVEX///8AAADCbT+6YzetXTKgVjCZUCuPTCqIRyg96zNeAAAAAnRSTlMAAHaTzTgAAAPOSURBVHja7VTLbus2EBX6XOcPimGzL3jG7rbIzChdFjap3GUB65Fl0ZtY/oFr67NLqoljFVDkRXFXOZZnQI/nmOYcnqL4se/7U59xyGGy+qtI+OanHDdWvOLmEkXxnWp1DKZqj43mVB2jakiroH+8EfhZgu8t2BdVC/opWCbKq6hppfbbG8F2juApxqp9RRPDp+G0f112hyF9/9tfxr+wmiF4NvZE6VmNMdyfWoAB3oHRHs4ENrsDgzYChcYc4/3eHhq1YFWOXfr+D3/mrjueIdhHgVgVhMcYu2c1a/dRY473ZwKPGYLh6Df0MzndjvFxeFoDW1glOT4Q2n6/81TcydwOyqHvhqHfH3I6NN3jcBoSDmM6Oq2GUxAqUM5OQTjEIGBhtm28b7Sq2pgnGWJbslWJ/cnP6+C5jGKKlUXvaePrh7axJmjT1ow1r7ns0kZOvpAwt4PSOyFHxBpFtL6vYQIBx6oxq1zZJ4IvVGy2s2NkgEO0ynYcY7yvg2pVNe1zp0lh+RD7/u9EMDvGath3w6k7jOkxH2I/5AMc0/HcJavZMToLEI0rckSrx+GztcGsqncQcHfuWtmskG69c3TriDlaFbvPNUSwEw5V0/bnLtLZMSqiCrOM2wgP+1A2eYSat/G2A8YcgVngChaj5G3kyxSqJ2vbRrBrD+cux7O3cXKd4+/T69z4HZFLj3u5tGvXTwmKuEXGCv0rLn9COELBlfqXSxvlvwS0oYxbGl5xSbDsieS33hP8ypG/cyBP7C/qy54I2TFUsE5xJyrKpVzUlz0RWgsEWiprrQLWUi/qy57Y79Ohp6frcsro2ov6sidSAI8GagJhAURxUV/2RG1ijM/pXcUzLurLnlhgOyeDjGVPzDqYymBSd/owHM+eOKMDAmHlHYknELtJnfvDcIz6jici7FjApQlqQGUtk/qv2RFbfccTEWqooDRkGUxUkHGbCfYyeuK8DrqzDCYqyKC+Hw9x3hMpMNYKmIIFIuBJfdkTsw4eJjKY1Jc9sQBGJbykfoJUX/TEgjw2BHKgjSM/TJDqi55I3rmNzwyUkvPkSQj5gzvv6GbZEzH6ADgK1xCDCtISlhJUbpY9EVFWdVSwxUY4WgDXMQgHrsHxCk9sX+ygzcjpctneLCL7gVhAaRaE2QRQBpeM8TXfOPWDf6VwVsN5GRe6l3VwDYHztElvuJQchgmuIaCEDdFForu3dAUBtpIHBnAevKmkzAJAa6heRTB2ytgBE6juFGBBLSwzXf+zDsaBrwUQiAnALChFwIB+DR28X/4g+CD4ILgW/wAFIWww3uybGQAAAABJRU5ErkJggg==","camel":"data:image/png;base64,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","cat":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAATlBMVEXv9O3r8Oj72bPW1sz71Wf2ymD1yF7ywFnxv1jvt1Pqq0uvdh57bWJjSy9KMBc6Kh0RDxgAAADq6urOzs6vr7C+c3NanRJWU18kJDEcGCdfq47cAAAAEnRSTlMAAAAAAAAAAAAAAAAAAAAAAACVcz0/AAABUUlEQVR42t3T3VrCMAyA4Yi1SmtlSxSS+79Rkz6R0dEywTO/0rPyPst+IFhiMSJyAW+amJBFA08EEWBeBQtQ/1BKuRuY5yAusACo4ABSBUpFxbsCPkJKDgiLgAktANYYOFhyDlxQgFCFbUA6VaGg9lsAj3LExmBCi1i8MdDNBWJ5GBDmFmBhFuE7ANQWgInVY+q8B8wh58w8gy2rBxASIRJ2gVwBOOf3oAFQ6wL1kP0QeQU0AhRdIb5eAe+15V1vAWqB/X4E2PgrADtA3O/XgJ3WTSDeCJi8zcc4eAo+QroBsC7hC4AMOAspxGQNAUZdTDwAtkdAQrTdALQAMYX4FkIYA1VwoNZ+CynqCLeuIOSkAYyAqRZjFyDNAe8FytIOLuoCNv3hkLPtkP3k8xNc1RthZ6YiPwAMmmoAHUC028DGCKevkwg8DnxafwDmO/uHwDebkIAap1EwrQAAAABJRU5ErkJggg==","chicken":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAALVBMVEUAAAD////i4uL85XDT09PhzGLGxsbgu2nTrlrQqT/Bk0OWcjRjVkH/AAAAAADtfCsnAAAAAXRSTlMAQObYZgAAAO9JREFUeNrtzMFJxFAQxvFZrGAewaMwwxQg2IA7fMzZElQecxZswHZc7CAd2MM72IlJVoXEbATP+7998OMj2kmHW6LXQ9/T0AUt25UuB/D+dgQ317+AXLZ7OgxN4vmJ5vGxforGXhbgSj9ElFqjrxYXomN+GriqmqG1H3E3B7DmQN0A0Wpk0laqKlw2gKv9AdycbRNE1dgA1SOy0hTWQCIrgqaUlnGBqkLY4aeAq0FYfT/OFRBQVGERWQddAKh7ZuFVUCwqorow8166jgVzoBaZWV2FRZS5iM2BYwKwBzEfjJSYg/zOIx7hDk86948+AcUmS5dD8ZFCAAAAAElFTkSuQmCC","cod":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAJFBMVEX///8AAADr2sPWxa3KtJXCqIW2lmusiVmScVqEZVEiHyYAAAB2QJV6AAAAAnRSTlMAAHaTzTgAAACbSURBVHja7coxCsJAEIXh5w18RSRiZQT7sAS8Rgyz2kbYIN5CiDBbx8CewHM6QS3sLf1hivl4yMc626+ZCgKQzENVF6eSsaCVkRCRfCiZhFYwcM4t+13SqFdOwS6/Vw+5HA3qFyz7beOqriX9ezFsKmlcySn4lFKMMQiJGYWwR9VQyTnGmggh3M7eeyGBQ0u4TwZkR/C7P/weVk/OOkCzBdD8ogAAAABJRU5ErkJggg==","creeper":"data:image/png;base64,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","dolphin":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAP1BMVEX///+wwc2In7V8gp1ZV3NXVHBIRWP////D0uO/0Nu9y92wxNmwwc2lutCmuc2dssmSo7qKmrGAhqJrcY4ICR+8V/49AAAAB3RSTlMAAAAAAAAAVWTqWAAAAc1JREFUeNrt1GGPokAMxvFRz9sd2+kz5fb7f9ZrmYECnuDmkn3FL0oaSf8RJaT7iB6Pz8/Hg3J3u91+mzRCITtVIJwNS3JcUzMHSlkErtfr3fQAPQxB8uhVYPAA5xHf3fQNSguU6eSLwJ9hHXBpROTXR5S7F4GcLTBd5ioQP9BuwJF4gWU/wAt2tumBpnQRINoEhGUORIHeDggE0gJlWgLKPHUvLkEEqLUCIhZAVQXsaCoAP2q38yMG1Y8vdcOg7utD9VsBFgNf9zfEcO7eCuTMvdG3bb0X+K3AL3sDzGmlFNpVZskB22xxR9sRENkGUAqA4rDWPoqPk+OngIaKWdVnaVAVo2pDBKotGl+KQhurUa1zQAQjMRHICywCE3/vSrq2h0+/8KnDvC5s95m5D6ntR4BZLpfL+BgRv7WEKKY0Y03d3UWALZ5GlLMAkjPFdBQgskCOQKbl4ThQiEoEQHlEiGkRwItA3OsKalsa07cCg+/51hBTBGQvIIJxTWHUJ0Bk/V8AEXsKpD3M8Ux1ywCI8F5AwJD/CAhUtBUkFYeNMvlXQABVf3kCHgBq1YVagQgcid2N6tIxEWGXZ+ykScdie4En6XQ6nU6n00/7C3s4RNq7Xn9vAAAAAElFTkSuQmCC","ender_dragon":"data:image/png;base64,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","enderman":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAY5JREFUaN7lWNESgzAI8yv8/z/tXjZPHSShYitb73rXedo1AQJ0WchY17WhudQZ7TS18Qb5AXtY/yUBO8tXIaCRqRNwXlcgwDJgmAALfBUP8AjYEdHnAZUIAGdvPy+CnobJIVw9DVIPEABawuEyyvYx1sMIMP8fAbUO7ukBImZmCCEP2AhglnRip8vio7MIxYEsaVkdeYNjYfbN/BBA1twP9AxpB0qlMwj48gBP5Ji1rXc8nfBImk6A5+KqShNwdTwgKy0xYRzdS4yoY651W8EDRwGVJEDVITGtjiEAaEBq3o4SwGqRVAKsdVYIsAzDCACV6VwCFMBCpqLvgudzQ6CnjL5afmeX4pdE0LIQuYCBzZbQfT4rC6COUQGn9B3MQ28pSIxDSDdNrKdQSZJ7lDurMeZm6iEjKVENh8cQgBowBFK5gEHhsO3xFA/oKXp6vg8RoHaD2QRkiaDnAYcZAcB+E6GTRVAhQCVJyVImKOUiBLW3KL4jzU2POHp64RIQ/ADO6D6Ry1gl9tlN1Xm+AK8s2jHadDijAAAAAElFTkSuQmCC","endermite":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAADR0lEQVRo3u2Y61ITQRCF5wGsEhESCrkloiEhITctQG4xiQQRuRuIKPrH93+Etr8OHQOloPyQbJKu6prNzu5mz+nuMz0bwpWtL+7LVqkl69lzWU5tS3IiJ9NjL+TZ0+cyF89I6LJ66di8+qoZ5mLpkIhnuqfD6KO4+e/stvse1OqFc9EXk1rpSCAD4G1Pysx46hoBq4Vv5mvZZpifzBuYvyXgtvseDHi9qF44k7N4yXwzeyicf1dsaTY0ZDW9K5WlExvVw1buOOg1YS2zF/TeUM03yaDwdun0Gvju47vuezDTP5dq/pMBfZP+YOPyy4bsvv5u55mnJJhTANKzQO5rRBaQ5fmqFBKbUkxWZGXhvUW/VmgaaH5TFmTGXFfd3kzz21K/501T3qKoGWCCSCbUVBNUtKwcOKeiJRNPZiU+MmOORiS6BDKSBADcvHjeIcEBVwqnspE9MgIgBLCTowkjITYyLVNj8zIbW2D+j7Xf80bd4lrvDv6fMyCSte/WKH0xEfMRcXPA1Hwlf3JnBiCKCOLG4kHnOZExIs8L+0gpAN6WR40+vQHgOefNEeBjj6esR/AMWEvvGQn+nChlgC53TfGRqOOoP/2BAlMCdkTB6crwWbZLF7Y6+HWsIlzLvGZA5zlRygB7YR8BbYAU+Eb2wIBxjHMe8FzD0klvwDzHdo0e+3MiQwAR5YV99PpfvVr7iaodZz7K/soP6w+cAL8G4LaXUIL8OZEigKj62O78diy9yQCAA5RmiPTmOgjgHPNEnBaZ+5wAnhMlAtidtZc7dYRONynmCjIoAUEjHzTyJpAInp3XJRPRY2QViKwRsc3cUafOKQGEDWdOI29LG0RBAOA18qb27AsgJNIEmKJfEcCIOwnUsjY7oa+NKLt6m+Jn2moPAZBDc0Oa9zMBmtotaZS/At7qmpRWAsgOAx+pxuY+GWDKXbwwEm7u7yHCxY7a7zv7BbxljupbVuimiBECEDxteoyIvrOd8qUBZROk67+pPEABTjZo+9sBjx70tfnX3tRUOSQnsmHgbCV/aV9t+Vw9M54aPAL4Xk8GaDfYG5+s/1MjZILHqE2Q7ev53Ra/Zuj7PgDxAyhC6B80BqoPGNrQhja0Qbaf/P4PM3XaxMkAAAAASUVORK5CYII=","fox":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAgBAMAAACm+uYvAAAAJ1BMVEWAgIAAAAD59PTn2dPVtp/nj0G0j4PifCHMaSCwUSKOPyRWPzQGBA4kh8LGAAAAAnRSTlMAAHaTzTgAAAGUSURBVHjahdAxb9NAFAfw8wRIDLkFEsSCG4kMHVAzwAiV5W9gXUdA1omugPWOEdpwzxthaP2qLhnrD9ClHaKuvQ/Vv2OnrZuhf1myrJ/+vvdO6YcZ8p/4jdZqoKLB87AchKCQqA9X2+F1HJa3sNuCUv/3ZfRV/q3hMP4E0A8DSABN46knV1prUYm4FJGK/d4KyJgyTfP74FZQZOZvkiSfG2AA86xYwyHg4x0U9AgUtAlDZiYibvN7Mknyb5PJeKxGVQelIPM4RjVG1Ahl7CF41XU9j8e3IG77bfb9yssJYKHXAWCf5kctoIwnArySra3pdLqzI3UD7RwK0f0cTD/cAS7rwL5TK0D5HjzJfmK7TYhedoBPDCsiHfgf4b0LQWvnOE9S9n5WuAaSXazVgO/AFRn1piIuARUTGQNQEtTg2ekyAghAmAz1wXXgjSGAVFwPWU4WOPyXTeyx95R1cAaQhSZyNrWeiIoWShkB5gDObcpEM9qEfAXG9MC50ua2whlmD3ARzu2Ly+vzL5pZjuy+MPvC3QC9wfXEFSoo+QAAAABJRU5ErkJggg==","frog":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAQlBMVEUAAAD9trb/ioq+rWqxnl+mkE9/oFjlXl5zlktjkC6NdEVWgCLMPj5NgDBGaypJax46Whk3VBkxRhRGKiktJi0uHRCwcSzMAAAAAXRSTlMAQObYZgAAAadJREFUeNrFleFShDAMhBEoZ1x1Qz3f/1VtQm9qgVoZf7h0pqWXr2k2M8eQJMBwSSJSvStpow0sUmdgCHMIbEQTIgCo5CMkzNM0zaEBgPf7x0SNUfUBhHmeQwOoiq4zTPOUhk32BF+VomvAlDAPT1jY+LRxXrQlqA638G3lHkKQxFL0i501vxzus2WIyunjfidUYwb8uClU98mr7CyRFGwrh4ecUwABj61Iwlt15zcwSeHjAGgS379fILxTk+I2mt0gCRmyXpNs5qeJZ4BQKQW43ToABITgEgAU4DaOt58Bwp/fAxChlAzj0zj2gOcKGK8Brh6wyBmw6bv9SCMpAybfy408ZPB4UlUpAp/pBAEbBTiqZO7V4Nm1NESU/BFYdsDSBaQCpAvIDpAWUOwnSBDwSSTt2foUICT7SqVPjx3qaeOUsHBTjOoiAdrr0BCEGK5Ilg7wtwwgrEj3ZKXscnM9AFRCBO5JZE0IGc/+xbIpCV53v8eVjQ9K3qdgV1zro8hrtuIKkC3Cr53dPFIqcxG9EjaPTIPb1DGpVmlEaUNHa924dfgHfQFwmyc0LyT5NwAAAABJRU5ErkJggg==","ghast":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAIVBMVEUAAAD////5+fnw8PDl5OTk4uLd2trYzMydmZlzc3NLSkr5ldknAAAAAXRSTlMAQObYZgAAAYdJREFUeNp9ksGN2zAQRdmDO5iBfN95JlWAgeRuAkLOZuRNzgrcQYLdBoJVOoirjCmRYDYy8i//wIc/n+Q4J7gs6YgdJxFRBBNXVQENRE8yZZG187sKkEIGLi/z/HL5D/Blvt3mH+8Ay044ZgBeb3e90QDVCkz94QFgpbGugOmvDPy2vxNYgMPnDFCAloCoLgDXqf9wfJBgKwAfU/+M8S9AGQH9MXzDSskGYJQRgcMEurkmDSCxfSiABtCeegsssuJbQETFTKS6q6r/v/FOl/1wXSrRtQOESDh1F6aeZG12mKBvC6N9Bq6nBtA8xApM5vCJRxpXAAdgEfg6f/80/wS8wggrMCwjbCl33T09Zw+6dqolB5/Yw45p9xRAORMiaB2hQLTRlLSWHNTXBHICwD6Jv0Qg3E3CGTDWLffOJ7B9NFkTRP1ZYbTRkyCaUxiS6TCyaBhNwwgoOQGcMsp+RBRe38CE4axrhxhKAlYqALmEEqIpRA9D+SwTikQpt1n93R5IcTOKi/wBKsTOnkkgxrkAAAAASUVORK5CYII=","goat":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAMFBMVEUAAAD////6+vrw7+zq597b1cLArJCenp6ciHaDg4OFcmF0c3NXV1dNTU1APj40MzImjJ+xAAAAAXRSTlMAQObYZgAAA5JJREFUeNqNk71u7EQUx0eb9YqKZ4jOeFPchjAze4s0rObDQrcy9ngU3QKixDNaueAFaChIFFHQR4IGci2078ADoER5g0g8ANqKHs7YeONsyIqf5HP88fP5j3dt8r+ZAAOokPxVQaDgvc/J9Q8bgsQ24oCnlFehfVWYUMrAuT0CMAZVE8JpCFer8O1HfRtFCKVUFdbeVRVuZ7O+jSfQOGEdqkrHKwm2XQHAhRYFaYzOk76Nn0Kg0GCEBW2O8lnfxk8hMCK0rjJSSrNM+razBtc0vtAppOnhpG9PQlJFmjbYAiTY5bRvO4IL+BS1qWqXJ33bFVzjv7z//f5h88fHfXsREXxOxuwKIbhd4YDSyiDaDpQUAXb4TNAaBdxiQQGQ4+H5U7CZ1kbXeL0rRQqAznZCFDDC1tZWOpbzFCPE0wQKtdHZ5/H277pSUEjnczYIBxSsMVGwUbBRoGNhmrLaZeZdVdf2g4mlECk9eiuXg7Dg/tQZ8+Gytu+rWC4WgtIL9SRIu3KZD5d1cFkshRGpkmqISLLitlmFq6v2arXKYvk5M9qWehBmzrbfN6v21za2WG5xSbW3+fN3nkrgez9Myrgkw9DQ/c3h681WONCCA+wRJlQoyvcJAJwPE3zmry79zIbTlcuHCEbVdpE2tb62iTSZM8ttBJdCkZ4UZG3lRKZHRh+OItgQYebSGj0t7Fzb5RAhmIRBcM464xPvTf20BsqVGtbw5/2P95vN8NoPEamiQP4TCsAAIMUe97oXmo/d7rQCzijITq2QYiSkwAAFilWim9LT6+vrchwRBd7BUKAvBQZM/itIBhyi8CyCoUGV4lwA7okXE1IZ71NKCRFn6fnuBCrRUFpbISSTUnUTKoA363Uv8KKUkluFApOqKBcVMhbUpCykKpVdCCnL4sAQJKF8K9hJXZbleSEW87K059OcRIQ+GYR8mkxre14sjua2TqakF7R+txVwYELK6fz4GDseJwhRNApbEjIlx8tlMhwlREIU9sDYyX4B2Jsd4eGGjPnk79eF7v1N/+oaQnpuvrm5ITPnvD9be8Uov+DATXMLKem5++nujiSZ83W+/oqDMJVm9LP3t1yMJySLrC5z/wUHjjD6aeX5gvQ8/vb4SMjbk18u4mdhBLLQzjmddZ9dTvBTuCekyZOWtHi+MsY4pLWOEGqEJJuHzYaQszyZkbZFpaNt16EhhLuFIhuEoDF78ZP9A0Obf2KBegjhAAAAAElFTkSuQmCC","guardian":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAhFBMVEX///+rjEZQjnQtWUcAAADX1c/Y1cvX1czX1MzX08vW083X08rW08vX0snW0snV0crAuq7Auq3Auaq+ua3dkET/gi+DpZy5k2Syk0/wdyjecipqlYPsZCqFhmBmiYDLZSNdf3XeSSh4dVCmXCxOeWbUQSDKPBxBcVpkW1BgVko5ZVJ5CxKoxgN0AAAABXRSTlMAAAAAAMJrBrEAAAOASURBVHjapZaJcttIDAW5lvfIHtnLYiLDee4kzwsL+///F45I66AkW467akSoIHRhhjOkuq5bLper4fL/wHAhiscBItiMIYSgm+j76GOga1xdXXWD4PNy2epHQ9q1HrAz0+mneCswfeB+K/i8Wi6HsZoEA4vFojtP4E1vO8GmvvWw5QUBEd4TrFabBj53F9LbEfZOcLt8WN2ubi8WTEu7J1g9DPUPt5cLPBM83N3e3g2C6+tu4PqYmaCPxk5w99/9XRsvCaLR9+G0Y8ID3f3916/DuO8azwmMgTA4WuQWp7uvEy8KYFObOQpsR4K7S4kJ7Izod1MYaSvwetoivk2wWAyCGR4PUNmZbawHnOWLBTQeqxgZj3PBWQEHbhPRD2TfrlNuOqCmPQs2I6M/I0hCAleAgtwKNrmeMhIux1lBLwklknpy1l0rbfXinMD0SEDTxDwXLlVt2tubwrrbY02fNZFxlEMoKpB2gsfDHz2G/fev735+/6/NcU6yC0lxVtDbv7z78aff39s6EiRylRFxdgoB//z25x/v/kKa5ygD0T778/tAYMCS5rmKsoTKz9wFYRc4kee3OBU0byJtBZr9SFkViAqsnG8yQGpDz0whWqmi0DynPU4eJmy6xUDLffz06UueP+xnBMkueXPz4UvW9ws+thZEveaBkmV2325ubj59gXqFgPV6r4OhhQ9DD4cCIZ0XPK7Xj/MO8lDgFwWzNcjZDBC6cArddBcOkcyld6Htgx+6GXq+g2z6Z8HivEDPCSyxGchInN3K50A22Iim8ZNAESnFgKTjg5URaEyiAZA4mEK4CtPcCs97rngqEukcW5gJsgzGZTEThBKaYaynEjutQ0FRxs4T5z8kmbGF5nJVumYCtdo28NFDVEjpafZ22lQWsw5Mtmo4fg8IcE6fzjKm8EwALrBPvQckV1S5QrgYMDYHAoHBzjqeQogKRVRIY49ZTjQT2K288NEiQiE1C5AeV6o83wdNXRiYC4KUhFNIZELl0SLKgKn2oflG0saaaMCYsdOZYCQlceo9gJTQrttvB4JdOAVItCcTgl0sYIqRnuKUOBJk2i1pp/fi9BS3a/va4nK6uxqReqHFq7naCix5X3B9kiNB9yToUzJvEVi8SSBDvlXwpjVAAl19h6BX3wNm2ng4/SqB3MCVU5T1OgGokfb0/LVpczpVfuqPyjdt8tQvCjuwWwAAAABJRU5ErkJggg==","horse":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAh1BMVEUAAAD///+lpaWGhoareS2nbh92dnZxcXGPaR1jY2OKVS6AXCJyVBp2SShRUVFvQh9hOh1FPC9ZMxc2NDdOLBM2MCZTJQ5OIgsrKi1JHwkqJR0/Gwg6GAUhHiEfHBcuEwQpDwMjEQcmDQEiDgMbDQUcCAAZBgAPBwMNBgMQAgAIAAABAQEAAAAaegGbAAAAAXRSTlMAQObYZgAABHpJREFUeNqllouaojgQhTOzuurYitKsNCS7pR1lF2fe//n21CUBvMznN3MISYVQP5VKEN0LKitT6Z6rKovNZlMUm6KsnCtgVlVRpbFduYMw8qIKq0zlDkAgd+WrgNKqDNiIilcBmwXXi6rAPARQKOD1CCqroNVWAd++IYJfBVQ7+IOwq55M+PmF1WKLUlRlWRRlWRUPAbufXNiutihlIRE8m8KiwjLxQqHCWVaLtJgFlr6sxqtfoYstURQvRQBgwcAxgB/GusvY8wvVo8HX9Tog+IASRTfbetp9Dqjr3wL4+nCofYxEU8BisX3anQLgf/CRoOjqEELycCuzcvex6voARKQQKGImaPJWUmPoPpb41xQgIplJ3jvuJQXOQTAAKcCErTdspPtljMT5R+w1/CPbZB03SPfv47cRLl9+IHYR1T++AKEdDO7/Ev2TWqci6G8U7XiJAM6ASASeuKOA5Xw2my/b1I4AHyjaCd5z1BFCg04g7WCwnWoCiNEAsnJZ3LPufgh9ZCbA+8fH+yQRCB1Rj7Wftfv5DKHP25Hpa68FHnzYLmDdAdoW5etXhD4yzZGLVAZgZFAAP2e5tAiW6z//WC/bkalugpDWpnA6Se7uALP523qmUzDT3P10CieIRi/yev325vZwBA2lHZleUiA1ceN42U7fz+fvJ1kPKAN0/RFPOzLFjbimyC0DTud/z+f/zifyQnCm9qE83EicI/lIEQA6nUUAgKAAn0VpfxiY/YiiFhwOPichIAuyMl4BbB/QC1GVART1iAQBENAogOS9NACccaCPYQtBAeFGznSAyBLQNPIDpYBAcQLYrlar7Ttqad+3E0CMY4AiAKABcDwenQn29YrmBgAnTgNcFZEB4RlA36JHABQFxEcR9N3n8fjZ9RNAfpsBgIQShEB3EbA/E6QT4x0gzyFQAlxVvZYLnAG5TACQ8Q2AIhEIub/KgdKhvly6z8/ucuFbWYEoeC/mQWQNACFCaDq4dz28u65Hm3IgN3ueqnxf1c8A0wjgBoB4d5DlIEWARFoEYwQ6CMAAcNPH94zIOZBlgz8RI2ALoc4QW0YMX3sGcLniHHIAwS2IP9zNURGyjBkAP10CnNMcjJJoADFqi0AUCF62kHzc5MBLEjUJFoFUDEhz0EejdGxMc+DtwyxmbRGg4CAK9tGSh+dqkgOLIJg3BAMCwFNMe/k60ZCDNIc8AwPAm68TO0O3gCEH+isfIEFoIoM0zKXhbcTbi9OanIMUAE2SCJjNLAPIwdFOFOSg7zkHtvJp8sZLyyjmeEwb7/PX0Y23b9PoLmzYsMVoGrXQGgMyf4/Dwc67rpGmwc2ocBm12kIffic9hEpax3Zjg3Kr5L6BakHZ7jSKAOEScGraXEAl4UkcHDp8feOZYIZctBswPV0ye/0AgDSGPMXGs4TTsKFJys8PqvRXLAihEQQqGPII8UTRAGVA86H+pAcMRyR7WEOGPGTQZECNDcsgsYJVLnLrs9hBx1hqycUkHrUvqxgONt9iUv+p7ocjlD66/wNdcSNfhkmkngAAAABJRU5ErkJggg==","llama":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAMAAADlCI9NAAAAVFBMVEUAAAD868b14rjx3K/v2anr057jypXMqX7EonmlpaW6mnOvkW2liWaGhoareS2nbh92dnaiayOPaR2AXCJyVBpjUT1FPC9BOy82MCYzKSMqJR0fHBcP+iOkAAAAAXRSTlMAQObYZgAAA3lJREFUeNrtV0t22zAMJDAg+0ulxm7URr3/PYsPmUiMXja0vPJYJMbyAiOAGjynN7ACCmVkPO0AButlC1ueRnEkgBydAHBA45afIICJ8bEG/htvdhHRcI4APIGU7wVAauUB4wJiUX6OgAIymjaACLNLEBjPxJRZTjkDh4Ag5EHEuCUvym8pgOgTAZFWdw3Gc4EU3LQCpPhEQJbs2TXGpxTbbyygKNIhcom8UpRVbiwNQxS0AytEuvaqMs+YlWz4jQQwMdEL8wuRUgaaAIFyhkjN27ILwgvcjIhsx5AAZiL+8kWDUiiqAHddAL0AAM2TiWvVBgXw9x9PTz++814Ac61H2SFMUAFiplq2dAaYTctRC/RCawCFbQ1B4oFaopwC4OZ9uwJ49+HpowWg0QqAHCgVKdCsf18CEYn7cWbIdx61QQf3AhQQRc67FrgEA9roHK0AVXQCwIAAbj8NSt2R2xvC8R6eI6COYOwFZEEMZmlngGm0BYi3Gf0hjFZDcu58KH7xJhA5GRmCBLCjFpRqTGK3cHgEAGZhrkYA8Fjx+etXIl1MtaDOkgCsS7JsBcRcZF+ul2ngDEROejUBrxTgGuMQKnojMgAMRdWMsRYwRSt1cSy/m9gSSVbsBCjEhHH1oiEfgCVn9h3vb3bMl3oCvABdE9pAYpACAxUAwTP7jhbIQvJBAM3fIfttqS4wZkQIv4+AoI0nWP2lHEDCDaoCDAgQ1ONskQXuL4ibSRD171sQXYCA6ykEBgRYqpAB1tWiHD/U8tfxr8U0imimeNoMiImp3+VtIG3cebnM0zRf1hbTKCQjQ0R0N6Iri4SoQwFrhzSKLJLjgywwgqzL4wcBy3vplf65SRcsP8xbxFjRLS7lBwKmdZknLf28bmgaQv2H4SEr8Ri8pN6ZlnXV69u31eNyky54Ul1xOQ1eckm9M9ljX66/fl4vq9Hn5+d5uAKezD7FVv1W99Q7k2Wd5t/XaV6DXqZpVEDpbCZvQuqdabHE02xZGx0X8AlS70xLvP/zrPGdpvPQO9N6hFMF9M50bxw4033RO9PRMDoVvTMdDaNT0TvT0TA6Fb0zbSbQcpcu9M7kE8hH0LqhZwrosJlAm7mU7od47FmH0Bpz6eev6+XuAqbpMmt0ev2t9J4CZheg17qh6X6ICTSHDzR6TwHrIdIDDzzwwAMPjOA/NfpDB1xAY2EAAAAASUVORK5CYII=","minecart":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAAM1BMVEUAAADBxMW2ubqvsrOprq+epKaUl5iMkJKFiYt1g4ludXlsdHhham5SVVZNUVI/QkMaGx04QmSDAAAAAXRSTlMAQObYZgAAATFJREFUeNrtk9FuwyAMRVMa7jWzwf3/rx3QLmsiOlpV2lOPk+BYypFRzLIs53A6hXA617sSzsurEABTSkRPsLxGAIEYI0ACiCAC4tqp5fbARGApJavRsLoggLHGyrWvmAoOIPSWtiamgmw7MgIhcQuAM0G+U+TcBERcY+wNgJwJPO9wBAq3Blo+E+wM7ghSIRqkVGaCPV3w9RsTQUVAMRMC+MlkUHusISVfLlkoW8ZRbRmTRFXNTG9YZ1wdCoTqXsy8dNysuJtQ7Z6JoBTV0rlmrk3gB0zHW2gCU7XS6ZlrugrKxp+Ccuyg3ATljscC0eLtM/d+aX+tVfOy46GAQwGfFsiwA5HnBRwK+O4W/k/w/m+U4SDJ84MkMhxlmY7y8TCVGy8fpsR+WnXDGuPq8mHIN8fuL8tkDiT4AAAAAElFTkSuQmCC","parrot":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAP1BMVEUAAAD/////7nn/6j3/5TPGxsa7u7vZra23t7ewsLCoqKienp6ZmZmWlpaRkZGQkJD3cwmGhoYlJSUPDw8AAAD7udxiAAAAAXRSTlMAQObYZgAAANJJREFUeNrN0tEKwjAMBdDGxpnbZqtx/v+32jYMN9QKPnkhYdBDk0EDHSIQ0CGBDkEV/pFgahtgBhxEZu7nSGj1Ajg6SAmpVQe4M98hgHCMVUAgqklbObgyXwGhXczUWlXg10Z+bj/4i3X19gra1KJrDfVGakcARdFyqyEHS353w35J2oGiBRO8++miqrU2MJdZIN6pJy+Lz3Cgs04yeaees6qeByMypZQo548jLDdl9mnE8D18B+EyBiG4+AGMduBwCi2/g+BiAAJ/BTwEW/4XPABsMA1LwNN2rAAAAABJRU5ErkJggg==","piglin":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAWlBMVEUAAAD/gID/////7aj/5bX12iryuobMzIPCwnTooHTVlXreihzJgmWHh1e6ZkWtVTKiWTplXEOhPjiESzOXQyKNNQ1rOSR6JiF2Kw08OS5TKxpgIwo6GgwhHhyEOBusAAAAAnRSTlMABHH+CSEAAAKgSURBVHja7ZZxU9swDMXDWAMSRspwYiDQ7/81pyd5Vzzf3Oz4t78GRU2kF9m5Hm8y7h8sMM34zMQrcKZj3BvTRHMVoHVVJwRm41n1eSDwYFSB2QW0AoG4psY0JgRAK5BeiV7TWCD2wLt7AXkhehE1Du1BL6CPKT0quL4HgMgFxIBAy6xt3hICsYniHBRIzET+6Ij1jxg3/NUyXxEwiK0wiITZBJC3And3d10uzCzKjOkNOzGrX6wKJoUVpiTJQ5MbVseyqpX9SEQWmHUV+4obhI8LQCd5aHJDBALCRLIaQuRfWSRhBK51M7bKQ5MbqwpLjAyB5Kmw6AoFToZAgNCE0OQQMIXEGHkFtU3UUsUU9XX6DnlocgNNql4HvEuRAzWO/Kx342xMFXbibWwb81TJOS+oOyQg9reK8mafqbLkJR8UEFEW3nRjzDBV8nJwAgGs1qoY5DKB0QrEukrJZc9BcXz7S6AiolspC8AMIJeLQME9xC9JJppL3FmKen/J1moPsOhFzfi4gXNZvMuKdiL0xmPLVjBaHTBiK1DQH8lealfyB1mIsbEqIABcBETQKjiDYsRi84I0WwYp6yeilFgSp/iFBgJVSMchBeTsR82RVgFiCIAJgMRkihBn/w0XI9ZS+/GxtK1LXyaQVnkHn3acLDhlh6TIkQms6s05/Tw9vQUfJzs+3v45Aa4mXCTCCnh3nj73T0wQOY6oQyT080WAqcKO70H2F9tsQq3zpzdLOJ/P7+/nX+84I8SqvT//2QKEv+umGzdu3ABH/cLAFxwVGPuC4xMs353AGAmM/ELvC8b0fqHzBUN6v9D7gjG9X+h8wZjeL3S+YEzvFzpfMKb3C91/5TG9XxD5zgTy3xP0fqHzBWN6v9D5gjG9X7jmC34DNs5yRa6KJBYAAAAASUVORK5CYII=","pillager":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAflBMVEWnra0CAgIAAAD////Hzs6Trq2VoKCVnJyVm5uTmZmQlpaOk5OLkZGKkJCIjo6EiYlmh4VzeXlwdXVobm5nbm5SWFhQVlYyZjx2QypfNiEmR0daLzg5Ojk5OTlPKxlLJi0fNjYqKikeKio+Hg8lJSU2GB4yFwkeHRwjEBQUFBN24XvqAAAAA3RSTlMAAAD6dsTeAAACP0lEQVR42u2VYZOaMBCG1TOCDUYQemeqRDEq8v//YN9laQYckaAzbT/ckyPEmXsfdhlnnUwbwlBKGS7CBjmZfn6m6WQ6G2DiBHUegrTmFUHIpGeQSorT9fcEixANvCt4rwVm4V5ig7/AvQRJ+AuQQPOSgjjwzYHPw4Im267AnaW3wIXbdxINC9zDZUPbADwEHMnztZTrPOc467wEa+SJc54vl3l+bgqADPgJJHf78SXl1wd/oDgb1sMCeg4yifqxXC5Vwk93DAsSMoBE/QQqkZxPEvrDNSxIWJGyIOW4Y1gwG+BfCS4Nt4YXBJso2ngLTsBe7bUlQB6GMQLkrYfAvwJq4Z0KYEDeR3C6QzOGBEb/wQCtRwjMZbVabQ7G5Qk/weFCa3fYIb874Nxa/YLj0QkuN1r49/0eEZxbq1dw/AWDp8C/haLwbMGa7XarjTa2UwGWXwXNW7a6Zqu7EQ8BPfoKDDSEfcJDAYWtIQlTMBVvXR4KIDaoHApotLmWTFWUZVGVXXoEhquHgS4nAF6C2Qi+Bd8CYi60ibIoe1mAvAmy4C2BzWB4XSCszdDDaAGHxVzE2jCxGC2IYyHimAcOBPFoAWY34MFJuxMU+5pyPhei5PPDCcRD9niiHaP34AQlJg+oRFGIqgA9A6Q9XGlrC0oSxKCi/FiBfcJdC27R5gQ49662gN8VV0ibE7jCUOWzH5KiNrgOuwJXEZ7aJ7jd4QT3pfa1oJTKAqWCDPcsU9noL5IKAhUFUaRqAvX/TKTfnHu1gRak8lQAAAAASUVORK5CYII=","rabbit":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAMFBMVEUAAAD02ezy2Ovx1unxzue0pZSkjXOUgWKUfWKLdVp7aUpqWUFjVENhU0NZTDtSSDkNYhzDAAAAAXRSTlMAQObYZgAAAYBJREFUeNp10L1uE0EUxfERBdhQ0PAivAFPgUJHFT5ewC7TBJ8LBW4i3TM0VEgz09B6ptiOV+ARkjJt5GJyNbubtZLdv7zro52fJWtdq5aqENe3prV37vl2v959dK2SCsERQBrYwtoNwOdAP4AVrAsDZ7iUAWSG6B/AZtsAvsgl6VqBjGkEL84/NcAPvBoBlSnFfmL37z/Exxi/xj8x9kBVUsptBsX1DRjtCIAbUkjqSptZYflSyikA0HVdm8dM0pdaK87x7WwC9qTNZ+/ckH7G1Xv7RVCIj+3emXrzdgT0geJczaH9JcKnarlHGSDhoynOg2PJQYUqPpVuDtRjUVGIip3PAedrf7kVLtz0NYXarkUAEBBgGQgVBBeBMlKC+kUQfLQPEyGK3WYLi3RT2adDyr7kYAAbWD6dgpJKLnYr2UBfKqegDh0jx2JH96TVz9tpzLX+MYJf8+Bl+juNuV7FEeQFcPg9jbleH/YDuNvPA3s+jcd9L+1FqEiqVlZMZ/eZmCL8uK8JdAAAAABJRU5ErkJggg==","sheep":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAAM1BMVEX////w+fz49vUAAAD////49vXs7Oze3t7S0tL/uLjmlJTAnoa3lHuviGtXRjoICAgAAABdC2QvAAAABHRSTlMAAAAAs5NmmgAAAhFJREFUeNqdkgFy2zAMBOMqONC+hdv/v7YRqCSMPO0kvpFEUhKWwBEv29Rl5MgcUo7U5dDLf7Qdep9cFNJINeEpQCoyx8id8BxgSJHaAXoOIMWRQ16+oUfAyNSMH08BRg5lu/jDDC6HUhEjMzWGfgQYmRE5QhkairGv1PVo/GoFNrKjsLG3bX/7AZA0rjcL25R8u3YpzZgAsANbwvEI2H/lhn6/2q9/xI02oouZAFsIBTZRnAHz90psqKzUrrYz3wEdCzZlcwJ0sVIm12v1Yq73awKEsNMCYThnoOP863ar2Qf79mN/vpvIYWBgsk6Af+tyQaCQcTFnDso29vcAKDG2yxZ0KCaDFTBad7hvb/MVICTseZloK3ohFg+0jcwGDOmUQSJCJjFB0DxhFsCmdq4z0DkDu2MKBcZWBUQQWkvYs8j7m8bYthWAbRVk2SSeHRGmlhKUYx567piHDKiykacHiTAWZmnlJnS8RmoFkBK2FdgUvYjp62Jib69j+ArQh22JwGkC265PQG/erT8fK+AwHkOY6JEG+hPgclFlCoxZASZQKKd5CMsWRCwmGibDprBXgA0gCQKZBgWBlwzALkw15wxIEhMVMtjOjo71FIr5CSj8FYCxQVHYCQSAzdrKmIIy9aaTB02WfZwfIthhImLxwEf9xT48tDImpveRBFAErCUUZeZNA76lD8B9VdX9p4C/n54rtHuYBiAAAAAASUVORK5CYII=","shulker":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAzFBMVEWOYI4AAAD////m8K3h6KjT1ZrHw426tnmzr3GsqGujdqOjdKOjcqOec56ecp6ecZ6ecJ6ebp6ebZ6Xa5eXapeXaZeXZ5eXZpeXZZePZ4+PZo+PZY+PZI+OZI6PY4+OY46OYY6OYI6MYYyMYIyMXoyJYImHYYeJX4mHYIeHX4eHXoeHXIeHW4d/XH+BWoF/W3+BWYF/Wn9/WX9/WH9/V39/Vn93V3d3VXd3VHd3Und3UHdwUHBwT3BwTnBuT25wTHBuTG5uS25uSm4AAADM1DMFAAAAAnRSTlMAAHaTzTgAAASDSURBVHja5ZN/e5s2EMdpk2Xrthg8dKfYuMVet4U7sTr86CRskuL2/b+nnUiN/Xh7nhT2574guNOdPjoJEby6ULFYlEWSbGtp5Sr5ayM6xnr7QsFlR9I4JtswuYbZunITBOc5LwMWlhGZpOUKjK1HAwpCpTWAQq2U4v1oQM3gpQBiRMzay/iLgJUlRAWAKBi2xWjA0rGK1R2AFga5ajSgYI34fAMCP44H0B0opTQqQEQevweJywCw3wJUxpWjAe8aAwBKAfR7UE/YAwC8Q+URCBOWUFKMKlaACCJqzw+SmJtv+Iy50szSSEPWlKMBya5h43ZM1nJmXTEaYIu6bauybevicV9V7Yu/c7EMk+JduCyW0bJIwmybhCtvl8l8IbGsTEKxZ6tiEa2KJJK45C3mSz9uu5xlwdKxJUeWHTnecbtyxpkdu9yxv/ZLlzXkjDXea8w+OeY6FovaYE6NQdMwsDOKXBlJBMUG6t/lTOiaLSuWnMyVoXEEvS9viQeJ7Q8/+AuQWqkIUWkQyYPalTWAIF3gZSSegyiOAaVTKiiNQp+qfBa7emsQlEIEgdyxqwqGGJWSBNCKmqrIUAN6Oorv6iBxJI4IY60cp0njfQ+RHsebd45RpMUFbWm9sKRVjH4IgvhBRE5s6YoRFdsqMo1CD9DyMk01zy0o6NNjJFuGPl8jgC+LXOUrSDdp2jdQ1EoF6dr78lTQ70mart9u0rdpisD7lSXx5ZIbNbfB1sBwOEK/5uzkz8X/kzE9+rfUFIWBwZ/5Cu6dSQeAy9f3jk6+zHYvbQBak0r+egA43gRzY0/E3FUh2VMCuTLkZohHZMsod+sBmLsy+N09nBJ+/dDeu4chIfztw/7efThN8P7h031zlv/+YR9441Kbr/L2oTscum64uxf/xkt1xCLKmTNmw58nALr80PX6fOj4MAXAncmNlxgvL2Fz4XZ5ZwTiJSR+Gg/gjg7S2AjniSdUIOP6S9afT1qCr5sOxhdiDjQNcJDLc7ibAqDOPLEcJpnfs0YDpOp+C5npMKkCX7c/SE9yC2LCUc46zpmIc8PUTQHQ8U96kuckALHpb5GhlwGXv3Mnkqll+v7570d5dhtGURRGx85ZeBvezue3Rz+chdE8nIdDfC7ZMmQAhICgENNhACoFZ/6tUggAp3iM+hgPnhMkrPTwBSONWqtzICAinIAQK1QDwBMV4NkMMwRBxCfAnfZTDBP8on3B6hmwXcoKNUAMAD8nW1Mns9DPqATy07L4Y5tE8xkoP0D9uCqzIpHFgxaiBolnQWIpZkdgHGtyvF5YFtsAO5ZG6dLbO4O0Y2QrccnLXQ7kqI8HBTfsZIQ8M0u23LKTniZrSHrJlaWxfUTiufRVEheW5R1Jy3ZlsEyrtkzL9mNayPvjp9W6eqylr07rtko/7pO0fpT4XmJttSnbZVpLbvlYie/7vh6k6+urq+vrm5s3b25uXo3SEXAl+i+Aq17/V4Df/3Ndf9W3A64uNBbw/T/0Q68RS/B6/eXq6svrZ/u7XiMBNzd+CycDjhs5BfA3y7f3PUOzujsAAAAASUVORK5CYII=","sniffer":"data:image/png;base64,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","spider":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAKlBMVEUAAACSiX+MgndgVEhPRTxHPjWoDg49NC0yKyYmIBsmHxoaFA88AgIiAADotIQjAAAAAXRSTlMAQObYZgAAAgpJREFUeNp10rFu1EAQBuB7B8RDUCIs0tB5rUuUNAivfBKvkI5b/eNLyVkzg6hQYGfyAkn6oDwAFUUqUvA4rHTGthTlb7b4P+3urHZV4uqqsuKbHdNNz3S9A5V1NUVIVW0leQfOCuQvhNzTDJhF3W6RlUvJV5R7przjBSBxu5KbHmV73OJaUc7DBDIVIKs5zuSU4nSIkYotgSUox25z0GAtfe+qk+GWN0PCARhI1fgwyJhjpOb7QDQBN0DVJ9BRiJmhB8CQAlhlAfZNaxAfb8ziwuSLQeqmrdx8BMJi0qsvBrms6hP3AuZIFxNYRJBj6L5W9d8UYg8SGcGmjSlRFuOB1/vqz7v6mLYbcscIEoYOAjNLoB+/6urtbwarGabB2q4juBnR5dnj+fnZ4wlDM2QEbQhdVHXOoLr69PBwVFfM0sNmgEE9g5Ve34U3dTh9IcZu/0Gsw2atboDL6f37u48vL+7E4c4jaD80YU2ult0v/NvP01d+707CGMG2DVVH5uNrPk0a2oog7vYM4G1qgN6FngEAgZmc8aQKMTSBgY62KbShCwIKaTODGPhztU6csA11FTgJQhNpBuGoNM2QIGDsQx0ktfF4ARKDIiKYmUAhdMZtxzIDYN+g5xLJVO4Aw8BYAG9L7waQeiaQGwlIZ5ARu9g7a9Yc0wYFK+kCeAbgDvfegdK7qyy+4z9b0kGP3NmJngAAAABJRU5ErkJggg==","tadpole":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEUAAABtUz1jSTNTOSNJLxlEKhQWCgDfr9AwAAAAAXRSTlMAQObYZgAAADdJREFUeNpjYGAyCglgAAFGRVcHMINNzMgARBuliSUZGQEZzkZGxsHODNiAs6KwA5RlYsBAOQAAqGUGQPKmAvcAAAAASUVORK5CYII=","turtle":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABABAMAAAAg+GJMAAAAMFBMVEUAAAD////K0JHCt4ComnNHv0qUi2OCiFQ/pEI4jTopfUkwcj8gakMlZDMbWzExMTA/pVLKAAAAAXRSTlMAQObYZgAABDNJREFUeNqd1s9r40YUB/DAZr1Z3JT+By2S6XnRiJyD9ZjmtBRSUbWnQITMQlgKXeJL6aGxlpltD2VZjKY2uRW2JodAlxAxm9DD4satYnKuI7OH0qUkEfQ/6Iwk/7isrNnvSUb2h5n3pHlekqkG9AVC60vvnLuEPJsCDxMRL01pYIWQ1hRwo+T6leeBixUA234MsJV98Cxdxx5YFuDSwG3b/tzFX8nLigtoDZngpdlSAHYbOYCMmoZMBaAa+LaIQ0/i+GKpsm1ouqYhFYARCRCWAZamGcLACkD4ITn+nvzXyQCUAWvlgdWQBQGlrBNLYFn8WO7BVABGTQ/Aa56kQAUAtBoAzgHl3DI0rV4XVVQDVvyWtT4FdE0dcDbr9yaAbiJ1wN80Pkqv7riWoWsIGmrAXX9Py4BbKN2CjhQBsolmQE0dWAlaZlaDZWTUTFNDpirwDNazGnhQr2mAVWsQMjf7cgWQ2IJuYjWgGoZTwHIxbIMqwHl7AmCrpmMFYBkAHhx5YfpSt971ZL7tt8yC35Y5Vfdq97JLxoiFkNwBqJyq5Ds9B8IgIIQ89lzLQGZ5wHmqTQBGbZ+0AOmarius4CnKAR4y33E+Qyapm6R8DeietZ4DzJft2CAy5YcjbYEEKp5nU992GKEAIMu4VRLotPGP2aWF0AZlbQCsMl2rnaMJQEQC9gIZCFQAfvTgMAd8/wvKfpU9MKHkXCSs7fE2iGx8uuQ4NmX8uGVstJA5edpNE0q/W7IHtHNMZPIVpPMaewtr8tYuWHJezwD1pPN6rRiocnbm22TQ4SPO/2XsivOLOcAwFgNhNyBdxnnMTznrnPITNWCV8796vd6IixE75pyfxvEMSOf1x8XAe6PLg2ESHYwuo+RG7CJOrn+b3kznNS4G7kT9YZIk/eh3r/FtEg2T5lzT5bxetIJlgETkbxDBjWbTA1ifA3StEKiOX0H28oDIcMSvB75t0+jqMAd0ExUC798IADdFdgVwniSsG9hOl+2/zu6n8xoXrSDuAzSaMi7g81HI6B+93oCyw5IPUvXkDVgZsA2f3PAwePLcdnpkBtQWAWNAzTRfm/djzsgvsgbPaX5EyHm9CHCnwMOYd3uB/Ov600EOuHJee4VFvGx4GbDb2ImTq5eBWAHp8kkR5bzGBcDqOJqtYGcYhzSSXRjQvAbpvMaFW7h8NAW+kTVwRBfOnEkN0nldCPB5YCQAW3Th5ylQcQGKpr0EmtMapMCXogZPJFCQghXsR2kbD4blANmFeUB0IRgQ26FnndclAdkFKwdAdiH44YyQSD6JpSK70NjNa9DciTlnpBtFAe2UB8YwXcF9CTCxggErD8RvADLgkXiZRjzsMkK7jJcFVuN/5l7nm3icRCFjL4fJRdkuXPfngCi54uxP1hEzonQX4v7sRMLnMefhfpIwXrAFhXyw4P7/kgmYSeJwxJwAAAAASUVORK5CYII=","vex":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAMFBMVEUAAABthJtgeY9Ta4H////z+Pzg6fHG2eqivNWUrMOGn7eCl6t5kqp6j6RthJtgcoMKluMvAAAABHRSTlMAoKCgEjok+wAAAPlJREFUeNq1yL1Kw1AAhuE3hxYrRYm5gmivQL0Hwa1LnAtCFpdOjuKY4KBjfnYhIUPWEnIBhgxZRSjHC8hp3KWxkg5ndfD5pu8FDqNAKQkwKXIE9Fuj3zCQjECYDCaPs4tOQP9pDME4B1MAbIwTgJEwv2yixPcCPw2igGkcljlZ3YfP33WSJTB9yhG25HaJPLUBtkCdvl5fpVlVVRy3ntdQZW+eX6e77UIcNqAke0eq+JCgGvam4apoUGqtHtC067K9Q1O+l2WMJl9RvPAnl7+0L5Ao9NBB16GxZpZloTGFeWYC47l7DzrXcUF3sHTQjW9YoHMW4zn/5QeNK1xt8XQSVQAAAABJRU5ErkJggg==","villager":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAbFBMVEX///++iGy3gnKze2J6enpra2thYWFUVFRUU1NISElMODM9LSkAAAD///++iGy3gnKUj4m1e2eze2KBfXl/e3eja01vbWqQXkNjYmAAlhFUU1N1Ry93QjVcQjpISElMODM9LSkzJBEjIyMjGBTjk4HHAAAADXRSTlMAAAAAAAAAAAAAAAAA7Uh4SAAAAn9JREFUeNrtlN1ymzAQRm3cuG5C9oMFJIW0idu+/zt2/wieiTNAk0ufgdEKs0cryWJXB0RguUEO1/Xzc871Irs3AViTQdnYLgAzGfmPkFnT9V4tiAI+IyCB/19AVgA+KyCaF9FZL3iDlfUCAl0AjpYmFgWagjkJfjNCtCwgml7niyrmcJ0gho7mQkDrBJALsAhwyYY1IAP4bahgdmKFgBme8PjE/PRI3mMGG1gWxMpnE3GetmFiWQA/yJl/CpzJutggYAYYIjAyQfu8XlAv8DWCb5sFqW2Btk2llJSKctwqIAFJ8oVFQRL+ChcCEKGlKwJSQLRfENBHFYCMZYG+2F6tAOauFgRtC8K1RYSdVqhgd6eCUmIUxTtdKknySXchOYOQEhkAmNmm4YJ5FPWM0nRdbKNGZRxHH2KElx8CRmWCvu+7roxd17nADE1qhdR0RfP1mQZMbAqwnxcT9KnYS5Lc903Tq0U6jVTt+Xo5SesWCUMvIheUMvh5GnwqqpKUJPU0jUSik57jnyswABWgitMYU2MjZlw0X9ppDbpOTMSkwCCQCXw+FBe4uGGUdehGy3950ScaEC4/duwCaWHPorEdGSM/0mMRRlKYogD2bZzGZvuJIa+/SFIQYfCjqvb7w6EKDiYAGe5h4DU4/3o9ezSzF94JGK4IC84Tr+d3PHzwTbTqvQVkqjMlSEa5KjhYLUElPJxOD8r9/cmjGQJxJmMgQVN2B0UCbUxxPJ2+OyI4BnfKEcAwxF95mARL1BcAnJmcTIRqq0DzQsCZwJsEUIgGFUCIKmiTQEceZsGwRlBPQGHY3EOQB2Jalz9XAB11crFWUH+Sm+AmuAlugi8T/AM2/NtEbUTDnAAAAABJRU5ErkJggg==","warden":"data:image/png;base64,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","witch":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACACAMAAACMX59YAAAAmVBMVEUAAAD///+2qJWrn42rnYmmmoijlIOgkoCPj4+YiXeWdliWdFcltDWUc1Z6d3eAcl6PbFNra2uQXkN6XnBhYWFoWUwMixp1Ry8vaDVaTTZMTExHT0hQQy0/Pz9IPCc6OjpANSQkQCg1Lh0dPAkxKRwoKCgsKRg2F1guJxonJiYwFE0YKRoTLgEeHh4oEEIdCy8REREVByUKDAvCurIkAAAAAXRSTlMAQObYZgAAA1lJREFUeNrtloFS2kAQhiPphVJbKVq10XDG2Ba4mjvx/R+u/+5yR1U0d2SqYyefgcuO+T/2NoYxyw4PMyLPlVL5KN+gsuz8/Pg46+bw65dPtEoeginjBdFAkAvTEkwVxen1eoJRjg30FfTbgjAKQ0wlD0NQTEKQNq98ntcANhU3fQkVile1talogRJBkQsiIFG3QPnrVQHkNBhAt8BHCgKFxBURJSh8/hcjFeULECXwMzs4KYqTAwpLXgxFtwBXkWM6/gDGU0kHugUTMoDpeHx6Oh5PleQnExy0dAsmrICAmUp8S/ZeKQum/BFIFUyYWIEGP0GMYAEM+OeCgnkVQQNqCJrlcqlBDXBWqVGuKlSE1lVZVpW2wAtoeSxoWEB1XZVaKV2WqEBVleCBwNEaBFoEsm4Epaa3RgQlTvHmSGCQdxCYIKglWEOAbpdNAxclaoR8hWZwOGedgcABWkVQe0ENFY4lIIFmgVQaabw4CPzKglrX/MkNTuigAJpmQaUbrl4WIMXD07JKhHagMfiGigYmHFXVIahl9UNssANUAGdIw7FTgMslSAMAItAiCDpsCT/ZLubzppHcfD4D4tFVSV1UGwHycOwWXMwR/Hg0w3JBAuwaR83AQhORHtDjbgGYHc1mtH4DMjbN1DpUPKnseRZ+eRFjrbPWGKx88vev4gQGOQPYZJIFoQO7swNZXsSGLTzpYNEpcIA7gEHOxRY7RBFgBs4L/BycW6P0HaBar52VLxz7tAMJiUC6ySwiEBiZMucd8oR5IkAqCMS1EVi+2iwMFw5hEUTAAkuC2xsIaENUCdEC9EICRGy6wPEMsGkvWKcK1jKDrcAlbmENgoArt7/A7CFwDwRuDwFP0W+BJ5J+GyEwj+6CSRQYEZitgH6iBU4ExgtMssAaayCgR5QqK/8B2PgtWMsCePhhIB+wCX8H4PYGQdKJAG9JHYjAypNhKQ0ShshXs8DtIXCISMECrliYpbEK3AcSBS2zv6C9Y9pB8IaC/rfRkyZYRfKsoI0kspGOzrtuQdtHcEe8R0H/GfS/C23gd/uYNMH19+u9BFcbLs8+n11ePSSpgxU6WLUeea6TJsiz2xd88tsJ+m8h9osj+gvl3QnA6j7rBQ+uD9z2wMDAwMDAwH/EH571WWMJHeH4AAAAAElFTkSuQmCC","wolf":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAAw1BMVEXt5+jk3t/c3Nzf2dnW0NHKxsfIwsO3t7ferIWzs7Nu1Je3q6WhoaGdnU10oIaBgYEatVh+dnBegyJlZi1iWkAodi5WVlZUVFRERERHQjs+PTBENiY5ODVDNSWAAHY/MCQzMzMtLSg1Kh8sLCo0KR4ZGRkAAAD////k2Nnd2tvV0NDTz8/Kx8jJwcLBvr7UtaTOr5bEq5ywqqefmpaalZGnj36ajIiVhnmheFuUe2iBdm2Mb1JJQjk5PD85ODUtLSgSFBY76smzAAAAJ3RSTlMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/HzzAAADR0lEQVR42s2UbXfbNgyF6Wli41WZqm3NtkQOZ3ZVwwCFbShO6r6k/v+/ahdwtjOp/dJvvZT5gqP7HAC2GYZhWFDBYBIilsvLy5Ty8HsPiY4yirIQBgtfX1/HLlbD/xUcQIXh51JI1ut1TumiXyz6SKKkAi4AzEQGCLH7AhCpFDxMmBmAlNIffYw9MlMgPewrAPDHKWCxiAtmEFjYyogIrNd//frixU8/lyKIF4htdUAIsxIETiEAfMPGQRmDC0HzGt1Xz6AKUwAXJxC8VAgkb+TgIgIacV//7UE1K8Fsb477/fGN+Q1HAFw9e5auErZi5KcVANcsA+D3H+7vP+yFvA9CvBZhr8qmU4dP9Ukx3AzABP/DAwjE9hbGb1TcYnYCynCOksJYpwCR/cM9QfcPe3lSApWwAgJ5AbazPhhqCkgpvdwddnjOzlLKOZnEatH/CKKEgJ0w5CuA7WHrgL8dkNMVLMKj18BWxegBIgVHZQrIOb/cHDYO+CGfAIl1VMHjDYRvFATYQ9hMAb9Am08bJHF2dg6Z/wqq+9j3nf3wYmhjFWOoY+xirOowBWw3Nzc3R3w22+1utz0fHqFl09Z919e1WAqS61hBDsA6B4Bg/g36cNidP5bySKVtYmeDCkSr6nl8jiy6PkYsU8Dh+Omk4+EEIHosVFV17LouFhKlEioQapj7LoZYTwE2NaucXl9cvLa9XwSLUHW9DaERDayRd4ghdH++whzngM+f373LKwA+fnz/dvCLIIaqRgv6qGKAEJxQhVcd0ghfBSQHvH2P0I8h4O3Tt6Cqo+riZK8i9MV98HThcVZMQsyDiLVO7CjYEGYqSlSFAABYUwDx6T/YwEesTANWOIRxNCuRFLZWLtGqpmmW7QxAzGZdqllUDFBOAMvA9pgVuTRt2yyXmOYZCDOsjYqjeGAqEBPEBSIERkCaJue2BWbeA7jwcYACMbAl4CWI+NYBVAyQVmkOuNPxTvVubAUWJZQAJxh2ZAD8RKNyaVv7r+c5AH6MUbMKwW5NZKtamP26RgiPjkwruLMxpgBhvr29ZTEAmwsAtq3gMdbpNDIjfSBWaTUFrFJOVlvGQHrAm9XNPmEAwCqc7UWbpoDh2/WdAf4B+LQj08eGOFAAAAAASUVORK5CYII=","zombie":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAclBMVEUAAAAAzMyPj495nGVxlVtvlVxtlVtnkFYAr69ph1Z6d3cAqKgAnp5ae0gAmZlra2tXdUdOezZhYWFIdTJJcTVWScwAf39KaS0+aS07Yi9MTExGOqU2WiUAaGg4UiYAW1s/Pz86MYkwKHImIVsoKCgaGho5R/XAAAAAAXRSTlMAQObYZgAAAkJJREFUeNrtk2FzmzAMhpPNm+0akmjVqFRGEsPy///iXtnlml27laRfeWwswZ0eI3NsZkRFVWwUdHMrIqzKitKC3C4gVjhgOQLVOwQEAcvdAmViwZQiuKOFsj2J3i1gZWEVrAqEbxaIlkHMAni5QK15VRSpwTI/UFuYFnx/q2ZCQYyMEq5PSKWMJW8gZSv//av75rneqcJFxMqLemdiiq1zLraR6llimEtk2fdnpvZycfFyaeGScggkqKclLQjqWShG1RhR/XIKCEgWtCByLJs96tOTPiIROoogMhEvO0QWqf+AWqXdsQIEWfhP/AS/wXy//VXYji/Mz8N2G5iIPxYcC28EW0CsnxOwqnyqhTf/yQhy3/fjNE096Lru1CRl0dR0oGlSCAn5bteZYI7vCcYiGIYuhUa1CQH5kFIAVRbAHP8S9FeCoQhC2XgAKSDB8h9BroIMQc79aRhOwQwoqzkyTMt3Ke3m+CrIVWAxwzacTiZIRQBCgwyXgAgEtGAzk/tcdh6R2ETNkEyAOSCfBcykLjovyuy9j68CVPUAS4lWZB3AkQa8b1WlJMzqW9eykvhD9O8IkM1foR5Bg3wwlzlQJ967loQ0Ru+vD7EKMjJggnJsuKosYZpA2TsXiVnjdQvnsxVa+fm8B93QdbanlRUBkoBFWMk574RF/PUbPJ9R+OVhj/BsgnEap1xIoZsmyO1EcyYI0IFXQTz4+CoA+4f93uIPAMHYF3JTcyRokkmodbFVEo6HeNisrKysrKysrPyDP68WY0lh7YK7AAAAAElFTkSuQmCC","zombie_villager":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAt1BMVEVskkNwbWdVczVjW1tWYC5jVC9IYC4/WChUSSg4TSM4OyExPSUuNyQAAAD///+Iqlt3oEd2kk9skkOCe3RyhFFmij9ffzdwbWdedUVXdUdVczVjW1tUZkBOazBgXjhOaC1HZTdQVzdUTU1PUTNBWSiZKys/WChcQjpURypDTCQ4TSNKPj42TCpJQSRMODNCNzcxRB8vQh44OyExPSUsPRw7MTEyNyQqOSE9LSk2MiAzJBEgKxgjIyNApSiHAAAADnRSTlMAAAAAAAAAAAAAAAAAAKroblcAAAMeSURBVHja7dF/X9s2EMfxrGs3oGtxHXTSztIuE+mtyG1+2HNKxp7/49pXIoHSUhxe65/52E6cmHs7MpMXuxxR3p0iFF6+3Gz+vPztlxdP9AZN9h8IfQ1c/vEMgMkgItV/kYbN5upys/nw4dWhAOarGkS4Ay6vthmYfL8HAHNViD2w3VxdbbfPAGoMV1VVuz2w/fTpeUBt6ro6r4yWwtnZycnJ2dmrgwHMwqjODbmADgeIqrx6Q5XBKvALSlRyOCZjAJM5ZyJig0dgKkN3sw4HjwMEwTAFNlRfuIpDnkIF4DAOMAsRgGAMuYvzEBwmQRTG0SGAGlYX5hfv8AjfzYMT54QzwJ4OAkRFHc//Kc2ZhJQ9xvHCBwDCAkGE3r4P4f1bkuxB9ThRFR4FNCVFqQ9zFHp8wr7OX616XBsFUt+vUwbmf6M5ZtI6rYHgwqpfrQ4BUhb6eanv0rpba5dS32G8GwdOT1+f5iYjjQG/PvmHTwE/o5/Q5EFWhVnUNnc9FxBCfChgUd91/et7gDGu9AjgyNHnm8833wIQvgDoe7+A6to9CnQQvgQYgDwCmLqmGwhjS1Bh4scAMiQPgCZnse2zdmqbiHkS2Qm2URG11iEict47T6gAbRObaNvYNjhpbIyxzIsw42War8a4U/M8Nod5vQdibNs4DC0MGzNgpzGlJEiTLfMQUIwYNo68I3WexO2BdgCgQ3awNVlJuzrcGpP5FVkhckCIRLGLuwVaTaopJLyBGuK9gPmptRbfNFMc1qozZfFCglQKoIgDOeagA7Ym3zEOXa7MN1gASBBRlQwZQ96JOBwF4MCeidg5puQ4YMELPNgO5UeXsWVEgAYVJlMALkIBKIAAwHnH0SI8FE2xybddYr5tmzZFJAwAeWYIorcACzE5KC4wBwDLYVgu24gwPeR57KlFHpN1XRsiZgehACKz2wUJ+xnOF7uu/1pcL77Kq6caZUD2/0ZFAk9zM9XrfYvrb1L1TPXvNbFnhwqQEPOKZbVKaZW0aWIpvy+bZVOypUYT7vFx9tGz9zOcFuDN/+gIHIEjcASOwBH44cB/1lQM4ZNhKecAAAAASUVORK5CYII="} \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/allay.obj b/prismarine-viewer/viewer/lib/entity/models/allay.obj new file mode 100644 index 00000000..69765c22 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/allay.obj @@ -0,0 +1,325 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o head +v 0.15625 0.5631249999999999 0.15625 +v 0.15625 0.5631249999999999 -0.15625 +v 0.15625 0.250625 0.15625 +v 0.15625 0.250625 -0.15625 +v -0.15625 0.5631249999999999 -0.15625 +v -0.15625 0.5631249999999999 0.15625 +v -0.15625 0.250625 -0.15625 +v -0.15625 0.250625 0.15625 +vt 0.15625 0.84375 +vt 0.3125 0.84375 +vt 0.3125 0.6875 +vt 0.15625 0.6875 +vt 0 0.84375 +vt 0.15625 0.84375 +vt 0.15625 0.6875 +vt 0 0.6875 +vt 0.46875 0.84375 +vt 0.625 0.84375 +vt 0.625 0.6875 +vt 0.46875 0.6875 +vt 0.3125 0.84375 +vt 0.46875 0.84375 +vt 0.46875 0.6875 +vt 0.3125 0.6875 +vt 0.3125 0.84375 +vt 0.15625 0.84375 +vt 0.15625 1 +vt 0.3125 1 +vt 0.46875 1 +vt 0.3125 1 +vt 0.3125 0.84375 +vt 0.46875 0.84375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b432e290-ff98-8fcb-61cd-b0f5c289cd94 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o body +v 0.09375 0.25 0.0625 +v 0.09375 0.25 -0.0625 +v 0.09375 0 0.0625 +v 0.09375 0 -0.0625 +v -0.09375 0.25 -0.0625 +v -0.09375 0.25 0.0625 +v -0.09375 0 -0.0625 +v -0.09375 0 0.0625 +vt 0.0625 0.625 +vt 0.15625 0.625 +vt 0.15625 0.5 +vt 0.0625 0.5 +vt 0 0.625 +vt 0.0625 0.625 +vt 0.0625 0.5 +vt 0 0.5 +vt 0.21875 0.625 +vt 0.3125 0.625 +vt 0.3125 0.5 +vt 0.21875 0.5 +vt 0.15625 0.625 +vt 0.21875 0.625 +vt 0.21875 0.5 +vt 0.15625 0.5 +vt 0.15625 0.625 +vt 0.0625 0.625 +vt 0.0625 0.6875 +vt 0.15625 0.6875 +vt 0.25 0.6875 +vt 0.15625 0.6875 +vt 0.15625 0.625 +vt 0.25 0.625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b432e290-ff98-8fcb-61cd-b0f5c289cd94 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o body +v 0.08125000000000004 0.23750000000000004 0.050000000000000044 +v 0.08125000000000004 0.23750000000000004 -0.04999999999999999 +v 0.08125000000000004 -0.04999999999999999 0.050000000000000044 +v 0.08125000000000004 -0.04999999999999999 -0.04999999999999999 +v -0.08124999999999999 0.23750000000000004 -0.04999999999999999 +v -0.08124999999999999 0.23750000000000004 0.050000000000000044 +v -0.08124999999999999 -0.04999999999999999 -0.04999999999999999 +v -0.08124999999999999 -0.04999999999999999 0.050000000000000044 +vt 0.0625 0.4375 +vt 0.15625 0.4375 +vt 0.15625 0.28125 +vt 0.0625 0.28125 +vt 0 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.28125 +vt 0 0.28125 +vt 0.21875 0.4375 +vt 0.3125 0.4375 +vt 0.3125 0.28125 +vt 0.21875 0.28125 +vt 0.15625 0.4375 +vt 0.21875 0.4375 +vt 0.21875 0.28125 +vt 0.15625 0.28125 +vt 0.15625 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.5 +vt 0.15625 0.5 +vt 0.25 0.5 +vt 0.15625 0.5 +vt 0.15625 0.4375 +vt 0.25 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b432e290-ff98-8fcb-61cd-b0f5c289cd94 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o right_arm +v 0.15625 0.25 0.0625 +v 0.15625 0.25 -0.0625 +v 0.15625 0 0.0625 +v 0.15625 0 -0.0625 +v 0.09375 0.25 -0.0625 +v 0.09375 0.25 0.0625 +v 0.09375 0 -0.0625 +v 0.09375 0 0.0625 +vt 0.78125 0.9375 +vt 0.8125 0.9375 +vt 0.8125 0.8125 +vt 0.78125 0.8125 +vt 0.71875 0.9375 +vt 0.78125 0.9375 +vt 0.78125 0.8125 +vt 0.71875 0.8125 +vt 0.875 0.9375 +vt 0.90625 0.9375 +vt 0.90625 0.8125 +vt 0.875 0.8125 +vt 0.8125 0.9375 +vt 0.875 0.9375 +vt 0.875 0.8125 +vt 0.8125 0.8125 +vt 0.8125 0.9375 +vt 0.78125 0.9375 +vt 0.78125 1 +vt 0.8125 1 +vt 0.84375 1 +vt 0.8125 1 +vt 0.8125 0.9375 +vt 0.84375 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b432e290-ff98-8fcb-61cd-b0f5c289cd94 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o left_arm +v -0.09375 0.25 0.0625 +v -0.09375 0.25 -0.0625 +v -0.09375 0 0.0625 +v -0.09375 0 -0.0625 +v -0.15625 0.25 -0.0625 +v -0.15625 0.25 0.0625 +v -0.15625 0 -0.0625 +v -0.15625 0 0.0625 +vt 0.78125 0.75 +vt 0.8125 0.75 +vt 0.8125 0.625 +vt 0.78125 0.625 +vt 0.71875 0.75 +vt 0.78125 0.75 +vt 0.78125 0.625 +vt 0.71875 0.625 +vt 0.875 0.75 +vt 0.90625 0.75 +vt 0.90625 0.625 +vt 0.875 0.625 +vt 0.8125 0.75 +vt 0.875 0.75 +vt 0.875 0.625 +vt 0.8125 0.625 +vt 0.8125 0.75 +vt 0.78125 0.75 +vt 0.78125 0.8125 +vt 0.8125 0.8125 +vt 0.84375 0.8125 +vt 0.8125 0.8125 +vt 0.8125 0.75 +vt 0.84375 0.75 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b432e290-ff98-8fcb-61cd-b0f5c289cd94 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o left_wing +v -0.03125 0.1875 0.5625 +v -0.03125 0.1875 0.0625 +v -0.03125 -0.125 0.5625 +v -0.03125 -0.125 0.0625 +v -0.03125 0.1875 0.0625 +v -0.03125 0.1875 0.5625 +v -0.03125 -0.125 0.0625 +v -0.03125 -0.125 0.5625 +vt 0.75 0.3125 +vt 0.75 0.3125 +vt 0.75 0.15625 +vt 0.75 0.15625 +vt 1 0.3125 +vt 0.75 0.3125 +vt 0.75 0.15625 +vt 1 0.15625 +vt 1 0.3125 +vt 1 0.3125 +vt 1 0.15625 +vt 1 0.15625 +vt 0.75 0.3125 +vt 0.5 0.3125 +vt 0.5 0.15625 +vt 0.75 0.15625 +vt 0.75 0.3125 +vt 0.75 0.3125 +vt 0.75 0.5625 +vt 0.75 0.5625 +vt 0.75 0.5625 +vt 0.75 0.5625 +vt 0.75 0.3125 +vt 0.75 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b432e290-ff98-8fcb-61cd-b0f5c289cd94 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o right_wing +v 0.03125 0.1875 0.5625 +v 0.03125 0.1875 0.0625 +v 0.03125 -0.125 0.5625 +v 0.03125 -0.125 0.0625 +v 0.03125 0.1875 0.0625 +v 0.03125 0.1875 0.5625 +v 0.03125 -0.125 0.0625 +v 0.03125 -0.125 0.5625 +vt 0.75 0.3125 +vt 0.75 0.3125 +vt 0.75 0.15625 +vt 0.75 0.15625 +vt 0.5 0.3125 +vt 0.75 0.3125 +vt 0.75 0.15625 +vt 0.5 0.15625 +vt 1 0.3125 +vt 1 0.3125 +vt 1 0.15625 +vt 1 0.15625 +vt 0.75 0.3125 +vt 1 0.3125 +vt 1 0.15625 +vt 0.75 0.15625 +vt 0.75 0.3125 +vt 0.75 0.3125 +vt 0.75 0.5625 +vt 0.75 0.5625 +vt 0.75 0.5625 +vt 0.75 0.5625 +vt 0.75 0.3125 +vt 0.75 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b432e290-ff98-8fcb-61cd-b0f5c289cd94 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/axolotl.obj b/prismarine-viewer/viewer/lib/entity/models/axolotl.obj new file mode 100644 index 00000000..706474b3 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/axolotl.obj @@ -0,0 +1,509 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.25 0.25 0.3125 +v 0.25 0.25 -0.3125 +v 0.25 0 0.3125 +v 0.25 0 -0.3125 +v -0.25 0.25 -0.3125 +v -0.25 0.25 0.3125 +v -0.25 0 -0.3125 +v -0.25 0 0.3125 +vt 0.15625 0.671875 +vt 0.28125 0.671875 +vt 0.28125 0.609375 +vt 0.15625 0.609375 +vt 0 0.671875 +vt 0.15625 0.671875 +vt 0.15625 0.609375 +vt 0 0.609375 +vt 0.4375 0.671875 +vt 0.5625 0.671875 +vt 0.5625 0.609375 +vt 0.4375 0.609375 +vt 0.28125 0.671875 +vt 0.4375 0.671875 +vt 0.4375 0.609375 +vt 0.28125 0.609375 +vt 0.28125 0.671875 +vt 0.15625 0.671875 +vt 0.15625 0.828125 +vt 0.28125 0.828125 +vt 0.40625 0.828125 +vt 0.28125 0.828125 +vt 0.28125 0.671875 +vt 0.40625 0.671875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o body +v 0 0.3125 0.25 +v 0 0.3125 -0.3125 +v 0 0 0.25 +v 0 0 -0.3125 +v 0 0.3125 -0.3125 +v 0 0.3125 0.25 +v 0 0 -0.3125 +v 0 0 0.25 +vt 0.171875 0.59375 +vt 0.171875 0.59375 +vt 0.171875 0.515625 +vt 0.171875 0.515625 +vt 0.03125 0.59375 +vt 0.171875 0.59375 +vt 0.171875 0.515625 +vt 0.03125 0.515625 +vt 0.3125 0.59375 +vt 0.3125 0.59375 +vt 0.3125 0.515625 +vt 0.3125 0.515625 +vt 0.171875 0.59375 +vt 0.3125 0.59375 +vt 0.3125 0.515625 +vt 0.171875 0.515625 +vt 0.171875 0.59375 +vt 0.171875 0.59375 +vt 0.171875 0.734375 +vt 0.171875 0.734375 +vt 0.171875 0.734375 +vt 0.171875 0.734375 +vt 0.171875 0.59375 +vt 0.171875 0.59375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o right_arm +v 0.25 0.0625 -0.375 +v 0.25 0.0625 -0.375 +v 0.5625 0.0625 -0.375 +v 0.5625 0.0625 -0.375 +v 0.25 0.0625 -0.1875 +v 0.25 0.0625 -0.1875 +v 0.5625 0.0625 -0.1875 +v 0.5625 0.0625 -0.1875 +vt 0.03125 0.796875 +vt 0.078125 0.796875 +vt 0.078125 0.71875 +vt 0.03125 0.71875 +vt 0.03125 0.796875 +vt 0.03125 0.796875 +vt 0.03125 0.71875 +vt 0.03125 0.71875 +vt 0.078125 0.796875 +vt 0.125 0.796875 +vt 0.125 0.71875 +vt 0.078125 0.71875 +vt 0.078125 0.796875 +vt 0.078125 0.796875 +vt 0.078125 0.71875 +vt 0.078125 0.71875 +vt 0.078125 0.796875 +vt 0.03125 0.796875 +vt 0.03125 0.796875 +vt 0.078125 0.796875 +vt 0.125 0.796875 +vt 0.078125 0.796875 +vt 0.078125 0.796875 +vt 0.125 0.796875 +vn -2.220446049250313e-16 -1 -2.220446049250313e-16 +vn 4.930380657631324e-32 2.220446049250313e-16 -1 +vn 2.220446049250313e-16 1 2.220446049250313e-16 +vn -4.930380657631324e-32 -2.220446049250313e-16 1 +vn -1 2.220446049250313e-16 4.930380657631324e-32 +vn 1 -2.220446049250313e-16 -4.930380657631324e-32 +usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o right_leg +v 0.25 0.0625 0.3125 +v 0.25 0.0625 0.3125 +v 0.5625 0.0625 0.3125 +v 0.5625 0.0625 0.3125 +v 0.25 0.0625 0.125 +v 0.25 0.0625 0.125 +v 0.5625 0.0625 0.125 +v 0.5625 0.0625 0.125 +vt 0.03125 0.796875 +vt 0.078125 0.796875 +vt 0.078125 0.71875 +vt 0.03125 0.71875 +vt 0.03125 0.796875 +vt 0.03125 0.796875 +vt 0.03125 0.71875 +vt 0.03125 0.71875 +vt 0.078125 0.796875 +vt 0.125 0.796875 +vt 0.125 0.71875 +vt 0.078125 0.71875 +vt 0.078125 0.796875 +vt 0.078125 0.796875 +vt 0.078125 0.71875 +vt 0.078125 0.71875 +vt 0.078125 0.796875 +vt 0.03125 0.796875 +vt 0.03125 0.796875 +vt 0.078125 0.796875 +vt 0.125 0.796875 +vt 0.078125 0.796875 +vt 0.078125 0.796875 +vt 0.125 0.796875 +vn 2.220446049250313e-16 1 -2.220446049250313e-16 +vn 4.930380657631324e-32 2.220446049250313e-16 1 +vn -2.220446049250313e-16 -1 2.220446049250313e-16 +vn -4.930380657631324e-32 -2.220446049250313e-16 -1 +vn -1 2.220446049250313e-16 -4.930380657631324e-32 +vn 1 -2.220446049250313e-16 4.930380657631324e-32 +usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o left_arm +v -0.25 0.0625 -0.1875 +v -0.25 0.0625 -0.1875 +v -0.5625 0.0625 -0.1875 +v -0.5625 0.0625 -0.1875 +v -0.25 0.0625 -0.375 +v -0.25 0.0625 -0.375 +v -0.5625 0.0625 -0.375 +v -0.5625 0.0625 -0.375 +vt 0.03125 0.796875 +vt 0.078125 0.796875 +vt 0.078125 0.71875 +vt 0.03125 0.71875 +vt 0.03125 0.796875 +vt 0.03125 0.796875 +vt 0.03125 0.71875 +vt 0.03125 0.71875 +vt 0.078125 0.796875 +vt 0.125 0.796875 +vt 0.125 0.71875 +vt 0.078125 0.71875 +vt 0.078125 0.796875 +vt 0.078125 0.796875 +vt 0.078125 0.71875 +vt 0.078125 0.71875 +vt 0.078125 0.796875 +vt 0.03125 0.796875 +vt 0.03125 0.796875 +vt 0.078125 0.796875 +vt 0.125 0.796875 +vt 0.078125 0.796875 +vt 0.078125 0.796875 +vt 0.125 0.796875 +vn 2.220446049250313e-16 -1 -2.220446049250313e-16 +vn 4.930380657631324e-32 -2.220446049250313e-16 1 +vn -2.220446049250313e-16 1 2.220446049250313e-16 +vn -4.930380657631324e-32 2.220446049250313e-16 -1 +vn 1 2.220446049250313e-16 4.930380657631324e-32 +vn -1 -2.220446049250313e-16 -4.930380657631324e-32 +usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o left_leg +v -0.25 0.0625 0.125 +v -0.25 0.0625 0.125 +v -0.5625 0.0625 0.125 +v -0.5625 0.0625 0.125 +v -0.25 0.0625 0.3125 +v -0.25 0.0625 0.3125 +v -0.5625 0.0625 0.3125 +v -0.5625 0.0625 0.3125 +vt 0.03125 0.796875 +vt 0.078125 0.796875 +vt 0.078125 0.71875 +vt 0.03125 0.71875 +vt 0.03125 0.796875 +vt 0.03125 0.796875 +vt 0.03125 0.71875 +vt 0.03125 0.71875 +vt 0.078125 0.796875 +vt 0.125 0.796875 +vt 0.125 0.71875 +vt 0.078125 0.71875 +vt 0.078125 0.796875 +vt 0.078125 0.796875 +vt 0.078125 0.71875 +vt 0.078125 0.71875 +vt 0.078125 0.796875 +vt 0.03125 0.796875 +vt 0.03125 0.796875 +vt 0.078125 0.796875 +vt 0.125 0.796875 +vt 0.078125 0.796875 +vt 0.078125 0.796875 +vt 0.125 0.796875 +vn -2.220446049250313e-16 1 -2.220446049250313e-16 +vn 4.930380657631324e-32 -2.220446049250313e-16 -1 +vn 2.220446049250313e-16 -1 2.220446049250313e-16 +vn -4.930380657631324e-32 2.220446049250313e-16 1 +vn 1 2.220446049250313e-16 -4.930380657631324e-32 +vn -1 -2.220446049250313e-16 4.930380657631324e-32 +usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o tail +v 0 0.3125 1 +v 0 0.3125 0.25 +v 0 0 1 +v 0 0 0.25 +v 0 0.3125 0.25 +v 0 0.3125 1 +v 0 0 0.25 +v 0 0 1 +vt 0.21875 0.515625 +vt 0.21875 0.515625 +vt 0.21875 0.4375 +vt 0.21875 0.4375 +vt 0.03125 0.515625 +vt 0.21875 0.515625 +vt 0.21875 0.4375 +vt 0.03125 0.4375 +vt 0.40625 0.515625 +vt 0.40625 0.515625 +vt 0.40625 0.4375 +vt 0.40625 0.4375 +vt 0.21875 0.515625 +vt 0.40625 0.515625 +vt 0.40625 0.4375 +vt 0.21875 0.4375 +vt 0.21875 0.515625 +vt 0.21875 0.515625 +vt 0.21875 0.703125 +vt 0.21875 0.703125 +vt 0.21875 0.703125 +vt 0.21875 0.703125 +vt 0.21875 0.515625 +vt 0.21875 0.515625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o head +v 0.25 0.3125 -0.3125 +v 0.25 0.3125 -0.625 +v 0.25 0 -0.3125 +v 0.25 0 -0.625 +v -0.25 0.3125 -0.625 +v -0.25 0.3125 -0.3125 +v -0.25 0 -0.625 +v -0.25 0 -0.3125 +vt 0.078125 0.90625 +vt 0.203125 0.90625 +vt 0.203125 0.828125 +vt 0.078125 0.828125 +vt 0 0.90625 +vt 0.078125 0.90625 +vt 0.078125 0.828125 +vt 0 0.828125 +vt 0.28125 0.90625 +vt 0.40625 0.90625 +vt 0.40625 0.828125 +vt 0.28125 0.828125 +vt 0.203125 0.90625 +vt 0.28125 0.90625 +vt 0.28125 0.828125 +vt 0.203125 0.828125 +vt 0.203125 0.90625 +vt 0.078125 0.90625 +vt 0.078125 0.984375 +vt 0.203125 0.984375 +vt 0.328125 0.984375 +vt 0.203125 0.984375 +vt 0.203125 0.90625 +vt 0.328125 0.90625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o left_gills +v -0.25 0.4375 -0.375 +v -0.25 0.4375 -0.375 +v -0.25 0 -0.375 +v -0.25 0 -0.375 +v -0.4375 0.4375 -0.375 +v -0.4375 0.4375 -0.375 +v -0.4375 0 -0.375 +v -0.4375 0 -0.375 +vt 0.171875 0.375 +vt 0.21875 0.375 +vt 0.21875 0.265625 +vt 0.171875 0.265625 +vt 0.171875 0.375 +vt 0.171875 0.375 +vt 0.171875 0.265625 +vt 0.171875 0.265625 +vt 0.21875 0.375 +vt 0.265625 0.375 +vt 0.265625 0.265625 +vt 0.21875 0.265625 +vt 0.21875 0.375 +vt 0.21875 0.375 +vt 0.21875 0.265625 +vt 0.21875 0.265625 +vt 0.21875 0.375 +vt 0.171875 0.375 +vt 0.171875 0.375 +vt 0.21875 0.375 +vt 0.265625 0.375 +vt 0.21875 0.375 +vt 0.21875 0.375 +vt 0.265625 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o right_gills +v 0.4375 0.4375 -0.375 +v 0.4375 0.4375 -0.375 +v 0.4375 0 -0.375 +v 0.4375 0 -0.375 +v 0.25 0.4375 -0.375 +v 0.25 0.4375 -0.375 +v 0.25 0 -0.375 +v 0.25 0 -0.375 +vt 0 0.375 +vt 0.046875 0.375 +vt 0.046875 0.265625 +vt 0 0.265625 +vt 0 0.375 +vt 0 0.375 +vt 0 0.265625 +vt 0 0.265625 +vt 0.046875 0.375 +vt 0.09375 0.375 +vt 0.09375 0.265625 +vt 0.046875 0.265625 +vt 0.046875 0.375 +vt 0.046875 0.375 +vt 0.046875 0.265625 +vt 0.046875 0.265625 +vt 0.046875 0.375 +vt 0 0.375 +vt 0 0.375 +vt 0.046875 0.375 +vt 0.09375 0.375 +vt 0.046875 0.375 +vt 0.046875 0.375 +vt 0.09375 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o top_gills +v 0.25 0.5 -0.375 +v 0.25 0.5 -0.375 +v 0.25 0.3125 -0.375 +v 0.25 0.3125 -0.375 +v -0.25 0.5 -0.375 +v -0.25 0.5 -0.375 +v -0.25 0.3125 -0.375 +v -0.25 0.3125 -0.375 +vt 0.046875 0.421875 +vt 0.171875 0.421875 +vt 0.171875 0.375 +vt 0.046875 0.375 +vt 0.046875 0.421875 +vt 0.046875 0.421875 +vt 0.046875 0.375 +vt 0.046875 0.375 +vt 0.171875 0.421875 +vt 0.296875 0.421875 +vt 0.296875 0.375 +vt 0.171875 0.375 +vt 0.171875 0.421875 +vt 0.171875 0.421875 +vt 0.171875 0.375 +vt 0.171875 0.375 +vt 0.171875 0.421875 +vt 0.046875 0.421875 +vt 0.046875 0.421875 +vt 0.171875 0.421875 +vt 0.296875 0.421875 +vt 0.171875 0.421875 +vt 0.171875 0.421875 +vt 0.296875 0.421875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/blaze.obj b/prismarine-viewer/viewer/lib/entity/models/blaze.obj new file mode 100644 index 00000000..d4037c53 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/blaze.obj @@ -0,0 +1,601 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o upperBodyParts0 +v -0.5 1.625 -0.0625 +v -0.5 1.625 -0.1875 +v -0.5 1.125 -0.0625 +v -0.5 1.125 -0.1875 +v -0.625 1.625 -0.1875 +v -0.625 1.625 -0.0625 +v -0.625 1.125 -0.1875 +v -0.625 1.125 -0.0625 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.1875 +vt 0.03125 0.1875 +vt 0 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.1875 +vt 0 0.1875 +vt 0.09375 0.4375 +vt 0.125 0.4375 +vt 0.125 0.1875 +vt 0.09375 0.1875 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.09375 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.5 +vt 0.0625 0.5 +vt 0.09375 0.5 +vt 0.0625 0.5 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o upperBodyParts1 +v 0.625 1.625 0.1875 +v 0.625 1.625 0.0625 +v 0.625 1.125 0.1875 +v 0.625 1.125 0.0625 +v 0.5 1.625 0.0625 +v 0.5 1.625 0.1875 +v 0.5 1.125 0.0625 +v 0.5 1.125 0.1875 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.1875 +vt 0.03125 0.1875 +vt 0 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.1875 +vt 0 0.1875 +vt 0.09375 0.4375 +vt 0.125 0.4375 +vt 0.125 0.1875 +vt 0.09375 0.1875 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.09375 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.5 +vt 0.0625 0.5 +vt 0.09375 0.5 +vt 0.0625 0.5 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o upperBodyParts2 +v -0.0625 1.625 0.625 +v -0.0625 1.625 0.5 +v -0.0625 1.125 0.625 +v -0.0625 1.125 0.5 +v -0.1875 1.625 0.5 +v -0.1875 1.625 0.625 +v -0.1875 1.125 0.5 +v -0.1875 1.125 0.625 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.1875 +vt 0.03125 0.1875 +vt 0 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.1875 +vt 0 0.1875 +vt 0.09375 0.4375 +vt 0.125 0.4375 +vt 0.125 0.1875 +vt 0.09375 0.1875 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.09375 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.5 +vt 0.0625 0.5 +vt 0.09375 0.5 +vt 0.0625 0.5 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o upperBodyParts3 +v 0.1875 1.625 -0.5 +v 0.1875 1.625 -0.625 +v 0.1875 1.125 -0.5 +v 0.1875 1.125 -0.625 +v 0.0625 1.625 -0.625 +v 0.0625 1.625 -0.5 +v 0.0625 1.125 -0.625 +v 0.0625 1.125 -0.5 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.1875 +vt 0.03125 0.1875 +vt 0 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.1875 +vt 0 0.1875 +vt 0.09375 0.4375 +vt 0.125 0.4375 +vt 0.125 0.1875 +vt 0.09375 0.1875 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.09375 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.5 +vt 0.0625 0.5 +vt 0.09375 0.5 +vt 0.0625 0.5 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o upperBodyParts4 +v -0.3125 1.125 0.0625 +v -0.3125 1.125 -0.0625 +v -0.3125 0.625 0.0625 +v -0.3125 0.625 -0.0625 +v -0.4375 1.125 -0.0625 +v -0.4375 1.125 0.0625 +v -0.4375 0.625 -0.0625 +v -0.4375 0.625 0.0625 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.1875 +vt 0.03125 0.1875 +vt 0 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.1875 +vt 0 0.1875 +vt 0.09375 0.4375 +vt 0.125 0.4375 +vt 0.125 0.1875 +vt 0.09375 0.1875 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.09375 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.5 +vt 0.0625 0.5 +vt 0.09375 0.5 +vt 0.0625 0.5 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o upperBodyParts5 +v 0.4375 1.125 0.0625 +v 0.4375 1.125 -0.0625 +v 0.4375 0.625 0.0625 +v 0.4375 0.625 -0.0625 +v 0.3125 1.125 -0.0625 +v 0.3125 1.125 0.0625 +v 0.3125 0.625 -0.0625 +v 0.3125 0.625 0.0625 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.1875 +vt 0.03125 0.1875 +vt 0 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.1875 +vt 0 0.1875 +vt 0.09375 0.4375 +vt 0.125 0.4375 +vt 0.125 0.1875 +vt 0.09375 0.1875 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.09375 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.5 +vt 0.0625 0.5 +vt 0.09375 0.5 +vt 0.0625 0.5 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o upperBodyParts6 +v 0.0625 1.125 0.4375 +v 0.0625 1.125 0.3125 +v 0.0625 0.625 0.4375 +v 0.0625 0.625 0.3125 +v -0.0625 1.125 0.3125 +v -0.0625 1.125 0.4375 +v -0.0625 0.625 0.3125 +v -0.0625 0.625 0.4375 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.1875 +vt 0.03125 0.1875 +vt 0 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.1875 +vt 0 0.1875 +vt 0.09375 0.4375 +vt 0.125 0.4375 +vt 0.125 0.1875 +vt 0.09375 0.1875 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.09375 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.5 +vt 0.0625 0.5 +vt 0.09375 0.5 +vt 0.0625 0.5 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o upperBodyParts7 +v 0.0625 1.125 -0.3125 +v 0.0625 1.125 -0.4375 +v 0.0625 0.625 -0.3125 +v 0.0625 0.625 -0.4375 +v -0.0625 1.125 -0.4375 +v -0.0625 1.125 -0.3125 +v -0.0625 0.625 -0.4375 +v -0.0625 0.625 -0.3125 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.1875 +vt 0.03125 0.1875 +vt 0 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.1875 +vt 0 0.1875 +vt 0.09375 0.4375 +vt 0.125 0.4375 +vt 0.125 0.1875 +vt 0.09375 0.1875 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.09375 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.5 +vt 0.0625 0.5 +vt 0.09375 0.5 +vt 0.0625 0.5 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o upperBodyParts8 +v -0.1875 0.5 0.25 +v -0.1875 0.5 0.125 +v -0.1875 0 0.25 +v -0.1875 0 0.125 +v -0.3125 0.5 0.125 +v -0.3125 0.5 0.25 +v -0.3125 0 0.125 +v -0.3125 0 0.25 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.1875 +vt 0.03125 0.1875 +vt 0 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.1875 +vt 0 0.1875 +vt 0.09375 0.4375 +vt 0.125 0.4375 +vt 0.125 0.1875 +vt 0.09375 0.1875 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.09375 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.5 +vt 0.0625 0.5 +vt 0.09375 0.5 +vt 0.0625 0.5 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o upperBodyParts9 +v 0.3125 0.5 -0.125 +v 0.3125 0.5 -0.25 +v 0.3125 0 -0.125 +v 0.3125 0 -0.25 +v 0.1875 0.5 -0.25 +v 0.1875 0.5 -0.125 +v 0.1875 0 -0.25 +v 0.1875 0 -0.125 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.1875 +vt 0.03125 0.1875 +vt 0 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.1875 +vt 0 0.1875 +vt 0.09375 0.4375 +vt 0.125 0.4375 +vt 0.125 0.1875 +vt 0.09375 0.1875 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.09375 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.5 +vt 0.0625 0.5 +vt 0.09375 0.5 +vt 0.0625 0.5 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o upperBodyParts10 +v 0.25 0.5 0.3125 +v 0.25 0.5 0.1875 +v 0.25 0 0.3125 +v 0.25 0 0.1875 +v 0.125 0.5 0.1875 +v 0.125 0.5 0.3125 +v 0.125 0 0.1875 +v 0.125 0 0.3125 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.1875 +vt 0.03125 0.1875 +vt 0 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.1875 +vt 0 0.1875 +vt 0.09375 0.4375 +vt 0.125 0.4375 +vt 0.125 0.1875 +vt 0.09375 0.1875 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.09375 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.5 +vt 0.0625 0.5 +vt 0.09375 0.5 +vt 0.0625 0.5 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 +o upperBodyParts11 +v -0.125 0.5 -0.1875 +v -0.125 0.5 -0.3125 +v -0.125 0 -0.1875 +v -0.125 0 -0.3125 +v -0.25 0.5 -0.3125 +v -0.25 0.5 -0.1875 +v -0.25 0 -0.3125 +v -0.25 0 -0.1875 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.1875 +vt 0.03125 0.1875 +vt 0 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.1875 +vt 0 0.1875 +vt 0.09375 0.4375 +vt 0.125 0.4375 +vt 0.125 0.1875 +vt 0.09375 0.1875 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.09375 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.5 +vt 0.0625 0.5 +vt 0.09375 0.5 +vt 0.0625 0.5 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f +f 92/268/67 95/267/67 93/266/67 90/265/67 +f 91/272/68 92/271/68 90/270/68 89/269/68 +f 96/276/69 91/275/69 89/274/69 94/273/69 +f 95/280/70 96/279/70 94/278/70 93/277/70 +f 94/284/71 89/283/71 90/282/71 93/281/71 +f 95/288/72 92/287/72 91/286/72 96/285/72 +o Head +v 0.25 1.75 0.25 +v 0.25 1.75 -0.25 +v 0.25 1.25 0.25 +v 0.25 1.25 -0.25 +v -0.25 1.75 -0.25 +v -0.25 1.75 0.25 +v -0.25 1.25 -0.25 +v -0.25 1.25 0.25 +vt 0.125 0.75 +vt 0.25 0.75 +vt 0.25 0.5 +vt 0.125 0.5 +vt 0 0.75 +vt 0.125 0.75 +vt 0.125 0.5 +vt 0 0.5 +vt 0.375 0.75 +vt 0.5 0.75 +vt 0.5 0.5 +vt 0.375 0.5 +vt 0.25 0.75 +vt 0.375 0.75 +vt 0.375 0.5 +vt 0.25 0.5 +vt 0.25 0.75 +vt 0.125 0.75 +vt 0.125 1 +vt 0.25 1 +vt 0.375 1 +vt 0.25 1 +vt 0.25 0.75 +vt 0.375 0.75 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f +f 100/292/73 103/291/73 101/290/73 98/289/73 +f 99/296/74 100/295/74 98/294/74 97/293/74 +f 104/300/75 99/299/75 97/298/75 102/297/75 +f 103/304/76 104/303/76 102/302/76 101/301/76 +f 102/308/77 97/307/77 98/306/77 101/305/77 +f 103/312/78 100/311/78 99/310/78 104/309/78 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/boat.obj b/prismarine-viewer/viewer/lib/entity/models/boat.obj new file mode 100644 index 00000000..72b2ca2a --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/boat.obj @@ -0,0 +1,417 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o bottom +v 0.875 1.3125000000000002 -0.5 +v 0.875 1.1250000000000002 -0.5 +v 0.875 1.3125 0.5 +v 0.875 1.125 0.5 +v -0.875 1.1250000000000002 -0.5 +v -0.875 1.3125000000000002 -0.5 +v -0.875 1.125 0.5 +v -0.875 1.3125 0.5 +vt 0.2421875 0.953125 +vt 0.0234375 0.953125 +vt 0.0234375 0.703125 +vt 0.2421875 0.703125 +vt 0.265625 0.953125 +vt 0.2421875 0.953125 +vt 0.2421875 0.703125 +vt 0.265625 0.703125 +vt 0.484375 0.953125 +vt 0.265625 0.953125 +vt 0.265625 0.703125 +vt 0.484375 0.703125 +vt 0.0234375 0.953125 +vt 0 0.953125 +vt 0 0.703125 +vt 0.0234375 0.703125 +vt 0.0234375 0.953125 +vt 0.2421875 0.953125 +vt 0.2421875 1 +vt 0.0234375 1 +vt 0.2421875 1 +vt 0.4609375 1 +vt 0.4609375 0.953125 +vt 0.2421875 0.953125 +vn 0 -1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 -1 +vn 0 -2.220446049250313e-16 1 +usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o front +v -0.9999999999999999 1.6875 0.5 +v -0.8749999999999999 1.6875 0.5 +v -0.9999999999999999 1.3125 0.5 +v -0.8749999999999999 1.3125 0.5 +v -0.8750000000000001 1.6875 -0.5 +v -1 1.6875 -0.5 +v -0.8750000000000001 1.3125 -0.5 +v -1 1.3125 -0.5 +vt 0.140625 0.546875 +vt 0.015625 0.546875 +vt 0.015625 0.453125 +vt 0.140625 0.453125 +vt 0.15625 0.546875 +vt 0.140625 0.546875 +vt 0.140625 0.453125 +vt 0.15625 0.453125 +vt 0.28125 0.546875 +vt 0.15625 0.546875 +vt 0.15625 0.453125 +vt 0.28125 0.453125 +vt 0.015625 0.546875 +vt 0 0.546875 +vt 0 0.453125 +vt 0.015625 0.453125 +vt 0.015625 0.546875 +vt 0.140625 0.546875 +vt 0.140625 0.578125 +vt 0.015625 0.578125 +vt 0.140625 0.578125 +vt 0.265625 0.578125 +vt 0.265625 0.546875 +vt 0.140625 0.546875 +vn 1 0 -2.220446049250313e-16 +vn 2.220446049250313e-16 0 1 +vn -1 0 2.220446049250313e-16 +vn -2.220446049250313e-16 0 -1 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o back +v 1 1.6875 -0.5625 +v 0.875 1.6875 -0.5625 +v 1 1.3125 -0.5625 +v 0.875 1.3125 -0.5625 +v 0.875 1.6875 0.5625 +v 1 1.6875 0.5625 +v 0.875 1.3125 0.5625 +v 1 1.3125 0.5625 +vt 0.15625 0.671875 +vt 0.015625 0.671875 +vt 0.015625 0.578125 +vt 0.15625 0.578125 +vt 0.171875 0.671875 +vt 0.15625 0.671875 +vt 0.15625 0.578125 +vt 0.171875 0.578125 +vt 0.3125 0.671875 +vt 0.171875 0.671875 +vt 0.171875 0.578125 +vt 0.3125 0.578125 +vt 0.015625 0.671875 +vt 0 0.671875 +vt 0 0.578125 +vt 0.015625 0.578125 +vt 0.015625 0.671875 +vt 0.15625 0.671875 +vt 0.15625 0.703125 +vt 0.015625 0.703125 +vt 0.15625 0.703125 +vt 0.296875 0.703125 +vt 0.296875 0.671875 +vt 0.15625 0.671875 +vn -1 0 -2.220446049250313e-16 +vn 2.220446049250313e-16 0 -1 +vn 1 0 2.220446049250313e-16 +vn -2.220446049250313e-16 0 1 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o right +v -0.875 1.6875 -0.6250000000000001 +v -0.875 1.6875 -0.5000000000000001 +v -0.875 1.3125 -0.6250000000000001 +v -0.875 1.3125 -0.5000000000000001 +v 0.875 1.6875 -0.4999999999999999 +v 0.875 1.6875 -0.6249999999999999 +v 0.875 1.3125 -0.4999999999999999 +v 0.875 1.3125 -0.6249999999999999 +vt 0.234375 0.421875 +vt 0.015625 0.421875 +vt 0.015625 0.328125 +vt 0.234375 0.328125 +vt 0.25 0.421875 +vt 0.234375 0.421875 +vt 0.234375 0.328125 +vt 0.25 0.328125 +vt 0.46875 0.421875 +vt 0.25 0.421875 +vt 0.25 0.328125 +vt 0.46875 0.328125 +vt 0.015625 0.421875 +vt 0 0.421875 +vt 0 0.328125 +vt 0.015625 0.328125 +vt 0.015625 0.421875 +vt 0.234375 0.421875 +vt 0.234375 0.453125 +vt 0.015625 0.453125 +vt 0.234375 0.453125 +vt 0.453125 0.453125 +vt 0.453125 0.421875 +vt 0.234375 0.421875 +vn -1.2246467991473532e-16 0 1 +vn -1 0 -1.2246467991473532e-16 +vn 1.2246467991473532e-16 0 -1 +vn 1 0 1.2246467991473532e-16 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o left +v 0.875 1.6875 0.625 +v 0.875 1.6875 0.5 +v 0.875 1.3125 0.625 +v 0.875 1.3125 0.5 +v -0.875 1.6875 0.5 +v -0.875 1.6875 0.625 +v -0.875 1.3125 0.5 +v -0.875 1.3125 0.625 +vt 0.234375 0.296875 +vt 0.015625 0.296875 +vt 0.015625 0.203125 +vt 0.234375 0.203125 +vt 0.25 0.296875 +vt 0.234375 0.296875 +vt 0.234375 0.203125 +vt 0.25 0.203125 +vt 0.46875 0.296875 +vt 0.25 0.296875 +vt 0.25 0.203125 +vt 0.46875 0.203125 +vt 0.015625 0.296875 +vt 0 0.296875 +vt 0 0.203125 +vt 0.015625 0.203125 +vt 0.015625 0.296875 +vt 0.234375 0.296875 +vt 0.234375 0.328125 +vt 0.015625 0.328125 +vt 0.234375 0.328125 +vt 0.453125 0.328125 +vt 0.453125 0.296875 +vt 0.234375 0.296875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o paddle_left +v 0.21875 1.4135015877365276 1.2703323467065926 +v 0.21875 1.9760015877365271 0.29605376744909906 +v 0.21875 1.3052484122634724 1.2078323467065926 +v 0.21875 1.8677484122634724 0.23355376744909906 +v 0.09375 1.9760015877365271 0.29605376744909906 +v 0.09375 1.4135015877365276 1.2703323467065926 +v 0.09375 1.8677484122634724 0.23355376744909906 +v 0.09375 1.3052484122634724 1.2078323467065926 +vt 0.640625 0.71875 +vt 0.625 0.71875 +vt 0.625 0.6875 +vt 0.640625 0.6875 +vt 0.78125 0.71875 +vt 0.640625 0.71875 +vt 0.640625 0.6875 +vt 0.78125 0.6875 +vt 0.796875 0.71875 +vt 0.78125 0.71875 +vt 0.78125 0.6875 +vt 0.796875 0.6875 +vt 0.625 0.71875 +vt 0.484375 0.71875 +vt 0.484375 0.6875 +vt 0.625 0.6875 +vt 0.625 0.71875 +vt 0.640625 0.71875 +vt 0.640625 1 +vt 0.625 1 +vt 0.640625 1 +vt 0.65625 1 +vt 0.65625 0.71875 +vt 0.640625 0.71875 +vn 0 0.49999999999999994 -0.8660254037844387 +vn 1 0 0 +vn 0 -0.49999999999999994 0.8660254037844387 +vn -1 0 0 +vn 0 0.8660254037844387 0.49999999999999994 +vn 0 -0.8660254037844387 -0.49999999999999994 +usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o paddle_left +v 0.156875 1.4821313509461098 1.5264621099161748 +v 0.156875 1.7008813509461098 1.147575995760483 +v 0.156875 1.1573718245269453 1.3389621099161748 +v 0.156875 1.3761218245269453 0.960075995760483 +v 0.09437499999999999 1.7008813509461098 1.147575995760483 +v 0.09437499999999999 1.4821313509461098 1.5264621099161748 +v 0.09437499999999999 1.3761218245269453 0.960075995760483 +v 0.09437499999999999 1.1573718245269453 1.3389621099161748 +vt 0.546875 0.890625 +vt 0.5390625 0.890625 +vt 0.5390625 0.796875 +vt 0.546875 0.796875 +vt 0.6015625 0.890625 +vt 0.546875 0.890625 +vt 0.546875 0.796875 +vt 0.6015625 0.796875 +vt 0.609375 0.890625 +vt 0.6015625 0.890625 +vt 0.6015625 0.796875 +vt 0.609375 0.796875 +vt 0.5390625 0.890625 +vt 0.484375 0.890625 +vt 0.484375 0.796875 +vt 0.5390625 0.796875 +vt 0.5390625 0.890625 +vt 0.546875 0.890625 +vt 0.546875 1 +vt 0.5390625 1 +vt 0.546875 1 +vt 0.5546875 1 +vt 0.5546875 0.890625 +vt 0.546875 0.890625 +vn 0 0.49999999999999994 -0.8660254037844387 +vn 1 0 0 +vn 0 -0.49999999999999994 0.8660254037844387 +vn -1 0 0 +vn 0 0.8660254037844387 0.49999999999999994 +vn 0 -0.8660254037844387 -0.49999999999999994 +usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o paddle_right +v 0.09374999999999989 1.4135015877365273 -1.2703323467065928 +v 0.09375 1.9760015877365271 -0.29605376744909917 +v 0.09374999999999989 1.3052484122634724 -1.2078323467065928 +v 0.09375 1.8677484122634724 -0.23355376744909917 +v 0.21875 1.9760015877365271 -0.29605376744909917 +v 0.2187499999999999 1.4135015877365273 -1.2703323467065928 +v 0.21875 1.8677484122634724 -0.23355376744909917 +v 0.21875 1.3052484122634724 -1.2078323467065928 +vt 0.640625 0.40625 +vt 0.625 0.40625 +vt 0.625 0.375 +vt 0.640625 0.375 +vt 0.78125 0.40625 +vt 0.640625 0.40625 +vt 0.640625 0.375 +vt 0.78125 0.375 +vt 0.796875 0.40625 +vt 0.78125 0.40625 +vt 0.78125 0.375 +vt 0.796875 0.375 +vt 0.625 0.40625 +vt 0.484375 0.40625 +vt 0.484375 0.375 +vt 0.625 0.375 +vt 0.625 0.40625 +vt 0.640625 0.40625 +vt 0.640625 0.6875 +vt 0.625 0.6875 +vt 0.640625 0.6875 +vt 0.65625 0.6875 +vt 0.65625 0.40625 +vt 0.640625 0.40625 +vn 1.0605752387249069e-16 0.49999999999999994 0.8660254037844387 +vn -1 -1.848892746611746e-32 1.224646799147353e-16 +vn -1.0605752387249069e-16 -0.49999999999999994 -0.8660254037844387 +vn 1 1.848892746611746e-32 -1.224646799147353e-16 +vn -6.123233995736765e-17 0.8660254037844388 -0.49999999999999994 +vn 6.123233995736765e-17 -0.8660254037844388 0.49999999999999994 +usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o paddle_right +v 0.09437499999999988 1.4821313509461096 -1.526462109916175 +v 0.09437499999999988 1.7008813509461094 -1.1475759957604832 +v 0.09437499999999988 1.157371824526945 -1.338962109916175 +v 0.09437499999999988 1.376121824526945 -0.9600759957604832 +v 0.15687499999999988 1.7008813509461094 -1.1475759957604832 +v 0.15687499999999988 1.4821313509461096 -1.526462109916175 +v 0.15687499999999988 1.376121824526945 -0.9600759957604832 +v 0.15687499999999988 1.157371824526945 -1.338962109916175 +vt 0.546875 0.578125 +vt 0.5390625 0.578125 +vt 0.5390625 0.484375 +vt 0.546875 0.484375 +vt 0.6015625 0.578125 +vt 0.546875 0.578125 +vt 0.546875 0.484375 +vt 0.6015625 0.484375 +vt 0.609375 0.578125 +vt 0.6015625 0.578125 +vt 0.6015625 0.484375 +vt 0.609375 0.484375 +vt 0.5390625 0.578125 +vt 0.484375 0.578125 +vt 0.484375 0.484375 +vt 0.5390625 0.484375 +vt 0.5390625 0.578125 +vt 0.546875 0.578125 +vt 0.546875 0.6875 +vt 0.5390625 0.6875 +vt 0.546875 0.6875 +vt 0.5546875 0.6875 +vt 0.5546875 0.578125 +vt 0.546875 0.578125 +vn 1.0605752387249069e-16 0.49999999999999994 0.8660254037844387 +vn -1 -1.848892746611746e-32 1.224646799147353e-16 +vn -1.0605752387249069e-16 -0.49999999999999994 -0.8660254037844387 +vn 1 1.848892746611746e-32 -1.224646799147353e-16 +vn -6.123233995736765e-17 0.8660254037844388 -0.49999999999999994 +vn 6.123233995736765e-17 -0.8660254037844388 0.49999999999999994 +usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/camel.obj b/prismarine-viewer/viewer/lib/entity/models/camel.obj new file mode 100644 index 00000000..8c8f050a --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/camel.obj @@ -0,0 +1,1061 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.46875 2 0.8125 +v 0.46875 2 -0.875 +v 0.46875 1.25 0.8125 +v 0.46875 1.25 -0.875 +v -0.46875 2 -0.875 +v -0.46875 2 0.8125 +v -0.46875 1.25 -0.875 +v -0.46875 1.25 0.8125 +vt 0.2109375 0.59375 +vt 0.328125 0.59375 +vt 0.328125 0.5 +vt 0.2109375 0.5 +vt 0 0.59375 +vt 0.2109375 0.59375 +vt 0.2109375 0.5 +vt 0 0.5 +vt 0.5390625 0.59375 +vt 0.65625 0.59375 +vt 0.65625 0.5 +vt 0.5390625 0.5 +vt 0.328125 0.59375 +vt 0.5390625 0.59375 +vt 0.5390625 0.5 +vt 0.328125 0.5 +vt 0.328125 0.59375 +vt 0.2109375 0.59375 +vt 0.2109375 0.8046875 +vt 0.328125 0.8046875 +vt 0.4453125 0.8046875 +vt 0.328125 0.8046875 +vt 0.328125 0.59375 +vt 0.4453125 0.59375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o saddle layer +v 0.2875 2.31875 0.31875 +v 0.2875 2.31875 -0.38125 +v 0.2875 1.99375 0.31875 +v 0.2875 1.99375 -0.38125 +v -0.2875 2.31875 -0.38125 +v -0.2875 2.31875 0.31875 +v -0.2875 1.99375 -0.38125 +v -0.2875 1.99375 0.31875 +vt 0.6640625 0.4140625 +vt 0.734375 0.4140625 +vt 0.734375 0.375 +vt 0.6640625 0.375 +vt 0.578125 0.4140625 +vt 0.6640625 0.4140625 +vt 0.6640625 0.375 +vt 0.578125 0.375 +vt 0.8203125 0.4140625 +vt 0.890625 0.4140625 +vt 0.890625 0.375 +vt 0.8203125 0.375 +vt 0.734375 0.4140625 +vt 0.8203125 0.4140625 +vt 0.8203125 0.375 +vt 0.734375 0.375 +vt 0.734375 0.4140625 +vt 0.6640625 0.4140625 +vt 0.6640625 0.5 +vt 0.734375 0.5 +vt 0.8046875 0.5 +vt 0.734375 0.5 +vt 0.734375 0.4140625 +vt 0.8046875 0.4140625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o saddle layer +v 0.22499999999999998 2.50625 0.31875 +v 0.22499999999999998 2.50625 -0.38125 +v 0.22499999999999998 2.30625 0.31875 +v 0.22499999999999998 2.30625 -0.38125 +v -0.22499999999999998 2.50625 -0.38125 +v -0.22499999999999998 2.50625 0.31875 +v -0.22499999999999998 2.30625 -0.38125 +v -0.22499999999999998 2.30625 0.31875 +vt 0.8046875 0.0234375 +vt 0.859375 0.0234375 +vt 0.859375 0 +vt 0.8046875 0 +vt 0.71875 0.0234375 +vt 0.8046875 0.0234375 +vt 0.8046875 0 +vt 0.71875 0 +vt 0.9453125 0.0234375 +vt 1 0.0234375 +vt 1 0 +vt 0.9453125 0 +vt 0.859375 0.0234375 +vt 0.9453125 0.0234375 +vt 0.9453125 0 +vt 0.859375 0 +vt 0.859375 0.0234375 +vt 0.8046875 0.0234375 +vt 0.8046875 0.109375 +vt 0.859375 0.109375 +vt 0.9140625 0.109375 +vt 0.859375 0.109375 +vt 0.859375 0.0234375 +vt 0.9140625 0.0234375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o saddle layer +v 0.475 2.00625 0.8187500000000001 +v 0.475 2.00625 -0.88125 +v 0.475 1.24375 0.8187500000000001 +v 0.475 1.24375 -0.88125 +v -0.475 2.00625 -0.88125 +v -0.475 2.00625 0.8187500000000001 +v -0.475 1.24375 -0.88125 +v -0.475 1.24375 0.8187500000000001 +vt 0.2109375 0.09375 +vt 0.328125 0.09375 +vt 0.328125 0 +vt 0.2109375 0 +vt 0 0.09375 +vt 0.2109375 0.09375 +vt 0.2109375 0 +vt 0 0 +vt 0.5390625 0.09375 +vt 0.65625 0.09375 +vt 0.65625 0 +vt 0.5390625 0 +vt 0.328125 0.09375 +vt 0.5390625 0.09375 +vt 0.5390625 0 +vt 0.328125 0 +vt 0.328125 0.09375 +vt 0.2109375 0.09375 +vt 0.2109375 0.3046875 +vt 0.328125 0.3046875 +vt 0.4453125 0.3046875 +vt 0.328125 0.3046875 +vt 0.328125 0.09375 +vt 0.4453125 0.09375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o tail +v -0.09375 1.8125 0.8125 +v -0.09375 1.8125 0.8125 +v -0.09375 0.9375 0.8125 +v -0.09375 0.9375 0.8125 +v 0.09375 1.8125 0.8125 +v 0.09375 1.8125 0.8125 +v 0.09375 0.9375 0.8125 +v 0.09375 0.9375 0.8125 +vt 0.953125 1 +vt 0.9765625 1 +vt 0.9765625 0.890625 +vt 0.953125 0.890625 +vt 0.953125 1 +vt 0.953125 1 +vt 0.953125 0.890625 +vt 0.953125 0.890625 +vt 0.9765625 1 +vt 1 1 +vt 1 0.890625 +vt 0.9765625 0.890625 +vt 0.9765625 1 +vt 0.9765625 1 +vt 0.9765625 0.890625 +vt 0.9765625 0.890625 +vt 0.9765625 1 +vt 0.953125 1 +vt 0.953125 1 +vt 0.9765625 1 +vt 1 1 +vt 0.9765625 1 +vt 0.9765625 1 +vt 1 1 +vn 1.2246467991473532e-16 0 1 +vn -1 0 1.2246467991473532e-16 +vn -1.2246467991473532e-16 0 -1 +vn 1 0 -1.2246467991473532e-16 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o head +v 0.21875 1.875 -0.375 +v 0.21875 1.875 -1.5625 +v 0.21875 1.375 -0.375 +v 0.21875 1.375 -1.5625 +v -0.21875 1.875 -1.5625 +v -0.21875 1.875 -0.375 +v -0.21875 1.375 -1.5625 +v -0.21875 1.375 -0.375 +vt 0.6171875 0.6640625 +vt 0.671875 0.6640625 +vt 0.671875 0.6015625 +vt 0.6171875 0.6015625 +vt 0.46875 0.6640625 +vt 0.6171875 0.6640625 +vt 0.6171875 0.6015625 +vt 0.46875 0.6015625 +vt 0.8203125 0.6640625 +vt 0.875 0.6640625 +vt 0.875 0.6015625 +vt 0.8203125 0.6015625 +vt 0.671875 0.6640625 +vt 0.8203125 0.6640625 +vt 0.8203125 0.6015625 +vt 0.671875 0.6015625 +vt 0.671875 0.6640625 +vt 0.6171875 0.6640625 +vt 0.6171875 0.8125 +vt 0.671875 0.8125 +vt 0.7265625 0.8125 +vt 0.671875 0.8125 +vt 0.671875 0.6640625 +vt 0.7265625 0.6640625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o head +v 0.21875 2.75 -1.125 +v 0.21875 2.75 -1.5625 +v 0.21875 1.875 -1.125 +v 0.21875 1.875 -1.5625 +v -0.21875 2.75 -1.5625 +v -0.21875 2.75 -1.125 +v -0.21875 1.875 -1.5625 +v -0.21875 1.875 -1.125 +vt 0.21875 0.9453125 +vt 0.2734375 0.9453125 +vt 0.2734375 0.8359375 +vt 0.21875 0.8359375 +vt 0.1640625 0.9453125 +vt 0.21875 0.9453125 +vt 0.21875 0.8359375 +vt 0.1640625 0.8359375 +vt 0.328125 0.9453125 +vt 0.3828125 0.9453125 +vt 0.3828125 0.8359375 +vt 0.328125 0.8359375 +vt 0.2734375 0.9453125 +vt 0.328125 0.9453125 +vt 0.328125 0.8359375 +vt 0.2734375 0.8359375 +vt 0.2734375 0.9453125 +vt 0.21875 0.9453125 +vt 0.21875 1 +vt 0.2734375 1 +vt 0.328125 1 +vt 0.2734375 1 +vt 0.2734375 0.9453125 +vt 0.328125 0.9453125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o head +v 0.15625 2.75 -1.5625 +v 0.15625 2.75 -1.9375 +v 0.15625 2.4375 -1.5625 +v 0.15625 2.4375 -1.9375 +v -0.15625 2.75 -1.9375 +v -0.15625 2.75 -1.5625 +v -0.15625 2.4375 -1.9375 +v -0.15625 2.4375 -1.5625 +vt 0.4375 0.953125 +vt 0.4765625 0.953125 +vt 0.4765625 0.9140625 +vt 0.4375 0.9140625 +vt 0.390625 0.953125 +vt 0.4375 0.953125 +vt 0.4375 0.9140625 +vt 0.390625 0.9140625 +vt 0.5234375 0.953125 +vt 0.5625 0.953125 +vt 0.5625 0.9140625 +vt 0.5234375 0.9140625 +vt 0.4765625 0.953125 +vt 0.5234375 0.953125 +vt 0.5234375 0.9140625 +vt 0.4765625 0.9140625 +vt 0.4765625 0.953125 +vt 0.4375 0.953125 +vt 0.4375 1 +vt 0.4765625 1 +vt 0.515625 1 +vt 0.4765625 1 +vt 0.4765625 0.953125 +vt 0.515625 0.953125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o bridle layer +v 0.22499999999999998 1.88125 -0.36875 +v 0.22499999999999998 1.88125 -1.56875 +v 0.22499999999999998 1.36875 -0.36875 +v 0.22499999999999998 1.36875 -1.56875 +v -0.22499999999999998 1.88125 -1.56875 +v -0.22499999999999998 1.88125 -0.36875 +v -0.22499999999999998 1.36875 -1.56875 +v -0.22499999999999998 1.36875 -0.36875 +vt 0.6171875 0.171875 +vt 0.671875 0.171875 +vt 0.671875 0.109375 +vt 0.6171875 0.109375 +vt 0.46875 0.171875 +vt 0.6171875 0.171875 +vt 0.6171875 0.109375 +vt 0.46875 0.109375 +vt 0.8203125 0.171875 +vt 0.875 0.171875 +vt 0.875 0.109375 +vt 0.8203125 0.109375 +vt 0.671875 0.171875 +vt 0.8203125 0.171875 +vt 0.8203125 0.109375 +vt 0.671875 0.109375 +vt 0.671875 0.171875 +vt 0.6171875 0.171875 +vt 0.6171875 0.3203125 +vt 0.671875 0.3203125 +vt 0.7265625 0.3203125 +vt 0.671875 0.3203125 +vt 0.671875 0.171875 +vt 0.7265625 0.171875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o bridle layer +v 0.22499999999999998 2.75625 -1.11875 +v 0.22499999999999998 2.75625 -1.56875 +v 0.22499999999999998 1.86875 -1.11875 +v 0.22499999999999998 1.86875 -1.56875 +v -0.22499999999999998 2.75625 -1.56875 +v -0.22499999999999998 2.75625 -1.11875 +v -0.22499999999999998 1.86875 -1.56875 +v -0.22499999999999998 1.86875 -1.11875 +vt 0.21875 0.4453125 +vt 0.2734375 0.4453125 +vt 0.2734375 0.3359375 +vt 0.21875 0.3359375 +vt 0.1640625 0.4453125 +vt 0.21875 0.4453125 +vt 0.21875 0.3359375 +vt 0.1640625 0.3359375 +vt 0.328125 0.4453125 +vt 0.3828125 0.4453125 +vt 0.3828125 0.3359375 +vt 0.328125 0.3359375 +vt 0.2734375 0.4453125 +vt 0.328125 0.4453125 +vt 0.328125 0.3359375 +vt 0.2734375 0.3359375 +vt 0.2734375 0.4453125 +vt 0.21875 0.4453125 +vt 0.21875 0.5 +vt 0.2734375 0.5 +vt 0.328125 0.5 +vt 0.2734375 0.5 +vt 0.2734375 0.4453125 +vt 0.328125 0.4453125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o bridle layer +v 0.16249999999999998 2.75625 -1.5625 +v 0.16249999999999998 2.75625 -1.9500000000000002 +v 0.16249999999999998 2.43125 -1.5625 +v 0.16249999999999998 2.43125 -1.9500000000000002 +v -0.16249999999999998 2.75625 -1.9500000000000002 +v -0.16249999999999998 2.75625 -1.5625 +v -0.16249999999999998 2.43125 -1.9500000000000002 +v -0.16249999999999998 2.43125 -1.5625 +vt 0.4375 0.453125 +vt 0.4765625 0.453125 +vt 0.4765625 0.4140625 +vt 0.4375 0.4140625 +vt 0.390625 0.453125 +vt 0.4375 0.453125 +vt 0.4375 0.4140625 +vt 0.390625 0.4140625 +vt 0.5234375 0.453125 +vt 0.5625 0.453125 +vt 0.5625 0.4140625 +vt 0.5234375 0.4140625 +vt 0.4765625 0.453125 +vt 0.5234375 0.453125 +vt 0.5234375 0.4140625 +vt 0.4765625 0.4140625 +vt 0.4765625 0.453125 +vt 0.4375 0.453125 +vt 0.4375 0.5 +vt 0.4765625 0.5 +vt 0.515625 0.5 +vt 0.4765625 0.5 +vt 0.4765625 0.453125 +vt 0.515625 0.453125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 +o bridle +v -0.15625 2.625 -1.625 +v -0.15625 2.625 -1.75 +v -0.15625 2.5 -1.625 +v -0.15625 2.5 -1.75 +v -0.21875 2.625 -1.75 +v -0.21875 2.625 -1.625 +v -0.21875 2.5 -1.75 +v -0.21875 2.5 -1.625 +vt 0.59375 0.4375 +vt 0.6015625 0.4375 +vt 0.6015625 0.421875 +vt 0.59375 0.421875 +vt 0.578125 0.4375 +vt 0.59375 0.4375 +vt 0.59375 0.421875 +vt 0.578125 0.421875 +vt 0.6171875 0.4375 +vt 0.625 0.4375 +vt 0.625 0.421875 +vt 0.6171875 0.421875 +vt 0.6015625 0.4375 +vt 0.6171875 0.4375 +vt 0.6171875 0.421875 +vt 0.6015625 0.421875 +vt 0.6015625 0.4375 +vt 0.59375 0.4375 +vt 0.59375 0.453125 +vt 0.6015625 0.453125 +vt 0.609375 0.453125 +vt 0.6015625 0.453125 +vt 0.6015625 0.4375 +vt 0.609375 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 92/268/67 95/267/67 93/266/67 90/265/67 +f 91/272/68 92/271/68 90/270/68 89/269/68 +f 96/276/69 91/275/69 89/274/69 94/273/69 +f 95/280/70 96/279/70 94/278/70 93/277/70 +f 94/284/71 89/283/71 90/282/71 93/281/71 +f 95/288/72 92/287/72 91/286/72 96/285/72 +o bridle +v 0.21875 2.625 -1.625 +v 0.21875 2.625 -1.75 +v 0.21875 2.5 -1.625 +v 0.21875 2.5 -1.75 +v 0.15625 2.625 -1.75 +v 0.15625 2.625 -1.625 +v 0.15625 2.5 -1.75 +v 0.15625 2.5 -1.625 +vt 0.6015625 0.4375 +vt 0.59375 0.4375 +vt 0.59375 0.421875 +vt 0.6015625 0.421875 +vt 0.6171875 0.4375 +vt 0.6015625 0.4375 +vt 0.6015625 0.421875 +vt 0.6171875 0.421875 +vt 0.625 0.4375 +vt 0.6171875 0.4375 +vt 0.6171875 0.421875 +vt 0.625 0.421875 +vt 0.59375 0.4375 +vt 0.578125 0.4375 +vt 0.578125 0.421875 +vt 0.59375 0.421875 +vt 0.59375 0.4375 +vt 0.6015625 0.4375 +vt 0.6015625 0.453125 +vt 0.59375 0.453125 +vt 0.6015625 0.453125 +vt 0.609375 0.453125 +vt 0.609375 0.4375 +vt 0.6015625 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 100/292/73 103/291/73 101/290/73 98/289/73 +f 99/296/74 100/295/74 98/294/74 97/293/74 +f 104/300/75 99/299/75 97/298/75 102/297/75 +f 103/304/76 104/303/76 102/302/76 101/301/76 +f 102/308/77 97/307/77 98/306/77 101/305/77 +f 103/312/78 100/311/78 99/310/78 104/309/78 +o left_ear +v -0.1875 2.71875 -1.15625 +v -0.1875 2.71875 -1.28125 +v -0.1875 2.65625 -1.15625 +v -0.1875 2.65625 -1.28125 +v -0.375 2.71875 -1.28125 +v -0.375 2.71875 -1.15625 +v -0.375 2.65625 -1.28125 +v -0.375 2.65625 -1.15625 +vt 0.3671875 0.984375 +vt 0.390625 0.984375 +vt 0.390625 0.9765625 +vt 0.3671875 0.9765625 +vt 0.3515625 0.984375 +vt 0.3671875 0.984375 +vt 0.3671875 0.9765625 +vt 0.3515625 0.9765625 +vt 0.40625 0.984375 +vt 0.4296875 0.984375 +vt 0.4296875 0.9765625 +vt 0.40625 0.9765625 +vt 0.390625 0.984375 +vt 0.40625 0.984375 +vt 0.40625 0.9765625 +vt 0.390625 0.9765625 +vt 0.390625 0.984375 +vt 0.3671875 0.984375 +vt 0.3671875 1 +vt 0.390625 1 +vt 0.4140625 1 +vt 0.390625 1 +vt 0.390625 0.984375 +vt 0.4140625 0.984375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 108/316/79 111/315/79 109/314/79 106/313/79 +f 107/320/80 108/319/80 106/318/80 105/317/80 +f 112/324/81 107/323/81 105/322/81 110/321/81 +f 111/328/82 112/327/82 110/326/82 109/325/82 +f 110/332/83 105/331/83 106/330/83 109/329/83 +f 111/336/84 108/335/84 107/334/84 112/333/84 +o right_ear +v 0.375 2.71875 -1.15625 +v 0.375 2.71875 -1.28125 +v 0.375 2.65625 -1.15625 +v 0.375 2.65625 -1.28125 +v 0.1875 2.71875 -1.28125 +v 0.1875 2.71875 -1.15625 +v 0.1875 2.65625 -1.28125 +v 0.1875 2.65625 -1.15625 +vt 0.5390625 0.984375 +vt 0.5625 0.984375 +vt 0.5625 0.9765625 +vt 0.5390625 0.9765625 +vt 0.5234375 0.984375 +vt 0.5390625 0.984375 +vt 0.5390625 0.9765625 +vt 0.5234375 0.9765625 +vt 0.578125 0.984375 +vt 0.6015625 0.984375 +vt 0.6015625 0.9765625 +vt 0.578125 0.9765625 +vt 0.5625 0.984375 +vt 0.578125 0.984375 +vt 0.578125 0.9765625 +vt 0.5625 0.9765625 +vt 0.5625 0.984375 +vt 0.5390625 0.984375 +vt 0.5390625 1 +vt 0.5625 1 +vt 0.5859375 1 +vt 0.5625 1 +vt 0.5625 0.984375 +vt 0.5859375 0.984375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 116/340/85 119/339/85 117/338/85 114/337/85 +f 115/344/86 116/343/86 114/342/86 113/341/86 +f 120/348/87 115/347/87 113/346/87 118/345/87 +f 119/352/88 120/351/88 118/350/88 117/349/88 +f 118/356/89 113/355/89 114/354/89 117/353/89 +f 119/360/90 116/359/90 115/358/90 120/357/90 +o reins layer +v -0.23125 2.5625 -0.75 +v -0.23125 2.5625 -1.6875 +v -0.23125 2.125 -0.75 +v -0.23125 2.125 -1.6875 +v -0.23125 2.5625 -1.6875 +v -0.23125 2.5625 -0.75 +v -0.23125 2.125 -1.6875 +v -0.23125 2.125 -0.75 +vt 0.8828125 0.5546875 +vt 0.8828125 0.5546875 +vt 0.8828125 0.5 +vt 0.8828125 0.5 +vt 0.765625 0.5546875 +vt 0.8828125 0.5546875 +vt 0.8828125 0.5 +vt 0.765625 0.5 +vt 1 0.5546875 +vt 1 0.5546875 +vt 1 0.5 +vt 1 0.5 +vt 0.8828125 0.5546875 +vt 1 0.5546875 +vt 1 0.5 +vt 0.8828125 0.5 +vt 0.8828125 0.5546875 +vt 0.8828125 0.5546875 +vt 0.8828125 0.671875 +vt 0.8828125 0.671875 +vt 0.8828125 0.671875 +vt 0.8828125 0.671875 +vt 0.8828125 0.5546875 +vt 0.8828125 0.5546875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 124/364/91 127/363/91 125/362/91 122/361/91 +f 123/368/92 124/367/92 122/366/92 121/365/92 +f 128/372/93 123/371/93 121/370/93 126/369/93 +f 127/376/94 128/375/94 126/374/94 125/373/94 +f 126/380/95 121/379/95 122/378/95 125/377/95 +f 127/384/96 124/383/96 123/382/96 128/381/96 +o reins layer +v 0.23124999999999996 2.5625 -0.75 +v 0.23124999999999996 2.5625 -0.75 +v 0.23124999999999996 2.125 -0.75 +v 0.23124999999999996 2.125 -0.75 +v -0.23125 2.5625 -0.75 +v -0.23125 2.5625 -0.75 +v -0.23125 2.125 -0.75 +v -0.23125 2.125 -0.75 +vt 0.65625 0.5546875 +vt 0.7109375 0.5546875 +vt 0.7109375 0.5 +vt 0.65625 0.5 +vt 0.65625 0.5546875 +vt 0.65625 0.5546875 +vt 0.65625 0.5 +vt 0.65625 0.5 +vt 0.7109375 0.5546875 +vt 0.765625 0.5546875 +vt 0.765625 0.5 +vt 0.7109375 0.5 +vt 0.7109375 0.5546875 +vt 0.7109375 0.5546875 +vt 0.7109375 0.5 +vt 0.7109375 0.5 +vt 0.7109375 0.5546875 +vt 0.65625 0.5546875 +vt 0.65625 0.5546875 +vt 0.7109375 0.5546875 +vt 0.765625 0.5546875 +vt 0.7109375 0.5546875 +vt 0.7109375 0.5546875 +vt 0.765625 0.5546875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 132/388/97 135/387/97 133/386/97 130/385/97 +f 131/392/98 132/391/98 130/390/98 129/389/98 +f 136/396/99 131/395/99 129/394/99 134/393/99 +f 135/400/100 136/399/100 134/398/100 133/397/100 +f 134/404/101 129/403/101 130/402/101 133/401/101 +f 135/408/102 132/407/102 131/406/102 136/405/102 +o reins layer +v 0.23124999999999996 2.5625 -0.75 +v 0.23124999999999996 2.5625 -1.6875 +v 0.23124999999999996 2.125 -0.75 +v 0.23124999999999996 2.125 -1.6875 +v 0.23124999999999996 2.5625 -1.6875 +v 0.23124999999999996 2.5625 -0.75 +v 0.23124999999999996 2.125 -1.6875 +v 0.23124999999999996 2.125 -0.75 +vt 0.8828125 0.5546875 +vt 0.8828125 0.5546875 +vt 0.8828125 0.5 +vt 0.8828125 0.5 +vt 0.765625 0.5546875 +vt 0.8828125 0.5546875 +vt 0.8828125 0.5 +vt 0.765625 0.5 +vt 1 0.5546875 +vt 1 0.5546875 +vt 1 0.5 +vt 1 0.5 +vt 0.8828125 0.5546875 +vt 1 0.5546875 +vt 1 0.5 +vt 0.8828125 0.5 +vt 0.8828125 0.5546875 +vt 0.8828125 0.5546875 +vt 0.8828125 0.671875 +vt 0.8828125 0.671875 +vt 0.8828125 0.671875 +vt 0.8828125 0.671875 +vt 0.8828125 0.5546875 +vt 0.8828125 0.5546875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 140/412/103 143/411/103 141/410/103 138/409/103 +f 139/416/104 140/415/104 138/414/104 137/413/104 +f 144/420/105 139/419/105 137/418/105 142/417/105 +f 143/424/106 144/423/106 142/422/106 141/421/106 +f 142/428/107 137/427/107 138/426/107 141/425/107 +f 143/432/108 140/431/108 139/430/108 144/429/108 +o hump +v 0.28125 2.3125 0.3125 +v 0.28125 2.3125 -0.375 +v 0.28125 2 0.3125 +v 0.28125 2 -0.375 +v -0.28125 2.3125 -0.375 +v -0.28125 2.3125 0.3125 +v -0.28125 2 -0.375 +v -0.28125 2 0.3125 +vt 0.6640625 0.9140625 +vt 0.734375 0.9140625 +vt 0.734375 0.875 +vt 0.6640625 0.875 +vt 0.578125 0.9140625 +vt 0.6640625 0.9140625 +vt 0.6640625 0.875 +vt 0.578125 0.875 +vt 0.8203125 0.9140625 +vt 0.890625 0.9140625 +vt 0.890625 0.875 +vt 0.8203125 0.875 +vt 0.734375 0.9140625 +vt 0.8203125 0.9140625 +vt 0.8203125 0.875 +vt 0.734375 0.875 +vt 0.734375 0.9140625 +vt 0.6640625 0.9140625 +vt 0.6640625 1 +vt 0.734375 1 +vt 0.8046875 1 +vt 0.734375 1 +vt 0.734375 0.9140625 +vt 0.8046875 0.9140625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 148/436/109 151/435/109 149/434/109 146/433/109 +f 147/440/110 148/439/110 146/438/110 145/437/110 +f 152/444/111 147/443/111 145/442/111 150/441/111 +f 151/448/112 152/447/112 150/446/112 149/445/112 +f 150/452/113 145/451/113 146/450/113 149/449/113 +f 151/456/114 148/455/114 147/454/114 152/453/114 +o right_front_leg +v 0.4625 1.3125 -0.5 +v 0.4625 1.3125 -0.8125 +v 0.4625 0 -0.5 +v 0.4625 0 -0.8125 +v 0.15000000000000002 1.3125 -0.8125 +v 0.15000000000000002 1.3125 -0.5 +v 0.15000000000000002 0 -0.8125 +v 0.15000000000000002 0 -0.5 +vt 0.0390625 0.7578125 +vt 0.078125 0.7578125 +vt 0.078125 0.59375 +vt 0.0390625 0.59375 +vt 0 0.7578125 +vt 0.0390625 0.7578125 +vt 0.0390625 0.59375 +vt 0 0.59375 +vt 0.1171875 0.7578125 +vt 0.15625 0.7578125 +vt 0.15625 0.59375 +vt 0.1171875 0.59375 +vt 0.078125 0.7578125 +vt 0.1171875 0.7578125 +vt 0.1171875 0.59375 +vt 0.078125 0.59375 +vt 0.078125 0.7578125 +vt 0.0390625 0.7578125 +vt 0.0390625 0.796875 +vt 0.078125 0.796875 +vt 0.1171875 0.796875 +vt 0.078125 0.796875 +vt 0.078125 0.7578125 +vt 0.1171875 0.7578125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 156/460/115 159/459/115 157/458/115 154/457/115 +f 155/464/116 156/463/116 154/462/116 153/461/116 +f 160/468/117 155/467/117 153/466/117 158/465/117 +f 159/472/118 160/471/118 158/470/118 157/469/118 +f 158/476/119 153/475/119 154/474/119 157/473/119 +f 159/480/120 156/479/120 155/478/120 160/477/120 +o left_front_leg +v -0.15000000000000002 1.3125 -0.5 +v -0.15000000000000002 1.3125 -0.8125 +v -0.15000000000000002 0 -0.5 +v -0.15000000000000002 0 -0.8125 +v -0.4625 1.3125 -0.8125 +v -0.4625 1.3125 -0.5 +v -0.4625 0 -0.8125 +v -0.4625 0 -0.5 +vt 0.0390625 0.9609375 +vt 0.078125 0.9609375 +vt 0.078125 0.796875 +vt 0.0390625 0.796875 +vt 0 0.9609375 +vt 0.0390625 0.9609375 +vt 0.0390625 0.796875 +vt 0 0.796875 +vt 0.1171875 0.9609375 +vt 0.15625 0.9609375 +vt 0.15625 0.796875 +vt 0.1171875 0.796875 +vt 0.078125 0.9609375 +vt 0.1171875 0.9609375 +vt 0.1171875 0.796875 +vt 0.078125 0.796875 +vt 0.078125 0.9609375 +vt 0.0390625 0.9609375 +vt 0.0390625 1 +vt 0.078125 1 +vt 0.1171875 1 +vt 0.078125 1 +vt 0.078125 0.9609375 +vt 0.1171875 0.9609375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 164/484/121 167/483/121 165/482/121 162/481/121 +f 163/488/122 164/487/122 162/486/122 161/485/122 +f 168/492/123 163/491/123 161/490/123 166/489/123 +f 167/496/124 168/495/124 166/494/124 165/493/124 +f 166/500/125 161/499/125 162/498/125 165/497/125 +f 167/504/126 164/503/126 163/502/126 168/501/126 +o left_hind_leg +v -0.15000000000000002 1.3125 0.75 +v -0.15000000000000002 1.3125 0.4375 +v -0.15000000000000002 0 0.75 +v -0.15000000000000002 0 0.4375 +v -0.4625 1.3125 0.4375 +v -0.4625 1.3125 0.75 +v -0.4625 0 0.4375 +v -0.4625 0 0.75 +vt 0.4921875 0.8359375 +vt 0.53125 0.8359375 +vt 0.53125 0.671875 +vt 0.4921875 0.671875 +vt 0.453125 0.8359375 +vt 0.4921875 0.8359375 +vt 0.4921875 0.671875 +vt 0.453125 0.671875 +vt 0.5703125 0.8359375 +vt 0.609375 0.8359375 +vt 0.609375 0.671875 +vt 0.5703125 0.671875 +vt 0.53125 0.8359375 +vt 0.5703125 0.8359375 +vt 0.5703125 0.671875 +vt 0.53125 0.671875 +vt 0.53125 0.8359375 +vt 0.4921875 0.8359375 +vt 0.4921875 0.875 +vt 0.53125 0.875 +vt 0.5703125 0.875 +vt 0.53125 0.875 +vt 0.53125 0.8359375 +vt 0.5703125 0.8359375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 172/508/127 175/507/127 173/506/127 170/505/127 +f 171/512/128 172/511/128 170/510/128 169/509/128 +f 176/516/129 171/515/129 169/514/129 174/513/129 +f 175/520/130 176/519/130 174/518/130 173/517/130 +f 174/524/131 169/523/131 170/522/131 173/521/131 +f 175/528/132 172/527/132 171/526/132 176/525/132 +o right_hind_leg +v 0.4625 1.3125 0.75 +v 0.4625 1.3125 0.4375 +v 0.4625 0 0.75 +v 0.4625 0 0.4375 +v 0.15000000000000002 1.3125 0.4375 +v 0.15000000000000002 1.3125 0.75 +v 0.15000000000000002 0 0.4375 +v 0.15000000000000002 0 0.75 +vt 0.7734375 0.8359375 +vt 0.8125 0.8359375 +vt 0.8125 0.671875 +vt 0.7734375 0.671875 +vt 0.734375 0.8359375 +vt 0.7734375 0.8359375 +vt 0.7734375 0.671875 +vt 0.734375 0.671875 +vt 0.8515625 0.8359375 +vt 0.890625 0.8359375 +vt 0.890625 0.671875 +vt 0.8515625 0.671875 +vt 0.8125 0.8359375 +vt 0.8515625 0.8359375 +vt 0.8515625 0.671875 +vt 0.8125 0.671875 +vt 0.8125 0.8359375 +vt 0.7734375 0.8359375 +vt 0.7734375 0.875 +vt 0.8125 0.875 +vt 0.8515625 0.875 +vt 0.8125 0.875 +vt 0.8125 0.8359375 +vt 0.8515625 0.8359375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e +f 180/532/133 183/531/133 181/530/133 178/529/133 +f 179/536/134 180/535/134 178/534/134 177/533/134 +f 184/540/135 179/539/135 177/538/135 182/537/135 +f 183/544/136 184/543/136 182/542/136 181/541/136 +f 182/548/137 177/547/137 178/546/137 181/545/137 +f 183/552/138 180/551/138 179/550/138 184/549/138 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/cat.obj b/prismarine-viewer/viewer/lib/entity/models/cat.obj new file mode 100644 index 00000000..8067b5c6 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/cat.obj @@ -0,0 +1,509 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.125 0.625 -0.4375 +v 0.125 0.2500000000000001 -0.4375 +v 0.125 0.625 0.5625 +v 0.125 0.2499999999999999 0.5625 +v -0.125 0.2500000000000001 -0.4375 +v -0.125 0.625 -0.4375 +v -0.125 0.2499999999999999 0.5625 +v -0.125 0.625 0.5625 +vt 0.40625 0.8125 +vt 0.46875 0.8125 +vt 0.46875 0.3125 +vt 0.40625 0.3125 +vt 0.3125 0.8125 +vt 0.40625 0.8125 +vt 0.40625 0.3125 +vt 0.3125 0.3125 +vt 0.5625 0.8125 +vt 0.625 0.8125 +vt 0.625 0.3125 +vt 0.5625 0.3125 +vt 0.46875 0.8125 +vt 0.5625 0.8125 +vt 0.5625 0.3125 +vt 0.46875 0.3125 +vt 0.46875 0.8125 +vt 0.40625 0.8125 +vt 0.40625 1 +vt 0.46875 1 +vt 0.53125 1 +vt 0.46875 1 +vt 0.46875 0.8125 +vt 0.53125 0.8125 +vn 0 -1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 -1 +vn 0 -2.220446049250313e-16 1 +usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o head +v 0.15625 0.6875 -0.4375 +v 0.15625 0.6875 -0.75 +v 0.15625 0.4375 -0.4375 +v 0.15625 0.4375 -0.75 +v -0.15625 0.6875 -0.75 +v -0.15625 0.6875 -0.4375 +v -0.15625 0.4375 -0.75 +v -0.15625 0.4375 -0.4375 +vt 0.078125 0.84375 +vt 0.15625 0.84375 +vt 0.15625 0.71875 +vt 0.078125 0.71875 +vt 0 0.84375 +vt 0.078125 0.84375 +vt 0.078125 0.71875 +vt 0 0.71875 +vt 0.234375 0.84375 +vt 0.3125 0.84375 +vt 0.3125 0.71875 +vt 0.234375 0.71875 +vt 0.15625 0.84375 +vt 0.234375 0.84375 +vt 0.234375 0.71875 +vt 0.15625 0.71875 +vt 0.15625 0.84375 +vt 0.078125 0.84375 +vt 0.078125 1 +vt 0.15625 1 +vt 0.234375 1 +vt 0.15625 1 +vt 0.15625 0.84375 +vt 0.234375 0.84375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o head +v 0.09375 0.5634762499999999 -0.6875 +v 0.09375 0.5634762499999999 -0.8125 +v 0.09375 0.43847625 -0.6875 +v 0.09375 0.43847625 -0.8125 +v -0.09375 0.5634762499999999 -0.8125 +v -0.09375 0.5634762499999999 -0.6875 +v -0.09375 0.43847625 -0.8125 +v -0.09375 0.43847625 -0.6875 +vt 0.03125 0.1875 +vt 0.078125 0.1875 +vt 0.078125 0.125 +vt 0.03125 0.125 +vt 0 0.1875 +vt 0.03125 0.1875 +vt 0.03125 0.125 +vt 0 0.125 +vt 0.109375 0.1875 +vt 0.15625 0.1875 +vt 0.15625 0.125 +vt 0.109375 0.125 +vt 0.078125 0.1875 +vt 0.109375 0.1875 +vt 0.109375 0.125 +vt 0.078125 0.125 +vt 0.078125 0.1875 +vt 0.03125 0.1875 +vt 0.03125 0.25 +vt 0.078125 0.25 +vt 0.125 0.25 +vt 0.078125 0.25 +vt 0.078125 0.1875 +vt 0.125 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o head +v 0.125 0.75 -0.4375 +v 0.125 0.75 -0.5625 +v 0.125 0.6875 -0.4375 +v 0.125 0.6875 -0.5625 +v 0.0625 0.75 -0.5625 +v 0.0625 0.75 -0.4375 +v 0.0625 0.6875 -0.5625 +v 0.0625 0.6875 -0.4375 +vt 0.03125 0.625 +vt 0.046875 0.625 +vt 0.046875 0.59375 +vt 0.03125 0.59375 +vt 0 0.625 +vt 0.03125 0.625 +vt 0.03125 0.59375 +vt 0 0.59375 +vt 0.078125 0.625 +vt 0.09375 0.625 +vt 0.09375 0.59375 +vt 0.078125 0.59375 +vt 0.046875 0.625 +vt 0.078125 0.625 +vt 0.078125 0.59375 +vt 0.046875 0.59375 +vt 0.046875 0.625 +vt 0.03125 0.625 +vt 0.03125 0.6875 +vt 0.046875 0.6875 +vt 0.0625 0.6875 +vt 0.046875 0.6875 +vt 0.046875 0.625 +vt 0.0625 0.625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o head +v -0.0625 0.75 -0.4375 +v -0.0625 0.75 -0.5625 +v -0.0625 0.6875 -0.4375 +v -0.0625 0.6875 -0.5625 +v -0.125 0.75 -0.5625 +v -0.125 0.75 -0.4375 +v -0.125 0.6875 -0.5625 +v -0.125 0.6875 -0.4375 +vt 0.125 0.625 +vt 0.140625 0.625 +vt 0.140625 0.59375 +vt 0.125 0.59375 +vt 0.09375 0.625 +vt 0.125 0.625 +vt 0.125 0.59375 +vt 0.09375 0.59375 +vt 0.171875 0.625 +vt 0.1875 0.625 +vt 0.1875 0.59375 +vt 0.171875 0.59375 +vt 0.140625 0.625 +vt 0.171875 0.625 +vt 0.171875 0.59375 +vt 0.140625 0.59375 +vt 0.140625 0.625 +vt 0.125 0.625 +vt 0.125 0.6875 +vt 0.140625 0.6875 +vt 0.15625 0.6875 +vt 0.140625 0.6875 +vt 0.140625 0.625 +vt 0.15625 0.625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o tail1 +v 0.03125 0.6066941738241591 0.5441941738241594 +v 0.03125 0.5625 0.5 +v 0.03125 0.2531407832308854 0.8977475644174331 +v 0.03125 0.20894660940672616 0.853553390593274 +v -0.03125 0.5625 0.5 +v -0.03125 0.6066941738241591 0.5441941738241594 +v -0.03125 0.20894660940672616 0.853553390593274 +v -0.03125 0.2531407832308854 0.8977475644174331 +vt 0.015625 0.5 +vt 0.03125 0.5 +vt 0.03125 0.25 +vt 0.015625 0.25 +vt 0 0.5 +vt 0.015625 0.5 +vt 0.015625 0.25 +vt 0 0.25 +vt 0.046875 0.5 +vt 0.0625 0.5 +vt 0.0625 0.25 +vt 0.046875 0.25 +vt 0.03125 0.5 +vt 0.046875 0.5 +vt 0.046875 0.25 +vt 0.03125 0.25 +vt 0.03125 0.5 +vt 0.015625 0.5 +vt 0.015625 0.53125 +vt 0.03125 0.53125 +vt 0.046875 0.53125 +vt 0.03125 0.53125 +vt 0.03125 0.5 +vt 0.046875 0.5 +vn 0 -0.7071067811865476 -0.7071067811865475 +vn 1 0 0 +vn 0 0.7071067811865476 0.7071067811865475 +vn -1 0 0 +vn 0 0.7071067811865475 -0.7071067811865476 +vn 0 -0.7071067811865475 0.7071067811865476 +usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o tail2 +v 0.03125 0.27144660940672627 0.8535533905932737 +v 0.03125 0.20894660940672627 0.8535533905932737 +v 0.03125 0.2714466094067264 1.3535533905932737 +v 0.03125 0.20894660940672638 1.3535533905932737 +v -0.03125 0.20894660940672627 0.8535533905932737 +v -0.03125 0.27144660940672627 0.8535533905932737 +v -0.03125 0.20894660940672638 1.3535533905932737 +v -0.03125 0.2714466094067264 1.3535533905932737 +vt 0.078125 0.5 +vt 0.09375 0.5 +vt 0.09375 0.25 +vt 0.078125 0.25 +vt 0.0625 0.5 +vt 0.078125 0.5 +vt 0.078125 0.25 +vt 0.0625 0.25 +vt 0.109375 0.5 +vt 0.125 0.5 +vt 0.125 0.25 +vt 0.109375 0.25 +vt 0.09375 0.5 +vt 0.109375 0.5 +vt 0.109375 0.25 +vt 0.09375 0.25 +vt 0.09375 0.5 +vt 0.078125 0.5 +vt 0.078125 0.53125 +vt 0.09375 0.53125 +vt 0.109375 0.53125 +vt 0.09375 0.53125 +vt 0.09375 0.5 +vt 0.109375 0.5 +vn 0 -1 2.220446049250313e-16 +vn 1 0 0 +vn 0 1 -2.220446049250313e-16 +vn -1 0 0 +vn 0 -2.220446049250313e-16 -1 +vn 0 2.220446049250313e-16 1 +usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o backLegL +v -0.006249999999999978 0.375 0.5 +v -0.006249999999999978 0.375 0.375 +v -0.006249999999999978 0 0.5 +v -0.006249999999999978 0 0.375 +v -0.13124999999999998 0.375 0.375 +v -0.13124999999999998 0.375 0.5 +v -0.13124999999999998 0 0.375 +v -0.13124999999999998 0 0.5 +vt 0.15625 0.53125 +vt 0.1875 0.53125 +vt 0.1875 0.34375 +vt 0.15625 0.34375 +vt 0.125 0.53125 +vt 0.15625 0.53125 +vt 0.15625 0.34375 +vt 0.125 0.34375 +vt 0.21875 0.53125 +vt 0.25 0.53125 +vt 0.25 0.34375 +vt 0.21875 0.34375 +vt 0.1875 0.53125 +vt 0.21875 0.53125 +vt 0.21875 0.34375 +vt 0.1875 0.34375 +vt 0.1875 0.53125 +vt 0.15625 0.53125 +vt 0.15625 0.59375 +vt 0.1875 0.59375 +vt 0.21875 0.59375 +vt 0.1875 0.59375 +vt 0.1875 0.53125 +vt 0.21875 0.53125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o backLegR +v 0.13124999999999998 0.375 0.5 +v 0.13124999999999998 0.375 0.375 +v 0.13124999999999998 0 0.5 +v 0.13124999999999998 0 0.375 +v 0.006249999999999978 0.375 0.375 +v 0.006249999999999978 0.375 0.5 +v 0.006249999999999978 0 0.375 +v 0.006249999999999978 0 0.5 +vt 0.15625 0.53125 +vt 0.1875 0.53125 +vt 0.1875 0.34375 +vt 0.15625 0.34375 +vt 0.125 0.53125 +vt 0.15625 0.53125 +vt 0.15625 0.34375 +vt 0.125 0.34375 +vt 0.21875 0.53125 +vt 0.25 0.53125 +vt 0.25 0.34375 +vt 0.21875 0.34375 +vt 0.1875 0.53125 +vt 0.21875 0.53125 +vt 0.21875 0.34375 +vt 0.1875 0.34375 +vt 0.1875 0.53125 +vt 0.15625 0.53125 +vt 0.15625 0.59375 +vt 0.1875 0.59375 +vt 0.21875 0.59375 +vt 0.1875 0.59375 +vt 0.1875 0.53125 +vt 0.21875 0.53125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o frontLegL +v -0.012500000000000011 0.6375 -0.1875 +v -0.012500000000000011 0.6375 -0.3125 +v -0.012500000000000011 0.012499999999999956 -0.1875 +v -0.012500000000000011 0.012499999999999956 -0.3125 +v -0.1375 0.6375 -0.3125 +v -0.1375 0.6375 -0.1875 +v -0.1375 0.012499999999999956 -0.3125 +v -0.1375 0.012499999999999956 -0.1875 +vt 0.65625 0.9375 +vt 0.6875 0.9375 +vt 0.6875 0.625 +vt 0.65625 0.625 +vt 0.625 0.9375 +vt 0.65625 0.9375 +vt 0.65625 0.625 +vt 0.625 0.625 +vt 0.71875 0.9375 +vt 0.75 0.9375 +vt 0.75 0.625 +vt 0.71875 0.625 +vt 0.6875 0.9375 +vt 0.71875 0.9375 +vt 0.71875 0.625 +vt 0.6875 0.625 +vt 0.6875 0.9375 +vt 0.65625 0.9375 +vt 0.65625 1 +vt 0.6875 1 +vt 0.71875 1 +vt 0.6875 1 +vt 0.6875 0.9375 +vt 0.71875 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o frontLegR +v 0.13749999999999996 0.6375 -0.1875 +v 0.13749999999999996 0.6375 -0.3125 +v 0.13749999999999996 0.012499999999999956 -0.1875 +v 0.13749999999999996 0.012499999999999956 -0.3125 +v 0.012499999999999956 0.6375 -0.3125 +v 0.012499999999999956 0.6375 -0.1875 +v 0.012499999999999956 0.012499999999999956 -0.3125 +v 0.012499999999999956 0.012499999999999956 -0.1875 +vt 0.65625 0.9375 +vt 0.6875 0.9375 +vt 0.6875 0.625 +vt 0.65625 0.625 +vt 0.625 0.9375 +vt 0.65625 0.9375 +vt 0.65625 0.625 +vt 0.625 0.625 +vt 0.71875 0.9375 +vt 0.75 0.9375 +vt 0.75 0.625 +vt 0.71875 0.625 +vt 0.6875 0.9375 +vt 0.71875 0.9375 +vt 0.71875 0.625 +vt 0.6875 0.625 +vt 0.6875 0.9375 +vt 0.65625 0.9375 +vt 0.65625 1 +vt 0.6875 1 +vt 0.71875 1 +vt 0.6875 1 +vt 0.6875 0.9375 +vt 0.71875 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/chicken.obj b/prismarine-viewer/viewer/lib/entity/models/chicken.obj new file mode 100644 index 00000000..ec873ffd --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/chicken.obj @@ -0,0 +1,371 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.1875 0.6875 -0.25 +v 0.1875 0.3125 -0.25 +v 0.1875 0.6875 0.25 +v 0.1875 0.3125 0.25 +v -0.1875 0.3125 -0.25 +v -0.1875 0.6875 -0.25 +v -0.1875 0.3125 0.25 +v -0.1875 0.6875 0.25 +vt 0.09375 0.53125 +vt 0.1875 0.53125 +vt 0.1875 0.28125 +vt 0.09375 0.28125 +vt 0 0.53125 +vt 0.09375 0.53125 +vt 0.09375 0.28125 +vt 0 0.28125 +vt 0.28125 0.53125 +vt 0.375 0.53125 +vt 0.375 0.28125 +vt 0.28125 0.28125 +vt 0.1875 0.53125 +vt 0.28125 0.53125 +vt 0.28125 0.28125 +vt 0.1875 0.28125 +vt 0.1875 0.53125 +vt 0.09375 0.53125 +vt 0.09375 0.71875 +vt 0.1875 0.71875 +vt 0.28125 0.71875 +vt 0.1875 0.71875 +vt 0.1875 0.53125 +vt 0.28125 0.53125 +vn 0 -1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 -1 +vn 0 -2.220446049250313e-16 1 +usemtl m_a3a58acf-2885-3588-3386-06528bca041b +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o head +v 0.125 0.9375 -0.1875 +v 0.125 0.9375 -0.375 +v 0.125 0.5625 -0.1875 +v 0.125 0.5625 -0.375 +v -0.125 0.9375 -0.375 +v -0.125 0.9375 -0.1875 +v -0.125 0.5625 -0.375 +v -0.125 0.5625 -0.1875 +vt 0.046875 0.90625 +vt 0.109375 0.90625 +vt 0.109375 0.71875 +vt 0.046875 0.71875 +vt 0 0.90625 +vt 0.046875 0.90625 +vt 0.046875 0.71875 +vt 0 0.71875 +vt 0.15625 0.90625 +vt 0.21875 0.90625 +vt 0.21875 0.71875 +vt 0.15625 0.71875 +vt 0.109375 0.90625 +vt 0.15625 0.90625 +vt 0.15625 0.71875 +vt 0.109375 0.71875 +vt 0.109375 0.90625 +vt 0.046875 0.90625 +vt 0.046875 1 +vt 0.109375 1 +vt 0.171875 1 +vt 0.109375 1 +vt 0.109375 0.90625 +vt 0.171875 0.90625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_a3a58acf-2885-3588-3386-06528bca041b +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o comb +v 0.0625 0.6875 -0.3125 +v 0.0625 0.6875 -0.4375 +v 0.0625 0.5625 -0.3125 +v 0.0625 0.5625 -0.4375 +v -0.0625 0.6875 -0.4375 +v -0.0625 0.6875 -0.3125 +v -0.0625 0.5625 -0.4375 +v -0.0625 0.5625 -0.3125 +vt 0.25 0.8125 +vt 0.28125 0.8125 +vt 0.28125 0.75 +vt 0.25 0.75 +vt 0.21875 0.8125 +vt 0.25 0.8125 +vt 0.25 0.75 +vt 0.21875 0.75 +vt 0.3125 0.8125 +vt 0.34375 0.8125 +vt 0.34375 0.75 +vt 0.3125 0.75 +vt 0.28125 0.8125 +vt 0.3125 0.8125 +vt 0.3125 0.75 +vt 0.28125 0.75 +vt 0.28125 0.8125 +vt 0.25 0.8125 +vt 0.25 0.875 +vt 0.28125 0.875 +vt 0.3125 0.875 +vt 0.28125 0.875 +vt 0.28125 0.8125 +vt 0.3125 0.8125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_a3a58acf-2885-3588-3386-06528bca041b +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o beak +v 0.125 0.8224431423663936 -0.35273540157455374 +v 0.125 0.8333376102098509 -0.4772597388360219 +v 0.125 0.6979188051049254 -0.363629869418011 +v 0.125 0.7088132729483827 -0.4881542066794792 +v -0.125 0.8333376102098509 -0.4772597388360219 +v -0.125 0.8224431423663936 -0.35273540157455374 +v -0.125 0.7088132729483827 -0.4881542066794792 +v -0.125 0.6979188051049254 -0.363629869418011 +vt 0.25 0.9375 +vt 0.3125 0.9375 +vt 0.3125 0.875 +vt 0.25 0.875 +vt 0.21875 0.9375 +vt 0.25 0.9375 +vt 0.25 0.875 +vt 0.21875 0.875 +vt 0.34375 0.9375 +vt 0.40625 0.9375 +vt 0.40625 0.875 +vt 0.34375 0.875 +vt 0.3125 0.9375 +vt 0.34375 0.9375 +vt 0.34375 0.875 +vt 0.3125 0.875 +vt 0.3125 0.9375 +vt 0.25 0.9375 +vt 0.25 1 +vt 0.3125 1 +vt 0.375 1 +vt 0.3125 1 +vt 0.3125 0.9375 +vt 0.375 0.9375 +vn 0 0.08715574274765818 -0.9961946980917455 +vn 1 0 0 +vn 0 -0.08715574274765818 0.9961946980917455 +vn -1 0 0 +vn 0 0.9961946980917455 0.08715574274765818 +vn 0 -0.9961946980917455 -0.08715574274765818 +usemtl m_a3a58acf-2885-3588-3386-06528bca041b +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o leg0 +v 0.1875 0.3125 0.0625 +v 0.1875 0.3125 -0.125 +v 0.1875 0 0.0625 +v 0.1875 0 -0.125 +v 0 0.3125 -0.125 +v 0 0.3125 0.0625 +v 0 0 -0.125 +v 0 0 0.0625 +vt 0.453125 0.90625 +vt 0.5 0.90625 +vt 0.5 0.75 +vt 0.453125 0.75 +vt 0.40625 0.90625 +vt 0.453125 0.90625 +vt 0.453125 0.75 +vt 0.40625 0.75 +vt 0.546875 0.90625 +vt 0.59375 0.90625 +vt 0.59375 0.75 +vt 0.546875 0.75 +vt 0.5 0.90625 +vt 0.546875 0.90625 +vt 0.546875 0.75 +vt 0.5 0.75 +vt 0.5 0.90625 +vt 0.453125 0.90625 +vt 0.453125 1 +vt 0.5 1 +vt 0.546875 1 +vt 0.5 1 +vt 0.5 0.90625 +vt 0.546875 0.90625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_a3a58acf-2885-3588-3386-06528bca041b +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o leg1 +v 0 0.3125 0.0625 +v 0 0.3125 -0.125 +v 0 0 0.0625 +v 0 0 -0.125 +v -0.1875 0.3125 -0.125 +v -0.1875 0.3125 0.0625 +v -0.1875 0 -0.125 +v -0.1875 0 0.0625 +vt 0.453125 0.90625 +vt 0.5 0.90625 +vt 0.5 0.75 +vt 0.453125 0.75 +vt 0.40625 0.90625 +vt 0.453125 0.90625 +vt 0.453125 0.75 +vt 0.40625 0.75 +vt 0.546875 0.90625 +vt 0.59375 0.90625 +vt 0.59375 0.75 +vt 0.546875 0.75 +vt 0.5 0.90625 +vt 0.546875 0.90625 +vt 0.546875 0.75 +vt 0.5 0.75 +vt 0.5 0.90625 +vt 0.453125 0.90625 +vt 0.453125 1 +vt 0.5 1 +vt 0.546875 1 +vt 0.5 1 +vt 0.5 0.90625 +vt 0.546875 0.90625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_a3a58acf-2885-3588-3386-06528bca041b +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o wing0 +v 0.25 0.6875 0.1875 +v 0.25 0.6875 -0.1875 +v 0.25 0.4375 0.1875 +v 0.25 0.4375 -0.1875 +v 0.1875 0.6875 -0.1875 +v 0.1875 0.6875 0.1875 +v 0.1875 0.4375 -0.1875 +v 0.1875 0.4375 0.1875 +vt 0.46875 0.40625 +vt 0.484375 0.40625 +vt 0.484375 0.28125 +vt 0.46875 0.28125 +vt 0.375 0.40625 +vt 0.46875 0.40625 +vt 0.46875 0.28125 +vt 0.375 0.28125 +vt 0.578125 0.40625 +vt 0.59375 0.40625 +vt 0.59375 0.28125 +vt 0.578125 0.28125 +vt 0.484375 0.40625 +vt 0.578125 0.40625 +vt 0.578125 0.28125 +vt 0.484375 0.28125 +vt 0.484375 0.40625 +vt 0.46875 0.40625 +vt 0.46875 0.59375 +vt 0.484375 0.59375 +vt 0.5 0.59375 +vt 0.484375 0.59375 +vt 0.484375 0.40625 +vt 0.5 0.40625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_a3a58acf-2885-3588-3386-06528bca041b +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o wing1 +v -0.1875 0.6875 0.1875 +v -0.1875 0.6875 -0.1875 +v -0.1875 0.4375 0.1875 +v -0.1875 0.4375 -0.1875 +v -0.25 0.6875 -0.1875 +v -0.25 0.6875 0.1875 +v -0.25 0.4375 -0.1875 +v -0.25 0.4375 0.1875 +vt 0.46875 0.40625 +vt 0.484375 0.40625 +vt 0.484375 0.28125 +vt 0.46875 0.28125 +vt 0.375 0.40625 +vt 0.46875 0.40625 +vt 0.46875 0.28125 +vt 0.375 0.28125 +vt 0.578125 0.40625 +vt 0.59375 0.40625 +vt 0.59375 0.28125 +vt 0.578125 0.28125 +vt 0.484375 0.40625 +vt 0.578125 0.40625 +vt 0.578125 0.28125 +vt 0.484375 0.28125 +vt 0.484375 0.40625 +vt 0.46875 0.40625 +vt 0.46875 0.59375 +vt 0.484375 0.59375 +vt 0.5 0.59375 +vt 0.484375 0.59375 +vt 0.484375 0.40625 +vt 0.5 0.40625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_a3a58acf-2885-3588-3386-06528bca041b +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/cod.obj b/prismarine-viewer/viewer/lib/entity/models/cod.obj new file mode 100644 index 00000000..2b469b8b --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/cod.obj @@ -0,0 +1,371 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.0625 0.25 0.5 +v 0.0625 0.25 0.0625 +v 0.0625 0 0.5 +v 0.0625 0 0.0625 +v -0.0625 0.25 0.0625 +v -0.0625 0.25 0.5 +v -0.0625 0 0.0625 +v -0.0625 0 0.5 +vt 0.21875 0.78125 +vt 0.28125 0.78125 +vt 0.28125 0.65625 +vt 0.21875 0.65625 +vt 0 0.78125 +vt 0.21875 0.78125 +vt 0.21875 0.65625 +vt 0 0.65625 +vt 0.5 0.78125 +vt 0.5625 0.78125 +vt 0.5625 0.65625 +vt 0.5 0.65625 +vt 0.28125 0.78125 +vt 0.5 0.78125 +vt 0.5 0.65625 +vt 0.28125 0.65625 +vt 0.28125 0.78125 +vt 0.21875 0.78125 +vt 0.21875 1 +vt 0.28125 1 +vt 0.34375 1 +vt 0.28125 1 +vt 0.28125 0.78125 +vt 0.34375 0.78125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o body +v 0 0.3125 0.375 +v 0 0.3125 0 +v 0 0.25 0.375 +v 0 0.25 0 +v 0 0.3125 0 +v 0 0.3125 0.375 +v 0 0.25 0 +v 0 0.25 0.375 +vt 0.8125 1 +vt 0.8125 1 +vt 0.8125 0.96875 +vt 0.8125 0.96875 +vt 0.625 1 +vt 0.8125 1 +vt 0.8125 0.96875 +vt 0.625 0.96875 +vt 1 1 +vt 1 1 +vt 1 0.96875 +vt 1 0.96875 +vt 0.8125 1 +vt 1 1 +vt 1 0.96875 +vt 0.8125 0.96875 +vt 0.8125 1 +vt 0.8125 1 +vt 0.8125 1.1875 +vt 0.8125 1.1875 +vt 0.8125 1.1875 +vt 0.8125 1.1875 +vt 0.8125 1 +vt 0.8125 1 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o body +v 0 0 0.3125 +v 0 0 0.1875 +v 0 -0.0625 0.3125 +v 0 -0.0625 0.1875 +v 0 0 0.1875 +v 0 0 0.3125 +v 0 -0.0625 0.1875 +v 0 -0.0625 0.3125 +vt 0.75 0.96875 +vt 0.75 0.96875 +vt 0.75 0.9375 +vt 0.75 0.9375 +vt 0.6875 0.96875 +vt 0.75 0.96875 +vt 0.75 0.9375 +vt 0.6875 0.9375 +vt 0.8125 0.96875 +vt 0.8125 0.96875 +vt 0.8125 0.9375 +vt 0.8125 0.9375 +vt 0.75 0.96875 +vt 0.8125 0.96875 +vt 0.8125 0.9375 +vt 0.75 0.9375 +vt 0.75 0.96875 +vt 0.75 0.96875 +vt 0.75 1.03125 +vt 0.75 1.03125 +vt 0.75 1.03125 +vt 0.75 1.03125 +vt 0.75 0.96875 +vt 0.75 0.96875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o head +v 0.062450000000000006 0.25005 -0.125 +v 0.062450000000000006 0.25005 -0.1875 +v 0.062450000000000006 0.06255 -0.125 +v 0.062450000000000006 0.06255 -0.1875 +v -0.06255 0.25005 -0.1875 +v -0.06255 0.25005 -0.125 +v -0.06255 0.06255 -0.1875 +v -0.06255 0.06255 -0.125 +vt 0.03125 0.96875 +vt 0.09375 0.96875 +vt 0.09375 0.875 +vt 0.03125 0.875 +vt 0 0.96875 +vt 0.03125 0.96875 +vt 0.03125 0.875 +vt 0 0.875 +vt 0.125 0.96875 +vt 0.1875 0.96875 +vt 0.1875 0.875 +vt 0.125 0.875 +vt 0.09375 0.96875 +vt 0.125 0.96875 +vt 0.125 0.875 +vt 0.09375 0.875 +vt 0.09375 0.96875 +vt 0.03125 0.96875 +vt 0.03125 1 +vt 0.09375 1 +vt 0.15625 1 +vt 0.09375 1 +vt 0.09375 0.96875 +vt 0.15625 0.96875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o head +v 0.0625 0.25 0.0625 +v 0.0625 0.25 -0.125 +v 0.0625 0 0.0625 +v 0.0625 0 -0.125 +v -0.0625 0.25 -0.125 +v -0.0625 0.25 0.0625 +v -0.0625 0 -0.125 +v -0.0625 0 0.0625 +vt 0.4375 0.90625 +vt 0.5 0.90625 +vt 0.5 0.78125 +vt 0.4375 0.78125 +vt 0.34375 0.90625 +vt 0.4375 0.90625 +vt 0.4375 0.78125 +vt 0.34375 0.78125 +vt 0.59375 0.90625 +vt 0.65625 0.90625 +vt 0.65625 0.78125 +vt 0.59375 0.78125 +vt 0.5 0.90625 +vt 0.59375 0.90625 +vt 0.59375 0.78125 +vt 0.5 0.78125 +vt 0.5 0.90625 +vt 0.4375 0.90625 +vt 0.4375 1 +vt 0.5 1 +vt 0.5625 1 +vt 0.5 1 +vt 0.5 0.90625 +vt 0.5625 0.90625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o leftFin +v -0.0625 0.0625 0.125 +v -0.0625 0.0625 0 +v -0.026651472728059622 0.011302997231938061 0.125 +v -0.026651472728059622 0.011302997231938061 0 +v -0.164894005536124 -0.009197054543880756 0 +v -0.164894005536124 -0.009197054543880756 0.125 +v -0.12904547826418356 -0.06039405731194275 0 +v -0.12904547826418356 -0.06039405731194275 0.125 +vt 0.8125 0.8125 +vt 0.875 0.8125 +vt 0.875 0.78125 +vt 0.8125 0.78125 +vt 0.75 0.8125 +vt 0.8125 0.8125 +vt 0.8125 0.78125 +vt 0.75 0.78125 +vt 0.9375 0.8125 +vt 1 0.8125 +vt 1 0.78125 +vt 0.9375 0.78125 +vt 0.875 0.8125 +vt 0.9375 0.8125 +vt 0.9375 0.78125 +vt 0.875 0.78125 +vt 0.875 0.8125 +vt 0.8125 0.8125 +vt 0.8125 0.875 +vt 0.875 0.875 +vt 0.9375 0.875 +vt 0.875 0.875 +vt 0.875 0.8125 +vt 0.9375 0.8125 +vn 0 0 -1 +vn 0.8191520442889918 0.573576436351046 0 +vn 0 0 1 +vn -0.8191520442889918 -0.573576436351046 0 +vn -0.573576436351046 0.8191520442889918 0 +vn 0.573576436351046 -0.8191520442889918 0 +usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o rightFin +v 0.164894005536124 -0.009197054543880756 0.125 +v 0.164894005536124 -0.009197054543880756 0 +v 0.12904547826418356 -0.06039405731194275 0.125 +v 0.12904547826418356 -0.06039405731194275 0 +v 0.0625 0.0625 0 +v 0.0625 0.0625 0.125 +v 0.026651472728059566 0.011302997231938061 0 +v 0.026651472728059566 0.011302997231938061 0.125 +vt 0.8125 0.90625 +vt 0.875 0.90625 +vt 0.875 0.875 +vt 0.8125 0.875 +vt 0.75 0.90625 +vt 0.8125 0.90625 +vt 0.8125 0.875 +vt 0.75 0.875 +vt 0.9375 0.90625 +vt 1 0.90625 +vt 1 0.875 +vt 0.9375 0.875 +vt 0.875 0.90625 +vt 0.9375 0.90625 +vt 0.9375 0.875 +vt 0.875 0.875 +vt 0.875 0.90625 +vt 0.8125 0.90625 +vt 0.8125 0.96875 +vt 0.875 0.96875 +vt 0.9375 0.96875 +vt 0.875 0.96875 +vt 0.875 0.90625 +vt 0.9375 0.90625 +vn 0 0 -1 +vn 0.8191520442889918 -0.573576436351046 0 +vn 0 0 1 +vn -0.8191520442889918 0.573576436351046 0 +vn 0.573576436351046 0.8191520442889918 0 +vn -0.573576436351046 -0.8191520442889918 0 +usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o tailfin +v 0 0.25 0.875 +v 0 0.25 0.5 +v 0 0 0.875 +v 0 0 0.5 +v 0 0.25 0.5 +v 0 0.25 0.875 +v 0 0 0.5 +v 0 0 0.875 +vt 0.8125 0.78125 +vt 0.8125 0.78125 +vt 0.8125 0.65625 +vt 0.8125 0.65625 +vt 0.625 0.78125 +vt 0.8125 0.78125 +vt 0.8125 0.65625 +vt 0.625 0.65625 +vt 1 0.78125 +vt 1 0.78125 +vt 1 0.65625 +vt 1 0.65625 +vt 0.8125 0.78125 +vt 1 0.78125 +vt 1 0.65625 +vt 0.8125 0.65625 +vt 0.8125 0.78125 +vt 0.8125 0.78125 +vt 0.8125 0.96875 +vt 0.8125 0.96875 +vt 0.8125 0.96875 +vt 0.8125 0.96875 +vt 0.8125 0.78125 +vt 0.8125 0.78125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/creeper.obj b/prismarine-viewer/viewer/lib/entity/models/creeper.obj new file mode 100644 index 00000000..2e68c50e --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/creeper.obj @@ -0,0 +1,279 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o Body +v 0.25 1.125 0.125 +v 0.25 1.125 -0.125 +v 0.25 0.375 0.125 +v 0.25 0.375 -0.125 +v -0.25 1.125 -0.125 +v -0.25 1.125 0.125 +v -0.25 0.375 -0.125 +v -0.25 0.375 0.125 +vt 0.3125 0.375 +vt 0.4375 0.375 +vt 0.4375 0 +vt 0.3125 0 +vt 0.25 0.375 +vt 0.3125 0.375 +vt 0.3125 0 +vt 0.25 0 +vt 0.5 0.375 +vt 0.625 0.375 +vt 0.625 0 +vt 0.5 0 +vt 0.4375 0.375 +vt 0.5 0.375 +vt 0.5 0 +vt 0.4375 0 +vt 0.4375 0.375 +vt 0.3125 0.375 +vt 0.3125 0.5 +vt 0.4375 0.5 +vt 0.5625 0.5 +vt 0.4375 0.5 +vt 0.4375 0.375 +vt 0.5625 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_5d56b934-8e1a-577b-049f-fb19876a8641 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o Head +v 0.25 1.625 0.25 +v 0.25 1.625 -0.25 +v 0.25 1.125 0.25 +v 0.25 1.125 -0.25 +v -0.25 1.625 -0.25 +v -0.25 1.625 0.25 +v -0.25 1.125 -0.25 +v -0.25 1.125 0.25 +vt 0.125 0.75 +vt 0.25 0.75 +vt 0.25 0.5 +vt 0.125 0.5 +vt 0 0.75 +vt 0.125 0.75 +vt 0.125 0.5 +vt 0 0.5 +vt 0.375 0.75 +vt 0.5 0.75 +vt 0.5 0.5 +vt 0.375 0.5 +vt 0.25 0.75 +vt 0.375 0.75 +vt 0.375 0.5 +vt 0.25 0.5 +vt 0.25 0.75 +vt 0.125 0.75 +vt 0.125 1 +vt 0.25 1 +vt 0.375 1 +vt 0.25 1 +vt 0.25 0.75 +vt 0.375 0.75 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_5d56b934-8e1a-577b-049f-fb19876a8641 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o leg0 +v 0.25 0.375 0.375 +v 0.25 0.375 0.125 +v 0.25 0 0.375 +v 0.25 0 0.125 +v 0 0.375 0.125 +v 0 0.375 0.375 +v 0 0 0.125 +v 0 0 0.375 +vt 0.0625 0.375 +vt 0.125 0.375 +vt 0.125 0.1875 +vt 0.0625 0.1875 +vt 0 0.375 +vt 0.0625 0.375 +vt 0.0625 0.1875 +vt 0 0.1875 +vt 0.1875 0.375 +vt 0.25 0.375 +vt 0.25 0.1875 +vt 0.1875 0.1875 +vt 0.125 0.375 +vt 0.1875 0.375 +vt 0.1875 0.1875 +vt 0.125 0.1875 +vt 0.125 0.375 +vt 0.0625 0.375 +vt 0.0625 0.5 +vt 0.125 0.5 +vt 0.1875 0.5 +vt 0.125 0.5 +vt 0.125 0.375 +vt 0.1875 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_5d56b934-8e1a-577b-049f-fb19876a8641 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o leg1 +v 0 0.375 0.375 +v 0 0.375 0.125 +v 0 0 0.375 +v 0 0 0.125 +v -0.25 0.375 0.125 +v -0.25 0.375 0.375 +v -0.25 0 0.125 +v -0.25 0 0.375 +vt 0.0625 0.375 +vt 0.125 0.375 +vt 0.125 0.1875 +vt 0.0625 0.1875 +vt 0 0.375 +vt 0.0625 0.375 +vt 0.0625 0.1875 +vt 0 0.1875 +vt 0.1875 0.375 +vt 0.25 0.375 +vt 0.25 0.1875 +vt 0.1875 0.1875 +vt 0.125 0.375 +vt 0.1875 0.375 +vt 0.1875 0.1875 +vt 0.125 0.1875 +vt 0.125 0.375 +vt 0.0625 0.375 +vt 0.0625 0.5 +vt 0.125 0.5 +vt 0.1875 0.5 +vt 0.125 0.5 +vt 0.125 0.375 +vt 0.1875 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_5d56b934-8e1a-577b-049f-fb19876a8641 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o leg2 +v 0.25 0.375 -0.125 +v 0.25 0.375 -0.375 +v 0.25 0 -0.125 +v 0.25 0 -0.375 +v 0 0.375 -0.375 +v 0 0.375 -0.125 +v 0 0 -0.375 +v 0 0 -0.125 +vt 0.0625 0.375 +vt 0.125 0.375 +vt 0.125 0.1875 +vt 0.0625 0.1875 +vt 0 0.375 +vt 0.0625 0.375 +vt 0.0625 0.1875 +vt 0 0.1875 +vt 0.1875 0.375 +vt 0.25 0.375 +vt 0.25 0.1875 +vt 0.1875 0.1875 +vt 0.125 0.375 +vt 0.1875 0.375 +vt 0.1875 0.1875 +vt 0.125 0.1875 +vt 0.125 0.375 +vt 0.0625 0.375 +vt 0.0625 0.5 +vt 0.125 0.5 +vt 0.1875 0.5 +vt 0.125 0.5 +vt 0.125 0.375 +vt 0.1875 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_5d56b934-8e1a-577b-049f-fb19876a8641 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o leg3 +v 0 0.375 -0.125 +v 0 0.375 -0.375 +v 0 0 -0.125 +v 0 0 -0.375 +v -0.25 0.375 -0.375 +v -0.25 0.375 -0.125 +v -0.25 0 -0.375 +v -0.25 0 -0.125 +vt 0.0625 0.375 +vt 0.125 0.375 +vt 0.125 0.1875 +vt 0.0625 0.1875 +vt 0 0.375 +vt 0.0625 0.375 +vt 0.0625 0.1875 +vt 0 0.1875 +vt 0.1875 0.375 +vt 0.25 0.375 +vt 0.25 0.1875 +vt 0.1875 0.1875 +vt 0.125 0.375 +vt 0.1875 0.375 +vt 0.1875 0.1875 +vt 0.125 0.1875 +vt 0.125 0.375 +vt 0.0625 0.375 +vt 0.0625 0.5 +vt 0.125 0.5 +vt 0.1875 0.5 +vt 0.125 0.5 +vt 0.125 0.375 +vt 0.1875 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_5d56b934-8e1a-577b-049f-fb19876a8641 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/dolphin.obj b/prismarine-viewer/viewer/lib/entity/models/dolphin.obj new file mode 100644 index 00000000..478ce015 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/dolphin.obj @@ -0,0 +1,371 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.25 0.4375 0.625 +v 0.25 0.4375 -0.1875 +v 0.25 0 0.625 +v 0.25 0 -0.1875 +v -0.25 0.4375 -0.1875 +v -0.25 0.4375 0.625 +v -0.25 0 -0.1875 +v -0.25 0 0.625 +vt 0.546875 0.796875 +vt 0.671875 0.796875 +vt 0.671875 0.6875 +vt 0.546875 0.6875 +vt 0.34375 0.796875 +vt 0.546875 0.796875 +vt 0.546875 0.6875 +vt 0.34375 0.6875 +vt 0.875 0.796875 +vt 1 0.796875 +vt 1 0.6875 +vt 0.875 0.6875 +vt 0.671875 0.796875 +vt 0.875 0.796875 +vt 0.875 0.6875 +vt 0.671875 0.6875 +vt 0.671875 0.796875 +vt 0.546875 0.796875 +vt 0.546875 1 +vt 0.671875 1 +vt 0.796875 1 +vt 0.671875 1 +vt 0.671875 0.796875 +vt 0.796875 0.796875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o head +v 0.25 0.4375 -0.1875 +v 0.25 0.4375 -0.5625 +v 0.25 0 -0.1875 +v 0.25 0 -0.5625 +v -0.25 0.4375 -0.5625 +v -0.25 0.4375 -0.1875 +v -0.25 0 -0.5625 +v -0.25 0 -0.1875 +vt 0.09375 0.90625 +vt 0.21875 0.90625 +vt 0.21875 0.796875 +vt 0.09375 0.796875 +vt 0 0.90625 +vt 0.09375 0.90625 +vt 0.09375 0.796875 +vt 0 0.796875 +vt 0.3125 0.90625 +vt 0.4375 0.90625 +vt 0.4375 0.796875 +vt 0.3125 0.796875 +vt 0.21875 0.90625 +vt 0.3125 0.90625 +vt 0.3125 0.796875 +vt 0.21875 0.796875 +vt 0.21875 0.90625 +vt 0.09375 0.90625 +vt 0.09375 1 +vt 0.21875 1 +vt 0.34375 1 +vt 0.21875 1 +vt 0.21875 0.90625 +vt 0.34375 0.90625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o nose +v 0.0625 0.125 -0.5625 +v 0.0625 0.125 -0.8125 +v 0.0625 0 -0.5625 +v 0.0625 0 -0.8125 +v -0.0625 0.125 -0.8125 +v -0.0625 0.125 -0.5625 +v -0.0625 0 -0.8125 +v -0.0625 0 -0.5625 +vt 0.0625 0.734375 +vt 0.09375 0.734375 +vt 0.09375 0.703125 +vt 0.0625 0.703125 +vt 0 0.734375 +vt 0.0625 0.734375 +vt 0.0625 0.703125 +vt 0 0.703125 +vt 0.15625 0.734375 +vt 0.1875 0.734375 +vt 0.1875 0.703125 +vt 0.15625 0.703125 +vt 0.09375 0.734375 +vt 0.15625 0.734375 +vt 0.15625 0.703125 +vt 0.09375 0.703125 +vt 0.09375 0.734375 +vt 0.0625 0.734375 +vt 0.0625 0.796875 +vt 0.09375 0.796875 +vt 0.125 0.796875 +vt 0.09375 0.796875 +vt 0.09375 0.734375 +vt 0.125 0.734375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o tail +v 0.125 0.25743308235954887 1.3237397711116625 +v 0.125 0.31735265549856384 0.6388559161735876 +v 0.125 -0.0538777607941216 1.2965036015030194 +v 0.125 0.006041812344893427 0.6116197465649442 +v -0.125 0.31735265549856384 0.6388559161735876 +v -0.125 0.25743308235954887 1.3237397711116625 +v -0.125 0.006041812344893427 0.6116197465649442 +v -0.125 -0.0538777607941216 1.2965036015030194 +vt 0.171875 0.53125 +vt 0.234375 0.53125 +vt 0.234375 0.453125 +vt 0.171875 0.453125 +vt 0 0.53125 +vt 0.171875 0.53125 +vt 0.171875 0.453125 +vt 0 0.453125 +vt 0.40625 0.53125 +vt 0.46875 0.53125 +vt 0.46875 0.453125 +vt 0.40625 0.453125 +vt 0.234375 0.53125 +vt 0.40625 0.53125 +vt 0.40625 0.453125 +vt 0.234375 0.453125 +vt 0.234375 0.53125 +vt 0.171875 0.53125 +vt 0.171875 0.703125 +vt 0.234375 0.703125 +vt 0.296875 0.703125 +vt 0.234375 0.703125 +vt 0.234375 0.53125 +vt 0.296875 0.53125 +vn 0 0.08715574274765818 -0.9961946980917455 +vn 1 0 0 +vn 0 -0.08715574274765818 0.9961946980917455 +vn -1 0 0 +vn 0 0.9961946980917455 0.08715574274765818 +vn 0 -0.9961946980917455 -0.08715574274765818 +usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o tail_fin +v 0.3125 0.06737675474652305 1.559379883370239 +v 0.3125 0.15173340012547243 1.1939911090757758 +v 0.3125 0.006478625697445839 1.5453204424737472 +v 0.3125 0.09083527107639522 1.1799316681792842 +v -0.3125 0.15173340012547243 1.1939911090757758 +v -0.3125 0.06737675474652305 1.559379883370239 +v -0.3125 0.09083527107639522 1.1799316681792842 +v -0.3125 0.006478625697445839 1.5453204424737472 +vt 0.390625 0.59375 +vt 0.546875 0.59375 +vt 0.546875 0.578125 +vt 0.390625 0.578125 +vt 0.296875 0.59375 +vt 0.390625 0.59375 +vt 0.390625 0.578125 +vt 0.296875 0.578125 +vt 0.640625 0.59375 +vt 0.796875 0.59375 +vt 0.796875 0.578125 +vt 0.640625 0.578125 +vt 0.546875 0.59375 +vt 0.640625 0.59375 +vt 0.640625 0.578125 +vt 0.546875 0.578125 +vt 0.546875 0.59375 +vt 0.390625 0.59375 +vt 0.390625 0.6875 +vt 0.546875 0.6875 +vt 0.703125 0.6875 +vt 0.546875 0.6875 +vt 0.546875 0.59375 +vt 0.703125 0.59375 +vn 0 0.224951054343865 -0.9743700647852354 +vn 1 0 0 +vn 0 -0.224951054343865 0.9743700647852354 +vn -1 0 0 +vn 0 0.9743700647852354 0.224951054343865 +vn 0 -0.9743700647852354 -0.224951054343865 +usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o back_fin +v 0.03125 0.7045071448143734 0.22503005919760444 +v 0.03125 0.4338742061317362 0.06878005919760444 +v 0.03125 0.5795071448143734 0.44153641014371414 +v 0.03125 0.3088742061317362 0.28528641014371414 +v -0.03125 0.4338742061317362 0.06878005919760444 +v -0.03125 0.7045071448143734 0.22503005919760444 +v -0.03125 0.3088742061317362 0.28528641014371414 +v -0.03125 0.5795071448143734 0.44153641014371414 +vt 0.875 0.921875 +vt 0.890625 0.921875 +vt 0.890625 0.859375 +vt 0.875 0.859375 +vt 0.796875 0.921875 +vt 0.875 0.921875 +vt 0.875 0.859375 +vt 0.796875 0.859375 +vt 0.96875 0.921875 +vt 0.984375 0.921875 +vt 0.984375 0.859375 +vt 0.96875 0.859375 +vt 0.890625 0.921875 +vt 0.96875 0.921875 +vt 0.96875 0.859375 +vt 0.890625 0.859375 +vt 0.890625 0.921875 +vt 0.875 0.921875 +vt 0.875 1 +vt 0.890625 1 +vt 0.90625 1 +vt 0.890625 1 +vt 0.890625 0.921875 +vt 0.90625 0.921875 +vn 0 -0.8660254037844386 -0.5000000000000001 +vn 1 0 0 +vn 0 0.8660254037844386 0.5000000000000001 +vn -1 0 0 +vn 0 0.5000000000000001 -0.8660254037844386 +vn 0 -0.5000000000000001 0.8660254037844386 +usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o left_fin +v -0.5939081233075358 0.0007485675108518386 0.11737888892342419 +v -0.25118856264048317 0.1055284523428025 -0.13356080198015846 +v -0.456779654809827 0.04267294763203877 0.32216689999567216 +v -0.11406009414277446 0.14745283246398944 0.07122720909208935 +v -0.2329153310953121 0.04575940509511278 -0.13356080198015846 +v -0.5756348917623646 -0.05902047973683788 0.11737888892342419 +v -0.09578686259760338 0.08768378521629971 0.07122720909208935 +v -0.438506423264656 -0.01709609961565095 0.32216689999567216 +vt 0.859375 0.578125 +vt 0.875 0.578125 +vt 0.875 0.515625 +vt 0.859375 0.515625 +vt 0.75 0.578125 +vt 0.859375 0.578125 +vt 0.859375 0.515625 +vt 0.75 0.515625 +vt 0.984375 0.578125 +vt 1 0.578125 +vt 1 0.515625 +vt 0.984375 0.515625 +vt 0.875 0.578125 +vt 0.984375 0.578125 +vt 0.984375 0.515625 +vt 0.875 0.515625 +vt 0.875 0.578125 +vt 0.859375 0.578125 +vt 0.859375 0.6875 +vt 0.875 0.6875 +vt 0.890625 0.6875 +vt 0.875 0.6875 +vt 0.875 0.578125 +vt 0.890625 0.578125 +vn 0.7833589958104059 0.23949687961588728 -0.5735764363510463 +vn -0.2923717047227367 0.9563047559630355 -8.326672684688674e-17 +vn -0.7833589958104059 -0.23949687961588728 0.5735764363510463 +vn 0.2923717047227367 -0.9563047559630355 8.326672684688674e-17 +vn -0.5485138739908348 -0.16769752048474773 -0.8191520442889918 +vn 0.5485138739908348 0.16769752048474773 0.8191520442889918 +usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o left_fin +v 0.5756348917623646 -0.05902047973683788 0.11737888892342419 +v 0.23291533109531204 0.04575940509511278 -0.13356080198015846 +v 0.43850642326465605 -0.01709609961565095 0.32216689999567216 +v 0.09578686259760338 0.08768378521629971 0.07122720909208935 +v 0.25118856264048317 0.1055284523428025 -0.13356080198015846 +v 0.5939081233075358 0.0007485675108518386 0.11737888892342419 +v 0.1140600941427744 0.14745283246398944 0.07122720909208935 +v 0.4567796548098271 0.04267294763203877 0.32216689999567216 +vt 0.875 0.578125 +vt 0.859375 0.578125 +vt 0.859375 0.515625 +vt 0.875 0.515625 +vt 0.984375 0.578125 +vt 0.875 0.578125 +vt 0.875 0.515625 +vt 0.984375 0.515625 +vt 1 0.578125 +vt 0.984375 0.578125 +vt 0.984375 0.515625 +vt 1 0.515625 +vt 0.859375 0.578125 +vt 0.75 0.578125 +vt 0.75 0.515625 +vt 0.859375 0.515625 +vt 0.859375 0.578125 +vt 0.875 0.578125 +vt 0.875 0.6875 +vt 0.859375 0.6875 +vt 0.875 0.6875 +vt 0.890625 0.6875 +vt 0.890625 0.578125 +vt 0.875 0.578125 +vn -0.7833589958104059 0.23949687961588728 -0.5735764363510463 +vn -0.2923717047227367 -0.9563047559630355 8.326672684688674e-17 +vn 0.7833589958104059 -0.23949687961588728 0.5735764363510463 +vn 0.2923717047227367 0.9563047559630355 -8.326672684688674e-17 +vn 0.5485138739908348 -0.16769752048474773 -0.8191520442889918 +vn -0.5485138739908348 0.16769752048474773 0.8191520442889918 +usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/ender_dragon.obj b/prismarine-viewer/viewer/lib/entity/models/ender_dragon.obj new file mode 100644 index 00000000..84c909a9 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/ender_dragon.obj @@ -0,0 +1,2993 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o neck +v 0.3125 0.7488108431536706 -0.47276383039135683 +v 0.3125 0.803283182370957 -1.0953855166986979 +v 0.3125 0.1261891568463296 -0.5272361696086432 +v 0.3125 0.18066149606361592 -1.1498578559159842 +v -0.3125 0.803283182370957 -1.0953855166986979 +v -0.3125 0.7488108431536706 -0.47276383039135683 +v -0.3125 0.18066149606361592 -1.1498578559159842 +v -0.3125 0.1261891568463296 -0.5272361696086432 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 0.08715574274765818 -0.9961946980917455 +vn 1 0 0 +vn 0 -0.08715574274765818 0.9961946980917455 +vn -1 0 0 +vn 0 0.9961946980917455 0.08715574274765818 +vn 0 -0.9961946980917455 -0.08715574274765818 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o neck +v 0.0625 1.0087539855200642 -0.5754992319659105 +v 0.0625 1.041437389050436 -0.9490722437503151 +v 0.0625 0.7597053109971279 -0.597288167652825 +v 0.0625 0.7923887145274997 -0.9708611794372296 +v -0.0625 1.041437389050436 -0.9490722437503151 +v -0.0625 1.0087539855200642 -0.5754992319659105 +v -0.0625 0.7923887145274997 -0.9708611794372296 +v -0.0625 0.7597053109971279 -0.597288167652825 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 0.08715574274765818 -0.9961946980917455 +vn 1 0 0 +vn 0 -0.08715574274765818 0.9961946980917455 +vn -1 0 0 +vn 0 0.9961946980917455 0.08715574274765818 +vn 0 -0.9961946980917455 -0.08715574274765818 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o neck +v 0.3125 0.8044723392172863 -1.1226216863073408 +v 0.3125 0.8044723392172863 -1.7476216863073408 +v 0.3125 0.17947233921728634 -1.1226216863073408 +v 0.3125 0.17947233921728634 -1.7476216863073408 +v -0.3125 0.8044723392172863 -1.7476216863073408 +v -0.3125 0.8044723392172863 -1.1226216863073408 +v -0.3125 0.17947233921728634 -1.7476216863073408 +v -0.3125 0.17947233921728634 -1.1226216863073408 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o neck +v 0.0625 1.0544723392172863 -1.2476216863073408 +v 0.0625 1.0544723392172863 -1.6226216863073408 +v 0.0625 0.8044723392172863 -1.2476216863073408 +v 0.0625 0.8044723392172863 -1.6226216863073408 +v -0.0625 1.0544723392172863 -1.6226216863073408 +v -0.0625 1.0544723392172863 -1.2476216863073408 +v -0.0625 0.8044723392172863 -1.6226216863073408 +v -0.0625 0.8044723392172863 -1.2476216863073408 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o neck +v 0.3125 0.803283182370957 -1.774857855915984 +v 0.3125 0.7488108431536706 -2.3974795422233246 +v 0.3125 0.18066149606361592 -1.7203855166986977 +v 0.3125 0.12618915684632948 -2.3430072030060387 +v -0.3125 0.7488108431536706 -2.3974795422233246 +v -0.3125 0.803283182370957 -1.774857855915984 +v -0.3125 0.12618915684632948 -2.3430072030060387 +v -0.3125 0.18066149606361592 -1.7203855166986977 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 -0.08715574274765818 -0.9961946980917455 +vn 1 0 0 +vn 0 0.08715574274765818 0.9961946980917455 +vn -1 0 0 +vn 0 0.9961946980917455 -0.08715574274765818 +vn 0 -0.9961946980917455 0.08715574274765818 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o neck +v 0.0625 1.041437389050436 -1.9211711288643667 +v 0.0625 1.0087539855200642 -2.2947441406487714 +v 0.0625 0.7923887145274997 -1.8993821931774522 +v 0.0625 0.7597053109971279 -2.272955204961857 +v -0.0625 1.0087539855200642 -2.2947441406487714 +v -0.0625 1.041437389050436 -1.9211711288643667 +v -0.0625 0.7597053109971279 -2.272955204961857 +v -0.0625 0.7923887145274997 -1.8993821931774522 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 -0.08715574274765818 -0.9961946980917455 +vn 1 0 0 +vn 0 0.08715574274765818 0.9961946980917455 +vn -1 0 0 +vn 0 0.9961946980917455 -0.08715574274765818 +vn 0 -0.9961946980917455 0.08715574274765818 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o neck +v 0.3125 0.7452524228163151 -2.424508428135597 +v 0.3125 0.6367223117744836 -3.0400132737682273 +v 0.3125 0.1297475771836849 -2.315978317093766 +v 0.3125 0.02121746614185338 -2.931483162726396 +v -0.3125 0.6367223117744836 -3.0400132737682273 +v -0.3125 0.7452524228163151 -2.424508428135597 +v -0.3125 0.02121746614185338 -2.931483162726396 +v -0.3125 0.1297475771836849 -2.315978317093766 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 -0.17364817766693036 -0.9848077530122081 +vn 1 0 0 +vn 0 0.17364817766693036 0.9848077530122081 +vn -1 0 0 +vn 0 0.9848077530122081 -0.17364817766693036 +vn 0 -0.9848077530122081 0.17364817766693036 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o neck +v 0.0625 0.9697483388610009 -2.591021441678856 +v 0.0625 0.9046302722359019 -2.960324349058434 +v 0.0625 0.7235464006079488 -2.5476093972621237 +v 0.0625 0.6584283339828498 -2.9169123046417016 +v -0.0625 0.9046302722359019 -2.960324349058434 +v -0.0625 0.9697483388610009 -2.591021441678856 +v -0.0625 0.6584283339828498 -2.9169123046417016 +v -0.0625 0.7235464006079488 -2.5476093972621237 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 -0.17364817766693036 -0.9848077530122081 +vn 1 0 0 +vn 0 0.17364817766693036 0.9848077530122081 +vn -1 0 0 +vn 0 0.9848077530122081 -0.17364817766693036 +vn 0 -0.9848077530122081 0.17364817766693036 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o neck +v 0.3125 0.6308217096735025 -3.0666291698418497 +v 0.3125 0.469059806484427 -3.670332811272517 +v 0.3125 0.027118068242834803 -2.904867266652774 +v 0.3125 -0.13464383494624066 -3.5085709080834415 +v -0.3125 0.469059806484427 -3.670332811272517 +v -0.3125 0.6308217096735025 -3.0666291698418497 +v -0.3125 -0.13464383494624066 -3.5085709080834415 +v -0.3125 0.027118068242834803 -2.904867266652774 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 -0.25881904510252074 -0.9659258262890683 +vn 1 0 0 +vn 0 0.25881904510252074 0.9659258262890683 +vn -1 0 0 +vn 0 0.9659258262890683 -0.25881904510252074 +vn 0 -0.9659258262890683 0.25881904510252074 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o neck +v 0.0625 0.8399507856079544 -3.252074659403613 +v 0.0625 0.7428936436945093 -3.6142968442620136 +v 0.0625 0.5984693290356873 -3.187369898127983 +v 0.0625 0.5014121871222421 -3.5495920829863836 +v -0.0625 0.7428936436945093 -3.6142968442620136 +v -0.0625 0.8399507856079544 -3.252074659403613 +v -0.0625 0.5014121871222421 -3.5495920829863836 +v -0.0625 0.5984693290356873 -3.187369898127983 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 -0.25881904510252074 -0.9659258262890683 +vn 1 0 0 +vn 0 0.25881904510252074 0.9659258262890683 +vn -1 0 0 +vn 0 0.9659258262890683 -0.25881904510252074 +vn 0 -0.9659258262890683 0.25881904510252074 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o head +v 0.375 -0.07332885084174778 -4.433059161823504 +v 0.375 -0.41534899416741644 -5.372751782609413 +v 0.375 -0.3669827948373441 -4.326177867034232 +v 0.375 -0.7090029381630127 -5.265870487820141 +v -0.375 -0.41534899416741644 -5.372751782609413 +v -0.375 -0.07332885084174778 -4.433059161823504 +v -0.375 -0.7090029381630127 -5.265870487820141 +v -0.375 -0.3669827948373441 -4.326177867034232 +vt 0.75 0.765625 +vt 0.796875 0.765625 +vt 0.796875 0.74609375 +vt 0.75 0.74609375 +vt 0.6875 0.765625 +vt 0.75 0.765625 +vt 0.75 0.74609375 +vt 0.6875 0.74609375 +vt 0.859375 0.765625 +vt 0.90625 0.765625 +vt 0.90625 0.74609375 +vt 0.859375 0.74609375 +vt 0.796875 0.765625 +vt 0.859375 0.765625 +vt 0.859375 0.74609375 +vt 0.796875 0.74609375 +vt 0.796875 0.765625 +vt 0.75 0.765625 +vt 0.75 0.828125 +vt 0.796875 0.828125 +vt 0.84375 0.828125 +vt 0.796875 0.828125 +vt 0.796875 0.765625 +vt 0.84375 0.765625 +vn 0 -0.34202014332566877 -0.9396926207859084 +vn 1 0 0 +vn 0 0.34202014332566877 0.9396926207859084 +vn -1 0 0 +vn 0 0.9396926207859084 -0.34202014332566877 +vn 0 -0.9396926207859084 0.34202014332566877 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 +o head +v 0.5 0.6370542961620473 -3.760461931340814 +v 0.5 0.2950341528363787 -4.7001545521267225 +v 0.5 -0.3026383246238611 -3.418441788015145 +v 0.5 -0.6446584679495297 -4.358134408801053 +v -0.5 0.2950341528363787 -4.7001545521267225 +v -0.5 0.6370542961620473 -3.760461931340814 +v -0.5 -0.6446584679495297 -4.358134408801053 +v -0.5 -0.3026383246238611 -3.418441788015145 +vt 0.5 0.8203125 +vt 0.5625 0.8203125 +vt 0.5625 0.7578125 +vt 0.5 0.7578125 +vt 0.4375 0.8203125 +vt 0.5 0.8203125 +vt 0.5 0.7578125 +vt 0.4375 0.7578125 +vt 0.625 0.8203125 +vt 0.6875 0.8203125 +vt 0.6875 0.7578125 +vt 0.625 0.7578125 +vt 0.5625 0.8203125 +vt 0.625 0.8203125 +vt 0.625 0.7578125 +vt 0.5625 0.7578125 +vt 0.5625 0.8203125 +vt 0.5 0.8203125 +vt 0.5 0.8828125 +vt 0.5625 0.8828125 +vt 0.625 0.8828125 +vt 0.5625 0.8828125 +vt 0.5625 0.8203125 +vt 0.625 0.8203125 +vn 0 -0.34202014332566877 -0.9396926207859084 +vn 1 0 0 +vn 0 0.34202014332566877 0.9396926207859084 +vn -1 0 0 +vn 0 0.9396926207859084 -0.34202014332566877 +vn 0 -0.9396926207859084 0.34202014332566877 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 92/268/67 95/267/67 93/266/67 90/265/67 +f 91/272/68 92/271/68 90/270/68 89/269/68 +f 96/276/69 91/275/69 89/274/69 94/273/69 +f 95/280/70 96/279/70 94/278/70 93/277/70 +f 94/284/71 89/283/71 90/282/71 93/281/71 +f 95/288/72 92/287/72 91/286/72 96/285/72 +o head +v 0.3125 0.7864724155271074 -4.080890122368709 +v 0.3125 0.6582148617799817 -4.433274855163424 +v 0.3125 0.5515492603306302 -3.9953850865372913 +v 0.3125 0.42329170658350446 -4.347769819332006 +v 0.1875 0.6582148617799817 -4.433274855163424 +v 0.1875 0.7864724155271074 -4.080890122368709 +v 0.1875 0.42329170658350446 -4.347769819332006 +v 0.1875 0.5515492603306302 -3.9953850865372913 +vt 0.03125 0.9765625 +vt 0.0234375 0.9765625 +vt 0.0234375 0.9609375 +vt 0.03125 0.9609375 +vt 0.0546875 0.9765625 +vt 0.03125 0.9765625 +vt 0.03125 0.9609375 +vt 0.0546875 0.9609375 +vt 0.0625 0.9765625 +vt 0.0546875 0.9765625 +vt 0.0546875 0.9609375 +vt 0.0625 0.9609375 +vt 0.0234375 0.9765625 +vt 0 0.9765625 +vt 0 0.9609375 +vt 0.0234375 0.9609375 +vt 0.0234375 0.9765625 +vt 0.03125 0.9765625 +vt 0.03125 1 +vt 0.0234375 1 +vt 0.03125 1 +vt 0.0390625 1 +vt 0.0390625 0.9765625 +vt 0.03125 0.9765625 +vn 0 -0.34202014332566877 -0.9396926207859084 +vn 1 0 0 +vn 0 0.34202014332566877 0.9396926207859084 +vn -1 0 0 +vn 0 0.9396926207859084 -0.34202014332566877 +vn 0 -0.9396926207859084 0.34202014332566877 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 100/292/73 103/291/73 101/290/73 98/289/73 +f 99/296/74 100/295/74 98/294/74 97/293/74 +f 104/300/75 99/299/75 97/298/75 102/297/75 +f 103/304/76 104/303/76 102/302/76 101/301/76 +f 102/308/77 97/307/77 98/306/77 101/305/77 +f 103/312/78 100/311/78 99/310/78 104/309/78 +o head +v 0.3125 -0.16962986282205206 -5.063119567730405 +v 0.3125 -0.2551348986534694 -5.298042722926883 +v 0.3125 -0.28709144042029067 -5.020367049814697 +v 0.3125 -0.372596476251708 -5.255290205011175 +v 0.1875 -0.2551348986534694 -5.298042722926883 +v 0.1875 -0.16962986282205206 -5.063119567730405 +v 0.1875 -0.372596476251708 -5.255290205011175 +v 0.1875 -0.28709144042029067 -5.020367049814697 +vt 0.4609375 0.984375 +vt 0.453125 0.984375 +vt 0.453125 0.9765625 +vt 0.4609375 0.9765625 +vt 0.4765625 0.984375 +vt 0.4609375 0.984375 +vt 0.4609375 0.9765625 +vt 0.4765625 0.9765625 +vt 0.484375 0.984375 +vt 0.4765625 0.984375 +vt 0.4765625 0.9765625 +vt 0.484375 0.9765625 +vt 0.453125 0.984375 +vt 0.4375 0.984375 +vt 0.4375 0.9765625 +vt 0.453125 0.9765625 +vt 0.453125 0.984375 +vt 0.4609375 0.984375 +vt 0.4609375 1 +vt 0.453125 1 +vt 0.4609375 1 +vt 0.46875 1 +vt 0.46875 0.984375 +vt 0.4609375 0.984375 +vn 0 -0.34202014332566877 -0.9396926207859084 +vn 1 0 0 +vn 0 0.34202014332566877 0.9396926207859084 +vn -1 0 0 +vn 0 0.9396926207859084 -0.34202014332566877 +vn 0 -0.9396926207859084 0.34202014332566877 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 108/316/79 111/315/79 109/314/79 106/313/79 +f 107/320/80 108/319/80 106/318/80 105/317/80 +f 112/324/81 107/323/81 105/322/81 110/321/81 +f 111/328/82 112/327/82 110/326/82 109/325/82 +f 110/332/83 105/331/83 106/330/83 109/329/83 +f 111/336/84 108/335/84 107/334/84 112/333/84 +o head +v -0.1875 0.7864724155271074 -4.080890122368709 +v -0.1875 0.6582148617799817 -4.433274855163424 +v -0.1875 0.5515492603306302 -3.9953850865372913 +v -0.1875 0.42329170658350446 -4.347769819332006 +v -0.3125 0.6582148617799817 -4.433274855163424 +v -0.3125 0.7864724155271074 -4.080890122368709 +v -0.3125 0.42329170658350446 -4.347769819332006 +v -0.3125 0.5515492603306302 -3.9953850865372913 +vt 0.0234375 0.9765625 +vt 0.03125 0.9765625 +vt 0.03125 0.9609375 +vt 0.0234375 0.9609375 +vt 0 0.9765625 +vt 0.0234375 0.9765625 +vt 0.0234375 0.9609375 +vt 0 0.9609375 +vt 0.0546875 0.9765625 +vt 0.0625 0.9765625 +vt 0.0625 0.9609375 +vt 0.0546875 0.9609375 +vt 0.03125 0.9765625 +vt 0.0546875 0.9765625 +vt 0.0546875 0.9609375 +vt 0.03125 0.9609375 +vt 0.03125 0.9765625 +vt 0.0234375 0.9765625 +vt 0.0234375 1 +vt 0.03125 1 +vt 0.0390625 1 +vt 0.03125 1 +vt 0.03125 0.9765625 +vt 0.0390625 0.9765625 +vn 0 -0.34202014332566877 -0.9396926207859084 +vn 1 0 0 +vn 0 0.34202014332566877 0.9396926207859084 +vn -1 0 0 +vn 0 0.9396926207859084 -0.34202014332566877 +vn 0 -0.9396926207859084 0.34202014332566877 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 116/340/85 119/339/85 117/338/85 114/337/85 +f 115/344/86 116/343/86 114/342/86 113/341/86 +f 120/348/87 115/347/87 113/346/87 118/345/87 +f 119/352/88 120/351/88 118/350/88 117/349/88 +f 118/356/89 113/355/89 114/354/89 117/353/89 +f 119/360/90 116/359/90 115/358/90 120/357/90 +o head +v -0.1875 -0.16962986282205206 -5.063119567730405 +v -0.1875 -0.2551348986534694 -5.298042722926883 +v -0.1875 -0.28709144042029067 -5.020367049814697 +v -0.1875 -0.372596476251708 -5.255290205011175 +v -0.3125 -0.2551348986534694 -5.298042722926883 +v -0.3125 -0.16962986282205206 -5.063119567730405 +v -0.3125 -0.372596476251708 -5.255290205011175 +v -0.3125 -0.28709144042029067 -5.020367049814697 +vt 0.453125 0.984375 +vt 0.4609375 0.984375 +vt 0.4609375 0.9765625 +vt 0.453125 0.9765625 +vt 0.4375 0.984375 +vt 0.453125 0.984375 +vt 0.453125 0.9765625 +vt 0.4375 0.9765625 +vt 0.4765625 0.984375 +vt 0.484375 0.984375 +vt 0.484375 0.9765625 +vt 0.4765625 0.9765625 +vt 0.4609375 0.984375 +vt 0.4765625 0.984375 +vt 0.4765625 0.9765625 +vt 0.4609375 0.9765625 +vt 0.4609375 0.984375 +vt 0.453125 0.984375 +vt 0.453125 1 +vt 0.4609375 1 +vt 0.46875 1 +vt 0.4609375 1 +vt 0.4609375 0.984375 +vt 0.46875 0.984375 +vn 0 -0.34202014332566877 -0.9396926207859084 +vn 1 0 0 +vn 0 0.34202014332566877 0.9396926207859084 +vn -1 0 0 +vn 0 0.9396926207859084 -0.34202014332566877 +vn 0 -0.9396926207859084 0.34202014332566877 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 124/364/91 127/363/91 125/362/91 122/361/91 +f 123/368/92 124/367/92 122/366/92 121/365/92 +f 128/372/93 123/371/93 121/370/93 126/369/93 +f 127/376/94 128/375/94 126/374/94 125/373/94 +f 126/380/95 121/379/95 122/378/95 125/377/95 +f 127/384/96 124/383/96 123/382/96 128/381/96 +o jaw +v 0.375 -0.3814550631514302 -4.318644081003175 +v 0.375 -0.9550314995024762 -5.137796125292168 +v 0.375 -0.5862430742236779 -4.175249971915413 +v 0.375 -1.159819510574724 -4.994402016204406 +v -0.375 -0.9550314995024762 -5.137796125292168 +v -0.375 -0.3814550631514302 -4.318644081003175 +v -0.375 -1.159819510574724 -4.994402016204406 +v -0.375 -0.5862430742236779 -4.175249971915413 +vt 0.75 0.68359375 +vt 0.796875 0.68359375 +vt 0.796875 0.66796875 +vt 0.75 0.66796875 +vt 0.6875 0.68359375 +vt 0.75 0.68359375 +vt 0.75 0.66796875 +vt 0.6875 0.66796875 +vt 0.859375 0.68359375 +vt 0.90625 0.68359375 +vt 0.90625 0.66796875 +vt 0.859375 0.66796875 +vt 0.796875 0.68359375 +vt 0.859375 0.68359375 +vt 0.859375 0.66796875 +vt 0.796875 0.66796875 +vt 0.796875 0.68359375 +vt 0.75 0.68359375 +vt 0.75 0.74609375 +vt 0.796875 0.74609375 +vt 0.84375 0.74609375 +vt 0.796875 0.74609375 +vt 0.796875 0.68359375 +vt 0.84375 0.68359375 +vn 0 -0.5735764363510462 -0.8191520442889919 +vn 1 0 0 +vn 0 0.5735764363510462 0.8191520442889919 +vn -1 0 0 +vn 0 0.8191520442889919 -0.5735764363510462 +vn 0 -0.8191520442889919 0.5735764363510462 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 132/388/97 135/387/97 133/386/97 130/385/97 +f 131/392/98 132/391/98 130/390/98 129/389/98 +f 136/396/99 131/395/99 129/394/99 134/393/99 +f 135/400/100 136/399/100 134/398/100 133/397/100 +f 134/404/101 129/403/101 130/402/101 133/401/101 +f 135/408/102 132/407/102 131/406/102 136/405/102 +o body +v 0.75 1.25 3.5 +v 0.75 1.25 -0.5 +v 0.75 -0.25 3.5 +v 0.75 -0.25 -0.5 +v -0.75 1.25 -0.5 +v -0.75 1.25 3.5 +v -0.75 -0.25 -0.5 +v -0.75 -0.25 3.5 +vt 0.25 0.75 +vt 0.34375 0.75 +vt 0.34375 0.65625 +vt 0.25 0.65625 +vt 0 0.75 +vt 0.25 0.75 +vt 0.25 0.65625 +vt 0 0.65625 +vt 0.59375 0.75 +vt 0.6875 0.75 +vt 0.6875 0.65625 +vt 0.59375 0.65625 +vt 0.34375 0.75 +vt 0.59375 0.75 +vt 0.59375 0.65625 +vt 0.34375 0.65625 +vt 0.34375 0.75 +vt 0.25 0.75 +vt 0.25 1 +vt 0.34375 1 +vt 0.4375 1 +vt 0.34375 1 +vt 0.34375 0.75 +vt 0.4375 0.75 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 140/412/103 143/411/103 141/410/103 138/409/103 +f 139/416/104 140/415/104 138/414/104 137/413/104 +f 144/420/105 139/419/105 137/418/105 142/417/105 +f 143/424/106 144/423/106 142/422/106 141/421/106 +f 142/428/107 137/427/107 138/426/107 141/425/107 +f 143/432/108 140/431/108 139/430/108 144/429/108 +o body +v 0.0625 1.625 0.625 +v 0.0625 1.625 -0.125 +v 0.0625 1.25 0.625 +v 0.0625 1.25 -0.125 +v -0.0625 1.625 -0.125 +v -0.0625 1.625 0.625 +v -0.0625 1.25 -0.125 +v -0.0625 1.25 0.625 +vt 0.90625 0.74609375 +vt 0.9140625 0.74609375 +vt 0.9140625 0.72265625 +vt 0.90625 0.72265625 +vt 0.859375 0.74609375 +vt 0.90625 0.74609375 +vt 0.90625 0.72265625 +vt 0.859375 0.72265625 +vt 0.9609375 0.74609375 +vt 0.96875 0.74609375 +vt 0.96875 0.72265625 +vt 0.9609375 0.72265625 +vt 0.9140625 0.74609375 +vt 0.9609375 0.74609375 +vt 0.9609375 0.72265625 +vt 0.9140625 0.72265625 +vt 0.9140625 0.74609375 +vt 0.90625 0.74609375 +vt 0.90625 0.79296875 +vt 0.9140625 0.79296875 +vt 0.921875 0.79296875 +vt 0.9140625 0.79296875 +vt 0.9140625 0.74609375 +vt 0.921875 0.74609375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 148/436/109 151/435/109 149/434/109 146/433/109 +f 147/440/110 148/439/110 146/438/110 145/437/110 +f 152/444/111 147/443/111 145/442/111 150/441/111 +f 151/448/112 152/447/112 150/446/112 149/445/112 +f 150/452/113 145/451/113 146/450/113 149/449/113 +f 151/456/114 148/455/114 147/454/114 152/453/114 +o body +v 0.0625 1.625 1.875 +v 0.0625 1.625 1.125 +v 0.0625 1.25 1.875 +v 0.0625 1.25 1.125 +v -0.0625 1.625 1.125 +v -0.0625 1.625 1.875 +v -0.0625 1.25 1.125 +v -0.0625 1.25 1.875 +vt 0.90625 0.74609375 +vt 0.9140625 0.74609375 +vt 0.9140625 0.72265625 +vt 0.90625 0.72265625 +vt 0.859375 0.74609375 +vt 0.90625 0.74609375 +vt 0.90625 0.72265625 +vt 0.859375 0.72265625 +vt 0.9609375 0.74609375 +vt 0.96875 0.74609375 +vt 0.96875 0.72265625 +vt 0.9609375 0.72265625 +vt 0.9140625 0.74609375 +vt 0.9609375 0.74609375 +vt 0.9609375 0.72265625 +vt 0.9140625 0.72265625 +vt 0.9140625 0.74609375 +vt 0.90625 0.74609375 +vt 0.90625 0.79296875 +vt 0.9140625 0.79296875 +vt 0.921875 0.79296875 +vt 0.9140625 0.79296875 +vt 0.9140625 0.74609375 +vt 0.921875 0.74609375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 156/460/115 159/459/115 157/458/115 154/457/115 +f 155/464/116 156/463/116 154/462/116 153/461/116 +f 160/468/117 155/467/117 153/466/117 158/465/117 +f 159/472/118 160/471/118 158/470/118 157/469/118 +f 158/476/119 153/475/119 154/474/119 157/473/119 +f 159/480/120 156/479/120 155/478/120 160/477/120 +o body +v 0.0625 1.625 3.125 +v 0.0625 1.625 2.375 +v 0.0625 1.25 3.125 +v 0.0625 1.25 2.375 +v -0.0625 1.625 2.375 +v -0.0625 1.625 3.125 +v -0.0625 1.25 2.375 +v -0.0625 1.25 3.125 +vt 0.90625 0.74609375 +vt 0.9140625 0.74609375 +vt 0.9140625 0.72265625 +vt 0.90625 0.72265625 +vt 0.859375 0.74609375 +vt 0.90625 0.74609375 +vt 0.90625 0.72265625 +vt 0.859375 0.72265625 +vt 0.9609375 0.74609375 +vt 0.96875 0.74609375 +vt 0.96875 0.72265625 +vt 0.9609375 0.72265625 +vt 0.9140625 0.74609375 +vt 0.9609375 0.74609375 +vt 0.9609375 0.72265625 +vt 0.9140625 0.72265625 +vt 0.9140625 0.74609375 +vt 0.90625 0.74609375 +vt 0.90625 0.79296875 +vt 0.9140625 0.79296875 +vt 0.921875 0.79296875 +vt 0.9140625 0.79296875 +vt 0.9140625 0.74609375 +vt 0.921875 0.74609375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 164/484/121 167/483/121 165/482/121 162/481/121 +f 163/488/122 164/487/122 162/486/122 161/485/122 +f 168/492/123 163/491/123 161/490/123 166/489/123 +f 167/496/124 168/495/124 166/494/124 165/493/124 +f 166/500/125 161/499/125 162/498/125 165/497/125 +f 167/504/126 164/503/126 163/502/126 168/501/126 +o wing +v 4.0582975240428985 2.024698766671211 0.9789705600873082 +v 4.143802559874316 2.039775611474734 0.48656668358120414 +v 4.1451216128763635 1.5322948901651068 0.9789705600873082 +v 4.230626648707781 1.5473717349686296 0.48656668358120414 +v 0.7493404734989761 1.4412403606548134 -0.12120193825305198 +v 0.6638354376675588 1.4261635158512906 0.37120193825305203 +v 0.8361645623324412 0.9488364841487094 -0.12120193825305198 +v 0.7506595265010241 0.9337596393451866 0.37120193825305203 +vt 0.46875 0.625 +vt 0.6875 0.625 +vt 0.6875 0.59375 +vt 0.46875 0.59375 +vt 0.4375 0.625 +vt 0.46875 0.625 +vt 0.46875 0.59375 +vt 0.4375 0.59375 +vt 0.71875 0.625 +vt 0.9375 0.625 +vt 0.9375 0.59375 +vt 0.71875 0.59375 +vt 0.6875 0.625 +vt 0.71875 0.625 +vt 0.71875 0.59375 +vt 0.6875 0.59375 +vt 0.6875 0.625 +vt 0.46875 0.625 +vt 0.46875 0.65625 +vt 0.6875 0.65625 +vt 0.90625 0.65625 +vt 0.6875 0.65625 +vt 0.6875 0.625 +vt 0.90625 0.625 +vn 0.17101007166283433 0.030153689607045803 -0.984807753012208 +vn 0.9698463103929543 0.17101007166283436 0.17364817766693036 +vn -0.17101007166283433 -0.030153689607045803 0.984807753012208 +vn -0.9698463103929543 -0.17101007166283436 -0.17364817766693036 +vn -0.17364817766693033 0.984807753012208 0 +vn 0.17364817766693033 -0.984807753012208 0 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 172/508/127 175/507/127 173/506/127 170/505/127 +f 171/512/128 172/511/128 170/510/128 169/509/128 +f 176/516/129 171/515/129 169/514/129 174/513/129 +f 175/520/130 176/519/130 174/518/130 173/517/130 +f 174/524/131 169/523/131 170/522/131 173/521/131 +f 175/528/132 172/527/132 171/526/132 176/525/132 +o wing +v 3.5249413191357313 1.677431666078797 4.303420761460185 +v 4.123690332545229 1.7830072718154657 0.8553626162261914 +v 3.525158379357814 1.6762006563875311 4.303420761460185 +v 4.123907392767313 1.7817762621242004 0.8553626162261914 +v 0.7280159382818976 1.184258258405967 0.24737693416985151 +v 0.12926692487239855 1.0786826526692979 3.695435079403845 +v 0.728232998503981 1.1830272487147016 0.24737693416985151 +v 0.12948398509448222 1.0774516429780323 3.695435079403845 +vt 0 0.4375 +vt 0.21875 0.4375 +vt 0.21875 0.4375 +vt 0 0.4375 +vt -0.21875 0.4375 +vt 0 0.4375 +vt 0 0.4375 +vt -0.21875 0.4375 +vt 0.4375 0.4375 +vt 0.65625 0.4375 +vt 0.65625 0.4375 +vt 0.4375 0.4375 +vt 0.21875 0.4375 +vt 0.4375 0.4375 +vt 0.4375 0.4375 +vt 0.21875 0.4375 +vt 0.21875 0.4375 +vt 0 0.4375 +vt 0 0.65625 +vt 0.21875 0.65625 +vt 0.4375 0.65625 +vt 0.21875 0.65625 +vt 0.21875 0.4375 +vt 0.4375 0.4375 +vn 0.17101007166283433 0.030153689607045803 -0.984807753012208 +vn 0.9698463103929543 0.17101007166283436 0.17364817766693036 +vn -0.17101007166283433 -0.030153689607045803 0.984807753012208 +vn -0.9698463103929543 -0.17101007166283436 -0.17364817766693036 +vn -0.17364817766693033 0.984807753012208 0 +vn 0.17364817766693033 -0.984807753012208 0 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 180/532/133 183/531/133 181/530/133 178/529/133 +f 179/536/134 180/535/134 178/534/134 177/533/134 +f 184/540/135 179/539/135 177/538/135 182/537/135 +f 183/544/136 184/543/136 182/542/136 181/541/136 +f 182/548/137 177/547/137 178/546/137 181/545/137 +f 183/552/138 180/551/138 179/550/138 184/549/138 +o wingtip +v 7.541772295535269 1.2888090706299558 1.4344091768703897 +v 7.584524813450978 1.2963474930317171 1.1882072386173377 +v 7.499639529805786 1.0428327037253111 1.4195613832169185 +v 7.542392047721496 1.0503711261270725 1.1733594449638665 +v 4.186904728197936 1.912792645473123 0.6170915495344658 +v 4.144152210282227 1.9052542230713616 0.8632934877875178 +v 4.144771962468453 1.6668162785684784 0.6022437558809948 +v 4.102019444552744 1.659277856166717 0.8484456941340466 +vt 0.453125 0.453125 +vt 0.671875 0.453125 +vt 0.671875 0.4375 +vt 0.453125 0.4375 +vt 0.4375 0.453125 +vt 0.453125 0.453125 +vt 0.453125 0.4375 +vt 0.4375 0.4375 +vt 0.6875 0.453125 +vt 0.90625 0.453125 +vt 0.90625 0.4375 +vt 0.6875 0.4375 +vt 0.671875 0.453125 +vt 0.6875 0.453125 +vt 0.6875 0.4375 +vt 0.671875 0.4375 +vt 0.671875 0.453125 +vt 0.453125 0.453125 +vt 0.453125 0.46875 +vt 0.671875 0.46875 +vt 0.890625 0.46875 +vt 0.671875 0.46875 +vt 0.671875 0.453125 +vt 0.890625 0.453125 +vn 0.17101007166283436 0.0301536896070458 -0.9848077530122081 +vn 0.9707485957865836 -0.1761271864118303 0.16317591116653485 +vn -0.17101007166283436 -0.0301536896070458 0.9848077530122081 +vn -0.9707485957865836 0.1761271864118303 -0.16317591116653485 +vn 0.16853106291793427 0.9839054676185789 0.059391174613884684 +vn -0.16853106291793427 -0.9839054676185789 -0.059391174613884684 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 188/556/139 191/555/139 189/554/139 186/553/139 +f 187/560/140 188/559/140 186/558/140 185/557/140 +f 192/564/141 187/563/141 185/562/141 190/561/141 +f 191/568/142 192/567/142 190/566/142 189/565/142 +f 190/572/143 185/571/143 186/570/143 189/569/143 +f 191/576/144 188/575/144 187/574/144 192/573/144 +o wingtip +v 6.922775830342509 1.060768988922723 4.874567024860628 +v 7.521524843752008 1.1663445946593922 1.4265088796266343 +v 6.922565166513862 1.0595391070881996 4.874492785892361 +v 7.521314179923362 1.165114712824869 1.426434640658367 +v 4.122691322754232 1.7830099060838132 0.855189220654804 +v 3.523942309344733 1.677434300347144 4.303247365888798 +v 4.122480658925585 1.7817800242492896 0.8551149816865367 +v 3.5237316455160856 1.6762044185126204 4.30317312692053 +vt 0 0.21875 +vt 0.21875 0.21875 +vt 0.21875 0.21875 +vt 0 0.21875 +vt -0.21875 0.21875 +vt 0 0.21875 +vt 0 0.21875 +vt -0.21875 0.21875 +vt 0.4375 0.21875 +vt 0.65625 0.21875 +vt 0.65625 0.21875 +vt 0.4375 0.21875 +vt 0.21875 0.21875 +vt 0.4375 0.21875 +vt 0.4375 0.21875 +vt 0.21875 0.21875 +vt 0.21875 0.21875 +vt 0 0.21875 +vt 0 0.4375 +vt 0.21875 0.4375 +vt 0.4375 0.4375 +vt 0.21875 0.4375 +vt 0.21875 0.21875 +vt 0.4375 0.21875 +vn 0.17101007166283436 0.0301536896070458 -0.9848077530122081 +vn 0.9707485957865836 -0.1761271864118303 0.16317591116653485 +vn -0.17101007166283436 -0.0301536896070458 0.9848077530122081 +vn -0.9707485957865836 0.1761271864118303 -0.16317591116653485 +vn 0.16853106291793427 0.9839054676185789 0.059391174613884684 +vn -0.16853106291793427 -0.9839054676185789 -0.059391174613884684 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 196/580/145 199/579/145 197/578/145 194/577/145 +f 195/584/146 196/583/146 194/582/146 193/581/146 +f 200/588/147 195/587/147 193/586/147 198/585/147 +f 199/592/148 200/591/148 198/590/148 197/589/148 +f 198/596/149 193/595/149 194/594/149 197/593/149 +f 199/600/150 196/599/150 195/598/150 200/597/150 +o wing1 +v -0.6638354376675588 1.4261635158512906 0.37120193825305203 +v -0.749340473498976 1.4412403606548134 -0.12120193825305198 +v -0.7506595265010241 0.9337596393451866 0.37120193825305203 +v -0.8361645623324412 0.9488364841487094 -0.12120193825305198 +v -4.143802559874316 2.039775611474734 0.48656668358120414 +v -4.0582975240428985 2.024698766671211 0.9789705600873082 +v -4.230626648707781 1.5473717349686296 0.48656668358120414 +v -4.1451216128763635 1.5322948901651068 0.9789705600873082 +vt 0.6875 0.625 +vt 0.46875 0.625 +vt 0.46875 0.59375 +vt 0.6875 0.59375 +vt 0.71875 0.625 +vt 0.6875 0.625 +vt 0.6875 0.59375 +vt 0.71875 0.59375 +vt 0.9375 0.625 +vt 0.71875 0.625 +vt 0.71875 0.59375 +vt 0.9375 0.59375 +vt 0.46875 0.625 +vt 0.4375 0.625 +vt 0.4375 0.59375 +vt 0.46875 0.59375 +vt 0.46875 0.625 +vt 0.6875 0.625 +vt 0.6875 0.65625 +vt 0.46875 0.65625 +vt 0.6875 0.65625 +vt 0.90625 0.65625 +vt 0.90625 0.625 +vt 0.6875 0.625 +vn -0.17101007166283433 0.030153689607045803 -0.984807753012208 +vn 0.9698463103929543 -0.17101007166283436 -0.17364817766693036 +vn 0.17101007166283433 -0.030153689607045803 0.984807753012208 +vn -0.9698463103929543 0.17101007166283436 0.17364817766693036 +vn 0.17364817766693033 0.984807753012208 0 +vn -0.17364817766693033 -0.984807753012208 0 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 204/604/151 207/603/151 205/602/151 202/601/151 +f 203/608/152 204/607/152 202/606/152 201/605/152 +f 208/612/153 203/611/153 201/610/153 206/609/153 +f 207/616/154 208/615/154 206/614/154 205/613/154 +f 206/620/155 201/619/155 202/618/155 205/617/155 +f 207/624/156 204/623/156 203/622/156 208/621/156 +o wing1 +v -0.1292669248723986 1.0786826526692979 3.695435079403845 +v -0.7280159382818975 1.184258258405967 0.24737693416985151 +v -0.12948398509448228 1.0774516429780323 3.695435079403845 +v -0.7282329985039812 1.1830272487147016 0.24737693416985151 +v -4.123690332545229 1.7830072718154657 0.8553626162261914 +v -3.524941319135731 1.677431666078797 4.303420761460185 +v -4.123907392767313 1.7817762621242004 0.8553626162261914 +v -3.5251583793578143 1.6762006563875311 4.303420761460185 +vt 0.21875 0.4375 +vt 0 0.4375 +vt 0 0.4375 +vt 0.21875 0.4375 +vt 0.4375 0.4375 +vt 0.21875 0.4375 +vt 0.21875 0.4375 +vt 0.4375 0.4375 +vt 0.65625 0.4375 +vt 0.4375 0.4375 +vt 0.4375 0.4375 +vt 0.65625 0.4375 +vt 0 0.4375 +vt -0.21875 0.4375 +vt -0.21875 0.4375 +vt 0 0.4375 +vt 0 0.4375 +vt 0.21875 0.4375 +vt 0.21875 0.65625 +vt 0 0.65625 +vt 0.21875 0.65625 +vt 0.4375 0.65625 +vt 0.4375 0.4375 +vt 0.21875 0.4375 +vn -0.17101007166283433 0.030153689607045803 -0.984807753012208 +vn 0.9698463103929543 -0.17101007166283436 -0.17364817766693036 +vn 0.17101007166283433 -0.030153689607045803 0.984807753012208 +vn -0.9698463103929543 0.17101007166283436 0.17364817766693036 +vn 0.17364817766693033 0.984807753012208 0 +vn -0.17364817766693033 -0.984807753012208 0 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 212/628/157 215/627/157 213/626/157 210/625/157 +f 211/632/158 212/631/158 210/630/158 209/629/158 +f 216/636/159 211/635/159 209/634/159 214/633/159 +f 215/640/160 216/639/160 214/638/160 213/637/160 +f 214/644/161 209/643/161 210/642/161 213/641/161 +f 215/648/162 212/647/162 211/646/162 216/645/162 +o wingtip1 +v -4.144152210282227 1.9052542230713616 0.8632934877875178 +v -4.186904728197936 1.912792645473123 0.6170915495344658 +v -4.102019444552744 1.659277856166717 0.8484456941340466 +v -4.144771962468453 1.6668162785684784 0.6022437558809948 +v -7.584524813450978 1.2963474930317171 1.1882072386173377 +v -7.541772295535269 1.2888090706299558 1.4344091768703897 +v -7.542392047721495 1.0503711261270725 1.1733594449638665 +v -7.499639529805786 1.0428327037253111 1.4195613832169185 +vt 0.671875 0.453125 +vt 0.453125 0.453125 +vt 0.453125 0.4375 +vt 0.671875 0.4375 +vt 0.6875 0.453125 +vt 0.671875 0.453125 +vt 0.671875 0.4375 +vt 0.6875 0.4375 +vt 0.90625 0.453125 +vt 0.6875 0.453125 +vt 0.6875 0.4375 +vt 0.90625 0.4375 +vt 0.453125 0.453125 +vt 0.4375 0.453125 +vt 0.4375 0.4375 +vt 0.453125 0.4375 +vt 0.453125 0.453125 +vt 0.671875 0.453125 +vt 0.671875 0.46875 +vt 0.453125 0.46875 +vt 0.671875 0.46875 +vt 0.890625 0.46875 +vt 0.890625 0.453125 +vt 0.671875 0.453125 +vn -0.17101007166283436 0.0301536896070458 -0.9848077530122081 +vn 0.9707485957865836 0.1761271864118303 -0.16317591116653485 +vn 0.17101007166283436 -0.0301536896070458 0.9848077530122081 +vn -0.9707485957865836 -0.1761271864118303 0.16317591116653485 +vn -0.16853106291793427 0.9839054676185789 0.059391174613884684 +vn 0.16853106291793427 -0.9839054676185789 -0.059391174613884684 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 220/652/163 223/651/163 221/650/163 218/649/163 +f 219/656/164 220/655/164 218/654/164 217/653/164 +f 224/660/165 219/659/165 217/658/165 222/657/165 +f 223/664/166 224/663/166 222/662/166 221/661/166 +f 222/668/167 217/667/167 218/666/167 221/665/167 +f 223/672/168 220/671/168 219/670/168 224/669/168 +o wingtip1 +v -3.523942309344733 1.677434300347144 4.303247365888798 +v -4.122691322754232 1.7830099060838132 0.855189220654804 +v -3.5237316455160856 1.6762044185126204 4.30317312692053 +v -4.122480658925585 1.7817800242492896 0.8551149816865367 +v -7.521524843752008 1.1663445946593922 1.4265088796266343 +v -6.922775830342509 1.060768988922723 4.874567024860628 +v -7.521314179923361 1.165114712824869 1.426434640658367 +v -6.922565166513862 1.0595391070881996 4.874492785892361 +vt 0.21875 0.21875 +vt 0 0.21875 +vt 0 0.21875 +vt 0.21875 0.21875 +vt 0.4375 0.21875 +vt 0.21875 0.21875 +vt 0.21875 0.21875 +vt 0.4375 0.21875 +vt 0.65625 0.21875 +vt 0.4375 0.21875 +vt 0.4375 0.21875 +vt 0.65625 0.21875 +vt 0 0.21875 +vt -0.21875 0.21875 +vt -0.21875 0.21875 +vt 0 0.21875 +vt 0 0.21875 +vt 0.21875 0.21875 +vt 0.21875 0.4375 +vt 0 0.4375 +vt 0.21875 0.4375 +vt 0.4375 0.4375 +vt 0.4375 0.21875 +vt 0.21875 0.21875 +vn -0.17101007166283436 0.0301536896070458 -0.9848077530122081 +vn 0.9707485957865836 0.1761271864118303 -0.16317591116653485 +vn 0.17101007166283436 -0.0301536896070458 0.9848077530122081 +vn -0.9707485957865836 -0.1761271864118303 0.16317591116653485 +vn -0.16853106291793427 0.9839054676185789 0.059391174613884684 +vn 0.16853106291793427 -0.9839054676185789 -0.059391174613884684 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 228/676/169 231/675/169 229/674/169 226/673/169 +f 227/680/170 228/679/170 226/678/170 225/677/170 +f 232/684/171 227/683/171 225/682/171 230/681/171 +f 231/688/172 232/687/172 230/686/172 229/685/172 +f 230/692/173 225/691/173 226/690/173 229/689/173 +f 231/696/174 228/695/174 227/694/174 232/693/174 +o rearleg +v 1.5 1.0580127018922192 2.6584936490538906 +v 1.5 0.1919872981077808 2.1584936490538906 +v 1.5 0.05801270189221919 4.390544456622768 +v 1.5 -0.8080127018922196 3.8905444566227683 +v 0.5 0.1919872981077808 2.1584936490538906 +v 0.5 1.0580127018922192 2.6584936490538906 +v 0.5 -0.8080127018922196 3.8905444566227683 +v 0.5 0.05801270189221919 4.390544456622768 +vt 0.0625 0.9375 +vt 0.125 0.9375 +vt 0.125 0.8125 +vt 0.0625 0.8125 +vt 0 0.9375 +vt 0.0625 0.9375 +vt 0.0625 0.8125 +vt 0 0.8125 +vt 0.1875 0.9375 +vt 0.25 0.9375 +vt 0.25 0.8125 +vt 0.1875 0.8125 +vt 0.125 0.9375 +vt 0.1875 0.9375 +vt 0.1875 0.8125 +vt 0.125 0.8125 +vt 0.125 0.9375 +vt 0.0625 0.9375 +vt 0.0625 1 +vt 0.125 1 +vt 0.1875 1 +vt 0.125 1 +vt 0.125 0.9375 +vt 0.1875 0.9375 +vn 0 -0.8660254037844386 -0.5000000000000001 +vn 1 0 0 +vn 0 0.8660254037844386 0.5000000000000001 +vn -1 0 0 +vn 0 0.5000000000000001 -0.8660254037844386 +vn 0 -0.5000000000000001 0.8660254037844386 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 236/700/175 239/699/175 237/698/175 234/697/175 +f 235/704/176 236/703/176 234/702/176 233/701/176 +f 240/708/177 235/707/177 233/706/177 238/705/177 +f 239/712/178 240/711/178 238/710/178 237/709/178 +f 238/716/179 233/715/179 234/714/179 237/713/179 +f 239/720/180 236/719/180 235/718/180 240/717/180 +o rearlegtip +v 1.375 -0.009562569109802244 4.19903062623141 +v 1.375 -0.7567085926786117 4.133663819170667 +v 1.375 -0.18387405460511896 6.191420022414902 +v 1.375 -0.9310200781739284 6.126053215354158 +v 0.625 -0.7567085926786117 4.133663819170667 +v 0.625 -0.009562569109802244 4.19903062623141 +v 0.625 -0.9310200781739284 6.126053215354158 +v 0.625 -0.18387405460511896 6.191420022414902 +vt 0.8125 0.953125 +vt 0.859375 0.953125 +vt 0.859375 0.828125 +vt 0.8125 0.828125 +vt 0.765625 0.953125 +vt 0.8125 0.953125 +vt 0.8125 0.828125 +vt 0.765625 0.828125 +vt 0.90625 0.953125 +vt 0.953125 0.953125 +vt 0.953125 0.828125 +vt 0.90625 0.828125 +vt 0.859375 0.953125 +vt 0.90625 0.953125 +vt 0.90625 0.828125 +vt 0.859375 0.828125 +vt 0.859375 0.953125 +vt 0.8125 0.953125 +vt 0.8125 1 +vt 0.859375 1 +vt 0.90625 1 +vt 0.859375 1 +vt 0.859375 0.953125 +vt 0.90625 0.953125 +vn 0 -0.9961946980917455 -0.0871557427476583 +vn 1 0 0 +vn 0 0.9961946980917455 0.0871557427476583 +vn -1 0 0 +vn 0 0.0871557427476583 -0.9961946980917455 +vn 0 -0.0871557427476583 0.9961946980917455 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 244/724/181 247/723/181 245/722/181 242/721/181 +f 243/728/182 244/727/182 242/726/182 241/725/182 +f 248/732/183 243/731/183 241/730/183 246/729/183 +f 247/736/184 248/735/184 246/734/184 245/733/184 +f 246/740/185 241/739/185 242/738/185 245/737/185 +f 247/744/186 244/743/186 243/742/186 248/741/186 +o rearfoot +v 1.5625 -0.42819812424051307 5.992592482541166 +v 1.5625 -1.5772647889189804 6.956773897070976 +v 1.5625 -0.187152770608062 6.279859148710783 +v 1.5625 -1.3362194352865284 7.244040563240592 +v 0.4375 -1.5772647889189804 6.956773897070976 +v 0.4375 -0.42819812424051307 5.992592482541166 +v 0.4375 -1.3362194352865284 7.244040563240592 +v 0.4375 -0.187152770608062 6.279859148710783 +vt 0.53125 0.90625 +vt 0.6015625 0.90625 +vt 0.6015625 0.8828125 +vt 0.53125 0.8828125 +vt 0.4375 0.90625 +vt 0.53125 0.90625 +vt 0.53125 0.8828125 +vt 0.4375 0.8828125 +vt 0.6953125 0.90625 +vt 0.765625 0.90625 +vt 0.765625 0.8828125 +vt 0.6953125 0.8828125 +vt 0.6015625 0.90625 +vt 0.6953125 0.90625 +vt 0.6953125 0.8828125 +vt 0.6015625 0.8828125 +vt 0.6015625 0.90625 +vt 0.53125 0.90625 +vt 0.53125 1 +vt 0.6015625 1 +vt 0.671875 1 +vt 0.6015625 1 +vt 0.6015625 0.90625 +vt 0.671875 0.90625 +vn 0 -0.766044443118978 0.6427876096865393 +vn 1 0 0 +vn 0 0.766044443118978 -0.6427876096865393 +vn -1 0 0 +vn 0 -0.6427876096865393 -0.766044443118978 +vn 0 0.6427876096865393 0.766044443118978 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 252/748/187 255/747/187 253/746/187 250/745/187 +f 251/752/188 252/751/188 250/750/188 249/749/188 +f 256/756/189 251/755/189 249/754/189 254/753/189 +f 255/760/190 256/759/190 254/758/190 253/757/190 +f 254/764/191 249/763/191 250/762/191 253/761/191 +f 255/768/192 252/767/192 251/766/192 256/765/192 +o rearleg1 +v -0.5 1.0580127018922192 2.6584936490538906 +v -0.5 0.1919872981077808 2.1584936490538906 +v -0.5 0.05801270189221919 4.390544456622768 +v -0.5 -0.8080127018922196 3.8905444566227683 +v -1.5 0.1919872981077808 2.1584936490538906 +v -1.5 1.0580127018922192 2.6584936490538906 +v -1.5 -0.8080127018922196 3.8905444566227683 +v -1.5 0.05801270189221919 4.390544456622768 +vt 0.125 0.9375 +vt 0.0625 0.9375 +vt 0.0625 0.8125 +vt 0.125 0.8125 +vt 0.1875 0.9375 +vt 0.125 0.9375 +vt 0.125 0.8125 +vt 0.1875 0.8125 +vt 0.25 0.9375 +vt 0.1875 0.9375 +vt 0.1875 0.8125 +vt 0.25 0.8125 +vt 0.0625 0.9375 +vt 0 0.9375 +vt 0 0.8125 +vt 0.0625 0.8125 +vt 0.0625 0.9375 +vt 0.125 0.9375 +vt 0.125 1 +vt 0.0625 1 +vt 0.125 1 +vt 0.1875 1 +vt 0.1875 0.9375 +vt 0.125 0.9375 +vn 0 -0.8660254037844386 -0.5000000000000001 +vn 1 0 0 +vn 0 0.8660254037844386 0.5000000000000001 +vn -1 0 0 +vn 0 0.5000000000000001 -0.8660254037844386 +vn 0 -0.5000000000000001 0.8660254037844386 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 260/772/193 263/771/193 261/770/193 258/769/193 +f 259/776/194 260/775/194 258/774/194 257/773/194 +f 264/780/195 259/779/195 257/778/195 262/777/195 +f 263/784/196 264/783/196 262/782/196 261/781/196 +f 262/788/197 257/787/197 258/786/197 261/785/197 +f 263/792/198 260/791/198 259/790/198 264/789/198 +o rearlegtip +v -0.625 -0.009562569109802244 4.19903062623141 +v -0.625 -0.7567085926786117 4.133663819170667 +v -0.625 -0.18387405460511896 6.191420022414902 +v -0.625 -0.9310200781739284 6.126053215354158 +v -1.375 -0.7567085926786117 4.133663819170667 +v -1.375 -0.009562569109802244 4.19903062623141 +v -1.375 -0.9310200781739284 6.126053215354158 +v -1.375 -0.18387405460511896 6.191420022414902 +vt 0.859375 0.953125 +vt 0.8125 0.953125 +vt 0.8125 0.828125 +vt 0.859375 0.828125 +vt 0.90625 0.953125 +vt 0.859375 0.953125 +vt 0.859375 0.828125 +vt 0.90625 0.828125 +vt 0.953125 0.953125 +vt 0.90625 0.953125 +vt 0.90625 0.828125 +vt 0.953125 0.828125 +vt 0.8125 0.953125 +vt 0.765625 0.953125 +vt 0.765625 0.828125 +vt 0.8125 0.828125 +vt 0.8125 0.953125 +vt 0.859375 0.953125 +vt 0.859375 1 +vt 0.8125 1 +vt 0.859375 1 +vt 0.90625 1 +vt 0.90625 0.953125 +vt 0.859375 0.953125 +vn 0 -0.9961946980917455 -0.0871557427476583 +vn 1 0 0 +vn 0 0.9961946980917455 0.0871557427476583 +vn -1 0 0 +vn 0 0.0871557427476583 -0.9961946980917455 +vn 0 -0.0871557427476583 0.9961946980917455 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 268/796/199 271/795/199 269/794/199 266/793/199 +f 267/800/200 268/799/200 266/798/200 265/797/200 +f 272/804/201 267/803/201 265/802/201 270/801/201 +f 271/808/202 272/807/202 270/806/202 269/805/202 +f 270/812/203 265/811/203 266/810/203 269/809/203 +f 271/816/204 268/815/204 267/814/204 272/813/204 +o rearfoot +v -0.4375 -0.42819812424051307 5.992592482541166 +v -0.4375 -1.5772647889189804 6.956773897070976 +v -0.4375 -0.187152770608062 6.279859148710783 +v -0.4375 -1.3362194352865284 7.244040563240592 +v -1.5625 -1.5772647889189804 6.956773897070976 +v -1.5625 -0.42819812424051307 5.992592482541166 +v -1.5625 -1.3362194352865284 7.244040563240592 +v -1.5625 -0.187152770608062 6.279859148710783 +vt 0.6015625 0.90625 +vt 0.53125 0.90625 +vt 0.53125 0.8828125 +vt 0.6015625 0.8828125 +vt 0.6953125 0.90625 +vt 0.6015625 0.90625 +vt 0.6015625 0.8828125 +vt 0.6953125 0.8828125 +vt 0.765625 0.90625 +vt 0.6953125 0.90625 +vt 0.6953125 0.8828125 +vt 0.765625 0.8828125 +vt 0.53125 0.90625 +vt 0.4375 0.90625 +vt 0.4375 0.8828125 +vt 0.53125 0.8828125 +vt 0.53125 0.90625 +vt 0.6015625 0.90625 +vt 0.6015625 1 +vt 0.53125 1 +vt 0.6015625 1 +vt 0.671875 1 +vt 0.671875 0.90625 +vt 0.6015625 0.90625 +vn 0 -0.766044443118978 0.6427876096865393 +vn 1 0 0 +vn 0 0.766044443118978 -0.6427876096865393 +vn -1 0 0 +vn 0 -0.6427876096865393 -0.766044443118978 +vn 0 0.6427876096865393 0.766044443118978 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 276/820/205 279/819/205 277/818/205 274/817/205 +f 275/824/206 276/823/206 274/822/206 273/821/206 +f 280/828/207 275/827/207 273/826/207 278/825/207 +f 279/832/208 280/831/208 278/830/208 277/829/208 +f 278/836/209 273/835/209 274/834/209 277/833/209 +f 279/840/210 276/839/210 275/838/210 280/837/210 +o frontleg +v 1 0.5822315121943373 0.004077618676012307 +v 1 0.1290776186760123 -0.20723151219433733 +v 1 -0.05169588041671158 1.3635392992309874 +v 1 -0.5048497739350366 1.1522301683606377 +v 0.5 0.1290776186760123 -0.20723151219433733 +v 0.5 0.5822315121943373 0.004077618676012307 +v 0.5 -0.5048497739350366 1.1522301683606377 +v 0.5 -0.05169588041671158 1.3635392992309874 +vt 0.46875 0.5625 +vt 0.5 0.5625 +vt 0.5 0.46875 +vt 0.46875 0.46875 +vt 0.4375 0.5625 +vt 0.46875 0.5625 +vt 0.46875 0.46875 +vt 0.4375 0.46875 +vt 0.53125 0.5625 +vt 0.5625 0.5625 +vt 0.5625 0.46875 +vt 0.53125 0.46875 +vt 0.5 0.5625 +vt 0.53125 0.5625 +vt 0.53125 0.46875 +vt 0.5 0.46875 +vt 0.5 0.5625 +vt 0.46875 0.5625 +vt 0.46875 0.59375 +vt 0.5 0.59375 +vt 0.53125 0.59375 +vt 0.5 0.59375 +vt 0.5 0.5625 +vt 0.53125 0.5625 +vn 0 -0.90630778703665 -0.4226182617406993 +vn 1 0 0 +vn 0 0.90630778703665 0.4226182617406993 +vn -1 0 0 +vn 0 0.4226182617406993 -0.90630778703665 +vn 0 -0.4226182617406993 0.90630778703665 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 284/844/211 287/843/211 285/842/211 282/841/211 +f 283/848/212 284/847/212 282/846/212 281/845/212 +f 288/852/213 283/851/213 281/850/213 286/849/213 +f 287/856/214 288/855/214 286/854/214 285/853/214 +f 286/860/215 281/859/215 282/858/215 285/857/215 +f 287/864/216 284/863/216 283/862/216 288/861/216 +o frontlegtip +v 0.9375 -0.10149613187923717 1.346273081444131 +v 0.9375 -0.3666611748241926 1.0811080384991758 +v 0.9375 -1.1621563036590583 2.4069332532239525 +v 0.9375 -1.4273213466040136 2.141768210278997 +v 0.5625 -0.3666611748241926 1.0811080384991758 +v 0.5625 -0.10149613187923717 1.346273081444131 +v 0.5625 -1.4273213466040136 2.141768210278997 +v 0.5625 -1.1621563036590583 2.4069332532239525 +vt 0.90625 0.4375 +vt 0.9296875 0.4375 +vt 0.9296875 0.34375 +vt 0.90625 0.34375 +vt 0.8828125 0.4375 +vt 0.90625 0.4375 +vt 0.90625 0.34375 +vt 0.8828125 0.34375 +vt 0.953125 0.4375 +vt 0.9765625 0.4375 +vt 0.9765625 0.34375 +vt 0.953125 0.34375 +vt 0.9296875 0.4375 +vt 0.953125 0.4375 +vt 0.953125 0.34375 +vt 0.9296875 0.34375 +vt 0.9296875 0.4375 +vt 0.90625 0.4375 +vt 0.90625 0.4609375 +vt 0.9296875 0.4609375 +vt 0.953125 0.4609375 +vt 0.9296875 0.4609375 +vt 0.9296875 0.4375 +vt 0.953125 0.4375 +vn 0 -0.7071067811865477 -0.7071067811865474 +vn 1 0 0 +vn 0 0.7071067811865477 0.7071067811865474 +vn -1 0 0 +vn 0 0.7071067811865474 -0.7071067811865477 +vn 0 -0.7071067811865474 0.7071067811865477 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 292/868/217 295/867/217 293/866/217 290/865/217 +f 291/872/218 292/871/218 290/870/218 289/869/218 +f 296/876/219 291/875/219 289/874/219 294/873/219 +f 295/880/220 296/879/220 294/878/220 293/877/220 +f 294/884/221 289/883/221 290/882/221 293/881/221 +f 295/888/222 292/887/222 291/886/222 296/885/222 +o frontfoot +v 1 -1.0005446513073766 2.2301565579273155 +v 1 -2.0005446513073766 2.2301565579273155 +v 1 -1.0005446513073766 2.4801565579273155 +v 1 -2.0005446513073766 2.4801565579273155 +v 0.5 -2.0005446513073766 2.2301565579273155 +v 0.5 -1.0005446513073766 2.2301565579273155 +v 0.5 -2.0005446513073766 2.4801565579273155 +v 0.5 -1.0005446513073766 2.4801565579273155 +vt 0.625 0.53125 +vt 0.65625 0.53125 +vt 0.65625 0.515625 +vt 0.625 0.515625 +vt 0.5625 0.53125 +vt 0.625 0.53125 +vt 0.625 0.515625 +vt 0.5625 0.515625 +vt 0.71875 0.53125 +vt 0.75 0.53125 +vt 0.75 0.515625 +vt 0.71875 0.515625 +vt 0.65625 0.53125 +vt 0.71875 0.53125 +vt 0.71875 0.515625 +vt 0.65625 0.515625 +vt 0.65625 0.53125 +vt 0.625 0.53125 +vt 0.625 0.59375 +vt 0.65625 0.59375 +vt 0.6875 0.59375 +vt 0.65625 0.59375 +vt 0.65625 0.53125 +vt 0.6875 0.53125 +vn 0 -1 2.7755575615628914e-16 +vn 1 0 0 +vn 0 1 -2.7755575615628914e-16 +vn -1 0 0 +vn 0 -2.7755575615628914e-16 -1 +vn 0 2.7755575615628914e-16 1 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 300/892/223 303/891/223 301/890/223 298/889/223 +f 299/896/224 300/895/224 298/894/224 297/893/224 +f 304/900/225 299/899/225 297/898/225 302/897/225 +f 303/904/226 304/903/226 302/902/226 301/901/226 +f 302/908/227 297/907/227 298/906/227 301/905/227 +f 303/912/228 300/911/228 299/910/228 304/909/228 +o frontleg1 +v -0.5 0.5822315121943373 0.004077618676012307 +v -0.5 0.1290776186760123 -0.20723151219433733 +v -0.5 -0.05169588041671158 1.3635392992309874 +v -0.5 -0.5048497739350366 1.1522301683606377 +v -1 0.1290776186760123 -0.20723151219433733 +v -1 0.5822315121943373 0.004077618676012307 +v -1 -0.5048497739350366 1.1522301683606377 +v -1 -0.05169588041671158 1.3635392992309874 +vt 0.5 0.5625 +vt 0.46875 0.5625 +vt 0.46875 0.46875 +vt 0.5 0.46875 +vt 0.53125 0.5625 +vt 0.5 0.5625 +vt 0.5 0.46875 +vt 0.53125 0.46875 +vt 0.5625 0.5625 +vt 0.53125 0.5625 +vt 0.53125 0.46875 +vt 0.5625 0.46875 +vt 0.46875 0.5625 +vt 0.4375 0.5625 +vt 0.4375 0.46875 +vt 0.46875 0.46875 +vt 0.46875 0.5625 +vt 0.5 0.5625 +vt 0.5 0.59375 +vt 0.46875 0.59375 +vt 0.5 0.59375 +vt 0.53125 0.59375 +vt 0.53125 0.5625 +vt 0.5 0.5625 +vn 0 -0.90630778703665 -0.4226182617406993 +vn 1 0 0 +vn 0 0.90630778703665 0.4226182617406993 +vn -1 0 0 +vn 0 0.4226182617406993 -0.90630778703665 +vn 0 -0.4226182617406993 0.90630778703665 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 308/916/229 311/915/229 309/914/229 306/913/229 +f 307/920/230 308/919/230 306/918/230 305/917/230 +f 312/924/231 307/923/231 305/922/231 310/921/231 +f 311/928/232 312/927/232 310/926/232 309/925/232 +f 310/932/233 305/931/233 306/930/233 309/929/233 +f 311/936/234 308/935/234 307/934/234 312/933/234 +o frontlegtip +v -0.5625 -0.10149613187923717 1.346273081444131 +v -0.5625 -0.3666611748241926 1.0811080384991758 +v -0.5625 -1.1621563036590583 2.4069332532239525 +v -0.5625 -1.4273213466040136 2.141768210278997 +v -0.9375 -0.3666611748241926 1.0811080384991758 +v -0.9375 -0.10149613187923717 1.346273081444131 +v -0.9375 -1.4273213466040136 2.141768210278997 +v -0.9375 -1.1621563036590583 2.4069332532239525 +vt 0.9296875 0.4375 +vt 0.90625 0.4375 +vt 0.90625 0.34375 +vt 0.9296875 0.34375 +vt 0.953125 0.4375 +vt 0.9296875 0.4375 +vt 0.9296875 0.34375 +vt 0.953125 0.34375 +vt 0.9765625 0.4375 +vt 0.953125 0.4375 +vt 0.953125 0.34375 +vt 0.9765625 0.34375 +vt 0.90625 0.4375 +vt 0.8828125 0.4375 +vt 0.8828125 0.34375 +vt 0.90625 0.34375 +vt 0.90625 0.4375 +vt 0.9296875 0.4375 +vt 0.9296875 0.4609375 +vt 0.90625 0.4609375 +vt 0.9296875 0.4609375 +vt 0.953125 0.4609375 +vt 0.953125 0.4375 +vt 0.9296875 0.4375 +vn 0 -0.7071067811865477 -0.7071067811865474 +vn 1 0 0 +vn 0 0.7071067811865477 0.7071067811865474 +vn -1 0 0 +vn 0 0.7071067811865474 -0.7071067811865477 +vn 0 -0.7071067811865474 0.7071067811865477 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 316/940/235 319/939/235 317/938/235 314/937/235 +f 315/944/236 316/943/236 314/942/236 313/941/236 +f 320/948/237 315/947/237 313/946/237 318/945/237 +f 319/952/238 320/951/238 318/950/238 317/949/238 +f 318/956/239 313/955/239 314/954/239 317/953/239 +f 319/960/240 316/959/240 315/958/240 320/957/240 +o frontfoot +v -0.5 -1.0005446513073766 2.2301565579273155 +v -0.5 -2.0005446513073766 2.2301565579273155 +v -0.5 -1.0005446513073766 2.4801565579273155 +v -0.5 -2.0005446513073766 2.4801565579273155 +v -1 -2.0005446513073766 2.2301565579273155 +v -1 -1.0005446513073766 2.2301565579273155 +v -1 -2.0005446513073766 2.4801565579273155 +v -1 -1.0005446513073766 2.4801565579273155 +vt 0.65625 0.53125 +vt 0.625 0.53125 +vt 0.625 0.515625 +vt 0.65625 0.515625 +vt 0.71875 0.53125 +vt 0.65625 0.53125 +vt 0.65625 0.515625 +vt 0.71875 0.515625 +vt 0.75 0.53125 +vt 0.71875 0.53125 +vt 0.71875 0.515625 +vt 0.75 0.515625 +vt 0.625 0.53125 +vt 0.5625 0.53125 +vt 0.5625 0.515625 +vt 0.625 0.515625 +vt 0.625 0.53125 +vt 0.65625 0.53125 +vt 0.65625 0.59375 +vt 0.625 0.59375 +vt 0.65625 0.59375 +vt 0.6875 0.59375 +vt 0.6875 0.53125 +vt 0.65625 0.53125 +vn 0 -1 2.7755575615628914e-16 +vn 1 0 0 +vn 0 1 -2.7755575615628914e-16 +vn -1 0 0 +vn 0 -2.7755575615628914e-16 -1 +vn 0 2.7755575615628914e-16 1 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 324/964/241 327/963/241 325/962/241 322/961/241 +f 323/968/242 324/967/242 322/966/242 321/965/242 +f 328/972/243 323/971/243 321/970/243 326/969/243 +f 327/976/244 328/975/244 326/974/244 325/973/244 +f 326/980/245 321/979/245 322/978/245 325/977/245 +f 327/984/246 324/983/246 323/982/246 328/981/246 +o tail +v 0.3125 1.1875 4.125 +v 0.3125 1.1875 3.5 +v 0.3125 0.5625 4.125 +v 0.3125 0.5625 3.5 +v -0.3125 1.1875 3.5 +v -0.3125 1.1875 4.125 +v -0.3125 0.5625 3.5 +v -0.3125 0.5625 4.125 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 332/988/247 335/987/247 333/986/247 330/985/247 +f 331/992/248 332/991/248 330/990/248 329/989/248 +f 336/996/249 331/995/249 329/994/249 334/993/249 +f 335/1000/250 336/999/250 334/998/250 333/997/250 +f 334/1004/251 329/1003/251 330/1002/251 333/1001/251 +f 335/1008/252 332/1007/252 331/1006/252 336/1005/252 +o tail +v 0.0625 1.4375 4 +v 0.0625 1.4375 3.625 +v 0.0625 1.1875 4 +v 0.0625 1.1875 3.625 +v -0.0625 1.4375 3.625 +v -0.0625 1.4375 4 +v -0.0625 1.1875 3.625 +v -0.0625 1.1875 4 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 340/1012/253 343/1011/253 341/1010/253 338/1009/253 +f 339/1016/254 340/1015/254 338/1014/254 337/1013/254 +f 344/1020/255 339/1019/255 337/1018/255 342/1017/255 +f 343/1024/256 344/1023/256 342/1022/256 341/1021/256 +f 342/1028/257 337/1027/257 338/1026/257 341/1025/257 +f 343/1032/258 340/1031/258 339/1030/258 344/1029/258 +o tail +v 0.3125 1.1983601587596744 4.744450932461093 +v 0.3125 1.1874524047363721 4.119546122988348 +v 0.3125 0.5734553492869299 4.755358686484396 +v 0.3125 0.5625475952636276 4.130453877011651 +v -0.3125 1.1874524047363721 4.119546122988348 +v -0.3125 1.1983601587596744 4.744450932461093 +v -0.3125 0.5625475952636276 4.130453877011651 +v -0.3125 0.5734553492869299 4.755358686484396 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 -0.01745240643728351 -0.9998476951563913 +vn 1 0 0 +vn 0 0.01745240643728351 0.9998476951563913 +vn -1 0 0 +vn 0 0.9998476951563913 -0.01745240643728351 +vn 0 -0.9998476951563913 0.01745240643728351 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 348/1036/259 351/1035/259 349/1034/259 346/1033/259 +f 347/1040/260 348/1039/260 346/1038/260 345/1037/260 +f 352/1044/261 347/1043/261 345/1042/261 350/1041/261 +f 351/1048/262 352/1047/262 350/1046/262 349/1045/262 +f 350/1052/263 345/1051/263 346/1050/263 349/1049/263 +f 351/1056/264 348/1055/264 347/1054/264 352/1053/264 +o tail +v 0.0625 1.4461405317441118 4.615106868957223 +v 0.0625 1.4395958793301304 4.240163983273576 +v 0.0625 1.196178607955014 4.619469970566544 +v 0.0625 1.1896339555410327 4.244527084882897 +v -0.0625 1.4395958793301304 4.240163983273576 +v -0.0625 1.4461405317441118 4.615106868957223 +v -0.0625 1.1896339555410327 4.244527084882897 +v -0.0625 1.196178607955014 4.619469970566544 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 -0.01745240643728351 -0.9998476951563913 +vn 1 0 0 +vn 0 0.01745240643728351 0.9998476951563913 +vn -1 0 0 +vn 0 0.9998476951563913 -0.01745240643728351 +vn 0 -0.9998476951563913 0.01745240643728351 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 356/1060/265 359/1059/265 357/1058/265 354/1057/265 +f 355/1064/266 356/1063/266 354/1062/266 353/1061/266 +f 360/1068/267 355/1067/267 353/1066/267 358/1065/267 +f 359/1072/268 360/1071/268 358/1070/268 357/1069/268 +f 358/1076/269 353/1075/269 354/1074/269 357/1073/269 +f 359/1080/270 356/1079/270 355/1078/270 360/1077/270 +o tail +v 0.3125 1.2200295729058328 5.363617983640148 +v 0.3125 1.1982173874667696 4.738998716753213 +v 0.3125 0.595410306018898 5.385430169079211 +v 0.3125 0.5735981205798348 4.760810902192276 +v -0.3125 1.1982173874667696 4.738998716753213 +v -0.3125 1.2200295729058328 5.363617983640148 +v -0.3125 0.5735981205798348 4.760810902192276 +v -0.3125 0.595410306018898 5.385430169079211 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 -0.03489949670250097 -0.9993908270190958 +vn 1 0 0 +vn 0 0.03489949670250097 0.9993908270190958 +vn -1 0 0 +vn 0 0.9993908270190958 -0.03489949670250097 +vn 0 -0.9993908270190958 0.03489949670250097 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 364/1084/271 367/1083/271 365/1082/271 362/1081/271 +f 363/1088/272 364/1087/272 362/1086/272 361/1085/272 +f 368/1092/273 363/1091/273 361/1090/273 366/1089/273 +f 367/1096/274 368/1095/274 366/1094/274 365/1093/274 +f 366/1100/275 361/1099/275 362/1098/275 365/1097/275 +f 367/1104/276 364/1103/276 363/1102/276 368/1101/276 +o tail +v 0.0625 1.465514842572794 5.229969256087136 +v 0.0625 1.4524275313093562 4.855197695954975 +v 0.0625 1.21566713581802 5.238694130262761 +v 0.0625 1.2025798245545822 4.8639225701306 +v -0.0625 1.4524275313093562 4.855197695954975 +v -0.0625 1.465514842572794 5.229969256087136 +v -0.0625 1.2025798245545822 4.8639225701306 +v -0.0625 1.21566713581802 5.238694130262761 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 -0.03489949670250097 -0.9993908270190958 +vn 1 0 0 +vn 0 0.03489949670250097 0.9993908270190958 +vn -1 0 0 +vn 0 0.9993908270190958 -0.03489949670250097 +vn 0 -0.9993908270190958 0.03489949670250097 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 372/1108/277 375/1107/277 373/1106/277 370/1105/277 +f 371/1112/278 372/1111/278 370/1110/278 369/1109/278 +f 376/1116/279 371/1115/279 369/1114/279 374/1113/279 +f 375/1120/280 376/1119/280 374/1118/280 373/1117/280 +f 374/1124/281 369/1123/281 370/1122/281 373/1121/281 +f 375/1128/282 372/1127/282 371/1126/282 376/1125/282 +o tail +v 0.3125 1.2525016417250097 5.982312549255369 +v 0.3125 1.2197916690731698 5.35816909003376 +v 0.3125 0.628358182503401 6.015022521907208 +v 0.3125 0.5956482098515612 5.3908790626856 +v -0.3125 1.2197916690731698 5.35816909003376 +v -0.3125 1.2525016417250097 5.982312549255369 +v -0.3125 0.5956482098515612 5.3908790626856 +v -0.3125 0.628358182503401 6.015022521907208 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 -0.05233595624294383 -0.9986295347545739 +vn 1 0 0 +vn 0 0.05233595624294383 0.9986295347545739 +vn -1 0 0 +vn 0 0.9986295347545739 -0.05233595624294383 +vn 0 -0.9986295347545739 0.05233595624294383 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 380/1132/283 383/1131/283 381/1130/283 378/1129/283 +f 379/1136/284 380/1135/284 378/1134/284 377/1133/284 +f 384/1140/285 379/1139/285 377/1138/285 382/1137/285 +f 383/1144/286 384/1143/286 382/1142/286 381/1141/286 +f 382/1148/287 377/1147/287 378/1146/287 381/1145/287 +f 383/1152/288 380/1151/288 379/1150/288 384/1149/288 +o tail +v 0.0625 1.4956170308832855 5.844399868350311 +v 0.0625 1.4759910472921813 5.469913792817346 +v 0.0625 1.245959647194642 5.857483857411047 +v 0.0625 1.2263336636035378 5.482997781878082 +v -0.0625 1.4759910472921813 5.469913792817346 +v -0.0625 1.4956170308832855 5.844399868350311 +v -0.0625 1.2263336636035378 5.482997781878082 +v -0.0625 1.245959647194642 5.857483857411047 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 -0.05233595624294383 -0.9986295347545739 +vn 1 0 0 +vn 0 0.05233595624294383 0.9986295347545739 +vn -1 0 0 +vn 0 0.9986295347545739 -0.05233595624294383 +vn 0 -0.9986295347545739 0.05233595624294383 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 388/1156/289 391/1155/289 389/1154/289 386/1153/289 +f 387/1160/290 388/1159/290 386/1158/290 385/1157/290 +f 392/1164/291 387/1163/291 385/1162/291 390/1161/291 +f 391/1168/292 392/1167/292 390/1166/292 389/1165/292 +f 390/1172/293 385/1171/293 386/1170/293 389/1169/293 +f 391/1176/294 388/1175/294 387/1174/294 392/1173/294 +o tail +v 0.3125 1.3062130944851622 6.594053052279986 +v 0.3125 1.2517407552678759 5.971431365972645 +v 0.3125 0.6835914081778212 6.648525391497273 +v 0.3125 0.6291190689605348 6.025903705189932 +v -0.3125 1.2517407552678759 5.971431365972645 +v -0.3125 1.3062130944851622 6.594053052279986 +v -0.3125 0.6291190689605348 6.025903705189932 +v -0.3125 0.6835914081778212 6.648525391497273 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 -0.08715574274765817 -0.9961946980917457 +vn 1 0 0 +vn 0 0.08715574274765817 0.9961946980917457 +vn -1 0 0 +vn 0 0.9961946980917457 -0.08715574274765817 +vn 0 -0.9961946980917457 0.08715574274765817 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 396/1180/295 399/1179/295 397/1178/295 394/1177/295 +f 395/1184/296 396/1183/296 394/1182/296 393/1181/296 +f 400/1188/297 395/1187/297 393/1186/297 398/1185/297 +f 399/1192/298 400/1191/298 398/1190/298 397/1189/298 +f 398/1196/299 393/1195/299 394/1194/299 397/1193/299 +f 399/1200/300 396/1199/300 395/1198/300 400/1197/300 +o tail +v 0.0625 1.544367301164641 6.447739779331603 +v 0.0625 1.5116838976342697 6.074166767547199 +v 0.0625 1.295318626641705 6.469528715018518 +v 0.0625 1.2626352231113331 6.095955703234114 +v -0.0625 1.5116838976342697 6.074166767547199 +v -0.0625 1.544367301164641 6.447739779331603 +v -0.0625 1.2626352231113331 6.095955703234114 +v -0.0625 1.295318626641705 6.469528715018518 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 -0.08715574274765817 -0.9961946980917457 +vn 1 0 0 +vn 0 0.08715574274765817 0.9961946980917457 +vn -1 0 0 +vn 0 0.9961946980917457 -0.08715574274765817 +vn 0 -0.9961946980917457 0.08715574274765817 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 404/1204/301 407/1203/301 405/1202/301 402/1201/301 +f 403/1208/302 404/1207/302 402/1206/302 401/1205/302 +f 408/1212/303 403/1211/303 401/1210/303 406/1209/303 +f 407/1216/304 408/1215/304 406/1214/304 405/1213/304 +f 406/1220/305 401/1219/305 402/1218/305 405/1217/305 +f 407/1224/306 404/1223/306 403/1222/306 408/1221/306 +o tail +v 0.3125 1.3913442109132734 7.196715170802091 +v 0.3125 1.304361022813232 6.577797627838609 +v 0.3125 0.772426667949792 7.283698358902132 +v 0.3125 0.6854434798497508 6.66478081593865 +v -0.3125 1.304361022813232 6.577797627838609 +v -0.3125 1.3913442109132734 7.196715170802091 +v -0.3125 0.6854434798497508 6.66478081593865 +v -0.3125 0.772426667949792 7.283698358902132 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 -0.13917310096006544 -0.9902680687415704 +vn 1 0 0 +vn 0 0.13917310096006544 0.9902680687415704 +vn -1 0 0 +vn 0 0.9902680687415704 -0.13917310096006544 +vn 0 -0.9902680687415704 0.13917310096006544 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 412/1228/307 415/1227/307 413/1226/307 410/1225/307 +f 411/1232/308 412/1231/308 410/1230/308 409/1229/308 +f 416/1236/309 411/1235/309 409/1234/309 414/1233/309 +f 415/1240/310 416/1239/310 414/1238/310 413/1237/310 +f 414/1244/311 409/1243/311 410/1242/311 413/1241/311 +f 415/1248/312 412/1247/312 411/1246/312 416/1245/312 +o tail +v 0.0625 1.6215145904786574 7.038138386969378 +v 0.0625 1.5693246776186331 6.666787861191289 +v 0.0625 1.373947573293265 7.0729316622093945 +v 0.0625 1.3217576604332402 6.701581136431305 +v -0.0625 1.5693246776186331 6.666787861191289 +v -0.0625 1.6215145904786574 7.038138386969378 +v -0.0625 1.3217576604332402 6.701581136431305 +v -0.0625 1.373947573293265 7.0729316622093945 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 -0.13917310096006544 -0.9902680687415704 +vn 1 0 0 +vn 0 0.13917310096006544 0.9902680687415704 +vn -1 0 0 +vn 0 0.9902680687415704 -0.13917310096006544 +vn 0 -0.9902680687415704 0.13917310096006544 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 420/1252/313 423/1251/313 421/1250/313 418/1249/313 +f 419/1256/314 420/1255/314 418/1254/314 417/1253/314 +f 424/1260/315 419/1259/315 417/1258/315 422/1257/315 +f 423/1264/316 424/1263/316 422/1262/316 421/1261/316 +f 422/1268/317 417/1267/317 418/1266/317 421/1265/317 +f 423/1272/318 420/1271/318 419/1270/318 424/1269/318 +o tail +v 0.3125 1.507899556369268 7.79409594345173 +v 0.3125 1.3886439342589278 7.180578953796941 +v 0.3125 0.894382566714478 7.9133515655620705 +v 0.3125 0.7751269446041376 7.299834575907282 +v -0.3125 1.3886439342589278 7.180578953796941 +v -0.3125 1.507899556369268 7.79409594345173 +v -0.3125 0.7751269446041376 7.299834575907282 +v -0.3125 0.894382566714478 7.9133515655620705 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 -0.1908089953765448 -0.981627183447664 +vn 1 0 0 +vn 0 0.1908089953765448 0.981627183447664 +vn -1 0 0 +vn 0 0.981627183447664 -0.1908089953765448 +vn 0 -0.981627183447664 0.1908089953765448 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 428/1276/319 431/1275/319 429/1274/319 426/1273/319 +f 427/1280/320 428/1279/320 426/1278/320 425/1277/320 +f 432/1284/321 427/1283/321 425/1282/321 430/1281/321 +f 431/1288/322 432/1287/322 430/1286/322 429/1285/322 +f 430/1292/323 425/1291/323 426/1290/323 429/1289/323 +f 431/1296/324 428/1295/324 427/1294/324 432/1293/324 +o tail +v 0.0625 1.7294552278091162 7.623690296676635 +v 0.0625 1.6579018545429118 7.255580102883762 +v 0.0625 1.4840484319472 7.6713925455207725 +v 0.0625 1.4124950586809957 7.303282351727899 +v -0.0625 1.6579018545429118 7.255580102883762 +v -0.0625 1.7294552278091162 7.623690296676635 +v -0.0625 1.4124950586809957 7.303282351727899 +v -0.0625 1.4840484319472 7.6713925455207725 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 -0.1908089953765448 -0.981627183447664 +vn 1 0 0 +vn 0 0.1908089953765448 0.981627183447664 +vn -1 0 0 +vn 0 0.981627183447664 -0.1908089953765448 +vn 0 -0.981627183447664 0.1908089953765448 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 436/1300/325 439/1299/325 437/1298/325 434/1297/325 +f 435/1304/326 436/1303/326 434/1302/326 433/1301/326 +f 440/1308/327 435/1307/327 433/1306/327 438/1305/327 +f 439/1312/328 440/1311/328 438/1310/328 437/1309/328 +f 438/1316/329 433/1315/329 434/1314/329 437/1313/329 +f 439/1320/330 436/1319/330 435/1318/330 440/1317/330 +o tail +v 0.3125 1.6367569935322868 8.40009360158498 +v 0.3125 1.506812186771187 7.788751351126351 +v 0.3125 1.025414743073658 8.53003840834608 +v 0.3125 0.8954699363125587 7.918696157887451 +v -0.3125 1.506812186771187 7.788751351126351 +v -0.3125 1.6367569935322868 8.40009360158498 +v -0.3125 0.8954699363125587 7.918696157887451 +v -0.3125 1.025414743073658 8.53003840834608 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 -0.20791169081775934 -0.9781476007338057 +vn 1 0 0 +vn 0 0.20791169081775934 0.9781476007338057 +vn -1 0 0 +vn 0 0.9781476007338057 -0.20791169081775934 +vn 0 -0.9781476007338057 0.20791169081775934 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 444/1324/331 447/1323/331 445/1322/331 442/1321/331 +f 443/1328/332 444/1327/332 442/1326/332 441/1325/332 +f 448/1332/333 443/1331/333 441/1330/333 446/1329/333 +f 447/1336/334 448/1335/334 446/1334/334 445/1333/334 +f 446/1340/335 441/1339/335 442/1338/335 445/1337/335 +f 447/1344/336 444/1343/336 443/1342/336 448/1341/336 +o tail +v 0.0625 1.8553049323635182 8.225847228788815 +v 0.0625 1.7773380483068584 7.8590418785136364 +v 0.0625 1.6107680321800668 8.277825151493253 +v 0.0625 1.532801148123407 7.911019801218078 +v -0.0625 1.7773380483068584 7.8590418785136364 +v -0.0625 1.8553049323635182 8.225847228788815 +v -0.0625 1.532801148123407 7.911019801218078 +v -0.0625 1.6107680321800668 8.277825151493253 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 -0.20791169081775934 -0.9781476007338057 +vn 1 0 0 +vn 0 0.20791169081775934 0.9781476007338057 +vn -1 0 0 +vn 0 0.9781476007338057 -0.20791169081775934 +vn 0 -0.9781476007338057 0.20791169081775934 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 452/1348/337 455/1347/337 453/1346/337 450/1345/337 +f 451/1352/338 452/1351/338 450/1350/338 449/1349/338 +f 456/1356/339 451/1355/339 449/1354/339 454/1353/339 +f 455/1360/340 456/1359/340 454/1358/340 453/1357/340 +f 454/1364/341 449/1363/341 450/1362/341 453/1361/341 +f 455/1368/342 452/1367/342 451/1366/342 456/1365/342 +o tail +v 0.3125 1.7570999852407079 9.018955183565149 +v 0.3125 1.6378443631303679 8.405438193910358 +v 0.3125 1.143582995585918 9.13821080567549 +v 0.3125 1.0243273734755776 8.524693816020699 +v -0.3125 1.6378443631303679 8.405438193910358 +v -0.3125 1.7570999852407079 9.018955183565149 +v -0.3125 1.0243273734755776 8.524693816020699 +v -0.3125 1.143582995585918 9.13821080567549 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 -0.1908089953765448 -0.981627183447664 +vn 1 0 0 +vn 0 0.1908089953765448 0.981627183447664 +vn -1 0 0 +vn 0 0.981627183447664 -0.1908089953765448 +vn 0 -0.981627183447664 0.1908089953765448 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 460/1372/343 463/1371/343 461/1370/343 458/1369/343 +f 459/1376/344 460/1375/344 458/1374/344 457/1373/344 +f 464/1380/345 459/1379/345 457/1378/345 462/1377/345 +f 463/1384/346 464/1383/346 462/1382/346 461/1381/346 +f 462/1388/347 457/1387/347 458/1386/347 461/1385/347 +f 463/1392/348 460/1391/348 459/1390/348 464/1389/348 +o tail +v 0.0625 1.978655656680556 8.848549536790054 +v 0.0625 1.9071022834143516 8.480439342997181 +v 0.0625 1.73324886081864 8.89625178563419 +v 0.0625 1.6616954875524357 8.528141591841317 +v -0.0625 1.9071022834143516 8.480439342997181 +v -0.0625 1.978655656680556 8.848549536790054 +v -0.0625 1.6616954875524357 8.528141591841317 +v -0.0625 1.73324886081864 8.89625178563419 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 -0.1908089953765448 -0.981627183447664 +vn 1 0 0 +vn 0 0.1908089953765448 0.981627183447664 +vn -1 0 0 +vn 0 0.981627183447664 -0.1908089953765448 +vn 0 -0.981627183447664 0.1908089953765448 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 468/1396/349 471/1395/349 469/1394/349 466/1393/349 +f 467/1400/350 468/1399/350 466/1398/350 465/1397/350 +f 472/1404/351 467/1403/351 465/1402/351 470/1401/351 +f 471/1408/352 472/1407/352 470/1406/352 469/1405/352 +f 470/1412/353 465/1411/353 466/1410/353 469/1409/353 +f 471/1416/354 468/1415/354 467/1414/354 472/1413/354 +o tail +v 0.3125 1.8567656374994383 9.64700243716721 +v 0.3125 1.7589940968492939 9.029697224295248 +v 0.3125 1.239460424627477 9.744773977817353 +v 0.3125 1.1416888839773327 9.127468764945391 +v -0.3125 1.7589940968492939 9.029697224295248 +v -0.3125 1.8567656374994383 9.64700243716721 +v -0.3125 1.1416888839773327 9.127468764945391 +v -0.3125 1.239460424627477 9.744773977817353 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 -0.15643446504023087 -0.9876883405951378 +vn 1 0 0 +vn 0 0.15643446504023087 0.9876883405951378 +vn -1 0 0 +vn 0 0.9876883405951378 -0.15643446504023087 +vn 0 -0.9876883405951378 0.15643446504023087 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 476/1420/355 479/1419/355 477/1418/355 474/1417/355 +f 475/1424/356 476/1423/356 474/1422/356 473/1421/356 +f 480/1428/357 475/1427/357 473/1426/357 478/1425/357 +f 479/1432/358 480/1431/358 478/1430/358 477/1429/358 +f 478/1436/359 473/1435/359 474/1434/359 477/1433/359 +f 479/1440/360 476/1439/360 475/1438/360 480/1437/360 +o tail +v 0.0625 2.084133414518194 9.484432778332758 +v 0.0625 2.025470490128107 9.114049650609582 +v 0.0625 1.8372113293694095 9.523541394592817 +v 0.0625 1.7785484049793228 9.15315826686964 +v -0.0625 2.025470490128107 9.114049650609582 +v -0.0625 2.084133414518194 9.484432778332758 +v -0.0625 1.7785484049793228 9.15315826686964 +v -0.0625 1.8372113293694095 9.523541394592817 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 -0.15643446504023087 -0.9876883405951378 +vn 1 0 0 +vn 0 0.15643446504023087 0.9876883405951378 +vn -1 0 0 +vn 0 0.9876883405951378 -0.15643446504023087 +vn 0 -0.9876883405951378 0.15643446504023087 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 484/1444/361 487/1443/361 485/1442/361 482/1441/361 +f 483/1448/362 484/1447/362 482/1446/362 481/1445/362 +f 488/1452/363 483/1451/363 481/1450/363 486/1449/363 +f 487/1456/364 488/1455/364 486/1454/364 485/1453/364 +f 486/1460/365 481/1459/365 482/1458/365 485/1457/365 +f 487/1464/366 484/1463/366 483/1462/366 488/1461/366 +o tail +v 0.3125 1.924231412908326 10.284799247326308 +v 0.3125 1.858901123366043 9.663223062721139 +v 0.3125 1.3026552283031554 10.350129536868593 +v 0.3125 1.237324938760872 9.728553352263424 +v -0.3125 1.858901123366043 9.663223062721139 +v -0.3125 1.924231412908326 10.284799247326308 +v -0.3125 1.237324938760872 9.728553352263424 +v -0.3125 1.3026552283031554 10.350129536868593 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 -0.10452846326765347 -0.9945218953682733 +vn 1 0 0 +vn 0 0.10452846326765347 0.9945218953682733 +vn -1 0 0 +vn 0 0.9945218953682733 -0.10452846326765347 +vn 0 -0.9945218953682733 0.10452846326765347 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 492/1468/367 495/1467/367 493/1466/367 490/1465/367 +f 491/1472/368 492/1471/368 490/1470/368 489/1469/368 +f 496/1476/369 491/1475/369 489/1474/369 494/1473/369 +f 495/1480/370 496/1479/370 494/1478/370 493/1477/370 +f 494/1484/371 489/1483/371 490/1482/371 493/1481/371 +f 495/1488/372 492/1487/372 491/1486/372 496/1485/372 +o tail +v 0.0625 2.159795828841938 10.134351894588363 +v 0.0625 2.120597655116568 9.76140618382526 +v 0.0625 1.91116535499987 10.160484010405275 +v 0.0625 1.8719671812745 9.787538299642172 +v -0.0625 2.120597655116568 9.76140618382526 +v -0.0625 2.159795828841938 10.134351894588363 +v -0.0625 1.8719671812745 9.787538299642172 +v -0.0625 1.91116535499987 10.160484010405275 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 -0.10452846326765347 -0.9945218953682733 +vn 1 0 0 +vn 0 0.10452846326765347 0.9945218953682733 +vn -1 0 0 +vn 0 0.9945218953682733 -0.10452846326765347 +vn 0 -0.9945218953682733 0.10452846326765347 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 500/1492/373 503/1491/373 501/1490/373 498/1489/373 +f 499/1496/374 500/1495/374 498/1494/374 497/1493/374 +f 504/1500/375 499/1499/375 497/1498/375 502/1497/375 +f 503/1504/376 504/1503/376 502/1502/376 501/1501/376 +f 502/1508/377 497/1507/377 498/1506/377 501/1505/377 +f 503/1512/378 500/1511/378 499/1510/378 504/1509/378 +o tail +v 0.3125 1.958225022868385 10.92525286499314 +v 0.3125 1.9255150502165446 10.301109405771532 +v 0.3125 1.3340815636467762 10.957962837644981 +v 0.3125 1.3013715909949364 10.333819378423373 +v -0.3125 1.9255150502165446 10.301109405771532 +v -0.3125 1.958225022868385 10.92525286499314 +v -0.3125 1.3013715909949364 10.333819378423373 +v -0.3125 1.3340815636467762 10.957962837644981 +vt 0.7890625 0.5546875 +vt 0.828125 0.5546875 +vt 0.828125 0.515625 +vt 0.7890625 0.515625 +vt 0.75 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.515625 +vt 0.75 0.515625 +vt 0.8671875 0.5546875 +vt 0.90625 0.5546875 +vt 0.90625 0.515625 +vt 0.8671875 0.515625 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vt 0.8671875 0.515625 +vt 0.828125 0.515625 +vt 0.828125 0.5546875 +vt 0.7890625 0.5546875 +vt 0.7890625 0.59375 +vt 0.828125 0.59375 +vt 0.8671875 0.59375 +vt 0.828125 0.59375 +vt 0.828125 0.5546875 +vt 0.8671875 0.5546875 +vn 0 -0.05233595624294385 -0.998629534754574 +vn 1 0 0 +vn 0 0.05233595624294385 0.998629534754574 +vn -1 0 0 +vn 0 0.998629534754574 -0.05233595624294385 +vn 0 -0.998629534754574 0.05233595624294385 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 508/1516/379 511/1515/379 509/1514/379 506/1513/379 +f 507/1520/380 508/1519/380 506/1518/380 505/1517/380 +f 512/1524/381 507/1523/381 505/1522/381 510/1521/381 +f 511/1528/382 512/1527/382 510/1526/382 509/1525/382 +f 510/1532/383 505/1531/383 506/1530/383 509/1529/383 +f 511/1536/384 508/1535/384 507/1534/384 512/1533/384 +o tail +v 0.0625 2.20134041202666 10.787340184088084 +v 0.0625 2.1817144284355567 10.412854108555118 +v 0.0625 1.9516830283380169 10.80042417314882 +v 0.0625 1.9320570447469132 10.425938097615854 +v -0.0625 2.1817144284355567 10.412854108555118 +v -0.0625 2.20134041202666 10.787340184088084 +v -0.0625 1.9320570447469132 10.425938097615854 +v -0.0625 1.9516830283380169 10.80042417314882 +vt 0.2109375 0.9765625 +vt 0.21875 0.9765625 +vt 0.21875 0.9609375 +vt 0.2109375 0.9609375 +vt 0.1875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 0.9609375 +vt 0.1875 0.9609375 +vt 0.2421875 0.9765625 +vt 0.25 0.9765625 +vt 0.25 0.9609375 +vt 0.2421875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2421875 0.9765625 +vt 0.2421875 0.9609375 +vt 0.21875 0.9609375 +vt 0.21875 0.9765625 +vt 0.2109375 0.9765625 +vt 0.2109375 1 +vt 0.21875 1 +vt 0.2265625 1 +vt 0.21875 1 +vt 0.21875 0.9765625 +vt 0.2265625 0.9765625 +vn 0 -0.05233595624294385 -0.998629534754574 +vn 1 0 0 +vn 0 0.05233595624294385 0.998629534754574 +vn -1 0 0 +vn 0 0.998629534754574 -0.05233595624294385 +vn 0 -0.998629534754574 0.05233595624294385 +usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f +f 516/1540/385 519/1539/385 517/1538/385 514/1537/385 +f 515/1544/386 516/1543/386 514/1542/386 513/1541/386 +f 520/1548/387 515/1547/387 513/1546/387 518/1545/387 +f 519/1552/388 520/1551/388 518/1550/388 517/1549/388 +f 518/1556/389 513/1555/389 514/1554/389 517/1553/389 +f 519/1560/390 516/1559/390 515/1558/390 520/1557/390 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/enderman.obj b/prismarine-viewer/viewer/lib/entity/models/enderman.obj new file mode 100644 index 00000000..6b405674 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/enderman.obj @@ -0,0 +1,325 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o Head +v 0.21875 2.96875 0.21875 +v 0.21875 2.96875 -0.21875 +v 0.21875 2.53125 0.21875 +v 0.21875 2.53125 -0.21875 +v -0.21875 2.96875 -0.21875 +v -0.21875 2.96875 0.21875 +v -0.21875 2.53125 -0.21875 +v -0.21875 2.53125 0.21875 +vt 0.125 0.75 +vt 0.25 0.75 +vt 0.25 0.5 +vt 0.125 0.5 +vt 0 0.75 +vt 0.125 0.75 +vt 0.125 0.5 +vt 0 0.5 +vt 0.375 0.75 +vt 0.5 0.75 +vt 0.5 0.5 +vt 0.375 0.5 +vt 0.25 0.75 +vt 0.375 0.75 +vt 0.375 0.5 +vt 0.25 0.5 +vt 0.25 0.75 +vt 0.125 0.75 +vt 0.125 1 +vt 0.25 1 +vt 0.375 1 +vt 0.25 1 +vt 0.25 0.75 +vt 0.375 0.75 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_981d8dac-1361-c897-71b0-9983b6b479fc +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o Head layer +v 0.21875 2.84375 0.21875 +v 0.21875 2.84375 -0.21875 +v 0.21875 2.40625 0.21875 +v 0.21875 2.40625 -0.21875 +v -0.21875 2.84375 -0.21875 +v -0.21875 2.84375 0.21875 +v -0.21875 2.40625 -0.21875 +v -0.21875 2.40625 0.21875 +vt 0.125 0.25 +vt 0.25 0.25 +vt 0.25 0 +vt 0.125 0 +vt 0 0.25 +vt 0.125 0.25 +vt 0.125 0 +vt 0 0 +vt 0.375 0.25 +vt 0.5 0.25 +vt 0.5 0 +vt 0.375 0 +vt 0.25 0.25 +vt 0.375 0.25 +vt 0.375 0 +vt 0.25 0 +vt 0.25 0.25 +vt 0.125 0.25 +vt 0.125 0.5 +vt 0.25 0.5 +vt 0.375 0.5 +vt 0.25 0.5 +vt 0.25 0.25 +vt 0.375 0.25 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_981d8dac-1361-c897-71b0-9983b6b479fc +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o Body +v 0.25 2.375 0.125 +v 0.25 2.375 -0.125 +v 0.25 1.625 0.125 +v 0.25 1.625 -0.125 +v -0.25 2.375 -0.125 +v -0.25 2.375 0.125 +v -0.25 1.625 -0.125 +v -0.25 1.625 0.125 +vt 0.5625 0.375 +vt 0.6875 0.375 +vt 0.6875 0 +vt 0.5625 0 +vt 0.5 0.375 +vt 0.5625 0.375 +vt 0.5625 0 +vt 0.5 0 +vt 0.75 0.375 +vt 0.875 0.375 +vt 0.875 0 +vt 0.75 0 +vt 0.6875 0.375 +vt 0.75 0.375 +vt 0.75 0 +vt 0.6875 0 +vt 0.6875 0.375 +vt 0.5625 0.375 +vt 0.5625 0.5 +vt 0.6875 0.5 +vt 0.8125 0.5 +vt 0.6875 0.5 +vt 0.6875 0.375 +vt 0.8125 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_981d8dac-1361-c897-71b0-9983b6b479fc +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o RightArm +v 0.375 2.375 0.0625 +v 0.375 2.375 -0.0625 +v 0.375 0.5 0.0625 +v 0.375 0.5 -0.0625 +v 0.25 2.375 -0.0625 +v 0.25 2.375 0.0625 +v 0.25 0.5 -0.0625 +v 0.25 0.5 0.0625 +vt 0.90625 0.9375 +vt 0.9375 0.9375 +vt 0.9375 0 +vt 0.90625 0 +vt 0.875 0.9375 +vt 0.90625 0.9375 +vt 0.90625 0 +vt 0.875 0 +vt 0.96875 0.9375 +vt 1 0.9375 +vt 1 0 +vt 0.96875 0 +vt 0.9375 0.9375 +vt 0.96875 0.9375 +vt 0.96875 0 +vt 0.9375 0 +vt 0.9375 0.9375 +vt 0.90625 0.9375 +vt 0.90625 1 +vt 0.9375 1 +vt 0.96875 1 +vt 0.9375 1 +vt 0.9375 0.9375 +vt 0.96875 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_981d8dac-1361-c897-71b0-9983b6b479fc +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o LeftArm +v -0.25 2.375 0.0625 +v -0.25 2.375 -0.0625 +v -0.25 0.5 0.0625 +v -0.25 0.5 -0.0625 +v -0.375 2.375 -0.0625 +v -0.375 2.375 0.0625 +v -0.375 0.5 -0.0625 +v -0.375 0.5 0.0625 +vt 0.9375 0.9375 +vt 0.90625 0.9375 +vt 0.90625 0 +vt 0.9375 0 +vt 0.96875 0.9375 +vt 0.9375 0.9375 +vt 0.9375 0 +vt 0.96875 0 +vt 1 0.9375 +vt 0.96875 0.9375 +vt 0.96875 0 +vt 1 0 +vt 0.90625 0.9375 +vt 0.875 0.9375 +vt 0.875 0 +vt 0.90625 0 +vt 0.90625 0.9375 +vt 0.9375 0.9375 +vt 0.9375 1 +vt 0.90625 1 +vt 0.9375 1 +vt 0.96875 1 +vt 0.96875 0.9375 +vt 0.9375 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_981d8dac-1361-c897-71b0-9983b6b479fc +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o RightLeg +v 0.1875 1.625 0.0625 +v 0.1875 1.625 -0.0625 +v 0.1875 -0.25 0.0625 +v 0.1875 -0.25 -0.0625 +v 0.0625 1.625 -0.0625 +v 0.0625 1.625 0.0625 +v 0.0625 -0.25 -0.0625 +v 0.0625 -0.25 0.0625 +vt 0.90625 0.9375 +vt 0.9375 0.9375 +vt 0.9375 0 +vt 0.90625 0 +vt 0.875 0.9375 +vt 0.90625 0.9375 +vt 0.90625 0 +vt 0.875 0 +vt 0.96875 0.9375 +vt 1 0.9375 +vt 1 0 +vt 0.96875 0 +vt 0.9375 0.9375 +vt 0.96875 0.9375 +vt 0.96875 0 +vt 0.9375 0 +vt 0.9375 0.9375 +vt 0.90625 0.9375 +vt 0.90625 1 +vt 0.9375 1 +vt 0.96875 1 +vt 0.9375 1 +vt 0.9375 0.9375 +vt 0.96875 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_981d8dac-1361-c897-71b0-9983b6b479fc +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o LeftLeg +v -0.0625 1.625 0.0625 +v -0.0625 1.625 -0.0625 +v -0.0625 -0.25 0.0625 +v -0.0625 -0.25 -0.0625 +v -0.1875 1.625 -0.0625 +v -0.1875 1.625 0.0625 +v -0.1875 -0.25 -0.0625 +v -0.1875 -0.25 0.0625 +vt 0.9375 0.9375 +vt 0.90625 0.9375 +vt 0.90625 0 +vt 0.9375 0 +vt 0.96875 0.9375 +vt 0.9375 0.9375 +vt 0.9375 0 +vt 0.96875 0 +vt 1 0.9375 +vt 0.96875 0.9375 +vt 0.96875 0 +vt 1 0 +vt 0.90625 0.9375 +vt 0.875 0.9375 +vt 0.875 0 +vt 0.90625 0 +vt 0.90625 0.9375 +vt 0.9375 0.9375 +vt 0.9375 1 +vt 0.90625 1 +vt 0.9375 1 +vt 0.96875 1 +vt 0.96875 0.9375 +vt 0.9375 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_981d8dac-1361-c897-71b0-9983b6b479fc +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/endermite.obj b/prismarine-viewer/viewer/lib/entity/models/endermite.obj new file mode 100644 index 00000000..595376cd --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/endermite.obj @@ -0,0 +1,187 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o section_2 +v 0.09375 0.1875 0.21875 +v 0.09375 0.1875 0.15625 +v 0.09375 0 0.21875 +v 0.09375 0 0.15625 +v -0.09375 0.1875 0.15625 +v -0.09375 0.1875 0.21875 +v -0.09375 0 0.15625 +v -0.09375 0 0.21875 +vt 0.015625 0.53125 +vt 0.0625 0.53125 +vt 0.0625 0.4375 +vt 0.015625 0.4375 +vt 0 0.53125 +vt 0.015625 0.53125 +vt 0.015625 0.4375 +vt 0 0.4375 +vt 0.078125 0.53125 +vt 0.125 0.53125 +vt 0.125 0.4375 +vt 0.078125 0.4375 +vt 0.0625 0.53125 +vt 0.078125 0.53125 +vt 0.078125 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.53125 +vt 0.015625 0.53125 +vt 0.015625 0.5625 +vt 0.0625 0.5625 +vt 0.109375 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.53125 +vt 0.109375 0.53125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_50f00cc5-283b-b301-14d6-d02da334960b +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o section_0 +v 0.125 0.1875 -0.15000000000000002 +v 0.125 0.1875 -0.275 +v 0.125 0 -0.15000000000000002 +v 0.125 0 -0.275 +v -0.125 0.1875 -0.275 +v -0.125 0.1875 -0.15000000000000002 +v -0.125 0 -0.275 +v -0.125 0 -0.15000000000000002 +vt 0.03125 0.9375 +vt 0.09375 0.9375 +vt 0.09375 0.84375 +vt 0.03125 0.84375 +vt 0 0.9375 +vt 0.03125 0.9375 +vt 0.03125 0.84375 +vt 0 0.84375 +vt 0.125 0.9375 +vt 0.1875 0.9375 +vt 0.1875 0.84375 +vt 0.125 0.84375 +vt 0.09375 0.9375 +vt 0.125 0.9375 +vt 0.125 0.84375 +vt 0.09375 0.84375 +vt 0.09375 0.9375 +vt 0.03125 0.9375 +vt 0.03125 1 +vt 0.09375 1 +vt 0.15625 1 +vt 0.09375 1 +vt 0.09375 0.9375 +vt 0.15625 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_50f00cc5-283b-b301-14d6-d02da334960b +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o section_1 +v 0.1875 0.25 0.16249999999999998 +v 0.1875 0.25 -0.15000000000000002 +v 0.1875 0 0.16249999999999998 +v 0.1875 0 -0.15000000000000002 +v -0.1875 0.25 -0.15000000000000002 +v -0.1875 0.25 0.16249999999999998 +v -0.1875 0 -0.15000000000000002 +v -0.1875 0 0.16249999999999998 +vt 0.078125 0.6875 +vt 0.171875 0.6875 +vt 0.171875 0.5625 +vt 0.078125 0.5625 +vt 0 0.6875 +vt 0.078125 0.6875 +vt 0.078125 0.5625 +vt 0 0.5625 +vt 0.25 0.6875 +vt 0.34375 0.6875 +vt 0.34375 0.5625 +vt 0.25 0.5625 +vt 0.171875 0.6875 +vt 0.25 0.6875 +vt 0.25 0.5625 +vt 0.171875 0.5625 +vt 0.171875 0.6875 +vt 0.078125 0.6875 +vt 0.078125 0.84375 +vt 0.171875 0.84375 +vt 0.265625 0.84375 +vt 0.171875 0.84375 +vt 0.171875 0.6875 +vt 0.265625 0.6875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_50f00cc5-283b-b301-14d6-d02da334960b +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o section_3 +v 0.03125 0.125 0.28125 +v 0.03125 0.125 0.21875 +v 0.03125 0 0.28125 +v 0.03125 0 0.21875 +v -0.03125 0.125 0.21875 +v -0.03125 0.125 0.28125 +v -0.03125 0 0.21875 +v -0.03125 0 0.28125 +vt 0.015625 0.40625 +vt 0.03125 0.40625 +vt 0.03125 0.34375 +vt 0.015625 0.34375 +vt 0 0.40625 +vt 0.015625 0.40625 +vt 0.015625 0.34375 +vt 0 0.34375 +vt 0.046875 0.40625 +vt 0.0625 0.40625 +vt 0.0625 0.34375 +vt 0.046875 0.34375 +vt 0.03125 0.40625 +vt 0.046875 0.40625 +vt 0.046875 0.34375 +vt 0.03125 0.34375 +vt 0.03125 0.40625 +vt 0.015625 0.40625 +vt 0.015625 0.4375 +vt 0.03125 0.4375 +vt 0.046875 0.4375 +vt 0.03125 0.4375 +vt 0.03125 0.40625 +vt 0.046875 0.40625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_50f00cc5-283b-b301-14d6-d02da334960b +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/fox.obj b/prismarine-viewer/viewer/lib/entity/models/fox.obj new file mode 100644 index 00000000..a0645b37 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/fox.obj @@ -0,0 +1,463 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.1875 0.6875 -0.1875 +v 0.1875 0.3125 -0.1875 +v 0.1875 0.6875 0.5 +v 0.1875 0.3124999999999999 0.5 +v -0.1875 0.3125 -0.1875 +v -0.1875 0.6875 -0.1875 +v -0.1875 0.3124999999999999 0.5 +v -0.1875 0.6875 0.5 +vt 0.625 0.34375 +vt 0.75 0.34375 +vt 0.75 0 +vt 0.625 0 +vt 0.5 0.34375 +vt 0.625 0.34375 +vt 0.625 0 +vt 0.5 0 +vt 0.875 0.34375 +vt 1 0.34375 +vt 1 0 +vt 0.875 0 +vt 0.75 0.34375 +vt 0.875 0.34375 +vt 0.875 0 +vt 0.75 0 +vt 0.75 0.34375 +vt 0.625 0.34375 +vt 0.625 0.53125 +vt 0.75 0.53125 +vt 0.875 0.53125 +vt 0.75 0.53125 +vt 0.75 0.34375 +vt 0.875 0.34375 +vn 0 -1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 -1 +vn 0 -2.220446049250313e-16 1 +usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o head +v 0.25 0.625 -0.1875 +v 0.25 0.625 -0.5625 +v 0.25 0.25 -0.1875 +v 0.25 0.25 -0.5625 +v -0.25 0.625 -0.5625 +v -0.25 0.625 -0.1875 +v -0.25 0.25 -0.5625 +v -0.25 0.25 -0.1875 +vt 0.14583333333333334 0.65625 +vt 0.3125 0.65625 +vt 0.3125 0.46875 +vt 0.14583333333333334 0.46875 +vt 0.020833333333333332 0.65625 +vt 0.14583333333333334 0.65625 +vt 0.14583333333333334 0.46875 +vt 0.020833333333333332 0.46875 +vt 0.4375 0.65625 +vt 0.6041666666666666 0.65625 +vt 0.6041666666666666 0.46875 +vt 0.4375 0.46875 +vt 0.3125 0.65625 +vt 0.4375 0.65625 +vt 0.4375 0.46875 +vt 0.3125 0.46875 +vt 0.3125 0.65625 +vt 0.14583333333333334 0.65625 +vt 0.14583333333333334 0.84375 +vt 0.3125 0.84375 +vt 0.4791666666666667 0.84375 +vt 0.3125 0.84375 +vt 0.3125 0.65625 +vt 0.4791666666666667 0.65625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o head +v 0.25 0.75 -0.4375 +v 0.25 0.75 -0.5 +v 0.25 0.625 -0.4375 +v 0.25 0.625 -0.5 +v 0.125 0.75 -0.5 +v 0.125 0.75 -0.4375 +v 0.125 0.625 -0.5 +v 0.125 0.625 -0.4375 +vt 0.1875 0.9375 +vt 0.22916666666666666 0.9375 +vt 0.22916666666666666 0.875 +vt 0.1875 0.875 +vt 0.16666666666666666 0.9375 +vt 0.1875 0.9375 +vt 0.1875 0.875 +vt 0.16666666666666666 0.875 +vt 0.25 0.9375 +vt 0.2916666666666667 0.9375 +vt 0.2916666666666667 0.875 +vt 0.25 0.875 +vt 0.22916666666666666 0.9375 +vt 0.25 0.9375 +vt 0.25 0.875 +vt 0.22916666666666666 0.875 +vt 0.22916666666666666 0.9375 +vt 0.1875 0.9375 +vt 0.1875 0.96875 +vt 0.22916666666666666 0.96875 +vt 0.2708333333333333 0.96875 +vt 0.22916666666666666 0.96875 +vt 0.22916666666666666 0.9375 +vt 0.2708333333333333 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o head +v -0.125 0.75 -0.4375 +v -0.125 0.75 -0.5 +v -0.125 0.625 -0.4375 +v -0.125 0.625 -0.5 +v -0.25 0.75 -0.5 +v -0.25 0.75 -0.4375 +v -0.25 0.625 -0.5 +v -0.25 0.625 -0.4375 +vt 0.3333333333333333 0.9375 +vt 0.375 0.9375 +vt 0.375 0.875 +vt 0.3333333333333333 0.875 +vt 0.3125 0.9375 +vt 0.3333333333333333 0.9375 +vt 0.3333333333333333 0.875 +vt 0.3125 0.875 +vt 0.3958333333333333 0.9375 +vt 0.4375 0.9375 +vt 0.4375 0.875 +vt 0.3958333333333333 0.875 +vt 0.375 0.9375 +vt 0.3958333333333333 0.9375 +vt 0.3958333333333333 0.875 +vt 0.375 0.875 +vt 0.375 0.9375 +vt 0.3333333333333333 0.9375 +vt 0.3333333333333333 0.96875 +vt 0.375 0.96875 +vt 0.4166666666666667 0.96875 +vt 0.375 0.96875 +vt 0.375 0.9375 +vt 0.4166666666666667 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o head +v 0.125 0.375 -0.5625 +v 0.125 0.375 -0.75 +v 0.125 0.25 -0.5625 +v 0.125 0.25 -0.75 +v -0.125 0.375 -0.75 +v -0.125 0.375 -0.5625 +v -0.125 0.25 -0.75 +v -0.125 0.25 -0.5625 +vt 0.1875 0.34375 +vt 0.2708333333333333 0.34375 +vt 0.2708333333333333 0.28125 +vt 0.1875 0.28125 +vt 0.125 0.34375 +vt 0.1875 0.34375 +vt 0.1875 0.28125 +vt 0.125 0.28125 +vt 0.3333333333333333 0.34375 +vt 0.4166666666666667 0.34375 +vt 0.4166666666666667 0.28125 +vt 0.3333333333333333 0.28125 +vt 0.2708333333333333 0.34375 +vt 0.3333333333333333 0.34375 +vt 0.3333333333333333 0.28125 +vt 0.2708333333333333 0.28125 +vt 0.2708333333333333 0.34375 +vt 0.1875 0.34375 +vt 0.1875 0.4375 +vt 0.2708333333333333 0.4375 +vt 0.3541666666666667 0.4375 +vt 0.2708333333333333 0.4375 +vt 0.2708333333333333 0.34375 +vt 0.3541666666666667 0.34375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o leg0 +v 0.18781249999999994 0.375 0.4375 +v 0.18781249999999994 0.375 0.3125 +v 0.18781249999999994 0 0.4375 +v 0.18781249999999994 0 0.3125 +v 0.06281249999999994 0.375 0.3125 +v 0.06281249999999994 0.375 0.4375 +v 0.06281249999999994 0 0.3125 +v 0.06281249999999994 0 0.4375 +vt 0.3125 0.1875 +vt 0.3541666666666667 0.1875 +vt 0.3541666666666667 0 +vt 0.3125 0 +vt 0.2708333333333333 0.1875 +vt 0.3125 0.1875 +vt 0.3125 0 +vt 0.2708333333333333 0 +vt 0.3958333333333333 0.1875 +vt 0.4375 0.1875 +vt 0.4375 0 +vt 0.3958333333333333 0 +vt 0.3541666666666667 0.1875 +vt 0.3958333333333333 0.1875 +vt 0.3958333333333333 0 +vt 0.3541666666666667 0 +vt 0.3541666666666667 0.1875 +vt 0.3125 0.1875 +vt 0.3125 0.25 +vt 0.3541666666666667 0.25 +vt 0.3958333333333333 0.25 +vt 0.3541666666666667 0.25 +vt 0.3541666666666667 0.1875 +vt 0.3958333333333333 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o leg1 +v -0.0628125 0.375 0.4375 +v -0.0628125 0.375 0.3125 +v -0.0628125 0 0.4375 +v -0.0628125 0 0.3125 +v -0.1878125 0.375 0.3125 +v -0.1878125 0.375 0.4375 +v -0.1878125 0 0.3125 +v -0.1878125 0 0.4375 +vt 0.125 0.1875 +vt 0.16666666666666666 0.1875 +vt 0.16666666666666666 0 +vt 0.125 0 +vt 0.08333333333333333 0.1875 +vt 0.125 0.1875 +vt 0.125 0 +vt 0.08333333333333333 0 +vt 0.20833333333333334 0.1875 +vt 0.25 0.1875 +vt 0.25 0 +vt 0.20833333333333334 0 +vt 0.16666666666666666 0.1875 +vt 0.20833333333333334 0.1875 +vt 0.20833333333333334 0 +vt 0.16666666666666666 0 +vt 0.16666666666666666 0.1875 +vt 0.125 0.1875 +vt 0.125 0.25 +vt 0.16666666666666666 0.25 +vt 0.20833333333333334 0.25 +vt 0.16666666666666666 0.25 +vt 0.16666666666666666 0.1875 +vt 0.20833333333333334 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o leg2 +v 0.18781249999999994 0.375 0 +v 0.18781249999999994 0.375 -0.125 +v 0.18781249999999994 0 0 +v 0.18781249999999994 0 -0.125 +v 0.06281249999999994 0.375 -0.125 +v 0.06281249999999994 0.375 0 +v 0.06281249999999994 0 -0.125 +v 0.06281249999999994 0 0 +vt 0.3125 0.1875 +vt 0.3541666666666667 0.1875 +vt 0.3541666666666667 0 +vt 0.3125 0 +vt 0.2708333333333333 0.1875 +vt 0.3125 0.1875 +vt 0.3125 0 +vt 0.2708333333333333 0 +vt 0.3958333333333333 0.1875 +vt 0.4375 0.1875 +vt 0.4375 0 +vt 0.3958333333333333 0 +vt 0.3541666666666667 0.1875 +vt 0.3958333333333333 0.1875 +vt 0.3958333333333333 0 +vt 0.3541666666666667 0 +vt 0.3541666666666667 0.1875 +vt 0.3125 0.1875 +vt 0.3125 0.25 +vt 0.3541666666666667 0.25 +vt 0.3958333333333333 0.25 +vt 0.3541666666666667 0.25 +vt 0.3541666666666667 0.1875 +vt 0.3958333333333333 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o leg3 +v -0.0628125 0.375 0 +v -0.0628125 0.375 -0.125 +v -0.0628125 0 0 +v -0.0628125 0 -0.125 +v -0.1878125 0.375 -0.125 +v -0.1878125 0.375 0 +v -0.1878125 0 -0.125 +v -0.1878125 0 0 +vt 0.125 0.1875 +vt 0.16666666666666666 0.1875 +vt 0.16666666666666666 0 +vt 0.125 0 +vt 0.08333333333333333 0.1875 +vt 0.125 0.1875 +vt 0.125 0 +vt 0.08333333333333333 0 +vt 0.20833333333333334 0.1875 +vt 0.25 0.1875 +vt 0.25 0 +vt 0.20833333333333334 0 +vt 0.16666666666666666 0.1875 +vt 0.20833333333333334 0.1875 +vt 0.20833333333333334 0 +vt 0.16666666666666666 0 +vt 0.16666666666666666 0.1875 +vt 0.125 0.1875 +vt 0.125 0.25 +vt 0.16666666666666666 0.25 +vt 0.20833333333333334 0.25 +vt 0.16666666666666666 0.25 +vt 0.16666666666666666 0.1875 +vt 0.20833333333333334 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o tail +v 0.125 0.671875 0.5 +v 0.125 0.359375 0.5 +v 0.125 0.671875 1.0625 +v 0.125 0.3593749999999999 1.0625 +v -0.125 0.359375 0.5 +v -0.125 0.671875 0.5 +v -0.125 0.3593749999999999 1.0625 +v -0.125 0.671875 1.0625 +vt 0.7291666666666666 0.84375 +vt 0.8125 0.84375 +vt 0.8125 0.5625 +vt 0.7291666666666666 0.5625 +vt 0.625 0.84375 +vt 0.7291666666666666 0.84375 +vt 0.7291666666666666 0.5625 +vt 0.625 0.5625 +vt 0.9166666666666666 0.84375 +vt 1 0.84375 +vt 1 0.5625 +vt 0.9166666666666666 0.5625 +vt 0.8125 0.84375 +vt 0.9166666666666666 0.84375 +vt 0.9166666666666666 0.5625 +vt 0.8125 0.5625 +vt 0.8125 0.84375 +vt 0.7291666666666666 0.84375 +vt 0.7291666666666666 1 +vt 0.8125 1 +vt 0.8958333333333334 1 +vt 0.8125 1 +vt 0.8125 0.84375 +vt 0.8958333333333334 0.84375 +vn 0 -1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 -1 +vn 0 -2.220446049250313e-16 1 +usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/frog.obj b/prismarine-viewer/viewer/lib/entity/models/frog.obj new file mode 100644 index 00000000..e76a114e --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/frog.obj @@ -0,0 +1,739 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.21875 0.25 0.3125 +v 0.21875 0.25 -0.25 +v 0.21875 0.0625 0.3125 +v 0.21875 0.0625 -0.25 +v -0.21875 0.25 -0.25 +v -0.21875 0.25 0.3125 +v -0.21875 0.0625 -0.25 +v -0.21875 0.0625 0.3125 +vt 0.25 0.7916666666666666 +vt 0.3958333333333333 0.7916666666666666 +vt 0.3958333333333333 0.7291666666666667 +vt 0.25 0.7291666666666667 +vt 0.0625 0.7916666666666666 +vt 0.25 0.7916666666666666 +vt 0.25 0.7291666666666667 +vt 0.0625 0.7291666666666667 +vt 0.5833333333333334 0.7916666666666666 +vt 0.7291666666666666 0.7916666666666666 +vt 0.7291666666666666 0.7291666666666667 +vt 0.5833333333333334 0.7291666666666667 +vt 0.3958333333333333 0.7916666666666666 +vt 0.5833333333333334 0.7916666666666666 +vt 0.5833333333333334 0.7291666666666667 +vt 0.3958333333333333 0.7291666666666667 +vt 0.3958333333333333 0.7916666666666666 +vt 0.25 0.7916666666666666 +vt 0.25 0.9791666666666666 +vt 0.3958333333333333 0.9791666666666666 +vt 0.5416666666666666 0.9791666666666666 +vt 0.3958333333333333 0.9791666666666666 +vt 0.3958333333333333 0.7916666666666666 +vt 0.5416666666666666 0.7916666666666666 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o body +v 0.21875 0.1875 0.3125 +v 0.21875 0.1875 -0.25 +v 0.21875 0.1875 0.3125 +v 0.21875 0.1875 -0.25 +v -0.21875 0.1875 -0.25 +v -0.21875 0.1875 0.3125 +v -0.21875 0.1875 -0.25 +v -0.21875 0.1875 0.3125 +vt 0.6666666666666666 0.35416666666666663 +vt 0.8125 0.35416666666666663 +vt 0.8125 0.35416666666666663 +vt 0.6666666666666666 0.35416666666666663 +vt 0.4791666666666667 0.35416666666666663 +vt 0.6666666666666666 0.35416666666666663 +vt 0.6666666666666666 0.35416666666666663 +vt 0.4791666666666667 0.35416666666666663 +vt 1 0.35416666666666663 +vt 1.1458333333333333 0.35416666666666663 +vt 1.1458333333333333 0.35416666666666663 +vt 1 0.35416666666666663 +vt 0.8125 0.35416666666666663 +vt 1 0.35416666666666663 +vt 1 0.35416666666666663 +vt 0.8125 0.35416666666666663 +vt 0.8125 0.35416666666666663 +vt 0.6666666666666666 0.35416666666666663 +vt 0.6666666666666666 0.5416666666666667 +vt 0.8125 0.5416666666666667 +vt 0.9583333333333334 0.5416666666666667 +vt 0.8125 0.5416666666666667 +vt 0.8125 0.35416666666666663 +vt 0.9583333333333334 0.35416666666666663 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o head +v 0.21875 0.3125 0.3125 +v 0.21875 0.3125 -0.25 +v 0.21875 0.3125 0.3125 +v 0.21875 0.3125 -0.25 +v -0.21875 0.3125 -0.25 +v -0.21875 0.3125 0.3125 +v -0.21875 0.3125 -0.25 +v -0.21875 0.3125 0.3125 +vt 0.6666666666666666 0.5416666666666667 +vt 0.8125 0.5416666666666667 +vt 0.8125 0.5416666666666667 +vt 0.6666666666666666 0.5416666666666667 +vt 0.4791666666666667 0.5416666666666667 +vt 0.6666666666666666 0.5416666666666667 +vt 0.6666666666666666 0.5416666666666667 +vt 0.4791666666666667 0.5416666666666667 +vt 1 0.5416666666666667 +vt 1.1458333333333333 0.5416666666666667 +vt 1.1458333333333333 0.5416666666666667 +vt 1 0.5416666666666667 +vt 0.8125 0.5416666666666667 +vt 1 0.5416666666666667 +vt 1 0.5416666666666667 +vt 0.8125 0.5416666666666667 +vt 0.8125 0.5416666666666667 +vt 0.6666666666666666 0.5416666666666667 +vt 0.6666666666666666 0.7291666666666667 +vt 0.8125 0.7291666666666667 +vt 0.9583333333333334 0.7291666666666667 +vt 0.8125 0.7291666666666667 +vt 0.8125 0.5416666666666667 +vt 0.9583333333333334 0.5416666666666667 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o head +v 0.21875 0.375 0.3125 +v 0.21875 0.375 -0.25 +v 0.21875 0.1875 0.3125 +v 0.21875 0.1875 -0.25 +v -0.21875 0.375 -0.25 +v -0.21875 0.375 0.3125 +v -0.21875 0.1875 -0.25 +v -0.21875 0.1875 0.3125 +vt 0.1875 0.5416666666666667 +vt 0.3333333333333333 0.5416666666666667 +vt 0.3333333333333333 0.47916666666666663 +vt 0.1875 0.47916666666666663 +vt 0 0.5416666666666667 +vt 0.1875 0.5416666666666667 +vt 0.1875 0.47916666666666663 +vt 0 0.47916666666666663 +vt 0.5208333333333334 0.5416666666666667 +vt 0.6666666666666666 0.5416666666666667 +vt 0.6666666666666666 0.47916666666666663 +vt 0.5208333333333334 0.47916666666666663 +vt 0.3333333333333333 0.5416666666666667 +vt 0.5208333333333334 0.5416666666666667 +vt 0.5208333333333334 0.47916666666666663 +vt 0.3333333333333333 0.47916666666666663 +vt 0.3333333333333333 0.5416666666666667 +vt 0.1875 0.5416666666666667 +vt 0.1875 0.7291666666666667 +vt 0.3333333333333333 0.7291666666666667 +vt 0.4791666666666667 0.7291666666666667 +vt 0.3333333333333333 0.7291666666666667 +vt 0.3333333333333333 0.5416666666666667 +vt 0.4791666666666667 0.5416666666666667 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o right_eye +v 0.21875 0.5 0 +v 0.21875 0.5 -0.1875 +v 0.21875 0.375 0 +v 0.21875 0.375 -0.1875 +v 0.03125 0.5 -0.1875 +v 0.03125 0.5 0 +v 0.03125 0.375 -0.1875 +v 0.03125 0.375 0 +vt 0.0625 0.9375 +vt 0.125 0.9375 +vt 0.125 0.8958333333333334 +vt 0.0625 0.8958333333333334 +vt 0 0.9375 +vt 0.0625 0.9375 +vt 0.0625 0.8958333333333334 +vt 0 0.8958333333333334 +vt 0.1875 0.9375 +vt 0.25 0.9375 +vt 0.25 0.8958333333333334 +vt 0.1875 0.8958333333333334 +vt 0.125 0.9375 +vt 0.1875 0.9375 +vt 0.1875 0.8958333333333334 +vt 0.125 0.8958333333333334 +vt 0.125 0.9375 +vt 0.0625 0.9375 +vt 0.0625 1 +vt 0.125 1 +vt 0.1875 1 +vt 0.125 1 +vt 0.125 0.9375 +vt 0.1875 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o left_eye +v -0.03125 0.5 0 +v -0.03125 0.5 -0.1875 +v -0.03125 0.375 0 +v -0.03125 0.375 -0.1875 +v -0.21875 0.5 -0.1875 +v -0.21875 0.5 0 +v -0.21875 0.375 -0.1875 +v -0.21875 0.375 0 +vt 0.0625 0.8333333333333334 +vt 0.125 0.8333333333333334 +vt 0.125 0.7916666666666666 +vt 0.0625 0.7916666666666666 +vt 0 0.8333333333333334 +vt 0.0625 0.8333333333333334 +vt 0.0625 0.7916666666666666 +vt 0 0.7916666666666666 +vt 0.1875 0.8333333333333334 +vt 0.25 0.8333333333333334 +vt 0.25 0.7916666666666666 +vt 0.1875 0.7916666666666666 +vt 0.125 0.8333333333333334 +vt 0.1875 0.8333333333333334 +vt 0.1875 0.7916666666666666 +vt 0.125 0.7916666666666666 +vt 0.125 0.8333333333333334 +vt 0.0625 0.8333333333333334 +vt 0.0625 0.8958333333333334 +vt 0.125 0.8958333333333334 +vt 0.1875 0.8958333333333334 +vt 0.125 0.8958333333333334 +vt 0.125 0.8333333333333334 +vt 0.1875 0.8333333333333334 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o croaking_body +v 0.21250000000000002 0.1875 -0.0625 +v 0.21250000000000002 0.1875 -0.2375 +v 0.21250000000000002 0.07499999999999996 -0.0625 +v 0.21250000000000002 0.07499999999999996 -0.2375 +v -0.21250000000000002 0.1875 -0.2375 +v -0.21250000000000002 0.1875 -0.0625 +v -0.21250000000000002 0.07499999999999996 -0.2375 +v -0.21250000000000002 0.07499999999999996 -0.0625 +vt 0.6041666666666666 0.8333333333333334 +vt 0.75 0.8333333333333334 +vt 0.75 0.7916666666666666 +vt 0.6041666666666666 0.7916666666666666 +vt 0.5416666666666666 0.8333333333333334 +vt 0.6041666666666666 0.8333333333333334 +vt 0.6041666666666666 0.7916666666666666 +vt 0.5416666666666666 0.7916666666666666 +vt 0.8125 0.8333333333333334 +vt 0.9583333333333334 0.8333333333333334 +vt 0.9583333333333334 0.7916666666666666 +vt 0.8125 0.7916666666666666 +vt 0.75 0.8333333333333334 +vt 0.8125 0.8333333333333334 +vt 0.8125 0.7916666666666666 +vt 0.75 0.7916666666666666 +vt 0.75 0.8333333333333334 +vt 0.6041666666666666 0.8333333333333334 +vt 0.6041666666666666 0.8958333333333334 +vt 0.75 0.8958333333333334 +vt 0.8958333333333334 0.8958333333333334 +vt 0.75 0.8958333333333334 +vt 0.75 0.8333333333333334 +vt 0.8958333333333334 0.8333333333333334 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o tongue +v 0.125 0.19374999999999998 0.30625 +v 0.125 0.19374999999999998 -0.13124999999999998 +v 0.125 0.19374999999999998 0.30625 +v 0.125 0.19374999999999998 -0.13124999999999998 +v -0.125 0.19374999999999998 -0.13124999999999998 +v -0.125 0.19374999999999998 0.30625 +v -0.125 0.19374999999999998 -0.13124999999999998 +v -0.125 0.19374999999999998 0.30625 +vt 0.5 0.5833333333333333 +vt 0.5833333333333334 0.5833333333333333 +vt 0.5833333333333334 0.5833333333333333 +vt 0.5 0.5833333333333333 +vt 0.3541666666666667 0.5833333333333333 +vt 0.5 0.5833333333333333 +vt 0.5 0.5833333333333333 +vt 0.3541666666666667 0.5833333333333333 +vt 0.7291666666666666 0.5833333333333333 +vt 0.8125 0.5833333333333333 +vt 0.8125 0.5833333333333333 +vt 0.7291666666666666 0.5833333333333333 +vt 0.5833333333333334 0.5833333333333333 +vt 0.7291666666666666 0.5833333333333333 +vt 0.7291666666666666 0.5833333333333333 +vt 0.5833333333333334 0.5833333333333333 +vt 0.5833333333333334 0.5833333333333333 +vt 0.5 0.5833333333333333 +vt 0.5 0.7291666666666667 +vt 0.5833333333333334 0.7291666666666667 +vt 0.6666666666666666 0.7291666666666667 +vt 0.5833333333333334 0.7291666666666667 +vt 0.5833333333333334 0.5833333333333333 +vt 0.6666666666666666 0.5833333333333333 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o left_arm +v -0.1875 0.1875 -0.03125 +v -0.1875 0.1875 -0.21875 +v -0.1875 0 -0.03125 +v -0.1875 0 -0.21875 +v -0.3125 0.1875 -0.21875 +v -0.3125 0.1875 -0.03125 +v -0.3125 0 -0.21875 +v -0.3125 0 -0.03125 +vt 0.0625 0.27083333333333337 +vt 0.10416666666666667 0.27083333333333337 +vt 0.10416666666666667 0.20833333333333337 +vt 0.0625 0.20833333333333337 +vt 0 0.27083333333333337 +vt 0.0625 0.27083333333333337 +vt 0.0625 0.20833333333333337 +vt 0 0.20833333333333337 +vt 0.16666666666666666 0.27083333333333337 +vt 0.20833333333333334 0.27083333333333337 +vt 0.20833333333333334 0.20833333333333337 +vt 0.16666666666666666 0.20833333333333337 +vt 0.10416666666666667 0.27083333333333337 +vt 0.16666666666666666 0.27083333333333337 +vt 0.16666666666666666 0.20833333333333337 +vt 0.10416666666666667 0.20833333333333337 +vt 0.10416666666666667 0.27083333333333337 +vt 0.0625 0.27083333333333337 +vt 0.0625 0.33333333333333337 +vt 0.10416666666666667 0.33333333333333337 +vt 0.14583333333333334 0.33333333333333337 +vt 0.10416666666666667 0.33333333333333337 +vt 0.10416666666666667 0.27083333333333337 +vt 0.14583333333333334 0.27083333333333337 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o left_arm +v 0 -0.0006249999999999867 0.03125 +v 0 -0.0006249999999999867 -0.46875 +v 0 -0.0006249999999999867 0.03125 +v 0 -0.0006249999999999867 -0.46875 +v -0.5 -0.0006249999999999867 -0.46875 +v -0.5 -0.0006249999999999867 0.03125 +v -0.5 -0.0006249999999999867 -0.46875 +v -0.5 -0.0006249999999999867 0.03125 +vt 0.5416666666666666 0 +vt 0.7083333333333334 0 +vt 0.7083333333333334 0 +vt 0.5416666666666666 0 +vt 0.375 0 +vt 0.5416666666666666 0 +vt 0.5416666666666666 0 +vt 0.375 0 +vt 0.875 0 +vt 1.0416666666666667 0 +vt 1.0416666666666667 0 +vt 0.875 0 +vt 0.7083333333333334 0 +vt 0.875 0 +vt 0.875 0 +vt 0.7083333333333334 0 +vt 0.7083333333333334 0 +vt 0.5416666666666666 0 +vt 0.5416666666666666 0.16666666666666663 +vt 0.7083333333333334 0.16666666666666663 +vt 0.875 0.16666666666666663 +vt 0.7083333333333334 0.16666666666666663 +vt 0.7083333333333334 0 +vt 0.875 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o right_arm +v 0.3125 0.1875 -0.03125 +v 0.3125 0.1875 -0.21875 +v 0.3125 0 -0.03125 +v 0.3125 0 -0.21875 +v 0.1875 0.1875 -0.21875 +v 0.1875 0.1875 -0.03125 +v 0.1875 0 -0.21875 +v 0.1875 0 -0.03125 +vt 0.0625 0.14583333333333337 +vt 0.10416666666666667 0.14583333333333337 +vt 0.10416666666666667 0.08333333333333337 +vt 0.0625 0.08333333333333337 +vt 0 0.14583333333333337 +vt 0.0625 0.14583333333333337 +vt 0.0625 0.08333333333333337 +vt 0 0.08333333333333337 +vt 0.16666666666666666 0.14583333333333337 +vt 0.20833333333333334 0.14583333333333337 +vt 0.20833333333333334 0.08333333333333337 +vt 0.16666666666666666 0.08333333333333337 +vt 0.10416666666666667 0.14583333333333337 +vt 0.16666666666666666 0.14583333333333337 +vt 0.16666666666666666 0.08333333333333337 +vt 0.10416666666666667 0.08333333333333337 +vt 0.10416666666666667 0.14583333333333337 +vt 0.0625 0.14583333333333337 +vt 0.0625 0.20833333333333337 +vt 0.10416666666666667 0.20833333333333337 +vt 0.14583333333333334 0.20833333333333337 +vt 0.10416666666666667 0.20833333333333337 +vt 0.10416666666666667 0.14583333333333337 +vt 0.14583333333333334 0.14583333333333337 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 +o right_arm +v 0.5 -0.0006249999999999867 0.03125 +v 0.5 -0.0006249999999999867 -0.46875 +v 0.5 -0.0006249999999999867 0.03125 +v 0.5 -0.0006249999999999867 -0.46875 +v 0 -0.0006249999999999867 -0.46875 +v 0 -0.0006249999999999867 0.03125 +v 0 -0.0006249999999999867 -0.46875 +v 0 -0.0006249999999999867 0.03125 +vt 0.20833333333333334 0 +vt 0.375 0 +vt 0.375 0 +vt 0.20833333333333334 0 +vt 0.041666666666666664 0 +vt 0.20833333333333334 0 +vt 0.20833333333333334 0 +vt 0.041666666666666664 0 +vt 0.5416666666666666 0 +vt 0.7083333333333334 0 +vt 0.7083333333333334 0 +vt 0.5416666666666666 0 +vt 0.375 0 +vt 0.5416666666666666 0 +vt 0.5416666666666666 0 +vt 0.375 0 +vt 0.375 0 +vt 0.20833333333333334 0 +vt 0.20833333333333334 0.16666666666666663 +vt 0.375 0.16666666666666663 +vt 0.5416666666666666 0.16666666666666663 +vt 0.375 0.16666666666666663 +vt 0.375 0 +vt 0.5416666666666666 0 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 92/268/67 95/267/67 93/266/67 90/265/67 +f 91/272/68 92/271/68 90/270/68 89/269/68 +f 96/276/69 91/275/69 89/274/69 94/273/69 +f 95/280/70 96/279/70 94/278/70 93/277/70 +f 94/284/71 89/283/71 90/282/71 93/281/71 +f 95/288/72 92/287/72 91/286/72 96/285/72 +o left_leg +v -0.15625 0.1875 0.375 +v -0.15625 0.1875 0.125 +v -0.15625 0 0.375 +v -0.15625 0 0.125 +v -0.34375 0.1875 0.125 +v -0.34375 0.1875 0.375 +v -0.34375 0 0.125 +v -0.34375 0 0.375 +vt 0.375 0.39583333333333337 +vt 0.4375 0.39583333333333337 +vt 0.4375 0.33333333333333337 +vt 0.375 0.33333333333333337 +vt 0.2916666666666667 0.39583333333333337 +vt 0.375 0.39583333333333337 +vt 0.375 0.33333333333333337 +vt 0.2916666666666667 0.33333333333333337 +vt 0.5208333333333334 0.39583333333333337 +vt 0.5833333333333334 0.39583333333333337 +vt 0.5833333333333334 0.33333333333333337 +vt 0.5208333333333334 0.33333333333333337 +vt 0.4375 0.39583333333333337 +vt 0.5208333333333334 0.39583333333333337 +vt 0.5208333333333334 0.33333333333333337 +vt 0.4375 0.33333333333333337 +vt 0.4375 0.39583333333333337 +vt 0.375 0.39583333333333337 +vt 0.375 0.47916666666666663 +vt 0.4375 0.47916666666666663 +vt 0.5 0.47916666666666663 +vt 0.4375 0.47916666666666663 +vt 0.4375 0.39583333333333337 +vt 0.5 0.39583333333333337 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 100/292/73 103/291/73 101/290/73 98/289/73 +f 99/296/74 100/295/74 98/294/74 97/293/74 +f 104/300/75 99/299/75 97/298/75 102/297/75 +f 103/304/76 104/303/76 102/302/76 101/301/76 +f 102/308/77 97/307/77 98/306/77 101/305/77 +f 103/312/78 100/311/78 99/310/78 104/309/78 +o left_leg +v -0.09375 -0.0006249999999999867 0.5 +v -0.09375 -0.0006249999999999867 0 +v -0.09375 -0.0006249999999999867 0.5 +v -0.09375 -0.0006249999999999867 0 +v -0.59375 -0.0006249999999999867 0 +v -0.59375 -0.0006249999999999867 0.5 +v -0.59375 -0.0006249999999999867 0 +v -0.59375 -0.0006249999999999867 0.5 +vt 0.20833333333333334 0.16666666666666663 +vt 0.375 0.16666666666666663 +vt 0.375 0.16666666666666663 +vt 0.20833333333333334 0.16666666666666663 +vt 0.041666666666666664 0.16666666666666663 +vt 0.20833333333333334 0.16666666666666663 +vt 0.20833333333333334 0.16666666666666663 +vt 0.041666666666666664 0.16666666666666663 +vt 0.5416666666666666 0.16666666666666663 +vt 0.7083333333333334 0.16666666666666663 +vt 0.7083333333333334 0.16666666666666663 +vt 0.5416666666666666 0.16666666666666663 +vt 0.375 0.16666666666666663 +vt 0.5416666666666666 0.16666666666666663 +vt 0.5416666666666666 0.16666666666666663 +vt 0.375 0.16666666666666663 +vt 0.375 0.16666666666666663 +vt 0.20833333333333334 0.16666666666666663 +vt 0.20833333333333334 0.33333333333333337 +vt 0.375 0.33333333333333337 +vt 0.5416666666666666 0.33333333333333337 +vt 0.375 0.33333333333333337 +vt 0.375 0.16666666666666663 +vt 0.5416666666666666 0.16666666666666663 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 108/316/79 111/315/79 109/314/79 106/313/79 +f 107/320/80 108/319/80 106/318/80 105/317/80 +f 112/324/81 107/323/81 105/322/81 110/321/81 +f 111/328/82 112/327/82 110/326/82 109/325/82 +f 110/332/83 105/331/83 106/330/83 109/329/83 +f 111/336/84 108/335/84 107/334/84 112/333/84 +o right_leg +v 0.34375 0.1875 0.375 +v 0.34375 0.1875 0.125 +v 0.34375 0 0.375 +v 0.34375 0 0.125 +v 0.15625 0.1875 0.125 +v 0.15625 0.1875 0.375 +v 0.15625 0 0.125 +v 0.15625 0 0.375 +vt 0.08333333333333333 0.39583333333333337 +vt 0.14583333333333334 0.39583333333333337 +vt 0.14583333333333334 0.33333333333333337 +vt 0.08333333333333333 0.33333333333333337 +vt 0 0.39583333333333337 +vt 0.08333333333333333 0.39583333333333337 +vt 0.08333333333333333 0.33333333333333337 +vt 0 0.33333333333333337 +vt 0.22916666666666666 0.39583333333333337 +vt 0.2916666666666667 0.39583333333333337 +vt 0.2916666666666667 0.33333333333333337 +vt 0.22916666666666666 0.33333333333333337 +vt 0.14583333333333334 0.39583333333333337 +vt 0.22916666666666666 0.39583333333333337 +vt 0.22916666666666666 0.33333333333333337 +vt 0.14583333333333334 0.33333333333333337 +vt 0.14583333333333334 0.39583333333333337 +vt 0.08333333333333333 0.39583333333333337 +vt 0.08333333333333333 0.47916666666666663 +vt 0.14583333333333334 0.47916666666666663 +vt 0.20833333333333334 0.47916666666666663 +vt 0.14583333333333334 0.47916666666666663 +vt 0.14583333333333334 0.39583333333333337 +vt 0.20833333333333334 0.39583333333333337 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 116/340/85 119/339/85 117/338/85 114/337/85 +f 115/344/86 116/343/86 114/342/86 113/341/86 +f 120/348/87 115/347/87 113/346/87 118/345/87 +f 119/352/88 120/351/88 118/350/88 117/349/88 +f 118/356/89 113/355/89 114/354/89 117/353/89 +f 119/360/90 116/359/90 115/358/90 120/357/90 +o right_leg +v 0.59375 -0.0006249999999999867 0.5 +v 0.59375 -0.0006249999999999867 0 +v 0.59375 -0.0006249999999999867 0.5 +v 0.59375 -0.0006249999999999867 0 +v 0.09375 -0.0006249999999999867 0 +v 0.09375 -0.0006249999999999867 0.5 +v 0.09375 -0.0006249999999999867 0 +v 0.09375 -0.0006249999999999867 0.5 +vt 0.5416666666666666 0.16666666666666663 +vt 0.7083333333333334 0.16666666666666663 +vt 0.7083333333333334 0.16666666666666663 +vt 0.5416666666666666 0.16666666666666663 +vt 0.375 0.16666666666666663 +vt 0.5416666666666666 0.16666666666666663 +vt 0.5416666666666666 0.16666666666666663 +vt 0.375 0.16666666666666663 +vt 0.875 0.16666666666666663 +vt 1.0416666666666667 0.16666666666666663 +vt 1.0416666666666667 0.16666666666666663 +vt 0.875 0.16666666666666663 +vt 0.7083333333333334 0.16666666666666663 +vt 0.875 0.16666666666666663 +vt 0.875 0.16666666666666663 +vt 0.7083333333333334 0.16666666666666663 +vt 0.7083333333333334 0.16666666666666663 +vt 0.5416666666666666 0.16666666666666663 +vt 0.5416666666666666 0.33333333333333337 +vt 0.7083333333333334 0.33333333333333337 +vt 0.875 0.33333333333333337 +vt 0.7083333333333334 0.33333333333333337 +vt 0.7083333333333334 0.16666666666666663 +vt 0.875 0.16666666666666663 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 +f 124/364/91 127/363/91 125/362/91 122/361/91 +f 123/368/92 124/367/92 122/366/92 121/365/92 +f 128/372/93 123/371/93 121/370/93 126/369/93 +f 127/376/94 128/375/94 126/374/94 125/373/94 +f 126/380/95 121/379/95 122/378/95 125/377/95 +f 127/384/96 124/383/96 123/382/96 128/381/96 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/ghast.obj b/prismarine-viewer/viewer/lib/entity/models/ghast.obj new file mode 100644 index 00000000..bed7ccb2 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/ghast.obj @@ -0,0 +1,463 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.5 1 0.5 +v 0.5 1 -0.5 +v 0.5 0 0.5 +v 0.5 0 -0.5 +v -0.5 1 -0.5 +v -0.5 1 0.5 +v -0.5 0 -0.5 +v -0.5 0 0.5 +vt 0.25 0.5 +vt 0.5 0.5 +vt 0.5 0 +vt 0.25 0 +vt 0 0.5 +vt 0.25 0.5 +vt 0.25 0 +vt 0 0 +vt 0.75 0.5 +vt 1 0.5 +vt 1 0 +vt 0.75 0 +vt 0.5 0.5 +vt 0.75 0.5 +vt 0.75 0 +vt 0.5 0 +vt 0.5 0.5 +vt 0.25 0.5 +vt 0.25 1 +vt 0.5 1 +vt 0.75 1 +vt 0.5 1 +vt 0.5 0.5 +vt 0.75 0.5 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o tentacles_0 +v 0.30000000000000004 0.0625 -0.25 +v 0.30000000000000004 0.0625 -0.375 +v 0.30000000000000004 -0.5 -0.25 +v 0.30000000000000004 -0.5 -0.375 +v 0.17500000000000004 0.0625 -0.375 +v 0.17500000000000004 0.0625 -0.25 +v 0.17500000000000004 -0.5 -0.375 +v 0.17500000000000004 -0.5 -0.25 +vt 0.03125 0.9375 +vt 0.0625 0.9375 +vt 0.0625 0.65625 +vt 0.03125 0.65625 +vt 0 0.9375 +vt 0.03125 0.9375 +vt 0.03125 0.65625 +vt 0 0.65625 +vt 0.09375 0.9375 +vt 0.125 0.9375 +vt 0.125 0.65625 +vt 0.09375 0.65625 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vt 0.09375 0.65625 +vt 0.0625 0.65625 +vt 0.0625 0.9375 +vt 0.03125 0.9375 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o tentacles_1 +v -0.01874999999999999 0.0625 -0.25 +v -0.01874999999999999 0.0625 -0.375 +v -0.01874999999999999 -0.625 -0.25 +v -0.01874999999999999 -0.625 -0.375 +v -0.14375 0.0625 -0.375 +v -0.14375 0.0625 -0.25 +v -0.14375 -0.625 -0.375 +v -0.14375 -0.625 -0.25 +vt 0.03125 0.9375 +vt 0.0625 0.9375 +vt 0.0625 0.59375 +vt 0.03125 0.59375 +vt 0 0.9375 +vt 0.03125 0.9375 +vt 0.03125 0.59375 +vt 0 0.59375 +vt 0.09375 0.9375 +vt 0.125 0.9375 +vt 0.125 0.59375 +vt 0.09375 0.59375 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vt 0.09375 0.59375 +vt 0.0625 0.59375 +vt 0.0625 0.9375 +vt 0.03125 0.9375 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o tentacles_2 +v -0.33125 0.0625 -0.25 +v -0.33125 0.0625 -0.375 +v -0.33125 -0.4375 -0.25 +v -0.33125 -0.4375 -0.375 +v -0.45625 0.0625 -0.375 +v -0.45625 0.0625 -0.25 +v -0.45625 -0.4375 -0.375 +v -0.45625 -0.4375 -0.25 +vt 0.03125 0.9375 +vt 0.0625 0.9375 +vt 0.0625 0.6875 +vt 0.03125 0.6875 +vt 0 0.9375 +vt 0.03125 0.9375 +vt 0.03125 0.6875 +vt 0 0.6875 +vt 0.09375 0.9375 +vt 0.125 0.9375 +vt 0.125 0.6875 +vt 0.09375 0.6875 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vt 0.09375 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.9375 +vt 0.03125 0.9375 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o tentacles_3 +v 0.45625000000000004 0.0625 0.0625 +v 0.45625000000000004 0.0625 -0.0625 +v 0.45625000000000004 -0.5 0.0625 +v 0.45625000000000004 -0.5 -0.0625 +v 0.33125000000000004 0.0625 -0.0625 +v 0.33125000000000004 0.0625 0.0625 +v 0.33125000000000004 -0.5 -0.0625 +v 0.33125000000000004 -0.5 0.0625 +vt 0.03125 0.9375 +vt 0.0625 0.9375 +vt 0.0625 0.65625 +vt 0.03125 0.65625 +vt 0 0.9375 +vt 0.03125 0.9375 +vt 0.03125 0.65625 +vt 0 0.65625 +vt 0.09375 0.9375 +vt 0.125 0.9375 +vt 0.125 0.65625 +vt 0.09375 0.65625 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vt 0.09375 0.65625 +vt 0.0625 0.65625 +vt 0.0625 0.9375 +vt 0.03125 0.9375 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o tentacles_4 +v 0.14375000000000004 0.0625 0.0625 +v 0.14375000000000004 0.0625 -0.0625 +v 0.14375000000000004 -0.75 0.0625 +v 0.14375000000000004 -0.75 -0.0625 +v 0.018750000000000044 0.0625 -0.0625 +v 0.018750000000000044 0.0625 0.0625 +v 0.018750000000000044 -0.75 -0.0625 +v 0.018750000000000044 -0.75 0.0625 +vt 0.03125 0.9375 +vt 0.0625 0.9375 +vt 0.0625 0.53125 +vt 0.03125 0.53125 +vt 0 0.9375 +vt 0.03125 0.9375 +vt 0.03125 0.53125 +vt 0 0.53125 +vt 0.09375 0.9375 +vt 0.125 0.9375 +vt 0.125 0.53125 +vt 0.09375 0.53125 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vt 0.09375 0.53125 +vt 0.0625 0.53125 +vt 0.0625 0.9375 +vt 0.03125 0.9375 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o tentacles_5 +v -0.175 0.0625 0.0625 +v -0.175 0.0625 -0.0625 +v -0.175 -0.625 0.0625 +v -0.175 -0.625 -0.0625 +v -0.3 0.0625 -0.0625 +v -0.3 0.0625 0.0625 +v -0.3 -0.625 -0.0625 +v -0.3 -0.625 0.0625 +vt 0.03125 0.9375 +vt 0.0625 0.9375 +vt 0.0625 0.59375 +vt 0.03125 0.59375 +vt 0 0.9375 +vt 0.03125 0.9375 +vt 0.03125 0.59375 +vt 0 0.59375 +vt 0.09375 0.9375 +vt 0.125 0.9375 +vt 0.125 0.59375 +vt 0.09375 0.59375 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vt 0.09375 0.59375 +vt 0.0625 0.59375 +vt 0.0625 0.9375 +vt 0.03125 0.9375 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o tentacles_6 +v 0.30000000000000004 0.0625 0.375 +v 0.30000000000000004 0.0625 0.25 +v 0.30000000000000004 -0.6875 0.375 +v 0.30000000000000004 -0.6875 0.25 +v 0.17500000000000004 0.0625 0.25 +v 0.17500000000000004 0.0625 0.375 +v 0.17500000000000004 -0.6875 0.25 +v 0.17500000000000004 -0.6875 0.375 +vt 0.03125 0.9375 +vt 0.0625 0.9375 +vt 0.0625 0.5625 +vt 0.03125 0.5625 +vt 0 0.9375 +vt 0.03125 0.9375 +vt 0.03125 0.5625 +vt 0 0.5625 +vt 0.09375 0.9375 +vt 0.125 0.9375 +vt 0.125 0.5625 +vt 0.09375 0.5625 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vt 0.09375 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.9375 +vt 0.03125 0.9375 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o tentacles_7 +v -0.01874999999999999 0.0625 0.375 +v -0.01874999999999999 0.0625 0.25 +v -0.01874999999999999 -0.6875 0.375 +v -0.01874999999999999 -0.6875 0.25 +v -0.14375 0.0625 0.25 +v -0.14375 0.0625 0.375 +v -0.14375 -0.6875 0.25 +v -0.14375 -0.6875 0.375 +vt 0.03125 0.9375 +vt 0.0625 0.9375 +vt 0.0625 0.5625 +vt 0.03125 0.5625 +vt 0 0.9375 +vt 0.03125 0.9375 +vt 0.03125 0.5625 +vt 0 0.5625 +vt 0.09375 0.9375 +vt 0.125 0.9375 +vt 0.125 0.5625 +vt 0.09375 0.5625 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vt 0.09375 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.9375 +vt 0.03125 0.9375 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o tentacles_8 +v -0.33125 0.0625 0.375 +v -0.33125 0.0625 0.25 +v -0.33125 -0.75 0.375 +v -0.33125 -0.75 0.25 +v -0.45625 0.0625 0.25 +v -0.45625 0.0625 0.375 +v -0.45625 -0.75 0.25 +v -0.45625 -0.75 0.375 +vt 0.03125 0.9375 +vt 0.0625 0.9375 +vt 0.0625 0.53125 +vt 0.03125 0.53125 +vt 0 0.9375 +vt 0.03125 0.9375 +vt 0.03125 0.53125 +vt 0 0.53125 +vt 0.09375 0.9375 +vt 0.125 0.9375 +vt 0.125 0.53125 +vt 0.09375 0.53125 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vt 0.09375 0.53125 +vt 0.0625 0.53125 +vt 0.0625 0.9375 +vt 0.03125 0.9375 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.9375 +vt 0.09375 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/goat.obj b/prismarine-viewer/viewer/lib/entity/models/goat.obj new file mode 100644 index 00000000..adb8910c --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/goat.obj @@ -0,0 +1,601 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o left_back_leg +v -0.0625 0.375 0.4375 +v -0.0625 0.375 0.25 +v -0.0625 0 0.4375 +v -0.0625 0 0.25 +v -0.25 0.375 0.25 +v -0.25 0.375 0.4375 +v -0.25 0 0.25 +v -0.25 0 0.4375 +vt 0.609375 0.5 +vt 0.65625 0.5 +vt 0.65625 0.40625 +vt 0.609375 0.40625 +vt 0.5625 0.5 +vt 0.609375 0.5 +vt 0.609375 0.40625 +vt 0.5625 0.40625 +vt 0.703125 0.5 +vt 0.75 0.5 +vt 0.75 0.40625 +vt 0.703125 0.40625 +vt 0.65625 0.5 +vt 0.703125 0.5 +vt 0.703125 0.40625 +vt 0.65625 0.40625 +vt 0.65625 0.5 +vt 0.609375 0.5 +vt 0.609375 0.546875 +vt 0.65625 0.546875 +vt 0.703125 0.546875 +vt 0.65625 0.546875 +vt 0.65625 0.5 +vt 0.703125 0.5 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o right_back_leg +v 0.1875 0.375 0.4375 +v 0.1875 0.375 0.25 +v 0.1875 0 0.4375 +v 0.1875 0 0.25 +v 0 0.375 0.25 +v 0 0.375 0.4375 +v 0 0 0.25 +v 0 0 0.4375 +vt 0.8125 0.5 +vt 0.859375 0.5 +vt 0.859375 0.40625 +vt 0.8125 0.40625 +vt 0.765625 0.5 +vt 0.8125 0.5 +vt 0.8125 0.40625 +vt 0.765625 0.40625 +vt 0.90625 0.5 +vt 0.953125 0.5 +vt 0.953125 0.40625 +vt 0.90625 0.40625 +vt 0.859375 0.5 +vt 0.90625 0.5 +vt 0.90625 0.40625 +vt 0.859375 0.40625 +vt 0.859375 0.5 +vt 0.8125 0.5 +vt 0.8125 0.546875 +vt 0.859375 0.546875 +vt 0.90625 0.546875 +vt 0.859375 0.546875 +vt 0.859375 0.5 +vt 0.90625 0.5 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o right_front_leg +v 0.1875 0.625 -0.1875 +v 0.1875 0.625 -0.375 +v 0.1875 0 -0.1875 +v 0.1875 0 -0.375 +v 0 0.625 -0.375 +v 0 0.625 -0.1875 +v 0 0 -0.375 +v 0 0 -0.1875 +vt 0.8125 0.921875 +vt 0.859375 0.921875 +vt 0.859375 0.765625 +vt 0.8125 0.765625 +vt 0.765625 0.921875 +vt 0.8125 0.921875 +vt 0.8125 0.765625 +vt 0.765625 0.765625 +vt 0.90625 0.921875 +vt 0.953125 0.921875 +vt 0.953125 0.765625 +vt 0.90625 0.765625 +vt 0.859375 0.921875 +vt 0.90625 0.921875 +vt 0.90625 0.765625 +vt 0.859375 0.765625 +vt 0.859375 0.921875 +vt 0.8125 0.921875 +vt 0.8125 0.96875 +vt 0.859375 0.96875 +vt 0.90625 0.96875 +vt 0.859375 0.96875 +vt 0.859375 0.921875 +vt 0.90625 0.921875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o left_front_leg +v -0.0625 0.625 -0.1875 +v -0.0625 0.625 -0.375 +v -0.0625 0 -0.1875 +v -0.0625 0 -0.375 +v -0.25 0.625 -0.375 +v -0.25 0.625 -0.1875 +v -0.25 0 -0.375 +v -0.25 0 -0.1875 +vt 0.59375 0.921875 +vt 0.640625 0.921875 +vt 0.640625 0.765625 +vt 0.59375 0.765625 +vt 0.546875 0.921875 +vt 0.59375 0.921875 +vt 0.59375 0.765625 +vt 0.546875 0.765625 +vt 0.6875 0.921875 +vt 0.734375 0.921875 +vt 0.734375 0.765625 +vt 0.6875 0.765625 +vt 0.640625 0.921875 +vt 0.6875 0.921875 +vt 0.6875 0.765625 +vt 0.640625 0.765625 +vt 0.640625 0.921875 +vt 0.59375 0.921875 +vt 0.59375 0.96875 +vt 0.640625 0.96875 +vt 0.6875 0.96875 +vt 0.640625 0.96875 +vt 0.640625 0.921875 +vt 0.6875 0.921875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o body +v 0.25 1.0625 0.5625 +v 0.25 1.0625 -0.4375 +v 0.25 0.375 0.5625 +v 0.25 0.375 -0.4375 +v -0.3125 1.0625 -0.4375 +v -0.3125 1.0625 0.5625 +v -0.3125 0.375 -0.4375 +v -0.3125 0.375 0.5625 +vt 0.265625 0.734375 +vt 0.40625 0.734375 +vt 0.40625 0.5625 +vt 0.265625 0.5625 +vt 0.015625 0.734375 +vt 0.265625 0.734375 +vt 0.265625 0.5625 +vt 0.015625 0.5625 +vt 0.65625 0.734375 +vt 0.796875 0.734375 +vt 0.796875 0.5625 +vt 0.65625 0.5625 +vt 0.40625 0.734375 +vt 0.65625 0.734375 +vt 0.65625 0.5625 +vt 0.40625 0.5625 +vt 0.40625 0.734375 +vt 0.265625 0.734375 +vt 0.265625 0.984375 +vt 0.40625 0.984375 +vt 0.546875 0.984375 +vt 0.40625 0.984375 +vt 0.40625 0.734375 +vt 0.546875 0.734375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o body +v 0.3125 1.125 0.1875 +v 0.3125 1.125 -0.5 +v 0.3125 0.25 0.1875 +v 0.3125 0.25 -0.5 +v -0.375 1.125 -0.5 +v -0.375 1.125 0.1875 +v -0.375 0.25 -0.5 +v -0.375 0.25 0.1875 +vt 0.171875 0.390625 +vt 0.34375 0.390625 +vt 0.34375 0.171875 +vt 0.171875 0.171875 +vt 0 0.390625 +vt 0.171875 0.390625 +vt 0.171875 0.171875 +vt 0 0.171875 +vt 0.515625 0.390625 +vt 0.6875 0.390625 +vt 0.6875 0.171875 +vt 0.515625 0.171875 +vt 0.34375 0.390625 +vt 0.515625 0.390625 +vt 0.515625 0.171875 +vt 0.34375 0.171875 +vt 0.34375 0.390625 +vt 0.171875 0.390625 +vt 0.171875 0.5625 +vt 0.34375 0.5625 +vt 0.515625 0.5625 +vt 0.34375 0.5625 +vt 0.34375 0.390625 +vt 0.515625 0.390625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o Head +v 0.125 1.3707881146238856 -0.6330909565283671 +v 0.125 0.8588180869432658 -0.991576229247771 +v 0.125 1.1198484237203028 -0.2747119371519333 +v 0.125 0.607878396039683 -0.6331972098713372 +v -0.1875 0.8588180869432658 -0.991576229247771 +v -0.1875 1.3707881146238856 -0.6330909565283671 +v -0.1875 0.607878396039683 -0.6331972098713372 +v -0.1875 1.1198484237203028 -0.2747119371519333 +vt 0.6875 0.125 +vt 0.765625 0.125 +vt 0.765625 0.015625 +vt 0.6875 0.015625 +vt 0.53125 0.125 +vt 0.6875 0.125 +vt 0.6875 0.015625 +vt 0.53125 0.015625 +vt 0.921875 0.125 +vt 1 0.125 +vt 1 0.015625 +vt 0.921875 0.015625 +vt 0.765625 0.125 +vt 0.921875 0.125 +vt 0.921875 0.015625 +vt 0.765625 0.015625 +vt 0.765625 0.125 +vt 0.6875 0.125 +vt 0.6875 0.28125 +vt 0.765625 0.28125 +vt 0.84375 0.28125 +vt 0.765625 0.28125 +vt 0.765625 0.125 +vt 0.84375 0.125 +vn 0 -0.8191520442889917 -0.5735764363510463 +vn 1 0 0 +vn 0 0.8191520442889917 0.5735764363510463 +vn -1 0 0 +vn 0 0.5735764363510463 -0.8191520442889917 +vn 0 -0.5735764363510463 0.8191520442889917 +usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o Head +v 0.12437500000000001 1.625 -0.5 +v 0.12437500000000001 1.625 -0.625 +v 0.12437500000000001 1.1875 -0.5 +v 0.12437500000000001 1.1875 -0.625 +v -0.0006249999999999867 1.625 -0.625 +v -0.0006249999999999867 1.625 -0.5 +v -0.0006249999999999867 1.1875 -0.625 +v -0.0006249999999999867 1.1875 -0.5 +vt 0.21875 0.109375 +vt 0.25 0.109375 +vt 0.25 0 +vt 0.21875 0 +vt 0.1875 0.109375 +vt 0.21875 0.109375 +vt 0.21875 0 +vt 0.1875 0 +vt 0.28125 0.109375 +vt 0.3125 0.109375 +vt 0.3125 0 +vt 0.28125 0 +vt 0.25 0.109375 +vt 0.28125 0.109375 +vt 0.28125 0 +vt 0.25 0 +vt 0.25 0.109375 +vt 0.21875 0.109375 +vt 0.21875 0.140625 +vt 0.25 0.140625 +vt 0.28125 0.140625 +vt 0.25 0.140625 +vt 0.25 0.109375 +vt 0.28125 0.109375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o Head +v -0.06187500000000001 1.625 -0.5 +v -0.06187500000000001 1.625 -0.625 +v -0.06187500000000001 1.1875 -0.5 +v -0.06187500000000001 1.1875 -0.625 +v -0.186875 1.625 -0.625 +v -0.186875 1.625 -0.5 +v -0.186875 1.1875 -0.625 +v -0.186875 1.1875 -0.5 +vt 0.21875 0.109375 +vt 0.25 0.109375 +vt 0.25 0 +vt 0.21875 0 +vt 0.1875 0.109375 +vt 0.21875 0.109375 +vt 0.21875 0 +vt 0.1875 0 +vt 0.28125 0.109375 +vt 0.3125 0.109375 +vt 0.3125 0 +vt 0.28125 0 +vt 0.25 0.109375 +vt 0.28125 0.109375 +vt 0.28125 0 +vt 0.25 0 +vt 0.25 0.109375 +vt 0.21875 0.109375 +vt 0.21875 0.140625 +vt 0.25 0.140625 +vt 0.28125 0.140625 +vt 0.25 0.140625 +vt 0.25 0.109375 +vt 0.28125 0.109375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o Head +v -0.1875 1.3125 -0.5625 +v -0.1875 1.3125 -0.625 +v -0.1875 1.1875 -0.5625 +v -0.1875 1.1875 -0.625 +v -0.375 1.3125 -0.625 +v -0.375 1.3125 -0.5625 +v -0.375 1.1875 -0.625 +v -0.375 1.1875 -0.5625 +vt 0.09375 0.03125 +vt 0.046875 0.03125 +vt 0.046875 0 +vt 0.09375 0 +vt 0.109375 0.03125 +vt 0.09375 0.03125 +vt 0.09375 0 +vt 0.109375 0 +vt 0.15625 0.03125 +vt 0.109375 0.03125 +vt 0.109375 0 +vt 0.15625 0 +vt 0.046875 0.03125 +vt 0.03125 0.03125 +vt 0.03125 0 +vt 0.046875 0 +vt 0.046875 0.03125 +vt 0.09375 0.03125 +vt 0.09375 0.046875 +vt 0.046875 0.046875 +vt 0.09375 0.046875 +vt 0.140625 0.046875 +vt 0.140625 0.03125 +vt 0.09375 0.03125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o Head +v 0.3125 1.3125 -0.5625 +v 0.3125 1.3125 -0.625 +v 0.3125 1.1875 -0.5625 +v 0.3125 1.1875 -0.625 +v 0.125 1.3125 -0.625 +v 0.125 1.3125 -0.5625 +v 0.125 1.1875 -0.625 +v 0.125 1.1875 -0.5625 +vt 0.046875 0.03125 +vt 0.09375 0.03125 +vt 0.09375 0 +vt 0.046875 0 +vt 0.03125 0.03125 +vt 0.046875 0.03125 +vt 0.046875 0 +vt 0.03125 0 +vt 0.109375 0.03125 +vt 0.15625 0.03125 +vt 0.15625 0 +vt 0.109375 0 +vt 0.09375 0.03125 +vt 0.109375 0.03125 +vt 0.109375 0 +vt 0.09375 0 +vt 0.09375 0.03125 +vt 0.046875 0.03125 +vt 0.046875 0.046875 +vt 0.09375 0.046875 +vt 0.140625 0.046875 +vt 0.09375 0.046875 +vt 0.09375 0.03125 +vt 0.140625 0.03125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 +o Head +v -0.03125 0.8125 -0.5625 +v -0.03125 0.8125 -0.875 +v -0.03125 0.375 -0.5625 +v -0.03125 0.375 -0.875 +v -0.03125 0.8125 -0.875 +v -0.03125 0.8125 -0.5625 +v -0.03125 0.375 -0.875 +v -0.03125 0.375 -0.5625 +vt 0.4375 0.109375 +vt 0.4375 0.109375 +vt 0.4375 0 +vt 0.4375 0 +vt 0.359375 0.109375 +vt 0.4375 0.109375 +vt 0.4375 0 +vt 0.359375 0 +vt 0.515625 0.109375 +vt 0.515625 0.109375 +vt 0.515625 0 +vt 0.515625 0 +vt 0.4375 0.109375 +vt 0.515625 0.109375 +vt 0.515625 0 +vt 0.4375 0 +vt 0.4375 0.109375 +vt 0.4375 0.109375 +vt 0.4375 0.1875 +vt 0.4375 0.1875 +vt 0.4375 0.1875 +vt 0.4375 0.1875 +vt 0.4375 0.109375 +vt 0.4375 0.109375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 +f 92/268/67 95/267/67 93/266/67 90/265/67 +f 91/272/68 92/271/68 90/270/68 89/269/68 +f 96/276/69 91/275/69 89/274/69 94/273/69 +f 95/280/70 96/279/70 94/278/70 93/277/70 +f 94/284/71 89/283/71 90/282/71 93/281/71 +f 95/288/72 92/287/72 91/286/72 96/285/72 +o HeadMain +v 0.125 1.3707881146238856 -0.6330909565283671 +v 0.125 0.8588180869432658 -0.991576229247771 +v 0.125 1.1198484237203028 -0.2747119371519333 +v 0.125 0.607878396039683 -0.6331972098713372 +v -0.1875 0.8588180869432658 -0.991576229247771 +v -0.1875 1.3707881146238856 -0.6330909565283671 +v -0.1875 0.607878396039683 -0.6331972098713372 +v -0.1875 1.1198484237203028 -0.2747119371519333 +vt 0.6875 0.125 +vt 0.765625 0.125 +vt 0.765625 0.015625 +vt 0.6875 0.015625 +vt 0.53125 0.125 +vt 0.6875 0.125 +vt 0.6875 0.015625 +vt 0.53125 0.015625 +vt 0.921875 0.125 +vt 1 0.125 +vt 1 0.015625 +vt 0.921875 0.015625 +vt 0.765625 0.125 +vt 0.921875 0.125 +vt 0.921875 0.015625 +vt 0.765625 0.015625 +vt 0.765625 0.125 +vt 0.6875 0.125 +vt 0.6875 0.28125 +vt 0.765625 0.28125 +vt 0.84375 0.28125 +vt 0.765625 0.28125 +vt 0.765625 0.125 +vt 0.84375 0.125 +vn 0 -0.8191520442889917 -0.5735764363510463 +vn 1 0 0 +vn 0 0.8191520442889917 0.5735764363510463 +vn -1 0 0 +vn 0 0.5735764363510463 -0.8191520442889917 +vn 0 -0.5735764363510463 0.8191520442889917 +usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 +f 100/292/73 103/291/73 101/290/73 98/289/73 +f 99/296/74 100/295/74 98/294/74 97/293/74 +f 104/300/75 99/299/75 97/298/75 102/297/75 +f 103/304/76 104/303/76 102/302/76 101/301/76 +f 102/308/77 97/307/77 98/306/77 101/305/77 +f 103/312/78 100/311/78 99/310/78 104/309/78 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/guardian.obj b/prismarine-viewer/viewer/lib/entity/models/guardian.obj new file mode 100644 index 00000000..0addde29 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/guardian.obj @@ -0,0 +1,1015 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o head +v 0.375 0.875 0.5 +v 0.375 0.875 -0.5 +v 0.375 0.125 0.5 +v 0.375 0.125 -0.5 +v -0.375 0.875 -0.5 +v -0.375 0.875 0.5 +v -0.375 0.125 -0.5 +v -0.375 0.125 0.5 +vt 0.25 0.75 +vt 0.4375 0.75 +vt 0.4375 0.5625 +vt 0.25 0.5625 +vt 0 0.75 +vt 0.25 0.75 +vt 0.25 0.5625 +vt 0 0.5625 +vt 0.6875 0.75 +vt 0.875 0.75 +vt 0.875 0.5625 +vt 0.6875 0.5625 +vt 0.4375 0.75 +vt 0.6875 0.75 +vt 0.6875 0.5625 +vt 0.4375 0.5625 +vt 0.4375 0.75 +vt 0.25 0.75 +vt 0.25 1 +vt 0.4375 1 +vt 0.625 1 +vt 0.4375 1 +vt 0.4375 0.75 +vt 0.625 0.75 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o head +v 0.5 0.875 0.375 +v 0.5 0.875 -0.375 +v 0.5 0.125 0.375 +v 0.5 0.125 -0.375 +v 0.375 0.875 -0.375 +v 0.375 0.875 0.375 +v 0.375 0.125 -0.375 +v 0.375 0.125 0.375 +vt 0.1875 0.375 +vt 0.21875 0.375 +vt 0.21875 0.1875 +vt 0.1875 0.1875 +vt 0 0.375 +vt 0.1875 0.375 +vt 0.1875 0.1875 +vt 0 0.1875 +vt 0.40625 0.375 +vt 0.4375 0.375 +vt 0.4375 0.1875 +vt 0.40625 0.1875 +vt 0.21875 0.375 +vt 0.40625 0.375 +vt 0.40625 0.1875 +vt 0.21875 0.1875 +vt 0.21875 0.375 +vt 0.1875 0.375 +vt 0.1875 0.5625 +vt 0.21875 0.5625 +vt 0.25 0.5625 +vt 0.21875 0.5625 +vt 0.21875 0.375 +vt 0.25 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o head +v -0.375 0.875 0.375 +v -0.375 0.875 -0.375 +v -0.375 0.125 0.375 +v -0.375 0.125 -0.375 +v -0.5 0.875 -0.375 +v -0.5 0.875 0.375 +v -0.5 0.125 -0.375 +v -0.5 0.125 0.375 +vt 0.21875 0.375 +vt 0.1875 0.375 +vt 0.1875 0.1875 +vt 0.21875 0.1875 +vt 0.40625 0.375 +vt 0.21875 0.375 +vt 0.21875 0.1875 +vt 0.40625 0.1875 +vt 0.4375 0.375 +vt 0.40625 0.375 +vt 0.40625 0.1875 +vt 0.4375 0.1875 +vt 0.1875 0.375 +vt 0 0.375 +vt 0 0.1875 +vt 0.1875 0.1875 +vt 0.1875 0.375 +vt 0.21875 0.375 +vt 0.21875 0.5625 +vt 0.1875 0.5625 +vt 0.21875 0.5625 +vt 0.25 0.5625 +vt 0.25 0.375 +vt 0.21875 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o head +v 0.375 1 0.375 +v 0.375 1 -0.375 +v 0.375 0.875 0.375 +v 0.375 0.875 -0.375 +v -0.375 1 -0.375 +v -0.375 1 0.375 +v -0.375 0.875 -0.375 +v -0.375 0.875 0.375 +vt 0.625 0.1875 +vt 0.4375 0.1875 +vt 0.4375 0.15625 +vt 0.625 0.15625 +vt 0.8125 0.1875 +vt 0.625 0.1875 +vt 0.625 0.15625 +vt 0.8125 0.15625 +vt 1 0.1875 +vt 0.8125 0.1875 +vt 0.8125 0.15625 +vt 1 0.15625 +vt 0.4375 0.1875 +vt 0.25 0.1875 +vt 0.25 0.15625 +vt 0.4375 0.15625 +vt 0.4375 0.1875 +vt 0.625 0.1875 +vt 0.625 0.375 +vt 0.4375 0.375 +vt 0.625 0.375 +vt 0.8125 0.375 +vt 0.8125 0.1875 +vt 0.625 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o head +v 0.375 0.125 0.375 +v 0.375 0.125 -0.375 +v 0.375 0 0.375 +v 0.375 0 -0.375 +v -0.375 0.125 -0.375 +v -0.375 0.125 0.375 +v -0.375 0 -0.375 +v -0.375 0 0.375 +vt 0.625 0.1875 +vt 0.4375 0.1875 +vt 0.4375 0.15625 +vt 0.625 0.15625 +vt 0.8125 0.1875 +vt 0.625 0.1875 +vt 0.625 0.15625 +vt 0.8125 0.15625 +vt 1 0.1875 +vt 0.8125 0.1875 +vt 0.8125 0.15625 +vt 1 0.15625 +vt 0.4375 0.1875 +vt 0.25 0.1875 +vt 0.25 0.15625 +vt 0.4375 0.15625 +vt 0.4375 0.1875 +vt 0.625 0.1875 +vt 0.625 0.375 +vt 0.4375 0.375 +vt 0.625 0.375 +vt 0.8125 0.375 +vt 0.8125 0.1875 +vt 0.625 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o eye +v 0.0625 0.5625 -0.453125 +v 0.0625 0.5625 -0.515625 +v 0.0625 0.4375 -0.453125 +v 0.0625 0.4375 -0.515625 +v -0.0625 0.5625 -0.515625 +v -0.0625 0.5625 -0.453125 +v -0.0625 0.4375 -0.515625 +v -0.0625 0.4375 -0.453125 +vt 0.140625 0.984375 +vt 0.171875 0.984375 +vt 0.171875 0.953125 +vt 0.140625 0.953125 +vt 0.125 0.984375 +vt 0.140625 0.984375 +vt 0.140625 0.953125 +vt 0.125 0.953125 +vt 0.1875 0.984375 +vt 0.21875 0.984375 +vt 0.21875 0.953125 +vt 0.1875 0.953125 +vt 0.171875 0.984375 +vt 0.1875 0.984375 +vt 0.1875 0.953125 +vt 0.171875 0.953125 +vt 0.171875 0.984375 +vt 0.140625 0.984375 +vt 0.140625 1 +vt 0.171875 1 +vt 0.203125 1 +vt 0.171875 1 +vt 0.171875 0.984375 +vt 0.203125 0.984375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o tailpart0 +v 0.125 0.625 1 +v 0.125 0.625 0.5 +v 0.125 0.375 1 +v 0.125 0.375 0.5 +v -0.125 0.625 0.5 +v -0.125 0.625 1 +v -0.125 0.375 0.5 +v -0.125 0.375 1 +vt 0.75 0.875 +vt 0.8125 0.875 +vt 0.8125 0.8125 +vt 0.75 0.8125 +vt 0.625 0.875 +vt 0.75 0.875 +vt 0.75 0.8125 +vt 0.625 0.8125 +vt 0.9375 0.875 +vt 1 0.875 +vt 1 0.8125 +vt 0.9375 0.8125 +vt 0.8125 0.875 +vt 0.9375 0.875 +vt 0.9375 0.8125 +vt 0.8125 0.8125 +vt 0.8125 0.875 +vt 0.75 0.875 +vt 0.75 1 +vt 0.8125 1 +vt 0.875 1 +vt 0.8125 1 +vt 0.8125 0.875 +vt 0.875 0.875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o tailpart1 +v 0.09375 0.625 1.4375 +v 0.09375 0.625 1 +v 0.09375 0.4375 1.4375 +v 0.09375 0.4375 1 +v -0.09375 0.625 1 +v -0.09375 0.625 1.4375 +v -0.09375 0.4375 1 +v -0.09375 0.4375 1.4375 +vt 0.109375 0.046875 +vt 0.15625 0.046875 +vt 0.15625 0 +vt 0.109375 0 +vt 0 0.046875 +vt 0.109375 0.046875 +vt 0.109375 0 +vt 0 0 +vt 0.265625 0.046875 +vt 0.3125 0.046875 +vt 0.3125 0 +vt 0.265625 0 +vt 0.15625 0.046875 +vt 0.265625 0.046875 +vt 0.265625 0 +vt 0.15625 0 +vt 0.15625 0.046875 +vt 0.109375 0.046875 +vt 0.109375 0.15625 +vt 0.15625 0.15625 +vt 0.203125 0.15625 +vt 0.15625 0.15625 +vt 0.15625 0.046875 +vt 0.203125 0.046875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o tailpart2 +v 0.0625 0.625 1.8125 +v 0.0625 0.625 1.4375 +v 0.0625 0.5 1.8125 +v 0.0625 0.5 1.4375 +v -0.0625 0.625 1.4375 +v -0.0625 0.625 1.8125 +v -0.0625 0.5 1.4375 +v -0.0625 0.5 1.8125 +vt 0.734375 0.40625 +vt 0.765625 0.40625 +vt 0.765625 0.375 +vt 0.734375 0.375 +vt 0.640625 0.40625 +vt 0.734375 0.40625 +vt 0.734375 0.375 +vt 0.640625 0.375 +vt 0.859375 0.40625 +vt 0.890625 0.40625 +vt 0.890625 0.375 +vt 0.859375 0.375 +vt 0.765625 0.40625 +vt 0.859375 0.40625 +vt 0.859375 0.375 +vt 0.765625 0.375 +vt 0.765625 0.40625 +vt 0.734375 0.40625 +vt 0.734375 0.5 +vt 0.765625 0.5 +vt 0.796875 0.5 +vt 0.765625 0.5 +vt 0.765625 0.40625 +vt 0.796875 0.40625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o tailpart2 +v 0 0.84375 2.1875 +v 0 0.84375 1.625 +v 0 0.28125 2.1875 +v 0 0.28125 1.625 +v -0.0625 0.84375 1.625 +v -0.0625 0.84375 2.1875 +v -0.0625 0.28125 1.625 +v -0.0625 0.28125 2.1875 +vt 0.53125 0.5625 +vt 0.546875 0.5625 +vt 0.546875 0.421875 +vt 0.53125 0.421875 +vt 0.390625 0.5625 +vt 0.53125 0.5625 +vt 0.53125 0.421875 +vt 0.390625 0.421875 +vt 0.6875 0.5625 +vt 0.703125 0.5625 +vt 0.703125 0.421875 +vt 0.6875 0.421875 +vt 0.546875 0.5625 +vt 0.6875 0.5625 +vt 0.6875 0.421875 +vt 0.546875 0.421875 +vt 0.546875 0.5625 +vt 0.53125 0.5625 +vt 0.53125 0.703125 +vt 0.546875 0.703125 +vt 0.5625 0.703125 +vt 0.546875 0.703125 +vt 0.546875 0.5625 +vt 0.5625 0.5625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o spikepart0 +v -0.6518640639063484 1.2458835005110844 0.0625 +v -0.6518640639063484 1.2458835005110844 -0.0625 +v -0.25411649948891535 0.8481359360936516 0.0625 +v -0.25411649948891535 0.8481359360936516 -0.0625 +v -0.7402524115546669 1.157495152862766 -0.0625 +v -0.7402524115546669 1.157495152862766 0.0625 +v -0.34250484713723384 0.7597475884453331 -0.0625 +v -0.34250484713723384 0.7597475884453331 0.0625 +vt 0.03125 0.96875 +vt 0.0625 0.96875 +vt 0.0625 0.828125 +vt 0.03125 0.828125 +vt 0 0.96875 +vt 0.03125 0.96875 +vt 0.03125 0.828125 +vt 0 0.828125 +vt 0.09375 0.96875 +vt 0.125 0.96875 +vt 0.125 0.828125 +vt 0.09375 0.828125 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vt 0.09375 0.828125 +vt 0.0625 0.828125 +vt 0.0625 0.96875 +vt 0.03125 0.96875 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vn 0 0 -1 +vn 0.7071067811865475 0.7071067811865476 0 +vn 0 0 1 +vn -0.7071067811865475 -0.7071067811865476 0 +vn -0.7071067811865476 0.7071067811865475 0 +vn 0.7071067811865476 -0.7071067811865475 0 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 +o spikepart1 +v 0.7402524115546669 1.157495152862766 0.0625 +v 0.7402524115546669 1.157495152862766 -0.0625 +v 0.34250484713723384 0.7597475884453331 0.0625 +v 0.34250484713723384 0.7597475884453331 -0.0625 +v 0.6518640639063484 1.2458835005110844 -0.0625 +v 0.6518640639063484 1.2458835005110844 0.0625 +v 0.25411649948891535 0.8481359360936516 -0.0625 +v 0.25411649948891535 0.8481359360936516 0.0625 +vt 0.03125 0.96875 +vt 0.0625 0.96875 +vt 0.0625 0.828125 +vt 0.03125 0.828125 +vt 0 0.96875 +vt 0.03125 0.96875 +vt 0.03125 0.828125 +vt 0 0.828125 +vt 0.09375 0.96875 +vt 0.125 0.96875 +vt 0.125 0.828125 +vt 0.09375 0.828125 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vt 0.09375 0.828125 +vt 0.0625 0.828125 +vt 0.0625 0.96875 +vt 0.03125 0.96875 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vn 0 0 -1 +vn 0.7071067811865475 -0.7071067811865476 0 +vn 0 0 1 +vn -0.7071067811865475 0.7071067811865476 0 +vn 0.7071067811865476 0.7071067811865475 0 +vn -0.7071067811865476 -0.7071067811865475 0 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 92/268/67 95/267/67 93/266/67 90/265/67 +f 91/272/68 92/271/68 90/270/68 89/269/68 +f 96/276/69 91/275/69 89/274/69 94/273/69 +f 95/280/70 96/279/70 94/278/70 93/277/70 +f 94/284/71 89/283/71 90/282/71 93/281/71 +f 95/288/72 92/287/72 91/286/72 96/285/72 +o spikepart2 +v 0.0625 1.2458835005110844 -0.6518640639063484 +v 0.0625 1.157495152862766 -0.7402524115546669 +v 0.0625 0.8481359360936516 -0.25411649948891535 +v 0.0625 0.7597475884453331 -0.34250484713723384 +v -0.0625 1.157495152862766 -0.7402524115546669 +v -0.0625 1.2458835005110844 -0.6518640639063484 +v -0.0625 0.7597475884453331 -0.34250484713723384 +v -0.0625 0.8481359360936516 -0.25411649948891535 +vt 0.03125 0.96875 +vt 0.0625 0.96875 +vt 0.0625 0.828125 +vt 0.03125 0.828125 +vt 0 0.96875 +vt 0.03125 0.96875 +vt 0.03125 0.828125 +vt 0 0.828125 +vt 0.09375 0.96875 +vt 0.125 0.96875 +vt 0.125 0.828125 +vt 0.09375 0.828125 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vt 0.09375 0.828125 +vt 0.0625 0.828125 +vt 0.0625 0.96875 +vt 0.03125 0.96875 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vn 0 -0.7071067811865476 -0.7071067811865475 +vn 1 0 0 +vn 0 0.7071067811865476 0.7071067811865475 +vn -1 0 0 +vn 0 0.7071067811865475 -0.7071067811865476 +vn 0 -0.7071067811865475 0.7071067811865476 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 100/292/73 103/291/73 101/290/73 98/289/73 +f 99/296/74 100/295/74 98/294/74 97/293/74 +f 104/300/75 99/299/75 97/298/75 102/297/75 +f 103/304/76 104/303/76 102/302/76 101/301/76 +f 102/308/77 97/307/77 98/306/77 101/305/77 +f 103/312/78 100/311/78 99/310/78 104/309/78 +o spikepart3 +v 0.0625 1.1464466094067263 0.7513009550107066 +v 0.0625 1.2348349570550448 0.6629126073623883 +v 0.0625 0.7486990449892934 0.3535533905932735 +v 0.0625 0.8370873926376117 0.26516504294495524 +v -0.0625 1.2348349570550448 0.6629126073623883 +v -0.0625 1.1464466094067263 0.7513009550107066 +v -0.0625 0.8370873926376117 0.26516504294495524 +v -0.0625 0.7486990449892934 0.3535533905932735 +vt 0.03125 0.96875 +vt 0.0625 0.96875 +vt 0.0625 0.828125 +vt 0.03125 0.828125 +vt 0 0.96875 +vt 0.03125 0.96875 +vt 0.03125 0.828125 +vt 0 0.828125 +vt 0.09375 0.96875 +vt 0.125 0.96875 +vt 0.125 0.828125 +vt 0.09375 0.828125 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vt 0.09375 0.828125 +vt 0.0625 0.828125 +vt 0.0625 0.96875 +vt 0.03125 0.96875 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vn 0 0.7071067811865476 -0.7071067811865475 +vn 1 0 0 +vn 0 -0.7071067811865476 0.7071067811865475 +vn -1 0 0 +vn 0 0.7071067811865475 0.7071067811865476 +vn 0 -0.7071067811865475 -0.7071067811865476 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 108/316/79 111/315/79 109/314/79 106/313/79 +f 107/320/80 108/319/80 106/318/80 105/317/80 +f 112/324/81 107/323/81 105/322/81 110/321/81 +f 111/328/82 112/327/82 110/326/82 109/325/82 +f 110/332/83 105/331/83 106/330/83 109/329/83 +f 111/336/84 108/335/84 107/334/84 112/333/84 +o spikepart4 +v -0.7623494984667472 -0.16833006186201072 0.0625 +v -0.7623494984667472 -0.16833006186201072 -0.0625 +v -0.36460193404931407 0.22941750255542193 0.0625 +v -0.36460193404931407 0.22941750255542193 -0.0625 +v -0.6739611508184287 -0.256718409510329 -0.0625 +v -0.6739611508184287 -0.256718409510329 0.0625 +v -0.2762135864009956 0.14102915490710366 -0.0625 +v -0.2762135864009956 0.14102915490710366 0.0625 +vt 0.03125 0.96875 +vt 0.0625 0.96875 +vt 0.0625 0.828125 +vt 0.03125 0.828125 +vt 0 0.96875 +vt 0.03125 0.96875 +vt 0.03125 0.828125 +vt 0 0.828125 +vt 0.09375 0.96875 +vt 0.125 0.96875 +vt 0.125 0.828125 +vt 0.09375 0.828125 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vt 0.09375 0.828125 +vt 0.0625 0.828125 +vt 0.0625 0.96875 +vt 0.03125 0.96875 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vn 0 0 -1 +vn -0.7071067811865475 0.7071067811865477 0 +vn 0 0 1 +vn 0.7071067811865475 -0.7071067811865477 0 +vn -0.7071067811865477 -0.7071067811865475 0 +vn 0.7071067811865477 0.7071067811865475 0 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 116/340/85 119/339/85 117/338/85 114/337/85 +f 115/344/86 116/343/86 114/342/86 113/341/86 +f 120/348/87 115/347/87 113/346/87 118/345/87 +f 119/352/88 120/351/88 118/350/88 117/349/88 +f 118/356/89 113/355/89 114/354/89 117/353/89 +f 119/360/90 116/359/90 115/358/90 120/357/90 +o spikepart5 +v 0.6739611508184287 -0.256718409510329 0.0625 +v 0.6739611508184287 -0.256718409510329 -0.0625 +v 0.2762135864009956 0.14102915490710366 0.0625 +v 0.2762135864009956 0.14102915490710366 -0.0625 +v 0.7623494984667472 -0.16833006186201072 -0.0625 +v 0.7623494984667472 -0.16833006186201072 0.0625 +v 0.36460193404931407 0.22941750255542193 -0.0625 +v 0.36460193404931407 0.22941750255542193 0.0625 +vt 0.03125 0.96875 +vt 0.0625 0.96875 +vt 0.0625 0.828125 +vt 0.03125 0.828125 +vt 0 0.96875 +vt 0.03125 0.96875 +vt 0.03125 0.828125 +vt 0 0.828125 +vt 0.09375 0.96875 +vt 0.125 0.96875 +vt 0.125 0.828125 +vt 0.09375 0.828125 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vt 0.09375 0.828125 +vt 0.0625 0.828125 +vt 0.0625 0.96875 +vt 0.03125 0.96875 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vn 0 0 -1 +vn -0.7071067811865475 -0.7071067811865477 0 +vn 0 0 1 +vn 0.7071067811865475 0.7071067811865477 0 +vn 0.7071067811865477 -0.7071067811865475 0 +vn -0.7071067811865477 0.7071067811865475 0 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 124/364/91 127/363/91 125/362/91 122/361/91 +f 123/368/92 124/367/92 122/366/92 121/365/92 +f 128/372/93 123/371/93 121/370/93 126/369/93 +f 127/376/94 128/375/94 126/374/94 125/373/94 +f 126/380/95 121/379/95 122/378/95 125/377/95 +f 127/384/96 124/383/96 123/382/96 128/381/96 +o spikepart6 +v 0.0625 -0.21252423568616985 -0.8065436722909063 +v 0.0625 -0.30091258333448856 -0.7181553246425878 +v 0.0625 0.18522332873126324 -0.4087961078734732 +v 0.0625 0.09683498108294453 -0.3204077602251547 +v -0.0625 -0.30091258333448856 -0.7181553246425878 +v -0.0625 -0.21252423568616985 -0.8065436722909063 +v -0.0625 0.09683498108294453 -0.3204077602251547 +v -0.0625 0.18522332873126324 -0.4087961078734732 +vt 0.03125 0.96875 +vt 0.0625 0.96875 +vt 0.0625 0.828125 +vt 0.03125 0.828125 +vt 0 0.96875 +vt 0.03125 0.96875 +vt 0.03125 0.828125 +vt 0 0.828125 +vt 0.09375 0.96875 +vt 0.125 0.96875 +vt 0.125 0.828125 +vt 0.09375 0.828125 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vt 0.09375 0.828125 +vt 0.0625 0.828125 +vt 0.0625 0.96875 +vt 0.03125 0.96875 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vn 0 -0.7071067811865477 0.7071067811865475 +vn 1 0 0 +vn 0 0.7071067811865477 -0.7071067811865475 +vn -1 0 0 +vn 0 -0.7071067811865475 -0.7071067811865477 +vn 0 0.7071067811865475 0.7071067811865477 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 132/388/97 135/387/97 133/386/97 130/385/97 +f 131/392/98 132/391/98 130/390/98 129/389/98 +f 136/396/99 131/395/99 129/394/99 134/393/99 +f 135/400/100 136/399/100 134/398/100 133/397/100 +f 134/404/101 129/403/101 130/402/101 133/401/101 +f 135/408/102 132/407/102 131/406/102 136/405/102 +o spikepart7 +v 0.0625 -0.256718409510329 0.6739611508184287 +v 0.0625 -0.16833006186201072 0.7623494984667472 +v 0.0625 0.14102915490710366 0.2762135864009956 +v 0.0625 0.22941750255542193 0.36460193404931407 +v -0.0625 -0.16833006186201072 0.7623494984667472 +v -0.0625 -0.256718409510329 0.6739611508184287 +v -0.0625 0.22941750255542193 0.36460193404931407 +v -0.0625 0.14102915490710366 0.2762135864009956 +vt 0.03125 0.96875 +vt 0.0625 0.96875 +vt 0.0625 0.828125 +vt 0.03125 0.828125 +vt 0 0.96875 +vt 0.03125 0.96875 +vt 0.03125 0.828125 +vt 0 0.828125 +vt 0.09375 0.96875 +vt 0.125 0.96875 +vt 0.125 0.828125 +vt 0.09375 0.828125 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vt 0.09375 0.828125 +vt 0.0625 0.828125 +vt 0.0625 0.96875 +vt 0.03125 0.96875 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vn 0 0.7071067811865477 0.7071067811865475 +vn 1 0 0 +vn 0 -0.7071067811865477 -0.7071067811865475 +vn -1 0 0 +vn 0 -0.7071067811865475 0.7071067811865477 +vn 0 0.7071067811865475 -0.7071067811865477 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 140/412/103 143/411/103 141/410/103 138/409/103 +f 139/416/104 140/415/104 138/414/104 137/413/104 +f 144/420/105 139/419/105 137/418/105 142/417/105 +f 143/424/106 144/423/106 142/422/106 141/421/106 +f 142/428/107 137/427/107 138/426/107 141/425/107 +f 143/432/108 140/431/108 139/430/108 144/429/108 +o spikepart8 +v -0.7292038680986273 0.5625000000000004 -0.8175922157469457 +v -0.7292038680986275 0.43750000000000044 -0.8175922157469457 +v -0.33145630368119416 0.5625000000000002 -0.41984465132951265 +v -0.3314563036811944 0.4375000000000002 -0.41984465132951265 +v -0.8175922157469457 0.43750000000000044 -0.7292038680986275 +v -0.8175922157469455 0.5625000000000004 -0.7292038680986275 +v -0.41984465132951265 0.4375000000000002 -0.3314563036811944 +v -0.41984465132951243 0.5625000000000002 -0.3314563036811944 +vt 0.03125 0.96875 +vt 0.0625 0.96875 +vt 0.0625 0.828125 +vt 0.03125 0.828125 +vt 0 0.96875 +vt 0.03125 0.96875 +vt 0.03125 0.828125 +vt 0 0.828125 +vt 0.09375 0.96875 +vt 0.125 0.96875 +vt 0.125 0.828125 +vt 0.09375 0.828125 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vt 0.09375 0.828125 +vt 0.0625 0.828125 +vt 0.0625 0.96875 +vt 0.03125 0.96875 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vn -2.355138688025663e-16 -1 -2.3551386880256634e-16 +vn 0.7071067811865476 7.850462293418876e-17 -0.7071067811865476 +vn 2.355138688025663e-16 1 2.3551386880256634e-16 +vn -0.7071067811865476 -7.850462293418876e-17 0.7071067811865476 +vn -0.7071067811865475 2.355138688025663e-16 -0.7071067811865476 +vn 0.7071067811865475 -2.355138688025663e-16 0.7071067811865476 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 148/436/109 151/435/109 149/434/109 146/433/109 +f 147/440/110 148/439/110 146/438/110 145/437/110 +f 152/444/111 147/443/111 145/442/111 150/441/111 +f 151/448/112 152/447/112 150/446/112 149/445/112 +f 150/452/113 145/451/113 146/450/113 149/449/113 +f 151/456/114 148/455/114 147/454/114 152/453/114 +o spikepart8 +v 0.8175922157469455 0.5625000000000004 -0.7292038680986275 +v 0.8175922157469457 0.43750000000000044 -0.7292038680986275 +v 0.41984465132951243 0.5625000000000002 -0.3314563036811944 +v 0.41984465132951265 0.4375000000000002 -0.3314563036811944 +v 0.7292038680986275 0.43750000000000044 -0.8175922157469457 +v 0.7292038680986273 0.5625000000000004 -0.8175922157469457 +v 0.3314563036811944 0.4375000000000002 -0.41984465132951265 +v 0.33145630368119416 0.5625000000000002 -0.41984465132951265 +vt 0.03125 0.96875 +vt 0.0625 0.96875 +vt 0.0625 0.828125 +vt 0.03125 0.828125 +vt 0 0.96875 +vt 0.03125 0.96875 +vt 0.03125 0.828125 +vt 0 0.828125 +vt 0.09375 0.96875 +vt 0.125 0.96875 +vt 0.125 0.828125 +vt 0.09375 0.828125 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vt 0.09375 0.828125 +vt 0.0625 0.828125 +vt 0.0625 0.96875 +vt 0.03125 0.96875 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vn 2.355138688025663e-16 -1 -2.3551386880256634e-16 +vn 0.7071067811865476 -7.850462293418876e-17 0.7071067811865476 +vn -2.355138688025663e-16 1 2.3551386880256634e-16 +vn -0.7071067811865476 7.850462293418876e-17 -0.7071067811865476 +vn 0.7071067811865475 2.355138688025663e-16 -0.7071067811865476 +vn -0.7071067811865475 -2.355138688025663e-16 0.7071067811865476 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 156/460/115 159/459/115 157/458/115 154/457/115 +f 155/464/116 156/463/116 154/462/116 153/461/116 +f 160/468/117 155/467/117 153/466/117 158/465/117 +f 159/472/118 160/471/118 158/470/118 157/469/118 +f 158/476/119 153/475/119 154/474/119 157/473/119 +f 159/480/120 156/479/120 155/478/120 160/477/120 +o spikepart8 +v -0.8175922157469455 0.5625 0.7292038680986273 +v -0.8175922157469457 0.4375000000000002 0.7292038680986273 +v -0.41984465132951243 0.5625 0.33145630368119416 +v -0.41984465132951265 0.4375 0.33145630368119416 +v -0.7292038680986275 0.4375000000000002 0.8175922157469455 +v -0.7292038680986273 0.5625 0.8175922157469455 +v -0.3314563036811944 0.4375 0.41984465132951243 +v -0.33145630368119416 0.5625 0.41984465132951243 +vt 0.03125 0.96875 +vt 0.0625 0.96875 +vt 0.0625 0.828125 +vt 0.03125 0.828125 +vt 0 0.96875 +vt 0.03125 0.96875 +vt 0.03125 0.828125 +vt 0 0.828125 +vt 0.09375 0.96875 +vt 0.125 0.96875 +vt 0.125 0.828125 +vt 0.09375 0.828125 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vt 0.09375 0.828125 +vt 0.0625 0.828125 +vt 0.0625 0.96875 +vt 0.03125 0.96875 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vn -1.5700924586837752e-16 -1 1.570092458683775e-16 +vn -0.7071067811865475 7.850462293418875e-17 -0.7071067811865476 +vn 1.5700924586837752e-16 1 -1.570092458683775e-16 +vn 0.7071067811865475 -7.850462293418875e-17 0.7071067811865476 +vn -0.7071067811865476 7.850462293418876e-17 0.7071067811865475 +vn 0.7071067811865476 -7.850462293418876e-17 -0.7071067811865475 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 164/484/121 167/483/121 165/482/121 162/481/121 +f 163/488/122 164/487/122 162/486/122 161/485/122 +f 168/492/123 163/491/123 161/490/123 166/489/123 +f 167/496/124 168/495/124 166/494/124 165/493/124 +f 166/500/125 161/499/125 162/498/125 165/497/125 +f 167/504/126 164/503/126 163/502/126 168/501/126 +o spikepart8 +v 0.7292038680986273 0.5625 0.8175922157469455 +v 0.7292038680986275 0.4375000000000002 0.8175922157469455 +v 0.33145630368119416 0.5625 0.41984465132951243 +v 0.3314563036811944 0.4375 0.41984465132951243 +v 0.8175922157469457 0.4375000000000002 0.7292038680986273 +v 0.8175922157469455 0.5625 0.7292038680986273 +v 0.41984465132951265 0.4375 0.33145630368119416 +v 0.41984465132951243 0.5625 0.33145630368119416 +vt 0.03125 0.96875 +vt 0.0625 0.96875 +vt 0.0625 0.828125 +vt 0.03125 0.828125 +vt 0 0.96875 +vt 0.03125 0.96875 +vt 0.03125 0.828125 +vt 0 0.828125 +vt 0.09375 0.96875 +vt 0.125 0.96875 +vt 0.125 0.828125 +vt 0.09375 0.828125 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vt 0.09375 0.828125 +vt 0.0625 0.828125 +vt 0.0625 0.96875 +vt 0.03125 0.96875 +vt 0.03125 1 +vt 0.0625 1 +vt 0.09375 1 +vt 0.0625 1 +vt 0.0625 0.96875 +vt 0.09375 0.96875 +vn 1.5700924586837752e-16 -1 1.570092458683775e-16 +vn -0.7071067811865475 -7.850462293418875e-17 0.7071067811865476 +vn -1.5700924586837752e-16 1 -1.570092458683775e-16 +vn 0.7071067811865475 7.850462293418875e-17 -0.7071067811865476 +vn 0.7071067811865476 7.850462293418876e-17 0.7071067811865475 +vn -0.7071067811865476 -7.850462293418876e-17 -0.7071067811865475 +usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 +f 172/508/127 175/507/127 173/506/127 170/505/127 +f 171/512/128 172/511/128 170/510/128 169/509/128 +f 176/516/129 171/515/129 169/514/129 174/513/129 +f 175/520/130 176/519/130 174/518/130 173/517/130 +f 174/524/131 169/523/131 170/522/131 173/521/131 +f 175/528/132 172/527/132 171/526/132 176/525/132 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/horse.obj b/prismarine-viewer/viewer/lib/entity/models/horse.obj new file mode 100644 index 00000000..bb08e913 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/horse.obj @@ -0,0 +1,1061 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o Body +v 0.3125 1.3125 0.6875 +v 0.3125 1.3125 -0.6875 +v 0.3125 0.6875 0.6875 +v 0.3125 0.6875 -0.6875 +v -0.3125 1.3125 -0.6875 +v -0.3125 1.3125 0.6875 +v -0.3125 0.6875 -0.6875 +v -0.3125 0.6875 0.6875 +vt 0.34375 0.15625 +vt 0.5 0.15625 +vt 0.5 0 +vt 0.34375 0 +vt 0 0.15625 +vt 0.34375 0.15625 +vt 0.34375 0 +vt 0 0 +vt 0.84375 0.15625 +vt 1 0.15625 +vt 1 0 +vt 0.84375 0 +vt 0.5 0.15625 +vt 0.84375 0.15625 +vt 0.84375 0 +vt 0.5 0 +vt 0.5 0.15625 +vt 0.34375 0.15625 +vt 0.34375 0.5 +vt 0.5 0.5 +vt 0.65625 0.5 +vt 0.5 0.5 +vt 0.5 0.15625 +vt 0.65625 0.15625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o TailA +v 0.09375 1.3125 0.7957531754730547 +v 0.09375 1.1875 0.5792468245269451 +v 0.09375 0.5547277716886161 1.2332531754730547 +v 0.09375 0.4297277716886161 1.0167468245269449 +v -0.09375 1.1875 0.5792468245269451 +v -0.09375 1.3125 0.7957531754730547 +v -0.09375 0.4297277716886161 1.0167468245269449 +v -0.09375 0.5547277716886161 1.2332531754730547 +vt 0.71875 0.375 +vt 0.765625 0.375 +vt 0.765625 0.15625 +vt 0.71875 0.15625 +vt 0.65625 0.375 +vt 0.71875 0.375 +vt 0.71875 0.15625 +vt 0.65625 0.15625 +vt 0.828125 0.375 +vt 0.875 0.375 +vt 0.875 0.15625 +vt 0.828125 0.15625 +vt 0.765625 0.375 +vt 0.828125 0.375 +vt 0.828125 0.15625 +vt 0.765625 0.15625 +vt 0.765625 0.375 +vt 0.71875 0.375 +vt 0.71875 0.4375 +vt 0.765625 0.4375 +vt 0.8125 0.4375 +vt 0.765625 0.4375 +vt 0.765625 0.375 +vt 0.8125 0.375 +vn 0 -0.49999999999999994 -0.8660254037844387 +vn 1 0 0 +vn 0 0.49999999999999994 0.8660254037844387 +vn -1 0 0 +vn 0 0.8660254037844387 -0.49999999999999994 +vn 0 -0.8660254037844387 0.49999999999999994 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o Leg1A +v -0.0625 0.6875 0.6875 +v -0.0625 0.6875 0.4375 +v -0.0625 0 0.6875 +v -0.0625 0 0.4375 +v -0.3125 0.6875 0.4375 +v -0.3125 0.6875 0.6875 +v -0.3125 0 0.4375 +v -0.3125 0 0.6875 +vt 0.875 0.609375 +vt 0.8125 0.609375 +vt 0.8125 0.4375 +vt 0.875 0.4375 +vt 0.9375 0.609375 +vt 0.875 0.609375 +vt 0.875 0.4375 +vt 0.9375 0.4375 +vt 1 0.609375 +vt 0.9375 0.609375 +vt 0.9375 0.4375 +vt 1 0.4375 +vt 0.8125 0.609375 +vt 0.75 0.609375 +vt 0.75 0.4375 +vt 0.8125 0.4375 +vt 0.8125 0.609375 +vt 0.875 0.609375 +vt 0.875 0.671875 +vt 0.8125 0.671875 +vt 0.875 0.671875 +vt 0.9375 0.671875 +vt 0.9375 0.609375 +vt 0.875 0.609375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o Leg2A +v 0.3125 0.6875 0.6875 +v 0.3125 0.6875 0.4375 +v 0.3125 0 0.6875 +v 0.3125 0 0.4375 +v 0.0625 0.6875 0.4375 +v 0.0625 0.6875 0.6875 +v 0.0625 0 0.4375 +v 0.0625 0 0.6875 +vt 0.8125 0.609375 +vt 0.875 0.609375 +vt 0.875 0.4375 +vt 0.8125 0.4375 +vt 0.75 0.609375 +vt 0.8125 0.609375 +vt 0.8125 0.4375 +vt 0.75 0.4375 +vt 0.9375 0.609375 +vt 1 0.609375 +vt 1 0.4375 +vt 0.9375 0.4375 +vt 0.875 0.609375 +vt 0.9375 0.609375 +vt 0.9375 0.4375 +vt 0.875 0.4375 +vt 0.875 0.609375 +vt 0.8125 0.609375 +vt 0.8125 0.671875 +vt 0.875 0.671875 +vt 0.9375 0.671875 +vt 0.875 0.671875 +vt 0.875 0.609375 +vt 0.9375 0.609375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o Leg3A +v -0.0625 0.6875 -0.4375 +v -0.0625 0.6875 -0.6875 +v -0.0625 0 -0.4375 +v -0.0625 0 -0.6875 +v -0.3125 0.6875 -0.6875 +v -0.3125 0.6875 -0.4375 +v -0.3125 0 -0.6875 +v -0.3125 0 -0.4375 +vt 0.875 0.609375 +vt 0.8125 0.609375 +vt 0.8125 0.4375 +vt 0.875 0.4375 +vt 0.9375 0.609375 +vt 0.875 0.609375 +vt 0.875 0.4375 +vt 0.9375 0.4375 +vt 1 0.609375 +vt 0.9375 0.609375 +vt 0.9375 0.4375 +vt 1 0.4375 +vt 0.8125 0.609375 +vt 0.75 0.609375 +vt 0.75 0.4375 +vt 0.8125 0.4375 +vt 0.8125 0.609375 +vt 0.875 0.609375 +vt 0.875 0.671875 +vt 0.8125 0.671875 +vt 0.875 0.671875 +vt 0.9375 0.671875 +vt 0.9375 0.609375 +vt 0.875 0.609375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o Leg4A +v 0.3125 0.6875 -0.4375 +v 0.3125 0.6875 -0.6875 +v 0.3125 0 -0.4375 +v 0.3125 0 -0.6875 +v 0.0625 0.6875 -0.6875 +v 0.0625 0.6875 -0.4375 +v 0.0625 0 -0.6875 +v 0.0625 0 -0.4375 +vt 0.8125 0.609375 +vt 0.875 0.609375 +vt 0.875 0.4375 +vt 0.8125 0.4375 +vt 0.75 0.609375 +vt 0.8125 0.609375 +vt 0.8125 0.4375 +vt 0.75 0.4375 +vt 0.9375 0.609375 +vt 1 0.609375 +vt 1 0.4375 +vt 0.9375 0.4375 +vt 0.875 0.609375 +vt 0.9375 0.609375 +vt 0.9375 0.4375 +vt 0.875 0.4375 +vt 0.875 0.609375 +vt 0.8125 0.609375 +vt 0.8125 0.671875 +vt 0.875 0.671875 +vt 0.9375 0.671875 +vt 0.875 0.671875 +vt 0.875 0.609375 +vt 0.9375 0.609375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o Head +v 0.1875 2.051882938682637 -0.7896234122634724 +v 0.1875 1.833132938682637 -1.1685095264191645 +v 0.1875 1.78125 -0.6333734122634727 +v 0.1875 1.5625 -1.0122595264191645 +v -0.1875 1.833132938682637 -1.1685095264191645 +v -0.1875 2.051882938682637 -0.7896234122634724 +v -0.1875 1.5625 -1.0122595264191645 +v -0.1875 1.78125 -0.6333734122634727 +vt 0.109375 0.6875 +vt 0.203125 0.6875 +vt 0.203125 0.609375 +vt 0.109375 0.609375 +vt 0 0.6875 +vt 0.109375 0.6875 +vt 0.109375 0.609375 +vt 0 0.609375 +vt 0.3125 0.6875 +vt 0.40625 0.6875 +vt 0.40625 0.609375 +vt 0.3125 0.609375 +vt 0.203125 0.6875 +vt 0.3125 0.6875 +vt 0.3125 0.609375 +vt 0.203125 0.609375 +vt 0.203125 0.6875 +vt 0.109375 0.6875 +vt 0.109375 0.796875 +vt 0.203125 0.796875 +vt 0.296875 0.796875 +vt 0.203125 0.796875 +vt 0.203125 0.6875 +vt 0.296875 0.6875 +vn 0 -0.49999999999999994 -0.8660254037844387 +vn 1 0 0 +vn 0 0.49999999999999994 0.8660254037844387 +vn -1 0 0 +vn 0 0.8660254037844387 -0.49999999999999994 +vn 0 -0.8660254037844387 0.49999999999999994 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o UMouth +v 0.125 1.833132938682637 -1.1685095264191645 +v 0.125 1.676882938682637 -1.4391424651018014 +v 0.125 1.5625 -1.0122595264191645 +v 0.125 1.40625 -1.2828924651018019 +v -0.125 1.676882938682637 -1.4391424651018014 +v -0.125 1.833132938682637 -1.1685095264191645 +v -0.125 1.40625 -1.2828924651018019 +v -0.125 1.5625 -1.0122595264191645 +vt 0.078125 0.53125 +vt 0.140625 0.53125 +vt 0.140625 0.453125 +vt 0.078125 0.453125 +vt 0 0.53125 +vt 0.078125 0.53125 +vt 0.078125 0.453125 +vt 0 0.453125 +vt 0.21875 0.53125 +vt 0.28125 0.53125 +vt 0.28125 0.453125 +vt 0.21875 0.453125 +vt 0.140625 0.53125 +vt 0.21875 0.53125 +vt 0.21875 0.453125 +vt 0.140625 0.453125 +vt 0.140625 0.53125 +vt 0.078125 0.53125 +vt 0.078125 0.609375 +vt 0.140625 0.609375 +vt 0.203125 0.609375 +vt 0.140625 0.609375 +vt 0.140625 0.53125 +vt 0.203125 0.53125 +vn 0 -0.49999999999999994 -0.8660254037844387 +vn 1 0 0 +vn 0 0.49999999999999994 0.8660254037844387 +vn -1 0 0 +vn 0 0.8660254037844387 -0.49999999999999994 +vn 0 -0.8660254037844387 0.49999999999999994 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o Ear1 +v -0.06465012057680164 2.1600077984998522 -0.8465349149312555 +v -0.06192650361593727 2.1288767141844853 -0.9006615026677829 +v -0.050497791707081574 1.9982459393130734 -0.7527849149312555 +v -0.04777417474621726 1.9671148549977064 -0.8069115026677829 +v -0.1864508408774055 2.117982246341028 -0.9006615026677829 +v -0.1891744578382698 2.149113330656395 -0.8465349149312555 +v -0.17229851200768548 1.9562203871542492 -0.8069115026677829 +v -0.1750221289685498 1.987351471469616 -0.7527849149312555 +vt 0.34375 0.734375 +vt 0.3125 0.734375 +vt 0.3125 0.6875 +vt 0.34375 0.6875 +vt 0.359375 0.734375 +vt 0.34375 0.734375 +vt 0.34375 0.6875 +vt 0.359375 0.6875 +vt 0.390625 0.734375 +vt 0.359375 0.734375 +vt 0.359375 0.6875 +vt 0.390625 0.6875 +vt 0.3125 0.734375 +vt 0.296875 0.734375 +vt 0.296875 0.6875 +vt 0.3125 0.6875 +vt 0.3125 0.734375 +vt 0.34375 0.734375 +vt 0.34375 0.75 +vt 0.3125 0.75 +vt 0.34375 0.75 +vt 0.375 0.75 +vt 0.375 0.734375 +vt 0.34375 0.734375 +vn 0.0435778713738291 -0.4980973490458729 -0.8660254037844388 +vn 0.9961946980917455 0.0871557427476582 -1.3877787807814457e-17 +vn -0.0435778713738291 0.4980973490458729 0.8660254037844388 +vn -0.9961946980917455 -0.0871557427476582 1.3877787807814457e-17 +vn -0.07547908730517335 0.862729915662821 -0.5 +vn 0.07547908730517335 -0.862729915662821 0.5 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o Ear2 +v 0.1891744578382698 2.149113330656395 -0.8465349149312555 +v 0.1864508408774055 2.117982246341028 -0.9006615026677829 +v 0.17502212896854985 1.987351471469616 -0.7527849149312555 +v 0.17229851200768542 1.9562203871542492 -0.8069115026677829 +v 0.06192650361593732 2.1288767141844853 -0.9006615026677829 +v 0.06465012057680164 2.1600077984998522 -0.8465349149312555 +v 0.04777417474621726 1.9671148549977064 -0.8069115026677829 +v 0.050497791707081574 1.9982459393130734 -0.7527849149312555 +vt 0.3125 0.734375 +vt 0.34375 0.734375 +vt 0.34375 0.6875 +vt 0.3125 0.6875 +vt 0.296875 0.734375 +vt 0.3125 0.734375 +vt 0.3125 0.6875 +vt 0.296875 0.6875 +vt 0.359375 0.734375 +vt 0.390625 0.734375 +vt 0.390625 0.6875 +vt 0.359375 0.6875 +vt 0.34375 0.734375 +vt 0.359375 0.734375 +vt 0.359375 0.6875 +vt 0.34375 0.6875 +vt 0.34375 0.734375 +vt 0.3125 0.734375 +vt 0.3125 0.75 +vt 0.34375 0.75 +vt 0.375 0.75 +vt 0.34375 0.75 +vt 0.34375 0.734375 +vt 0.375 0.734375 +vn -0.0435778713738291 -0.4980973490458729 -0.8660254037844388 +vn 0.9961946980917455 -0.0871557427476582 1.3877787807814457e-17 +vn 0.0435778713738291 0.4980973490458729 0.8660254037844388 +vn -0.9961946980917455 0.0871557427476582 -1.3877787807814457e-17 +vn 0.07547908730517335 0.862729915662821 -0.5 +vn -0.07547908730517335 -0.862729915662821 0.5 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o MuleEarL +v -0.15935822581478865 2.3816773650616265 -0.9715349149312555 +v -0.15127013065533484 2.351492182990093 -1.0256615026677829 +v -0.061295283546407786 2.0157014821763357 -0.7527849149312555 +v -0.05320718838695404 1.9855163001048024 -0.8069115026677829 +v -0.27201085894146837 2.3191398023522782 -1.0256615026677829 +v -0.28009895410092217 2.3493249844238115 -0.9715349149312555 +v -0.1739479166730875 1.9531639194669874 -0.8069115026677829 +v -0.1820360118325413 1.9833491015385207 -0.7527849149312555 +vt 0.046875 0.796875 +vt 0.015625 0.796875 +vt 0.015625 0.6875 +vt 0.046875 0.6875 +vt 0.0625 0.796875 +vt 0.046875 0.796875 +vt 0.046875 0.6875 +vt 0.0625 0.6875 +vt 0.09375 0.796875 +vt 0.0625 0.796875 +vt 0.0625 0.6875 +vt 0.09375 0.6875 +vt 0.015625 0.796875 +vt 0 0.796875 +vt 0 0.6875 +vt 0.015625 0.6875 +vt 0.015625 0.796875 +vt 0.046875 0.796875 +vt 0.046875 0.8125 +vt 0.015625 0.8125 +vt 0.046875 0.8125 +vt 0.078125 0.8125 +vt 0.078125 0.796875 +vt 0.046875 0.796875 +vn 0.12940952255126037 -0.48296291314453416 -0.8660254037844387 +vn 0.9659258262890683 0.25881904510252074 1.3877787807814457e-17 +vn -0.12940952255126037 0.48296291314453416 0.8660254037844387 +vn -0.9659258262890683 -0.25881904510252074 -1.3877787807814457e-17 +vn -0.2241438680420134 0.8365163037378079 -0.5 +vn 0.2241438680420134 -0.8365163037378079 0.5 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 +o MuleEarR +v 0.2800989541009222 2.3493249844238115 -0.9715349149312555 +v 0.27201085894146837 2.3191398023522782 -1.0256615026677829 +v 0.18203601183254126 1.9833491015385207 -0.7527849149312555 +v 0.1739479166730875 1.9531639194669874 -0.8069115026677829 +v 0.1512701306553348 2.351492182990093 -1.0256615026677829 +v 0.15935822581478865 2.3816773650616265 -0.9715349149312555 +v 0.05320718838695404 1.9855163001048024 -0.8069115026677829 +v 0.061295283546407786 2.0157014821763357 -0.7527849149312555 +vt 0.015625 0.796875 +vt 0.046875 0.796875 +vt 0.046875 0.6875 +vt 0.015625 0.6875 +vt 0 0.796875 +vt 0.015625 0.796875 +vt 0.015625 0.6875 +vt 0 0.6875 +vt 0.0625 0.796875 +vt 0.09375 0.796875 +vt 0.09375 0.6875 +vt 0.0625 0.6875 +vt 0.046875 0.796875 +vt 0.0625 0.796875 +vt 0.0625 0.6875 +vt 0.046875 0.6875 +vt 0.046875 0.796875 +vt 0.015625 0.796875 +vt 0.015625 0.8125 +vt 0.046875 0.8125 +vt 0.078125 0.8125 +vt 0.046875 0.8125 +vt 0.046875 0.796875 +vt 0.078125 0.796875 +vn -0.12940952255126037 -0.48296291314453416 -0.8660254037844387 +vn 0.9659258262890683 -0.25881904510252074 -1.3877787807814457e-17 +vn 0.12940952255126037 0.48296291314453416 0.8660254037844387 +vn -0.9659258262890683 0.25881904510252074 1.3877787807814457e-17 +vn 0.2241438680420134 0.8365163037378079 -0.5 +vn -0.2241438680420134 -0.8365163037378079 0.5 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 92/268/67 95/267/67 93/266/67 90/265/67 +f 91/272/68 92/271/68 90/270/68 89/269/68 +f 96/276/69 91/275/69 89/274/69 94/273/69 +f 95/280/70 96/279/70 94/278/70 93/277/70 +f 94/284/71 89/283/71 90/282/71 93/281/71 +f 95/288/72 92/287/72 91/286/72 96/285/72 +o Neck +v 0.125 1.7828924651018019 -0.6272436490538904 +v 0.125 1.5641424651018019 -1.0061297632095823 +v 0.125 1.1333734122634724 -0.2522436490538904 +v 0.125 0.9146234122634727 -0.6311297632095825 +v -0.125 1.5641424651018019 -1.0061297632095823 +v -0.125 1.7828924651018019 -0.6272436490538904 +v -0.125 0.9146234122634727 -0.6311297632095825 +v -0.125 1.1333734122634724 -0.2522436490538904 +vt 0.109375 0.34375 +vt 0.171875 0.34375 +vt 0.171875 0.15625 +vt 0.109375 0.15625 +vt 0 0.34375 +vt 0.109375 0.34375 +vt 0.109375 0.15625 +vt 0 0.15625 +vt 0.28125 0.34375 +vt 0.34375 0.34375 +vt 0.34375 0.15625 +vt 0.28125 0.15625 +vt 0.171875 0.34375 +vt 0.28125 0.34375 +vt 0.28125 0.15625 +vt 0.171875 0.15625 +vt 0.171875 0.34375 +vt 0.109375 0.34375 +vt 0.109375 0.453125 +vt 0.171875 0.453125 +vt 0.234375 0.453125 +vt 0.171875 0.453125 +vt 0.171875 0.34375 +vt 0.234375 0.34375 +vn 0 -0.49999999999999994 -0.8660254037844387 +vn 1 0 0 +vn 0 0.49999999999999994 0.8660254037844387 +vn -1 0 0 +vn 0 0.8660254037844387 -0.49999999999999994 +vn 0 -0.8660254037844387 0.49999999999999994 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 100/292/73 103/291/73 101/290/73 98/289/73 +f 99/296/74 100/295/74 98/294/74 97/293/74 +f 104/300/75 99/299/75 97/298/75 102/297/75 +f 103/304/76 104/303/76 102/302/76 101/301/76 +f 102/308/77 97/307/77 98/306/77 101/305/77 +f 103/312/78 100/311/78 99/310/78 104/309/78 +o Mane +v 0.0625 2.1160254037844384 -0.6752404735808355 +v 0.0625 2.0535254037844384 -0.7834936490538902 +v 0.0625 1.25 -0.1752404735808355 +v 0.0625 1.1875 -0.2834936490538904 +v -0.0625 2.0535254037844384 -0.7834936490538902 +v -0.0625 2.1160254037844384 -0.6752404735808355 +v -0.0625 1.1875 -0.2834936490538904 +v -0.0625 1.25 -0.1752404735808355 +vt 0.90625 0.40625 +vt 0.9375 0.40625 +vt 0.9375 0.15625 +vt 0.90625 0.15625 +vt 0.875 0.40625 +vt 0.90625 0.40625 +vt 0.90625 0.15625 +vt 0.875 0.15625 +vt 0.96875 0.40625 +vt 1 0.40625 +vt 1 0.15625 +vt 0.96875 0.15625 +vt 0.9375 0.40625 +vt 0.96875 0.40625 +vt 0.96875 0.15625 +vt 0.9375 0.15625 +vt 0.9375 0.40625 +vt 0.90625 0.40625 +vt 0.90625 0.4375 +vt 0.9375 0.4375 +vt 0.96875 0.4375 +vt 0.9375 0.4375 +vt 0.9375 0.40625 +vt 0.96875 0.40625 +vn 0 -0.49999999999999994 -0.8660254037844387 +vn 1 0 0 +vn 0 0.49999999999999994 0.8660254037844387 +vn -1 0 0 +vn 0 0.8660254037844387 -0.49999999999999994 +vn 0 -0.8660254037844387 0.49999999999999994 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 108/316/79 111/315/79 109/314/79 106/313/79 +f 107/320/80 108/319/80 106/318/80 105/317/80 +f 112/324/81 107/323/81 105/322/81 110/321/81 +f 111/328/82 112/327/82 110/326/82 109/325/82 +f 110/332/83 105/331/83 106/330/83 109/329/83 +f 111/336/84 108/335/84 107/334/84 112/333/84 +o Bag1 +v 0.5 1.3125 0.125 +v 0.3125000000000001 1.3125 0.12499999999999989 +v 0.5 0.8125 0.125 +v 0.3125000000000001 0.8125 0.12499999999999989 +v 0.3125 1.3125 0.625 +v 0.5 1.3125 0.625 +v 0.3125 0.8125 0.625 +v 0.5 0.8125 0.625 +vt 0.453125 0.625 +vt 0.578125 0.625 +vt 0.578125 0.5 +vt 0.453125 0.5 +vt 0.40625 0.625 +vt 0.453125 0.625 +vt 0.453125 0.5 +vt 0.40625 0.5 +vt 0.625 0.625 +vt 0.75 0.625 +vt 0.75 0.5 +vt 0.625 0.5 +vt 0.578125 0.625 +vt 0.625 0.625 +vt 0.625 0.5 +vt 0.578125 0.5 +vt 0.578125 0.625 +vt 0.453125 0.625 +vt 0.453125 0.671875 +vt 0.578125 0.671875 +vt 0.703125 0.671875 +vt 0.578125 0.671875 +vt 0.578125 0.625 +vt 0.703125 0.625 +vn -1 0 -2.220446049250313e-16 +vn 2.220446049250313e-16 0 -1 +vn 1 0 2.220446049250313e-16 +vn -2.220446049250313e-16 0 1 +vn 0 1 0 +vn 0 -1 0 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 116/340/85 119/339/85 117/338/85 114/337/85 +f 115/344/86 116/343/86 114/342/86 113/341/86 +f 120/348/87 115/347/87 113/346/87 118/345/87 +f 119/352/88 120/351/88 118/350/88 117/349/88 +f 118/356/89 113/355/89 114/354/89 117/353/89 +f 119/360/90 116/359/90 115/358/90 120/357/90 +o Bag2 +v -0.5 1.3125 0.625 +v -0.3125 1.3125 0.625 +v -0.5 0.8125 0.625 +v -0.3125 0.8125 0.625 +v -0.3125000000000001 1.3125 0.12499999999999989 +v -0.5000000000000001 1.3125 0.125 +v -0.3125000000000001 0.8125 0.12499999999999989 +v -0.5000000000000001 0.8125 0.125 +vt 0.578125 0.625 +vt 0.453125 0.625 +vt 0.453125 0.5 +vt 0.578125 0.5 +vt 0.625 0.625 +vt 0.578125 0.625 +vt 0.578125 0.5 +vt 0.625 0.5 +vt 0.75 0.625 +vt 0.625 0.625 +vt 0.625 0.5 +vt 0.75 0.5 +vt 0.453125 0.625 +vt 0.40625 0.625 +vt 0.40625 0.5 +vt 0.453125 0.5 +vt 0.453125 0.625 +vt 0.578125 0.625 +vt 0.578125 0.671875 +vt 0.453125 0.671875 +vt 0.578125 0.671875 +vt 0.703125 0.671875 +vt 0.703125 0.625 +vt 0.578125 0.625 +vn 1 0 -2.220446049250313e-16 +vn 2.220446049250313e-16 0 1 +vn -1 0 2.220446049250313e-16 +vn -2.220446049250313e-16 0 -1 +vn 0 1 0 +vn 0 -1 0 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 124/364/91 127/363/91 125/362/91 122/361/91 +f 123/368/92 124/367/92 122/366/92 121/365/92 +f 128/372/93 123/371/93 121/370/93 126/369/93 +f 127/376/94 128/375/94 126/374/94 125/373/94 +f 126/380/95 121/379/95 122/378/95 125/377/95 +f 127/384/96 124/383/96 123/382/96 128/381/96 +o Saddle +v 0.34375 1.34375 0.375 +v 0.34375 1.34375 -0.25 +v 0.34375 0.71875 0.375 +v 0.34375 0.71875 -0.25 +v -0.34375 1.34375 -0.25 +v -0.34375 1.34375 0.375 +v -0.34375 0.71875 -0.25 +v -0.34375 0.71875 0.375 +vt 0.546875 0.859375 +vt 0.703125 0.859375 +vt 0.703125 0.71875 +vt 0.546875 0.71875 +vt 0.40625 0.859375 +vt 0.546875 0.859375 +vt 0.546875 0.71875 +vt 0.40625 0.71875 +vt 0.84375 0.859375 +vt 1 0.859375 +vt 1 0.71875 +vt 0.84375 0.71875 +vt 0.703125 0.859375 +vt 0.84375 0.859375 +vt 0.84375 0.71875 +vt 0.703125 0.71875 +vt 0.703125 0.859375 +vt 0.546875 0.859375 +vt 0.546875 1 +vt 0.703125 1 +vt 0.859375 1 +vt 0.703125 1 +vt 0.703125 0.859375 +vt 0.859375 0.859375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 132/388/97 135/387/97 133/386/97 130/385/97 +f 131/392/98 132/391/98 130/390/98 129/389/98 +f 136/396/99 131/395/99 129/394/99 134/393/99 +f 135/400/100 136/399/100 134/398/100 133/397/100 +f 134/404/101 129/403/101 130/402/101 133/401/101 +f 135/408/102 132/407/102 131/406/102 136/405/102 +o SaddleMouthL +v -0.125 1.6952722283113841 -1.1540063509461098 +v -0.125 1.6327722283113841 -1.2622595264191645 +v -0.125 1.587019052838329 -1.0915063509461098 +v -0.125 1.524519052838329 -1.1997595264191645 +v -0.1875 1.6327722283113841 -1.2622595264191645 +v -0.1875 1.6952722283113841 -1.1540063509461098 +v -0.1875 1.524519052838329 -1.1997595264191645 +v -0.1875 1.587019052838329 -1.0915063509461098 +vt 0.484375 0.890625 +vt 0.5 0.890625 +vt 0.5 0.859375 +vt 0.484375 0.859375 +vt 0.453125 0.890625 +vt 0.484375 0.890625 +vt 0.484375 0.859375 +vt 0.453125 0.859375 +vt 0.53125 0.890625 +vt 0.546875 0.890625 +vt 0.546875 0.859375 +vt 0.53125 0.859375 +vt 0.5 0.890625 +vt 0.53125 0.890625 +vt 0.53125 0.859375 +vt 0.5 0.859375 +vt 0.5 0.890625 +vt 0.484375 0.890625 +vt 0.484375 0.921875 +vt 0.5 0.921875 +vt 0.515625 0.921875 +vt 0.5 0.921875 +vt 0.5 0.890625 +vt 0.515625 0.890625 +vn 0 -0.49999999999999994 -0.8660254037844387 +vn 1 0 0 +vn 0 0.49999999999999994 0.8660254037844387 +vn -1 0 0 +vn 0 0.8660254037844387 -0.49999999999999994 +vn 0 -0.8660254037844387 0.49999999999999994 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 140/412/103 143/411/103 141/410/103 138/409/103 +f 139/416/104 140/415/104 138/414/104 137/413/104 +f 144/420/105 139/419/105 137/418/105 142/417/105 +f 143/424/106 144/423/106 142/422/106 141/421/106 +f 142/428/107 137/427/107 138/426/107 141/425/107 +f 143/432/108 140/431/108 139/430/108 144/429/108 +o SaddleMouthR +v 0.1875 1.6952722283113841 -1.1540063509461098 +v 0.1875 1.6327722283113841 -1.2622595264191645 +v 0.1875 1.587019052838329 -1.0915063509461098 +v 0.1875 1.524519052838329 -1.1997595264191645 +v 0.125 1.6327722283113841 -1.2622595264191645 +v 0.125 1.6952722283113841 -1.1540063509461098 +v 0.125 1.524519052838329 -1.1997595264191645 +v 0.125 1.587019052838329 -1.0915063509461098 +vt 0.484375 0.890625 +vt 0.5 0.890625 +vt 0.5 0.859375 +vt 0.484375 0.859375 +vt 0.453125 0.890625 +vt 0.484375 0.890625 +vt 0.484375 0.859375 +vt 0.453125 0.859375 +vt 0.53125 0.890625 +vt 0.546875 0.890625 +vt 0.546875 0.859375 +vt 0.53125 0.859375 +vt 0.5 0.890625 +vt 0.53125 0.890625 +vt 0.53125 0.859375 +vt 0.5 0.859375 +vt 0.5 0.890625 +vt 0.484375 0.890625 +vt 0.484375 0.921875 +vt 0.5 0.921875 +vt 0.515625 0.921875 +vt 0.5 0.921875 +vt 0.5 0.890625 +vt 0.515625 0.890625 +vn 0 -0.49999999999999994 -0.8660254037844387 +vn 1 0 0 +vn 0 0.49999999999999994 0.8660254037844387 +vn -1 0 0 +vn 0 0.8660254037844387 -0.49999999999999994 +vn 0 -0.8660254037844387 0.49999999999999994 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 148/436/109 151/435/109 149/434/109 146/433/109 +f 147/440/110 148/439/110 146/438/110 145/437/110 +f 152/444/111 147/443/111 145/442/111 150/441/111 +f 151/448/112 152/447/112 150/446/112 149/445/112 +f 150/452/113 145/451/113 146/450/113 149/449/113 +f 151/456/114 148/455/114 147/454/114 152/453/114 +o SaddleMouthLine +v -0.19374999999999998 1.6875 -0.21875 +v -0.19374999999999998 1.6875 -1.21875 +v -0.19374999999999998 1.5 -0.21875 +v -0.19374999999999998 1.5 -1.21875 +v -0.19374999999999998 1.6875 -1.21875 +v -0.19374999999999998 1.6875 -0.21875 +v -0.19374999999999998 1.5 -1.21875 +v -0.19374999999999998 1.5 -0.21875 +vt 0.75 0.71875 +vt 0.75 0.71875 +vt 0.75 0.671875 +vt 0.75 0.671875 +vt 0.5 0.71875 +vt 0.75 0.71875 +vt 0.75 0.671875 +vt 0.5 0.671875 +vt 1 0.71875 +vt 1 0.71875 +vt 1 0.671875 +vt 1 0.671875 +vt 0.75 0.71875 +vt 1 0.71875 +vt 1 0.671875 +vt 0.75 0.671875 +vt 0.75 0.71875 +vt 0.75 0.71875 +vt 0.75 0.96875 +vt 0.75 0.96875 +vt 0.75 0.96875 +vt 0.75 0.96875 +vt 0.75 0.71875 +vt 0.75 0.71875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 156/460/115 159/459/115 157/458/115 154/457/115 +f 155/464/116 156/463/116 154/462/116 153/461/116 +f 160/468/117 155/467/117 153/466/117 158/465/117 +f 159/472/118 160/471/118 158/470/118 157/469/118 +f 158/476/119 153/475/119 154/474/119 157/473/119 +f 159/480/120 156/479/120 155/478/120 160/477/120 +o SaddleMouthLineR +v 0.19374999999999998 1.6875 -0.21875 +v 0.19374999999999998 1.6875 -1.21875 +v 0.19374999999999998 1.5 -0.21875 +v 0.19374999999999998 1.5 -1.21875 +v 0.19374999999999998 1.6875 -1.21875 +v 0.19374999999999998 1.6875 -0.21875 +v 0.19374999999999998 1.5 -1.21875 +v 0.19374999999999998 1.5 -0.21875 +vt 0.75 0.71875 +vt 0.75 0.71875 +vt 0.75 0.671875 +vt 0.75 0.671875 +vt 0.5 0.71875 +vt 0.75 0.71875 +vt 0.75 0.671875 +vt 0.5 0.671875 +vt 1 0.71875 +vt 1 0.71875 +vt 1 0.671875 +vt 1 0.671875 +vt 0.75 0.71875 +vt 1 0.71875 +vt 1 0.671875 +vt 0.75 0.671875 +vt 0.75 0.71875 +vt 0.75 0.71875 +vt 0.75 0.96875 +vt 0.75 0.96875 +vt 0.75 0.96875 +vt 0.75 0.96875 +vt 0.75 0.71875 +vt 0.75 0.71875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 164/484/121 167/483/121 165/482/121 162/481/121 +f 163/488/122 164/487/122 162/486/122 161/485/122 +f 168/492/123 163/491/123 161/490/123 166/489/123 +f 167/496/124 168/495/124 166/494/124 165/493/124 +f 166/500/125 161/499/125 162/498/125 165/497/125 +f 167/504/126 164/503/126 163/502/126 168/501/126 +o HeadSaddle +v 0.140625 1.8561195507185708 -1.1566606162754502 +v 0.140625 1.7779945507185708 -1.291977085616769 +v 0.140625 1.5584233181676694 -0.9847856162754505 +v 0.140625 1.4802983181676697 -1.120102085616769 +v -0.140625 1.7779945507185708 -1.291977085616769 +v -0.140625 1.8561195507185708 -1.1566606162754502 +v -0.140625 1.4802983181676697 -1.120102085616769 +v -0.140625 1.5584233181676694 -0.9847856162754505 +vt 0.328125 0.96875 +vt 0.390625 0.96875 +vt 0.390625 0.890625 +vt 0.328125 0.890625 +vt 0.296875 0.96875 +vt 0.328125 0.96875 +vt 0.328125 0.890625 +vt 0.296875 0.890625 +vt 0.421875 0.96875 +vt 0.484375 0.96875 +vt 0.484375 0.890625 +vt 0.421875 0.890625 +vt 0.390625 0.96875 +vt 0.421875 0.96875 +vt 0.421875 0.890625 +vt 0.390625 0.890625 +vt 0.390625 0.96875 +vt 0.328125 0.96875 +vt 0.328125 1 +vt 0.390625 1 +vt 0.453125 1 +vt 0.390625 1 +vt 0.390625 0.96875 +vt 0.453125 0.96875 +vn 0 -0.49999999999999994 -0.8660254037844387 +vn 1 0 0 +vn 0 0.49999999999999994 0.8660254037844387 +vn -1 0 0 +vn 0 0.8660254037844387 -0.49999999999999994 +vn 0 -0.8660254037844387 0.49999999999999994 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 172/508/127 175/507/127 173/506/127 170/505/127 +f 171/512/128 172/511/128 170/510/128 169/509/128 +f 176/516/129 171/515/129 169/514/129 174/513/129 +f 175/520/130 176/519/130 174/518/130 173/517/130 +f 174/524/131 169/523/131 170/522/131 173/521/131 +f 175/528/132 172/527/132 171/526/132 176/525/132 +o HeadSaddle +v 0.203125 2.074869550718571 -0.7777745021197584 +v 0.203125 1.8404945507185708 -1.183723910143714 +v 0.203125 1.7771733181676694 -0.6058995021197586 +v 0.203125 1.5427983181676694 -1.0118489101437143 +v -0.203125 1.8404945507185708 -1.183723910143714 +v -0.203125 2.074869550718571 -0.7777745021197584 +v -0.203125 1.5427983181676694 -1.0118489101437143 +v -0.203125 1.7771733181676694 -0.6058995021197586 +vt 0.109375 0.890625 +vt 0.203125 0.890625 +vt 0.203125 0.8125 +vt 0.109375 0.8125 +vt 0 0.890625 +vt 0.109375 0.890625 +vt 0.109375 0.8125 +vt 0 0.8125 +vt 0.3125 0.890625 +vt 0.40625 0.890625 +vt 0.40625 0.8125 +vt 0.3125 0.8125 +vt 0.203125 0.890625 +vt 0.3125 0.890625 +vt 0.3125 0.8125 +vt 0.203125 0.8125 +vt 0.203125 0.890625 +vt 0.109375 0.890625 +vt 0.109375 1 +vt 0.203125 1 +vt 0.296875 1 +vt 0.203125 1 +vt 0.203125 0.890625 +vt 0.296875 0.890625 +vn 0 -0.49999999999999994 -0.8660254037844387 +vn 1 0 0 +vn 0 0.49999999999999994 0.8660254037844387 +vn -1 0 0 +vn 0 0.8660254037844387 -0.49999999999999994 +vn 0 -0.8660254037844387 0.49999999999999994 +usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 +f 180/532/133 183/531/133 181/530/133 178/529/133 +f 179/536/134 180/535/134 178/534/134 177/533/134 +f 184/540/135 179/539/135 177/538/135 182/537/135 +f 183/544/136 184/543/136 182/542/136 181/541/136 +f 182/548/137 177/547/137 178/546/137 181/545/137 +f 183/552/138 180/551/138 179/550/138 184/549/138 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/llama.obj b/prismarine-viewer/viewer/lib/entity/models/llama.obj new file mode 100644 index 00000000..1ef48ac5 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/llama.obj @@ -0,0 +1,509 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o head +v 0.125 1.9375 -0.4375 +v 0.125 1.9375 -1 +v 0.125 1.6875 -0.4375 +v 0.125 1.6875 -1 +v -0.125 1.9375 -1 +v -0.125 1.9375 -0.4375 +v -0.125 1.6875 -1 +v -0.125 1.6875 -0.4375 +vt 0.0703125 0.859375 +vt 0.1015625 0.859375 +vt 0.1015625 0.796875 +vt 0.0703125 0.796875 +vt 0 0.859375 +vt 0.0703125 0.859375 +vt 0.0703125 0.796875 +vt 0 0.796875 +vt 0.171875 0.859375 +vt 0.203125 0.859375 +vt 0.203125 0.796875 +vt 0.171875 0.796875 +vt 0.1015625 0.859375 +vt 0.171875 0.859375 +vt 0.171875 0.796875 +vt 0.1015625 0.796875 +vt 0.1015625 0.859375 +vt 0.0703125 0.859375 +vt 0.0703125 1 +vt 0.1015625 1 +vt 0.1328125 1 +vt 0.1015625 1 +vt 0.1015625 0.859375 +vt 0.1328125 0.859375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o head +v 0.25 2.0625 -0.375 +v 0.25 2.0625 -0.75 +v 0.25 0.9375 -0.375 +v 0.25 0.9375 -0.75 +v -0.25 2.0625 -0.75 +v -0.25 2.0625 -0.375 +v -0.25 0.9375 -0.75 +v -0.25 0.9375 -0.375 +vt 0.046875 0.6875 +vt 0.109375 0.6875 +vt 0.109375 0.40625 +vt 0.046875 0.40625 +vt 0 0.6875 +vt 0.046875 0.6875 +vt 0.046875 0.40625 +vt 0 0.40625 +vt 0.15625 0.6875 +vt 0.21875 0.6875 +vt 0.21875 0.40625 +vt 0.15625 0.40625 +vt 0.109375 0.6875 +vt 0.15625 0.6875 +vt 0.15625 0.40625 +vt 0.109375 0.40625 +vt 0.109375 0.6875 +vt 0.046875 0.6875 +vt 0.046875 0.78125 +vt 0.109375 0.78125 +vt 0.171875 0.78125 +vt 0.109375 0.78125 +vt 0.109375 0.6875 +vt 0.171875 0.6875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o head +v 0.25 2.25 -0.5 +v 0.25 2.25 -0.625 +v 0.25 2.0625 -0.5 +v 0.25 2.0625 -0.625 +v 0.0625 2.25 -0.625 +v 0.0625 2.25 -0.5 +v 0.0625 2.0625 -0.625 +v 0.0625 2.0625 -0.5 +vt 0.1484375 0.96875 +vt 0.171875 0.96875 +vt 0.171875 0.921875 +vt 0.1484375 0.921875 +vt 0.1328125 0.96875 +vt 0.1484375 0.96875 +vt 0.1484375 0.921875 +vt 0.1328125 0.921875 +vt 0.1875 0.96875 +vt 0.2109375 0.96875 +vt 0.2109375 0.921875 +vt 0.1875 0.921875 +vt 0.171875 0.96875 +vt 0.1875 0.96875 +vt 0.1875 0.921875 +vt 0.171875 0.921875 +vt 0.171875 0.96875 +vt 0.1484375 0.96875 +vt 0.1484375 1 +vt 0.171875 1 +vt 0.1953125 1 +vt 0.171875 1 +vt 0.171875 0.96875 +vt 0.1953125 0.96875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o head +v -0.0625 2.25 -0.5 +v -0.0625 2.25 -0.625 +v -0.0625 2.0625 -0.5 +v -0.0625 2.0625 -0.625 +v -0.25 2.25 -0.625 +v -0.25 2.25 -0.5 +v -0.25 2.0625 -0.625 +v -0.25 2.0625 -0.5 +vt 0.1484375 0.96875 +vt 0.171875 0.96875 +vt 0.171875 0.921875 +vt 0.1484375 0.921875 +vt 0.1328125 0.96875 +vt 0.1484375 0.96875 +vt 0.1484375 0.921875 +vt 0.1328125 0.921875 +vt 0.1875 0.96875 +vt 0.2109375 0.96875 +vt 0.2109375 0.921875 +vt 0.1875 0.921875 +vt 0.171875 0.96875 +vt 0.1875 0.96875 +vt 0.1875 0.921875 +vt 0.171875 0.921875 +vt 0.171875 0.96875 +vt 0.1484375 0.96875 +vt 0.1484375 1 +vt 0.171875 1 +vt 0.1953125 1 +vt 0.171875 1 +vt 0.171875 0.96875 +vt 0.1953125 0.96875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o chest1 +v 0.34375 1.3125 0.3750000000000001 +v 0.53125 1.3125 0.375 +v 0.34375 0.8125 0.3750000000000001 +v 0.53125 0.8125 0.375 +v 0.53125 1.3125 -0.12499999999999994 +v 0.34375 1.3125 -0.12499999999999989 +v 0.53125 0.8125 -0.12499999999999994 +v 0.34375 0.8125 -0.12499999999999989 +vt 0.375 0.515625 +vt 0.4375 0.515625 +vt 0.4375 0.390625 +vt 0.375 0.390625 +vt 0.3515625 0.515625 +vt 0.375 0.515625 +vt 0.375 0.390625 +vt 0.3515625 0.390625 +vt 0.4609375 0.515625 +vt 0.5234375 0.515625 +vt 0.5234375 0.390625 +vt 0.4609375 0.390625 +vt 0.4375 0.515625 +vt 0.4609375 0.515625 +vt 0.4609375 0.390625 +vt 0.4375 0.390625 +vt 0.4375 0.515625 +vt 0.375 0.515625 +vt 0.375 0.5625 +vt 0.4375 0.5625 +vt 0.5 0.5625 +vt 0.4375 0.5625 +vt 0.4375 0.515625 +vt 0.5 0.515625 +vn 1 0 -2.220446049250313e-16 +vn 2.220446049250313e-16 0 1 +vn -1 0 2.220446049250313e-16 +vn -2.220446049250313e-16 0 -1 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o chest2 +v -0.53125 1.3125 0.3750000000000001 +v -0.34374999999999994 1.3125 0.375 +v -0.53125 0.8125 0.3750000000000001 +v -0.34374999999999994 0.8125 0.375 +v -0.34375000000000006 1.3125 -0.125 +v -0.5312500000000001 1.3125 -0.12499999999999989 +v -0.34375000000000006 0.8125 -0.125 +v -0.5312500000000001 0.8125 -0.12499999999999989 +vt 0.375 0.3125 +vt 0.4375 0.3125 +vt 0.4375 0.1875 +vt 0.375 0.1875 +vt 0.3515625 0.3125 +vt 0.375 0.3125 +vt 0.375 0.1875 +vt 0.3515625 0.1875 +vt 0.4609375 0.3125 +vt 0.5234375 0.3125 +vt 0.5234375 0.1875 +vt 0.4609375 0.1875 +vt 0.4375 0.3125 +vt 0.4609375 0.3125 +vt 0.4609375 0.1875 +vt 0.4375 0.1875 +vt 0.4375 0.3125 +vt 0.375 0.3125 +vt 0.375 0.359375 +vt 0.4375 0.359375 +vt 0.5 0.359375 +vt 0.4375 0.359375 +vt 0.4375 0.3125 +vt 0.5 0.3125 +vn 1 0 -2.220446049250313e-16 +vn 2.220446049250313e-16 0 1 +vn -1 0 2.220446049250313e-16 +vn -2.220446049250313e-16 0 -1 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o body +v 0.375 1.3750000000000002 -0.5 +v 0.375 0.7500000000000002 -0.5 +v 0.375 1.375 0.625 +v 0.375 0.75 0.625 +v -0.375 0.7500000000000002 -0.5 +v -0.375 1.3750000000000002 -0.5 +v -0.375 0.75 0.625 +v -0.375 1.375 0.625 +vt 0.3046875 0.84375 +vt 0.3984375 0.84375 +vt 0.3984375 0.5625 +vt 0.3046875 0.5625 +vt 0.2265625 0.84375 +vt 0.3046875 0.84375 +vt 0.3046875 0.5625 +vt 0.2265625 0.5625 +vt 0.4765625 0.84375 +vt 0.5703125 0.84375 +vt 0.5703125 0.5625 +vt 0.4765625 0.5625 +vt 0.3984375 0.84375 +vt 0.4765625 0.84375 +vt 0.4765625 0.5625 +vt 0.3984375 0.5625 +vt 0.3984375 0.84375 +vt 0.3046875 0.84375 +vt 0.3046875 1 +vt 0.3984375 1 +vt 0.4921875 1 +vt 0.3984375 1 +vt 0.3984375 0.84375 +vt 0.4921875 0.84375 +vn 0 -1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 -1 +vn 0 -2.220446049250313e-16 1 +usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o leg0 +v 0.34375 0.875 0.5 +v 0.34375 0.875 0.25 +v 0.34375 0 0.5 +v 0.34375 0 0.25 +v 0.09375 0.875 0.25 +v 0.09375 0.875 0.5 +v 0.09375 0 0.25 +v 0.09375 0 0.5 +vt 0.2578125 0.484375 +vt 0.2890625 0.484375 +vt 0.2890625 0.265625 +vt 0.2578125 0.265625 +vt 0.2265625 0.484375 +vt 0.2578125 0.484375 +vt 0.2578125 0.265625 +vt 0.2265625 0.265625 +vt 0.3203125 0.484375 +vt 0.3515625 0.484375 +vt 0.3515625 0.265625 +vt 0.3203125 0.265625 +vt 0.2890625 0.484375 +vt 0.3203125 0.484375 +vt 0.3203125 0.265625 +vt 0.2890625 0.265625 +vt 0.2890625 0.484375 +vt 0.2578125 0.484375 +vt 0.2578125 0.546875 +vt 0.2890625 0.546875 +vt 0.3203125 0.546875 +vt 0.2890625 0.546875 +vt 0.2890625 0.484375 +vt 0.3203125 0.484375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o leg1 +v -0.09375 0.875 0.5 +v -0.09375 0.875 0.25 +v -0.09375 0 0.5 +v -0.09375 0 0.25 +v -0.34375 0.875 0.25 +v -0.34375 0.875 0.5 +v -0.34375 0 0.25 +v -0.34375 0 0.5 +vt 0.2578125 0.484375 +vt 0.2890625 0.484375 +vt 0.2890625 0.265625 +vt 0.2578125 0.265625 +vt 0.2265625 0.484375 +vt 0.2578125 0.484375 +vt 0.2578125 0.265625 +vt 0.2265625 0.265625 +vt 0.3203125 0.484375 +vt 0.3515625 0.484375 +vt 0.3515625 0.265625 +vt 0.3203125 0.265625 +vt 0.2890625 0.484375 +vt 0.3203125 0.484375 +vt 0.3203125 0.265625 +vt 0.2890625 0.265625 +vt 0.2890625 0.484375 +vt 0.2578125 0.484375 +vt 0.2578125 0.546875 +vt 0.2890625 0.546875 +vt 0.3203125 0.546875 +vt 0.2890625 0.546875 +vt 0.2890625 0.484375 +vt 0.3203125 0.484375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o leg2 +v 0.34375 0.875 -0.1875 +v 0.34375 0.875 -0.4375 +v 0.34375 0 -0.1875 +v 0.34375 0 -0.4375 +v 0.09375 0.875 -0.4375 +v 0.09375 0.875 -0.1875 +v 0.09375 0 -0.4375 +v 0.09375 0 -0.1875 +vt 0.2578125 0.484375 +vt 0.2890625 0.484375 +vt 0.2890625 0.265625 +vt 0.2578125 0.265625 +vt 0.2265625 0.484375 +vt 0.2578125 0.484375 +vt 0.2578125 0.265625 +vt 0.2265625 0.265625 +vt 0.3203125 0.484375 +vt 0.3515625 0.484375 +vt 0.3515625 0.265625 +vt 0.3203125 0.265625 +vt 0.2890625 0.484375 +vt 0.3203125 0.484375 +vt 0.3203125 0.265625 +vt 0.2890625 0.265625 +vt 0.2890625 0.484375 +vt 0.2578125 0.484375 +vt 0.2578125 0.546875 +vt 0.2890625 0.546875 +vt 0.3203125 0.546875 +vt 0.2890625 0.546875 +vt 0.2890625 0.484375 +vt 0.3203125 0.484375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o leg3 +v -0.09375 0.875 -0.1875 +v -0.09375 0.875 -0.4375 +v -0.09375 0 -0.1875 +v -0.09375 0 -0.4375 +v -0.34375 0.875 -0.4375 +v -0.34375 0.875 -0.1875 +v -0.34375 0 -0.4375 +v -0.34375 0 -0.1875 +vt 0.2578125 0.484375 +vt 0.2890625 0.484375 +vt 0.2890625 0.265625 +vt 0.2578125 0.265625 +vt 0.2265625 0.484375 +vt 0.2578125 0.484375 +vt 0.2578125 0.265625 +vt 0.2265625 0.265625 +vt 0.3203125 0.484375 +vt 0.3515625 0.484375 +vt 0.3515625 0.265625 +vt 0.3203125 0.265625 +vt 0.2890625 0.484375 +vt 0.3203125 0.484375 +vt 0.3203125 0.265625 +vt 0.2890625 0.265625 +vt 0.2890625 0.484375 +vt 0.2578125 0.484375 +vt 0.2578125 0.546875 +vt 0.2890625 0.546875 +vt 0.3203125 0.546875 +vt 0.2890625 0.546875 +vt 0.2890625 0.484375 +vt 0.3203125 0.484375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/minecart.obj b/prismarine-viewer/viewer/lib/entity/models/minecart.obj new file mode 100644 index 00000000..0dd2f4c8 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/minecart.obj @@ -0,0 +1,233 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o bottom +v 0.625 0.12500000000000022 -0.5000000000000002 +v 0.625 2.220446049250313e-16 -0.5000000000000002 +v 0.625 0.125 0.4999999999999998 +v 0.625 0 0.4999999999999998 +v -0.625 2.220446049250313e-16 -0.5000000000000002 +v -0.625 0.12500000000000022 -0.5000000000000002 +v -0.625 0 0.4999999999999998 +v -0.625 0.125 0.4999999999999998 +vt 0.34375 0.625 +vt 0.03125 0.625 +vt 0.03125 0.125 +vt 0.34375 0.125 +vt 0.375 0.625 +vt 0.34375 0.625 +vt 0.34375 0.125 +vt 0.375 0.125 +vt 0.6875 0.625 +vt 0.375 0.625 +vt 0.375 0.125 +vt 0.6875 0.125 +vt 0.03125 0.625 +vt 0 0.625 +vt 0 0.125 +vt 0.03125 0.125 +vt 0.03125 0.625 +vt 0.34375 0.625 +vt 0.34375 0.6875 +vt 0.03125 0.6875 +vt 0.34375 0.6875 +vt 0.65625 0.6875 +vt 0.65625 0.625 +vt 0.34375 0.625 +vn 0 -1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 -1 +vn 0 -2.220446049250313e-16 1 +usemtl m_51fd1571-03b7-0fcd-9442-72fc6c7ce0a3 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o front +v 0.625 0.625 -0.5 +v 0.5 0.625 -0.5 +v 0.625 0.125 -0.5 +v 0.5 0.125 -0.5 +v 0.4999999999999999 0.625 0.5 +v 0.625 0.625 0.5 +v 0.4999999999999999 0.125 0.5 +v 0.625 0.125 0.5 +vt 0.28125 0.9375 +vt 0.03125 0.9375 +vt 0.03125 0.6875 +vt 0.28125 0.6875 +vt 0.3125 0.9375 +vt 0.28125 0.9375 +vt 0.28125 0.6875 +vt 0.3125 0.6875 +vt 0.5625 0.9375 +vt 0.3125 0.9375 +vt 0.3125 0.6875 +vt 0.5625 0.6875 +vt 0.03125 0.9375 +vt 0 0.9375 +vt 0 0.6875 +vt 0.03125 0.6875 +vt 0.03125 0.9375 +vt 0.28125 0.9375 +vt 0.28125 1 +vt 0.03125 1 +vt 0.28125 1 +vt 0.53125 1 +vt 0.53125 0.9375 +vt 0.28125 0.9375 +vn -1 0 -2.220446049250313e-16 +vn 2.220446049250313e-16 0 -1 +vn 1 0 2.220446049250313e-16 +vn -2.220446049250313e-16 0 1 +vn 0 1 0 +vn 0 -1 0 +usemtl m_51fd1571-03b7-0fcd-9442-72fc6c7ce0a3 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o back +v -0.6249999999999999 0.625 0.5 +v -0.4999999999999999 0.625 0.5 +v -0.6249999999999999 0.125 0.5 +v -0.4999999999999999 0.125 0.5 +v -0.5000000000000001 0.625 -0.5 +v -0.6250000000000001 0.625 -0.5 +v -0.5000000000000001 0.125 -0.5 +v -0.6250000000000001 0.125 -0.5 +vt 0.28125 0.9375 +vt 0.03125 0.9375 +vt 0.03125 0.6875 +vt 0.28125 0.6875 +vt 0.3125 0.9375 +vt 0.28125 0.9375 +vt 0.28125 0.6875 +vt 0.3125 0.6875 +vt 0.5625 0.9375 +vt 0.3125 0.9375 +vt 0.3125 0.6875 +vt 0.5625 0.6875 +vt 0.03125 0.9375 +vt 0 0.9375 +vt 0 0.6875 +vt 0.03125 0.6875 +vt 0.03125 0.9375 +vt 0.28125 0.9375 +vt 0.28125 1 +vt 0.03125 1 +vt 0.28125 1 +vt 0.53125 1 +vt 0.53125 0.9375 +vt 0.28125 0.9375 +vn 1 0 -2.220446049250313e-16 +vn 2.220446049250313e-16 0 1 +vn -1 0 2.220446049250313e-16 +vn -2.220446049250313e-16 0 -1 +vn 0 1 0 +vn 0 -1 0 +usemtl m_51fd1571-03b7-0fcd-9442-72fc6c7ce0a3 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o right +v -0.49999999999999994 0.625 -0.5 +v -0.5000000000000001 0.625 -0.37500000000000006 +v -0.49999999999999994 0.125 -0.5 +v -0.5000000000000001 0.125 -0.37500000000000006 +v 0.5 0.625 -0.3749999999999999 +v 0.5 0.625 -0.49999999999999994 +v 0.5 0.125 -0.3749999999999999 +v 0.5 0.125 -0.49999999999999994 +vt 0.28125 0.9375 +vt 0.03125 0.9375 +vt 0.03125 0.6875 +vt 0.28125 0.6875 +vt 0.3125 0.9375 +vt 0.28125 0.9375 +vt 0.28125 0.6875 +vt 0.3125 0.6875 +vt 0.5625 0.9375 +vt 0.3125 0.9375 +vt 0.3125 0.6875 +vt 0.5625 0.6875 +vt 0.03125 0.9375 +vt 0 0.9375 +vt 0 0.6875 +vt 0.03125 0.6875 +vt 0.03125 0.9375 +vt 0.28125 0.9375 +vt 0.28125 1 +vt 0.03125 1 +vt 0.28125 1 +vt 0.53125 1 +vt 0.53125 0.9375 +vt 0.28125 0.9375 +vn -1.2246467991473532e-16 0 1 +vn -1 0 -1.2246467991473532e-16 +vn 1.2246467991473532e-16 0 -1 +vn 1 0 1.2246467991473532e-16 +vn 0 1 0 +vn 0 -1 0 +usemtl m_51fd1571-03b7-0fcd-9442-72fc6c7ce0a3 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o left +v 0.5 0.625 0.5 +v 0.5 0.625 0.375 +v 0.5 0.125 0.5 +v 0.5 0.125 0.375 +v -0.5 0.625 0.375 +v -0.5 0.625 0.5 +v -0.5 0.125 0.375 +v -0.5 0.125 0.5 +vt 0.28125 0.9375 +vt 0.03125 0.9375 +vt 0.03125 0.6875 +vt 0.28125 0.6875 +vt 0.3125 0.9375 +vt 0.28125 0.9375 +vt 0.28125 0.6875 +vt 0.3125 0.6875 +vt 0.5625 0.9375 +vt 0.3125 0.9375 +vt 0.3125 0.6875 +vt 0.5625 0.6875 +vt 0.03125 0.9375 +vt 0 0.9375 +vt 0 0.6875 +vt 0.03125 0.6875 +vt 0.03125 0.9375 +vt 0.28125 0.9375 +vt 0.28125 1 +vt 0.03125 1 +vt 0.28125 1 +vt 0.53125 1 +vt 0.53125 0.9375 +vt 0.28125 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_51fd1571-03b7-0fcd-9442-72fc6c7ce0a3 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/parrot.obj b/prismarine-viewer/viewer/lib/entity/models/parrot.obj new file mode 100644 index 00000000..35d14a5d --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/parrot.obj @@ -0,0 +1,509 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.09375 0.5083704620381906 -0.10253364496531403 +v 0.09375 0.4291295379618094 -0.2724663550346859 +v 0.09375 0.16850504189944682 0.05594820318744831 +v 0.09375 0.08926411782306565 -0.11398450688192363 +v -0.09375 0.4291295379618094 -0.2724663550346859 +v -0.09375 0.5083704620381906 -0.10253364496531403 +v -0.09375 0.08926411782306565 -0.11398450688192363 +v -0.09375 0.16850504189944682 0.05594820318744831 +vt 0.15625 0.65625 +vt 0.25 0.65625 +vt 0.25 0.46875 +vt 0.15625 0.46875 +vt 0.0625 0.65625 +vt 0.15625 0.65625 +vt 0.15625 0.46875 +vt 0.0625 0.46875 +vt 0.34375 0.65625 +vt 0.4375 0.65625 +vt 0.4375 0.46875 +vt 0.34375 0.46875 +vt 0.25 0.65625 +vt 0.34375 0.65625 +vt 0.34375 0.46875 +vt 0.25 0.46875 +vt 0.25 0.65625 +vt 0.15625 0.65625 +vt 0.15625 0.75 +vt 0.25 0.75 +vt 0.34375 0.75 +vt 0.25 0.75 +vt 0.25 0.65625 +vt 0.34375 0.65625 +vn 0 -0.42261826174069944 -0.9063077870366499 +vn 1 0 0 +vn 0 0.42261826174069944 0.9063077870366499 +vn -1 0 0 +vn 0 0.9063077870366499 -0.42261826174069944 +vn 0 -0.9063077870366499 0.42261826174069944 +usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o wing0 +v -0.0625 0.5051478245037531 -0.08881019196643142 +v -0.0625 0.3976022426879319 -0.24240120027061735 +v -0.0625 0.24916281066344315 0.09043244439327047 +v -0.0625 0.14161722884762196 -0.06315856391091551 +v -0.125 0.3976022426879319 -0.24240120027061735 +v -0.125 0.5051478245037531 -0.08881019196643142 +v -0.125 0.14161722884762196 -0.06315856391091551 +v -0.125 0.24916281066344315 0.09043244439327047 +vt 0.6875 0.65625 +vt 0.71875 0.65625 +vt 0.71875 0.5 +vt 0.6875 0.5 +vt 0.59375 0.65625 +vt 0.6875 0.65625 +vt 0.6875 0.5 +vt 0.59375 0.5 +vt 0.8125 0.65625 +vt 0.84375 0.65625 +vt 0.84375 0.5 +vt 0.8125 0.5 +vt 0.71875 0.65625 +vt 0.8125 0.65625 +vt 0.8125 0.5 +vt 0.71875 0.5 +vt 0.71875 0.65625 +vt 0.6875 0.65625 +vt 0.6875 0.75 +vt 0.71875 0.75 +vt 0.75 0.75 +vt 0.71875 0.75 +vt 0.71875 0.65625 +vt 0.75 0.65625 +vn 0 -0.5735764363510462 -0.8191520442889919 +vn 1 0 0 +vn 0 0.5735764363510462 0.8191520442889919 +vn -1 0 0 +vn 0 0.8191520442889919 -0.5735764363510462 +vn 0 -0.8191520442889919 0.5735764363510462 +usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o wing1 +v 0.125 0.5051478245037531 -0.08881019196643142 +v 0.125 0.3976022426879319 -0.24240120027061735 +v 0.125 0.24916281066344315 0.09043244439327047 +v 0.125 0.14161722884762196 -0.06315856391091551 +v 0.0625 0.3976022426879319 -0.24240120027061735 +v 0.0625 0.5051478245037531 -0.08881019196643142 +v 0.0625 0.14161722884762196 -0.06315856391091551 +v 0.0625 0.24916281066344315 0.09043244439327047 +vt 0.6875 0.65625 +vt 0.71875 0.65625 +vt 0.71875 0.5 +vt 0.6875 0.5 +vt 0.59375 0.65625 +vt 0.6875 0.65625 +vt 0.6875 0.5 +vt 0.59375 0.5 +vt 0.8125 0.65625 +vt 0.84375 0.65625 +vt 0.84375 0.5 +vt 0.8125 0.5 +vt 0.71875 0.65625 +vt 0.8125 0.65625 +vt 0.8125 0.5 +vt 0.71875 0.5 +vt 0.71875 0.65625 +vt 0.6875 0.65625 +vt 0.6875 0.75 +vt 0.71875 0.75 +vt 0.75 0.75 +vt 0.71875 0.75 +vt 0.71875 0.65625 +vt 0.75 0.65625 +vn 0 -0.5735764363510462 -0.8191520442889919 +vn 1 0 0 +vn 0 0.5735764363510462 0.8191520442889919 +vn -1 0 0 +vn 0 0.8191520442889919 -0.5735764363510462 +vn 0 -0.8191520442889919 0.5735764363510462 +usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o head +v 0.0625 0.6125 -0.11249999999999999 +v 0.0625 0.6125 -0.2375 +v 0.0625 0.42500000000000004 -0.11249999999999999 +v 0.0625 0.42500000000000004 -0.2375 +v -0.0625 0.6125 -0.2375 +v -0.0625 0.6125 -0.11249999999999999 +v -0.0625 0.42500000000000004 -0.2375 +v -0.0625 0.42500000000000004 -0.11249999999999999 +vt 0.125 0.875 +vt 0.1875 0.875 +vt 0.1875 0.78125 +vt 0.125 0.78125 +vt 0.0625 0.875 +vt 0.125 0.875 +vt 0.125 0.78125 +vt 0.0625 0.78125 +vt 0.25 0.875 +vt 0.3125 0.875 +vt 0.3125 0.78125 +vt 0.25 0.78125 +vt 0.1875 0.875 +vt 0.25 0.875 +vt 0.25 0.78125 +vt 0.1875 0.78125 +vt 0.1875 0.875 +vt 0.125 0.875 +vt 0.125 0.9375 +vt 0.1875 0.9375 +vt 0.25 0.9375 +vt 0.1875 0.9375 +vt 0.1875 0.875 +vt 0.25 0.875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o head2 +v 0.0625 0.675 -0.11249999999999999 +v 0.0625 0.675 -0.3625 +v 0.0625 0.6125 -0.11249999999999999 +v 0.0625 0.6125 -0.3625 +v -0.0625 0.675 -0.3625 +v -0.0625 0.675 -0.11249999999999999 +v -0.0625 0.6125 -0.3625 +v -0.0625 0.6125 -0.11249999999999999 +vt 0.4375 0.875 +vt 0.5 0.875 +vt 0.5 0.84375 +vt 0.4375 0.84375 +vt 0.3125 0.875 +vt 0.4375 0.875 +vt 0.4375 0.84375 +vt 0.3125 0.84375 +vt 0.625 0.875 +vt 0.6875 0.875 +vt 0.6875 0.84375 +vt 0.625 0.84375 +vt 0.5 0.875 +vt 0.625 0.875 +vt 0.625 0.84375 +vt 0.5 0.84375 +vt 0.5 0.875 +vt 0.4375 0.875 +vt 0.4375 1 +vt 0.5 1 +vt 0.5625 1 +vt 0.5 1 +vt 0.5 0.875 +vt 0.5625 0.875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o beak1 +v 0.03125 0.6125 -0.23125 +v 0.03125 0.6125 -0.29375 +v 0.03125 0.48750000000000004 -0.23125 +v 0.03125 0.48750000000000004 -0.29375 +v -0.03125 0.6125 -0.29375 +v -0.03125 0.6125 -0.23125 +v -0.03125 0.48750000000000004 -0.29375 +v -0.03125 0.48750000000000004 -0.23125 +vt 0.375 0.75 +vt 0.40625 0.75 +vt 0.40625 0.6875 +vt 0.375 0.6875 +vt 0.34375 0.75 +vt 0.375 0.75 +vt 0.375 0.6875 +vt 0.34375 0.6875 +vt 0.4375 0.75 +vt 0.46875 0.75 +vt 0.46875 0.6875 +vt 0.4375 0.6875 +vt 0.40625 0.75 +vt 0.4375 0.75 +vt 0.4375 0.6875 +vt 0.40625 0.6875 +vt 0.40625 0.75 +vt 0.375 0.75 +vt 0.375 0.78125 +vt 0.40625 0.78125 +vt 0.4375 0.78125 +vt 0.40625 0.78125 +vt 0.40625 0.75 +vt 0.4375 0.75 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o beak2 +v 0.03125 0.6124999999999998 -0.29375 +v 0.03125 0.6124999999999998 -0.35625 +v 0.03125 0.5062500000000001 -0.29375 +v 0.03125 0.5062500000000001 -0.35625 +v -0.03125 0.6124999999999998 -0.35625 +v -0.03125 0.6124999999999998 -0.29375 +v -0.03125 0.5062500000000001 -0.35625 +v -0.03125 0.5062500000000001 -0.29375 +vt 0.53125 0.75 +vt 0.5625 0.75 +vt 0.5625 0.71875 +vt 0.53125 0.71875 +vt 0.5 0.75 +vt 0.53125 0.75 +vt 0.53125 0.71875 +vt 0.5 0.71875 +vt 0.59375 0.75 +vt 0.625 0.75 +vt 0.625 0.71875 +vt 0.59375 0.71875 +vt 0.5625 0.75 +vt 0.59375 0.75 +vt 0.59375 0.71875 +vt 0.5625 0.71875 +vt 0.5625 0.75 +vt 0.53125 0.75 +vt 0.53125 0.78125 +vt 0.5625 0.78125 +vt 0.59375 0.78125 +vt 0.5625 0.78125 +vt 0.5625 0.75 +vt 0.59375 0.75 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o feather +v 0 0.8812500000000001 -0.05625000000000002 +v 0 0.8812500000000001 -0.30625 +v 0 0.5687500000000001 -0.05625000000000002 +v 0 0.5687500000000001 -0.30625 +v 0 0.8812500000000001 -0.30625 +v 0 0.8812500000000001 -0.05625000000000002 +v 0 0.5687500000000001 -0.30625 +v 0 0.5687500000000001 -0.05625000000000002 +vt 0.1875 0.3125 +vt 0.1875 0.3125 +vt 0.1875 0.15625 +vt 0.1875 0.15625 +vt 0.0625 0.3125 +vt 0.1875 0.3125 +vt 0.1875 0.15625 +vt 0.0625 0.15625 +vt 0.3125 0.3125 +vt 0.3125 0.3125 +vt 0.3125 0.15625 +vt 0.3125 0.15625 +vt 0.1875 0.3125 +vt 0.3125 0.3125 +vt 0.3125 0.15625 +vt 0.1875 0.15625 +vt 0.1875 0.3125 +vt 0.1875 0.3125 +vt 0.1875 0.4375 +vt 0.1875 0.4375 +vt 0.1875 0.4375 +vt 0.1875 0.4375 +vt 0.1875 0.3125 +vt 0.1875 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o tail +v 0.09375 0.22142422560540864 0.027122222305063892 +v 0.09375 0.17354644791047258 -0.013052003300344839 +v 0.09375 0.06072732318377394 0.21863333308480837 +v 0.09375 0.012849545488837766 0.17845910747939964 +v -0.09375 0.17354644791047258 -0.013052003300344839 +v -0.09375 0.22142422560540864 0.027122222305063892 +v -0.09375 0.012849545488837766 0.17845910747939964 +v -0.09375 0.06072732318377394 0.21863333308480837 +vt 0.71875 0.9375 +vt 0.8125 0.9375 +vt 0.8125 0.8125 +vt 0.71875 0.8125 +vt 0.6875 0.9375 +vt 0.71875 0.9375 +vt 0.71875 0.8125 +vt 0.6875 0.8125 +vt 0.84375 0.9375 +vt 0.9375 0.9375 +vt 0.9375 0.8125 +vt 0.84375 0.8125 +vt 0.8125 0.9375 +vt 0.84375 0.9375 +vt 0.84375 0.8125 +vt 0.8125 0.8125 +vt 0.8125 0.9375 +vt 0.71875 0.9375 +vt 0.71875 0.96875 +vt 0.8125 0.96875 +vt 0.90625 0.96875 +vt 0.8125 0.96875 +vt 0.8125 0.9375 +vt 0.90625 0.9375 +vn 0 -0.766044443118978 -0.6427876096865393 +vn 1 0 0 +vn 0 0.766044443118978 0.6427876096865393 +vn -1 0 0 +vn 0 0.6427876096865393 -0.766044443118978 +vn 0 -0.6427876096865393 0.766044443118978 +usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o leg0 +v -0.03125 0.09375 -0.03125 +v -0.03125 0.09375 -0.09375 +v -0.03125 -0.03125 -0.03125 +v -0.03125 -0.03125 -0.09375 +v -0.09375 0.09375 -0.09375 +v -0.09375 0.09375 -0.03125 +v -0.09375 -0.03125 -0.09375 +v -0.09375 -0.03125 -0.03125 +vt 0.46875 0.40625 +vt 0.5 0.40625 +vt 0.5 0.34375 +vt 0.46875 0.34375 +vt 0.4375 0.40625 +vt 0.46875 0.40625 +vt 0.46875 0.34375 +vt 0.4375 0.34375 +vt 0.53125 0.40625 +vt 0.5625 0.40625 +vt 0.5625 0.34375 +vt 0.53125 0.34375 +vt 0.5 0.40625 +vt 0.53125 0.40625 +vt 0.53125 0.34375 +vt 0.5 0.34375 +vt 0.5 0.40625 +vt 0.46875 0.40625 +vt 0.46875 0.4375 +vt 0.5 0.4375 +vt 0.53125 0.4375 +vt 0.5 0.4375 +vt 0.5 0.40625 +vt 0.53125 0.40625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o leg1 +v 0.09375 0.09375 -0.03125 +v 0.09375 0.09375 -0.09375 +v 0.09375 -0.03125 -0.03125 +v 0.09375 -0.03125 -0.09375 +v 0.03125 0.09375 -0.09375 +v 0.03125 0.09375 -0.03125 +v 0.03125 -0.03125 -0.09375 +v 0.03125 -0.03125 -0.03125 +vt 0.46875 0.40625 +vt 0.5 0.40625 +vt 0.5 0.34375 +vt 0.46875 0.34375 +vt 0.4375 0.40625 +vt 0.46875 0.40625 +vt 0.46875 0.34375 +vt 0.4375 0.34375 +vt 0.53125 0.40625 +vt 0.5625 0.40625 +vt 0.5625 0.34375 +vt 0.53125 0.34375 +vt 0.5 0.40625 +vt 0.53125 0.40625 +vt 0.53125 0.34375 +vt 0.5 0.34375 +vt 0.5 0.40625 +vt 0.46875 0.40625 +vt 0.46875 0.4375 +vt 0.5 0.4375 +vt 0.53125 0.4375 +vt 0.5 0.4375 +vt 0.5 0.40625 +vt 0.53125 0.40625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/piglin.obj b/prismarine-viewer/viewer/lib/entity/models/piglin.obj new file mode 100644 index 00000000..2f68f4c1 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/piglin.obj @@ -0,0 +1,739 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o Body +v 0.25 1.5 0.125 +v 0.25 1.5 -0.125 +v 0.25 0.75 0.125 +v 0.25 0.75 -0.125 +v -0.25 1.5 -0.125 +v -0.25 1.5 0.125 +v -0.25 0.75 -0.125 +v -0.25 0.75 0.125 +vt 0.3125 0.6875 +vt 0.4375 0.6875 +vt 0.4375 0.5 +vt 0.3125 0.5 +vt 0.25 0.6875 +vt 0.3125 0.6875 +vt 0.3125 0.5 +vt 0.25 0.5 +vt 0.5 0.6875 +vt 0.625 0.6875 +vt 0.625 0.5 +vt 0.5 0.5 +vt 0.4375 0.6875 +vt 0.5 0.6875 +vt 0.5 0.5 +vt 0.4375 0.5 +vt 0.4375 0.6875 +vt 0.3125 0.6875 +vt 0.3125 0.75 +vt 0.4375 0.75 +vt 0.5625 0.75 +vt 0.4375 0.75 +vt 0.4375 0.6875 +vt 0.5625 0.6875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o Body +v 0.265625 1.515625 0.140625 +v 0.265625 1.515625 -0.140625 +v 0.265625 0.734375 0.140625 +v 0.265625 0.734375 -0.140625 +v -0.265625 1.515625 -0.140625 +v -0.265625 1.515625 0.140625 +v -0.265625 0.734375 -0.140625 +v -0.265625 0.734375 0.140625 +vt 0.3125 0.4375 +vt 0.4375 0.4375 +vt 0.4375 0.25 +vt 0.3125 0.25 +vt 0.25 0.4375 +vt 0.3125 0.4375 +vt 0.3125 0.25 +vt 0.25 0.25 +vt 0.5 0.4375 +vt 0.625 0.4375 +vt 0.625 0.25 +vt 0.5 0.25 +vt 0.4375 0.4375 +vt 0.5 0.4375 +vt 0.5 0.25 +vt 0.4375 0.25 +vt 0.4375 0.4375 +vt 0.3125 0.4375 +vt 0.3125 0.5 +vt 0.4375 0.5 +vt 0.5625 0.5 +vt 0.4375 0.5 +vt 0.4375 0.4375 +vt 0.5625 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o head +v 0.31125 1.9987500000000002 0.24875000000000003 +v 0.31125 1.9987500000000002 -0.24875000000000003 +v 0.31125 1.5012499999999998 0.24875000000000003 +v 0.31125 1.5012499999999998 -0.24875000000000003 +v -0.31125 1.9987500000000002 -0.24875000000000003 +v -0.31125 1.9987500000000002 0.24875000000000003 +v -0.31125 1.5012499999999998 -0.24875000000000003 +v -0.31125 1.5012499999999998 0.24875000000000003 +vt 0.125 0.875 +vt 0.28125 0.875 +vt 0.28125 0.75 +vt 0.125 0.75 +vt 0 0.875 +vt 0.125 0.875 +vt 0.125 0.75 +vt 0 0.75 +vt 0.40625 0.875 +vt 0.5625 0.875 +vt 0.5625 0.75 +vt 0.40625 0.75 +vt 0.28125 0.875 +vt 0.40625 0.875 +vt 0.40625 0.75 +vt 0.28125 0.75 +vt 0.28125 0.875 +vt 0.125 0.875 +vt 0.125 1 +vt 0.28125 1 +vt 0.4375 1 +vt 0.28125 1 +vt 0.28125 0.875 +vt 0.4375 0.875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o head +v 0.125 1.75 -0.25 +v 0.125 1.75 -0.3125 +v 0.125 1.5 -0.25 +v 0.125 1.5 -0.3125 +v -0.125 1.75 -0.3125 +v -0.125 1.75 -0.25 +v -0.125 1.5 -0.3125 +v -0.125 1.5 -0.25 +vt 0.5 0.96875 +vt 0.5625 0.96875 +vt 0.5625 0.90625 +vt 0.5 0.90625 +vt 0.484375 0.96875 +vt 0.5 0.96875 +vt 0.5 0.90625 +vt 0.484375 0.90625 +vt 0.578125 0.96875 +vt 0.640625 0.96875 +vt 0.640625 0.90625 +vt 0.578125 0.90625 +vt 0.5625 0.96875 +vt 0.578125 0.96875 +vt 0.578125 0.90625 +vt 0.5625 0.90625 +vt 0.5625 0.96875 +vt 0.5 0.96875 +vt 0.5 0.984375 +vt 0.5625 0.984375 +vt 0.625 0.984375 +vt 0.5625 0.984375 +vt 0.5625 0.96875 +vt 0.625 0.96875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o head +v -0.125 1.625 -0.25 +v -0.125 1.625 -0.3125 +v -0.125 1.5 -0.25 +v -0.125 1.5 -0.3125 +v -0.1875 1.625 -0.3125 +v -0.1875 1.625 -0.25 +v -0.1875 1.5 -0.3125 +v -0.1875 1.5 -0.25 +vt 0.046875 0.921875 +vt 0.0625 0.921875 +vt 0.0625 0.890625 +vt 0.046875 0.890625 +vt 0.03125 0.921875 +vt 0.046875 0.921875 +vt 0.046875 0.890625 +vt 0.03125 0.890625 +vt 0.078125 0.921875 +vt 0.09375 0.921875 +vt 0.09375 0.890625 +vt 0.078125 0.890625 +vt 0.0625 0.921875 +vt 0.078125 0.921875 +vt 0.078125 0.890625 +vt 0.0625 0.890625 +vt 0.0625 0.921875 +vt 0.046875 0.921875 +vt 0.046875 0.9375 +vt 0.0625 0.9375 +vt 0.078125 0.9375 +vt 0.0625 0.9375 +vt 0.0625 0.921875 +vt 0.078125 0.921875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o head +v 0.1875 1.625 -0.25 +v 0.1875 1.625 -0.3125 +v 0.1875 1.5 -0.25 +v 0.1875 1.5 -0.3125 +v 0.125 1.625 -0.3125 +v 0.125 1.625 -0.25 +v 0.125 1.5 -0.3125 +v 0.125 1.5 -0.25 +vt 0.046875 0.984375 +vt 0.0625 0.984375 +vt 0.0625 0.953125 +vt 0.046875 0.953125 +vt 0.03125 0.984375 +vt 0.046875 0.984375 +vt 0.046875 0.953125 +vt 0.03125 0.953125 +vt 0.078125 0.984375 +vt 0.09375 0.984375 +vt 0.09375 0.953125 +vt 0.078125 0.953125 +vt 0.0625 0.984375 +vt 0.078125 0.984375 +vt 0.078125 0.953125 +vt 0.0625 0.953125 +vt 0.0625 0.984375 +vt 0.046875 0.984375 +vt 0.046875 1 +vt 0.0625 1 +vt 0.078125 1 +vt 0.0625 1 +vt 0.0625 0.984375 +vt 0.078125 0.984375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o leftear +v -0.25837341226347266 1.84375 0.125 +v -0.25837341226347266 1.84375 -0.125 +v -0.41462341226347266 1.573117061317363 0.125 +v -0.41462341226347266 1.573117061317363 -0.125 +v -0.3125 1.875 -0.125 +v -0.3125 1.875 0.125 +v -0.46875 1.604367061317363 -0.125 +v -0.46875 1.604367061317363 0.125 +vt 0.859375 0.84375 +vt 0.875 0.84375 +vt 0.875 0.765625 +vt 0.859375 0.765625 +vt 0.796875 0.84375 +vt 0.859375 0.84375 +vt 0.859375 0.765625 +vt 0.796875 0.765625 +vt 0.9375 0.84375 +vt 0.953125 0.84375 +vt 0.953125 0.765625 +vt 0.9375 0.765625 +vt 0.875 0.84375 +vt 0.9375 0.84375 +vt 0.9375 0.765625 +vt 0.875 0.765625 +vt 0.875 0.84375 +vt 0.859375 0.84375 +vt 0.859375 0.90625 +vt 0.875 0.90625 +vt 0.890625 0.90625 +vt 0.875 0.90625 +vt 0.875 0.84375 +vt 0.890625 0.84375 +vn 0 0 -1 +vn 0.8660254037844387 -0.49999999999999994 0 +vn 0 0 1 +vn -0.8660254037844387 0.49999999999999994 0 +vn 0.49999999999999994 0.8660254037844387 0 +vn -0.49999999999999994 -0.8660254037844387 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o rightear +v 0.3125 1.875 0.125 +v 0.3125 1.875 -0.125 +v 0.46875 1.604367061317363 0.125 +v 0.46875 1.604367061317363 -0.125 +v 0.25837341226347266 1.84375 -0.125 +v 0.25837341226347266 1.84375 0.125 +v 0.41462341226347266 1.573117061317363 -0.125 +v 0.41462341226347266 1.573117061317363 0.125 +vt 0.671875 0.84375 +vt 0.6875 0.84375 +vt 0.6875 0.765625 +vt 0.671875 0.765625 +vt 0.609375 0.84375 +vt 0.671875 0.84375 +vt 0.671875 0.765625 +vt 0.609375 0.765625 +vt 0.75 0.84375 +vt 0.765625 0.84375 +vt 0.765625 0.765625 +vt 0.75 0.765625 +vt 0.6875 0.84375 +vt 0.75 0.84375 +vt 0.75 0.765625 +vt 0.6875 0.765625 +vt 0.6875 0.84375 +vt 0.671875 0.84375 +vt 0.671875 0.90625 +vt 0.6875 0.90625 +vt 0.703125 0.90625 +vt 0.6875 0.90625 +vt 0.6875 0.84375 +vt 0.703125 0.84375 +vn 0 0 -1 +vn 0.8660254037844387 0.49999999999999994 0 +vn 0 0 1 +vn -0.8660254037844387 -0.49999999999999994 0 +vn -0.49999999999999994 0.8660254037844387 0 +vn 0.49999999999999994 -0.8660254037844387 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o RightArm +v 0.5 1.5 0.125 +v 0.5 1.5 -0.125 +v 0.5 0.75 0.125 +v 0.5 0.75 -0.125 +v 0.25 1.5 -0.125 +v 0.25 1.5 0.125 +v 0.25 0.75 -0.125 +v 0.25 0.75 0.125 +vt 0.6875 0.6875 +vt 0.75 0.6875 +vt 0.75 0.5 +vt 0.6875 0.5 +vt 0.625 0.6875 +vt 0.6875 0.6875 +vt 0.6875 0.5 +vt 0.625 0.5 +vt 0.8125 0.6875 +vt 0.875 0.6875 +vt 0.875 0.5 +vt 0.8125 0.5 +vt 0.75 0.6875 +vt 0.8125 0.6875 +vt 0.8125 0.5 +vt 0.75 0.5 +vt 0.75 0.6875 +vt 0.6875 0.6875 +vt 0.6875 0.75 +vt 0.75 0.75 +vt 0.8125 0.75 +vt 0.75 0.75 +vt 0.75 0.6875 +vt 0.8125 0.6875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o RightArm +v 0.515625 1.515625 0.140625 +v 0.515625 1.515625 -0.140625 +v 0.515625 0.734375 0.140625 +v 0.515625 0.734375 -0.140625 +v 0.234375 1.515625 -0.140625 +v 0.234375 1.515625 0.140625 +v 0.234375 0.734375 -0.140625 +v 0.234375 0.734375 0.140625 +vt 0.6875 0.4375 +vt 0.75 0.4375 +vt 0.75 0.25 +vt 0.6875 0.25 +vt 0.625 0.4375 +vt 0.6875 0.4375 +vt 0.6875 0.25 +vt 0.625 0.25 +vt 0.8125 0.4375 +vt 0.875 0.4375 +vt 0.875 0.25 +vt 0.8125 0.25 +vt 0.75 0.4375 +vt 0.8125 0.4375 +vt 0.8125 0.25 +vt 0.75 0.25 +vt 0.75 0.4375 +vt 0.6875 0.4375 +vt 0.6875 0.5 +vt 0.75 0.5 +vt 0.8125 0.5 +vt 0.75 0.5 +vt 0.75 0.4375 +vt 0.8125 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o LeftArm +v -0.25 1.5 0.125 +v -0.25 1.5 -0.125 +v -0.25 0.75 0.125 +v -0.25 0.75 -0.125 +v -0.5 1.5 -0.125 +v -0.5 1.5 0.125 +v -0.5 0.75 -0.125 +v -0.5 0.75 0.125 +vt 0.5625 0.1875 +vt 0.625 0.1875 +vt 0.625 0 +vt 0.5625 0 +vt 0.5 0.1875 +vt 0.5625 0.1875 +vt 0.5625 0 +vt 0.5 0 +vt 0.6875 0.1875 +vt 0.75 0.1875 +vt 0.75 0 +vt 0.6875 0 +vt 0.625 0.1875 +vt 0.6875 0.1875 +vt 0.6875 0 +vt 0.625 0 +vt 0.625 0.1875 +vt 0.5625 0.1875 +vt 0.5625 0.25 +vt 0.625 0.25 +vt 0.6875 0.25 +vt 0.625 0.25 +vt 0.625 0.1875 +vt 0.6875 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 +o LeftArm +v -0.234375 1.515625 0.140625 +v -0.234375 1.515625 -0.140625 +v -0.234375 0.734375 0.140625 +v -0.234375 0.734375 -0.140625 +v -0.515625 1.515625 -0.140625 +v -0.515625 1.515625 0.140625 +v -0.515625 0.734375 -0.140625 +v -0.515625 0.734375 0.140625 +vt 0.8125 0.1875 +vt 0.875 0.1875 +vt 0.875 0 +vt 0.8125 0 +vt 0.75 0.1875 +vt 0.8125 0.1875 +vt 0.8125 0 +vt 0.75 0 +vt 0.9375 0.1875 +vt 1 0.1875 +vt 1 0 +vt 0.9375 0 +vt 0.875 0.1875 +vt 0.9375 0.1875 +vt 0.9375 0 +vt 0.875 0 +vt 0.875 0.1875 +vt 0.8125 0.1875 +vt 0.8125 0.25 +vt 0.875 0.25 +vt 0.9375 0.25 +vt 0.875 0.25 +vt 0.875 0.1875 +vt 0.9375 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 92/268/67 95/267/67 93/266/67 90/265/67 +f 91/272/68 92/271/68 90/270/68 89/269/68 +f 96/276/69 91/275/69 89/274/69 94/273/69 +f 95/280/70 96/279/70 94/278/70 93/277/70 +f 94/284/71 89/283/71 90/282/71 93/281/71 +f 95/288/72 92/287/72 91/286/72 96/285/72 +o RightLeg +v 0.25 0.75 0.125 +v 0.25 0.75 -0.125 +v 0.25 0 0.125 +v 0.25 0 -0.125 +v 0 0.75 -0.125 +v 0 0.75 0.125 +v 0 0 -0.125 +v 0 0 0.125 +vt 0.0625 0.6875 +vt 0.125 0.6875 +vt 0.125 0.5 +vt 0.0625 0.5 +vt 0 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.5 +vt 0 0.5 +vt 0.1875 0.6875 +vt 0.25 0.6875 +vt 0.25 0.5 +vt 0.1875 0.5 +vt 0.125 0.6875 +vt 0.1875 0.6875 +vt 0.1875 0.5 +vt 0.125 0.5 +vt 0.125 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.75 +vt 0.125 0.75 +vt 0.1875 0.75 +vt 0.125 0.75 +vt 0.125 0.6875 +vt 0.1875 0.6875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 100/292/73 103/291/73 101/290/73 98/289/73 +f 99/296/74 100/295/74 98/294/74 97/293/74 +f 104/300/75 99/299/75 97/298/75 102/297/75 +f 103/304/76 104/303/76 102/302/76 101/301/76 +f 102/308/77 97/307/77 98/306/77 101/305/77 +f 103/312/78 100/311/78 99/310/78 104/309/78 +o RightLeg +v 0.265625 0.765625 0.140625 +v 0.265625 0.765625 -0.140625 +v 0.265625 -0.015625 0.140625 +v 0.265625 -0.015625 -0.140625 +v -0.015625 0.765625 -0.140625 +v -0.015625 0.765625 0.140625 +v -0.015625 -0.015625 -0.140625 +v -0.015625 -0.015625 0.140625 +vt 0.0625 0.4375 +vt 0.125 0.4375 +vt 0.125 0.25 +vt 0.0625 0.25 +vt 0 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.25 +vt 0 0.25 +vt 0.1875 0.4375 +vt 0.25 0.4375 +vt 0.25 0.25 +vt 0.1875 0.25 +vt 0.125 0.4375 +vt 0.1875 0.4375 +vt 0.1875 0.25 +vt 0.125 0.25 +vt 0.125 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.5 +vt 0.125 0.5 +vt 0.1875 0.5 +vt 0.125 0.5 +vt 0.125 0.4375 +vt 0.1875 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 108/316/79 111/315/79 109/314/79 106/313/79 +f 107/320/80 108/319/80 106/318/80 105/317/80 +f 112/324/81 107/323/81 105/322/81 110/321/81 +f 111/328/82 112/327/82 110/326/82 109/325/82 +f 110/332/83 105/331/83 106/330/83 109/329/83 +f 111/336/84 108/335/84 107/334/84 112/333/84 +o LeftLeg +v 0 0.75 0.125 +v 0 0.75 -0.125 +v 0 0 0.125 +v 0 0 -0.125 +v -0.25 0.75 -0.125 +v -0.25 0.75 0.125 +v -0.25 0 -0.125 +v -0.25 0 0.125 +vt 0.3125 0.1875 +vt 0.375 0.1875 +vt 0.375 0 +vt 0.3125 0 +vt 0.25 0.1875 +vt 0.3125 0.1875 +vt 0.3125 0 +vt 0.25 0 +vt 0.4375 0.1875 +vt 0.5 0.1875 +vt 0.5 0 +vt 0.4375 0 +vt 0.375 0.1875 +vt 0.4375 0.1875 +vt 0.4375 0 +vt 0.375 0 +vt 0.375 0.1875 +vt 0.3125 0.1875 +vt 0.3125 0.25 +vt 0.375 0.25 +vt 0.4375 0.25 +vt 0.375 0.25 +vt 0.375 0.1875 +vt 0.4375 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 116/340/85 119/339/85 117/338/85 114/337/85 +f 115/344/86 116/343/86 114/342/86 113/341/86 +f 120/348/87 115/347/87 113/346/87 118/345/87 +f 119/352/88 120/351/88 118/350/88 117/349/88 +f 118/356/89 113/355/89 114/354/89 117/353/89 +f 119/360/90 116/359/90 115/358/90 120/357/90 +o LeftLeg +v 0.015625 0.765625 0.140625 +v 0.015625 0.765625 -0.140625 +v 0.015625 -0.015625 0.140625 +v 0.015625 -0.015625 -0.140625 +v -0.265625 0.765625 -0.140625 +v -0.265625 0.765625 0.140625 +v -0.265625 -0.015625 -0.140625 +v -0.265625 -0.015625 0.140625 +vt 0.0625 0.1875 +vt 0.125 0.1875 +vt 0.125 0 +vt 0.0625 0 +vt 0 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0 +vt 0 0 +vt 0.1875 0.1875 +vt 0.25 0.1875 +vt 0.25 0 +vt 0.1875 0 +vt 0.125 0.1875 +vt 0.1875 0.1875 +vt 0.1875 0 +vt 0.125 0 +vt 0.125 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.25 +vt 0.125 0.25 +vt 0.1875 0.25 +vt 0.125 0.25 +vt 0.125 0.1875 +vt 0.1875 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 +f 124/364/91 127/363/91 125/362/91 122/361/91 +f 123/368/92 124/367/92 122/366/92 121/365/92 +f 128/372/93 123/371/93 121/370/93 126/369/93 +f 127/376/94 128/375/94 126/374/94 125/373/94 +f 126/380/95 121/379/95 122/378/95 125/377/95 +f 127/384/96 124/383/96 123/382/96 128/381/96 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/pillager.obj b/prismarine-viewer/viewer/lib/entity/models/pillager.obj new file mode 100644 index 00000000..213a3b94 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/pillager.obj @@ -0,0 +1,371 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o Body +v 0.25 1.5 0.1875 +v 0.25 1.5 -0.1875 +v 0.25 0.75 0.1875 +v 0.25 0.75 -0.1875 +v -0.25 1.5 -0.1875 +v -0.25 1.5 0.1875 +v -0.25 0.75 -0.1875 +v -0.25 0.75 0.1875 +vt 0.34375 0.59375 +vt 0.46875 0.59375 +vt 0.46875 0.40625 +vt 0.34375 0.40625 +vt 0.25 0.59375 +vt 0.34375 0.59375 +vt 0.34375 0.40625 +vt 0.25 0.40625 +vt 0.5625 0.59375 +vt 0.6875 0.59375 +vt 0.6875 0.40625 +vt 0.5625 0.40625 +vt 0.46875 0.59375 +vt 0.5625 0.59375 +vt 0.5625 0.40625 +vt 0.46875 0.40625 +vt 0.46875 0.59375 +vt 0.34375 0.59375 +vt 0.34375 0.6875 +vt 0.46875 0.6875 +vt 0.59375 0.6875 +vt 0.46875 0.6875 +vt 0.46875 0.59375 +vt 0.59375 0.59375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o Body +v 0.28125 1.53125 0.21875 +v 0.28125 1.53125 -0.21875 +v 0.28125 0.34375 0.21875 +v 0.28125 0.34375 -0.21875 +v -0.28125 1.53125 -0.21875 +v -0.28125 1.53125 0.21875 +v -0.28125 0.34375 -0.21875 +v -0.28125 0.34375 0.21875 +vt 0.09375 0.3125 +vt 0.21875 0.3125 +vt 0.21875 0.03125 +vt 0.09375 0.03125 +vt 0 0.3125 +vt 0.09375 0.3125 +vt 0.09375 0.03125 +vt 0 0.03125 +vt 0.3125 0.3125 +vt 0.4375 0.3125 +vt 0.4375 0.03125 +vt 0.3125 0.03125 +vt 0.21875 0.3125 +vt 0.3125 0.3125 +vt 0.3125 0.03125 +vt 0.21875 0.03125 +vt 0.21875 0.3125 +vt 0.09375 0.3125 +vt 0.09375 0.40625 +vt 0.21875 0.40625 +vt 0.34375 0.40625 +vt 0.21875 0.40625 +vt 0.21875 0.3125 +vt 0.34375 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o head +v 0.25 2.125 0.25 +v 0.25 2.125 -0.25 +v 0.25 1.5 0.25 +v 0.25 1.5 -0.25 +v -0.25 2.125 -0.25 +v -0.25 2.125 0.25 +v -0.25 1.5 -0.25 +v -0.25 1.5 0.25 +vt 0.125 0.875 +vt 0.25 0.875 +vt 0.25 0.71875 +vt 0.125 0.71875 +vt 0 0.875 +vt 0.125 0.875 +vt 0.125 0.71875 +vt 0 0.71875 +vt 0.375 0.875 +vt 0.5 0.875 +vt 0.5 0.71875 +vt 0.375 0.71875 +vt 0.25 0.875 +vt 0.375 0.875 +vt 0.375 0.71875 +vt 0.25 0.71875 +vt 0.25 0.875 +vt 0.125 0.875 +vt 0.125 1 +vt 0.25 1 +vt 0.375 1 +vt 0.25 1 +vt 0.25 0.875 +vt 0.375 0.875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o nose +v 0.0625 1.6875 -0.25 +v 0.0625 1.6875 -0.375 +v 0.0625 1.4375 -0.25 +v 0.0625 1.4375 -0.375 +v -0.0625 1.6875 -0.375 +v -0.0625 1.6875 -0.25 +v -0.0625 1.4375 -0.375 +v -0.0625 1.4375 -0.25 +vt 0.40625 0.96875 +vt 0.4375 0.96875 +vt 0.4375 0.90625 +vt 0.40625 0.90625 +vt 0.375 0.96875 +vt 0.40625 0.96875 +vt 0.40625 0.90625 +vt 0.375 0.90625 +vt 0.46875 0.96875 +vt 0.5 0.96875 +vt 0.5 0.90625 +vt 0.46875 0.90625 +vt 0.4375 0.96875 +vt 0.46875 0.96875 +vt 0.46875 0.90625 +vt 0.4375 0.90625 +vt 0.4375 0.96875 +vt 0.40625 0.96875 +vt 0.40625 1 +vt 0.4375 1 +vt 0.46875 1 +vt 0.4375 1 +vt 0.4375 0.96875 +vt 0.46875 0.96875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o LeftLeg +v 0 0.75 0.125 +v 0 0.75 -0.125 +v 0 0 0.125 +v 0 0 -0.125 +v -0.25 0.75 -0.125 +v -0.25 0.75 0.125 +v -0.25 0 -0.125 +v -0.25 0 0.125 +vt 0.0625 0.59375 +vt 0.125 0.59375 +vt 0.125 0.40625 +vt 0.0625 0.40625 +vt 0 0.59375 +vt 0.0625 0.59375 +vt 0.0625 0.40625 +vt 0 0.40625 +vt 0.1875 0.59375 +vt 0.25 0.59375 +vt 0.25 0.40625 +vt 0.1875 0.40625 +vt 0.125 0.59375 +vt 0.1875 0.59375 +vt 0.1875 0.40625 +vt 0.125 0.40625 +vt 0.125 0.59375 +vt 0.0625 0.59375 +vt 0.0625 0.65625 +vt 0.125 0.65625 +vt 0.1875 0.65625 +vt 0.125 0.65625 +vt 0.125 0.59375 +vt 0.1875 0.59375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o RightLeg +v 0.25 0.75 0.125 +v 0.25 0.75 -0.125 +v 0.25 0 0.125 +v 0.25 0 -0.125 +v 0 0.75 -0.125 +v 0 0.75 0.125 +v 0 0 -0.125 +v 0 0 0.125 +vt 0.125 0.59375 +vt 0.0625 0.59375 +vt 0.0625 0.40625 +vt 0.125 0.40625 +vt 0.1875 0.59375 +vt 0.125 0.59375 +vt 0.125 0.40625 +vt 0.1875 0.40625 +vt 0.25 0.59375 +vt 0.1875 0.59375 +vt 0.1875 0.40625 +vt 0.25 0.40625 +vt 0.0625 0.59375 +vt 0 0.59375 +vt 0 0.40625 +vt 0.0625 0.40625 +vt 0.0625 0.59375 +vt 0.125 0.59375 +vt 0.125 0.65625 +vt 0.0625 0.65625 +vt 0.125 0.65625 +vt 0.1875 0.65625 +vt 0.1875 0.59375 +vt 0.125 0.59375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o RightArm +v 0.5 1.5 0.125 +v 0.5 1.5 -0.125 +v 0.5 0.75 0.125 +v 0.5 0.75 -0.125 +v 0.25 1.5 -0.125 +v 0.25 1.5 0.125 +v 0.25 0.75 -0.125 +v 0.25 0.75 0.125 +vt 0.6875 0.21875 +vt 0.75 0.21875 +vt 0.75 0.03125 +vt 0.6875 0.03125 +vt 0.625 0.21875 +vt 0.6875 0.21875 +vt 0.6875 0.03125 +vt 0.625 0.03125 +vt 0.8125 0.21875 +vt 0.875 0.21875 +vt 0.875 0.03125 +vt 0.8125 0.03125 +vt 0.75 0.21875 +vt 0.8125 0.21875 +vt 0.8125 0.03125 +vt 0.75 0.03125 +vt 0.75 0.21875 +vt 0.6875 0.21875 +vt 0.6875 0.28125 +vt 0.75 0.28125 +vt 0.8125 0.28125 +vt 0.75 0.28125 +vt 0.75 0.21875 +vt 0.8125 0.21875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o LeftArm +v -0.25 1.5 0.125 +v -0.25 1.5 -0.125 +v -0.25 0.75 0.125 +v -0.25 0.75 -0.125 +v -0.5 1.5 -0.125 +v -0.5 1.5 0.125 +v -0.5 0.75 -0.125 +v -0.5 0.75 0.125 +vt 0.75 0.21875 +vt 0.6875 0.21875 +vt 0.6875 0.03125 +vt 0.75 0.03125 +vt 0.8125 0.21875 +vt 0.75 0.21875 +vt 0.75 0.03125 +vt 0.8125 0.03125 +vt 0.875 0.21875 +vt 0.8125 0.21875 +vt 0.8125 0.03125 +vt 0.875 0.03125 +vt 0.6875 0.21875 +vt 0.625 0.21875 +vt 0.625 0.03125 +vt 0.6875 0.03125 +vt 0.6875 0.21875 +vt 0.75 0.21875 +vt 0.75 0.28125 +vt 0.6875 0.28125 +vt 0.75 0.28125 +vt 0.8125 0.28125 +vt 0.8125 0.21875 +vt 0.75 0.21875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/rabbit.obj b/prismarine-viewer/viewer/lib/entity/models/rabbit.obj new file mode 100644 index 00000000..545c4b5d --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/rabbit.obj @@ -0,0 +1,555 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o rearFootLeft +v -0.125 0.0625 0.4375 +v -0.125 0.0625 0 +v -0.125 0 0.4375 +v -0.125 0 0 +v -0.25 0.0625 0 +v -0.25 0.0625 0.4375 +v -0.25 0 0 +v -0.25 0 0.4375 +vt 0.265625 0.03125 +vt 0.234375 0.03125 +vt 0.234375 0 +vt 0.265625 0 +vt 0.375 0.03125 +vt 0.265625 0.03125 +vt 0.265625 0 +vt 0.375 0 +vt 0.40625 0.03125 +vt 0.375 0.03125 +vt 0.375 0 +vt 0.40625 0 +vt 0.234375 0.03125 +vt 0.125 0.03125 +vt 0.125 0 +vt 0.234375 0 +vt 0.234375 0.03125 +vt 0.265625 0.03125 +vt 0.265625 0.25 +vt 0.234375 0.25 +vt 0.265625 0.25 +vt 0.296875 0.25 +vt 0.296875 0.03125 +vt 0.265625 0.03125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o rearFootRight +v 0.25 0.0625 0.4375 +v 0.25 0.0625 0 +v 0.25 0 0.4375 +v 0.25 0 0 +v 0.125 0.0625 0 +v 0.125 0.0625 0.4375 +v 0.125 0 0 +v 0.125 0 0.4375 +vt 0.546875 0.03125 +vt 0.515625 0.03125 +vt 0.515625 0 +vt 0.546875 0 +vt 0.65625 0.03125 +vt 0.546875 0.03125 +vt 0.546875 0 +vt 0.65625 0 +vt 0.6875 0.03125 +vt 0.65625 0.03125 +vt 0.65625 0 +vt 0.6875 0 +vt 0.515625 0.03125 +vt 0.40625 0.03125 +vt 0.40625 0 +vt 0.515625 0 +vt 0.515625 0.03125 +vt 0.546875 0.03125 +vt 0.546875 0.25 +vt 0.515625 0.25 +vt 0.546875 0.25 +vt 0.578125 0.25 +vt 0.578125 0.03125 +vt 0.546875 0.03125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o haunchLeft +v -0.125 0.29936870521072856 0.5249039439955965 +v -0.125 0.40625 0.23124999999999996 +v -0.125 0.06444555001425145 0.43939890816417915 +v -0.125 0.1713268448035229 0.14574496416858285 +v -0.25 0.40625 0.23124999999999996 +v -0.25 0.29936870521072856 0.5249039439955965 +v -0.25 0.1713268448035229 0.14574496416858285 +v -0.25 0.06444555001425145 0.43939890816417915 +vt 0.359375 0.375 +vt 0.328125 0.375 +vt 0.328125 0.25 +vt 0.359375 0.25 +vt 0.4375 0.375 +vt 0.359375 0.375 +vt 0.359375 0.25 +vt 0.4375 0.25 +vt 0.46875 0.375 +vt 0.4375 0.375 +vt 0.4375 0.25 +vt 0.46875 0.25 +vt 0.328125 0.375 +vt 0.25 0.375 +vt 0.25 0.25 +vt 0.328125 0.25 +vt 0.328125 0.375 +vt 0.359375 0.375 +vt 0.359375 0.53125 +vt 0.328125 0.53125 +vt 0.359375 0.53125 +vt 0.390625 0.53125 +vt 0.390625 0.375 +vt 0.359375 0.375 +vn 0 0.34202014332566866 -0.9396926207859084 +vn 1 0 0 +vn 0 -0.34202014332566866 0.9396926207859084 +vn -1 0 0 +vn 0 0.9396926207859084 0.34202014332566866 +vn 0 -0.9396926207859084 -0.34202014332566866 +usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o haunchRight +v 0.25 0.29936870521072856 0.5249039439955965 +v 0.25 0.40625 0.23124999999999996 +v 0.25 0.06444555001425145 0.43939890816417915 +v 0.25 0.1713268448035229 0.14574496416858285 +v 0.125 0.40625 0.23124999999999996 +v 0.125 0.29936870521072856 0.5249039439955965 +v 0.125 0.1713268448035229 0.14574496416858285 +v 0.125 0.06444555001425145 0.43939890816417915 +vt 0.578125 0.375 +vt 0.546875 0.375 +vt 0.546875 0.25 +vt 0.578125 0.25 +vt 0.65625 0.375 +vt 0.578125 0.375 +vt 0.578125 0.25 +vt 0.65625 0.25 +vt 0.6875 0.375 +vt 0.65625 0.375 +vt 0.65625 0.25 +vt 0.6875 0.25 +vt 0.546875 0.375 +vt 0.46875 0.375 +vt 0.46875 0.25 +vt 0.546875 0.25 +vt 0.546875 0.375 +vt 0.578125 0.375 +vt 0.578125 0.53125 +vt 0.546875 0.53125 +vt 0.578125 0.53125 +vt 0.609375 0.53125 +vt 0.609375 0.375 +vt 0.578125 0.375 +vn 0 0.34202014332566866 -0.9396926207859084 +vn 1 0 0 +vn 0 -0.34202014332566866 0.9396926207859084 +vn -1 0 0 +vn 0 0.9396926207859084 0.34202014332566866 +vn 0 -0.9396926207859084 -0.34202014332566866 +usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o body +v 0.1875 0.4299615775982385 0.5427525179157087 +v 0.1875 0.6437241671767815 -0.04455537007548416 +v 0.1875 0.1363076336026421 0.4358712231264371 +v 0.1875 0.3500702231811851 -0.1514366648647556 +v -0.1875 0.6437241671767815 -0.04455537007548416 +v -0.1875 0.4299615775982385 0.5427525179157087 +v -0.1875 0.3500702231811851 -0.1514366648647556 +v -0.1875 0.1363076336026421 0.4358712231264371 +vt 0.25 0.6875 +vt 0.15625 0.6875 +vt 0.15625 0.53125 +vt 0.25 0.53125 +vt 0.40625 0.6875 +vt 0.25 0.6875 +vt 0.25 0.53125 +vt 0.40625 0.53125 +vt 0.5 0.6875 +vt 0.40625 0.6875 +vt 0.40625 0.53125 +vt 0.5 0.53125 +vt 0.15625 0.6875 +vt 0 0.6875 +vt 0 0.53125 +vt 0.15625 0.53125 +vt 0.15625 0.6875 +vt 0.25 0.6875 +vt 0.25 1 +vt 0.15625 1 +vt 0.25 1 +vt 0.34375 1 +vt 0.34375 0.6875 +vt 0.25 0.6875 +vn 0 0.34202014332566866 -0.9396926207859084 +vn 1 0 0 +vn 0 -0.34202014332566866 0.9396926207859084 +vn -1 0 0 +vn 0 0.9396926207859084 0.34202014332566866 +vn 0 -0.9396926207859084 -0.34202014332566866 +usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o frontLegLeft +v -0.125 0.42664698889581687 -0.0009495154367369918 +v -0.125 0.44835301110418313 -0.12405048456326301 +v -0.125 -0.004206403047024132 -0.07692059316601901 +v -0.125 0.017499619161342128 -0.20002156229254503 +v -0.25 0.44835301110418313 -0.12405048456326301 +v -0.25 0.42664698889581687 -0.0009495154367369918 +v -0.25 0.017499619161342128 -0.20002156229254503 +v -0.25 -0.004206403047024132 -0.07692059316601901 +vt 0.1875 0.46875 +vt 0.15625 0.46875 +vt 0.15625 0.25 +vt 0.1875 0.25 +vt 0.21875 0.46875 +vt 0.1875 0.46875 +vt 0.1875 0.25 +vt 0.21875 0.25 +vt 0.25 0.46875 +vt 0.21875 0.46875 +vt 0.21875 0.25 +vt 0.25 0.25 +vt 0.15625 0.46875 +vt 0.125 0.46875 +vt 0.125 0.25 +vt 0.15625 0.25 +vt 0.15625 0.46875 +vt 0.1875 0.46875 +vt 0.1875 0.53125 +vt 0.15625 0.53125 +vt 0.1875 0.53125 +vt 0.21875 0.53125 +vt 0.21875 0.46875 +vt 0.1875 0.46875 +vn 0 0.17364817766693033 -0.984807753012208 +vn 1 0 0 +vn 0 -0.17364817766693033 0.984807753012208 +vn -1 0 0 +vn 0 0.984807753012208 0.17364817766693033 +vn 0 -0.984807753012208 -0.17364817766693033 +usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o frontLegRight +v 0.25 0.42664698889581687 -0.0009495154367369918 +v 0.25 0.44835301110418313 -0.12405048456326301 +v 0.25 -0.004206403047024132 -0.07692059316601901 +v 0.25 0.017499619161342128 -0.20002156229254503 +v 0.125 0.44835301110418313 -0.12405048456326301 +v 0.125 0.42664698889581687 -0.0009495154367369918 +v 0.125 0.017499619161342128 -0.20002156229254503 +v 0.125 -0.004206403047024132 -0.07692059316601901 +vt 0.0625 0.46875 +vt 0.03125 0.46875 +vt 0.03125 0.25 +vt 0.0625 0.25 +vt 0.09375 0.46875 +vt 0.0625 0.46875 +vt 0.0625 0.25 +vt 0.09375 0.25 +vt 0.125 0.46875 +vt 0.09375 0.46875 +vt 0.09375 0.25 +vt 0.125 0.25 +vt 0.03125 0.46875 +vt 0 0.46875 +vt 0 0.25 +vt 0.03125 0.25 +vt 0.03125 0.46875 +vt 0.0625 0.46875 +vt 0.0625 0.53125 +vt 0.03125 0.53125 +vt 0.0625 0.53125 +vt 0.09375 0.53125 +vt 0.09375 0.46875 +vt 0.0625 0.46875 +vn 0 0.17364817766693033 -0.984807753012208 +vn 1 0 0 +vn 0 -0.17364817766693033 0.984807753012208 +vn -1 0 0 +vn 0 0.984807753012208 0.17364817766693033 +vn 0 -0.984807753012208 -0.17364817766693033 +usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o head +v 0.15625 0.75 -0.0625 +v 0.15625 0.75 -0.375 +v 0.15625 0.5 -0.0625 +v 0.15625 0.5 -0.375 +v -0.15625 0.75 -0.375 +v -0.15625 0.75 -0.0625 +v -0.15625 0.5 -0.375 +v -0.15625 0.5 -0.0625 +vt 0.65625 0.84375 +vt 0.578125 0.84375 +vt 0.578125 0.71875 +vt 0.65625 0.71875 +vt 0.734375 0.84375 +vt 0.65625 0.84375 +vt 0.65625 0.71875 +vt 0.734375 0.71875 +vt 0.8125 0.84375 +vt 0.734375 0.84375 +vt 0.734375 0.71875 +vt 0.8125 0.71875 +vt 0.578125 0.84375 +vt 0.5 0.84375 +vt 0.5 0.71875 +vt 0.578125 0.71875 +vt 0.578125 0.84375 +vt 0.65625 0.84375 +vt 0.65625 1 +vt 0.578125 1 +vt 0.65625 1 +vt 0.734375 1 +vt 0.734375 0.84375 +vt 0.65625 0.84375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o earRight +v 0.1509259103576669 1.0625 -0.10294047579726884 +v 0.1347497200387594 1.0625 -0.16331083994033568 +v 0.1509259103576669 0.75 -0.10294047579726884 +v 0.1347497200387594 0.75 -0.16331083994033568 +v 0.014008991752625821 1.0625 -0.1309584593025206 +v 0.030185182071533423 1.0625 -0.07058809515945375 +v 0.014008991752625821 0.75 -0.1309584593025206 +v 0.030185182071533423 0.75 -0.07058809515945375 +vt 0.953125 0.96875 +vt 0.921875 0.96875 +vt 0.921875 0.8125 +vt 0.953125 0.8125 +vt 0.96875 0.96875 +vt 0.953125 0.96875 +vt 0.953125 0.8125 +vt 0.96875 0.8125 +vt 1 0.96875 +vt 0.96875 0.96875 +vt 0.96875 0.8125 +vt 1 0.8125 +vt 0.921875 0.96875 +vt 0.90625 0.96875 +vt 0.90625 0.8125 +vt 0.921875 0.8125 +vt 0.921875 0.96875 +vt 0.953125 0.96875 +vt 0.953125 1 +vt 0.921875 1 +vt 0.953125 1 +vt 0.984375 1 +vt 0.984375 0.96875 +vt 0.953125 0.96875 +vn -0.25881904510252074 0 -0.9659258262890683 +vn 0.9659258262890683 0 -0.25881904510252074 +vn 0.25881904510252074 0 0.9659258262890683 +vn -0.9659258262890683 0 0.25881904510252074 +vn 0 1 0 +vn 0 -1 0 +usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o earLeft +v -0.030185182071533367 1.0625 -0.07058809515945375 +v -0.014008991752625821 1.0625 -0.1309584593025206 +v -0.030185182071533367 0.75 -0.07058809515945375 +v -0.014008991752625821 0.75 -0.1309584593025206 +v -0.1347497200387594 1.0625 -0.16331083994033568 +v -0.1509259103576669 1.0625 -0.10294047579726884 +v -0.1347497200387594 0.75 -0.16331083994033568 +v -0.1509259103576669 0.75 -0.10294047579726884 +vt 0.859375 0.96875 +vt 0.828125 0.96875 +vt 0.828125 0.8125 +vt 0.859375 0.8125 +vt 0.875 0.96875 +vt 0.859375 0.96875 +vt 0.859375 0.8125 +vt 0.875 0.8125 +vt 0.90625 0.96875 +vt 0.875 0.96875 +vt 0.875 0.8125 +vt 0.90625 0.8125 +vt 0.828125 0.96875 +vt 0.8125 0.96875 +vt 0.8125 0.8125 +vt 0.828125 0.8125 +vt 0.828125 0.96875 +vt 0.859375 0.96875 +vt 0.859375 1 +vt 0.828125 1 +vt 0.859375 1 +vt 0.890625 1 +vt 0.890625 0.96875 +vt 0.859375 0.96875 +vn 0.25881904510252074 0 -0.9659258262890683 +vn 0.9659258262890683 0 0.25881904510252074 +vn -0.25881904510252074 0 0.9659258262890683 +vn -0.9659258262890683 0 -0.25881904510252074 +vn 0 1 0 +vn 0 -1 0 +usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o tail +v 0.09375 0.2953436652829704 0.5870259660350201 +v 0.09375 0.33809618319867885 0.4695643884367815 +v 0.09375 0.11915129888561249 0.5228971891614571 +v 0.09375 0.16190381680132115 0.4054356115632185 +v -0.09375 0.33809618319867885 0.4695643884367815 +v -0.09375 0.2953436652829704 0.5870259660350201 +v -0.09375 0.16190381680132115 0.4054356115632185 +v -0.09375 0.11915129888561249 0.5228971891614571 +vt 0.890625 0.75 +vt 0.84375 0.75 +vt 0.84375 0.65625 +vt 0.890625 0.65625 +vt 0.921875 0.75 +vt 0.890625 0.75 +vt 0.890625 0.65625 +vt 0.921875 0.65625 +vt 0.96875 0.75 +vt 0.921875 0.75 +vt 0.921875 0.65625 +vt 0.96875 0.65625 +vt 0.84375 0.75 +vt 0.8125 0.75 +vt 0.8125 0.65625 +vt 0.84375 0.65625 +vt 0.84375 0.75 +vt 0.890625 0.75 +vt 0.890625 0.8125 +vt 0.84375 0.8125 +vt 0.890625 0.8125 +vt 0.9375 0.8125 +vt 0.9375 0.75 +vt 0.890625 0.75 +vn 0 0.34202014332566866 -0.9396926207859084 +vn 1 0 0 +vn 0 -0.34202014332566866 0.9396926207859084 +vn -1 0 0 +vn 0 0.9396926207859084 0.34202014332566866 +vn 0 -0.9396926207859084 -0.34202014332566866 +usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 +o nose +v 0.03125 0.65625 -0.34375 +v 0.03125 0.65625 -0.40625 +v 0.03125 0.59375 -0.34375 +v 0.03125 0.59375 -0.40625 +v -0.03125 0.65625 -0.40625 +v -0.03125 0.65625 -0.34375 +v -0.03125 0.59375 -0.40625 +v -0.03125 0.59375 -0.34375 +vt 0.53125 0.6875 +vt 0.515625 0.6875 +vt 0.515625 0.65625 +vt 0.53125 0.65625 +vt 0.546875 0.6875 +vt 0.53125 0.6875 +vt 0.53125 0.65625 +vt 0.546875 0.65625 +vt 0.5625 0.6875 +vt 0.546875 0.6875 +vt 0.546875 0.65625 +vt 0.5625 0.65625 +vt 0.515625 0.6875 +vt 0.5 0.6875 +vt 0.5 0.65625 +vt 0.515625 0.65625 +vt 0.515625 0.6875 +vt 0.53125 0.6875 +vt 0.53125 0.71875 +vt 0.515625 0.71875 +vt 0.53125 0.71875 +vt 0.546875 0.71875 +vt 0.546875 0.6875 +vt 0.53125 0.6875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 +f 92/268/67 95/267/67 93/266/67 90/265/67 +f 91/272/68 92/271/68 90/270/68 89/269/68 +f 96/276/69 91/275/69 89/274/69 94/273/69 +f 95/280/70 96/279/70 94/278/70 93/277/70 +f 94/284/71 89/283/71 90/282/71 93/281/71 +f 95/288/72 92/287/72 91/286/72 96/285/72 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/sheep.obj b/prismarine-viewer/viewer/lib/entity/models/sheep.obj new file mode 100644 index 00000000..66a2175f --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/sheep.obj @@ -0,0 +1,555 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.25 1.1250000000000002 -0.5 +v 0.25 0.7500000000000002 -0.5 +v 0.25 1.125 0.5 +v 0.25 0.75 0.4999999999999999 +v -0.25 0.7500000000000002 -0.5 +v -0.25 1.1250000000000002 -0.5 +v -0.25 0.75 0.4999999999999999 +v -0.25 1.125 0.5 +vt 0.53125 0.78125 +vt 0.65625 0.78125 +vt 0.65625 0.53125 +vt 0.53125 0.53125 +vt 0.4375 0.78125 +vt 0.53125 0.78125 +vt 0.53125 0.53125 +vt 0.4375 0.53125 +vt 0.75 0.78125 +vt 0.875 0.78125 +vt 0.875 0.53125 +vt 0.75 0.53125 +vt 0.65625 0.78125 +vt 0.75 0.78125 +vt 0.75 0.53125 +vt 0.65625 0.53125 +vt 0.65625 0.78125 +vt 0.53125 0.78125 +vt 0.53125 0.875 +vt 0.65625 0.875 +vt 0.78125 0.875 +vt 0.65625 0.875 +vt 0.65625 0.78125 +vt 0.78125 0.78125 +vn 0 -1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 -1 +vn 0 -2.220446049250313e-16 1 +usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o body +v 0.359375 1.2343750000000002 -0.609375 +v 0.359375 0.6406250000000002 -0.609375 +v 0.359375 1.234375 0.609375 +v 0.359375 0.640625 0.609375 +v -0.359375 0.6406250000000002 -0.609375 +v -0.359375 1.2343750000000002 -0.609375 +v -0.359375 0.640625 0.609375 +v -0.359375 1.234375 0.609375 +vt 0.53125 0.28125 +vt 0.65625 0.28125 +vt 0.65625 0.03125 +vt 0.53125 0.03125 +vt 0.4375 0.28125 +vt 0.53125 0.28125 +vt 0.53125 0.03125 +vt 0.4375 0.03125 +vt 0.75 0.28125 +vt 0.875 0.28125 +vt 0.875 0.03125 +vt 0.75 0.03125 +vt 0.65625 0.28125 +vt 0.75 0.28125 +vt 0.75 0.03125 +vt 0.65625 0.03125 +vt 0.65625 0.28125 +vt 0.53125 0.28125 +vt 0.53125 0.375 +vt 0.65625 0.375 +vt 0.78125 0.375 +vt 0.65625 0.375 +vt 0.65625 0.28125 +vt 0.78125 0.28125 +vn 0 -1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 -1 +vn 0 -2.220446049250313e-16 1 +usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o head +v 0.1875 1.375 -0.375 +v 0.1875 1.375 -0.875 +v 0.1875 1 -0.375 +v 0.1875 1 -0.875 +v -0.1875 1.375 -0.875 +v -0.1875 1.375 -0.375 +v -0.1875 1 -0.875 +v -0.1875 1 -0.375 +vt 0.125 0.875 +vt 0.21875 0.875 +vt 0.21875 0.78125 +vt 0.125 0.78125 +vt 0 0.875 +vt 0.125 0.875 +vt 0.125 0.78125 +vt 0 0.78125 +vt 0.34375 0.875 +vt 0.4375 0.875 +vt 0.4375 0.78125 +vt 0.34375 0.78125 +vt 0.21875 0.875 +vt 0.34375 0.875 +vt 0.34375 0.78125 +vt 0.21875 0.78125 +vt 0.21875 0.875 +vt 0.125 0.875 +vt 0.125 1 +vt 0.21875 1 +vt 0.3125 1 +vt 0.21875 1 +vt 0.21875 0.875 +vt 0.3125 0.875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o head +v 0.22499999999999998 1.4125 -0.3375 +v 0.22499999999999998 1.4125 -0.7875 +v 0.22499999999999998 0.9624999999999999 -0.3375 +v 0.22499999999999998 0.9624999999999999 -0.7875 +v -0.22499999999999998 1.4125 -0.7875 +v -0.22499999999999998 1.4125 -0.3375 +v -0.22499999999999998 0.9624999999999999 -0.7875 +v -0.22499999999999998 0.9624999999999999 -0.3375 +vt 0.09375 0.40625 +vt 0.1875 0.40625 +vt 0.1875 0.3125 +vt 0.09375 0.3125 +vt 0 0.40625 +vt 0.09375 0.40625 +vt 0.09375 0.3125 +vt 0 0.3125 +vt 0.28125 0.40625 +vt 0.375 0.40625 +vt 0.375 0.3125 +vt 0.28125 0.3125 +vt 0.1875 0.40625 +vt 0.28125 0.40625 +vt 0.28125 0.3125 +vt 0.1875 0.3125 +vt 0.1875 0.40625 +vt 0.09375 0.40625 +vt 0.09375 0.5 +vt 0.1875 0.5 +vt 0.28125 0.5 +vt 0.1875 0.5 +vt 0.1875 0.40625 +vt 0.28125 0.40625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o leg0 +v 0.3125 0.75 0.5625 +v 0.3125 0.75 0.3125 +v 0.3125 0 0.5625 +v 0.3125 0 0.3125 +v 0.0625 0.75 0.3125 +v 0.0625 0.75 0.5625 +v 0.0625 0 0.3125 +v 0.0625 0 0.5625 +vt 0.0625 0.6875 +vt 0.125 0.6875 +vt 0.125 0.5 +vt 0.0625 0.5 +vt 0 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.5 +vt 0 0.5 +vt 0.1875 0.6875 +vt 0.25 0.6875 +vt 0.25 0.5 +vt 0.1875 0.5 +vt 0.125 0.6875 +vt 0.1875 0.6875 +vt 0.1875 0.5 +vt 0.125 0.5 +vt 0.125 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.75 +vt 0.125 0.75 +vt 0.1875 0.75 +vt 0.125 0.75 +vt 0.125 0.6875 +vt 0.1875 0.6875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o leg0 +v 0.34375 0.78125 0.59375 +v 0.34375 0.78125 0.28125 +v 0.34375 0.34375 0.59375 +v 0.34375 0.34375 0.28125 +v 0.03125 0.78125 0.28125 +v 0.03125 0.78125 0.59375 +v 0.03125 0.34375 0.28125 +v 0.03125 0.34375 0.59375 +vt 0.0625 0.1875 +vt 0.125 0.1875 +vt 0.125 0.09375 +vt 0.0625 0.09375 +vt 0 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.09375 +vt 0 0.09375 +vt 0.1875 0.1875 +vt 0.25 0.1875 +vt 0.25 0.09375 +vt 0.1875 0.09375 +vt 0.125 0.1875 +vt 0.1875 0.1875 +vt 0.1875 0.09375 +vt 0.125 0.09375 +vt 0.125 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.25 +vt 0.125 0.25 +vt 0.1875 0.25 +vt 0.125 0.25 +vt 0.125 0.1875 +vt 0.1875 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o leg1 +v -0.0625 0.75 0.5625 +v -0.0625 0.75 0.3125 +v -0.0625 0 0.5625 +v -0.0625 0 0.3125 +v -0.3125 0.75 0.3125 +v -0.3125 0.75 0.5625 +v -0.3125 0 0.3125 +v -0.3125 0 0.5625 +vt 0.0625 0.6875 +vt 0.125 0.6875 +vt 0.125 0.5 +vt 0.0625 0.5 +vt 0 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.5 +vt 0 0.5 +vt 0.1875 0.6875 +vt 0.25 0.6875 +vt 0.25 0.5 +vt 0.1875 0.5 +vt 0.125 0.6875 +vt 0.1875 0.6875 +vt 0.1875 0.5 +vt 0.125 0.5 +vt 0.125 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.75 +vt 0.125 0.75 +vt 0.1875 0.75 +vt 0.125 0.75 +vt 0.125 0.6875 +vt 0.1875 0.6875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o leg1 +v -0.03125 0.78125 0.59375 +v -0.03125 0.78125 0.28125 +v -0.03125 0.34375 0.59375 +v -0.03125 0.34375 0.28125 +v -0.34375 0.78125 0.28125 +v -0.34375 0.78125 0.59375 +v -0.34375 0.34375 0.28125 +v -0.34375 0.34375 0.59375 +vt 0.0625 0.1875 +vt 0.125 0.1875 +vt 0.125 0.09375 +vt 0.0625 0.09375 +vt 0 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.09375 +vt 0 0.09375 +vt 0.1875 0.1875 +vt 0.25 0.1875 +vt 0.25 0.09375 +vt 0.1875 0.09375 +vt 0.125 0.1875 +vt 0.1875 0.1875 +vt 0.1875 0.09375 +vt 0.125 0.09375 +vt 0.125 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.25 +vt 0.125 0.25 +vt 0.1875 0.25 +vt 0.125 0.25 +vt 0.125 0.1875 +vt 0.1875 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o leg2 +v 0.3125 0.75 -0.1875 +v 0.3125 0.75 -0.4375 +v 0.3125 0 -0.1875 +v 0.3125 0 -0.4375 +v 0.0625 0.75 -0.4375 +v 0.0625 0.75 -0.1875 +v 0.0625 0 -0.4375 +v 0.0625 0 -0.1875 +vt 0.0625 0.6875 +vt 0.125 0.6875 +vt 0.125 0.5 +vt 0.0625 0.5 +vt 0 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.5 +vt 0 0.5 +vt 0.1875 0.6875 +vt 0.25 0.6875 +vt 0.25 0.5 +vt 0.1875 0.5 +vt 0.125 0.6875 +vt 0.1875 0.6875 +vt 0.1875 0.5 +vt 0.125 0.5 +vt 0.125 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.75 +vt 0.125 0.75 +vt 0.1875 0.75 +vt 0.125 0.75 +vt 0.125 0.6875 +vt 0.1875 0.6875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o leg2 +v 0.34375 0.78125 -0.15625 +v 0.34375 0.78125 -0.46875 +v 0.34375 0.34375 -0.15625 +v 0.34375 0.34375 -0.46875 +v 0.03125 0.78125 -0.46875 +v 0.03125 0.78125 -0.15625 +v 0.03125 0.34375 -0.46875 +v 0.03125 0.34375 -0.15625 +vt 0.0625 0.1875 +vt 0.125 0.1875 +vt 0.125 0.09375 +vt 0.0625 0.09375 +vt 0 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.09375 +vt 0 0.09375 +vt 0.1875 0.1875 +vt 0.25 0.1875 +vt 0.25 0.09375 +vt 0.1875 0.09375 +vt 0.125 0.1875 +vt 0.1875 0.1875 +vt 0.1875 0.09375 +vt 0.125 0.09375 +vt 0.125 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.25 +vt 0.125 0.25 +vt 0.1875 0.25 +vt 0.125 0.25 +vt 0.125 0.1875 +vt 0.1875 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o leg3 +v -0.0625 0.75 -0.1875 +v -0.0625 0.75 -0.4375 +v -0.0625 0 -0.1875 +v -0.0625 0 -0.4375 +v -0.3125 0.75 -0.4375 +v -0.3125 0.75 -0.1875 +v -0.3125 0 -0.4375 +v -0.3125 0 -0.1875 +vt 0.0625 0.6875 +vt 0.125 0.6875 +vt 0.125 0.5 +vt 0.0625 0.5 +vt 0 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.5 +vt 0 0.5 +vt 0.1875 0.6875 +vt 0.25 0.6875 +vt 0.25 0.5 +vt 0.1875 0.5 +vt 0.125 0.6875 +vt 0.1875 0.6875 +vt 0.1875 0.5 +vt 0.125 0.5 +vt 0.125 0.6875 +vt 0.0625 0.6875 +vt 0.0625 0.75 +vt 0.125 0.75 +vt 0.1875 0.75 +vt 0.125 0.75 +vt 0.125 0.6875 +vt 0.1875 0.6875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 +o leg3 +v -0.03125 0.78125 -0.15625 +v -0.03125 0.78125 -0.46875 +v -0.03125 0.34375 -0.15625 +v -0.03125 0.34375 -0.46875 +v -0.34375 0.78125 -0.46875 +v -0.34375 0.78125 -0.15625 +v -0.34375 0.34375 -0.46875 +v -0.34375 0.34375 -0.15625 +vt 0.0625 0.1875 +vt 0.125 0.1875 +vt 0.125 0.09375 +vt 0.0625 0.09375 +vt 0 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.09375 +vt 0 0.09375 +vt 0.1875 0.1875 +vt 0.25 0.1875 +vt 0.25 0.09375 +vt 0.1875 0.09375 +vt 0.125 0.1875 +vt 0.1875 0.1875 +vt 0.1875 0.09375 +vt 0.125 0.09375 +vt 0.125 0.1875 +vt 0.0625 0.1875 +vt 0.0625 0.25 +vt 0.125 0.25 +vt 0.1875 0.25 +vt 0.125 0.25 +vt 0.125 0.1875 +vt 0.1875 0.1875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb +f 92/268/67 95/267/67 93/266/67 90/265/67 +f 91/272/68 92/271/68 90/270/68 89/269/68 +f 96/276/69 91/275/69 89/274/69 94/273/69 +f 95/280/70 96/279/70 94/278/70 93/277/70 +f 94/284/71 89/283/71 90/282/71 93/281/71 +f 95/288/72 92/287/72 91/286/72 96/285/72 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/shulker.obj b/prismarine-viewer/viewer/lib/entity/models/shulker.obj new file mode 100644 index 00000000..0287fddb --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/shulker.obj @@ -0,0 +1,141 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o base +v 0.5 0.5 0.5 +v 0.5 0.5 -0.5 +v 0.5 0 0.5 +v 0.5 0 -0.5 +v -0.5 0.5 -0.5 +v -0.5 0.5 0.5 +v -0.5 0 -0.5 +v -0.5 0 0.5 +vt 0.25 0.3125 +vt 0.5 0.3125 +vt 0.5 0.1875 +vt 0.25 0.1875 +vt 0 0.3125 +vt 0.25 0.3125 +vt 0.25 0.1875 +vt 0 0.1875 +vt 0.75 0.3125 +vt 1 0.3125 +vt 1 0.1875 +vt 0.75 0.1875 +vt 0.5 0.3125 +vt 0.75 0.3125 +vt 0.75 0.1875 +vt 0.5 0.1875 +vt 0.5 0.3125 +vt 0.25 0.3125 +vt 0.25 0.5625 +vt 0.5 0.5625 +vt 0.75 0.5625 +vt 0.5 0.5625 +vt 0.5 0.3125 +vt 0.75 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_1c25eeea-87e5-6114-747e-b8cdb1a56a09 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o lid +v 0.5 1.5625 0.5 +v 0.5 1.5625 -0.5 +v 0.5 0.8125 0.5 +v 0.5 0.8125 -0.5 +v -0.5 1.5625 -0.5 +v -0.5 1.5625 0.5 +v -0.5 0.8125 -0.5 +v -0.5 0.8125 0.5 +vt 0.25 0.75 +vt 0.5 0.75 +vt 0.5 0.5625 +vt 0.25 0.5625 +vt 0 0.75 +vt 0.25 0.75 +vt 0.25 0.5625 +vt 0 0.5625 +vt 0.75 0.75 +vt 1 0.75 +vt 1 0.5625 +vt 0.75 0.5625 +vt 0.5 0.75 +vt 0.75 0.75 +vt 0.75 0.5625 +vt 0.5 0.5625 +vt 0.5 0.75 +vt 0.25 0.75 +vt 0.25 1 +vt 0.5 1 +vt 0.75 1 +vt 0.5 1 +vt 0.5 0.75 +vt 0.75 0.75 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_1c25eeea-87e5-6114-747e-b8cdb1a56a09 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o head +v 0.1875 0.75 0.1875 +v 0.1875 0.75 -0.1875 +v 0.1875 0.375 0.1875 +v 0.1875 0.375 -0.1875 +v -0.1875 0.75 -0.1875 +v -0.1875 0.75 0.1875 +v -0.1875 0.375 -0.1875 +v -0.1875 0.375 0.1875 +vt 0.09375 0.09375 +vt 0.1875 0.09375 +vt 0.1875 0 +vt 0.09375 0 +vt 0 0.09375 +vt 0.09375 0.09375 +vt 0.09375 0 +vt 0 0 +vt 0.28125 0.09375 +vt 0.375 0.09375 +vt 0.375 0 +vt 0.28125 0 +vt 0.1875 0.09375 +vt 0.28125 0.09375 +vt 0.28125 0 +vt 0.1875 0 +vt 0.1875 0.09375 +vt 0.09375 0.09375 +vt 0.09375 0.1875 +vt 0.1875 0.1875 +vt 0.28125 0.1875 +vt 0.1875 0.1875 +vt 0.1875 0.09375 +vt 0.28125 0.09375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_1c25eeea-87e5-6114-747e-b8cdb1a56a09 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/sniffer.obj b/prismarine-viewer/viewer/lib/entity/models/sniffer.obj new file mode 100644 index 00000000..6fe8ed15 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/sniffer.obj @@ -0,0 +1,693 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.8125 2.09375 1.28125 +v 0.8125 2.09375 -1.28125 +v 0.8125 0.53125 1.28125 +v 0.8125 0.53125 -1.28125 +v -0.8125 2.09375 -1.28125 +v -0.8125 2.09375 1.28125 +v -0.8125 0.53125 -1.28125 +v -0.8125 0.53125 1.28125 +vt 0.53125 0.7916666666666666 +vt 0.6614583333333334 0.7916666666666666 +vt 0.6614583333333334 0.6666666666666667 +vt 0.53125 0.6666666666666667 +vt 0.3229166666666667 0.7916666666666666 +vt 0.53125 0.7916666666666666 +vt 0.53125 0.6666666666666667 +vt 0.3229166666666667 0.6666666666666667 +vt 0.8697916666666666 0.7916666666666666 +vt 1 0.7916666666666666 +vt 1 0.6666666666666667 +vt 0.8697916666666666 0.6666666666666667 +vt 0.6614583333333334 0.7916666666666666 +vt 0.8697916666666666 0.7916666666666666 +vt 0.8697916666666666 0.6666666666666667 +vt 0.6614583333333334 0.6666666666666667 +vt 0.6614583333333334 0.7916666666666666 +vt 0.53125 0.7916666666666666 +vt 0.53125 1 +vt 0.6614583333333334 1 +vt 0.7916666666666666 1 +vt 0.6614583333333334 1 +vt 0.6614583333333334 0.7916666666666666 +vt 0.7916666666666666 0.7916666666666666 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o body +v 0.78125 2.0625 1.25 +v 0.78125 2.0625 -1.25 +v 0.78125 0.25 1.25 +v 0.78125 0.25 -1.25 +v -0.78125 2.0625 -1.25 +v -0.78125 2.0625 1.25 +v -0.78125 0.25 -1.25 +v -0.78125 0.25 1.25 +vt 0.53125 0.4375 +vt 0.6614583333333334 0.4375 +vt 0.6614583333333334 0.28645833333333337 +vt 0.53125 0.28645833333333337 +vt 0.3229166666666667 0.4375 +vt 0.53125 0.4375 +vt 0.53125 0.28645833333333337 +vt 0.3229166666666667 0.28645833333333337 +vt 0.8697916666666666 0.4375 +vt 1 0.4375 +vt 1 0.28645833333333337 +vt 0.8697916666666666 0.28645833333333337 +vt 0.6614583333333334 0.4375 +vt 0.8697916666666666 0.4375 +vt 0.8697916666666666 0.28645833333333337 +vt 0.6614583333333334 0.28645833333333337 +vt 0.6614583333333334 0.4375 +vt 0.53125 0.4375 +vt 0.53125 0.6458333333333333 +vt 0.6614583333333334 0.6458333333333333 +vt 0.7916666666666666 0.6458333333333333 +vt 0.6614583333333334 0.6458333333333333 +vt 0.6614583333333334 0.4375 +vt 0.7916666666666666 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o body +v 0.78125 0.5 1.25 +v 0.78125 0.5 -1.25 +v 0.78125 0.5 1.25 +v 0.78125 0.5 -1.25 +v -0.78125 0.5 -1.25 +v -0.78125 0.5 1.25 +v -0.78125 0.5 -1.25 +v -0.78125 0.5 1.25 +vt 0.6614583333333334 0.4375 +vt 0.7916666666666666 0.4375 +vt 0.7916666666666666 0.4375 +vt 0.6614583333333334 0.4375 +vt 0.453125 0.4375 +vt 0.6614583333333334 0.4375 +vt 0.6614583333333334 0.4375 +vt 0.453125 0.4375 +vt 1 0.4375 +vt 1.1302083333333333 0.4375 +vt 1.1302083333333333 0.4375 +vt 1 0.4375 +vt 0.7916666666666666 0.4375 +vt 1 0.4375 +vt 1 0.4375 +vt 0.7916666666666666 0.4375 +vt 0.7916666666666666 0.4375 +vt 0.6614583333333334 0.4375 +vt 0.6614583333333334 0.6458333333333333 +vt 0.7916666666666666 0.6458333333333333 +vt 0.921875 0.6458333333333333 +vt 0.7916666666666666 0.6458333333333333 +vt 0.7916666666666666 0.4375 +vt 0.921875 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o head +v 0.40625 1.3125 -1.24375 +v 0.40625 1.3125 -1.93125 +v 0.40625 0.1875 -1.24375 +v 0.40625 0.1875 -1.93125 +v -0.40625 1.3125 -1.93125 +v -0.40625 1.3125 -1.24375 +v -0.40625 0.1875 -1.93125 +v -0.40625 0.1875 -1.24375 +vt 0.09895833333333333 0.8645833333333334 +vt 0.16666666666666666 0.8645833333333334 +vt 0.16666666666666666 0.7708333333333334 +vt 0.09895833333333333 0.7708333333333334 +vt 0.041666666666666664 0.8645833333333334 +vt 0.09895833333333333 0.8645833333333334 +vt 0.09895833333333333 0.7708333333333334 +vt 0.041666666666666664 0.7708333333333334 +vt 0.22395833333333334 0.8645833333333334 +vt 0.2916666666666667 0.8645833333333334 +vt 0.2916666666666667 0.7708333333333334 +vt 0.22395833333333334 0.7708333333333334 +vt 0.16666666666666666 0.8645833333333334 +vt 0.22395833333333334 0.8645833333333334 +vt 0.22395833333333334 0.7708333333333334 +vt 0.16666666666666666 0.7708333333333334 +vt 0.16666666666666666 0.8645833333333334 +vt 0.09895833333333333 0.8645833333333334 +vt 0.09895833333333333 0.921875 +vt 0.16666666666666666 0.921875 +vt 0.234375 0.921875 +vt 0.16666666666666666 0.921875 +vt 0.16666666666666666 0.8645833333333334 +vt 0.234375 0.8645833333333334 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o head +v 0.40625 0.375 -1.24375 +v 0.40625 0.375 -1.93125 +v 0.40625 0.375 -1.24375 +v 0.40625 0.375 -1.93125 +v -0.40625 0.375 -1.93125 +v -0.40625 0.375 -1.24375 +v -0.40625 0.375 -1.93125 +v -0.40625 0.375 -1.24375 +vt 0.09895833333333333 0.921875 +vt 0.16666666666666666 0.921875 +vt 0.16666666666666666 0.921875 +vt 0.09895833333333333 0.921875 +vt 0.041666666666666664 0.921875 +vt 0.09895833333333333 0.921875 +vt 0.09895833333333333 0.921875 +vt 0.041666666666666664 0.921875 +vt 0.22395833333333334 0.921875 +vt 0.2916666666666667 0.921875 +vt 0.2916666666666667 0.921875 +vt 0.22395833333333334 0.921875 +vt 0.16666666666666666 0.921875 +vt 0.22395833333333334 0.921875 +vt 0.22395833333333334 0.921875 +vt 0.16666666666666666 0.921875 +vt 0.16666666666666666 0.921875 +vt 0.09895833333333333 0.921875 +vt 0.09895833333333333 0.9791666666666666 +vt 0.16666666666666666 0.9791666666666666 +vt 0.234375 0.9791666666666666 +vt 0.16666666666666666 0.9791666666666666 +vt 0.16666666666666666 0.921875 +vt 0.234375 0.921875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o left_ear +v -0.4 1.3125 -1.24375 +v -0.4 1.3125 -1.68125 +v -0.4 0.125 -1.24375 +v -0.4 0.125 -1.68125 +v -0.4625 1.3125 -1.68125 +v -0.4625 1.3125 -1.24375 +v -0.4625 0.125 -1.68125 +v -0.4625 0.125 -1.24375 +vt 0.046875 0.9635416666666666 +vt 0.052083333333333336 0.9635416666666666 +vt 0.052083333333333336 0.8645833333333334 +vt 0.046875 0.8645833333333334 +vt 0.010416666666666666 0.9635416666666666 +vt 0.046875 0.9635416666666666 +vt 0.046875 0.8645833333333334 +vt 0.010416666666666666 0.8645833333333334 +vt 0.08854166666666667 0.9635416666666666 +vt 0.09375 0.9635416666666666 +vt 0.09375 0.8645833333333334 +vt 0.08854166666666667 0.8645833333333334 +vt 0.052083333333333336 0.9635416666666666 +vt 0.08854166666666667 0.9635416666666666 +vt 0.08854166666666667 0.8645833333333334 +vt 0.052083333333333336 0.8645833333333334 +vt 0.052083333333333336 0.9635416666666666 +vt 0.046875 0.9635416666666666 +vt 0.046875 1 +vt 0.052083333333333336 1 +vt 0.057291666666666664 1 +vt 0.052083333333333336 1 +vt 0.052083333333333336 0.9635416666666666 +vt 0.057291666666666664 0.9635416666666666 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o right_ear +v 0.4625 1.3125 -1.24375 +v 0.4625 1.3125 -1.68125 +v 0.4625 0.125 -1.24375 +v 0.4625 0.125 -1.68125 +v 0.4 1.3125 -1.68125 +v 0.4 1.3125 -1.24375 +v 0.4 0.125 -1.68125 +v 0.4 0.125 -1.24375 +vt 0.2864583333333333 0.9635416666666666 +vt 0.2916666666666667 0.9635416666666666 +vt 0.2916666666666667 0.8645833333333334 +vt 0.2864583333333333 0.8645833333333334 +vt 0.25 0.9635416666666666 +vt 0.2864583333333333 0.9635416666666666 +vt 0.2864583333333333 0.8645833333333334 +vt 0.25 0.8645833333333334 +vt 0.328125 0.9635416666666666 +vt 0.3333333333333333 0.9635416666666666 +vt 0.3333333333333333 0.8645833333333334 +vt 0.328125 0.8645833333333334 +vt 0.2916666666666667 0.9635416666666666 +vt 0.328125 0.9635416666666666 +vt 0.328125 0.8645833333333334 +vt 0.2916666666666667 0.8645833333333334 +vt 0.2916666666666667 0.9635416666666666 +vt 0.2864583333333333 0.9635416666666666 +vt 0.2864583333333333 1 +vt 0.2916666666666667 1 +vt 0.296875 1 +vt 0.2916666666666667 1 +vt 0.2916666666666667 0.9635416666666666 +vt 0.296875 0.9635416666666666 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o nose +v 0.40625 1.25 -1.93125 +v 0.40625 1.25 -2.49375 +v 0.40625 1.125 -1.93125 +v 0.40625 1.125 -2.49375 +v -0.40625 1.25 -2.49375 +v -0.40625 1.25 -1.93125 +v -0.40625 1.125 -2.49375 +v -0.40625 1.125 -1.93125 +vt 0.09895833333333333 0.71875 +vt 0.16666666666666666 0.71875 +vt 0.16666666666666666 0.7083333333333333 +vt 0.09895833333333333 0.7083333333333333 +vt 0.052083333333333336 0.71875 +vt 0.09895833333333333 0.71875 +vt 0.09895833333333333 0.7083333333333333 +vt 0.052083333333333336 0.7083333333333333 +vt 0.21354166666666666 0.71875 +vt 0.28125 0.71875 +vt 0.28125 0.7083333333333333 +vt 0.21354166666666666 0.7083333333333333 +vt 0.16666666666666666 0.71875 +vt 0.21354166666666666 0.71875 +vt 0.21354166666666666 0.7083333333333333 +vt 0.16666666666666666 0.7083333333333333 +vt 0.16666666666666666 0.71875 +vt 0.09895833333333333 0.71875 +vt 0.09895833333333333 0.765625 +vt 0.16666666666666666 0.765625 +vt 0.234375 0.765625 +vt 0.16666666666666666 0.765625 +vt 0.16666666666666666 0.71875 +vt 0.234375 0.71875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o lower_beak +v 0.40625 1.125 -1.93125 +v 0.40625 1.125 -2.49375 +v 0.40625 0.375 -1.93125 +v 0.40625 0.375 -2.49375 +v -0.40625 1.125 -2.49375 +v -0.40625 1.125 -1.93125 +v -0.40625 0.375 -2.49375 +v -0.40625 0.375 -1.93125 +vt 0.09895833333333333 0.65625 +vt 0.16666666666666666 0.65625 +vt 0.16666666666666666 0.59375 +vt 0.09895833333333333 0.59375 +vt 0.052083333333333336 0.65625 +vt 0.09895833333333333 0.65625 +vt 0.09895833333333333 0.59375 +vt 0.052083333333333336 0.59375 +vt 0.21354166666666666 0.65625 +vt 0.28125 0.65625 +vt 0.28125 0.59375 +vt 0.21354166666666666 0.59375 +vt 0.16666666666666666 0.65625 +vt 0.21354166666666666 0.65625 +vt 0.21354166666666666 0.59375 +vt 0.16666666666666666 0.59375 +vt 0.16666666666666666 0.65625 +vt 0.09895833333333333 0.65625 +vt 0.09895833333333333 0.703125 +vt 0.16666666666666666 0.703125 +vt 0.234375 0.703125 +vt 0.16666666666666666 0.703125 +vt 0.16666666666666666 0.65625 +vt 0.234375 0.65625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o right_front_leg +v 0.6875 0.625 -0.6875 +v 0.6875 0.625 -1.1875 +v 0.6875 0 -0.6875 +v 0.6875 0 -1.1875 +v 0.25 0.625 -1.1875 +v 0.25 0.625 -0.6875 +v 0.25 0 -1.1875 +v 0.25 0 -0.6875 +vt 0.20833333333333334 0.5052083333333333 +vt 0.24479166666666666 0.5052083333333333 +vt 0.24479166666666666 0.453125 +vt 0.20833333333333334 0.453125 +vt 0.16666666666666666 0.5052083333333333 +vt 0.20833333333333334 0.5052083333333333 +vt 0.20833333333333334 0.453125 +vt 0.16666666666666666 0.453125 +vt 0.2864583333333333 0.5052083333333333 +vt 0.3229166666666667 0.5052083333333333 +vt 0.3229166666666667 0.453125 +vt 0.2864583333333333 0.453125 +vt 0.24479166666666666 0.5052083333333333 +vt 0.2864583333333333 0.5052083333333333 +vt 0.2864583333333333 0.453125 +vt 0.24479166666666666 0.453125 +vt 0.24479166666666666 0.5052083333333333 +vt 0.20833333333333334 0.5052083333333333 +vt 0.20833333333333334 0.546875 +vt 0.24479166666666666 0.546875 +vt 0.28125 0.546875 +vt 0.24479166666666666 0.546875 +vt 0.24479166666666666 0.5052083333333333 +vt 0.28125 0.5052083333333333 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o right_mid_leg +v 0.6875 0.625 0.25 +v 0.6875 0.625 -0.25 +v 0.6875 0 0.25 +v 0.6875 0 -0.25 +v 0.25 0.625 -0.25 +v 0.25 0.625 0.25 +v 0.25 0 -0.25 +v 0.25 0 0.25 +vt 0.20833333333333334 0.41145833333333337 +vt 0.24479166666666666 0.41145833333333337 +vt 0.24479166666666666 0.359375 +vt 0.20833333333333334 0.359375 +vt 0.16666666666666666 0.41145833333333337 +vt 0.20833333333333334 0.41145833333333337 +vt 0.20833333333333334 0.359375 +vt 0.16666666666666666 0.359375 +vt 0.2864583333333333 0.41145833333333337 +vt 0.3229166666666667 0.41145833333333337 +vt 0.3229166666666667 0.359375 +vt 0.2864583333333333 0.359375 +vt 0.24479166666666666 0.41145833333333337 +vt 0.2864583333333333 0.41145833333333337 +vt 0.2864583333333333 0.359375 +vt 0.24479166666666666 0.359375 +vt 0.24479166666666666 0.41145833333333337 +vt 0.20833333333333334 0.41145833333333337 +vt 0.20833333333333334 0.453125 +vt 0.24479166666666666 0.453125 +vt 0.28125 0.453125 +vt 0.24479166666666666 0.453125 +vt 0.24479166666666666 0.41145833333333337 +vt 0.28125 0.41145833333333337 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 +o right_hind_leg +v 0.6875 0.625 1.1875 +v 0.6875 0.625 0.6875 +v 0.6875 0 1.1875 +v 0.6875 0 0.6875 +v 0.25 0.625 0.6875 +v 0.25 0.625 1.1875 +v 0.25 0 0.6875 +v 0.25 0 1.1875 +vt 0.20833333333333334 0.31770833333333337 +vt 0.24479166666666666 0.31770833333333337 +vt 0.24479166666666666 0.265625 +vt 0.20833333333333334 0.265625 +vt 0.16666666666666666 0.31770833333333337 +vt 0.20833333333333334 0.31770833333333337 +vt 0.20833333333333334 0.265625 +vt 0.16666666666666666 0.265625 +vt 0.2864583333333333 0.31770833333333337 +vt 0.3229166666666667 0.31770833333333337 +vt 0.3229166666666667 0.265625 +vt 0.2864583333333333 0.265625 +vt 0.24479166666666666 0.31770833333333337 +vt 0.2864583333333333 0.31770833333333337 +vt 0.2864583333333333 0.265625 +vt 0.24479166666666666 0.265625 +vt 0.24479166666666666 0.31770833333333337 +vt 0.20833333333333334 0.31770833333333337 +vt 0.20833333333333334 0.359375 +vt 0.24479166666666666 0.359375 +vt 0.28125 0.359375 +vt 0.24479166666666666 0.359375 +vt 0.24479166666666666 0.31770833333333337 +vt 0.28125 0.31770833333333337 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 92/268/67 95/267/67 93/266/67 90/265/67 +f 91/272/68 92/271/68 90/270/68 89/269/68 +f 96/276/69 91/275/69 89/274/69 94/273/69 +f 95/280/70 96/279/70 94/278/70 93/277/70 +f 94/284/71 89/283/71 90/282/71 93/281/71 +f 95/288/72 92/287/72 91/286/72 96/285/72 +o left_front_leg +v -0.25 0.625 -0.6875 +v -0.25 0.625 -1.1875 +v -0.25 0 -0.6875 +v -0.25 0 -1.1875 +v -0.6875 0.625 -1.1875 +v -0.6875 0.625 -0.6875 +v -0.6875 0 -1.1875 +v -0.6875 0 -0.6875 +vt 0.041666666666666664 0.5052083333333333 +vt 0.078125 0.5052083333333333 +vt 0.078125 0.453125 +vt 0.041666666666666664 0.453125 +vt 0 0.5052083333333333 +vt 0.041666666666666664 0.5052083333333333 +vt 0.041666666666666664 0.453125 +vt 0 0.453125 +vt 0.11979166666666667 0.5052083333333333 +vt 0.15625 0.5052083333333333 +vt 0.15625 0.453125 +vt 0.11979166666666667 0.453125 +vt 0.078125 0.5052083333333333 +vt 0.11979166666666667 0.5052083333333333 +vt 0.11979166666666667 0.453125 +vt 0.078125 0.453125 +vt 0.078125 0.5052083333333333 +vt 0.041666666666666664 0.5052083333333333 +vt 0.041666666666666664 0.546875 +vt 0.078125 0.546875 +vt 0.11458333333333333 0.546875 +vt 0.078125 0.546875 +vt 0.078125 0.5052083333333333 +vt 0.11458333333333333 0.5052083333333333 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 100/292/73 103/291/73 101/290/73 98/289/73 +f 99/296/74 100/295/74 98/294/74 97/293/74 +f 104/300/75 99/299/75 97/298/75 102/297/75 +f 103/304/76 104/303/76 102/302/76 101/301/76 +f 102/308/77 97/307/77 98/306/77 101/305/77 +f 103/312/78 100/311/78 99/310/78 104/309/78 +o left_mid_leg +v -0.25 0.625 0.25 +v -0.25 0.625 -0.25 +v -0.25 0 0.25 +v -0.25 0 -0.25 +v -0.6875 0.625 -0.25 +v -0.6875 0.625 0.25 +v -0.6875 0 -0.25 +v -0.6875 0 0.25 +vt 0.041666666666666664 0.41145833333333337 +vt 0.078125 0.41145833333333337 +vt 0.078125 0.359375 +vt 0.041666666666666664 0.359375 +vt 0 0.41145833333333337 +vt 0.041666666666666664 0.41145833333333337 +vt 0.041666666666666664 0.359375 +vt 0 0.359375 +vt 0.11979166666666667 0.41145833333333337 +vt 0.15625 0.41145833333333337 +vt 0.15625 0.359375 +vt 0.11979166666666667 0.359375 +vt 0.078125 0.41145833333333337 +vt 0.11979166666666667 0.41145833333333337 +vt 0.11979166666666667 0.359375 +vt 0.078125 0.359375 +vt 0.078125 0.41145833333333337 +vt 0.041666666666666664 0.41145833333333337 +vt 0.041666666666666664 0.453125 +vt 0.078125 0.453125 +vt 0.11458333333333333 0.453125 +vt 0.078125 0.453125 +vt 0.078125 0.41145833333333337 +vt 0.11458333333333333 0.41145833333333337 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 108/316/79 111/315/79 109/314/79 106/313/79 +f 107/320/80 108/319/80 106/318/80 105/317/80 +f 112/324/81 107/323/81 105/322/81 110/321/81 +f 111/328/82 112/327/82 110/326/82 109/325/82 +f 110/332/83 105/331/83 106/330/83 109/329/83 +f 111/336/84 108/335/84 107/334/84 112/333/84 +o left_hind_leg +v -0.25 0.625 1.1875 +v -0.25 0.625 0.6875 +v -0.25 0 1.1875 +v -0.25 0 0.6875 +v -0.6875 0.625 0.6875 +v -0.6875 0.625 1.1875 +v -0.6875 0 0.6875 +v -0.6875 0 1.1875 +vt 0.041666666666666664 0.31770833333333337 +vt 0.078125 0.31770833333333337 +vt 0.078125 0.265625 +vt 0.041666666666666664 0.265625 +vt 0 0.31770833333333337 +vt 0.041666666666666664 0.31770833333333337 +vt 0.041666666666666664 0.265625 +vt 0 0.265625 +vt 0.11979166666666667 0.31770833333333337 +vt 0.15625 0.31770833333333337 +vt 0.15625 0.265625 +vt 0.11979166666666667 0.265625 +vt 0.078125 0.31770833333333337 +vt 0.11979166666666667 0.31770833333333337 +vt 0.11979166666666667 0.265625 +vt 0.078125 0.265625 +vt 0.078125 0.31770833333333337 +vt 0.041666666666666664 0.31770833333333337 +vt 0.041666666666666664 0.359375 +vt 0.078125 0.359375 +vt 0.11458333333333333 0.359375 +vt 0.078125 0.359375 +vt 0.078125 0.31770833333333337 +vt 0.11458333333333333 0.31770833333333337 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 +f 116/340/85 119/339/85 117/338/85 114/337/85 +f 115/344/86 116/343/86 114/342/86 113/341/86 +f 120/348/87 115/347/87 113/346/87 118/345/87 +f 119/352/88 120/351/88 118/350/88 117/349/88 +f 118/356/89 113/355/89 114/354/89 117/353/89 +f 119/360/90 116/359/90 115/358/90 120/357/90 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/spider.obj b/prismarine-viewer/viewer/lib/entity/models/spider.obj new file mode 100644 index 00000000..eb636839 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/spider.obj @@ -0,0 +1,509 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o head +v 0.25 0.8125 -0.1875 +v 0.25 0.8125 -0.6875 +v 0.25 0.3125 -0.1875 +v 0.25 0.3125 -0.6875 +v -0.25 0.8125 -0.6875 +v -0.25 0.8125 -0.1875 +v -0.25 0.3125 -0.6875 +v -0.25 0.3125 -0.1875 +vt 0.625 0.625 +vt 0.75 0.625 +vt 0.75 0.375 +vt 0.625 0.375 +vt 0.5 0.625 +vt 0.625 0.625 +vt 0.625 0.375 +vt 0.5 0.375 +vt 0.875 0.625 +vt 1 0.625 +vt 1 0.375 +vt 0.875 0.375 +vt 0.75 0.625 +vt 0.875 0.625 +vt 0.875 0.375 +vt 0.75 0.375 +vt 0.75 0.625 +vt 0.625 0.625 +vt 0.625 0.875 +vt 0.75 0.875 +vt 0.875 0.875 +vt 0.75 0.875 +vt 0.75 0.625 +vt 0.875 0.625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o body0 +v 0.1875 0.75 0.1875 +v 0.1875 0.75 -0.1875 +v 0.1875 0.375 0.1875 +v 0.1875 0.375 -0.1875 +v -0.1875 0.75 -0.1875 +v -0.1875 0.75 0.1875 +v -0.1875 0.375 -0.1875 +v -0.1875 0.375 0.1875 +vt 0.09375 0.8125 +vt 0.1875 0.8125 +vt 0.1875 0.625 +vt 0.09375 0.625 +vt 0 0.8125 +vt 0.09375 0.8125 +vt 0.09375 0.625 +vt 0 0.625 +vt 0.28125 0.8125 +vt 0.375 0.8125 +vt 0.375 0.625 +vt 0.28125 0.625 +vt 0.1875 0.8125 +vt 0.28125 0.8125 +vt 0.28125 0.625 +vt 0.1875 0.625 +vt 0.1875 0.8125 +vt 0.09375 0.8125 +vt 0.09375 1 +vt 0.1875 1 +vt 0.28125 1 +vt 0.1875 1 +vt 0.1875 0.8125 +vt 0.28125 0.8125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o body1 +v 0.3125 0.8125 0.9375 +v 0.3125 0.8125 0.1875 +v 0.3125 0.3125 0.9375 +v 0.3125 0.3125 0.1875 +v -0.3125 0.8125 0.1875 +v -0.3125 0.8125 0.9375 +v -0.3125 0.3125 0.1875 +v -0.3125 0.3125 0.9375 +vt 0.1875 0.25 +vt 0.34375 0.25 +vt 0.34375 0 +vt 0.1875 0 +vt 0 0.25 +vt 0.1875 0.25 +vt 0.1875 0 +vt 0 0 +vt 0.53125 0.25 +vt 0.6875 0.25 +vt 0.6875 0 +vt 0.53125 0 +vt 0.34375 0.25 +vt 0.53125 0.25 +vt 0.53125 0 +vt 0.34375 0 +vt 0.34375 0.25 +vt 0.1875 0.25 +vt 0.1875 0.625 +vt 0.34375 0.625 +vt 0.5 0.625 +vt 0.34375 0.625 +vt 0.34375 0.25 +vt 0.5 0.25 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o leg0 +v 0.7316941738241591 0.16919417382415936 0.8321067811865475 +v 0.7941941738241591 0.10669417382415936 0.743718433538229 +v 0.6433058261758406 0.08080582617584087 0.8321067811865475 +v 0.7058058261758406 0.018305826175840867 0.743718433538229 +v 0.29419417382415913 0.6066941738241591 0.03661165235168151 +v 0.23169417382415913 0.6691941738241591 0.125 +v 0.20580582617584076 0.5183058261758409 0.03661165235168151 +v 0.14330582617584076 0.5808058261758409 0.125 +vt 0.3125 0.9375 +vt 0.5625 0.9375 +vt 0.5625 0.875 +vt 0.3125 0.875 +vt 0.28125 0.9375 +vt 0.3125 0.9375 +vt 0.3125 0.875 +vt 0.28125 0.875 +vt 0.59375 0.9375 +vt 0.84375 0.9375 +vt 0.84375 0.875 +vt 0.59375 0.875 +vt 0.5625 0.9375 +vt 0.59375 0.9375 +vt 0.59375 0.875 +vt 0.5625 0.875 +vt 0.5625 0.9375 +vt 0.3125 0.9375 +vt 0.3125 1 +vt 0.5625 1 +vt 0.8125 1 +vt 0.5625 1 +vt 0.5625 0.9375 +vt 0.8125 0.9375 +vn 0.5 -0.5 -0.7071067811865476 +vn 0.5 -0.5 0.7071067811865477 +vn -0.5 0.5 0.7071067811865476 +vn -0.5 0.5 -0.7071067811865477 +vn 0.7071067811865477 0.7071067811865476 0 +vn -0.7071067811865477 -0.7071067811865476 0 +usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o leg1 +v -0.23169417382415913 0.6691941738241591 0.125 +v -0.29419417382415913 0.6066941738241591 0.03661165235168151 +v -0.14330582617584076 0.5808058261758409 0.125 +v -0.20580582617584076 0.5183058261758409 0.03661165235168151 +v -0.794194173824159 0.10669417382415936 0.743718433538229 +v -0.731694173824159 0.16919417382415936 0.8321067811865475 +v -0.7058058261758406 0.018305826175840867 0.743718433538229 +v -0.6433058261758406 0.08080582617584087 0.8321067811865475 +vt 0.3125 0.9375 +vt 0.5625 0.9375 +vt 0.5625 0.875 +vt 0.3125 0.875 +vt 0.28125 0.9375 +vt 0.3125 0.9375 +vt 0.3125 0.875 +vt 0.28125 0.875 +vt 0.59375 0.9375 +vt 0.84375 0.9375 +vt 0.84375 0.875 +vt 0.59375 0.875 +vt 0.5625 0.9375 +vt 0.59375 0.9375 +vt 0.59375 0.875 +vt 0.5625 0.875 +vt 0.5625 0.9375 +vt 0.3125 0.9375 +vt 0.3125 1 +vt 0.5625 1 +vt 0.8125 1 +vt 0.5625 1 +vt 0.5625 0.9375 +vt 0.8125 0.9375 +vn -0.5 -0.5 -0.7071067811865476 +vn 0.5 0.5 -0.7071067811865477 +vn 0.5 0.5 0.7071067811865476 +vn -0.5 -0.5 0.7071067811865477 +vn -0.7071067811865477 0.7071067811865476 0 +vn 0.7071067811865477 -0.7071067811865476 0 +usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o leg2 +v 1.0143853759373593 0.10357000946898909 0.36551321892668 +v 1.0408868946744412 0.08501344627527851 0.2447724906405464 +v 0.9426883213934785 0.0011760039328650995 0.36551321892668 +v 0.9691898401305603 -0.017380559260845474 0.2447724906405464 +v 0.24964677943821734 0.6390457394976019 -0.014046554461974337 +v 0.2231452607011355 0.6576023026913125 0.10669417382415924 +v 0.17794972489433658 0.5366517339614778 -0.014046554461974337 +v 0.15144820615725474 0.5552082971551884 0.10669417382415924 +vt 0.3125 0.9375 +vt 0.5625 0.9375 +vt 0.5625 0.875 +vt 0.3125 0.875 +vt 0.28125 0.9375 +vt 0.3125 0.9375 +vt 0.3125 0.875 +vt 0.28125 0.875 +vt 0.59375 0.9375 +vt 0.84375 0.9375 +vt 0.84375 0.875 +vt 0.59375 0.875 +vt 0.5625 0.9375 +vt 0.59375 0.9375 +vt 0.59375 0.875 +vt 0.5625 0.875 +vt 0.5625 0.9375 +vt 0.3125 0.9375 +vt 0.3125 1 +vt 0.5625 1 +vt 0.8125 1 +vt 0.5625 1 +vt 0.5625 0.9375 +vt 0.8125 0.9375 +vn 0.21201214989665462 -0.1484525055496845 -0.9659258262890683 +vn 0.7912401152362238 -0.5540322932223234 0.25881904510252074 +vn -0.21201214989665462 0.1484525055496845 0.9659258262890683 +vn -0.7912401152362238 0.5540322932223234 -0.25881904510252074 +vn 0.5735764363510462 0.8191520442889919 1.387778780781446e-17 +vn -0.5735764363510462 -0.8191520442889919 -1.387778780781446e-17 +usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o leg3 +v -0.2231452607011355 0.6576023026913125 0.10669417382415924 +v -0.24964677943821734 0.6390457394976019 -0.014046554461974337 +v -0.15144820615725474 0.5552082971551884 0.10669417382415924 +v -0.17794972489433658 0.5366517339614778 -0.014046554461974337 +v -1.0408868946744412 0.08501344627527851 0.2447724906405464 +v -1.0143853759373593 0.10357000946898909 0.36551321892668 +v -0.9691898401305603 -0.017380559260845474 0.2447724906405464 +v -0.9426883213934785 0.0011760039328650995 0.36551321892668 +vt 0.3125 0.9375 +vt 0.5625 0.9375 +vt 0.5625 0.875 +vt 0.3125 0.875 +vt 0.28125 0.9375 +vt 0.3125 0.9375 +vt 0.3125 0.875 +vt 0.28125 0.875 +vt 0.59375 0.9375 +vt 0.84375 0.9375 +vt 0.84375 0.875 +vt 0.59375 0.875 +vt 0.5625 0.9375 +vt 0.59375 0.9375 +vt 0.59375 0.875 +vt 0.5625 0.875 +vt 0.5625 0.9375 +vt 0.3125 0.9375 +vt 0.3125 1 +vt 0.5625 1 +vt 0.8125 1 +vt 0.5625 1 +vt 0.5625 0.9375 +vt 0.8125 0.9375 +vn -0.21201214989665462 -0.1484525055496845 -0.9659258262890683 +vn 0.7912401152362238 0.5540322932223234 -0.25881904510252074 +vn 0.21201214989665462 0.1484525055496845 0.9659258262890683 +vn -0.7912401152362238 -0.5540322932223234 0.25881904510252074 +vn -0.5735764363510462 0.8191520442889919 1.387778780781446e-17 +vn 0.5735764363510462 -0.8191520442889919 -1.387778780781446e-17 +usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o leg4 +v 1.0408868946744412 0.08501344627527851 -0.1822724906405464 +v 1.0143853759373593 0.10357000946898909 -0.30301321892668 +v 0.9691898401305603 -0.017380559260845474 -0.1822724906405464 +v 0.9426883213934785 0.0011760039328650995 -0.30301321892668 +v 0.2231452607011355 0.6576023026913125 -0.044194173824159244 +v 0.24964677943821734 0.6390457394976019 0.07654655446197434 +v 0.15144820615725474 0.5552082971551884 -0.044194173824159244 +v 0.17794972489433658 0.5366517339614778 0.07654655446197434 +vt 0.3125 0.9375 +vt 0.5625 0.9375 +vt 0.5625 0.875 +vt 0.3125 0.875 +vt 0.28125 0.9375 +vt 0.3125 0.9375 +vt 0.3125 0.875 +vt 0.28125 0.875 +vt 0.59375 0.9375 +vt 0.84375 0.9375 +vt 0.84375 0.875 +vt 0.59375 0.875 +vt 0.5625 0.9375 +vt 0.59375 0.9375 +vt 0.59375 0.875 +vt 0.5625 0.875 +vt 0.5625 0.9375 +vt 0.3125 0.9375 +vt 0.3125 1 +vt 0.5625 1 +vt 0.8125 1 +vt 0.5625 1 +vt 0.5625 0.9375 +vt 0.8125 0.9375 +vn -0.21201214989665462 0.1484525055496845 -0.9659258262890683 +vn 0.7912401152362238 -0.5540322932223234 -0.25881904510252074 +vn 0.21201214989665462 -0.1484525055496845 0.9659258262890683 +vn -0.7912401152362238 0.5540322932223234 0.25881904510252074 +vn 0.5735764363510462 0.8191520442889919 -1.387778780781446e-17 +vn -0.5735764363510462 -0.8191520442889919 1.387778780781446e-17 +usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o leg5 +v -0.24964677943821734 0.6390457394976019 0.07654655446197434 +v -0.2231452607011355 0.6576023026913125 -0.044194173824159244 +v -0.17794972489433658 0.5366517339614778 0.07654655446197434 +v -0.15144820615725474 0.5552082971551884 -0.044194173824159244 +v -1.0143853759373593 0.10357000946898909 -0.30301321892668 +v -1.0408868946744412 0.08501344627527851 -0.1822724906405464 +v -0.9426883213934785 0.0011760039328650995 -0.30301321892668 +v -0.9691898401305603 -0.017380559260845474 -0.1822724906405464 +vt 0.3125 0.9375 +vt 0.5625 0.9375 +vt 0.5625 0.875 +vt 0.3125 0.875 +vt 0.28125 0.9375 +vt 0.3125 0.9375 +vt 0.3125 0.875 +vt 0.28125 0.875 +vt 0.59375 0.9375 +vt 0.84375 0.9375 +vt 0.84375 0.875 +vt 0.59375 0.875 +vt 0.5625 0.9375 +vt 0.59375 0.9375 +vt 0.59375 0.875 +vt 0.5625 0.875 +vt 0.5625 0.9375 +vt 0.3125 0.9375 +vt 0.3125 1 +vt 0.5625 1 +vt 0.8125 1 +vt 0.5625 1 +vt 0.5625 0.9375 +vt 0.8125 0.9375 +vn 0.21201214989665462 0.1484525055496845 -0.9659258262890683 +vn 0.7912401152362238 0.5540322932223234 0.25881904510252074 +vn -0.21201214989665462 -0.1484525055496845 0.9659258262890683 +vn -0.7912401152362238 -0.5540322932223234 -0.25881904510252074 +vn -0.5735764363510462 0.8191520442889919 -1.387778780781446e-17 +vn 0.5735764363510462 -0.8191520442889919 1.387778780781446e-17 +usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o leg6 +v 0.7941941738241591 0.10669417382415936 -0.681218433538229 +v 0.7316941738241591 0.16919417382415936 -0.7696067811865475 +v 0.7058058261758406 0.018305826175840867 -0.681218433538229 +v 0.6433058261758406 0.08080582617584087 -0.7696067811865475 +v 0.23169417382415913 0.6691941738241591 -0.0625 +v 0.29419417382415913 0.6066941738241591 0.025888347648318488 +v 0.14330582617584076 0.5808058261758409 -0.0625 +v 0.20580582617584076 0.5183058261758409 0.025888347648318488 +vt 0.3125 0.9375 +vt 0.5625 0.9375 +vt 0.5625 0.875 +vt 0.3125 0.875 +vt 0.28125 0.9375 +vt 0.3125 0.9375 +vt 0.3125 0.875 +vt 0.28125 0.875 +vt 0.59375 0.9375 +vt 0.84375 0.9375 +vt 0.84375 0.875 +vt 0.59375 0.875 +vt 0.5625 0.9375 +vt 0.59375 0.9375 +vt 0.59375 0.875 +vt 0.5625 0.875 +vt 0.5625 0.9375 +vt 0.3125 0.9375 +vt 0.3125 1 +vt 0.5625 1 +vt 0.8125 1 +vt 0.5625 1 +vt 0.5625 0.9375 +vt 0.8125 0.9375 +vn -0.5 0.5 -0.7071067811865476 +vn 0.5 -0.5 -0.7071067811865477 +vn 0.5 -0.5 0.7071067811865476 +vn -0.5 0.5 0.7071067811865477 +vn 0.7071067811865477 0.7071067811865476 0 +vn -0.7071067811865477 -0.7071067811865476 0 +usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o leg7 +v -0.29419417382415913 0.6066941738241591 0.025888347648318488 +v -0.23169417382415913 0.6691941738241591 -0.0625 +v -0.20580582617584076 0.5183058261758409 0.025888347648318488 +v -0.14330582617584076 0.5808058261758409 -0.0625 +v -0.731694173824159 0.16919417382415936 -0.7696067811865475 +v -0.794194173824159 0.10669417382415936 -0.681218433538229 +v -0.6433058261758406 0.08080582617584087 -0.7696067811865475 +v -0.7058058261758406 0.018305826175840867 -0.681218433538229 +vt 0.3125 0.9375 +vt 0.5625 0.9375 +vt 0.5625 0.875 +vt 0.3125 0.875 +vt 0.28125 0.9375 +vt 0.3125 0.9375 +vt 0.3125 0.875 +vt 0.28125 0.875 +vt 0.59375 0.9375 +vt 0.84375 0.9375 +vt 0.84375 0.875 +vt 0.59375 0.875 +vt 0.5625 0.9375 +vt 0.59375 0.9375 +vt 0.59375 0.875 +vt 0.5625 0.875 +vt 0.5625 0.9375 +vt 0.3125 0.9375 +vt 0.3125 1 +vt 0.5625 1 +vt 0.8125 1 +vt 0.5625 1 +vt 0.5625 0.9375 +vt 0.8125 0.9375 +vn 0.5 0.5 -0.7071067811865476 +vn 0.5 0.5 0.7071067811865477 +vn -0.5 -0.5 0.7071067811865476 +vn -0.5 -0.5 -0.7071067811865477 +vn -0.7071067811865477 0.7071067811865476 0 +vn 0.7071067811865477 -0.7071067811865476 0 +usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/tadpole.obj b/prismarine-viewer/viewer/lib/entity/models/tadpole.obj new file mode 100644 index 00000000..b38c8a26 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/tadpole.obj @@ -0,0 +1,95 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.09375 0.1875 0.03125 +v 0.09375 0.1875 -0.15625 +v 0.09375 0.0625 0.03125 +v 0.09375 0.0625 -0.15625 +v -0.09375 0.1875 -0.15625 +v -0.09375 0.1875 0.03125 +v -0.09375 0.0625 -0.15625 +v -0.09375 0.0625 0.03125 +vt 0.1875 0.8125 +vt 0.375 0.8125 +vt 0.375 0.6875 +vt 0.1875 0.6875 +vt 0 0.8125 +vt 0.1875 0.8125 +vt 0.1875 0.6875 +vt 0 0.6875 +vt 0.5625 0.8125 +vt 0.75 0.8125 +vt 0.75 0.6875 +vt 0.5625 0.6875 +vt 0.375 0.8125 +vt 0.5625 0.8125 +vt 0.5625 0.6875 +vt 0.375 0.6875 +vt 0.375 0.8125 +vt 0.1875 0.8125 +vt 0.1875 1 +vt 0.375 1 +vt 0.5625 1 +vt 0.375 1 +vt 0.375 0.8125 +vt 0.5625 0.8125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_71a3df64-a731-05a3-e848-ff24e21209ec +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o tail +v 0 0.1875 0.40625 +v 0 0.1875 -0.03125 +v 0 0.0625 0.40625 +v 0 0.0625 -0.03125 +v 0 0.1875 -0.03125 +v 0 0.1875 0.40625 +v 0 0.0625 -0.03125 +v 0 0.0625 0.40625 +vt 0.4375 0.5625 +vt 0.4375 0.5625 +vt 0.4375 0.4375 +vt 0.4375 0.4375 +vt 0 0.5625 +vt 0.4375 0.5625 +vt 0.4375 0.4375 +vt 0 0.4375 +vt 0.875 0.5625 +vt 0.875 0.5625 +vt 0.875 0.4375 +vt 0.875 0.4375 +vt 0.4375 0.5625 +vt 0.875 0.5625 +vt 0.875 0.4375 +vt 0.4375 0.4375 +vt 0.4375 0.5625 +vt 0.4375 0.5625 +vt 0.4375 1 +vt 0.4375 1 +vt 0.4375 1 +vt 0.4375 1 +vt 0.4375 0.5625 +vt 0.4375 0.5625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_71a3df64-a731-05a3-e848-ff24e21209ec +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/turtle.obj b/prismarine-viewer/viewer/lib/entity/models/turtle.obj new file mode 100644 index 00000000..ac0d41b9 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/turtle.obj @@ -0,0 +1,371 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.59375 0.5625 -0.4375000000000001 +v 0.59375 0.1875 -0.4375000000000001 +v 0.59375 0.5624999999999996 0.8125 +v 0.59375 0.18749999999999956 0.8125 +v -0.59375 0.1875 -0.4375000000000001 +v -0.59375 0.5625 -0.4375000000000001 +v -0.59375 0.18749999999999956 0.8125 +v -0.59375 0.5624999999999996 0.8125 +vt 0.1015625 0.328125 +vt 0.25 0.328125 +vt 0.25 0.015625 +vt 0.1015625 0.015625 +vt 0.0546875 0.328125 +vt 0.1015625 0.328125 +vt 0.1015625 0.015625 +vt 0.0546875 0.015625 +vt 0.296875 0.328125 +vt 0.4453125 0.328125 +vt 0.4453125 0.015625 +vt 0.296875 0.015625 +vt 0.25 0.328125 +vt 0.296875 0.328125 +vt 0.296875 0.015625 +vt 0.25 0.015625 +vt 0.25 0.328125 +vt 0.1015625 0.328125 +vt 0.1015625 0.421875 +vt 0.25 0.421875 +vt 0.3984375 0.421875 +vt 0.25 0.421875 +vt 0.25 0.328125 +vt 0.3984375 0.328125 +vn 0 -1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 -1 +vn 0 -2.220446049250313e-16 1 +usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o body +v 0.34375 0.1875 -0.4375000000000001 +v 0.34375 0 -0.4375000000000002 +v 0.34375 0.18749999999999978 0.6874999999999998 +v 0.34375 -2.220446049250313e-16 0.6874999999999998 +v -0.34375 0 -0.4375000000000002 +v -0.34375 0.1875 -0.4375000000000001 +v -0.34375 -2.220446049250313e-16 0.6874999999999998 +v -0.34375 0.18749999999999978 0.6874999999999998 +vt 0.265625 0.9375 +vt 0.3515625 0.9375 +vt 0.3515625 0.65625 +vt 0.265625 0.65625 +vt 0.2421875 0.9375 +vt 0.265625 0.9375 +vt 0.265625 0.65625 +vt 0.2421875 0.65625 +vt 0.375 0.9375 +vt 0.4609375 0.9375 +vt 0.4609375 0.65625 +vt 0.375 0.65625 +vt 0.3515625 0.9375 +vt 0.375 0.9375 +vt 0.375 0.65625 +vt 0.3515625 0.65625 +vt 0.3515625 0.9375 +vt 0.265625 0.9375 +vt 0.265625 0.984375 +vt 0.3515625 0.984375 +vt 0.4375 0.984375 +vt 0.3515625 0.984375 +vt 0.3515625 0.9375 +vt 0.4375 0.9375 +vn 0 -1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 -1 +vn 0 -2.220446049250313e-16 1 +usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o eggbelly +v 0.28125 0 -0.4375000000000002 +v 0.28125 -0.0625 -0.4375000000000002 +v 0.28125 -2.220446049250313e-16 0.6874999999999998 +v 0.28125 -0.06250000000000022 0.6874999999999998 +v -0.28125 -0.0625 -0.4375000000000002 +v -0.28125 0 -0.4375000000000002 +v -0.28125 -0.06250000000000022 0.6874999999999998 +v -0.28125 -2.220446049250313e-16 0.6874999999999998 +vt 0.5546875 0.46875 +vt 0.625 0.46875 +vt 0.625 0.1875 +vt 0.5546875 0.1875 +vt 0.546875 0.46875 +vt 0.5546875 0.46875 +vt 0.5546875 0.1875 +vt 0.546875 0.1875 +vt 0.6328125 0.46875 +vt 0.703125 0.46875 +vt 0.703125 0.1875 +vt 0.6328125 0.1875 +vt 0.625 0.46875 +vt 0.6328125 0.46875 +vt 0.6328125 0.1875 +vt 0.625 0.1875 +vt 0.625 0.46875 +vt 0.5546875 0.46875 +vt 0.5546875 0.484375 +vt 0.625 0.484375 +vt 0.6953125 0.484375 +vt 0.625 0.484375 +vt 0.625 0.46875 +vt 0.6953125 0.46875 +vn 0 -1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 -1 +vn 0 -2.220446049250313e-16 1 +usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o head +v 0.1875 0.375 -0.4375 +v 0.1875 0.375 -0.8125 +v 0.1875 0.0625 -0.4375 +v 0.1875 0.0625 -0.8125 +v -0.1875 0.375 -0.8125 +v -0.1875 0.375 -0.4375 +v -0.1875 0.0625 -0.8125 +v -0.1875 0.0625 -0.4375 +vt 0.0703125 0.90625 +vt 0.1171875 0.90625 +vt 0.1171875 0.828125 +vt 0.0703125 0.828125 +vt 0.0234375 0.90625 +vt 0.0703125 0.90625 +vt 0.0703125 0.828125 +vt 0.0234375 0.828125 +vt 0.1640625 0.90625 +vt 0.2109375 0.90625 +vt 0.2109375 0.828125 +vt 0.1640625 0.828125 +vt 0.1171875 0.90625 +vt 0.1640625 0.90625 +vt 0.1640625 0.828125 +vt 0.1171875 0.828125 +vt 0.1171875 0.90625 +vt 0.0703125 0.90625 +vt 0.0703125 1 +vt 0.1171875 1 +vt 0.1640625 1 +vt 0.1171875 1 +vt 0.1171875 0.90625 +vt 0.1640625 0.90625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o leg0 +v 0.34375 0.125 1.3125 +v 0.34375 0.125 0.6875 +v 0.34375 0.0625 1.3125 +v 0.34375 0.0625 0.6875 +v 0.09375 0.125 0.6875 +v 0.09375 0.125 1.3125 +v 0.09375 0.0625 0.6875 +v 0.09375 0.0625 1.3125 +vt 0.0859375 0.484375 +vt 0.1171875 0.484375 +vt 0.1171875 0.46875 +vt 0.0859375 0.46875 +vt 0.0078125 0.484375 +vt 0.0859375 0.484375 +vt 0.0859375 0.46875 +vt 0.0078125 0.46875 +vt 0.1953125 0.484375 +vt 0.2265625 0.484375 +vt 0.2265625 0.46875 +vt 0.1953125 0.46875 +vt 0.1171875 0.484375 +vt 0.1953125 0.484375 +vt 0.1953125 0.46875 +vt 0.1171875 0.46875 +vt 0.1171875 0.484375 +vt 0.0859375 0.484375 +vt 0.0859375 0.640625 +vt 0.1171875 0.640625 +vt 0.1484375 0.640625 +vt 0.1171875 0.640625 +vt 0.1171875 0.484375 +vt 0.1484375 0.484375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o leg1 +v -0.09375 0.125 1.3125 +v -0.09375 0.125 0.6875 +v -0.09375 0.0625 1.3125 +v -0.09375 0.0625 0.6875 +v -0.34375 0.125 0.6875 +v -0.34375 0.125 1.3125 +v -0.34375 0.0625 0.6875 +v -0.34375 0.0625 1.3125 +vt 0.0859375 0.65625 +vt 0.1171875 0.65625 +vt 0.1171875 0.640625 +vt 0.0859375 0.640625 +vt 0.0078125 0.65625 +vt 0.0859375 0.65625 +vt 0.0859375 0.640625 +vt 0.0078125 0.640625 +vt 0.1953125 0.65625 +vt 0.2265625 0.65625 +vt 0.2265625 0.640625 +vt 0.1953125 0.640625 +vt 0.1171875 0.65625 +vt 0.1953125 0.65625 +vt 0.1953125 0.640625 +vt 0.1171875 0.640625 +vt 0.1171875 0.65625 +vt 0.0859375 0.65625 +vt 0.0859375 0.8125 +vt 0.1171875 0.8125 +vt 0.1484375 0.8125 +vt 0.1171875 0.8125 +vt 0.1171875 0.65625 +vt 0.1484375 0.65625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o leg2 +v 1.0800972660098695 0.1875 0.07574059804416988 +v 1.1343623215307852 0.1875 -0.2320118247721451 +v 1.0800972660098695 0.125 0.07574059804416988 +v 1.1343623215307852 0.125 -0.2320118247721451 +v 0.33420602220836626 0.1875 -0.373100969126526 +v 0.2799409666874506 0.1875 -0.06534854631021103 +v 0.33420602220836626 0.125 -0.373100969126526 +v 0.2799409666874506 0.125 -0.06534854631021103 +vt 0.25 0.453125 +vt 0.3515625 0.453125 +vt 0.3515625 0.4375 +vt 0.25 0.4375 +vt 0.2109375 0.453125 +vt 0.25 0.453125 +vt 0.25 0.4375 +vt 0.2109375 0.4375 +vt 0.390625 0.453125 +vt 0.4921875 0.453125 +vt 0.4921875 0.4375 +vt 0.390625 0.4375 +vt 0.3515625 0.453125 +vt 0.390625 0.453125 +vt 0.390625 0.4375 +vt 0.3515625 0.4375 +vt 0.3515625 0.453125 +vt 0.25 0.453125 +vt 0.25 0.53125 +vt 0.3515625 0.53125 +vt 0.453125 0.53125 +vt 0.3515625 0.53125 +vt 0.3515625 0.453125 +vt 0.453125 0.453125 +vn 0.17364817766693033 0 -0.984807753012208 +vn 0.984807753012208 0 0.17364817766693033 +vn -0.17364817766693033 0 0.984807753012208 +vn -0.984807753012208 0 -0.17364817766693033 +vn 0 1 0 +vn 0 -1 0 +usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o leg3 +v -0.27994096668745055 0.1875 -0.06534854631021103 +v -0.3342060222083663 0.1875 -0.373100969126526 +v -0.27994096668745055 0.125 -0.06534854631021103 +v -0.3342060222083663 0.125 -0.373100969126526 +v -1.1343623215307852 0.1875 -0.2320118247721451 +v -1.0800972660098695 0.1875 0.07574059804416988 +v -1.1343623215307852 0.125 -0.2320118247721451 +v -1.0800972660098695 0.125 0.07574059804416988 +vt 0.25 0.546875 +vt 0.3515625 0.546875 +vt 0.3515625 0.53125 +vt 0.25 0.53125 +vt 0.2109375 0.546875 +vt 0.25 0.546875 +vt 0.25 0.53125 +vt 0.2109375 0.53125 +vt 0.390625 0.546875 +vt 0.4921875 0.546875 +vt 0.4921875 0.53125 +vt 0.390625 0.53125 +vt 0.3515625 0.546875 +vt 0.390625 0.546875 +vt 0.390625 0.53125 +vt 0.3515625 0.53125 +vt 0.3515625 0.546875 +vt 0.25 0.546875 +vt 0.25 0.625 +vt 0.3515625 0.625 +vt 0.453125 0.625 +vt 0.3515625 0.625 +vt 0.3515625 0.546875 +vt 0.453125 0.546875 +vn -0.17364817766693033 0 -0.984807753012208 +vn 0.984807753012208 0 -0.17364817766693033 +vn 0.17364817766693033 0 0.984807753012208 +vn -0.984807753012208 0 0.17364817766693033 +vn 0 1 0 +vn 0 -1 0 +usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/vex.obj b/prismarine-viewer/viewer/lib/entity/models/vex.obj new file mode 100644 index 00000000..63d99f88 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/vex.obj @@ -0,0 +1,325 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.09375 0.25 0.0625 +v 0.09375 0.25 -0.0625 +v 0.09375 0 0.0625 +v 0.09375 0 -0.0625 +v -0.09375 0.25 -0.0625 +v -0.09375 0.25 0.0625 +v -0.09375 0 -0.0625 +v -0.09375 0 0.0625 +vt 0.0625 0.625 +vt 0.15625 0.625 +vt 0.15625 0.5 +vt 0.0625 0.5 +vt 0 0.625 +vt 0.0625 0.625 +vt 0.0625 0.5 +vt 0 0.5 +vt 0.21875 0.625 +vt 0.3125 0.625 +vt 0.3125 0.5 +vt 0.21875 0.5 +vt 0.15625 0.625 +vt 0.21875 0.625 +vt 0.21875 0.5 +vt 0.15625 0.5 +vt 0.15625 0.625 +vt 0.0625 0.625 +vt 0.0625 0.6875 +vt 0.15625 0.6875 +vt 0.25 0.6875 +vt 0.15625 0.6875 +vt 0.15625 0.625 +vt 0.25 0.625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_f88b8145-cdbb-8011-03d2-81deb45b4e43 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o body +v 0.08125000000000004 0.17500000000000004 0.050000000000000044 +v 0.08125000000000004 0.17500000000000004 -0.04999999999999999 +v 0.08125000000000004 -0.11249999999999999 0.050000000000000044 +v 0.08125000000000004 -0.11249999999999999 -0.04999999999999999 +v -0.08124999999999999 0.17500000000000004 -0.04999999999999999 +v -0.08124999999999999 0.17500000000000004 0.050000000000000044 +v -0.08124999999999999 -0.11249999999999999 -0.04999999999999999 +v -0.08124999999999999 -0.11249999999999999 0.050000000000000044 +vt 0.0625 0.4375 +vt 0.15625 0.4375 +vt 0.15625 0.28125 +vt 0.0625 0.28125 +vt 0 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.28125 +vt 0 0.28125 +vt 0.21875 0.4375 +vt 0.3125 0.4375 +vt 0.3125 0.28125 +vt 0.21875 0.28125 +vt 0.15625 0.4375 +vt 0.21875 0.4375 +vt 0.21875 0.28125 +vt 0.15625 0.28125 +vt 0.15625 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.5 +vt 0.15625 0.5 +vt 0.25 0.5 +vt 0.15625 0.5 +vt 0.15625 0.4375 +vt 0.25 0.4375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_f88b8145-cdbb-8011-03d2-81deb45b4e43 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o head +v 0.15625 0.5625 0.15625 +v 0.15625 0.5625 -0.15625 +v 0.15625 0.25 0.15625 +v 0.15625 0.25 -0.15625 +v -0.15625 0.5625 -0.15625 +v -0.15625 0.5625 0.15625 +v -0.15625 0.25 -0.15625 +v -0.15625 0.25 0.15625 +vt 0.15625 0.84375 +vt 0.3125 0.84375 +vt 0.3125 0.6875 +vt 0.15625 0.6875 +vt 0 0.84375 +vt 0.15625 0.84375 +vt 0.15625 0.6875 +vt 0 0.6875 +vt 0.46875 0.84375 +vt 0.625 0.84375 +vt 0.625 0.6875 +vt 0.46875 0.6875 +vt 0.3125 0.84375 +vt 0.46875 0.84375 +vt 0.46875 0.6875 +vt 0.3125 0.6875 +vt 0.3125 0.84375 +vt 0.15625 0.84375 +vt 0.15625 1 +vt 0.3125 1 +vt 0.46875 1 +vt 0.3125 1 +vt 0.3125 0.84375 +vt 0.46875 0.84375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_f88b8145-cdbb-8011-03d2-81deb45b4e43 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o rightArm +v 0.18125000000000002 0.259375 0.05625000000000002 +v 0.18125000000000002 0.259375 -0.05625000000000002 +v 0.18125000000000002 0.021874999999999978 0.05625000000000002 +v 0.18125000000000002 0.021874999999999978 -0.05625000000000002 +v 0.06874999999999998 0.259375 -0.05625000000000002 +v 0.06874999999999998 0.259375 0.05625000000000002 +v 0.06874999999999998 0.021874999999999978 -0.05625000000000002 +v 0.06874999999999998 0.021874999999999978 0.05625000000000002 +vt 0.78125 0.9375 +vt 0.84375 0.9375 +vt 0.84375 0.8125 +vt 0.78125 0.8125 +vt 0.71875 0.9375 +vt 0.78125 0.9375 +vt 0.78125 0.8125 +vt 0.71875 0.8125 +vt 0.90625 0.9375 +vt 0.96875 0.9375 +vt 0.96875 0.8125 +vt 0.90625 0.8125 +vt 0.84375 0.9375 +vt 0.90625 0.9375 +vt 0.90625 0.8125 +vt 0.84375 0.8125 +vt 0.84375 0.9375 +vt 0.78125 0.9375 +vt 0.78125 1 +vt 0.84375 1 +vt 0.90625 1 +vt 0.84375 1 +vt 0.84375 0.9375 +vt 0.90625 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_f88b8145-cdbb-8011-03d2-81deb45b4e43 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o leftArm +v -0.06874999999999998 0.259375 0.05625000000000002 +v -0.06874999999999998 0.259375 -0.05625000000000002 +v -0.06874999999999998 0.021874999999999978 0.05625000000000002 +v -0.06874999999999998 0.021874999999999978 -0.05625000000000002 +v -0.18125000000000002 0.259375 -0.05625000000000002 +v -0.18125000000000002 0.259375 0.05625000000000002 +v -0.18125000000000002 0.021874999999999978 -0.05625000000000002 +v -0.18125000000000002 0.021874999999999978 0.05625000000000002 +vt 0.78125 0.75 +vt 0.84375 0.75 +vt 0.84375 0.625 +vt 0.78125 0.625 +vt 0.71875 0.75 +vt 0.78125 0.75 +vt 0.78125 0.625 +vt 0.71875 0.625 +vt 0.90625 0.75 +vt 0.96875 0.75 +vt 0.96875 0.625 +vt 0.90625 0.625 +vt 0.84375 0.75 +vt 0.90625 0.75 +vt 0.90625 0.625 +vt 0.84375 0.625 +vt 0.84375 0.75 +vt 0.78125 0.75 +vt 0.78125 0.8125 +vt 0.84375 0.8125 +vt 0.90625 0.8125 +vt 0.84375 0.8125 +vt 0.84375 0.75 +vt 0.90625 0.75 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_f88b8145-cdbb-8011-03d2-81deb45b4e43 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o leftWing +v -0.03125 0.1875 0.0625 +v -0.03125 0.1875 0.0625 +v -0.03125 -0.125 0.0625 +v -0.03125 -0.125 0.0625 +v -0.53125 0.1875 0.0625 +v -0.53125 0.1875 0.0625 +v -0.53125 -0.125 0.0625 +v -0.53125 -0.125 0.0625 +vt 0.75 0.3125 +vt 0.5 0.3125 +vt 0.5 0.15625 +vt 0.75 0.15625 +vt 0.75 0.3125 +vt 0.75 0.3125 +vt 0.75 0.15625 +vt 0.75 0.15625 +vt 1 0.3125 +vt 0.75 0.3125 +vt 0.75 0.15625 +vt 1 0.15625 +vt 0.5 0.3125 +vt 0.5 0.3125 +vt 0.5 0.15625 +vt 0.5 0.15625 +vt 0.5 0.3125 +vt 0.75 0.3125 +vt 0.75 0.3125 +vt 0.5 0.3125 +vt 0.75 0.3125 +vt 1 0.3125 +vt 1 0.3125 +vt 0.75 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_f88b8145-cdbb-8011-03d2-81deb45b4e43 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o rightWing +v 0.53125 0.1875 0.0625 +v 0.53125 0.1875 0.0625 +v 0.53125 -0.125 0.0625 +v 0.53125 -0.125 0.0625 +v 0.03125 0.1875 0.0625 +v 0.03125 0.1875 0.0625 +v 0.03125 -0.125 0.0625 +v 0.03125 -0.125 0.0625 +vt 0.5 0.3125 +vt 0.75 0.3125 +vt 0.75 0.15625 +vt 0.5 0.15625 +vt 0.5 0.3125 +vt 0.5 0.3125 +vt 0.5 0.15625 +vt 0.5 0.15625 +vt 0.75 0.3125 +vt 1 0.3125 +vt 1 0.15625 +vt 0.75 0.15625 +vt 0.75 0.3125 +vt 0.75 0.3125 +vt 0.75 0.15625 +vt 0.75 0.15625 +vt 0.75 0.3125 +vt 0.5 0.3125 +vt 0.5 0.3125 +vt 0.75 0.3125 +vt 1 0.3125 +vt 0.75 0.3125 +vt 0.75 0.3125 +vt 1 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_f88b8145-cdbb-8011-03d2-81deb45b4e43 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/villager.obj b/prismarine-viewer/viewer/lib/entity/models/villager.obj new file mode 100644 index 00000000..73462472 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/villager.obj @@ -0,0 +1,509 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.25 1.5 0.1875 +v 0.25 1.5 -0.1875 +v 0.25 0.75 0.1875 +v 0.25 0.75 -0.1875 +v -0.25 1.5 -0.1875 +v -0.25 1.5 0.1875 +v -0.25 0.75 -0.1875 +v -0.25 0.75 0.1875 +vt 0.34375 0.59375 +vt 0.46875 0.59375 +vt 0.46875 0.40625 +vt 0.34375 0.40625 +vt 0.25 0.59375 +vt 0.34375 0.59375 +vt 0.34375 0.40625 +vt 0.25 0.40625 +vt 0.5625 0.59375 +vt 0.6875 0.59375 +vt 0.6875 0.40625 +vt 0.5625 0.40625 +vt 0.46875 0.59375 +vt 0.5625 0.59375 +vt 0.5625 0.40625 +vt 0.46875 0.40625 +vt 0.46875 0.59375 +vt 0.34375 0.59375 +vt 0.34375 0.6875 +vt 0.46875 0.6875 +vt 0.59375 0.6875 +vt 0.46875 0.6875 +vt 0.46875 0.59375 +vt 0.59375 0.59375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o body +v 0.28125 1.53125 0.21875 +v 0.28125 1.53125 -0.21875 +v 0.28125 0.34375 0.21875 +v 0.28125 0.34375 -0.21875 +v -0.28125 1.53125 -0.21875 +v -0.28125 1.53125 0.21875 +v -0.28125 0.34375 -0.21875 +v -0.28125 0.34375 0.21875 +vt 0.09375 0.3125 +vt 0.21875 0.3125 +vt 0.21875 0.03125 +vt 0.09375 0.03125 +vt 0 0.3125 +vt 0.09375 0.3125 +vt 0.09375 0.03125 +vt 0 0.03125 +vt 0.3125 0.3125 +vt 0.4375 0.3125 +vt 0.4375 0.03125 +vt 0.3125 0.03125 +vt 0.21875 0.3125 +vt 0.3125 0.3125 +vt 0.3125 0.03125 +vt 0.21875 0.03125 +vt 0.21875 0.3125 +vt 0.09375 0.3125 +vt 0.09375 0.40625 +vt 0.21875 0.40625 +vt 0.34375 0.40625 +vt 0.21875 0.40625 +vt 0.21875 0.3125 +vt 0.34375 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o head +v 0.25 2.125 0.25 +v 0.25 2.125 -0.25 +v 0.25 1.5 0.25 +v 0.25 1.5 -0.25 +v -0.25 2.125 -0.25 +v -0.25 2.125 0.25 +v -0.25 1.5 -0.25 +v -0.25 1.5 0.25 +vt 0.125 0.875 +vt 0.25 0.875 +vt 0.25 0.71875 +vt 0.125 0.71875 +vt 0 0.875 +vt 0.125 0.875 +vt 0.125 0.71875 +vt 0 0.71875 +vt 0.375 0.875 +vt 0.5 0.875 +vt 0.5 0.71875 +vt 0.375 0.71875 +vt 0.25 0.875 +vt 0.375 0.875 +vt 0.375 0.71875 +vt 0.25 0.71875 +vt 0.25 0.875 +vt 0.125 0.875 +vt 0.125 1 +vt 0.25 1 +vt 0.375 1 +vt 0.25 1 +vt 0.25 0.875 +vt 0.375 0.875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o helmet +v 0.28125 2.15625 0.28125 +v 0.28125 2.15625 -0.28125 +v 0.28125 1.46875 0.28125 +v 0.28125 1.46875 -0.28125 +v -0.28125 2.15625 -0.28125 +v -0.28125 2.15625 0.28125 +v -0.28125 1.46875 -0.28125 +v -0.28125 1.46875 0.28125 +vt 0.625 0.875 +vt 0.75 0.875 +vt 0.75 0.71875 +vt 0.625 0.71875 +vt 0.5 0.875 +vt 0.625 0.875 +vt 0.625 0.71875 +vt 0.5 0.71875 +vt 0.875 0.875 +vt 1 0.875 +vt 1 0.71875 +vt 0.875 0.71875 +vt 0.75 0.875 +vt 0.875 0.875 +vt 0.875 0.71875 +vt 0.75 0.71875 +vt 0.75 0.875 +vt 0.625 0.875 +vt 0.625 1 +vt 0.75 1 +vt 0.875 1 +vt 0.75 1 +vt 0.75 0.875 +vt 0.875 0.875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o brim +v 0.5062500000000001 1.80625 0.5062500000000001 +v 0.5062500000000001 1.88125 0.5062500000000001 +v 0.5062500000000001 1.80625 -0.5062500000000001 +v 0.5062500000000001 1.8812499999999996 -0.5062500000000001 +v -0.50625 1.88125 0.5062500000000001 +v -0.50625 1.80625 0.5062500000000001 +v -0.50625 1.8812499999999996 -0.5062500000000001 +v -0.50625 1.80625 -0.5062500000000001 +vt 0.484375 0.25 +vt 0.734375 0.25 +vt 0.734375 0 +vt 0.484375 0 +vt 0.46875 0.25 +vt 0.484375 0.25 +vt 0.484375 0 +vt 0.46875 0 +vt 0.75 0.25 +vt 1 0.25 +vt 1 0 +vt 0.75 0 +vt 0.734375 0.25 +vt 0.75 0.25 +vt 0.75 0 +vt 0.734375 0 +vt 0.734375 0.25 +vt 0.484375 0.25 +vt 0.484375 0.265625 +vt 0.734375 0.265625 +vt 0.984375 0.265625 +vt 0.734375 0.265625 +vt 0.734375 0.25 +vt 0.984375 0.25 +vn 0 1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 -1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 1 +vn 0 -2.220446049250313e-16 -1 +usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o nose +v 0.0625 1.6875 -0.25 +v 0.0625 1.6875 -0.375 +v 0.0625 1.4375 -0.25 +v 0.0625 1.4375 -0.375 +v -0.0625 1.6875 -0.375 +v -0.0625 1.6875 -0.25 +v -0.0625 1.4375 -0.375 +v -0.0625 1.4375 -0.25 +vt 0.40625 0.96875 +vt 0.4375 0.96875 +vt 0.4375 0.90625 +vt 0.40625 0.90625 +vt 0.375 0.96875 +vt 0.40625 0.96875 +vt 0.40625 0.90625 +vt 0.375 0.90625 +vt 0.46875 0.96875 +vt 0.5 0.96875 +vt 0.5 0.90625 +vt 0.46875 0.90625 +vt 0.4375 0.96875 +vt 0.46875 0.96875 +vt 0.46875 0.90625 +vt 0.4375 0.90625 +vt 0.4375 0.96875 +vt 0.40625 0.96875 +vt 0.40625 1 +vt 0.4375 1 +vt 0.46875 1 +vt 0.4375 1 +vt 0.4375 0.96875 +vt 0.46875 0.96875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o arms +v 0.25 1.198223304703363 0 +v 0.25 1.375 -0.17677669529663698 +v 0.25 1.0214466094067263 -0.17677669529663698 +v 0.25 1.1982233047033632 -0.35355339059327373 +v -0.25 1.375 -0.17677669529663698 +v -0.25 1.198223304703363 0 +v -0.25 1.1982233047033632 -0.35355339059327373 +v -0.25 1.0214466094067263 -0.17677669529663698 +vt 0.6875 0.34375 +vt 0.8125 0.34375 +vt 0.8125 0.28125 +vt 0.6875 0.28125 +vt 0.625 0.34375 +vt 0.6875 0.34375 +vt 0.6875 0.28125 +vt 0.625 0.28125 +vt 0.875 0.34375 +vt 1 0.34375 +vt 1 0.28125 +vt 0.875 0.28125 +vt 0.8125 0.34375 +vt 0.875 0.34375 +vt 0.875 0.28125 +vt 0.8125 0.28125 +vt 0.8125 0.34375 +vt 0.6875 0.34375 +vt 0.6875 0.40625 +vt 0.8125 0.40625 +vt 0.9375 0.40625 +vt 0.8125 0.40625 +vt 0.8125 0.34375 +vt 0.9375 0.34375 +vn 0 0.7071067811865476 -0.7071067811865475 +vn 1 0 0 +vn 0 -0.7071067811865476 0.7071067811865475 +vn -1 0 0 +vn 0 0.7071067811865475 0.7071067811865476 +vn 0 -0.7071067811865475 -0.7071067811865476 +usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o arms +v 0.5 1.375 0.17677669529663698 +v 0.5 1.551776695296637 0 +v 0.5 1.0214466094067263 -0.17677669529663698 +v 0.5 1.1982233047033632 -0.35355339059327373 +v 0.25 1.551776695296637 0 +v 0.25 1.375 0.17677669529663698 +v 0.25 1.1982233047033632 -0.35355339059327373 +v 0.25 1.0214466094067263 -0.17677669529663698 +vt 0.75 0.59375 +vt 0.8125 0.59375 +vt 0.8125 0.46875 +vt 0.75 0.46875 +vt 0.6875 0.59375 +vt 0.75 0.59375 +vt 0.75 0.46875 +vt 0.6875 0.46875 +vt 0.875 0.59375 +vt 0.9375 0.59375 +vt 0.9375 0.46875 +vt 0.875 0.46875 +vt 0.8125 0.59375 +vt 0.875 0.59375 +vt 0.875 0.46875 +vt 0.8125 0.46875 +vt 0.8125 0.59375 +vt 0.75 0.59375 +vt 0.75 0.65625 +vt 0.8125 0.65625 +vt 0.875 0.65625 +vt 0.8125 0.65625 +vt 0.8125 0.59375 +vt 0.875 0.59375 +vn 0 0.7071067811865476 -0.7071067811865475 +vn 1 0 0 +vn 0 -0.7071067811865476 0.7071067811865475 +vn -1 0 0 +vn 0 0.7071067811865475 0.7071067811865476 +vn 0 -0.7071067811865475 -0.7071067811865476 +usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o arms +v -0.25 1.375 0.17677669529663698 +v -0.25 1.551776695296637 0 +v -0.25 1.0214466094067263 -0.17677669529663698 +v -0.25 1.1982233047033632 -0.35355339059327373 +v -0.5 1.551776695296637 0 +v -0.5 1.375 0.17677669529663698 +v -0.5 1.1982233047033632 -0.35355339059327373 +v -0.5 1.0214466094067263 -0.17677669529663698 +vt 0.8125 0.59375 +vt 0.75 0.59375 +vt 0.75 0.46875 +vt 0.8125 0.46875 +vt 0.875 0.59375 +vt 0.8125 0.59375 +vt 0.8125 0.46875 +vt 0.875 0.46875 +vt 0.9375 0.59375 +vt 0.875 0.59375 +vt 0.875 0.46875 +vt 0.9375 0.46875 +vt 0.75 0.59375 +vt 0.6875 0.59375 +vt 0.6875 0.46875 +vt 0.75 0.46875 +vt 0.75 0.59375 +vt 0.8125 0.59375 +vt 0.8125 0.65625 +vt 0.75 0.65625 +vt 0.8125 0.65625 +vt 0.875 0.65625 +vt 0.875 0.59375 +vt 0.8125 0.59375 +vn 0 0.7071067811865476 -0.7071067811865475 +vn 1 0 0 +vn 0 -0.7071067811865476 0.7071067811865475 +vn -1 0 0 +vn 0 0.7071067811865475 0.7071067811865476 +vn 0 -0.7071067811865475 -0.7071067811865476 +usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o leg0 +v 0.25 0.75 0.125 +v 0.25 0.75 -0.125 +v 0.25 0 0.125 +v 0.25 0 -0.125 +v 0 0.75 -0.125 +v 0 0.75 0.125 +v 0 0 -0.125 +v 0 0 0.125 +vt 0.0625 0.59375 +vt 0.125 0.59375 +vt 0.125 0.40625 +vt 0.0625 0.40625 +vt 0 0.59375 +vt 0.0625 0.59375 +vt 0.0625 0.40625 +vt 0 0.40625 +vt 0.1875 0.59375 +vt 0.25 0.59375 +vt 0.25 0.40625 +vt 0.1875 0.40625 +vt 0.125 0.59375 +vt 0.1875 0.59375 +vt 0.1875 0.40625 +vt 0.125 0.40625 +vt 0.125 0.59375 +vt 0.0625 0.59375 +vt 0.0625 0.65625 +vt 0.125 0.65625 +vt 0.1875 0.65625 +vt 0.125 0.65625 +vt 0.125 0.59375 +vt 0.1875 0.59375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o leg1 +v 0 0.75 0.125 +v 0 0.75 -0.125 +v 0 0 0.125 +v 0 0 -0.125 +v -0.25 0.75 -0.125 +v -0.25 0.75 0.125 +v -0.25 0 -0.125 +v -0.25 0 0.125 +vt 0.125 0.59375 +vt 0.0625 0.59375 +vt 0.0625 0.40625 +vt 0.125 0.40625 +vt 0.1875 0.59375 +vt 0.125 0.59375 +vt 0.125 0.40625 +vt 0.1875 0.40625 +vt 0.25 0.59375 +vt 0.1875 0.59375 +vt 0.1875 0.40625 +vt 0.25 0.40625 +vt 0.0625 0.59375 +vt 0 0.59375 +vt 0 0.40625 +vt 0.0625 0.40625 +vt 0.0625 0.59375 +vt 0.125 0.59375 +vt 0.125 0.65625 +vt 0.0625 0.65625 +vt 0.125 0.65625 +vt 0.1875 0.65625 +vt 0.1875 0.59375 +vt 0.125 0.59375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/warden.obj b/prismarine-viewer/viewer/lib/entity/models/warden.obj new file mode 100644 index 00000000..da0b2656 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/warden.obj @@ -0,0 +1,463 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o body +v 0.5625 2.125 0.4375 +v 0.5625 2.125 -0.25 +v 0.5625 0.8125 0.4375 +v 0.5625 0.8125 -0.25 +v -0.5625 2.125 -0.25 +v -0.5625 2.125 0.4375 +v -0.5625 0.8125 -0.25 +v -0.5625 0.8125 0.4375 +vt 0.0859375 0.9140625 +vt 0.2265625 0.9140625 +vt 0.2265625 0.75 +vt 0.0859375 0.75 +vt 0 0.9140625 +vt 0.0859375 0.9140625 +vt 0.0859375 0.75 +vt 0 0.75 +vt 0.3125 0.9140625 +vt 0.453125 0.9140625 +vt 0.453125 0.75 +vt 0.3125 0.75 +vt 0.2265625 0.9140625 +vt 0.3125 0.9140625 +vt 0.3125 0.75 +vt 0.2265625 0.75 +vt 0.2265625 0.9140625 +vt 0.0859375 0.9140625 +vt 0.0859375 1 +vt 0.2265625 1 +vt 0.3671875 1 +vt 0.2265625 1 +vt 0.2265625 0.9140625 +vt 0.3671875 0.9140625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o right_ribcage +v 0.5625 2.125 -0.25625 +v 0.5625 2.125 -0.25625 +v 0.5625 0.8125 -0.25625 +v 0.5625 0.8125 -0.25625 +v 0 2.125 -0.25625 +v 0 2.125 -0.25625 +v 0 0.8125 -0.25625 +v 0 0.8125 -0.25625 +vt 0.703125 0.9140625 +vt 0.7734375 0.9140625 +vt 0.7734375 0.75 +vt 0.703125 0.75 +vt 0.703125 0.9140625 +vt 0.703125 0.9140625 +vt 0.703125 0.75 +vt 0.703125 0.75 +vt 0.7734375 0.9140625 +vt 0.84375 0.9140625 +vt 0.84375 0.75 +vt 0.7734375 0.75 +vt 0.7734375 0.9140625 +vt 0.7734375 0.9140625 +vt 0.7734375 0.75 +vt 0.7734375 0.75 +vt 0.7734375 0.9140625 +vt 0.703125 0.9140625 +vt 0.703125 0.9140625 +vt 0.7734375 0.9140625 +vt 0.84375 0.9140625 +vt 0.7734375 0.9140625 +vt 0.7734375 0.9140625 +vt 0.84375 0.9140625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o left_ribcage +v 0 2.125 -0.25625 +v 0 2.125 -0.25625 +v 0 0.8125 -0.25625 +v 0 0.8125 -0.25625 +v -0.5625 2.125 -0.25625 +v -0.5625 2.125 -0.25625 +v -0.5625 0.8125 -0.25625 +v -0.5625 0.8125 -0.25625 +vt 0.7734375 0.9140625 +vt 0.703125 0.9140625 +vt 0.703125 0.75 +vt 0.7734375 0.75 +vt 0.7734375 0.9140625 +vt 0.7734375 0.9140625 +vt 0.7734375 0.75 +vt 0.7734375 0.75 +vt 0.84375 0.9140625 +vt 0.7734375 0.9140625 +vt 0.7734375 0.75 +vt 0.84375 0.75 +vt 0.703125 0.9140625 +vt 0.703125 0.9140625 +vt 0.703125 0.75 +vt 0.703125 0.75 +vt 0.703125 0.9140625 +vt 0.7734375 0.9140625 +vt 0.7734375 0.9140625 +vt 0.703125 0.9140625 +vt 0.7734375 0.9140625 +vt 0.84375 0.9140625 +vt 0.84375 0.9140625 +vt 0.7734375 0.9140625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o head +v 0.5 3.125 0.3125 +v 0.5 3.125 -0.3125 +v 0.5 2.125 0.3125 +v 0.5 2.125 -0.3125 +v -0.5 3.125 -0.3125 +v -0.5 3.125 0.3125 +v -0.5 2.125 -0.3125 +v -0.5 2.125 0.3125 +vt 0.078125 0.671875 +vt 0.203125 0.671875 +vt 0.203125 0.546875 +vt 0.078125 0.546875 +vt 0 0.671875 +vt 0.078125 0.671875 +vt 0.078125 0.546875 +vt 0 0.546875 +vt 0.28125 0.671875 +vt 0.40625 0.671875 +vt 0.40625 0.546875 +vt 0.28125 0.546875 +vt 0.203125 0.671875 +vt 0.28125 0.671875 +vt 0.28125 0.546875 +vt 0.203125 0.546875 +vt 0.203125 0.671875 +vt 0.078125 0.671875 +vt 0.078125 0.75 +vt 0.203125 0.75 +vt 0.328125 0.75 +vt 0.203125 0.75 +vt 0.203125 0.671875 +vt 0.328125 0.671875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o right_tendril +v 1.5 3.6875 0 +v 1.5 3.6875 0 +v 1.5 2.6875 0 +v 1.5 2.6875 0 +v 0.5 3.6875 0 +v 0.5 3.6875 0 +v 0.5 2.6875 0 +v 0.5 2.6875 0 +vt 0.40625 0.75 +vt 0.53125 0.75 +vt 0.53125 0.625 +vt 0.40625 0.625 +vt 0.40625 0.75 +vt 0.40625 0.75 +vt 0.40625 0.625 +vt 0.40625 0.625 +vt 0.53125 0.75 +vt 0.65625 0.75 +vt 0.65625 0.625 +vt 0.53125 0.625 +vt 0.53125 0.75 +vt 0.53125 0.75 +vt 0.53125 0.625 +vt 0.53125 0.625 +vt 0.53125 0.75 +vt 0.40625 0.75 +vt 0.40625 0.75 +vt 0.53125 0.75 +vt 0.65625 0.75 +vt 0.53125 0.75 +vt 0.53125 0.75 +vt 0.65625 0.75 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o left_tendril +v -0.5 3.6875 0 +v -0.5 3.6875 0 +v -0.5 2.6875 0 +v -0.5 2.6875 0 +v -1.5 3.6875 0 +v -1.5 3.6875 0 +v -1.5 2.6875 0 +v -1.5 2.6875 0 +vt 0.453125 1 +vt 0.578125 1 +vt 0.578125 0.875 +vt 0.453125 0.875 +vt 0.453125 1 +vt 0.453125 1 +vt 0.453125 0.875 +vt 0.453125 0.875 +vt 0.578125 1 +vt 0.703125 1 +vt 0.703125 0.875 +vt 0.578125 0.875 +vt 0.578125 1 +vt 0.578125 1 +vt 0.578125 0.875 +vt 0.578125 0.875 +vt 0.578125 1 +vt 0.453125 1 +vt 0.453125 1 +vt 0.578125 1 +vt 0.703125 1 +vt 0.578125 1 +vt 0.578125 1 +vt 0.703125 1 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o right_arm +v 1.0625 2.125 0.3125 +v 1.0625 2.125 -0.1875 +v 1.0625 0.375 0.3125 +v 1.0625 0.375 -0.1875 +v 0.5625 2.125 -0.1875 +v 0.5625 2.125 0.3125 +v 0.5625 0.375 -0.1875 +v 0.5625 0.375 0.3125 +vt 0.40625 0.546875 +vt 0.46875 0.546875 +vt 0.46875 0.328125 +vt 0.40625 0.328125 +vt 0.34375 0.546875 +vt 0.40625 0.546875 +vt 0.40625 0.328125 +vt 0.34375 0.328125 +vt 0.53125 0.546875 +vt 0.59375 0.546875 +vt 0.59375 0.328125 +vt 0.53125 0.328125 +vt 0.46875 0.546875 +vt 0.53125 0.546875 +vt 0.53125 0.328125 +vt 0.46875 0.328125 +vt 0.46875 0.546875 +vt 0.40625 0.546875 +vt 0.40625 0.609375 +vt 0.46875 0.609375 +vt 0.53125 0.609375 +vt 0.46875 0.609375 +vt 0.46875 0.546875 +vt 0.53125 0.546875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o left_arm +v -0.5625 2.125 0.3125 +v -0.5625 2.125 -0.1875 +v -0.5625 0.375 0.3125 +v -0.5625 0.375 -0.1875 +v -1.0625 2.125 -0.1875 +v -1.0625 2.125 0.3125 +v -1.0625 0.375 -0.1875 +v -1.0625 0.375 0.3125 +vt 0.0625 0.484375 +vt 0.125 0.484375 +vt 0.125 0.265625 +vt 0.0625 0.265625 +vt 0 0.484375 +vt 0.0625 0.484375 +vt 0.0625 0.265625 +vt 0 0.265625 +vt 0.1875 0.484375 +vt 0.25 0.484375 +vt 0.25 0.265625 +vt 0.1875 0.265625 +vt 0.125 0.484375 +vt 0.1875 0.484375 +vt 0.1875 0.265625 +vt 0.125 0.265625 +vt 0.125 0.484375 +vt 0.0625 0.484375 +vt 0.0625 0.546875 +vt 0.125 0.546875 +vt 0.1875 0.546875 +vt 0.125 0.546875 +vt 0.125 0.484375 +vt 0.1875 0.484375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o right_leg +v 0.5625 0.8125 0.1875 +v 0.5625 0.8125 -0.1875 +v 0.5625 0 0.1875 +v 0.5625 0 -0.1875 +v 0.1875 0.8125 -0.1875 +v 0.1875 0.8125 0.1875 +v 0.1875 0 -0.1875 +v 0.1875 0 0.1875 +vt 0.640625 0.578125 +vt 0.6875 0.578125 +vt 0.6875 0.4765625 +vt 0.640625 0.4765625 +vt 0.59375 0.578125 +vt 0.640625 0.578125 +vt 0.640625 0.4765625 +vt 0.59375 0.4765625 +vt 0.734375 0.578125 +vt 0.78125 0.578125 +vt 0.78125 0.4765625 +vt 0.734375 0.4765625 +vt 0.6875 0.578125 +vt 0.734375 0.578125 +vt 0.734375 0.4765625 +vt 0.6875 0.4765625 +vt 0.6875 0.578125 +vt 0.640625 0.578125 +vt 0.640625 0.625 +vt 0.6875 0.625 +vt 0.734375 0.625 +vt 0.6875 0.625 +vt 0.6875 0.578125 +vt 0.734375 0.578125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o left_leg +v -0.1875 0.8125 0.1875 +v -0.1875 0.8125 -0.1875 +v -0.1875 0 0.1875 +v -0.1875 0 -0.1875 +v -0.5625 0.8125 -0.1875 +v -0.5625 0.8125 0.1875 +v -0.5625 0 -0.1875 +v -0.5625 0 0.1875 +vt 0.640625 0.359375 +vt 0.6875 0.359375 +vt 0.6875 0.2578125 +vt 0.640625 0.2578125 +vt 0.59375 0.359375 +vt 0.640625 0.359375 +vt 0.640625 0.2578125 +vt 0.59375 0.2578125 +vt 0.734375 0.359375 +vt 0.78125 0.359375 +vt 0.78125 0.2578125 +vt 0.734375 0.2578125 +vt 0.6875 0.359375 +vt 0.734375 0.359375 +vt 0.734375 0.2578125 +vt 0.6875 0.2578125 +vt 0.6875 0.359375 +vt 0.640625 0.359375 +vt 0.640625 0.40625 +vt 0.6875 0.40625 +vt 0.734375 0.40625 +vt 0.6875 0.40625 +vt 0.6875 0.359375 +vt 0.734375 0.359375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/witch.obj b/prismarine-viewer/viewer/lib/entity/models/witch.obj new file mode 100644 index 00000000..275da643 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/witch.obj @@ -0,0 +1,647 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o head +v 0.25 2.125 0.25 +v 0.25 2.125 -0.25 +v 0.25 1.5 0.25 +v 0.25 1.5 -0.25 +v -0.25 2.125 -0.25 +v -0.25 2.125 0.25 +v -0.25 1.5 -0.25 +v -0.25 1.5 0.25 +vt 0.125 0.9375 +vt 0.25 0.9375 +vt 0.25 0.859375 +vt 0.125 0.859375 +vt 0 0.9375 +vt 0.125 0.9375 +vt 0.125 0.859375 +vt 0 0.859375 +vt 0.375 0.9375 +vt 0.5 0.9375 +vt 0.5 0.859375 +vt 0.375 0.859375 +vt 0.25 0.9375 +vt 0.375 0.9375 +vt 0.375 0.859375 +vt 0.25 0.859375 +vt 0.25 0.9375 +vt 0.125 0.9375 +vt 0.125 1 +vt 0.25 1 +vt 0.375 1 +vt 0.25 1 +vt 0.25 0.9375 +vt 0.375 0.9375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o nose +v 0.0625 1.6875 -0.25 +v 0.0625 1.6875 -0.375 +v 0.0625 1.4375 -0.25 +v 0.0625 1.4375 -0.375 +v -0.0625 1.6875 -0.375 +v -0.0625 1.6875 -0.25 +v -0.0625 1.4375 -0.375 +v -0.0625 1.4375 -0.25 +vt 0.40625 0.984375 +vt 0.4375 0.984375 +vt 0.4375 0.953125 +vt 0.40625 0.953125 +vt 0.375 0.984375 +vt 0.40625 0.984375 +vt 0.40625 0.953125 +vt 0.375 0.953125 +vt 0.46875 0.984375 +vt 0.5 0.984375 +vt 0.5 0.953125 +vt 0.46875 0.953125 +vt 0.4375 0.984375 +vt 0.46875 0.984375 +vt 0.46875 0.953125 +vt 0.4375 0.953125 +vt 0.4375 0.984375 +vt 0.40625 0.984375 +vt 0.40625 1 +vt 0.4375 1 +vt 0.46875 1 +vt 0.4375 1 +vt 0.4375 0.984375 +vt 0.46875 0.984375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o nose +v -0.015625 1.609375 -0.375 +v -0.015625 1.609375 -0.40625 +v -0.015625 1.578125 -0.375 +v -0.015625 1.578125 -0.40625 +v -0.046875 1.609375 -0.40625 +v -0.046875 1.609375 -0.375 +v -0.046875 1.578125 -0.40625 +v -0.046875 1.578125 -0.375 +vt 0.015625 0.9921875 +vt 0.03125 0.9921875 +vt 0.03125 0.984375 +vt 0.015625 0.984375 +vt 0 0.9921875 +vt 0.015625 0.9921875 +vt 0.015625 0.984375 +vt 0 0.984375 +vt 0.046875 0.9921875 +vt 0.0625 0.9921875 +vt 0.0625 0.984375 +vt 0.046875 0.984375 +vt 0.03125 0.9921875 +vt 0.046875 0.9921875 +vt 0.046875 0.984375 +vt 0.03125 0.984375 +vt 0.03125 0.9921875 +vt 0.015625 0.9921875 +vt 0.015625 1 +vt 0.03125 1 +vt 0.046875 1 +vt 0.03125 1 +vt 0.03125 0.9921875 +vt 0.046875 0.9921875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o hat +v 0.3125 2.128125 0.3125 +v 0.3125 2.128125 -0.3125 +v 0.3125 2.003125 0.3125 +v 0.3125 2.003125 -0.3125 +v -0.3125 2.128125 -0.3125 +v -0.3125 2.128125 0.3125 +v -0.3125 2.003125 -0.3125 +v -0.3125 2.003125 0.3125 +vt 0.15625 0.421875 +vt 0.3125 0.421875 +vt 0.3125 0.40625 +vt 0.15625 0.40625 +vt 0 0.421875 +vt 0.15625 0.421875 +vt 0.15625 0.40625 +vt 0 0.40625 +vt 0.46875 0.421875 +vt 0.625 0.421875 +vt 0.625 0.40625 +vt 0.46875 0.40625 +vt 0.3125 0.421875 +vt 0.46875 0.421875 +vt 0.46875 0.40625 +vt 0.3125 0.40625 +vt 0.3125 0.421875 +vt 0.15625 0.421875 +vt 0.15625 0.5 +vt 0.3125 0.5 +vt 0.46875 0.5 +vt 0.3125 0.5 +vt 0.3125 0.421875 +vt 0.46875 0.421875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o hat2 +v 0.19420316941970583 2.3448018130595334 0.26781917680283374 +v 0.19360379633542446 2.367690947692347 -0.16908124465229235 +v 0.20073843784720224 2.0952299807209473 0.2547351877420978 +v 0.20013906476292087 2.118119115353761 -0.18216523371302834 +v -0.24374628334138193 2.3562385328076525 -0.16908124465229235 +v -0.24314691025710045 2.333349398174839 0.26781917680283374 +v -0.2372110149138854 2.1066667004690665 -0.18216523371302834 +v -0.23661164182960404 2.083777565836253 0.2547351877420978 +vt 0.109375 0.3515625 +vt 0.21875 0.3515625 +vt 0.21875 0.3203125 +vt 0.109375 0.3203125 +vt 0 0.3515625 +vt 0.109375 0.3515625 +vt 0.109375 0.3203125 +vt 0 0.3203125 +vt 0.328125 0.3515625 +vt 0.4375 0.3515625 +vt 0.4375 0.3203125 +vt 0.328125 0.3203125 +vt 0.21875 0.3515625 +vt 0.328125 0.3515625 +vt 0.328125 0.3203125 +vt 0.21875 0.3203125 +vt 0.21875 0.3515625 +vt 0.109375 0.3515625 +vt 0.109375 0.40625 +vt 0.21875 0.40625 +vt 0.328125 0.40625 +vt 0.21875 0.40625 +vt 0.21875 0.3515625 +vt 0.328125 0.3515625 +vn -0.0013699956212146517 0.052318022017859046 -0.998629534754574 +vn 0.9996573249755573 0.026176948307873146 -2.168404344971009e-19 +vn 0.0013699956212146517 -0.052318022017859046 0.998629534754574 +vn -0.9996573249755573 -0.026176948307873146 2.168404344971009e-19 +vn -0.02614107370998589 0.9982873293543426 0.05233595624294382 +vn 0.02614107370998589 -0.9982873293543426 -0.05233595624294382 +usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o hat3 +v 0.06205916642018039 2.5318108508382715 0.25085017875105275 +v 0.059669177777630145 2.5708345128476795 0.003926219286475963 +v 0.08152178038959057 2.2856541582304613 0.21175939541454591 +v 0.07913179174704033 2.3246778202398692 -0.03516456405003088 +v -0.1895606250384982 2.5512376639234398 0.0032414562075101516 +v -0.187170636395948 2.5122140019140318 0.25016541567208694 +v -0.17009801106908795 2.3050809713156295 -0.03584932712899669 +v -0.1677080224265377 2.2660573093062215 0.2110746323355801 +vt 0.0625 0.2890625 +vt 0.125 0.2890625 +vt 0.125 0.2578125 +vt 0.0625 0.2578125 +vt 0 0.2890625 +vt 0.0625 0.2890625 +vt 0.0625 0.2578125 +vt 0 0.2578125 +vt 0.1875 0.2890625 +vt 0.25 0.2890625 +vt 0.25 0.2578125 +vt 0.1875 0.2578125 +vt 0.125 0.2890625 +vt 0.1875 0.2890625 +vt 0.1875 0.2578125 +vt 0.125 0.2578125 +vt 0.125 0.2890625 +vt 0.0625 0.2890625 +vt 0.0625 0.3203125 +vt 0.125 0.3203125 +vt 0.1875 0.3203125 +vt 0.125 0.3203125 +vt 0.125 0.2890625 +vt 0.1875 0.2890625 +vn -0.009559954570200835 0.156094648037632 -0.9876958378583074 +vn 0.9969192112645133 0.07838739569696003 0.002739052315863333 +vn 0.009559954570200835 -0.156094648037632 0.9876958378583074 +vn -0.9969192112645133 -0.07838739569696003 -0.002739052315863333 +vn -0.07785045587764094 0.9846267704312412 0.1563631333460272 +vn 0.07785045587764094 -0.9846267704312412 -0.1563631333460272 +usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o hat4 +v -0.06724991963009147 2.6297151428282426 0.2756843667494786 +v -0.07166686964939262 2.6629564553960905 0.18813684713130974 +v -0.03980089941132947 2.486376747492985 0.21987470619018534 +v -0.04421784943063062 2.519618060060833 0.1323271865720166 +v -0.16385315668047867 2.645999001844819 0.18634918036183534 +v -0.15943620666117758 2.6127576892769713 0.2738966999800041 +v -0.13640413646171662 2.502660606509562 0.1305395198025422 +v -0.13198718644241553 2.469419293941714 0.21808703942071106 +vt 0.015625 0.25 +vt 0.03125 0.25 +vt 0.03125 0.234375 +vt 0.015625 0.234375 +vt 0 0.25 +vt 0.015625 0.25 +vt 0.015625 0.234375 +vt 0 0.234375 +vt 0.046875 0.25 +vt 0.0625 0.25 +vt 0.0625 0.234375 +vt 0.046875 0.234375 +vt 0.03125 0.25 +vt 0.046875 0.25 +vt 0.046875 0.234375 +vt 0.03125 0.234375 +vt 0.03125 0.25 +vt 0.015625 0.25 +vt 0.015625 0.2578125 +vt 0.03125 0.2578125 +vt 0.046875 0.2578125 +vt 0.03125 0.2578125 +vt 0.03125 0.25 +vt 0.046875 0.25 +vn -0.04711413353921201 0.3545740007237079 -0.9338402092604674 +vn 0.9833203949982517 0.18087950454689375 0.019068445541060658 +vn 0.04711413353921201 -0.3545740007237079 0.9338402092604674 +vn -0.9833203949982517 -0.18087950454689375 -0.019068445541060658 +vn -0.17567372940007692 0.9173657301456462 0.3571818275794757 +vn 0.17567372940007692 -0.9173657301456462 -0.3571818275794757 +usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o body +v 0.25 1.5 0.1875 +v 0.25 1.5 -0.1875 +v 0.25 0.75 0.1875 +v 0.25 0.75 -0.1875 +v -0.25 1.5 -0.1875 +v -0.25 1.5 0.1875 +v -0.25 0.75 -0.1875 +v -0.25 0.75 0.1875 +vt 0.34375 0.796875 +vt 0.46875 0.796875 +vt 0.46875 0.703125 +vt 0.34375 0.703125 +vt 0.25 0.796875 +vt 0.34375 0.796875 +vt 0.34375 0.703125 +vt 0.25 0.703125 +vt 0.5625 0.796875 +vt 0.6875 0.796875 +vt 0.6875 0.703125 +vt 0.5625 0.703125 +vt 0.46875 0.796875 +vt 0.5625 0.796875 +vt 0.5625 0.703125 +vt 0.46875 0.703125 +vt 0.46875 0.796875 +vt 0.34375 0.796875 +vt 0.34375 0.84375 +vt 0.46875 0.84375 +vt 0.59375 0.84375 +vt 0.46875 0.84375 +vt 0.46875 0.796875 +vt 0.59375 0.796875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o body +v 0.28125 1.53125 0.21875 +v 0.28125 1.53125 -0.21875 +v 0.28125 0.34375 0.21875 +v 0.28125 0.34375 -0.21875 +v -0.28125 1.53125 -0.21875 +v -0.28125 1.53125 0.21875 +v -0.28125 0.34375 -0.21875 +v -0.28125 0.34375 0.21875 +vt 0.09375 0.65625 +vt 0.21875 0.65625 +vt 0.21875 0.515625 +vt 0.09375 0.515625 +vt 0 0.65625 +vt 0.09375 0.65625 +vt 0.09375 0.515625 +vt 0 0.515625 +vt 0.3125 0.65625 +vt 0.4375 0.65625 +vt 0.4375 0.515625 +vt 0.3125 0.515625 +vt 0.21875 0.65625 +vt 0.3125 0.65625 +vt 0.3125 0.515625 +vt 0.21875 0.515625 +vt 0.21875 0.65625 +vt 0.09375 0.65625 +vt 0.09375 0.703125 +vt 0.21875 0.703125 +vt 0.34375 0.703125 +vt 0.21875 0.703125 +vt 0.21875 0.65625 +vt 0.34375 0.65625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o arms +v 0.25 1.198223304703363 0 +v 0.25 1.375 -0.17677669529663698 +v 0.25 1.0214466094067263 -0.17677669529663698 +v 0.25 1.1982233047033632 -0.35355339059327373 +v -0.25 1.375 -0.17677669529663698 +v -0.25 1.198223304703363 0 +v -0.25 1.1982233047033632 -0.35355339059327373 +v -0.25 1.0214466094067263 -0.17677669529663698 +vt 0.6875 0.671875 +vt 0.8125 0.671875 +vt 0.8125 0.640625 +vt 0.6875 0.640625 +vt 0.625 0.671875 +vt 0.6875 0.671875 +vt 0.6875 0.640625 +vt 0.625 0.640625 +vt 0.875 0.671875 +vt 1 0.671875 +vt 1 0.640625 +vt 0.875 0.640625 +vt 0.8125 0.671875 +vt 0.875 0.671875 +vt 0.875 0.640625 +vt 0.8125 0.640625 +vt 0.8125 0.671875 +vt 0.6875 0.671875 +vt 0.6875 0.703125 +vt 0.8125 0.703125 +vt 0.9375 0.703125 +vt 0.8125 0.703125 +vt 0.8125 0.671875 +vt 0.9375 0.671875 +vn 0 0.7071067811865476 -0.7071067811865475 +vn 1 0 0 +vn 0 -0.7071067811865476 0.7071067811865475 +vn -1 0 0 +vn 0 0.7071067811865475 0.7071067811865476 +vn 0 -0.7071067811865475 -0.7071067811865476 +usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o arms +v 0.5 1.375 0.17677669529663698 +v 0.5 1.551776695296637 0 +v 0.5 1.0214466094067263 -0.17677669529663698 +v 0.5 1.1982233047033632 -0.35355339059327373 +v 0.25 1.551776695296637 0 +v 0.25 1.375 0.17677669529663698 +v 0.25 1.1982233047033632 -0.35355339059327373 +v 0.25 1.0214466094067263 -0.17677669529663698 +vt 0.75 0.796875 +vt 0.8125 0.796875 +vt 0.8125 0.734375 +vt 0.75 0.734375 +vt 0.6875 0.796875 +vt 0.75 0.796875 +vt 0.75 0.734375 +vt 0.6875 0.734375 +vt 0.875 0.796875 +vt 0.9375 0.796875 +vt 0.9375 0.734375 +vt 0.875 0.734375 +vt 0.8125 0.796875 +vt 0.875 0.796875 +vt 0.875 0.734375 +vt 0.8125 0.734375 +vt 0.8125 0.796875 +vt 0.75 0.796875 +vt 0.75 0.828125 +vt 0.8125 0.828125 +vt 0.875 0.828125 +vt 0.8125 0.828125 +vt 0.8125 0.796875 +vt 0.875 0.796875 +vn 0 0.7071067811865476 -0.7071067811865475 +vn 1 0 0 +vn 0 -0.7071067811865476 0.7071067811865475 +vn -1 0 0 +vn 0 0.7071067811865475 0.7071067811865476 +vn 0 -0.7071067811865475 -0.7071067811865476 +usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 +o arms +v -0.25 1.375 0.17677669529663698 +v -0.25 1.551776695296637 0 +v -0.25 1.0214466094067263 -0.17677669529663698 +v -0.25 1.1982233047033632 -0.35355339059327373 +v -0.5 1.551776695296637 0 +v -0.5 1.375 0.17677669529663698 +v -0.5 1.1982233047033632 -0.35355339059327373 +v -0.5 1.0214466094067263 -0.17677669529663698 +vt 0.75 0.796875 +vt 0.8125 0.796875 +vt 0.8125 0.734375 +vt 0.75 0.734375 +vt 0.6875 0.796875 +vt 0.75 0.796875 +vt 0.75 0.734375 +vt 0.6875 0.734375 +vt 0.875 0.796875 +vt 0.9375 0.796875 +vt 0.9375 0.734375 +vt 0.875 0.734375 +vt 0.8125 0.796875 +vt 0.875 0.796875 +vt 0.875 0.734375 +vt 0.8125 0.734375 +vt 0.8125 0.796875 +vt 0.75 0.796875 +vt 0.75 0.828125 +vt 0.8125 0.828125 +vt 0.875 0.828125 +vt 0.8125 0.828125 +vt 0.8125 0.796875 +vt 0.875 0.796875 +vn 0 0.7071067811865476 -0.7071067811865475 +vn 1 0 0 +vn 0 -0.7071067811865476 0.7071067811865475 +vn -1 0 0 +vn 0 0.7071067811865475 0.7071067811865476 +vn 0 -0.7071067811865475 -0.7071067811865476 +usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 +f 92/268/67 95/267/67 93/266/67 90/265/67 +f 91/272/68 92/271/68 90/270/68 89/269/68 +f 96/276/69 91/275/69 89/274/69 94/273/69 +f 95/280/70 96/279/70 94/278/70 93/277/70 +f 94/284/71 89/283/71 90/282/71 93/281/71 +f 95/288/72 92/287/72 91/286/72 96/285/72 +o leg0 +v 0.25 0.75 0.125 +v 0.25 0.75 -0.125 +v 0.25 0 0.125 +v 0.25 0 -0.125 +v 0 0.75 -0.125 +v 0 0.75 0.125 +v 0 0 -0.125 +v 0 0 0.125 +vt 0.0625 0.796875 +vt 0.125 0.796875 +vt 0.125 0.703125 +vt 0.0625 0.703125 +vt 0 0.796875 +vt 0.0625 0.796875 +vt 0.0625 0.703125 +vt 0 0.703125 +vt 0.1875 0.796875 +vt 0.25 0.796875 +vt 0.25 0.703125 +vt 0.1875 0.703125 +vt 0.125 0.796875 +vt 0.1875 0.796875 +vt 0.1875 0.703125 +vt 0.125 0.703125 +vt 0.125 0.796875 +vt 0.0625 0.796875 +vt 0.0625 0.828125 +vt 0.125 0.828125 +vt 0.1875 0.828125 +vt 0.125 0.828125 +vt 0.125 0.796875 +vt 0.1875 0.796875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 +f 100/292/73 103/291/73 101/290/73 98/289/73 +f 99/296/74 100/295/74 98/294/74 97/293/74 +f 104/300/75 99/299/75 97/298/75 102/297/75 +f 103/304/76 104/303/76 102/302/76 101/301/76 +f 102/308/77 97/307/77 98/306/77 101/305/77 +f 103/312/78 100/311/78 99/310/78 104/309/78 +o leg1 +v 0 0.75 0.125 +v 0 0.75 -0.125 +v 0 0 0.125 +v 0 0 -0.125 +v -0.25 0.75 -0.125 +v -0.25 0.75 0.125 +v -0.25 0 -0.125 +v -0.25 0 0.125 +vt 0.0625 0.796875 +vt 0.125 0.796875 +vt 0.125 0.703125 +vt 0.0625 0.703125 +vt 0 0.796875 +vt 0.0625 0.796875 +vt 0.0625 0.703125 +vt 0 0.703125 +vt 0.1875 0.796875 +vt 0.25 0.796875 +vt 0.25 0.703125 +vt 0.1875 0.703125 +vt 0.125 0.796875 +vt 0.1875 0.796875 +vt 0.1875 0.703125 +vt 0.125 0.703125 +vt 0.125 0.796875 +vt 0.0625 0.796875 +vt 0.0625 0.828125 +vt 0.125 0.828125 +vt 0.1875 0.828125 +vt 0.125 0.828125 +vt 0.125 0.796875 +vt 0.1875 0.796875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 +f 108/316/79 111/315/79 109/314/79 106/313/79 +f 107/320/80 108/319/80 106/318/80 105/317/80 +f 112/324/81 107/323/81 105/322/81 110/321/81 +f 111/328/82 112/327/82 110/326/82 109/325/82 +f 110/332/83 105/331/83 106/330/83 109/329/83 +f 111/336/84 108/335/84 107/334/84 112/333/84 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/wolf.obj b/prismarine-viewer/viewer/lib/entity/models/wolf.obj new file mode 100644 index 00000000..086cda39 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/wolf.obj @@ -0,0 +1,509 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o head +v 0.25 0.84375 -0.3125 +v 0.25 0.84375 -0.5625 +v 0.25 0.46875 -0.3125 +v 0.25 0.46875 -0.5625 +v -0.125 0.84375 -0.5625 +v -0.125 0.84375 -0.3125 +v -0.125 0.46875 -0.5625 +v -0.125 0.46875 -0.3125 +vt 0.0625 0.875 +vt 0.15625 0.875 +vt 0.15625 0.6875 +vt 0.0625 0.6875 +vt 0 0.875 +vt 0.0625 0.875 +vt 0.0625 0.6875 +vt 0 0.6875 +vt 0.21875 0.875 +vt 0.3125 0.875 +vt 0.3125 0.6875 +vt 0.21875 0.6875 +vt 0.15625 0.875 +vt 0.21875 0.875 +vt 0.21875 0.6875 +vt 0.15625 0.6875 +vt 0.15625 0.875 +vt 0.0625 0.875 +vt 0.0625 1 +vt 0.15625 1 +vt 0.25 1 +vt 0.15625 1 +vt 0.15625 0.875 +vt 0.25 0.875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o head +v 0.25 0.96875 -0.375 +v 0.25 0.96875 -0.4375 +v 0.25 0.84375 -0.375 +v 0.25 0.84375 -0.4375 +v 0.125 0.96875 -0.4375 +v 0.125 0.96875 -0.375 +v 0.125 0.84375 -0.4375 +v 0.125 0.84375 -0.375 +vt 0.265625 0.53125 +vt 0.296875 0.53125 +vt 0.296875 0.46875 +vt 0.265625 0.46875 +vt 0.25 0.53125 +vt 0.265625 0.53125 +vt 0.265625 0.46875 +vt 0.25 0.46875 +vt 0.3125 0.53125 +vt 0.34375 0.53125 +vt 0.34375 0.46875 +vt 0.3125 0.46875 +vt 0.296875 0.53125 +vt 0.3125 0.53125 +vt 0.3125 0.46875 +vt 0.296875 0.46875 +vt 0.296875 0.53125 +vt 0.265625 0.53125 +vt 0.265625 0.5625 +vt 0.296875 0.5625 +vt 0.328125 0.5625 +vt 0.296875 0.5625 +vt 0.296875 0.53125 +vt 0.328125 0.53125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o head +v 0 0.96875 -0.375 +v 0 0.96875 -0.4375 +v 0 0.84375 -0.375 +v 0 0.84375 -0.4375 +v -0.125 0.96875 -0.4375 +v -0.125 0.96875 -0.375 +v -0.125 0.84375 -0.4375 +v -0.125 0.84375 -0.375 +vt 0.265625 0.53125 +vt 0.296875 0.53125 +vt 0.296875 0.46875 +vt 0.265625 0.46875 +vt 0.25 0.53125 +vt 0.265625 0.53125 +vt 0.265625 0.46875 +vt 0.25 0.46875 +vt 0.3125 0.53125 +vt 0.34375 0.53125 +vt 0.34375 0.46875 +vt 0.3125 0.46875 +vt 0.296875 0.53125 +vt 0.3125 0.53125 +vt 0.3125 0.46875 +vt 0.296875 0.46875 +vt 0.296875 0.53125 +vt 0.265625 0.53125 +vt 0.265625 0.5625 +vt 0.296875 0.5625 +vt 0.328125 0.5625 +vt 0.296875 0.5625 +vt 0.296875 0.53125 +vt 0.328125 0.53125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o head +v 0.15625 0.6572268750000001 -0.5 +v 0.15625 0.6572268750000001 -0.75 +v 0.15625 0.469726875 -0.5 +v 0.15625 0.469726875 -0.75 +v -0.03125 0.6572268750000001 -0.75 +v -0.03125 0.6572268750000001 -0.5 +v -0.03125 0.469726875 -0.75 +v -0.03125 0.469726875 -0.5 +vt 0.0625 0.5625 +vt 0.109375 0.5625 +vt 0.109375 0.46875 +vt 0.0625 0.46875 +vt 0 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.46875 +vt 0 0.46875 +vt 0.171875 0.5625 +vt 0.21875 0.5625 +vt 0.21875 0.46875 +vt 0.171875 0.46875 +vt 0.109375 0.5625 +vt 0.171875 0.5625 +vt 0.171875 0.46875 +vt 0.109375 0.46875 +vt 0.109375 0.5625 +vt 0.0625 0.5625 +vt 0.0625 0.6875 +vt 0.109375 0.6875 +vt 0.15625 0.6875 +vt 0.109375 0.6875 +vt 0.109375 0.5625 +vt 0.15625 0.5625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o body +v 0.25 0.8125 1.1102230246251565e-16 +v 0.25 0.4375 0 +v 0.25 0.8125 0.5625 +v 0.25 0.4375 0.5625 +v -0.125 0.4375 0 +v -0.125 0.8125 1.1102230246251565e-16 +v -0.125 0.4375 0.5625 +v -0.125 0.8125 0.5625 +vt 0.375 0.375 +vt 0.46875 0.375 +vt 0.46875 0.09375 +vt 0.375 0.09375 +vt 0.28125 0.375 +vt 0.375 0.375 +vt 0.375 0.09375 +vt 0.28125 0.09375 +vt 0.5625 0.375 +vt 0.65625 0.375 +vt 0.65625 0.09375 +vt 0.5625 0.09375 +vt 0.46875 0.375 +vt 0.5625 0.375 +vt 0.5625 0.09375 +vt 0.46875 0.09375 +vt 0.46875 0.375 +vt 0.375 0.375 +vt 0.375 0.5625 +vt 0.46875 0.5625 +vt 0.5625 0.5625 +vt 0.46875 0.5625 +vt 0.46875 0.375 +vt 0.5625 0.375 +vn 0 -1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 -1 +vn 0 -2.220446049250313e-16 1 +usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o upperBody +v 0.3125 0.4375 1.1102230246251565e-16 +v 0.3125 0.875 0 +v 0.3125 0.4374999999999999 -0.37499999999999994 +v 0.3125 0.875 -0.375 +v -0.1875 0.875 0 +v -0.1875 0.4375 1.1102230246251565e-16 +v -0.1875 0.875 -0.375 +v -0.1875 0.4374999999999999 -0.37499999999999994 +vt 0.4375 0.78125 +vt 0.5625 0.78125 +vt 0.5625 0.59375 +vt 0.4375 0.59375 +vt 0.328125 0.78125 +vt 0.4375 0.78125 +vt 0.4375 0.59375 +vt 0.328125 0.59375 +vt 0.671875 0.78125 +vt 0.796875 0.78125 +vt 0.796875 0.59375 +vt 0.671875 0.59375 +vt 0.5625 0.78125 +vt 0.671875 0.78125 +vt 0.671875 0.59375 +vt 0.5625 0.59375 +vt 0.5625 0.78125 +vt 0.4375 0.78125 +vt 0.4375 1 +vt 0.5625 1 +vt 0.6875 1 +vt 0.5625 1 +vt 0.5625 0.78125 +vt 0.6875 0.78125 +vn 0 1 -2.220446049250313e-16 +vn 1 0 0 +vn 0 -1 2.220446049250313e-16 +vn -1 0 0 +vn 0 2.220446049250313e-16 1 +vn 0 -2.220446049250313e-16 -1 +usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o leg0 +v 0.21875 0.5 0.5 +v 0.21875 0.5 0.375 +v 0.21875 0 0.5 +v 0.21875 0 0.375 +v 0.09375 0.5 0.375 +v 0.09375 0.5 0.5 +v 0.09375 0 0.375 +v 0.09375 0 0.5 +vt 0.03125 0.375 +vt 0.0625 0.375 +vt 0.0625 0.125 +vt 0.03125 0.125 +vt 0 0.375 +vt 0.03125 0.375 +vt 0.03125 0.125 +vt 0 0.125 +vt 0.09375 0.375 +vt 0.125 0.375 +vt 0.125 0.125 +vt 0.09375 0.125 +vt 0.0625 0.375 +vt 0.09375 0.375 +vt 0.09375 0.125 +vt 0.0625 0.125 +vt 0.0625 0.375 +vt 0.03125 0.375 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.375 +vt 0.09375 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o leg1 +v 0.03125 0.5 0.5 +v 0.03125 0.5 0.375 +v 0.03125 0 0.5 +v 0.03125 0 0.375 +v -0.09375 0.5 0.375 +v -0.09375 0.5 0.5 +v -0.09375 0 0.375 +v -0.09375 0 0.5 +vt 0.03125 0.375 +vt 0.0625 0.375 +vt 0.0625 0.125 +vt 0.03125 0.125 +vt 0 0.375 +vt 0.03125 0.375 +vt 0.03125 0.125 +vt 0 0.125 +vt 0.09375 0.375 +vt 0.125 0.375 +vt 0.125 0.125 +vt 0.09375 0.125 +vt 0.0625 0.375 +vt 0.09375 0.375 +vt 0.09375 0.125 +vt 0.0625 0.125 +vt 0.0625 0.375 +vt 0.03125 0.375 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.375 +vt 0.09375 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o leg2 +v 0.21875 0.5 -0.1875 +v 0.21875 0.5 -0.3125 +v 0.21875 0 -0.1875 +v 0.21875 0 -0.3125 +v 0.09375 0.5 -0.3125 +v 0.09375 0.5 -0.1875 +v 0.09375 0 -0.3125 +v 0.09375 0 -0.1875 +vt 0.03125 0.375 +vt 0.0625 0.375 +vt 0.0625 0.125 +vt 0.03125 0.125 +vt 0 0.375 +vt 0.03125 0.375 +vt 0.03125 0.125 +vt 0 0.125 +vt 0.09375 0.375 +vt 0.125 0.375 +vt 0.125 0.125 +vt 0.09375 0.125 +vt 0.0625 0.375 +vt 0.09375 0.375 +vt 0.09375 0.125 +vt 0.0625 0.125 +vt 0.0625 0.375 +vt 0.03125 0.375 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.375 +vt 0.09375 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o leg3 +v 0.03125 0.5 -0.1875 +v 0.03125 0.5 -0.3125 +v 0.03125 0 -0.1875 +v 0.03125 0 -0.3125 +v -0.09375 0.5 -0.3125 +v -0.09375 0.5 -0.1875 +v -0.09375 0 -0.3125 +v -0.09375 0 -0.1875 +vt 0.03125 0.375 +vt 0.0625 0.375 +vt 0.0625 0.125 +vt 0.03125 0.125 +vt 0 0.375 +vt 0.03125 0.375 +vt 0.03125 0.125 +vt 0 0.125 +vt 0.09375 0.375 +vt 0.125 0.375 +vt 0.125 0.125 +vt 0.09375 0.125 +vt 0.0625 0.375 +vt 0.09375 0.375 +vt 0.09375 0.125 +vt 0.0625 0.125 +vt 0.0625 0.375 +vt 0.03125 0.375 +vt 0.03125 0.4375 +vt 0.0625 0.4375 +vt 0.09375 0.4375 +vt 0.0625 0.4375 +vt 0.0625 0.375 +vt 0.09375 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 +o tail +v 0.125 0.8011970027680619 0.5358485272719404 +v 0.125 0.6988029972319381 0.46415147272805957 +v 0.125 0.5144087845925389 0.9454245494164362 +v 0.125 0.4120147790564149 0.8737274948725555 +v 0 0.6988029972319381 0.46415147272805957 +v 0 0.8011970027680619 0.5358485272719404 +v 0 0.4120147790564149 0.8737274948725555 +v 0 0.5144087845925389 0.9454245494164362 +vt 0.171875 0.375 +vt 0.203125 0.375 +vt 0.203125 0.125 +vt 0.171875 0.125 +vt 0.140625 0.375 +vt 0.171875 0.375 +vt 0.171875 0.125 +vt 0.140625 0.125 +vt 0.234375 0.375 +vt 0.265625 0.375 +vt 0.265625 0.125 +vt 0.234375 0.125 +vt 0.203125 0.375 +vt 0.234375 0.375 +vt 0.234375 0.125 +vt 0.203125 0.125 +vt 0.203125 0.375 +vt 0.171875 0.375 +vt 0.171875 0.4375 +vt 0.203125 0.4375 +vt 0.234375 0.4375 +vt 0.203125 0.4375 +vt 0.203125 0.375 +vt 0.234375 0.375 +vn 0 -0.8191520442889917 -0.5735764363510463 +vn 1 0 0 +vn 0 0.8191520442889917 0.5735764363510463 +vn -1 0 0 +vn 0 0.5735764363510463 -0.8191520442889917 +vn 0 -0.5735764363510463 0.8191520442889917 +usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd +f 84/244/61 87/243/61 85/242/61 82/241/61 +f 83/248/62 84/247/62 82/246/62 81/245/62 +f 88/252/63 83/251/63 81/250/63 86/249/63 +f 87/256/64 88/255/64 86/254/64 85/253/64 +f 86/260/65 81/259/65 82/258/65 85/257/65 +f 87/264/66 84/263/66 83/262/66 88/261/66 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/zombie.obj b/prismarine-viewer/viewer/lib/entity/models/zombie.obj new file mode 100644 index 00000000..bcd7444c --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/zombie.obj @@ -0,0 +1,325 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o Body +v 0.25 1.5 0.125 +v 0.25 1.5 -0.125 +v 0.25 0.75 0.125 +v 0.25 0.75 -0.125 +v -0.25 1.5 -0.125 +v -0.25 1.5 0.125 +v -0.25 0.75 -0.125 +v -0.25 0.75 0.125 +vt 0.3125 0.375 +vt 0.4375 0.375 +vt 0.4375 0 +vt 0.3125 0 +vt 0.25 0.375 +vt 0.3125 0.375 +vt 0.3125 0 +vt 0.25 0 +vt 0.5 0.375 +vt 0.625 0.375 +vt 0.625 0 +vt 0.5 0 +vt 0.4375 0.375 +vt 0.5 0.375 +vt 0.5 0 +vt 0.4375 0 +vt 0.4375 0.375 +vt 0.3125 0.375 +vt 0.3125 0.5 +vt 0.4375 0.5 +vt 0.5625 0.5 +vt 0.4375 0.5 +vt 0.4375 0.375 +vt 0.5625 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_9eb5cf2e-0212-52a4-6070-8cb3b67f2e24 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o Head +v 0.25 2 0.25 +v 0.25 2 -0.25 +v 0.25 1.5 0.25 +v 0.25 1.5 -0.25 +v -0.25 2 -0.25 +v -0.25 2 0.25 +v -0.25 1.5 -0.25 +v -0.25 1.5 0.25 +vt 0.125 0.75 +vt 0.25 0.75 +vt 0.25 0.5 +vt 0.125 0.5 +vt 0 0.75 +vt 0.125 0.75 +vt 0.125 0.5 +vt 0 0.5 +vt 0.375 0.75 +vt 0.5 0.75 +vt 0.5 0.5 +vt 0.375 0.5 +vt 0.25 0.75 +vt 0.375 0.75 +vt 0.375 0.5 +vt 0.25 0.5 +vt 0.25 0.75 +vt 0.125 0.75 +vt 0.125 1 +vt 0.25 1 +vt 0.375 1 +vt 0.25 1 +vt 0.25 0.75 +vt 0.375 0.75 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_9eb5cf2e-0212-52a4-6070-8cb3b67f2e24 +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o Hat Layer +v 0.28125 2.03125 0.28125 +v 0.28125 2.03125 -0.28125 +v 0.28125 1.46875 0.28125 +v 0.28125 1.46875 -0.28125 +v -0.28125 2.03125 -0.28125 +v -0.28125 2.03125 0.28125 +v -0.28125 1.46875 -0.28125 +v -0.28125 1.46875 0.28125 +vt 0.625 0.75 +vt 0.75 0.75 +vt 0.75 0.5 +vt 0.625 0.5 +vt 0.5 0.75 +vt 0.625 0.75 +vt 0.625 0.5 +vt 0.5 0.5 +vt 0.875 0.75 +vt 1 0.75 +vt 1 0.5 +vt 0.875 0.5 +vt 0.75 0.75 +vt 0.875 0.75 +vt 0.875 0.5 +vt 0.75 0.5 +vt 0.75 0.75 +vt 0.625 0.75 +vt 0.625 1 +vt 0.75 1 +vt 0.875 1 +vt 0.75 1 +vt 0.75 0.75 +vt 0.875 0.75 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_9eb5cf2e-0212-52a4-6070-8cb3b67f2e24 +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o RightArm +v 0.5 1.5 0.125 +v 0.5 1.5 -0.125 +v 0.5 0.75 0.125 +v 0.5 0.75 -0.125 +v 0.25 1.5 -0.125 +v 0.25 1.5 0.125 +v 0.25 0.75 -0.125 +v 0.25 0.75 0.125 +vt 0.6875 0.375 +vt 0.75 0.375 +vt 0.75 0 +vt 0.6875 0 +vt 0.625 0.375 +vt 0.6875 0.375 +vt 0.6875 0 +vt 0.625 0 +vt 0.8125 0.375 +vt 0.875 0.375 +vt 0.875 0 +vt 0.8125 0 +vt 0.75 0.375 +vt 0.8125 0.375 +vt 0.8125 0 +vt 0.75 0 +vt 0.75 0.375 +vt 0.6875 0.375 +vt 0.6875 0.5 +vt 0.75 0.5 +vt 0.8125 0.5 +vt 0.75 0.5 +vt 0.75 0.375 +vt 0.8125 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_9eb5cf2e-0212-52a4-6070-8cb3b67f2e24 +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o LeftArm +v -0.25 1.5 0.125 +v -0.25 1.5 -0.125 +v -0.25 0.75 0.125 +v -0.25 0.75 -0.125 +v -0.5 1.5 -0.125 +v -0.5 1.5 0.125 +v -0.5 0.75 -0.125 +v -0.5 0.75 0.125 +vt 0.75 0.375 +vt 0.6875 0.375 +vt 0.6875 0 +vt 0.75 0 +vt 0.8125 0.375 +vt 0.75 0.375 +vt 0.75 0 +vt 0.8125 0 +vt 0.875 0.375 +vt 0.8125 0.375 +vt 0.8125 0 +vt 0.875 0 +vt 0.6875 0.375 +vt 0.625 0.375 +vt 0.625 0 +vt 0.6875 0 +vt 0.6875 0.375 +vt 0.75 0.375 +vt 0.75 0.5 +vt 0.6875 0.5 +vt 0.75 0.5 +vt 0.8125 0.5 +vt 0.8125 0.375 +vt 0.75 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_9eb5cf2e-0212-52a4-6070-8cb3b67f2e24 +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o RightLeg +v 0.24375000000000002 0.75 0.125 +v 0.24375000000000002 0.75 -0.125 +v 0.24375000000000002 0 0.125 +v 0.24375000000000002 0 -0.125 +v -0.006249999999999978 0.75 -0.125 +v -0.006249999999999978 0.75 0.125 +v -0.006249999999999978 0 -0.125 +v -0.006249999999999978 0 0.125 +vt 0.0625 0.375 +vt 0.125 0.375 +vt 0.125 0 +vt 0.0625 0 +vt 0 0.375 +vt 0.0625 0.375 +vt 0.0625 0 +vt 0 0 +vt 0.1875 0.375 +vt 0.25 0.375 +vt 0.25 0 +vt 0.1875 0 +vt 0.125 0.375 +vt 0.1875 0.375 +vt 0.1875 0 +vt 0.125 0 +vt 0.125 0.375 +vt 0.0625 0.375 +vt 0.0625 0.5 +vt 0.125 0.5 +vt 0.1875 0.5 +vt 0.125 0.5 +vt 0.125 0.375 +vt 0.1875 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_9eb5cf2e-0212-52a4-6070-8cb3b67f2e24 +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o LeftLeg +v 0.006249999999999978 0.75 0.125 +v 0.006249999999999978 0.75 -0.125 +v 0.006249999999999978 0 0.125 +v 0.006249999999999978 0 -0.125 +v -0.24375000000000002 0.75 -0.125 +v -0.24375000000000002 0.75 0.125 +v -0.24375000000000002 0 -0.125 +v -0.24375000000000002 0 0.125 +vt 0.125 0.375 +vt 0.0625 0.375 +vt 0.0625 0 +vt 0.125 0 +vt 0.1875 0.375 +vt 0.125 0.375 +vt 0.125 0 +vt 0.1875 0 +vt 0.25 0.375 +vt 0.1875 0.375 +vt 0.1875 0 +vt 0.25 0 +vt 0.0625 0.375 +vt 0 0.375 +vt 0 0 +vt 0.0625 0 +vt 0.0625 0.375 +vt 0.125 0.375 +vt 0.125 0.5 +vt 0.0625 0.5 +vt 0.125 0.5 +vt 0.1875 0.5 +vt 0.1875 0.375 +vt 0.125 0.375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_9eb5cf2e-0212-52a4-6070-8cb3b67f2e24 +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 \ No newline at end of file diff --git a/prismarine-viewer/viewer/lib/entity/models/zombie_villager.obj b/prismarine-viewer/viewer/lib/entity/models/zombie_villager.obj new file mode 100644 index 00000000..22282802 --- /dev/null +++ b/prismarine-viewer/viewer/lib/entity/models/zombie_villager.obj @@ -0,0 +1,463 @@ +# Made in Blockbench 4.9.4 +mtllib materials.mtl + +o Body +v 0.25 1.5 0.1875 +v 0.25 1.5 -0.1875 +v 0.25 0.75 0.1875 +v 0.25 0.75 -0.1875 +v -0.25 1.5 -0.1875 +v -0.25 1.5 0.1875 +v -0.25 0.75 -0.1875 +v -0.25 0.75 0.1875 +vt 0.34375 0.59375 +vt 0.46875 0.59375 +vt 0.46875 0.40625 +vt 0.34375 0.40625 +vt 0.25 0.59375 +vt 0.34375 0.59375 +vt 0.34375 0.40625 +vt 0.25 0.40625 +vt 0.5625 0.59375 +vt 0.6875 0.59375 +vt 0.6875 0.40625 +vt 0.5625 0.40625 +vt 0.46875 0.59375 +vt 0.5625 0.59375 +vt 0.5625 0.40625 +vt 0.46875 0.40625 +vt 0.46875 0.59375 +vt 0.34375 0.59375 +vt 0.34375 0.6875 +vt 0.46875 0.6875 +vt 0.59375 0.6875 +vt 0.46875 0.6875 +vt 0.46875 0.59375 +vt 0.59375 0.59375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +f 6/20/5 1/19/5 2/18/5 5/17/5 +f 7/24/6 4/23/6 3/22/6 8/21/6 +o Body +v 0.28125 1.53125 0.21875 +v 0.28125 1.53125 -0.21875 +v 0.28125 0.34375 0.21875 +v 0.28125 0.34375 -0.21875 +v -0.28125 1.53125 -0.21875 +v -0.28125 1.53125 0.21875 +v -0.28125 0.34375 -0.21875 +v -0.28125 0.34375 0.21875 +vt 0.09375 0.3125 +vt 0.21875 0.3125 +vt 0.21875 0.03125 +vt 0.09375 0.03125 +vt 0 0.3125 +vt 0.09375 0.3125 +vt 0.09375 0.03125 +vt 0 0.03125 +vt 0.3125 0.3125 +vt 0.4375 0.3125 +vt 0.4375 0.03125 +vt 0.3125 0.03125 +vt 0.21875 0.3125 +vt 0.3125 0.3125 +vt 0.3125 0.03125 +vt 0.21875 0.03125 +vt 0.21875 0.3125 +vt 0.09375 0.3125 +vt 0.09375 0.40625 +vt 0.21875 0.40625 +vt 0.34375 0.40625 +vt 0.21875 0.40625 +vt 0.21875 0.3125 +vt 0.34375 0.3125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d +f 12/28/7 15/27/7 13/26/7 10/25/7 +f 11/32/8 12/31/8 10/30/8 9/29/8 +f 16/36/9 11/35/9 9/34/9 14/33/9 +f 15/40/10 16/39/10 14/38/10 13/37/10 +f 14/44/11 9/43/11 10/42/11 13/41/11 +f 15/48/12 12/47/12 11/46/12 16/45/12 +o Head +v 0.265625 2.140625 0.265625 +v 0.265625 2.140625 -0.265625 +v 0.265625 1.484375 0.265625 +v 0.265625 1.484375 -0.265625 +v -0.265625 2.140625 -0.265625 +v -0.265625 2.140625 0.265625 +v -0.265625 1.484375 -0.265625 +v -0.265625 1.484375 0.265625 +vt 0.125 0.875 +vt 0.25 0.875 +vt 0.25 0.71875 +vt 0.125 0.71875 +vt 0 0.875 +vt 0.125 0.875 +vt 0.125 0.71875 +vt 0 0.71875 +vt 0.375 0.875 +vt 0.5 0.875 +vt 0.5 0.71875 +vt 0.375 0.71875 +vt 0.25 0.875 +vt 0.375 0.875 +vt 0.375 0.71875 +vt 0.25 0.71875 +vt 0.25 0.875 +vt 0.125 0.875 +vt 0.125 1 +vt 0.25 1 +vt 0.375 1 +vt 0.25 1 +vt 0.25 0.875 +vt 0.375 0.875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d +f 20/52/13 23/51/13 21/50/13 18/49/13 +f 19/56/14 20/55/14 18/54/14 17/53/14 +f 24/60/15 19/59/15 17/58/15 22/57/15 +f 23/64/16 24/63/16 22/62/16 21/61/16 +f 22/68/17 17/67/17 18/66/17 21/65/17 +f 23/72/18 20/71/18 19/70/18 24/69/18 +o Head +v 0.078125 1.703125 -0.234375 +v 0.078125 1.703125 -0.390625 +v 0.078125 1.421875 -0.234375 +v 0.078125 1.421875 -0.390625 +v -0.078125 1.703125 -0.390625 +v -0.078125 1.703125 -0.234375 +v -0.078125 1.421875 -0.390625 +v -0.078125 1.421875 -0.234375 +vt 0.40625 0.96875 +vt 0.4375 0.96875 +vt 0.4375 0.90625 +vt 0.40625 0.90625 +vt 0.375 0.96875 +vt 0.40625 0.96875 +vt 0.40625 0.90625 +vt 0.375 0.90625 +vt 0.46875 0.96875 +vt 0.5 0.96875 +vt 0.5 0.90625 +vt 0.46875 0.90625 +vt 0.4375 0.96875 +vt 0.46875 0.96875 +vt 0.46875 0.90625 +vt 0.4375 0.90625 +vt 0.4375 0.96875 +vt 0.40625 0.96875 +vt 0.40625 1 +vt 0.4375 1 +vt 0.46875 1 +vt 0.4375 1 +vt 0.4375 0.96875 +vt 0.46875 0.96875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d +f 28/76/19 31/75/19 29/74/19 26/73/19 +f 27/80/20 28/79/20 26/78/20 25/77/20 +f 32/84/21 27/83/21 25/82/21 30/81/21 +f 31/88/22 32/87/22 30/86/22 29/85/22 +f 30/92/23 25/91/23 26/90/23 29/89/23 +f 31/96/24 28/95/24 27/94/24 32/93/24 +o Head Layer +v 0.28125 2.15625 0.28125 +v 0.28125 2.15625 -0.28125 +v 0.28125 1.46875 0.28125 +v 0.28125 1.46875 -0.28125 +v -0.28125 2.15625 -0.28125 +v -0.28125 2.15625 0.28125 +v -0.28125 1.46875 -0.28125 +v -0.28125 1.46875 0.28125 +vt 0.625 0.875 +vt 0.75 0.875 +vt 0.75 0.71875 +vt 0.625 0.71875 +vt 0.5 0.875 +vt 0.625 0.875 +vt 0.625 0.71875 +vt 0.5 0.71875 +vt 0.875 0.875 +vt 1 0.875 +vt 1 0.71875 +vt 0.875 0.71875 +vt 0.75 0.875 +vt 0.875 0.875 +vt 0.875 0.71875 +vt 0.75 0.71875 +vt 0.75 0.875 +vt 0.625 0.875 +vt 0.625 1 +vt 0.75 1 +vt 0.875 1 +vt 0.75 1 +vt 0.75 0.875 +vt 0.875 0.875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d +f 36/100/25 39/99/25 37/98/25 34/97/25 +f 35/104/26 36/103/26 34/102/26 33/101/26 +f 40/108/27 35/107/27 33/106/27 38/105/27 +f 39/112/28 40/111/28 38/110/28 37/109/28 +f 38/116/29 33/115/29 34/114/29 37/113/29 +f 39/120/30 36/119/30 35/118/30 40/117/30 +o brim +v 0.5062500000000001 2.00625 -0.30625 +v 0.5062500000000001 2.00625 -0.38125 +v 0.5062500000000001 0.9937499999999999 -0.30625 +v 0.5062500000000001 0.9937499999999999 -0.38125 +v -0.50625 2.00625 -0.38125 +v -0.50625 2.00625 -0.30625 +v -0.50625 0.9937499999999999 -0.38125 +v -0.50625 0.9937499999999999 -0.30625 +vt 0.484375 0.25 +vt 0.734375 0.25 +vt 0.734375 0 +vt 0.484375 0 +vt 0.46875 0.25 +vt 0.484375 0.25 +vt 0.484375 0 +vt 0.46875 0 +vt 0.75 0.25 +vt 1 0.25 +vt 1 0 +vt 0.75 0 +vt 0.734375 0.25 +vt 0.75 0.25 +vt 0.75 0 +vt 0.734375 0 +vt 0.734375 0.25 +vt 0.484375 0.25 +vt 0.484375 0.265625 +vt 0.734375 0.265625 +vt 0.984375 0.265625 +vt 0.734375 0.265625 +vt 0.734375 0.25 +vt 0.984375 0.25 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d +f 44/124/31 47/123/31 45/122/31 42/121/31 +f 43/128/32 44/127/32 42/126/32 41/125/32 +f 48/132/33 43/131/33 41/130/33 46/129/33 +f 47/136/34 48/135/34 46/134/34 45/133/34 +f 46/140/35 41/139/35 42/138/35 45/137/35 +f 47/144/36 44/143/36 43/142/36 48/141/36 +o RightArm +v 0.5 1.5 0.125 +v 0.5 1.5 -0.125 +v 0.5 0.75 0.125 +v 0.5 0.75 -0.125 +v 0.25 1.5 -0.125 +v 0.25 1.5 0.125 +v 0.25 0.75 -0.125 +v 0.25 0.75 0.125 +vt 0.75 0.59375 +vt 0.8125 0.59375 +vt 0.8125 0.40625 +vt 0.75 0.40625 +vt 0.6875 0.59375 +vt 0.75 0.59375 +vt 0.75 0.40625 +vt 0.6875 0.40625 +vt 0.875 0.59375 +vt 0.9375 0.59375 +vt 0.9375 0.40625 +vt 0.875 0.40625 +vt 0.8125 0.59375 +vt 0.875 0.59375 +vt 0.875 0.40625 +vt 0.8125 0.40625 +vt 0.8125 0.59375 +vt 0.75 0.59375 +vt 0.75 0.65625 +vt 0.8125 0.65625 +vt 0.875 0.65625 +vt 0.8125 0.65625 +vt 0.8125 0.59375 +vt 0.875 0.59375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d +f 52/148/37 55/147/37 53/146/37 50/145/37 +f 51/152/38 52/151/38 50/150/38 49/149/38 +f 56/156/39 51/155/39 49/154/39 54/153/39 +f 55/160/40 56/159/40 54/158/40 53/157/40 +f 54/164/41 49/163/41 50/162/41 53/161/41 +f 55/168/42 52/167/42 51/166/42 56/165/42 +o LeftArm +v -0.25 1.5 0.125 +v -0.25 1.5 -0.125 +v -0.25 0.75 0.125 +v -0.25 0.75 -0.125 +v -0.5 1.5 -0.125 +v -0.5 1.5 0.125 +v -0.5 0.75 -0.125 +v -0.5 0.75 0.125 +vt 0.8125 0.59375 +vt 0.75 0.59375 +vt 0.75 0.40625 +vt 0.8125 0.40625 +vt 0.875 0.59375 +vt 0.8125 0.59375 +vt 0.8125 0.40625 +vt 0.875 0.40625 +vt 0.9375 0.59375 +vt 0.875 0.59375 +vt 0.875 0.40625 +vt 0.9375 0.40625 +vt 0.75 0.59375 +vt 0.6875 0.59375 +vt 0.6875 0.40625 +vt 0.75 0.40625 +vt 0.75 0.59375 +vt 0.8125 0.59375 +vt 0.8125 0.65625 +vt 0.75 0.65625 +vt 0.8125 0.65625 +vt 0.875 0.65625 +vt 0.875 0.59375 +vt 0.8125 0.59375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d +f 60/172/43 63/171/43 61/170/43 58/169/43 +f 59/176/44 60/175/44 58/174/44 57/173/44 +f 64/180/45 59/179/45 57/178/45 62/177/45 +f 63/184/46 64/183/46 62/182/46 61/181/46 +f 62/188/47 57/187/47 58/186/47 61/185/47 +f 63/192/48 60/191/48 59/190/48 64/189/48 +o RightLeg +v 0.25 0.75 0.125 +v 0.25 0.75 -0.125 +v 0.25 0 0.125 +v 0.25 0 -0.125 +v 0 0.75 -0.125 +v 0 0.75 0.125 +v 0 0 -0.125 +v 0 0 0.125 +vt 0.0625 0.59375 +vt 0.125 0.59375 +vt 0.125 0.40625 +vt 0.0625 0.40625 +vt 0 0.59375 +vt 0.0625 0.59375 +vt 0.0625 0.40625 +vt 0 0.40625 +vt 0.1875 0.59375 +vt 0.25 0.59375 +vt 0.25 0.40625 +vt 0.1875 0.40625 +vt 0.125 0.59375 +vt 0.1875 0.59375 +vt 0.1875 0.40625 +vt 0.125 0.40625 +vt 0.125 0.59375 +vt 0.0625 0.59375 +vt 0.0625 0.65625 +vt 0.125 0.65625 +vt 0.1875 0.65625 +vt 0.125 0.65625 +vt 0.125 0.59375 +vt 0.1875 0.59375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d +f 68/196/49 71/195/49 69/194/49 66/193/49 +f 67/200/50 68/199/50 66/198/50 65/197/50 +f 72/204/51 67/203/51 65/202/51 70/201/51 +f 71/208/52 72/207/52 70/206/52 69/205/52 +f 70/212/53 65/211/53 66/210/53 69/209/53 +f 71/216/54 68/215/54 67/214/54 72/213/54 +o LeftLeg +v 0 0.75 0.125 +v 0 0.75 -0.125 +v 0 0 0.125 +v 0 0 -0.125 +v -0.25 0.75 -0.125 +v -0.25 0.75 0.125 +v -0.25 0 -0.125 +v -0.25 0 0.125 +vt 0.125 0.59375 +vt 0.0625 0.59375 +vt 0.0625 0.40625 +vt 0.125 0.40625 +vt 0.1875 0.59375 +vt 0.125 0.59375 +vt 0.125 0.40625 +vt 0.1875 0.40625 +vt 0.25 0.59375 +vt 0.1875 0.59375 +vt 0.1875 0.40625 +vt 0.25 0.40625 +vt 0.0625 0.59375 +vt 0 0.59375 +vt 0 0.40625 +vt 0.0625 0.40625 +vt 0.0625 0.59375 +vt 0.125 0.59375 +vt 0.125 0.65625 +vt 0.0625 0.65625 +vt 0.125 0.65625 +vt 0.1875 0.65625 +vt 0.1875 0.59375 +vt 0.125 0.59375 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d +f 76/220/55 79/219/55 77/218/55 74/217/55 +f 75/224/56 76/223/56 74/222/56 73/221/56 +f 80/228/57 75/227/57 73/226/57 78/225/57 +f 79/232/58 80/231/58 78/230/58 77/229/58 +f 78/236/59 73/235/59 74/234/59 77/233/59 +f 79/240/60 76/239/60 75/238/60 80/237/60 \ No newline at end of file diff --git a/src/panorama.ts b/src/panorama.ts index 3d7aec32..59df54e4 100644 --- a/src/panorama.ts +++ b/src/panorama.ts @@ -3,7 +3,7 @@ import { join } from 'path' import fs from 'fs' import { subscribeKey } from 'valtio/utils' -import Entity from 'prismarine-viewer/viewer/lib/entity/Entity' +import { EntityMesh } from 'prismarine-viewer/viewer/lib/entity/EntityMesh' import { fromTexturePackPath, resourcePackState } from './texturePack' import { options, watchValue } from './optionsStorage' import { miscUiState } from './globalState' @@ -102,7 +102,7 @@ export async function addPanoramaCubeMap () { // should be rewritten entirely for (let i = 0; i < 20; i++) { - const m = new Entity('1.16.4', 'squid').mesh + const m = new EntityMesh('1.16.4', 'squid').mesh! m.position.set(Math.random() * 30 - 15, Math.random() * 20 - 10, Math.random() * 10 - 17) m.rotation.set(0, Math.PI + Math.random(), -Math.PI / 4, 'ZYX') const v = Math.random() * 0.01 From 18b6661b94f6c2ecce621c492239bedc9192e7bf Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 18 Apr 2024 09:59:13 +0300 Subject: [PATCH 0129/1195] fix some items rendering --- prismarine-viewer/viewer/lib/entities.js | 3 ++- src/index.ts | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/prismarine-viewer/viewer/lib/entities.js b/prismarine-viewer/viewer/lib/entities.js index d97784d4..350dc53e 100644 --- a/prismarine-viewer/viewer/lib/entities.js +++ b/prismarine-viewer/viewer/lib/entities.js @@ -86,7 +86,7 @@ function getEntityMesh (entity, scene, options, overrides) { } export class Entities extends EventEmitter { - constructor (scene) { + constructor(scene) { super() this.scene = scene this.entities = {} @@ -279,6 +279,7 @@ export class Entities extends EventEmitter { if (item) { const textureUv = this.getItemUv?.(item.itemId ?? item.blockId) if (textureUv) { + // todo use geometry buffer uv instead! const { u, v, size, su, sv, texture } = textureUv const itemsTexture = texture.clone() itemsTexture.flipY = true diff --git a/src/index.ts b/src/index.ts index c6981fd3..e68ca4f5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -144,7 +144,9 @@ new THREE.TextureLoader().load(itemsPng, (texture) => { const name = loadedData.items[id]?.name const uv = itemsAtlases.latest.textures[name] if (!uv) { - const uvBlock = viewer.world.downloadedBlockStatesData[name]?.variants?.['']?.[0].model?.elements?.[0]?.faces?.north.texture + const variant = viewer.world.downloadedBlockStatesData[name]?.variants?.[''] + if (!variant) return + const uvBlock = (Array.isArray(variant) ? variant[0] : variant).model?.elements?.[0]?.faces?.north.texture if (!uvBlock) return return { ...uvBlock, From b121cc36070724082ad1a08c11f5bd0e6d1bf396 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 18 Apr 2024 11:00:14 +0300 Subject: [PATCH 0130/1195] fix regression for some sides rendering when connected to unsupported block --- prismarine-viewer/viewer/lib/mesher/models.ts | 9 ++++++++- prismarine-viewer/viewer/lib/mesher/world.ts | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/prismarine-viewer/viewer/lib/mesher/models.ts b/prismarine-viewer/viewer/lib/mesher/models.ts index c9e2bd3b..e9327621 100644 --- a/prismarine-viewer/viewer/lib/mesher/models.ts +++ b/prismarine-viewer/viewer/lib/mesher/models.ts @@ -119,11 +119,18 @@ function getLiquidRenderHeight (world, block, type, pos) { return ((block.metadata >= 8 ? 8 : 7 - block.metadata) + 1) / 9 } +const everyArray = (array, callback) => { + if (!array?.length) return false + return array.every(callback) +} + + const isCube = (block) => { if (!block || block.transparent) return false if (block.isCube) return true if (!block.variant) block.variant = getModelVariants(block) - return block.variant.every(v => v?.model?.elements.every(e => { + if (!block.variant.length) return false + return block.variant.every(v => everyArray(v?.model?.elements, e => { return e.from[0] === 0 && e.from[1] === 0 && e.from[2] === 0 && e.to[0] === 16 && e.to[1] === 16 && e.to[2] === 16 })) } diff --git a/prismarine-viewer/viewer/lib/mesher/world.ts b/prismarine-viewer/viewer/lib/mesher/world.ts index c27d2b8d..af9d3d9f 100644 --- a/prismarine-viewer/viewer/lib/mesher/world.ts +++ b/prismarine-viewer/viewer/lib/mesher/world.ts @@ -74,6 +74,7 @@ export class World { } setBlockStateId (pos: Vec3, stateId) { + if (stateId === undefined) throw new Error('stateId is undefined') const key = columnKey(Math.floor(pos.x / 16) * 16, Math.floor(pos.z / 16) * 16) const column = this.columns[key] From eba9fc283959bb07819979a0a4db6be62d807a8e Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 18 Apr 2024 11:36:55 +0300 Subject: [PATCH 0131/1195] fix: fix all known digging issues including fastdigging detection --- src/worldInteractions.ts | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/worldInteractions.ts b/src/worldInteractions.ts index 9353670c..b2602cc5 100644 --- a/src/worldInteractions.ts +++ b/src/worldInteractions.ts @@ -36,11 +36,13 @@ class WorldInteraction { buttons = [false, false, false] lastButtons = [false, false, false] breakStartTime: number | undefined = 0 + lastDugBlock: Vec3 | null = null cursorBlock: import('prismarine-block').Block | null = null blockBreakMesh: THREE.Mesh breakTextures: THREE.Texture[] lastDigged: number lineMaterial: LineMaterial + debugStatus: string oneTimeInit () { const loader = new THREE.TextureLoader() @@ -89,6 +91,9 @@ class WorldInteraction { bot.attack(entity) } }) + document.addEventListener('blur', (e) => { + this.buttons = [false, false, false] + }) beforeRenderFrame.push(() => { if (this.lineMaterial) { @@ -106,11 +111,25 @@ class WorldInteraction { } assertDefined(viewer) bot.on('physicsTick', () => { if (this.lastBlockPlaced < 4) this.lastBlockPlaced++ }) - bot.on('diggingCompleted', () => { + bot.on('diggingCompleted', (block) => { this.breakStartTime = undefined + this.lastDugBlock = block.position + // TODO: If the tool and enchantments immediately exceed the hardness times 30, the block breaks with no delay; SO WE NEED TO CHECK THAT + // TODO: Any blocks with a breaking time of 0.05 + this.lastDigged = Date.now() + this.debugStatus = 'done' }) - bot.on('diggingAborted', () => { + bot.on('diggingAborted', (block) => { + if (!this.cursorBlock?.position.equals(block.position)) return + this.debugStatus = 'aborted' + // if (this.lastDugBlock) this.breakStartTime = undefined + if (this.buttons[0]) { + this.buttons[0] = false + this.update() + this.buttons[0] = true // trigger again + } + this.lastDugBlock = null }) const upLineMaterial = () => { @@ -210,6 +229,11 @@ class WorldInteraction { bot.stopDigging() // this shouldnt throw anything... } catch (e) { } // to be reworked in mineflayer, then remove the try here } + // We stopped breaking + if ((!this.buttons[0] && this.lastButtons[0])) { + this.lastDugBlock = null + this.debugStatus = 'cancelled' + } const onGround = bot.entity.onGround || bot.game.gameMode === 'creative' this.prevOnGround ??= onGround // todo this should be fixed in mineflayer to involve correct calculations when this changes as this is very important when mining straight down // todo this should be fixed in mineflayer to involve correct calculations when this changes as this is very important when mining straight down // todo this should be fixed in mineflayer to involve correct calculations when this changes as this is very important when mining straight down @@ -219,8 +243,10 @@ class WorldInteraction { this.buttons[0] ) { if (cursorBlockDiggable - && (!this.lastButtons[0] || (cursorChanged && Date.now() - (this.lastDigged ?? 0) > 100) || onGround !== this.prevOnGround) + && (!this.lastButtons[0] || ((cursorChanged || (this.lastDugBlock && !this.lastDugBlock.equals(cursorBlock!.position))) && Date.now() - (this.lastDigged ?? 0) > 300) || onGround !== this.prevOnGround) && onGround) { + this.lastDugBlock = null + this.debugStatus = 'breaking' this.currentDigTime = bot.digTime(cursorBlockDiggable) this.breakStartTime = performance.now() const vecArray = [new Vec3(0, -1, 0), new Vec3(0, 1, 0), new Vec3(0, 0, -1), new Vec3(0, 0, 1), new Vec3(-1, 0, 0), new Vec3(1, 0, 0)] @@ -331,4 +357,6 @@ export const getEntityCursor = () => { return entity } -export default new WorldInteraction() +const worldInteraction = new WorldInteraction() +globalThis.worldInteraction = worldInteraction +export default worldInteraction From 1c78fd1d51ce383e918cceb7c7064efa78572493 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 18 Apr 2024 11:52:36 +0300 Subject: [PATCH 0132/1195] do the check earlier for message --- src/index.ts | 5 +++-- src/soundSystem.ts | 20 +++++++++++++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/index.ts b/src/index.ts index e68ca4f5..8f55f8c9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -27,7 +27,7 @@ import 'core-js/features/array/at' import 'core-js/features/promise/with-resolvers' import itemsPng from 'prismarine-viewer/public/textures/items.png' -import { initWithRenderer, statsEnd, statsStart } from './topRightStats' +import { initWithRenderer } from './topRightStats' import PrismarineBlock from 'prismarine-block' import { options, watchValue } from './optionsStorage' @@ -90,7 +90,7 @@ import { watchFov } from './rendererUtils' import { loadInMemorySave } from './react/SingleplayerProvider' // side effects -import { downloadSoundsIfNeeded } from './soundSystem' +import { downloadSoundsIfNeeded, earlyCheck as earlySoundsMapCheck } from './soundSystem' import { ua } from './react/utils' import { handleMovementStickDelta, joystickPointer } from './react/TouchAreasControls' import { possiblyHandleStateVariable } from './googledrive' @@ -379,6 +379,7 @@ async function connect (connectOptions: { } } viewer.setVersion(version) + earlySoundsMapCheck() } const downloadVersion = connectOptions.botVersion || (singleplayer ? serverOptions.version : undefined) diff --git a/src/soundSystem.ts b/src/soundSystem.ts index e48f8e60..254b5f5d 100644 --- a/src/soundSystem.ts +++ b/src/soundSystem.ts @@ -20,13 +20,7 @@ subscribeKey(miscUiState, 'gameLoaded', async () => { // todo also use major versioned hardcoded sounds const soundsMap = allSoundsMap[bot.version] - if (!soundsMap) { - console.warn('No sounds map for version', bot.version, 'supported versions are', Object.keys(allSoundsMap).join(', ')) - showNotification('Warning', 'No sounds map for version ' + bot.version) - return - } - - if (!miscUiState.gameLoaded || !soundsMap) { + if (!soundsMap || !miscUiState.gameLoaded || !soundsMap) { return } @@ -221,6 +215,18 @@ subscribeKey(miscUiState, 'gameLoaded', async () => { // }) }) +export const earlyCheck = () => { + const allSoundsMap = window.allSoundsMap as Record> + + // todo also use major versioned hardcoded sounds + const soundsMap = allSoundsMap[bot.version] + + if (!soundsMap) { + console.warn('No sounds map for version', bot.version, 'supported versions are', Object.keys(allSoundsMap).join(', ')) + showNotification('Warning', 'No sounds map for version ' + bot.version) + } +} + const getVersionedSound = (version: string, item: string, itemsMapSortedEntries: Array<[string, string[]]>) => { const verNumber = versionToNumber(version) for (const [itemsVer, items] of itemsMapSortedEntries) { From 4fb2de503be7c62e9a58428f87a1ee80847189d3 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 19 Apr 2024 23:46:55 +0300 Subject: [PATCH 0133/1195] fix entities render & crash --- prismarine-viewer/viewer/lib/entity/EntityMesh.js | 4 +++- src/index.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/prismarine-viewer/viewer/lib/entity/EntityMesh.js b/prismarine-viewer/viewer/lib/entity/EntityMesh.js index 6acb665a..8f8812d0 100644 --- a/prismarine-viewer/viewer/lib/entity/EntityMesh.js +++ b/prismarine-viewer/viewer/lib/entity/EntityMesh.js @@ -324,9 +324,10 @@ export class EntityMesh { const material = new THREE.MeshBasicMaterial({ map: texture, transparent: true, + alphaTest: 0.1 }) const obj = objLoader.parse(externalModels[type]) - this.mesh = obj + if (type === 'boat') obj.position.y = -1 // todo, should not be hardcoded obj.traverse((child) => { if (child instanceof THREE.Mesh) { child.material = material @@ -339,6 +340,7 @@ export class EntityMesh { } } }) + this.mesh = obj return } diff --git a/src/index.ts b/src/index.ts index 8f55f8c9..10090dc7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -379,7 +379,6 @@ async function connect (connectOptions: { } } viewer.setVersion(version) - earlySoundsMapCheck() } const downloadVersion = connectOptions.botVersion || (singleplayer ? serverOptions.version : undefined) @@ -457,6 +456,7 @@ async function connect (connectOptions: { } }) as unknown as typeof __type_bot window.bot = bot + earlySoundsMapCheck() if (singleplayer || p2pMultiplayer) { // in case of p2pMultiplayer there is still flying-squid on the host side const _supportFeature = bot.supportFeature From 0acaa652a3187704096726b60bfc0ff0fbac6b33 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 20 Apr 2024 13:16:36 +0300 Subject: [PATCH 0134/1195] big worlds refactor with more scalable api, which allows hmr workers fix: better free up ram after world unload & create meshers only when needed feat: add low ram setting, which makes chunks load performance ~4x worse --- README.MD | 7 ++ prismarine-viewer/tsconfig.json | 15 ++-- prismarine-viewer/viewer/lib/mesher/mesher.ts | 21 +++-- prismarine-viewer/viewer/lib/mesher/models.ts | 4 +- .../viewer/lib/mesher/test/mesherTester.ts | 4 +- prismarine-viewer/viewer/lib/mesher/world.ts | 12 +-- prismarine-viewer/viewer/lib/viewer.ts | 18 ++-- .../viewer/lib/worldDataEmitter.ts | 8 +- .../viewer/lib/worldrendererCommon.ts | 83 ++++++++++++++----- .../viewer/lib/worldrendererThree.ts | 15 ++-- src/index.ts | 2 +- src/optionsGuiScheme.tsx | 37 ++++++--- src/optionsStorage.ts | 1 + src/react/OptionsItems.tsx | 23 ++++- src/soundSystem.ts | 26 +++++- src/texturePack.ts | 2 +- src/watchOptions.ts | 16 ++-- tsconfig.json | 1 + 18 files changed, 203 insertions(+), 92 deletions(-) diff --git a/README.MD b/README.MD index 4431fe03..7a93ce7e 100644 --- a/README.MD +++ b/README.MD @@ -19,6 +19,13 @@ You can try this out at [mcraft.fun](https://mcraft.fun/), [pcm.gg](https://pcm. - Resource pack support - even even more! +### Recommended Settings + +- Controls -> **Raw Input** -> **On** - This will make the controls more precise +- Controls -> **Touch Controls Type** -> **Joystick** +- Controls -> **Auto Full Screen** -> **On** - To avoid ctrl+w issue +- Interface -> **Chat Select** -> **On** - To select chat messages + ### World Loading Zip files and folders are supported. Just drag and drop them into the browser window. You can open folders in readonly and read-write mode. New chunks may be generated incorrectly for now. diff --git a/prismarine-viewer/tsconfig.json b/prismarine-viewer/tsconfig.json index 1cf48c6e..b6e39df3 100644 --- a/prismarine-viewer/tsconfig.json +++ b/prismarine-viewer/tsconfig.json @@ -1,9 +1,10 @@ { - "compilerOptions": { - "module": "commonjs", - "strictNullChecks": true - }, - "files": [ - "index.d.ts" - ] + "compilerOptions": { + "module": "commonjs", + "strictNullChecks": true, + "experimentalDecorators": true + }, + "files": [ + "index.d.ts" + ] } diff --git a/prismarine-viewer/viewer/lib/mesher/mesher.ts b/prismarine-viewer/viewer/lib/mesher/mesher.ts index 28859a3e..0bcf7250 100644 --- a/prismarine-viewer/viewer/lib/mesher/mesher.ts +++ b/prismarine-viewer/viewer/lib/mesher/mesher.ts @@ -1,6 +1,6 @@ import { World } from './world' import { Vec3 } from 'vec3' -import { getSectionGeometry, setRendererData } from './models' +import { getSectionGeometry, setBlockStatesData } from './models' if (module.require) { // If we are in a node environement, we need to fake some env variables @@ -39,7 +39,8 @@ function setSectionDirty (pos, value = true) { } const softCleanup = () => { - world.blockCache = {} + // clean block cache and loaded chunks + world = new World(world.config.version) } self.onmessage = ({ data }) => { @@ -47,16 +48,18 @@ self.onmessage = ({ data }) => { if (data.type === 'mcData') { globalVar.mcData = data.mcData - world = new World(data.version) - } else if (data.type === 'rendererData') { - setRendererData(data.json/* , data.textureSize */) - world.outputFormat = data.outputFormat ?? world.outputFormat + } + + if (data.config) { + world ??= new World(data.config.version) + world.config = {...world.config, ...data.config} + } + + if (data.type === 'mesherData') { + setBlockStatesData(data.json) blockStatesReady = true } else if (data.type === 'dirty') { const loc = new Vec3(data.x, data.y, data.z) - world.skyLight = data.skyLight - world.smoothLighting = data.smoothLighting - world.enableLighting = data.enableLighting setSectionDirty(loc, data.value) } else if (data.type === 'chunk') { world.addColumn(data.x, data.z, data.chunk) diff --git a/prismarine-viewer/viewer/lib/mesher/models.ts b/prismarine-viewer/viewer/lib/mesher/models.ts index e9327621..29b4edb5 100644 --- a/prismarine-viewer/viewer/lib/mesher/models.ts +++ b/prismarine-viewer/viewer/lib/mesher/models.ts @@ -386,7 +386,7 @@ function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr const corner = world.getBlock(cursor.offset(...cornerDir)) let cornerLightResult = 15 - if (world.smoothLighting) { + if (world.config.smoothLighting) { const side1Light = world.getLight(cursor.plus(new Vec3(...side1Dir)), true) const side2Light = world.getLight(cursor.plus(new Vec3(...side2Dir)), true) const cornerLight = world.getLight(cursor.plus(new Vec3(...cornerDir)), true) @@ -605,7 +605,7 @@ function getModelVariants (block: import('prismarine-block').Block) { return [] } -export const setRendererData = (_blockStates: BlockStatesOutput | null, _needTiles = false) => { +export const setBlockStatesData = (_blockStates: BlockStatesOutput | null, _needTiles = false) => { blockStates = _blockStates! needTiles = _needTiles } diff --git a/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts b/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts index 15ec165b..21c5d129 100644 --- a/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts +++ b/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts @@ -1,4 +1,4 @@ -import { setRendererData, getSectionGeometry } from '../models' +import { setBlockStatesData, getSectionGeometry } from '../models' import { World as MesherWorld } from '../world' import ChunkLoader from 'prismarine-chunk' import { Vec3 } from 'vec3' @@ -30,7 +30,7 @@ export const setup = (version, initialBlocks: [number[], string][]) => { } } - setRendererData(blockStates, true) + setBlockStatesData(blockStates, true) mesherWorld.addColumn(0, 0, chunk1.toJson()) return { diff --git a/prismarine-viewer/viewer/lib/mesher/world.ts b/prismarine-viewer/viewer/lib/mesher/world.ts index af9d3d9f..50616f82 100644 --- a/prismarine-viewer/viewer/lib/mesher/world.ts +++ b/prismarine-viewer/viewer/lib/mesher/world.ts @@ -3,6 +3,7 @@ import mcData from 'minecraft-data' import { Block } from "prismarine-block" import { Vec3 } from 'vec3' import moreBlockDataGeneratedJson from '../moreBlockDataGenerated.json' +import { defaultMesherConfig } from './shared' const ignoreAoBlocks = Object.keys(moreBlockDataGeneratedJson.noOcclusions) @@ -24,10 +25,7 @@ export type WorldBlock = Block & { export class World { - enableLighting = true - skyLight = 15 - smoothLighting = true - outputFormat = 'threeJs' as 'threeJs' | 'webgl' + config = defaultMesherConfig Chunk: typeof import('prismarine-chunk/types/index').PCChunk columns = {} as { [key: string]: import('prismarine-chunk/types/index').PCChunk } blockCache = {} @@ -36,10 +34,12 @@ export class World { constructor(version) { this.Chunk = Chunks(version) as any this.biomeCache = mcData(version).biomes + this.config.version = version } getLight (pos: Vec3, isNeighbor = false) { - if (!this.enableLighting) return 15 + const { enableLighting, skyLight } = this.config + if (!enableLighting) return 15 // const key = `${pos.x},${pos.y},${pos.z}` // if (lightsCache.has(key)) return lightsCache.get(key) const column = this.getColumnByPos(pos) @@ -48,7 +48,7 @@ export class World { 15, Math.max( column.getBlockLight(posInChunk(pos)), - Math.min(this.skyLight, column.getSkyLight(posInChunk(pos))) + Math.min(skyLight, column.getSkyLight(posInChunk(pos))) ) + 2 ) // lightsCache.set(key, result) diff --git a/prismarine-viewer/viewer/lib/viewer.ts b/prismarine-viewer/viewer/lib/viewer.ts index 85c15719..9097c7ec 100644 --- a/prismarine-viewer/viewer/lib/viewer.ts +++ b/prismarine-viewer/viewer/lib/viewer.ts @@ -6,7 +6,7 @@ import { getVersion } from './version' import EventEmitter from 'events' import { WorldRendererThree } from './worldrendererThree' import { generateSpiralMatrix } from 'flying-squid/dist/utils' -import { WorldRendererCommon } from './worldrendererCommon' +import { WorldRendererCommon, WorldRendererConfig, defaultWorldRendererConfig } from './worldrendererCommon' export class Viewer { scene: THREE.Scene @@ -19,13 +19,13 @@ export class Viewer { domElement: HTMLCanvasElement playerHeight = 1.62 isSneaking = false - version: string + threeJsWorld: WorldRendererThree cameraObjectOverride?: THREE.Object3D // for xr audioListener: THREE.AudioListener renderingUntilNoUpdates = false processEntityOverrides = (e, overrides) => overrides - constructor(public renderer: THREE.WebGLRenderer, numWorkers?: number) { + constructor(public renderer: THREE.WebGLRenderer, worldConfig = defaultWorldRendererConfig) { // https://discourse.threejs.org/t/updates-to-color-management-in-three-js-r152/50791 THREE.ColorManagement.enabled = false renderer.outputColorSpace = THREE.LinearSRGBColorSpace @@ -33,13 +33,18 @@ export class Viewer { this.scene = new THREE.Scene() this.scene.matrixAutoUpdate = false // for perf this.resetScene() - this.world = new WorldRendererThree(this.scene, this.renderer, this.camera, numWorkers) + this.threeJsWorld = new WorldRendererThree(this.scene, this.renderer, this.camera, worldConfig) + this.setWorld() this.entities = new Entities(this.scene) // this.primitives = new Primitives(this.scene, this.camera) this.domElement = renderer.domElement } + setWorld () { + this.world = this.threeJsWorld + } + resetScene () { this.scene.background = new THREE.Color('lightblue') @@ -67,7 +72,6 @@ export class Viewer { setVersion (userVersion: string) { const texturesVersion = getVersion(userVersion) console.log('[viewer] Using version:', userVersion, 'textures:', texturesVersion) - this.version = userVersion this.world.setVersion(userVersion, texturesVersion) this.entities.clear() // this.primitives.clear() @@ -187,8 +191,8 @@ export class Viewer { skyLight = ((timeOfDay - 12000) / 6000) * 15 } - if (this.world.skyLight === skyLight) return - this.world.skyLight = skyLight + if (this.world.mesherConfig.skyLight === skyLight) return + this.world.mesherConfig.skyLight = skyLight ; (this.world as WorldRendererThree).rerenderAllChunks?.() }) diff --git a/prismarine-viewer/viewer/lib/worldDataEmitter.ts b/prismarine-viewer/viewer/lib/worldDataEmitter.ts index cfcee0e4..ed53847d 100644 --- a/prismarine-viewer/viewer/lib/worldDataEmitter.ts +++ b/prismarine-viewer/viewer/lib/worldDataEmitter.ts @@ -151,6 +151,13 @@ export class WorldDataEmitter extends EventEmitter { } } + unloadAllChunks () { + for (const coords of Object.keys(this.loadedChunks)) { + const [x, z] = coords.split(',').map(Number) + this.unloadChunk({ x, z }) + } + } + unloadChunk (pos: ChunkPos) { this.emitter.emit('unloadChunk', { x: pos.x, z: pos.z }) delete this.loadedChunks[`${pos.x},${pos.z}`] @@ -172,7 +179,6 @@ export class WorldDataEmitter extends EventEmitter { chunksToUnload.push(p) } } - // todo @sa2urami console.log('unloading', chunksToUnload.length, 'total now', Object.keys(this.loadedChunks).length) for (const p of chunksToUnload) { this.unloadChunk(p) diff --git a/prismarine-viewer/viewer/lib/worldrendererCommon.ts b/prismarine-viewer/viewer/lib/worldrendererCommon.ts index 427bc446..151b2679 100644 --- a/prismarine-viewer/viewer/lib/worldrendererCommon.ts +++ b/prismarine-viewer/viewer/lib/worldrendererCommon.ts @@ -7,21 +7,35 @@ import mcDataRaw from 'minecraft-data/data.js' // handled correctly in esbuild p import { dynamicMcDataFiles } from '../../buildMesherConfig.mjs' import { toMajor } from './version.js' import { chunkPos } from './simpleUtils' +import { defaultMesherConfig } from './mesher/shared' +import { buildCleanupDecorator } from './cleanupDecorator' function mod (x, n) { return ((x % n) + n) % n } +export const worldCleanup = buildCleanupDecorator('resetWorld') + +export const defaultWorldRendererConfig = { + showChunkBorders: false, + numWorkers: 4 +} + +export type WorldRendererConfig = typeof defaultWorldRendererConfig + export abstract class WorldRendererCommon { worldConfig = { minY: 0, worldHeight: 256 } // todo @sa2urami set alphaTest back to 0.1 and instead properly sort transparent and solid objects (needs to be done in worker too) material = new THREE.MeshLambertMaterial({ vertexColors: true, transparent: true, alphaTest: 0.5 }) - showChunkBorders = false + @worldCleanup() active = false version = undefined as string | undefined + @worldCleanup() loadedChunks = {} as Record + @worldCleanup() finishedChunks = {} as Record + @worldCleanup() sectionsOutstanding = new Map() renderUpdateEmitter = new EventEmitter() customBlockStatesData = undefined as any @@ -37,15 +51,21 @@ export abstract class WorldRendererCommon texturesVersion?: string viewDistance = -1 chunksLength = 0 - skyLight = 15 - smoothLighting = true - enableLighting = true + @worldCleanup() allChunksFinished = false handleResize = () => { } + mesherConfig = defaultMesherConfig abstract outputFormat: 'threeJs' | 'webgl' - constructor(numWorkers: number) { + constructor (public config: WorldRendererConfig) { + // this.initWorkers(1) // preload script on page load + this.snapshotInitialValues() + } + + snapshotInitialValues() {} + + initWorkers(numWorkers = this.config.numWorkers) { // init workers for (let i = 0; i < numWorkers; i++) { // Node environment needs an absolute path, but browser needs the url of the file @@ -127,32 +147,38 @@ export abstract class WorldRendererCommon abstract updateShowChunksBorder (value: boolean): void resetWorld () { - this.active = false - this.loadedChunks = {} - this.sectionsOutstanding = new Map() - this.finishedChunks = {} - this.allChunksFinished = false + // destroy workers for (const worker of this.workers) { - worker.postMessage({ type: 'reset' }) + worker.terminate() } + this.workers = [] } + + // new game load happens here setVersion (version, texturesVersion = version) { this.version = version this.texturesVersion = texturesVersion this.resetWorld() + this.initWorkers() this.active = true + this.mesherConfig.outputFormat = this.outputFormat + this.mesherConfig.version = this.version! - const allMcData = mcDataRaw.pc[this.version] ?? mcDataRaw.pc[toMajor(this.version)] - for (const worker of this.workers) { - const mcData = Object.fromEntries(Object.entries(allMcData).filter(([key]) => dynamicMcDataFiles.includes(key))) - mcData.version = JSON.parse(JSON.stringify(mcData.version)) - worker.postMessage({ type: 'mcData', mcData, version: this.version }) - } - + this.sendMesherMcData() this.updateTexturesData() } + sendMesherMcData () { + const allMcData = mcDataRaw.pc[this.version] ?? mcDataRaw.pc[toMajor(this.version)] + const mcData = Object.fromEntries(Object.entries(allMcData).filter(([key]) => dynamicMcDataFiles.includes(key))) + mcData.version = JSON.parse(JSON.stringify(mcData.version)) + + for (const worker of this.workers) { + worker.postMessage({ type: 'mcData', mcData, config: this.mesherConfig }) + } + } + updateTexturesData () { loadTexture(this.customTexturesDataUrl || `textures/${this.texturesVersion}.png`, (texture: import('three').Texture) => { texture.magFilter = THREE.NearestFilter @@ -166,15 +192,20 @@ export abstract class WorldRendererCommon if (this.customBlockStatesData) return resolve(this.customBlockStatesData) return loadJSON(`/blocksStates/${this.texturesVersion}.json`, (data) => { this.downloadedBlockStatesData = data - // todo this.renderUpdateEmitter.emit('blockStatesDownloaded') resolve(data) }) }) } loadBlockStates().then((blockStates) => { + this.mesherConfig.textureSize = this.material.map!.image.width + for (const worker of this.workers) { - worker.postMessage({ type: 'rendererData', json: blockStates, textureSize: this.material.map!.image.width, outputFormat: this.outputFormat }) + worker.postMessage({ + type: 'mesherData', + json: blockStates, + config: this.mesherConfig, + }) } }) }) @@ -182,6 +213,7 @@ export abstract class WorldRendererCommon } addColumn (x, z, chunk) { + if (this.workers.length === 0) throw new Error('workers not initialized yet') this.initialChunksLoad = false this.loadedChunks[`${x},${z}`] = true for (const worker of this.workers) { @@ -224,7 +256,7 @@ export abstract class WorldRendererCommon if (this.viewDistance === -1) throw new Error('viewDistance not set') this.allChunksFinished = false const distance = this.getDistance(pos) - if (distance[0] > this.viewDistance || distance[1] > this.viewDistance) return + if (!this.workers.length || distance[0] > this.viewDistance || distance[1] > this.viewDistance) return const key = `${Math.floor(pos.x / 16) * 16},${Math.floor(pos.y / 16) * 16},${Math.floor(pos.z / 16) * 16}` // if (this.sectionsOutstanding.has(key)) return this.renderUpdateEmitter.emit('dirty', pos, value) @@ -233,7 +265,14 @@ export abstract class WorldRendererCommon // is always dispatched to the same worker const hash = mod(Math.floor(pos.x / 16) + Math.floor(pos.y / 16) + Math.floor(pos.z / 16), this.workers.length) this.sectionsOutstanding.set(key, (this.sectionsOutstanding.get(key) ?? 0) + 1) - this.workers[hash].postMessage({ type: 'dirty', x: pos.x, y: pos.y, z: pos.z, value, skyLight: this.skyLight, smoothLighting: this.smoothLighting, enableLighting: this.enableLighting }) + this.workers[hash].postMessage({ + type: 'dirty', + x: pos.x, + y: pos.y, + z: pos.z, + value, + config: this.mesherConfig, + }) } // Listen for chunk rendering updates emitted if a worker finished a render and resolve if the number diff --git a/prismarine-viewer/viewer/lib/worldrendererThree.ts b/prismarine-viewer/viewer/lib/worldrendererThree.ts index 05d9a76f..364df12a 100644 --- a/prismarine-viewer/viewer/lib/worldrendererThree.ts +++ b/prismarine-viewer/viewer/lib/worldrendererThree.ts @@ -5,19 +5,14 @@ import { dispose3 } from './dispose' import PrismarineChatLoader from 'prismarine-chat' import { renderSign } from '../sign-renderer/' import { chunkPos, sectionPos } from './simpleUtils' -import { WorldRendererCommon } from './worldrendererCommon' +import { WorldRendererCommon, WorldRendererConfig } from './worldrendererCommon' import * as tweenJs from '@tweenjs/tween.js' import { BloomPass, RenderPass, UnrealBloomPass, EffectComposer, WaterPass, GlitchPass } from 'three-stdlib' -function mod (x, n) { - return ((x % n) + n) % n -} - export class WorldRendererThree extends WorldRendererCommon { outputFormat = 'threeJs' as const blockEntities = {} sectionObjects: Record = {} - showChunkBorders = false chunkTextures = new Map() signsCache = new Map() @@ -25,8 +20,8 @@ export class WorldRendererThree extends WorldRendererCommon { return Object.values(this.sectionObjects).reduce((acc, obj) => acc + (obj as any).tilesCount, 0) } - constructor(public scene: THREE.Scene, public renderer: THREE.WebGLRenderer, public camera: THREE.PerspectiveCamera, numWorkers = 4) { - super(numWorkers) + constructor(public scene: THREE.Scene, public renderer: THREE.WebGLRenderer, public camera: THREE.PerspectiveCamera, public config: WorldRendererConfig) { + super(config) } /** @@ -94,7 +89,7 @@ export class WorldRendererThree extends WorldRendererCommon { object.name = 'chunk' //@ts-ignore object.tilesCount = data.geometry.positions.length / 3 / 4 - if (!this.showChunkBorders) { + if (!this.config.showChunkBorders) { boxHelper.visible = false } // should not compute it once @@ -198,7 +193,7 @@ export class WorldRendererThree extends WorldRendererCommon { } updateShowChunksBorder (value: boolean) { - this.showChunkBorders = value + this.config.showChunkBorders = value for (const object of Object.values(this.sectionObjects)) { for (const child of object.children) { if (child.name === 'helper') { diff --git a/src/index.ts b/src/index.ts index 10090dc7..88eda6a1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -135,7 +135,7 @@ if (isFirefox) { } // Create viewer -const viewer: import('prismarine-viewer/viewer/lib/viewer').Viewer = new Viewer(renderer, options.numWorkers) +const viewer: import('prismarine-viewer/viewer/lib/viewer').Viewer = new Viewer(renderer) window.viewer = viewer new THREE.TextureLoader().load(itemsPng, (texture) => { viewer.entities.itemsTexture = texture diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index f1ac35ca..d80a9ebe 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -53,7 +53,11 @@ export const guiOptionsScheme: { smoothLighting: {}, newVersionsLighting: { text: 'Lighting in newer versions', - } + }, + lowMemoryMode: { + text: 'Low Memory Mode', + enableWarning: 'Enabling it will make chunks load ~4x slower' + }, }, ], main: [ @@ -175,6 +179,9 @@ export const guiOptionsScheme: { ], controls: [ { + custom () { + return Keyboard & Mouse + }, // keybindings mouseSensX: {}, mouseSensY: { @@ -188,9 +195,6 @@ export const guiOptionsScheme: { // eslint-disable-next-line no-extra-boolean-cast disabledReason: Boolean(document.documentElement.requestPointerLock) ? undefined : 'Your browser does not support pointer lock.', }, - alwaysShowMobileControls: { - text: 'Always Mobile Controls', - }, autoFullScreen: { tooltip: 'Auto Fullscreen allows you to use Ctrl+W and Escape having to wait/click on screen again.', disabledReason: navigator['keyboard'] ? undefined : 'Your browser doesn\'t support keyboard lock API' @@ -198,6 +202,14 @@ export const guiOptionsScheme: { autoExitFullscreen: { tooltip: 'Exit fullscreen on escape (pause menu open). But note you can always do it with F11.', }, + }, + { + custom () { + return Touch Controls + }, + alwaysShowMobileControls: { + text: 'Always Mobile Controls', + }, touchButtonsSize: { min: 40 }, @@ -211,13 +223,6 @@ export const guiOptionsScheme: { touchControlsType: { values: [['classic', 'Classic'], ['joystick-buttons', 'New']], }, - autoJump: { - values: [ - 'always', - 'auto', - 'never' - ], - }, }, { custom () { @@ -226,6 +231,16 @@ export const guiOptionsScheme: { }, }, { + custom () { + return Auto Jump + }, + autoJump: { + values: [ + 'always', + 'auto', + 'never' + ], + }, autoParkour: {}, } ], diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts index af284b62..559740b6 100644 --- a/src/optionsStorage.ts +++ b/src/optionsStorage.ts @@ -57,6 +57,7 @@ const defaultOptions = { unimplementedContainers: false, dayCycleAndLighting: true, loadPlayerSkins: true, + lowMemoryMode: false, // antiAliasing: false, showChunkBorders: false, // todo rename option diff --git a/src/react/OptionsItems.tsx b/src/react/OptionsItems.tsx index 9351d66b..5dd31923 100644 --- a/src/react/OptionsItems.tsx +++ b/src/react/OptionsItems.tsx @@ -6,12 +6,15 @@ import { options, qsOptions } from '../optionsStorage' import Button from './Button' import Slider from './Slider' import Screen from './Screen' +import { showOptionsModal } from './SelectOption' type GeneralItem = { id?: string text?: string, disabledReason?: string, tooltip?: string + // description?: string + enableWarning?: string willHaveNoEffect?: boolean values?: Array } @@ -56,7 +59,11 @@ export const OptionButton = ({ item }: { item: Extract { + onClick={async () => { + if (item.enableWarning && !options[item.id!]) { + const result = await showOptionsModal(item.enableWarning, ['Enable']) + if (!result) return + } const { values } = item if (values) { const getOptionValue = (arrItem) => { @@ -108,9 +115,17 @@ const RenderOption = ({ item }: { item: OptionMeta }) => { item.text ??= titleCase(noCase(item.id)) } - if (item.type === 'toggle') return - if (item.type === 'slider') return - if (item.type === 'element') return + let baseElement = null as React.ReactNode | null + if (item.type === 'toggle') baseElement = + if (item.type === 'slider') baseElement = + if (item.type === 'element') baseElement = + return baseElement + // if (!item.description && item.type === 'element') return baseElement + + // return
+ // {baseElement} + // {item.description &&
{item.description}
} + //
} interface Props { diff --git a/src/soundSystem.ts b/src/soundSystem.ts index 254b5f5d..a2cc1f70 100644 --- a/src/soundSystem.ts +++ b/src/soundSystem.ts @@ -8,10 +8,15 @@ import { options } from './optionsStorage' import { loadOrPlaySound } from './basicSounds' import { showNotification } from './react/NotificationProvider' +const globalObject = window as { + allSoundsMap?: Record>, + allSoundsVersionedMap?: Record, +} + subscribeKey(miscUiState, 'gameLoaded', async () => { if (!miscUiState.gameLoaded) return const soundsLegacyMap = window.allSoundsVersionedMap as Record - const allSoundsMap = window.allSoundsMap as Record> + const { allSoundsMap } = globalObject const allSoundsMeta = window.allSoundsMeta as { format: string, baseUrl: string } if (!allSoundsMap) { return @@ -115,7 +120,7 @@ subscribeKey(miscUiState, 'gameLoaded', async () => { } const getStepSound = (blockUnder: Block) => { - // const soundsMap = window.allSoundsMap?.[bot.version] + // const soundsMap = globalObject.allSoundsMap?.[bot.version] // if (!soundsMap) return // let soundResult = 'block.stone.step' // for (const x of Object.keys(soundsMap).map(n => n.split(';')[1])) { @@ -215,8 +220,21 @@ subscribeKey(miscUiState, 'gameLoaded', async () => { // }) }) +// todo +// const music = { +// activated: false, +// playing: '', +// activate () { +// const gameMusic = Object.entries(globalObject.allSoundsMap?.[bot.version] ?? {}).find(([id, sound]) => sound.includes('music.game')) +// if (!gameMusic) return +// const soundPath = gameMusic[0].split(';')[1] +// const next = () => {} +// } +// } + export const earlyCheck = () => { - const allSoundsMap = window.allSoundsMap as Record> + const { allSoundsMap } = globalObject + if (!allSoundsMap) return // todo also use major versioned hardcoded sounds const soundsMap = allSoundsMap[bot.version] @@ -239,7 +257,7 @@ const getVersionedSound = (version: string, item: string, itemsMapSortedEntries: } export const downloadSoundsIfNeeded = async () => { - if (!window.allSoundsMap) { + if (!globalObject.allSoundsMap) { try { await loadScript('./sounds.js') } catch (err) { diff --git a/src/texturePack.ts b/src/texturePack.ts index 6ace186b..8c251b49 100644 --- a/src/texturePack.ts +++ b/src/texturePack.ts @@ -93,7 +93,7 @@ export const completeTexturePackInstall = async (name?: string) => { await fs.promises.writeFile(join(texturePackBasePath, 'name.txt'), name ?? '??', 'utf8') if (viewer?.world.active) { - await genTexturePackTextures(viewer.version) + await genTexturePackTextures(viewer.world.version!) } setLoadingScreenStatus(undefined) showNotification('Texturepack installed') diff --git a/src/watchOptions.ts b/src/watchOptions.ts index cfed6afa..4380c6f3 100644 --- a/src/watchOptions.ts +++ b/src/watchOptions.ts @@ -30,24 +30,30 @@ export const watchOptionsAfterViewerInit = () => { watchValue(options, o => { if (!viewer) return - viewer.world.showChunkBorders = o.showChunkBorders + viewer.world.config.showChunkBorders = o.showChunkBorders viewer.entities.setDebugMode(o.showChunkBorders ? 'basic' : 'none') }) + watchValue(options, o => { + if (!viewer) return + // todo ideally there shouldnt be this setting and we don't need to send all same chunks to all workers + viewer.world.config.numWorkers = o.lowMemoryMode ? 1 : o.numWorkers + }) + watchValue(options, o => { viewer.entities.setVisible(o.renderEntities) }) - viewer.world.smoothLighting = options.smoothLighting + viewer.world.mesherConfig.smoothLighting = options.smoothLighting subscribeKey(options, 'smoothLighting', () => { - viewer.world.smoothLighting = options.smoothLighting; + viewer.world.mesherConfig.smoothLighting = options.smoothLighting; (viewer.world as WorldRendererThree).rerenderAllChunks() }) subscribeKey(options, 'newVersionsLighting', () => { - viewer.world.enableLighting = !bot.supportFeature('blockStateId') || options.newVersionsLighting; + viewer.world.mesherConfig.enableLighting = !bot.supportFeature('blockStateId') || options.newVersionsLighting; (viewer.world as WorldRendererThree).rerenderAllChunks() }) customEvents.on('gameLoaded', () => { - viewer.world.enableLighting = !bot.supportFeature('blockStateId') || options.newVersionsLighting + viewer.world.mesherConfig.enableLighting = !bot.supportFeature('blockStateId') || options.newVersionsLighting }) } diff --git a/tsconfig.json b/tsconfig.json index 47a363c3..5d018a46 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,6 +15,7 @@ "forceConsistentCasingInFileNames": true, "useUnknownInCatchVariables": false, "skipLibCheck": true, + "experimentalDecorators": true, // this the only options that allows smooth transition from js to ts (by not dropping types from js files) // however might need to consider includeing *only needed libraries* instead of using this "maxNodeModuleJsDepth": 1, From d17e1b2acbbc565d7707597be9161f1dc5f5c575 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 20 Apr 2024 13:22:26 +0300 Subject: [PATCH 0135/1195] make bundle smaller and debugger run faster --- .gitignore | 1 + esbuild.mjs | 2 +- package.json | 9 +++++---- pnpm-lock.yaml | 28 +++++----------------------- scripts/esbuildPlugins.mjs | 30 ++++++++++++++++++++++++++---- src/eruda.js | 3 ++- src/index.ts | 6 +++--- 7 files changed, 43 insertions(+), 36 deletions(-) diff --git a/.gitignore b/.gitignore index 665722ec..c4434877 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ dist .DS_Store .idea/ world +data*.json out *.iml .vercel diff --git a/esbuild.mjs b/esbuild.mjs index fad9047d..2e360e5d 100644 --- a/esbuild.mjs +++ b/esbuild.mjs @@ -39,7 +39,7 @@ const buildOptions = { // logLevel: 'debug', logLevel: 'info', platform: 'browser', - sourcemap: prod ? true : 'inline', + sourcemap: prod ? true : 'linked', outdir: 'dist', mainFields: [ 'browser', 'module', 'main' diff --git a/package.json b/package.json index 4f7a9dbb..084fbe2b 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,8 @@ "build-storybook": "storybook build && node scripts/build.js moveStorybookFiles", "start-experiments": "vite --config experiments/vite.config.ts", "watch-other-workers": "echo NOT IMPLEMENTED", - "watch-worker": "node prismarine-viewer/buildMesherWorker.mjs -w", - "run-playground": "run-p watch-worker watch-other-workers playground-server watch-playground", + "watch-mesher": "node prismarine-viewer/buildMesherWorker.mjs -w", + "run-playground": "run-p watch-mesher watch-other-workers playground-server watch-playground", "run-all": "run-p start run-playground", "playground-server": "live-server --port=9090 prismarine-viewer/public", "watch-playground": "node prismarine-viewer/esbuild.mjs -w" @@ -55,7 +55,7 @@ "esbuild": "^0.19.3", "esbuild-plugin-polyfill-node": "^0.3.0", "express": "^4.18.2", - "flying-squid": "npm:@zardoy/flying-squid@^0.0.15", + "flying-squid": "npm:@zardoy/flying-squid@^0.0.17", "fs-extra": "^11.1.1", "google-drive-browserfs": "github:zardoy/browserfs#google-drive", "iconify-icon": "^1.0.8", @@ -157,5 +157,6 @@ "updateConfig": { "ignoreDependencies": [] } - } + }, + "packageManager": "pnpm@9.0.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 68d89fb2..276083b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -90,8 +90,8 @@ importers: specifier: ^4.18.2 version: 4.18.2 flying-squid: - specifier: npm:@zardoy/flying-squid@^0.0.15 - version: /@zardoy/flying-squid@0.0.15 + specifier: npm:@zardoy/flying-squid@^0.0.17 + version: /@zardoy/flying-squid@0.0.17 fs-extra: specifier: ^11.1.1 version: 11.1.1 @@ -5629,8 +5629,8 @@ packages: tslib: 1.14.1 dev: true - /@zardoy/flying-squid@0.0.15: - resolution: {integrity: sha512-VooP9XuzNQVL3y0zlaU5wStRm1vfQIXAzVNHuvMoMgyIyOiD7A59QzVZT93GAoTyUBHTwqweXMPQftjywUy62A==} + /@zardoy/flying-squid@0.0.17: + resolution: {integrity: sha512-qGCS7aRmMflDdIN7IGLpDc0W2gUYc5OQ45KEn3XtcxwOP0Q7zyvo3mnsD5KSV3n2lyhQ4783Ov8V6J86xea0lw==} engines: {node: '>=8'} hasBin: true dependencies: @@ -5645,11 +5645,9 @@ packages: minecraft-data: 3.62.0 minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f mkdirp: 2.1.6 - moment: 2.30.1 - needle: 2.9.1 node-gzip: 1.1.2 node-rsa: 1.1.1 - prismarine-chunk: github.com/zardoy/prismarine-chunk/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b(minecraft-data@3.62.0) + prismarine-chunk: github.com/zardoy/prismarine-chunk/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 @@ -11492,10 +11490,6 @@ packages: dependencies: nearley: 2.20.1 - /moment@2.30.1: - resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - dev: false - /moo@0.5.2: resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} @@ -11576,18 +11570,6 @@ packages: railroad-diagrams: 1.0.0 randexp: 0.4.6 - /needle@2.9.1: - resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} - engines: {node: '>= 4.4.x'} - hasBin: true - dependencies: - debug: 3.2.7(supports-color@8.1.1) - iconv-lite: 0.4.24 - sax: 1.3.0 - transitivePeerDependencies: - - supports-color - dev: false - /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} diff --git a/scripts/esbuildPlugins.mjs b/scripts/esbuildPlugins.mjs index e5af5ec8..ddc34c18 100644 --- a/scripts/esbuildPlugins.mjs +++ b/scripts/esbuildPlugins.mjs @@ -13,8 +13,8 @@ const prod = process.argv.includes('--prod') let connectedClients = [] const watchExternal = [ - 'dist/mesher.js', - 'dist/webglRendererWorker.js' + // 'dist/mesher.js', + // 'dist/webglRendererWorker.js' ] /** @type {import('esbuild').Plugin[]} */ @@ -55,6 +55,13 @@ const plugins = [ }, () => { throw new Error('hit banned package') }) + build.onLoad({ + filter: /^prismarine-auth/, + }, () => { + return { + contents: 'module.exports = {}', + } + }) build.onResolve({ filter: /^three$/, @@ -80,11 +87,26 @@ const plugins = [ } }) + const removeNodeModulesSourcemaps = (map) => { + const doNotRemove = ['prismarine', 'mineflayer', 'flying-squid', '@jspm/core', 'minecraft'] + map.sourcesContent.forEach((_, i) => { + if (map.sources[i].includes('node_modules') && !doNotRemove.some(x => map.sources[i].includes(x))) { + map.sourcesContent[i] = null + } + }) + } + build.onEnd(async ({ metafile, outputFiles }) => { // write outputFiles //@ts-ignore for (const file of outputFiles) { - await fs.promises.writeFile(file.path, file.contents) + let contents = file.text + if (file.path.endsWith('.map') && file.text) { + const map = JSON.parse(file.text) + removeNodeModulesSourcemaps(map) + contents = JSON.stringify(map) + } + await fs.promises.writeFile(file.path, contents) } if (!prod) return // const deps = Object.entries(metafile.inputs).sort(([, a], [, b]) => b.bytes - a.bytes).map(([x, { bytes }]) => [x, filesize(bytes)]).slice(0, 5) @@ -167,7 +189,7 @@ const plugins = [ } // write metafile to disk if needed to analyze - // fs.writeFileSync('dist/meta.json', JSON.stringify(metafile, null, 2)) + fs.writeFileSync('dist/meta.json', JSON.stringify(metafile, null, 2)) /** @type {import('esbuild').OutputFile} */ //@ts-ignore diff --git a/src/eruda.js b/src/eruda.js index 61de5964..9cb11381 100644 --- a/src/eruda.js +++ b/src/eruda.js @@ -1,6 +1,7 @@ import { isMobile } from './menus/components/common' if (process.env.NODE_ENV === 'development' && isMobile()) { - require('eruda').default.init() + // can be changed to require('eruda') + import('https://cdn.skypack.dev/eruda').default.init() console.log('JS Loaded in', Date.now() - window.startLoad) } diff --git a/src/index.ts b/src/index.ts index 88eda6a1..8ee16320 100644 --- a/src/index.ts +++ b/src/index.ts @@ -51,7 +51,7 @@ import worldInteractions from './worldInteractions' import * as THREE from 'three' import MinecraftData, { versionsByMinecraftVersion } from 'minecraft-data' import debug from 'debug' -import _ from 'lodash-es' +import { defaultsDeep } from 'lodash-es' import { initVR } from './vr' import { @@ -89,7 +89,6 @@ import { fsState } from './loadSave' import { watchFov } from './rendererUtils' import { loadInMemorySave } from './react/SingleplayerProvider' -// side effects import { downloadSoundsIfNeeded, earlyCheck as earlySoundsMapCheck } from './soundSystem' import { ua } from './react/utils' import { handleMovementStickDelta, joystickPointer } from './react/TouchAreasControls' @@ -97,6 +96,7 @@ import { possiblyHandleStateVariable } from './googledrive' import flyingSquidEvents from './flyingSquidEvents' import { hideNotification, notificationProxy } from './react/NotificationProvider' import { ViewerWrapper } from 'prismarine-viewer/viewer/lib/viewerWrapper' +import './hotReload' window.debug = debug window.THREE = THREE @@ -352,7 +352,7 @@ async function connect (connectOptions: { const renderDistance = singleplayer ? renderDistanceSingleplayer : multiplayerRenderDistance let localServer try { - const serverOptions = _.defaultsDeep({}, connectOptions.serverOverrides ?? {}, options.localServerOptions, defaultServerOptions) + const serverOptions = defaultsDeep({}, connectOptions.serverOverrides ?? {}, options.localServerOptions, defaultServerOptions) Object.assign(serverOptions, connectOptions.serverOverridesFlat ?? {}) const downloadMcData = async (version: string) => { // todo expose cache From 23037705f5c50fb19fa5f23a0e3ff6cca31d4b80 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 20 Apr 2024 13:22:32 +0300 Subject: [PATCH 0136/1195] up pnpm lockfile --- pnpm-lock.yaml | 19063 +++++++++++++++++++++++++++-------------------- 1 file changed, 10803 insertions(+), 8260 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 276083b7..5eb5111a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -22,10 +22,10 @@ importers: dependencies: '@dimaka/interface': specifier: 0.0.3-alpha.0 - version: 0.0.3-alpha.0(@babel/core@7.22.11)(@popperjs/core@2.11.8)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + version: 0.0.3-alpha.0(@babel/core@7.22.11)(@popperjs/core@2.11.8)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@floating-ui/react': specifier: ^0.26.1 - version: 0.26.1(react-dom@18.2.0)(react@18.2.0) + version: 0.26.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@nxg-org/mineflayer-auto-jump': specifier: ^0.7.7 version: 0.7.7 @@ -34,7 +34,7 @@ importers: version: 1.2.1 '@react-oauth/google': specifier: ^0.12.1 - version: 0.12.1(react-dom@18.2.0)(react@18.2.0) + version: 0.12.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/gapi': specifier: ^0.0.47 version: 0.0.47 @@ -52,7 +52,7 @@ importers: version: 2.1.3 '@zardoy/react-util': specifier: ^0.2.0 - version: 0.2.0(react-dom@18.2.0)(react@18.2.0) + version: 0.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@zardoy/utils': specifier: ^0.0.11 version: 0.0.11 @@ -61,7 +61,7 @@ importers: version: 0.5.12 browserfs: specifier: github:zardoy/browserfs#build - version: github.com/zardoy/browserfs/e60ca69e74888e057a96a468afe1d62347d3f56f + version: https://codeload.github.com/zardoy/browserfs/tar.gz/e60ca69e74888e057a96a468afe1d62347d3f56f change-case: specifier: ^5.1.2 version: 5.1.2 @@ -91,13 +91,13 @@ importers: version: 4.18.2 flying-squid: specifier: npm:@zardoy/flying-squid@^0.0.17 - version: /@zardoy/flying-squid@0.0.17 + version: '@zardoy/flying-squid@0.0.17(encoding@0.1.13)' fs-extra: specifier: ^11.1.1 version: 11.1.1 google-drive-browserfs: specifier: github:zardoy/browserfs#google-drive - version: github.com/zardoy/browserfs/ab58ae8ef00e3a31db01909e365e6cb5188436e0 + version: browserfs@https://codeload.github.com/zardoy/browserfs/tar.gz/ab58ae8ef00e3a31db01909e365e6cb5188436e0 iconify-icon: specifier: ^1.0.8 version: 1.0.8 @@ -118,7 +118,7 @@ importers: version: 3.62.0 net-browserify: specifier: github:zardoy/prismarinejs-net-browserify - version: github.com/zardoy/prismarinejs-net-browserify/7d827dba61bd2f9ac9a6086fe2079a0fccadd070 + version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d827dba61bd2f9ac9a6086fe2079a0fccadd070 node-gzip: specifier: ^1.1.2 version: 1.1.2 @@ -130,7 +130,7 @@ importers: version: 6.1.1 prismarine-provider-anvil: specifier: github:zardoy/prismarine-provider-anvil#everything - version: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0) + version: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0) prosemirror-example-setup: specifier: ^1.2.2 version: 1.2.2 @@ -154,7 +154,7 @@ importers: version: 18.2.0(react@18.2.0) react-transition-group: specifier: ^4.4.5 - version: 4.4.5(react-dom@18.2.0)(react@18.2.0) + version: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) remark: specifier: ^15.0.1 version: 15.0.1 @@ -190,7 +190,7 @@ importers: version: 0.1.8 workbox-build: specifier: ^7.0.0 - version: 7.0.0 + version: 7.0.0(@types/babel__core@7.20.2) optionalDependencies: systeminformation: specifier: ^5.21.22 @@ -198,25 +198,25 @@ importers: devDependencies: '@storybook/addon-essentials': specifier: ^7.4.6 - version: 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + version: 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-links': specifier: ^7.4.6 - version: 7.4.6(react-dom@18.2.0)(react@18.2.0) + version: 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/blocks': specifier: ^7.4.6 - version: 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + version: 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/react': specifier: ^7.4.6 - version: 7.4.6(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + version: 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.2.2) '@storybook/react-vite': specifier: ^7.4.6 - version: 7.4.6(react-dom@18.2.0)(react@18.2.0)(rollup@2.79.1)(typescript@5.2.2)(vite@4.5.3) + version: 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@2.79.1)(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) '@storybook/web-components': specifier: ^7.4.6 - version: 7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0) + version: 7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/web-components-vite': specifier: ^7.4.6 - version: 7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(vite@4.5.3) + version: 7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) '@types/lodash-es': specifier: ^4.17.9 version: 4.17.9 @@ -264,7 +264,7 @@ importers: version: 8.50.0 eslint-config-zardoy: specifier: ^0.2.17 - version: 0.2.17(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.34.1)(eslint@8.50.0)(typescript@5.2.2) + version: 0.2.17(eslint-plugin-react-hooks@4.6.0(eslint@8.50.0))(eslint-plugin-react@7.34.1(eslint@8.50.0))(eslint@8.50.0)(typescript@5.2.2) events: specifier: ^3.3.0 version: 3.3.0 @@ -282,10 +282,10 @@ importers: version: 1.0.0 minecraft-inventory-gui: specifier: github:zardoy/minecraft-inventory-gui#next - version: github.com/zardoy/minecraft-inventory-gui/6685fa4a10590a5decef90a454ba0b9e045e7737(@types/react@18.2.20)(react@18.2.0) + version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/5554c7ab0a74bce52aa5f5f04a48eb8d3b9ac65c(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:PrismarineJS/mineflayer - version: github.com/PrismarineJS/mineflayer/195b3cbd70a110080af9b77a4659991c5d9e484a + version: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/5a544cf2547a6e0f1f17786962d77a33c661c02f(encoding@0.1.13) mineflayer-pathfinder: specifier: ^2.4.4 version: 2.4.4 @@ -306,13 +306,13 @@ importers: version: link:prismarine-viewer process: specifier: github:PrismarineJS/node-process - version: github.com/PrismarineJS/node-process/380d0b4f4c86f1b65b216c311bf00431f314e88e + version: https://codeload.github.com/PrismarineJS/node-process/tar.gz/380d0b4f4c86f1b65b216c311bf00431f314e88e rimraf: specifier: ^5.0.1 version: 5.0.1 storybook: specifier: ^7.4.6 - version: 7.4.6 + version: 7.4.6(encoding@0.1.13) stream-browserify: specifier: ^3.0.0 version: 3.0.0 @@ -330,7 +330,7 @@ importers: version: 4.0.2(react@18.2.0)(typescript@5.2.2) vitest: specifier: ^0.34.6 - version: 0.34.6 + version: 0.34.6(terser@5.19.2) yaml: specifier: ^2.3.2 version: 2.3.2 @@ -348,7 +348,7 @@ importers: version: 6.0.3 canvas: specifier: ^2.11.2 - version: 2.11.2 + version: 2.11.2(encoding@0.1.13) filesize: specifier: ^10.0.12 version: 10.0.12 @@ -363,16 +363,16 @@ importers: version: 8.2.3 minecraft-wrap: specifier: ^1.3.0 - version: 1.5.1 + version: 1.5.1(encoding@0.1.13) minecrafthawkeye: specifier: ^1.3.6 version: 1.3.6 prismarine-block: specifier: github:zardoy/prismarine-block#next-era - version: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + version: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chunk: specifier: github:zardoy/prismarine-chunk - version: github.com/zardoy/prismarine-chunk/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b(minecraft-data@3.62.0) + version: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) prismarine-schematic: specifier: ^1.2.0 version: 1.2.3 @@ -403,73 +403,8274 @@ importers: optionalDependencies: node-canvas-webgl: specifier: ^0.3.0 - version: 0.3.0 + version: 0.3.0(encoding@0.1.13) prismarine-viewer/viewer/sign-renderer: dependencies: vite: specifier: ^4.4.9 - version: 4.4.10(@types/node@20.8.0) + version: 4.4.10(@types/node@20.12.7)(terser@5.19.2) packages: - /@aashutoshrathi/word-wrap@1.2.6: + '@aashutoshrathi/word-wrap@1.2.6': resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - dev: true - /@ampproject/remapping@2.2.1: + '@ampproject/remapping@2.2.1': resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): + '@apideck/better-ajv-errors@0.3.6': resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} engines: {node: '>=10'} peerDependencies: ajv: '>=8' + + '@aw-web-design/x-default-browser@1.4.126': + resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} + hasBin: true + + '@azure/msal-common@14.9.0': + resolution: {integrity: sha512-yzBPRlWPnTBeixxLNI3BBIgF5/bHpbhoRVuuDBnYjCyWRavaPUsKAHUDYLqpGkBLDciA6TCc6GOxN4/S3WiSxg==} + engines: {node: '>=0.8.0'} + + '@azure/msal-node@2.7.0': + resolution: {integrity: sha512-wXD8LkUvHICeSWZydqg6o8Yvv+grlBEcmLGu+QEI4FcwFendbTEZrlSygnAXXSOCVaGAirWLchca35qrgpO6Jw==} + engines: {node: '>=16'} + + '@babel/code-frame@7.22.13': + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.22.9': + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.22.11': + resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.22.10': + resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.22.5': + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.10': + resolution: {integrity: sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.22.10': + resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.22.11': + resolution: {integrity: sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-class-features-plugin@7.22.15': + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.22.9': + resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.4.2': + resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.22.5': + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.22.5': + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.22.5': + resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.23.0': + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.22.15': + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.22.5': + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.22.9': + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-module-transforms@7.23.0': + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.22.5': + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.22.5': + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.22.9': + resolution: {integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.22.9': + resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.22.5': + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.5': + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.22.15': + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.22.5': + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.22.10': + resolution: {integrity: sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.22.11': + resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.22.13': + resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.22.13': + resolution: {integrity: sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5': + resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5': + resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-proposal-class-properties@7.18.6': + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-optional-chaining@7.21.0': + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-namespace-from@7.8.3': + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-flow@7.22.5': + resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.22.5': + resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.22.5': + resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.22.5': + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.22.5': + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.22.5': + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.22.11': + resolution: {integrity: sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.22.5': + resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.22.5': + resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.22.10': + resolution: {integrity: sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.22.5': + resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.22.11': + resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.22.6': + resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.22.5': + resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.22.10': + resolution: {integrity: sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.22.5': + resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.22.5': + resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dynamic-import@7.22.11': + resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.22.5': + resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.22.11': + resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-flow-strip-types@7.22.5': + resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.22.5': + resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.22.5': + resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.22.11': + resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.22.5': + resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.22.11': + resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.22.5': + resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.22.5': + resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.22.11': + resolution: {integrity: sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.23.0': + resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.22.11': + resolution: {integrity: sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.22.5': + resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.22.5': + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.22.5': + resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.22.11': + resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.22.11': + resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.22.11': + resolution: {integrity: sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.22.5': + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.22.11': + resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.22.12': + resolution: {integrity: sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.22.5': + resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.22.5': + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.22.11': + resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.22.5': + resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.22.5': + resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.22.5': + resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.22.10': + resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-reserved-words@7.22.5': + resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.22.5': + resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.22.5': + resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.22.5': + resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.22.5': + resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.22.5': + resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.22.15': + resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.22.10': + resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.22.5': + resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.22.5': + resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.22.5': + resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.22.10': + resolution: {integrity: sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-flow@7.22.15': + resolution: {integrity: sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-typescript@7.23.0': + resolution: {integrity: sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/register@7.22.15': + resolution: {integrity: sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/regjsgen@0.8.0': + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + + '@babel/runtime@7.22.11': + resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.22.5': + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.22.11': + resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.22.11': + resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.23.0': + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + + '@base2/pretty-print-object@1.0.1': + resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@cbor-extract/cbor-extract-darwin-arm64@2.2.0': + resolution: {integrity: sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==} + cpu: [arm64] + os: [darwin] + + '@cbor-extract/cbor-extract-darwin-x64@2.2.0': + resolution: {integrity: sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==} + cpu: [x64] + os: [darwin] + + '@cbor-extract/cbor-extract-linux-arm64@2.2.0': + resolution: {integrity: sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==} + cpu: [arm64] + os: [linux] + + '@cbor-extract/cbor-extract-linux-arm@2.2.0': + resolution: {integrity: sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==} + cpu: [arm] + os: [linux] + + '@cbor-extract/cbor-extract-linux-x64@2.2.0': + resolution: {integrity: sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==} + cpu: [x64] + os: [linux] + + '@cbor-extract/cbor-extract-win32-x64@2.2.0': + resolution: {integrity: sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==} + cpu: [x64] + os: [win32] + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@cypress/request@2.88.12': + resolution: {integrity: sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==} + engines: {node: '>= 6'} + + '@cypress/xvfb@1.2.4': + resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} + + '@dimaka/interface@0.0.3-alpha.0': + resolution: {integrity: sha512-BzRUaLk+jhC1uvcix4SXRGhw7k39pldlvwtRT0NGFsuQt1uMV9vOhGMzm3rLorVXQ7vAmqcZk3Hy8oYlXKQoDw==} + peerDependencies: + react: ^18.2.0 + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@emotion/babel-plugin@11.11.0': + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + + '@emotion/cache@11.11.0': + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + + '@emotion/css@11.5.0': + resolution: {integrity: sha512-mqjz/3aqR9rp40M+pvwdKYWxlQK4Nj3cnNjo3Tx6SM14dSsEn7q/4W2/I7PlgG+mb27iITHugXuBIHH/QwUBVQ==} + peerDependencies: + '@babel/core': ^7.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@emotion/hash@0.9.1': + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/serialize@1.1.2': + resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==} + + '@emotion/sheet@1.2.2': + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1': + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: ^18.2.0 + + '@emotion/utils@1.2.1': + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + + '@emotion/weak-memoize@0.3.1': + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + + '@esbuild/aix-ppc64@0.19.11': + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.11': + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.3': + resolution: {integrity: sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.11': + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.3': + resolution: {integrity: sha512-Lemgw4io4VZl9GHJmjiBGzQ7ONXRfRPHcUEerndjwiSkbxzrpq0Uggku5MxxrXdwJ+pTj1qyw4jwTu7hkPsgIA==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.11': + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.3': + resolution: {integrity: sha512-FKQJKkK5MXcBHoNZMDNUAg1+WcZlV/cuXrWCoGF/TvdRiYS4znA0m5Il5idUwfxrE20bG/vU1Cr5e1AD6IEIjQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.11': + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.3': + resolution: {integrity: sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.11': + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.3': + resolution: {integrity: sha512-tPfZiwF9rO0jW6Jh9ipi58N5ZLoSjdxXeSrAYypy4psA2Yl1dAMhM71KxVfmjZhJmxRjSnb29YlRXXhh3GqzYw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.11': + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.3': + resolution: {integrity: sha512-ERDyjOgYeKe0Vrlr1iLrqTByB026YLPzTytDTz1DRCYM+JI92Dw2dbpRHYmdqn6VBnQ9Bor6J8ZlNwdZdxjlSg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.11': + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.3': + resolution: {integrity: sha512-nXesBZ2Ad1qL+Rm3crN7NmEVJ5uvfLFPLJev3x1j3feCQXfAhoYrojC681RhpdOph8NsvKBBwpYZHR7W0ifTTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.11': + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.3': + resolution: {integrity: sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.11': + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.3': + resolution: {integrity: sha512-zr48Cg/8zkzZCzDHNxXO/89bf9e+r4HtzNUPoz4GmgAkF1gFAFmfgOdCbR8zMbzFDGb1FqBBhdXUpcTQRYS1cQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.11': + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.3': + resolution: {integrity: sha512-7XlCKCA0nWcbvYpusARWkFjRQNWNGlt45S+Q18UeS///K6Aw8bB2FKYe9mhVWy/XLShvCweOLZPrnMswIaDXQA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.11': + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.3': + resolution: {integrity: sha512-qGTgjweER5xqweiWtUIDl9OKz338EQqCwbS9c2Bh5jgEH19xQ1yhgGPNesugmDFq+UUSDtWgZ264st26b3de8A==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.11': + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.3': + resolution: {integrity: sha512-gy1bFskwEyxVMFRNYSvBauDIWNggD6pyxUksc0MV9UOBD138dKTzr8XnM2R4mBsHwVzeuIH8X5JhmNs2Pzrx+A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.11': + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.3': + resolution: {integrity: sha512-UrYLFu62x1MmmIe85rpR3qou92wB9lEXluwMB/STDzPF9k8mi/9UvNsG07Tt9AqwPQXluMQ6bZbTzYt01+Ue5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.11': + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.3': + resolution: {integrity: sha512-9E73TfyMCbE+1AwFOg3glnzZ5fBAFK4aawssvuMgCRqCYzE0ylVxxzjEfut8xjmKkR320BEoMui4o/t9KA96gA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.11': + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.3': + resolution: {integrity: sha512-LlmsbuBdm1/D66TJ3HW6URY8wO6IlYHf+ChOUz8SUAjVTuaisfuwCOAgcxo3Zsu3BZGxmI7yt//yGOxV+lHcEA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.11': + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.3': + resolution: {integrity: sha512-ogV0+GwEmvwg/8ZbsyfkYGaLACBQWDvO0Kkh8LKBGKj9Ru8VM39zssrnu9Sxn1wbapA2qNS6BiLdwJZGouyCwQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.11': + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.3': + resolution: {integrity: sha512-o1jLNe4uzQv2DKXMlmEzf66Wd8MoIhLNO2nlQBHLtWyh2MitDG7sMpfCO3NTcoTMuqHjfufgUQDFRI5C+xsXQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.11': + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.3': + resolution: {integrity: sha512-AZJCnr5CZgZOdhouLcfRdnk9Zv6HbaBxjcyhq0StNcvAdVZJSKIdOiPB9az2zc06ywl0ePYJz60CjdKsQacp5Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.11': + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.3': + resolution: {integrity: sha512-Acsujgeqg9InR4glTRvLKGZ+1HMtDm94ehTIHKhJjFpgVzZG9/pIcWW/HA/DoMfEyXmANLDuDZ2sNrWcjq1lxw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.11': + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.3': + resolution: {integrity: sha512-FSrAfjVVy7TifFgYgliiJOyYynhQmqgPj15pzLyJk8BUsnlWNwP/IAy6GAiB1LqtoivowRgidZsfpoYLZH586A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.11': + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.3': + resolution: {integrity: sha512-xTScXYi12xLOWZ/sc5RBmMN99BcXp/eEf7scUC0oeiRoiT5Vvo9AycuqCp+xdpDyAU+LkrCqEpUS9fCSZF8J3Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.11': + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.3': + resolution: {integrity: sha512-FbUN+0ZRXsypPyWE2IwIkVjDkDnJoMJARWOcFZn4KPPli+QnKqF0z1anvfaYe3ev5HFCpRDLLBDHyOALLppWHw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.8.0': + resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.2': + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.50.0': + resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@fal-works/esbuild-plugin-global-externals@2.1.2': + resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} + + '@fastify/busboy@2.0.0': + resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} + engines: {node: '>=14'} + + '@floating-ui/core@1.5.0': + resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==} + + '@floating-ui/dom@1.5.3': + resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} + + '@floating-ui/react-dom@2.0.2': + resolution: {integrity: sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==} + peerDependencies: + react: ^18.2.0 + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.1': + resolution: {integrity: sha512-5gyJIJ2tZOPMgmZ/vEcVhdmQiy75b7LPO71sYIiDsxGcZ4hxLuygQWCuT0YXHqppt//Eese+L6t5KnX/gZ3tVA==} + peerDependencies: + react: ^18.2.0 + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.1.6': + resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} + + '@gar/promisify@1.1.3': + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + + '@humanwhocodes/config-array@0.11.11': + resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@1.2.1': + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jimp/bmp@0.10.3': + resolution: {integrity: sha512-keMOc5woiDmONXsB/6aXLR4Z5Q+v8lFq3EY2rcj2FmstbDMhRuGbmcBxlEgOqfRjwvtf/wOtJ3Of37oAWtVfLg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/core@0.10.3': + resolution: {integrity: sha512-Gd5IpL3U2bFIO57Fh/OA3HCpWm4uW/pU01E75rI03BXfTdz3T+J7TwvyG1XaqsQ7/DSlS99GXtLQPlfFIe28UA==} + + '@jimp/custom@0.10.3': + resolution: {integrity: sha512-nZmSI+jwTi5IRyNLbKSXQovoeqsw+D0Jn0SxW08wYQvdkiWA8bTlDQFgQ7HVwCAKBm8oKkDB/ZEo9qvHJ+1gAQ==} + + '@jimp/gif@0.10.3': + resolution: {integrity: sha512-vjlRodSfz1CrUvvrnUuD/DsLK1GHB/yDZXHthVdZu23zYJIW7/WrIiD1IgQ5wOMV7NocfrvPn2iqUfBP81/WWA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/jpeg@0.10.3': + resolution: {integrity: sha512-AAANwgUZOt6f6P7LZxY9lyJ9xclqutYJlsxt3JbriXUGJgrrFAIkcKcqv1nObgmQASSAQKYaMV9KdHjMlWFKlQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/plugin-blit@0.10.3': + resolution: {integrity: sha512-5zlKlCfx4JWw9qUVC7GI4DzXyxDWyFvgZLaoGFoT00mlXlN75SarlDwc9iZ/2e2kp4bJWxz3cGgG4G/WXrbg3Q==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/plugin-blur@0.10.3': + resolution: {integrity: sha512-cTOK3rjh1Yjh23jSfA6EHCHjsPJDEGLC8K2y9gM7dnTUK1y9NNmkFS23uHpyjgsWFIoH9oRh2SpEs3INjCpZhQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/plugin-circle@0.10.3': + resolution: {integrity: sha512-51GAPIVelqAcfuUpaM5JWJ0iWl4vEjNXB7p4P7SX5udugK5bxXUjO6KA2qgWmdpHuCKtoNgkzWU9fNSuYp7tCA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/plugin-color@0.10.3': + resolution: {integrity: sha512-RgeHUElmlTH7vpI4WyQrz6u59spiKfVQbsG/XUzfWGamFSixa24ZDwX/yV/Ts+eNaz7pZeIuv533qmKPvw2ujg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/plugin-contain@0.10.3': + resolution: {integrity: sha512-bYJKW9dqzcB0Ihc6u7jSyKa3juStzbLs2LFr6fu8TzA2WkMS/R8h+ddkiO36+F9ILTWHP0CIA3HFe5OdOGcigw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + '@jimp/plugin-scale': '>=0.3.5' + + '@jimp/plugin-cover@0.10.3': + resolution: {integrity: sha512-pOxu0cM0BRPzdV468n4dMocJXoMbTnARDY/EpC3ZW15SpMuc/dr1KhWQHgoQX5kVW1Wt8zgqREAJJCQ5KuPKDA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-crop': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + '@jimp/plugin-scale': '>=0.3.5' + + '@jimp/plugin-crop@0.10.3': + resolution: {integrity: sha512-nB7HgOjjl9PgdHr076xZ3Sr6qHYzeBYBs9qvs3tfEEUeYMNnvzgCCGtUl6eMakazZFCMk3mhKmcB9zQuHFOvkg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/plugin-displace@0.10.3': + resolution: {integrity: sha512-8t3fVKCH5IVqI4lewe4lFFjpxxr69SQCz5/tlpDLQZsrNScNJivHdQ09zljTrVTCSgeCqQJIKgH2Q7Sk/pAZ0w==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/plugin-dither@0.10.3': + resolution: {integrity: sha512-JCX/oNSnEg1kGQ8ffZ66bEgQOLCY3Rn+lrd6v1jjLy/mn9YVZTMsxLtGCXpiCDC2wG/KTmi4862ysmP9do9dAQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/plugin-fisheye@0.10.3': + resolution: {integrity: sha512-RRZb1wqe+xdocGcFtj2xHU7sF7xmEZmIa6BmrfSchjyA2b32TGPWKnP3qyj7p6LWEsXn+19hRYbjfyzyebPElQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/plugin-flip@0.10.3': + resolution: {integrity: sha512-0epbi8XEzp0wmSjoW9IB0iMu0yNF17aZOxLdURCN3Zr+8nWPs5VNIMqSVa1Y62GSyiMDpVpKF/ITiXre+EqrPg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-rotate': '>=0.3.5' + + '@jimp/plugin-gaussian@0.10.3': + resolution: {integrity: sha512-25eHlFbHUDnMMGpgRBBeQ2AMI4wsqCg46sue0KklI+c2BaZ+dGXmJA5uT8RTOrt64/K9Wz5E+2n7eBnny4dfpQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/plugin-invert@0.10.3': + resolution: {integrity: sha512-effYSApWY/FbtlzqsKXlTLkgloKUiHBKjkQnqh5RL4oQxh/33j6aX+HFdDyQKtsXb8CMd4xd7wyiD2YYabTa0g==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/plugin-mask@0.10.3': + resolution: {integrity: sha512-twrg8q8TIhM9Z6Jcu9/5f+OCAPaECb0eKrrbbIajJqJ3bCUlj5zbfgIhiQIzjPJ6KjpnFPSqHQfHkU1Vvk/nVw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/plugin-normalize@0.10.3': + resolution: {integrity: sha512-xkb5eZI/mMlbwKkDN79+1/t/+DBo8bBXZUMsT4gkFgMRKNRZ6NQPxlv1d3QpRzlocsl6UMxrHnhgnXdLAcgrXw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/plugin-print@0.10.3': + resolution: {integrity: sha512-wjRiI6yjXsAgMe6kVjizP+RgleUCLkH256dskjoNvJzmzbEfO7xQw9g6M02VET+emnbY0CO83IkrGm2q43VRyg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + + '@jimp/plugin-resize@0.10.3': + resolution: {integrity: sha512-rf8YmEB1d7Sg+g4LpqF0Mp+dfXfb6JFJkwlAIWPUOR7lGsPWALavEwTW91c0etEdnp0+JB9AFpy6zqq7Lwkq6w==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/plugin-rotate@0.10.3': + resolution: {integrity: sha512-YXLlRjm18fkW9MOHUaVAxWjvgZM851ofOipytz5FyKp4KZWDLk+dZK1JNmVmK7MyVmAzZ5jsgSLhIgj+GgN0Eg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + '@jimp/plugin-crop': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + + '@jimp/plugin-scale@0.10.3': + resolution: {integrity: sha512-5DXD7x7WVcX1gUgnlFXQa8F+Q3ThRYwJm+aesgrYvDOY+xzRoRSdQvhmdd4JEEue3lyX44DvBSgCIHPtGcEPaw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + + '@jimp/plugin-shadow@0.10.3': + resolution: {integrity: sha512-/nkFXpt2zVcdP4ETdkAUL0fSzyrC5ZFxdcphbYBodqD7fXNqChS/Un1eD4xCXWEpW8cnG9dixZgQgStjywH0Mg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blur': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + + '@jimp/plugin-threshold@0.10.3': + resolution: {integrity: sha512-Dzh0Yq2wXP2SOnxcbbiyA4LJ2luwrdf1MghNIt9H+NX7B+IWw/N8qA2GuSm9n4BPGSLluuhdAWJqHcTiREriVA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-color': '>=0.8.0' + '@jimp/plugin-resize': '>=0.8.0' + + '@jimp/plugins@0.10.3': + resolution: {integrity: sha512-jTT3/7hOScf0EIKiAXmxwayHhryhc1wWuIe3FrchjDjr9wgIGNN2a7XwCgPl3fML17DXK1x8EzDneCdh261bkw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/png@0.10.3': + resolution: {integrity: sha512-YKqk/dkl+nGZxSYIDQrqhmaP8tC3IK8H7dFPnnzFVvbhDnyYunqBZZO3SaZUKTichClRw8k/CjBhbc+hifSGWg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/tiff@0.10.3': + resolution: {integrity: sha512-7EsJzZ5Y/EtinkBGuwX3Bi4S+zgbKouxjt9c82VJTRJOQgLWsE/RHqcyRCOQBhHAZ9QexYmDz34medfLKdoX0g==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/types@0.10.3': + resolution: {integrity: sha512-XGmBakiHZqseSWr/puGN+CHzx0IKBSpsKlmEmsNV96HKDiP6eu8NSnwdGCEq2mmIHe0JNcg1hqg59hpwtQ7Tiw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + + '@jimp/utils@0.10.3': + resolution: {integrity: sha512-VcSlQhkil4ReYmg1KkN+WqHyYfZ2XfZxDsKAHSfST1GEz/RQHxKZbX+KhFKtKflnL0F4e6DlNQj3vznMNXCR2w==} + + '@joshwooding/vite-plugin-react-docgen-typescript@0.2.1': + resolution: {integrity: sha512-ou4ZJSXMMWHqGS4g8uNRbC5TiTWxAgQZiVucoUrOCWuPrTbkpJbmVyIi9jU72SBry7gQtuMEDp4YR8EEXAg7VQ==} + peerDependencies: + typescript: '>= 4.3.x' + vite: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@jridgewell/gen-mapping@0.3.3': + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.1': + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.5': + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.19': + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + + '@jspm/core@2.0.1': + resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==} + + '@juggle/resize-observer@3.3.1': + resolution: {integrity: sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==} + + '@lit-labs/ssr-dom-shim@1.1.1': + resolution: {integrity: sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==} + + '@lit/reactive-element@1.6.3': + resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + + '@mdx-js/react@2.3.0': + resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} + peerDependencies: + react: ^18.2.0 + + '@msgpack/msgpack@2.8.0': + resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} + engines: {node: '>= 10'} + + '@ndelangen/get-tarball@3.0.9': + resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/fs@2.1.2': + resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + '@npmcli/move-file@2.0.1': + resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs + + '@nxg-org/mineflayer-auto-jump@0.7.7': + resolution: {integrity: sha512-50FYsz5rxBuLzOh7wqmg9iN9zdVGD+QjuaPcw/mD7q8Bq6Bq+o1/DfXfpoNGIHaDag80q6FJSpc73MI3Scid8g==} + + '@nxg-org/mineflayer-physics-util@1.5.8': + resolution: {integrity: sha512-KmCkAqpUo8BbuRdIBs6+V2hWHehz++PRz3lRwIsb47CuG0u4sgLYh37RY3ifAznC6uWvmPK+q3B4ZXwJzPy1MQ==} + + '@nxg-org/mineflayer-tracker@1.2.1': + resolution: {integrity: sha512-SI1ffF8zvg3/ZNE021Ja2W0FZPN+WbQDZf8yFqOcXtPRXAtM9W6HvoACdzXep8BZid7WYgYLIgjKpB+9RqvCNQ==} + + '@nxg-org/mineflayer-trajectories@1.1.1': + resolution: {integrity: sha512-X103KXlX8+L3uMeK4jQxMUdTizv01sQRSfBizAF/iOAdfQZehRLXr3CYKeJzfwPYGLN0X0JCl++cMEcZVn4vbg==} + + '@nxg-org/mineflayer-util-plugin@1.8.3': + resolution: {integrity: sha512-YlIbzCDs9822xuvmYlD0vXZz0iye9buqp9NK4nNn15gYybdqBtC/YxK6BLqXtwNohZCKoZdKgei7Xd5Bt2/rUg==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@radix-ui/number@1.0.1': + resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} + + '@radix-ui/primitive@1.0.1': + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + + '@radix-ui/react-arrow@1.0.3': + resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.0.3': + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.0.1': + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.0.1': + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-direction@1.0.1': + resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.0.4': + resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.0.1': + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.0.3': + resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.0.1': + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-popper@1.1.2': + resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.0.3': + resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@1.0.3': + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.0.4': + resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@1.2.2': + resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.0.3': + resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.0.2': + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-toggle-group@1.0.4': + resolution: {integrity: sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle@1.0.3': + resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toolbar@1.0.4': + resolution: {integrity: sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.0.1': + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.0.1': + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.0.3': + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.0.1': + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.0.1': + resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.0.1': + resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.0.1': + resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.0.3': + resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.0.1': + resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + + '@react-oauth/google@0.12.1': + resolution: {integrity: sha512-qagsy22t+7UdkYAiT5ZhfM4StXi9PPNvw0zuwNmabrWyMKddczMtBIOARflbaIj+wHiQjnMAsZmzsUYuXeyoSg==} + peerDependencies: + react: ^18.2.0 + react-dom: '>=16.8.0' + + '@rollup/plugin-babel@5.3.1': + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + + '@rollup/plugin-node-resolve@11.2.1': + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/plugin-replace@2.4.2': + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + + '@rollup/pluginutils@3.1.0': + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/pluginutils@5.0.5': + resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rushstack/eslint-patch@1.4.0': + resolution: {integrity: sha512-cEjvTPU32OM9lUFegJagO0mRnIn+rbqrG89vV8/xLnLFX0DoR0r1oy5IlTga71Q7uT3Qus7qm7wgeiMT/+Irlg==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@socket.io/component-emitter@3.1.0': + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + + '@storybook/addon-actions@7.4.6': + resolution: {integrity: sha512-SsqZr3js5NinKPnC8AeNI7Ij+Q6fIl9tRdRmSulEgjksjOg7E5S1/Wsn5Bb2CCgj7MaX6VxGyC7s3XskQtDiIQ==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/addon-backgrounds@7.4.6': + resolution: {integrity: sha512-+LHTZB/ZYMAzkyD5ZxSriBsqmsrvIaW/Nnd/BeuXGbkrVKKqM0qAKiFZAfjc2WchA1piVNy0/1Rsf+kuYCEiJw==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/addon-controls@7.4.6': + resolution: {integrity: sha512-4lq3sycEUIsK8SUWDYc60QgF4vV9FZZ3lDr6M7j2W9bOnvGw49d2fbdlnq+bX1ZprZZ9VgglQpBAorQB3BXZRw==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/addon-docs@7.4.6': + resolution: {integrity: sha512-dLaub+XWFq4hChw+xfuF9yYg0Txp77FUawKoAigccfjWXx+OOhRV3XTuAcknpXkYq94GWynHgUFXosXT9kbDNA==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/addon-essentials@7.4.6': + resolution: {integrity: sha512-dWodufrt71TK7ELkeIvVae/x4PzECUlbOm57Iqqt4yQCyR291CgvI4PjeB8un2HbpcXCGZ+N/Oj3YkytvzBi4A==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/addon-highlight@7.4.6': + resolution: {integrity: sha512-zCufxxD2KS5VwczxfkcBxe1oR/juTTn2H1Qm8kYvWCJQx3UxzX0+G9cwafbpV7eivqaufLweEwROkH+0KjAtkQ==} + + '@storybook/addon-links@7.4.6': + resolution: {integrity: sha512-BPygElZKX+CPI9Se6GJNk1dYc5oxuhA+vHigO1tBqhiM6VkHyFP3cvezJNQvpNYhkUnu3cxnZXb3UJnlRbPY3g==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/addon-measure@7.4.6': + resolution: {integrity: sha512-nCymMLaHnxv8TE3yEM1A9Tulb1NuRXRNmtsdHTkjv7P1aWCxZo8A/GZaottKe/GLT8jSRjZ+dnpYWrbAhw6wTQ==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/addon-outline@7.4.6': + resolution: {integrity: sha512-errNUblRVDLpuEaHQPr/nsrnsUkD2ARmXawkRvizgDWLIDMDJYjTON3MUCaVx3x+hlZ3I6X//G5TVcma8tCc8A==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/addon-toolbars@7.4.6': + resolution: {integrity: sha512-L9m2FBcKeteGq7qIYsMJr0LEfiH7Wdrv5IDcldZTn68eZUJTh1p4GdJZcOmzX1P5IFRr76hpu03iWsNlWQjpbQ==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/addon-viewport@7.4.6': + resolution: {integrity: sha512-INDtk54j7bi7NgxMfd2ATmbA0J7nAd6X8itMkLIyPuPJtx8bYHPDORyemDOd0AojgmAdTOAyUtDYdI/PFeo4Cw==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/blocks@7.4.6': + resolution: {integrity: sha512-HxBSAeOiTZW2jbHQlo1upRWFgoMsaAyKijUFf5MwwMNIesXCuuTGZDJ3xTABwAVLK2qC9Ektfbo0CZCiPVuDRQ==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/builder-manager@7.4.6': + resolution: {integrity: sha512-zylZCD2rmyLOOFBFmUgtJg6UNUKmRNgXiig1XApzS2TkIbTZP827DsVEUl0ey/lskCe0uArkrEBR6ICba8p/Rw==} + + '@storybook/builder-vite@7.4.6': + resolution: {integrity: sha512-xV9STYK+TkqWWTf2ydm6jx+7P70fjD2UPd1XTUw08uKszIjhuuxk+bG/OF5R1E25mPunAKXm6kBFh351AKejBg==} + peerDependencies: + '@preact/preset-vite': '*' + typescript: '>= 4.3.x' + vite: ^3.0.0 || ^4.0.0 + vite-plugin-glimmerx: '*' + peerDependenciesMeta: + '@preact/preset-vite': + optional: true + typescript: + optional: true + vite-plugin-glimmerx: + optional: true + + '@storybook/channels@7.4.6': + resolution: {integrity: sha512-yPv/sfo2c18fM3fvG0i1xse63vG8l33Al/OU0k/dtovltPu001/HVa1QgBgsb/QrEfZtvGjGhmtdVeYb39fv3A==} + + '@storybook/cli@7.4.6': + resolution: {integrity: sha512-rRwaH8pOL+FHz/pJMEkNpMH2xvZvWsrl7obBYw26NQiHmiVSAkfHJicndSN1mwc+p5w+9iXthrgzbLtSAOSvkA==} + hasBin: true + + '@storybook/client-logger@7.4.6': + resolution: {integrity: sha512-XDw31ZziU//86PKuMRnmc+L/G0VopaGKENQOGEpvAXCU9IZASwGKlKAtcyosjrpi+ZiUXlMgUXCpXM7x3b1Ehw==} + + '@storybook/codemod@7.4.6': + resolution: {integrity: sha512-lxmwEpwksCaAq96APN2YlooSDfKjJ1vKzN5Ni2EqQzf2TEXl7XQjLacHd7OOaII1kfsy+D5gNG4N5wBo7Ub30g==} + + '@storybook/components@7.4.6': + resolution: {integrity: sha512-nIRBhewAgrJJVafyCzuaLx1l+YOfvvD5dOZ0JxZsxJsefOdw1jFpUqUZ5fIpQ2moyvrR0mAUFw378rBfMdHz5Q==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/core-client@7.4.6': + resolution: {integrity: sha512-tfgxAHeCvMcs6DsVgtb4hQSDaCHeAPJOsoyhb47eDQfk4OmxzriM0qWucJV5DePSMi+KutX/rN2u0JxfOuN68g==} + + '@storybook/core-common@7.4.6': + resolution: {integrity: sha512-05MJFmOM86qvTLtgDskokIFz9txe0Lbhq4L3by1FtF0GwgH+p+W6I94KI7c6ANER+kVZkXQZhiRzwBFnVTW+Cg==} + + '@storybook/core-events@7.4.6': + resolution: {integrity: sha512-r5vrE+32lwrJh1NGFr1a0mWjvxo7q8FXYShylcwRWpacmL5NTtLkrXOoJSeGvJ4yKNYkvxQFtOPId4lzDxa32w==} + + '@storybook/core-server@7.4.6': + resolution: {integrity: sha512-jqmRTGCJ1W0WReImivkisPVaLFT5sjtLnFoAk0feHp6QS5j7EYOPN7CYzliyQmARWTLUEXOVaFf3VD6nJZQhJQ==} + + '@storybook/csf-plugin@7.4.6': + resolution: {integrity: sha512-yi7Qa4NSqKOyiJTWCxlB0ih2ijXq6oY5qZKW6MuMMBP14xJNRGLbH5KabpfXgN2T7YECcOWG1uWaGj2veJb1KA==} + + '@storybook/csf-tools@7.4.6': + resolution: {integrity: sha512-ocKpcIUtTBy6hlLY34RUFQyX403cWpB2gGfqvkHbpGe2BQj7EyV0zpWnjsfVxvw+M9OWlCdxHWDOPUgXM33ELw==} + + '@storybook/csf@0.1.1': + resolution: {integrity: sha512-4hE3AlNVxR60Wc5KSC68ASYzUobjPqtSKyhV6G+ge0FIXU55N5nTY7dXGRZHQGDBPq+XqchMkIdlkHPRs8nTHg==} + + '@storybook/docs-mdx@0.1.0': + resolution: {integrity: sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==} + + '@storybook/docs-tools@7.4.6': + resolution: {integrity: sha512-nZj1L/8WwKWWJ41FW4MaKGajZUtrhnr9UwflRCkQJaWhAKmDfOb5M5TqI93uCOULpFPOm5wpoMBz2IHInQ2Lrg==} + + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/manager-api@7.4.6': + resolution: {integrity: sha512-inrm3DIbCp8wjXSN/wK6e6i2ysQ/IEmtC7IN0OJ7vdrp+USCooPT448SQTUmVctUGCFmOU3fxXByq8g77oIi7w==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/manager@7.4.6': + resolution: {integrity: sha512-kA1hUDxpn1i2SO9OinvLvVXDeL4xgJkModp+pbE8IXv4NJWReNq1ecMeQCzPLS3Sil2gnrullQ9uYXsnZ9bxxA==} + + '@storybook/mdx2-csf@1.1.0': + resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} + + '@storybook/node-logger@7.4.6': + resolution: {integrity: sha512-djZb310Q27GviDug1XBv0jOEDLCiwr4hhDE0aifCEKZpfNCi/EaP31nbWimFzZwxu4hE/YAPWExzScruR1zw9Q==} + + '@storybook/postinstall@7.4.6': + resolution: {integrity: sha512-TqI5BucPAGRWrkh55BYiG2/gHLFtC0In4cuu0GsUzB/1jc4i51npLRorCwhmT7r7YliGl5F7JaP0Bni/qHN3Lg==} + + '@storybook/preview-api@7.4.6': + resolution: {integrity: sha512-byUS/Opt3ytWD4cWz3sNEKw5Yks8MkQgRN+GDSyIomaEAQkLAM0rchPC0MYjwCeUSecV7IIQweNX5RbV4a34BA==} + + '@storybook/preview@7.4.6': + resolution: {integrity: sha512-2RPXusJ4CTDrIipIKKvbotD7fP0+8VzoFjImunflIrzN9rni+2rq5eMjqlXAaB+77w064zIR4uDUzI9fxsMDeQ==} + + '@storybook/react-dom-shim@7.4.6': + resolution: {integrity: sha512-DSq8l9FDocUF1ooVI+TF83pddj1LynE/Hv0/y8XZhc3IgJ/HkuOQuUmfz29ezgfAi9gFYUR8raTIBi3/xdoRmw==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/react-vite@7.4.6': + resolution: {integrity: sha512-jkjnrf3FxzR5wcmebXRPflrsM4WIDjWyW/NVFJwxi5PeIOk7fE7/QAPrm4NFRUu2Q7DeuH3oLKsw8bigvUI9RA==} + engines: {node: '>=16'} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + vite: ^3.0.0 || ^4.0.0 + + '@storybook/react@7.4.6': + resolution: {integrity: sha512-w0dVo64baFFPTGpUOWFqkKsu6pQincoymegSNgqaBd5DxEyMDRiRoTWSJHMKE9BwgE8SyWhRkP1ak1mkccSOhQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@storybook/router@7.4.6': + resolution: {integrity: sha512-Vl1esrHkcHxDKqc+HY7+6JQpBPW3zYvGk0cQ2rxVMhWdLZTAz1hss9DqzN9tFnPyfn0a1Q77EpMySkUrvWKKNQ==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/telemetry@7.4.6': + resolution: {integrity: sha512-c8p/C1NIH8EMBviZkBCx8MMDk6rrITJ+b29DEp5MaWSRlklIVyhGiC4RPIRv6sxJwlD41PnqWVFtfu2j2eXLdQ==} + + '@storybook/theming@7.4.6': + resolution: {integrity: sha512-HW77iJ9ptCMqhoBOYFjRQw7VBap+38fkJGHP5KylEJCyYCgIAm2dEcQmtWpMVYFssSGcb6djfbtAMhYU4TL4Iw==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/types@7.4.6': + resolution: {integrity: sha512-6QLXtMVsFZFpzPkdGWsu/iuc8na9dnS67AMOBKm5qCLPwtUJOYkwhMdFRSSeJthLRpzV7JLAL8Kwvl7MFP3QSw==} + + '@storybook/web-components-vite@7.4.6': + resolution: {integrity: sha512-L/y6MTLbqfHaM0faK9Yl8n5PIyW4daZrtk7NfaOT6UjgNFjOx3o4CctYew6oj90cNk5HdZQX2OZny043GxDLZw==} + engines: {node: ^14.18 || >=16} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/web-components@7.4.6': + resolution: {integrity: sha512-HWqkZtdkmNimkzMmE0mGRys2ee9qgEeDVCruiffySVquBRMQ6n1xgvHZYaO6OLlMeH0YHPg083ZqUasS5GsYVg==} + engines: {node: '>=16.0.0'} + peerDependencies: + lit: ^2.0.0 + + '@surma/rollup-plugin-off-main-thread@2.2.3': + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@tweenjs/tween.js@18.6.4': + resolution: {integrity: sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ==} + + '@tweenjs/tween.js@20.0.3': + resolution: {integrity: sha512-SYUe1UgY5HM05EB4+0B4arq2IPjvyzKXoklXKxSYrc2IFxGm1cBrqg5XbiB5uwbs0xY5j+rj986NAJMM0KZaUw==} + + '@types/babel__core@7.20.2': + resolution: {integrity: sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==} + + '@types/babel__generator@7.6.5': + resolution: {integrity: sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==} + + '@types/babel__template@7.4.2': + resolution: {integrity: sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==} + + '@types/babel__traverse@7.20.2': + resolution: {integrity: sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==} + + '@types/body-parser@1.19.3': + resolution: {integrity: sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==} + + '@types/chai-subset@1.3.3': + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + + '@types/chai@4.3.6': + resolution: {integrity: sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==} + + '@types/connect@3.4.36': + resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} + + '@types/cookie@0.4.1': + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + + '@types/cors@2.8.15': + resolution: {integrity: sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==} + + '@types/cross-spawn@6.0.3': + resolution: {integrity: sha512-BDAkU7WHHRHnvBf5z89lcvACsvkz/n7Tv+HyD/uW76O29HoH1Tk/W6iQrepaZVbisvlEek4ygwT8IW7ow9XLAA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/detect-port@1.3.3': + resolution: {integrity: sha512-bV/jQlAJ/nPY3XqSatkGpu+nGzou+uSwrH1cROhn+jBFg47yaNH+blW4C7p9KhopC7QxCv/6M86s37k8dMk0Yg==} + + '@types/doctrine@0.0.3': + resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} + + '@types/draco3d@1.4.7': + resolution: {integrity: sha512-sjx6hQ8UArRZf+2ZhpPkjJW8iCkyxar69/IElc9NHuGE40n0U9SuvxX59CHvF4xUH7qfJDQ2lIbANZ0HHJg+BQ==} + + '@types/ejs@3.1.3': + resolution: {integrity: sha512-mv5T/JI/bu+pbfz1o+TLl1NF0NIBbjS0Vl6Ppz1YY9DkXfzZT0lelXpfS5i3ZS3U/p90it7uERQpBvLYoK8e4A==} + + '@types/emscripten@1.39.8': + resolution: {integrity: sha512-Rk0HKcMXFUuqT32k1kXHZWgxiMvsyYsmlnjp0rLKa0MMoqXLE3T9dogDBTRfuc3SAsXu97KD3k4SKR1lHqd57w==} + + '@types/escodegen@0.0.6': + resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} + + '@types/estree@0.0.39': + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + + '@types/estree@0.0.51': + resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + + '@types/estree@1.0.2': + resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} + + '@types/express-serve-static-core@4.17.37': + resolution: {integrity: sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==} + + '@types/express@4.17.18': + resolution: {integrity: sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==} + + '@types/find-cache-dir@3.2.1': + resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} + + '@types/gapi@0.0.47': + resolution: {integrity: sha512-/ZsLuq6BffMgbKMtZyDZ8vwQvTyKhKQ1G2K6VyWCgtHHhfSSXbk4+4JwImZiTjWNXfI2q1ZStAwFFHSkNoTkHA==} + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + + '@types/graceful-fs@4.1.7': + resolution: {integrity: sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==} + + '@types/http-cache-semantics@4.0.2': + resolution: {integrity: sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==} + + '@types/http-errors@2.0.2': + resolution: {integrity: sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==} + + '@types/istanbul-lib-coverage@2.0.4': + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + + '@types/istanbul-lib-report@3.0.1': + resolution: {integrity: sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==} + + '@types/istanbul-reports@3.0.2': + resolution: {integrity: sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==} + + '@types/js-cookie@2.2.7': + resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} + + '@types/json-schema@7.0.12': + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/lodash-es@4.17.9': + resolution: {integrity: sha512-ZTcmhiI3NNU7dEvWLZJkzG6ao49zOIjEgIE0RgV7wbPxU0f2xT3VSAHw2gmst8swH6V0YkLRGp4qPlX/6I90MQ==} + + '@types/lodash@4.14.199': + resolution: {integrity: sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==} + + '@types/mdast@4.0.3': + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + + '@types/mdx@2.0.8': + resolution: {integrity: sha512-r7/zWe+f9x+zjXqGxf821qz++ld8tp6Z4jUS6qmPZUXH6tfh4riXOhAqb12tWGWAevCFtMt1goLWkQMqIJKpsA==} + + '@types/mime-types@2.1.2': + resolution: {integrity: sha512-q9QGHMGCiBJCHEvd4ZLdasdqXv570agPsUW0CeIm/B8DzhxsYMerD0l3IlI+EQ1A2RWHY2mmM9x1YIuuWxisCg==} + + '@types/mime@1.3.3': + resolution: {integrity: sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==} + + '@types/mime@3.0.2': + resolution: {integrity: sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/minimist@1.2.3': + resolution: {integrity: sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node-fetch@2.6.6': + resolution: {integrity: sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==} + + '@types/node@14.18.56': + resolution: {integrity: sha512-+k+57NVS9opgrEn5l9c0gvD1r6C+PtyhVE4BTnMMRwiEA8ZO8uFcs6Yy2sXIy0eC95ZurBtRSvhZiHXBysbl6w==} + + '@types/node@16.18.58': + resolution: {integrity: sha512-YGncyA25/MaVtQkjWW9r0EFBukZ+JulsLcVZBlGUfIb96OBMjkoRWwQo5IEWJ8Fj06Go3GHw+bjYDitv6BaGsA==} + + '@types/node@20.11.19': + resolution: {integrity: sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==} + + '@types/node@20.12.7': + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + + '@types/node@20.8.0': + resolution: {integrity: sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==} + + '@types/node@20.8.10': + resolution: {integrity: sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==} + + '@types/normalize-package-data@2.4.2': + resolution: {integrity: sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==} + + '@types/offscreencanvas@2019.7.2': + resolution: {integrity: sha512-ujCjOxeA07IbEBQYAkoOI+XFw5sT3nhWJ/xZfPR6reJppDG7iPQPZacQiLTtWH1b3a2NYXWlxvYqa40y/LAixQ==} + + '@types/parse-json@4.0.0': + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + + '@types/pretty-hrtime@1.0.1': + resolution: {integrity: sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==} + + '@types/prop-types@15.7.5': + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + + '@types/qs@6.9.8': + resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} + + '@types/range-parser@1.2.5': + resolution: {integrity: sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==} + + '@types/rbush@3.0.1': + resolution: {integrity: sha512-0LecKcQjuJ/PclmThftzePIKXaKt7OMjoZZ3Xf17Ebd28ZU6OFUu1mObbvV74YXS1W3APdZO5GRHyD/ezGK4Vg==} + + '@types/react-dom@18.2.7': + resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} + + '@types/react-transition-group@4.4.7': + resolution: {integrity: sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg==} + + '@types/react@18.2.20': + resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} + + '@types/readable-stream@4.0.11': + resolution: {integrity: sha512-R3eUMUTTKoIoaz7UpYLxvZCrOmCRPRbAmoDDHKcimTEySltaJhF8hLzj4+EzyDifiX5eK6oDQGSfmNnXjxZzYQ==} + + '@types/resolve@1.17.1': + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + + '@types/sat@0.0.31': + resolution: {integrity: sha512-P4SVw79XheP1p92useDVpLYYOUQ6lpw2L7IdQz4dD23DZ8DiC1STgPOh72hjR5IZJBPQbzlICAbmjCKbwyYuxg==} + + '@types/scheduler@0.16.3': + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + + '@types/semver@7.5.3': + resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} + + '@types/send@0.17.2': + resolution: {integrity: sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==} + + '@types/serve-static@1.15.3': + resolution: {integrity: sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==} + + '@types/sinonjs__fake-timers@8.1.1': + resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} + + '@types/sizzle@2.3.3': + resolution: {integrity: sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==} + + '@types/stats.js@0.17.1': + resolution: {integrity: sha512-OgfYE1x2w1jRUXzzKABX+kOdwz2y9PE0uSwnZabkWfJTWOzm7Pvfm4JI2xqRE0q2nwUe2jZLWcrcnhd9lQU63w==} + + '@types/three@0.154.0': + resolution: {integrity: sha512-IioqpGhch6FdLDh4zazRn3rXHj6Vn2nVOziJdXVbJFi9CaI65LtP9qqUtpzbsHK2Ezlox8NtsLNHSw3AQzucjA==} + + '@types/three@0.156.0': + resolution: {integrity: sha512-733bXDSRdlrxqOmQuOmfC1UBRuJ2pREPk8sWnx9MtIJEVDQMx8U0NQO5MVVaOrjzDPyLI+cFPim2X/ss9v0+LQ==} + + '@types/trusted-types@2.0.3': + resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} + + '@types/ua-parser-js@0.7.39': + resolution: {integrity: sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==} + + '@types/unist@2.0.8': + resolution: {integrity: sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==} + + '@types/unist@3.0.2': + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + '@types/webxr@0.5.7': + resolution: {integrity: sha512-Rcgs5c2eNFnHp53YOjgtKfl/zWX1Y+uFGUwlSXrWcZWu3yhANRezmph4MninmqybUYT6g9ZE0aQ9QIdPkLR3Kg==} + + '@types/wicg-file-system-access@2023.10.2': + resolution: {integrity: sha512-nSiK8qt0O7sQmDcW3HYfvya7GDoD6ipgdcUFzk3QN+UBIqXeNg38Nh6VnKv7EIPfkVETRiquyMskCbpxUzgX1Q==} + + '@types/yargs-parser@21.0.1': + resolution: {integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==} + + '@types/yargs@17.0.28': + resolution: {integrity: sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw==} + + '@types/yauzl@2.10.1': + resolution: {integrity: sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@typescript-eslint/eslint-plugin@6.1.0': + resolution: {integrity: sha512-qg7Bm5TyP/I7iilGyp6DRqqkt8na00lI6HbjWZObgk3FFSzH5ypRwAHXJhJkwiRtTcfn+xYQIMOR5kJgpo6upw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.7.3': + resolution: {integrity: sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.1.0': + resolution: {integrity: sha512-AxjgxDn27hgPpe2rQe19k0tXw84YCOsjDJ2r61cIebq1t+AIxbgiXKvD4999Wk49GVaAcdJ/d49FYel+Pp3jjw==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/scope-manager@6.7.3': + resolution: {integrity: sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.1.0': + resolution: {integrity: sha512-kFXBx6QWS1ZZ5Ni89TyT1X9Ag6RXVIVhqDs0vZE/jUeWlBv/ixq2diua6G7ece6+fXw3TvNRxP77/5mOMusx2w==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.1.0': + resolution: {integrity: sha512-+Gfd5NHCpDoHDOaU/yIF3WWRI2PcBRKKpP91ZcVbL0t5tQpqYWBs3z/GGhvU+EV1D0262g9XCnyqQh19prU0JQ==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/types@6.7.3': + resolution: {integrity: sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.1.0': + resolution: {integrity: sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@6.7.3': + resolution: {integrity: sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.1.0': + resolution: {integrity: sha512-wp652EogZlKmQoMS5hAvWqRKplXvkuOnNzZSE0PVvsKjpexd/XznRVHAtrfHFYmqaJz0DFkjlDsGYC9OXw+OhQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.1.0': + resolution: {integrity: sha512-yQeh+EXhquh119Eis4k0kYhj9vmFzNpbhM3LftWQVwqVjipCkwHBQOZutcYW+JVkjtTG9k8nrZU1UoNedPDd1A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/visitor-keys@6.7.3': + resolution: {integrity: sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@vitejs/plugin-react@3.1.0': + resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.1.0-beta.0 + + '@vitest/expect@0.34.6': + resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} + + '@vitest/runner@0.34.6': + resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} + + '@vitest/snapshot@0.34.6': + resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} + + '@vitest/spy@0.34.6': + resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} + + '@vitest/utils@0.34.6': + resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} + + '@xboxreplay/errors@0.1.0': + resolution: {integrity: sha512-Tgz1d/OIPDWPeyOvuL5+aai5VCcqObhPnlI3skQuf80GVF3k1I0lPCnGC+8Cm5PV9aLBT5m8qPcJoIUQ2U4y9g==} + + '@xboxreplay/xboxlive-auth@3.3.3': + resolution: {integrity: sha512-j0AU8pW10LM8O68CTZ5QHnvOjSsnPICy0oQcP7zyM7eWkDQ/InkiQiirQKsPn1XRYDl4ccNu0WM582s3UKwcBg==} + + '@xmcl/asm@1.0.1': + resolution: {integrity: sha512-7vCVgm1E1IZ2cujiitFk9550Vgu2XAOn1ff90di638fMmTK0XkFMXKsSR/nGZmYKt+XiTMI/0B3TvreqbVjOug==} + engines: {node: '>=16'} + + '@xmcl/core@2.12.0': + resolution: {integrity: sha512-rcxy29i2fjGFpe6sEvaJxYHFGlfYMcJwElbk6TIUCrKNOiMhyLZeBtCJSk38hvaYF0kiROA3c4EJeWNGHf2zVw==} + engines: {node: '>=16.0'} + + '@xmcl/file-transfer@1.0.3': + resolution: {integrity: sha512-p5JsUQpNShqW4VpqaKXcQzYSO9o/9UGjXZfb5aNt/24Ty+j9qepQyPo4P1CFwfzgFuf9GGhH5cPUi6nShlKS+g==} + engines: {node: '>=16.0'} + + '@xmcl/forge-site-parser@2.0.9': + resolution: {integrity: sha512-OHKG2KYE+F6TSeOQmymuGoqEifxbJb3w3X/hmxMNeqtewiYukJldPmKO559ZFnZnOuMQEnr+X0dMbTQwWs5dFg==} + engines: {node: '>=16'} + + '@xmcl/installer@5.1.0': + resolution: {integrity: sha512-KpoxpfYdUWH4U4Yat7RifS1JZajArOdfgsJ/LdU90y6Fc3hKhHSJsiRudk1VxASTyMXKCM0lWVxH5JzywRHBDw==} + engines: {node: '>=16.0'} + + '@xmcl/task@4.0.6': + resolution: {integrity: sha512-h0AR7DQm6xxBgROPnRi0EY8DlaDQwuGzPA5lFRMD4EsnpHJ/3fPdzwbMLb81ZxKJlLSCn3hVR2yI0mSKIm5Heg==} + + '@xmcl/text-component@2.1.3': + resolution: {integrity: sha512-LdUZgC5+8F23J2ZkZi7aZb87QBNfxwJqhUyts8YBQYwxQPwei20TOBm2hr69euoAeDo7NDfbLXssD4mUvsAS0Q==} + engines: {node: '>=16'} + + '@xmcl/unzip@2.1.2': + resolution: {integrity: sha512-Lm/eg/e0/p+sfj/RT2QDpsBAf39DZqQ3+XvX1JXZPb64wnjwOf8CGU1WPv6BseEcJ5CMOpm0s2NyrEQD04y0UQ==} + engines: {node: '>=16'} + peerDependencies: + yauzl: ^2.10.0 + + '@xobotyi/scrollbar-width@1.9.5': + resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} + + '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15': + resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} + engines: {node: '>=14.15.0'} + peerDependencies: + esbuild: '>=0.10.0' + + '@yarnpkg/fslib@2.10.3': + resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} + engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} + + '@yarnpkg/libzip@2.3.0': + resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} + engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} + + '@zardoy/flying-squid@0.0.17': + resolution: {integrity: sha512-qGCS7aRmMflDdIN7IGLpDc0W2gUYc5OQ45KEn3XtcxwOP0Q7zyvo3mnsD5KSV3n2lyhQ4783Ov8V6J86xea0lw==} + engines: {node: '>=8'} + hasBin: true + + '@zardoy/react-util@0.2.0': + resolution: {integrity: sha512-glABtx54mh4XSaK6BNALWE3mlshPjcPwPsRj/GnOXEA7WJY/6n43iJoukbaYF3758mGZRU5Fq6gklyFjBg0yHQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.0.0 + + '@zardoy/utils@0.0.11': + resolution: {integrity: sha512-d6xBnSFCOa98HcL52xSBflJKjKpxfRhtr1eVexy89YujeCHSQhUMmSz9h07xyrulfW60k9tSeYH5reuqoh4l4w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + Base64@0.2.1: + resolution: {integrity: sha512-reGEWshDmTDQDsCec/HduOO9Wyj6yMOupMfhIf3ugN1TDlK2NQW4DDJSqNNtp380SNcvRfXtO8HSCQot0d0SMw==} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + + acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + adm-zip@0.5.12: + resolution: {integrity: sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==} + engines: {node: '>=6.0'} + + aes-js@3.1.2: + resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} + + after@0.8.2: + resolution: {integrity: sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==} + + agent-base@5.1.1: + resolution: {integrity: sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==} + engines: {node: '>= 6.0.0'} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + + agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + animejs@3.2.1: + resolution: {integrity: sha512-sWno3ugFryK5nhiDm/2BKeFCpZv7vzerWUcUPyAZLDhMek3+S/p418ldZJbJXo5ZUOpfm2kP2XRO4NJcULMy9A==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-base@1.1.0: + resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + app-root-dir@1.0.2: + resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + + are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.3: + resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + engines: {node: '>=10'} + + array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + + array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + + arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + arraybuffer.slice@0.0.7: + resolution: {integrity: sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + asap@1.0.0: + resolution: {integrity: sha512-Ej9qjcXY+8Tuy1cNqiwNMwFRXOy9UwgTeMA8LxreodygIPV48lx8PU1ecFxb5ZeU1DpMKxiq6vGLTxcitWZPbA==} + + asn1.js@5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + + asn1@0.2.3: + resolution: {integrity: sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + assert@2.0.0: + resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + ast-types@0.14.2: + resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} + engines: {node: '>=4'} + + ast-types@0.15.2: + resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} + engines: {node: '>=4'} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + async@2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + + async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.12.0: + resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + + axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + + babel-core@7.0.0-bridge.0: + resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-polyfill-corejs2@0.4.5: + resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.8.3: + resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.5.2: + resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + backo2@1.0.2: + resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-arraybuffer@0.1.4: + resolution: {integrity: sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==} + engines: {node: '>= 0.6.0'} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + better-opn@3.0.2: + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} + + big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bit-twiddle@1.0.2: + resolution: {integrity: sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + blob-util@2.0.2: + resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} + + blob@0.0.5: + resolution: {integrity: sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + bmp-js@0.1.0: + resolution: {integrity: sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==} + + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-assert@1.2.1: + resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} + + browserfs@https://codeload.github.com/zardoy/browserfs/tar.gz/ab58ae8ef00e3a31db01909e365e6cb5188436e0: + resolution: {tarball: https://codeload.github.com/zardoy/browserfs/tar.gz/ab58ae8ef00e3a31db01909e365e6cb5188436e0} + version: 2.0.0 + engines: {node: '>= 18'} + + browserfs@https://codeload.github.com/zardoy/browserfs/tar.gz/e60ca69e74888e057a96a468afe1d62347d3f56f: + resolution: {tarball: https://codeload.github.com/zardoy/browserfs/tar.gz/e60ca69e74888e057a96a468afe1d62347d3f56f} + version: 2.0.0-zardoy + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + + browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + + browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + + browserify-sign@4.2.1: + resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==} + + browserify-zlib@0.1.4: + resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} + + browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + + browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-equal@0.0.1: + resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==} + engines: {node: '>=0.4.0'} + + buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + c8@7.14.0: + resolution: {integrity: sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==} + engines: {node: '>=10.12.0'} + hasBin: true + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacache@16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + cachedir@2.4.0: + resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} + engines: {node: '>=6'} + + call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase-keys@7.0.2: + resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} + engines: {node: '>=12'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001524: + resolution: {integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==} + + canvas@2.11.2: + resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} + engines: {node: '>=6'} + + capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + cbor-extract@2.2.0: + resolution: {integrity: sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==} + hasBin: true + + cbor-x@1.5.4: + resolution: {integrity: sha512-PVKILDn+Rf6MRhhcyzGXi5eizn1i0i3F8Fe6UMMxXBnWkalq9+C5+VTmlIjAYM4iF2IYF2N+zToqAfYOp+3rfw==} + + chai@4.3.10: + resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + + change-case@5.1.2: + resolution: {integrity: sha512-CAtbGEDulyjzs05RXy3uKcwqeztz/dMEuAc1Xu9NQBsbrhuGMneL0u9Dj5SoutLKBFYun8txxYIwhjtLNfUmCA==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + check-more-types@2.24.0: + resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} + engines: {node: '>= 0.8.0'} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + + cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + + classnames@2.3.2: + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.1: + resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} + engines: {node: '>=6'} + + cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clsx@1.1.1: + resolution: {integrity: sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==} + engines: {node: '>=6'} + + color-convert@0.5.3: + resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-diff@1.4.0: + resolution: {integrity: sha512-4oDB/o78lNdppbaqrg0HjOp7pHmUc+dfCxWKWFnQg6AB/1dkjtBDop3RZht5386cq9xBUDRvDvSCA7WUlM9Jqw==} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + component-bind@1.0.0: + resolution: {integrity: sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==} + + component-emitter@1.2.1: + resolution: {integrity: sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==} + + component-emitter@1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + + component-inherit@0.0.3: + resolution: {integrity: sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + + confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + + constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + contro-max@0.1.2: + resolution: {integrity: sha512-mY9aRQ9on/iyzvyhb4OD/10WRRKulVd92F7cxMFVn3rq5EwI+gZitGpHN2mp9+IzwRgBJrOKr1C051b3YlEktQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + core-js-compat@3.32.1: + resolution: {integrity: sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==} + + core-js@3.32.1: + resolution: {integrity: sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + corser@2.0.1: + resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} + engines: {node: '>= 0.4.0'} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + cypress-esbuild-preprocessor@1.0.2: + resolution: {integrity: sha512-JsFnm6fBQt/OEzstknJ1KLMTuUERUaG0ZB9fk0KdNUlZqxaVEoQ9/pFvKmqRfzUe2y00cWD++ptccQA4tNAAlQ==} + + cypress-plugin-snapshots@1.4.4: + resolution: {integrity: sha512-rijq3RTEZNtxQA4KCUwjXinmE1Ww+z6cQW0B14iodFM/HlX5LN16XT/2QS3X1nUXRKt0QdTrAC5MQfMUrjBkSQ==} + engines: {node: '>=8.2.1'} + peerDependencies: + cypress: ^4.5.0 + + cypress@10.11.0: + resolution: {integrity: sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==} + engines: {node: '>=12.0.0'} + hasBin: true + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + dayjs@1.11.9: + resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.1.1: + resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decamelize@5.0.1: + resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} + engines: {node: '>=10'} + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + decompress-response@4.2.1: + resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} + engines: {node: '>=8'} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.0: + resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==} + engines: {node: '>= 0.4'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + defu@6.1.2: + resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} + + del@6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@1.0.0: + resolution: {integrity: sha512-/Nd1EQbQbI9UbSHrMiKZjFLrXSnU328iQdZKPQf78XQI6C+gutkFUeoHpG5J08Ioa6HeRbRNFpSIclh1xyG0mw==} + engines: {node: '>=6'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-collisions@7.0.5: + resolution: {integrity: sha512-RiebSYJ9Vok1uVm57bxpI69EO2ySK1rdcHpRv28IDBh/wgaF8wxjoZJV7mmqz8MOKioLwMHvcMyP1R0CLZ+RbA==} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + detect-package-manager@2.0.1: + resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} + engines: {node: '>=12'} + + detect-port@1.5.1: + resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} + hasBin: true + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diamond-square@https://codeload.github.com/zardoy/diamond-square/tar.gz/915fce8e27fe8eb45464d89b9563956afa4f7687: + resolution: {tarball: https://codeload.github.com/zardoy/diamond-square/tar.gz/915fce8e27fe8eb45464d89b9563956afa4f7687} + version: 1.3.0 + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff2html@2.12.2: + resolution: {integrity: sha512-G/Zn1KyG/OeC+67N/P26WHsQpjrjUiRyWGvg29ypy3MxSsBmF0bzsU/Irq70i2UAg+f/MzmLx4v/Nkt01TOU3g==} + engines: {node: '>=4'} + + diff@2.2.3: + resolution: {integrity: sha512-9wfm3RLzMp/PyTFWuw9liEzdlxsdGixCW0ZTU1XDmtlAkvpVXTPGF8KnfSs0hm3BPbg19OrUPPsRkHXoREpP1g==} + engines: {node: '>=0.3.1'} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + discontinuous-range@1.0.0: + resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + + dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + + draco3d@1.5.6: + resolution: {integrity: sha512-+3NaRjWktb5r61ZFoDejlykPEFKT5N/LkbXsaddlw6xNSXBanUYpFc2AXXpbJDilPHazcSreU/DpQIaxfX0NfQ==} + + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.4.504: + resolution: {integrity: sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ==} + + elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + + emit-then@2.0.0: + resolution: {integrity: sha512-y5JHnrygHnCndtqVHHDhCr0ZzzWHK5RBTczWRlGSIR5UnGHBXuxpoaE0UB5E82qym8ma2dI799wDSSJN2e4VSg==} + engines: {node: '>=5'} + + emittery@0.10.2: + resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + endian-toggle@0.0.0: + resolution: {integrity: sha512-ShfqhXeHRE4TmggSlHXG8CMGIcsOsqDw/GcoPcosToE59Rm9e4aXaMhEQf2kPBsBRrKem1bbOAv5gOKnkliMFQ==} + + engine.io-client@3.5.3: + resolution: {integrity: sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==} + + engine.io-client@6.5.2: + resolution: {integrity: sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==} + + engine.io-parser@2.2.1: + resolution: {integrity: sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==} + + engine.io-parser@5.2.1: + resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} + engines: {node: '>=10.0.0'} + + engine.io@3.6.1: + resolution: {integrity: sha512-dfs8EVg/i7QjFsXxn7cCRQ+Wai1G1TlEvHhdYEi80fxn5R1vZ2K661O6v/rezj1FP234SZ14r9CmJke99iYDGg==} + engines: {node: '>=8.0.0'} + + engine.io@6.5.3: + resolution: {integrity: sha512-IML/R4eG/pUS5w7OfcDE0jKrljWS9nwnEfsxWCIJF5eO6AHo6+Hlv+lQbdlAYsiJPHzUthLm1RUjnBzWOs45cw==} + engines: {node: '>=10.2.0'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + envinfo@7.10.0: + resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} + engines: {node: '>=4'} + hasBin: true + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + + eruda@3.0.1: + resolution: {integrity: sha512-6q1Xdwga4JTr1mKSW4mzuWSSbmXgqpm/8Wa1QGFGfCWRjC0bCQjbS4u06M1te1moucIS3hBLlbSTPWYH2W0qbQ==} + + es-abstract@1.22.2: + resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} + engines: {node: '>= 0.4'} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} + engines: {node: '>= 0.4'} + + es-module-lexer@0.9.3: + resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + es6-object-assign@1.1.0: + resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} + + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + + esbuild-plugin-alias@0.2.1: + resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} + + esbuild-plugin-polyfill-node@0.3.0: + resolution: {integrity: sha512-SHG6CKUfWfYyYXGpW143NEZtcVVn8S/WHcEOxk62LuDXnY4Zpmc+WmxJKN6GMTgTClXJXhEM5KQlxKY6YjbucQ==} + peerDependencies: + esbuild: '*' + + esbuild-register@3.5.0: + resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.3: + resolution: {integrity: sha512-UlJ1qUUA2jL2nNib1JTSkifQTcYTroFqRjwCFW4QYEKEsixXD5Tik9xML7zh2gTxkYTBKGHNH9y7txMwVyPbjw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-config-prettier@8.10.0: + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-config-xo-react@0.27.0: + resolution: {integrity: sha512-wiV215xQIn71XZyyVfaOXHaFpR1B14IJttwOjMi/eqUK1s+ojJdHr7eHqTLaGUfh6FKgWha1QNwePlIXx7mBUg==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=8.6.0' + eslint-plugin-react: '>=7.29.0' + eslint-plugin-react-hooks: '>=4.3.0' + + eslint-config-xo-typescript@1.0.1: + resolution: {integrity: sha512-vPQssnRSUgBFOEfB/KY12CXwltwFSn4RSCfa+w7gjBC2PFQ7Yfgmyei+1XUZ3K+8LRGef2NMJUcxts7PldhDjg==} + engines: {node: '>=16'} + peerDependencies: + '@typescript-eslint/eslint-plugin': '>=6.0.0' + '@typescript-eslint/parser': '>=6.0.0' + eslint: '>=8.0.0' + typescript: '>=4.7' + + eslint-config-xo@0.43.1: + resolution: {integrity: sha512-azv1L2PysRA0NkZOgbndUpN+581L7wPqkgJOgxxw3hxwXAbJgD6Hqb/SjHRiACifXt/AvxCzE/jIKFAlI7XjvQ==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=8.27.0' + + eslint-config-zardoy@0.2.17: + resolution: {integrity: sha512-d31WsjyVSQqHbzTpBSmH96+nw5gwY2yhDbZatU89gr+U8ou1FRUkJSApYJUgmcINt8AQocj1RDDAVYmVSILZgQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + eslint: ^8.5.0 + eslint-plugin-vue: ^8.4.1 + typescript: ^4.5.2 + vue-eslint-parser: ^8.2.0 + peerDependenciesMeta: + eslint-plugin-vue: + optional: true + vue-eslint-parser: + optional: true + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.8.0: + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-es@3.0.1: + resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-eslint-comments@3.2.0: + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-import@2.27.5: + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-node@11.1.0: + resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=5.16.0' + + eslint-plugin-react-hooks@4.6.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react@7.34.1: + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-sonarjs@0.19.0: + resolution: {integrity: sha512-6+s5oNk5TFtVlbRxqZN7FIGmjdPCYQKaTzFPmqieCmsU1kBYDzndTeQav0xtQNwZJWu5awWfTGe8Srq9xFOGnw==} + engines: {node: '>=14'} + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + + eslint-plugin-unicorn@48.0.0: + resolution: {integrity: sha512-8fk/v3p1ro34JSVDBEmtOq6EEQRpMR0iTir79q69KnXFZ6DJyPkT3RAi+ZoTqhQMdDSpGh8BGR68ne1sP5cnAA==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.44.0' + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + + eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.50.0: + resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-to-babel@3.2.1: + resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} + engines: {node: '>=8.3.0'} + + estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-promise@0.0.1: + resolution: {integrity: sha512-ouEmk2N0BalybPM0zmj3RHE93AX4p9hAIHZfbbqxolLChqCB6pcLDbYH6zZ8TaiFWImPHfs5kFnNpA0u9RdEaQ==} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter2@6.4.7: + resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + executable@4.1.1: + resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} + engines: {node: '>=4'} + + exif-parser@0.1.12: + resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==} + + exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + + express-ws@4.0.0: + resolution: {integrity: sha512-KEyUw8AwRET2iFjFsI1EJQrJ/fHeGiJtgpYgEWG3yDv4l/To/m3a2GaYfeGyB3lsWdvbesjF5XCMx+SVBgAAYw==} + engines: {node: '>=4.5.0'} + peerDependencies: + express: ^4.0.0 || ^5.0.0-alpha.1 + + express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extract-zip@1.7.0: + resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} + hasBin: true + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-loops@1.1.3: + resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} + + fast-shallow-equal@1.0.0: + resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} + + fastest-stable-stringify@2.0.2: + resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} + + fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fetch-retry@5.0.6: + resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} + + fflate@0.6.10: + resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-system-cache@2.3.0: + resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} + + file-type@9.0.0: + resolution: {integrity: sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==} + engines: {node: '>=6'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + filesize@10.0.12: + resolution: {integrity: sha512-6RS9gDchbn+qWmtV2uSjo5vmKizgfCQeb5jKmqx8HyzA3MoLqqyQxN+QcjkGBJt7FjJ9qFce67Auyya5rRRbpw==} + engines: {node: '>= 10.4.0'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.1.0: + resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + engines: {node: '>=12.0.0'} + + flatmap@0.0.3: + resolution: {integrity: sha512-OuR+o7kHVe+x9RtIujPay7Uw3bvDZBZFSBXClEphZuSDLmZTqMdclasf4vFSsogC8baDz0eaC2NdO/2dlXHBKQ==} + + flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + + flow-parser@0.218.0: + resolution: {integrity: sha512-mk4e7UK4P/W3tjrJyto6oxPuCjwvRMyzBh72hTl8T0dOcTzkP0M2JJHpncgyhKphMFi9pnjwHfc8e0oe4Uk3LA==} + engines: {node: '>=0.4.0'} + + follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + + gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-npm-tarball-url@2.0.3: + resolution: {integrity: sha512-R/PW6RqyaBQNWYaSyfrh54/qtcnOp22FHCCiRhSSZj0FP3KQWCsxxt0DzIdVTbwTqe9CtQfvl/FPD4UIPt4pqw==} + engines: {node: '>=12.17'} + + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + + getos@3.2.1: + resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + giget@1.1.3: + resolution: {integrity: sha512-zHuCeqtfgqgDwvXlR84UNgnJDuUHQcNI5OqWqFxxuk2BshuKbYhJWdxBsEo4PvKqoGh23lUAIvBNpChMLv7/9Q==} + hasBin: true + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + + gl@6.0.2: + resolution: {integrity: sha512-yBbfpChOtFvg5D+KtMaBFvj6yt3vUnheNAH+UrQH2TfDB8kr0tERdL0Tjhe0W7xJ6jR6ftQBluTZR9jXUnKe8g==} + engines: {node: '>=14.0.0'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-promise@4.2.2: + resolution: {integrity: sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==} + engines: {node: '>=12'} + peerDependencies: + glob: ^7.1.6 + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.3.3: + resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + + global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + + global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.21.0: + resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + glsl-tokenizer@2.1.5: + resolution: {integrity: sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gunzip-maybe@1.4.2: + resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} + hasBin: true + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-binary2@1.0.3: + resolution: {integrity: sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==} + + has-cors@1.1.0: + resolution: {integrity: sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + + hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + hogan.js@3.0.2: + resolution: {integrity: sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==} + hasBin: true + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + http-browserify@1.7.0: + resolution: {integrity: sha512-Irf/LJXmE3cBzU1eaR4+NEX6bmVLqt1wkmDiA7kBwH7zmb0D8kBAXsDmQ88hhj/qv9iEZKlyGx/hrMcFi8sOHw==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http-server@14.1.1: + resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==} + engines: {node: '>=12'} + hasBin: true + + http-signature@1.3.6: + resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} + engines: {node: '>=0.10'} + + https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + + https-proxy-agent@4.0.0: + resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} + engines: {node: '>= 6.0.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + engines: {node: '>= 14'} + + human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + hyphenate-style-name@1.0.4: + resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} + + iconify-icon@1.0.8: + resolution: {integrity: sha512-jvbUKHXf8EnGGArmhlP2IG8VqQLFFyTvTqb9LVL2TKTh7/eCCD1o2HHE9thpbJJb6B8hzhcFb6rOKhvo7reNKA==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + image-size@0.7.5: + resolution: {integrity: sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==} + engines: {node: '>=6.9.0'} + hasBin: true + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-meta-resolve@3.0.0: + resolution: {integrity: sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + indexof@0.0.1: + resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==} + + infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + inline-style-prefixer@6.0.4: + resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==} + + internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-absolute-url@3.0.3: + resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} + engines: {node: '>=8'} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-deflate@1.0.0: + resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-gzip@1.0.0: + resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} + engines: {node: '>=0.10.0'} + + is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.1: + resolution: {integrity: sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + jackspeak@2.3.0: + resolution: {integrity: sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==} + engines: {node: '>=14'} + + jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jimp@0.10.3: + resolution: {integrity: sha512-meVWmDMtyUG5uYjFkmzu0zBgnCvvxwWNi27c4cg55vWNVC9ES4Lcwb+ogx+uBBQE3Q+dLKjXaLl0JVW+nUNwbQ==} + + jose@4.15.5: + resolution: {integrity: sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==} + + jpeg-js@0.3.7: + resolution: {integrity: sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==} + + js-base64@2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + + js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + + js-graph-algorithms@1.0.18: + resolution: {integrity: sha512-Gu1wtWzXBzGeye/j9BuyplGHscwqKRZodp/0M1vyBc19RJpblSwKGu099KwwaTx9cRIV+Qupk8xUMfEiGfFqSA==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jscodeshift@0.14.0: + resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} + hasBin: true + peerDependencies: + '@babel/preset-env': ^7.1.6 + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + jsprim@2.0.2: + resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} + engines: {'0': node >=0.6.0} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + lazy-ass@1.6.0: + resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} + engines: {node: '> 0.8'} + + lazy-universal-dotenv@4.0.0: + resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} + engines: {node: '>=14.0.0'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + lil-gui@0.17.0: + resolution: {integrity: sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==} + + lil-gui@0.18.2: + resolution: {integrity: sha512-DgdrLy3/KGC0PiQLKgOcJMPItP4xY4iWgJ9+91Zaxfr8GCTmMps05QS9w9jW7yspILlbscbquwjOwxmWnSx5Uw==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + listr2@3.14.0: + resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} + engines: {node: '>=10.0.0'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + + lit-element@3.3.3: + resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + + lit-html@2.8.0: + resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + + lit@2.8.0: + resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + + load-bmfont@1.4.1: + resolution: {integrity: sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.compact@3.0.1: + resolution: {integrity: sha512-2ozeiPi+5eBXW1CLtzjk8XQFhQOEMwwfxblqeq6EGyTxZJ1bPATqilY0e6g2SLQpP4KuMeuioBhEnWz5Pr7ICQ==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash.reduce@4.6.0: + resolution: {integrity: sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + + long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + looks-same@8.2.3: + resolution: {integrity: sha512-0LK5r4+9t2D56XPVNH3hhG4o0yBYUdeu9FEd8z0ZCs/2fR9zJQj+6ob6ued8iHk3yddrSAdUA+9YGVK2FBMGUw==} + engines: {node: '>= 12.0.0'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.0.1: + resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} + engines: {node: 14 || >=16.14} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + macaddress@0.5.3: + resolution: {integrity: sha512-vGBKTA+jwM4KgjGZ+S/8/Mkj9rWzePyGY6jManXPGhiWu63RYwW8dKPyk5koP+8qNVhPhHgFa1y/MJ4wrjsNrg==} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + + magic-string@0.30.4: + resolution: {integrity: sha512-Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg==} + engines: {node: '>=12'} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-fetch-happen@10.2.1: + resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + map-or-similar@1.5.0: + resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + + markdown-it@14.0.0: + resolution: {integrity: sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==} + hasBin: true + + markdown-to-jsx@7.3.2: + resolution: {integrity: sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==} + engines: {node: '>= 10'} + peerDependencies: + react: ^18.2.0 + + md5-file@4.0.0: + resolution: {integrity: sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg==} + engines: {node: '>=6.0'} + hasBin: true + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + mdast-util-definitions@4.0.0: + resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} + + mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + + mdast-util-to-string@1.1.0: + resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memoizerific@1.11.3: + resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + meow@10.1.5: + resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + merge@1.2.1: + resolution: {integrity: sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==} + + meshoptimizer@0.18.1: + resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@2.1.0: + resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} + engines: {node: '>=8'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minecraft-assets@1.12.2: + resolution: {integrity: sha512-/eMxh3LNjCXOnU6KnQMjBM8dRnoJNpWIg7mD2m2RthraYiQK2FNzPWIKxWm2j3Ufcf5nzFXupgABledE86r4fQ==} + + minecraft-data@3.62.0: + resolution: {integrity: sha512-jJXZ/WgyX79tIHlqvfyqG+sJDUekHiA3e9NRUCMGUno4NDrZMcpRI065DnkrI720RHTMb8iadf0NmnBP4Rla5A==} + + minecraft-folder-path@1.2.0: + resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} + + minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/5554c7ab0a74bce52aa5f5f04a48eb8d3b9ac65c: + resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/5554c7ab0a74bce52aa5f5f04a48eb8d3b9ac65c} + version: 1.0.1 + + minecraft-protocol@https://codeload.github.com/zardoy/minecraft-protocol/tar.gz/2c14a686bfe7cbd9a5c87b629b402295ee86219f: + resolution: {tarball: https://codeload.github.com/zardoy/minecraft-protocol/tar.gz/2c14a686bfe7cbd9a5c87b629b402295ee86219f} + version: 1.45.0 + engines: {node: '>=14'} + + minecraft-wrap@1.5.1: + resolution: {integrity: sha512-7DZ2WhrcRD3fUMau84l9Va0KWzV92SHNdB7mnNdNhgXID2aW6pjWuYPZi8MepEBemA4XKKdnDx7HmhTbkoiR8A==} + hasBin: true + + minecrafthawkeye@1.3.6: + resolution: {integrity: sha512-SlRlorxQs6nNzMiiIQ5z47wzbAI27UaCdbRB82CE8jqj4C8m3Gqk5TlgN+PSThxx8EDPXySzd8Vk+/wNigAd5A==} + + mineflayer-pathfinder@2.4.4: + resolution: {integrity: sha512-HAXakZrJRb1UC+5dv8EaDrqjW3ZnBnBk3nkb6x/YWyhHCUKn/E7VU0FO+UN9whuqPlkSaVumEdXJdydE6lSYxQ==} + + mineflayer@https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/5a544cf2547a6e0f1f17786962d77a33c661c02f: + resolution: {tarball: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/5a544cf2547a6e0f1f17786962d77a33c661c02f} + version: 4.20.1 + engines: {node: '>=18'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + + minipass-fetch@2.1.2: + resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.0.3: + resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@0.3.0: + resolution: {integrity: sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==} + deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mkdirp@2.1.6: + resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.4.2: + resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + + mojangson@2.0.4: + resolution: {integrity: sha512-HYmhgDjr1gzF7trGgvcC/huIg2L8FsVbi/KacRe6r1AswbboGVZDS47SOZlomPuMWvZLas8m9vuHHucdZMwTmQ==} + + moo@0.5.2: + resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nan@2.18.0: + resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} + + nano-css@5.3.5: + resolution: {integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==} + peerDependencies: + react: ^18.2.0 + react-dom: '*' + + nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + nearley@2.20.1: + resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + nested-error-stacks@2.1.1: + resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} + + net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d827dba61bd2f9ac9a6086fe2079a0fccadd070: + resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d827dba61bd2f9ac9a6086fe2079a0fccadd070} + version: 0.2.4 + + nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-abi@3.47.0: + resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} + engines: {node: '>=10'} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + node-canvas-webgl@0.3.0: + resolution: {integrity: sha512-wDRCTEE2TCqKDeSef5cNgtLv8kgjRlnFN3aYgB9yni0kHRNnKBSSP93lT8VIV5GuMWiy5KNXBU0ilyWL5wTvFg==} + + node-dir@0.1.17: + resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} + engines: {node: '>= 0.10.5'} + + node-fetch-native@1.4.0: + resolution: {integrity: sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build-optional-packages@5.1.1: + resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} + hasBin: true + + node-gyp@9.4.1: + resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} + engines: {node: ^12.13 || ^14.13 || >=16} + hasBin: true + + node-gzip@1.1.2: + resolution: {integrity: sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw==} + + node-html-parser@6.1.10: + resolution: {integrity: sha512-6/uWdWxjQWQ7tMcFK2wWlrflsQUzh1HsEzlIf2j5+TtzfhT2yUvg3DwZYAmjEHeR3uX74ko7exjHW69J0tOzIg==} + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + + node-rsa@0.4.2: + resolution: {integrity: sha512-Bvso6Zi9LY4otIZefYrscsUpo2mUpiAVIEmSZV2q41sP8tHZoert3Yu6zv4f/RXJqMNZQKCtnhDugIuCma23YA==} + + node-rsa@1.1.1: + resolution: {integrity: sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==} + + nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + + npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} + + object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + omggif@1.0.10: + resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + + os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + + ospath@1.2.2: + resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-asn1@5.1.6: + resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + + parse-bmfont-ascii@1.0.6: + resolution: {integrity: sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==} + + parse-bmfont-binary@1.0.6: + resolution: {integrity: sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==} + + parse-bmfont-xml@1.1.4: + resolution: {integrity: sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==} + + parse-color@1.0.0: + resolution: {integrity: sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==} + + parse-headers@2.0.5: + resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parseqs@0.0.6: + resolution: {integrity: sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==} + + parseuri@0.0.6: + resolution: {integrity: sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + + path-exists-cli@2.0.0: + resolution: {integrity: sha512-qGr0A87KYCznmvabblxyxnzA/MtPZ28wH+4SCMP4tjTFAbzqwvs5xpUZExAYzq5OgHe5vIswzdH5iosCb8YF/Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + + peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + + peerjs-js-binarypack@2.0.0: + resolution: {integrity: sha512-wu+L0Qeg4IH2DXm3B6xKP5ODeCIovwEEO/Fu3MVqApPQeVLzSdZpFzQzPobh+sdhUWMQGEO7YxHeiwpPngLjqQ==} + engines: {node: '>= 14.0.0'} + + peerjs@1.5.0: + resolution: {integrity: sha512-NLZ73jRNE4aLq2pmVTiSkWmwf6cvt9cH72qJHnzaLH+I2CtoWVvY42U9/O0/tYE6UYwRYJ1ktKRs2DdZ1Jrgcg==} + engines: {node: '>= 14'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + phin@2.9.3: + resolution: {integrity: sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pixelmatch@4.0.2: + resolution: {integrity: sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==} + hasBin: true + + pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + + pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + pngjs@3.4.0: + resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} + engines: {node: '>=4.0.0'} + + polished@4.2.2: + resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} + engines: {node: '>=10'} + + poly-decomp@0.3.0: + resolution: {integrity: sha512-hWeBxGzPYiybmI4548Fca7Up/0k1qS5+79cVHI9+H33dKya5YNb9hxl0ZnDaDgvrZSuYFBhkCK/HOnqN7gefkQ==} + + portfinder@1.0.32: + resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} + engines: {node: '>= 0.12.0'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + potpack@1.0.2: + resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} + + prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@1.19.1: + resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} + engines: {node: '>=4'} + hasBin: true + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + + prismarine-auth@2.4.2: + resolution: {integrity: sha512-Cq4woGobnFYYfMBDh1WITW+Vs98toN91qAFBvBitwV7IwJaiSAh2Nl+WPUEGeg5eLBoSPpSyCVT8P2oi7Cav8g==} + + prismarine-biome@1.3.0: + resolution: {integrity: sha512-GY6nZxq93mTErT7jD7jt8YS1aPrOakbJHh39seYsJFXvueIOdHAmW16kYQVrTVMW5MlWLQVxV/EquRwOgr4MnQ==} + peerDependencies: + minecraft-data: 3.62.0 + prismarine-registry: ^1.1.0 + + prismarine-block@https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0} + version: 1.17.1 + + prismarine-chat@1.9.1: + resolution: {integrity: sha512-x7WWa5MNhiLZSO6tw+YyKpzquFZ+DNISVgiV6K3SU0GsishMXe+nto02WhF/4AuFerKdugm9u1d/r4C4zSkJOg==} + + prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f} + version: 1.35.0 + engines: {node: '>=14'} + + prismarine-entity@2.3.1: + resolution: {integrity: sha512-HOv8l7IetHNf4hwZ7V/W4vM3GNl+e6VCtKDkH9h02TRq7jWngsggKtJV+VanCce/sNwtJUhJDjORGs728ep4MA==} + + prismarine-item@1.14.0: + resolution: {integrity: sha512-udQHYGJ05klFe8Kkc0TOmwoXj5Xl1ZPgHVoMbGUAFB9exN4TFxEa1A39vkSYhxP5Et9PNufQQvFBFVom0nXikA==} + + prismarine-nbt@2.2.1: + resolution: {integrity: sha512-Mb50c58CPnuZ+qvM31DBa08tf9UumlTq1LkvpMoUpKfCuN05GZHTqCUwER3lxTSHLL0GZKghIPbYR/JQkINijQ==} + + prismarine-nbt@2.5.0: + resolution: {integrity: sha512-F0/8UAa9SDDnAGrBYqZc4nG8h2zj5cE2eAJU5xlDR/IsQQ3moVxkOjE3h3nMv6SbvZrvAcgX7waA/nd9LLHYdA==} + + prismarine-physics@1.8.0: + resolution: {integrity: sha512-gbM+S+bmVtOKVv+Z0WGaHMeEeBHISIDsRDRlv8sr0dex3ZJRhuq8djA02CBreguXtI18ZKh6q3TSj2qDr45NHA==} + + prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f} + version: 2.7.0 + + prismarine-realms@1.3.2: + resolution: {integrity: sha512-5apl9Ru8veTj5q2OozRc4GZOuSIcs3yY4UEtALiLKHstBe8bRw8vNlaz4Zla3jsQ8yP/ul1b1IJINTRbocuA6g==} + + prismarine-recipe@1.3.1: + resolution: {integrity: sha512-xfa9E9ACoaDi+YzNQ+nk8kWSIqt5vSZOOCHIT+dTXscf/dng2HaJ/59uwe1D/jvOkAd2OvM6RRJM6fFe0q/LDA==} + peerDependencies: + prismarine-registry: ^1.4.0 + + prismarine-registry@1.7.0: + resolution: {integrity: sha512-yyva0FpWI078nNeMhx8ekVza5uUTYhEv+C+ADu3wUQXiG8qhXkvrf0uzsnhTgZL8BLdsi2axgCEiKw9qSKIuxQ==} + + prismarine-schematic@1.2.3: + resolution: {integrity: sha512-Mwpn43vEHhm3aw3cPhJjWqztkW+nX+QLajDHlTask8lEOTGl1WmpvFja4iwiws4GIvaC8x0Foptf4uvDsnjrAg==} + + prismarine-windows@2.9.0: + resolution: {integrity: sha512-fm4kOLjGFPov7TEJRmXHoiPabxIQrG36r2mDjlNxfkcLfMHFb3/1ML6mp4iRQa7wL0GK4DIAyiBqCWoeWDxARg==} + + prismarine-world@https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465} + version: 3.6.2 + engines: {node: '>=8.0.0'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + process@https://codeload.github.com/PrismarineJS/node-process/tar.gz/380d0b4f4c86f1b65b216c311bf00431f314e88e: + resolution: {tarball: https://codeload.github.com/PrismarineJS/node-process/tar.gz/380d0b4f4c86f1b65b216c311bf00431f314e88e} + version: 0.11.10 + engines: {node: '>= 0.6.0'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-queue@2.2.5: + resolution: {integrity: sha512-p/iXrPSVfnqPft24ZdNNLECw/UrtLTpT3jpAAMzl/o5/rDsGCPo3/CQS2611flL6LkoEJ3oQZw7C8Q80ZISXRQ==} + engines: {node: '>= 0.8.0'} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + promise@5.0.0: + resolution: {integrity: sha512-N2BfLz0Sigf7rsm5NnItRwTNqEDUF2ephwEXTcOAf2cO9NwZ9TnIjOmnQNtC0r70CV0S1+uc9mSMmFH7gxk87Q==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + prosemirror-commands@1.5.2: + resolution: {integrity: sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==} + + prosemirror-dropcursor@1.8.1: + resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} + + prosemirror-example-setup@1.2.2: + resolution: {integrity: sha512-pHJc656IgYm249RNp0eQaWNmnyWGk6OrzysWfYI4+NwE14HQ7YNYOlRBLErUS6uCAHIYJLNXf0/XCmf1OCtNbQ==} + + prosemirror-gapcursor@1.3.2: + resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} + + prosemirror-history@1.3.2: + resolution: {integrity: sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==} + + prosemirror-inputrules@1.4.0: + resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==} + + prosemirror-keymap@1.2.2: + resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} + + prosemirror-markdown@1.12.0: + resolution: {integrity: sha512-6F5HS8Z0HDYiS2VQDZzfZP6A0s/I0gbkJy8NCzzDMtcsz3qrfqyroMMeoSjAmOhDITyon11NbXSzztfKi+frSQ==} + + prosemirror-menu@1.2.4: + resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} + + prosemirror-model@1.19.4: + resolution: {integrity: sha512-RPmVXxUfOhyFdayHawjuZCxiROsm9L4FCUA6pWI+l7n2yCBsWy9VpdE1hpDHUS8Vad661YLY9AzqfjLhAKQ4iQ==} + + prosemirror-schema-list@1.3.0: + resolution: {integrity: sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==} + + prosemirror-state@1.4.3: + resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} + + prosemirror-transform@1.8.0: + resolution: {integrity: sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==} + + prosemirror-view@1.33.1: + resolution: {integrity: sha512-62qkYgSJIkwIMMCpuGuPzc52DiK1Iod6TWoIMxP4ja6BTD4yO8kCUL64PZ/WhH/dJ9fW0CDO39FhH1EMyhUFEg==} + + protodef-validator@1.3.1: + resolution: {integrity: sha512-lZ5FWKZYR9xOjpMw1+EfZRfCjzNRQWPq+Dk+jki47Sikl2EeWEPnTfnJERwnU/EwFq6us+0zqHHzSsmLeYX+Lg==} + hasBin: true + + protodef@1.15.0: + resolution: {integrity: sha512-bZ2Omw8dT+DACjJHLrBWZlqN4MlT9g9oSpJDdkUAJOStUzgJp+Zn42FJfPUdwutUxjaxA0PftN0PDlNa2XbneA==} + engines: {node: '>=14'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-compare@2.5.1: + resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + + proxy-from-env@1.0.0: + resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + puppeteer-core@2.1.1: + resolution: {integrity: sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==} + engines: {node: '>=8.16.0'} + + qrcode.react@3.1.0: + resolution: {integrity: sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==} + peerDependencies: + react: ^18.2.0 + + qs@6.10.4: + resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} + engines: {node: '>=0.6'} + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + quickselect@2.0.0: + resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} + + railroad-diagrams@1.0.0: + resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} + + rambda@6.9.0: + resolution: {integrity: sha512-yosVdGg1hNGkXPzqGiOYNEpXKjEOxzUCg2rB0l+NKdyCaSf4z+i5ojbN0IqDSezMMf71YEglI+ZUTgTffn5afw==} + + ramda@0.29.0: + resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} + + randexp@0.4.6: + resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} + engines: {node: '>=0.12'} + + random-seed@0.3.0: + resolution: {integrity: sha512-y13xtn3kcTlLub3HKWXxJNeC2qK4mB59evwZ5EkeRlolx+Bp2ztF7LbcZmyCnOqlHQrLnfuNbi1sVmm9lPDlDA==} + engines: {node: '>= 0.6.0'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + range@0.0.3: + resolution: {integrity: sha512-OxK2nY2bmeEB4NxoBraQIBOOeOIxoBvm6yt8MA1kLappgkG3SyLf173iOtT5woWycrtESDD2g0Nl2yt8YPoUnw==} + engines: {node: '>=0.8'} + + raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + rbush@3.0.1: + resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-colorful@5.6.1: + resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} + peerDependencies: + react: ^18.2.0 + react-dom: '>=16.8.0' + + react-docgen-typescript@2.2.2: + resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} + peerDependencies: + typescript: '>= 4.3.x' + + react-docgen@6.0.0-alpha.3: + resolution: {integrity: sha512-DDLvB5EV9As1/zoUsct6Iz2Cupw9FObEGD3DMcIs3EDFIoSKyz8FZtoWj3Wj+oodrU4/NfidN0BL5yrapIcTSA==} + engines: {node: '>=12.0.0'} + hasBin: true + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + + react-element-to-jsx-string@15.0.0: + resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} + peerDependencies: + react: ^18.2.0 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-inspector@6.0.2: + resolution: {integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==} + peerDependencies: + react: ^18.2.0 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.1.0: + resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + react-popper@2.3.0: + resolution: {integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==} + peerDependencies: + '@popperjs/core': ^2.0.0 + react: ^18.2.0 + react-dom: ^16.8.0 || ^17 || ^18 + + react-portal@4.2.1: + resolution: {integrity: sha512-fE9kOBagwmTXZ3YGRYb4gcMy+kSA+yLO0xnPankjRlfBv4uCpFXqKPfkpsGQQR15wkZ9EssnvTOl1yMzbkxhPQ==} + peerDependencies: + react: ^18.2.0 + react-dom: ^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0 + + react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.4: + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.5.5: + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.1: + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: ^18.2.0 + react-dom: '>=16.6.0' + + react-universal-interface@0.6.2: + resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} + peerDependencies: + react: ^18.2.0 + tslib: '*' + + react-use-measure@2.1.1: + resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==} + peerDependencies: + react: ^18.2.0 + react-dom: '>=16.13' + + react-use@17.3.1: + resolution: {integrity: sha512-hs7+tS4rRm1QLHPfanLCqXIi632tP4V7Sai1ENUP2WTufU6am++tU9uSw9YrNCFqbABiEv0ndKU1XCUcfu2tXA==} + peerDependencies: + react: ^18.2.0 + react-dom: ^16.8.0 || ^17.0.0 + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg-up@8.0.0: + resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} + engines: {node: '>=12'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + read-pkg@6.0.0: + resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==} + engines: {node: '>=12'} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readline@1.3.0: + resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} + + recast@0.21.5: + resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} + engines: {node: '>= 4'} + + recast@0.23.4: + resolution: {integrity: sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==} + engines: {node: '>= 4'} + + redent@4.0.0: + resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} + engines: {node: '>=12'} + + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.1.0: + resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + + regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + + regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + + remark-external-links@8.0.0: + resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-slug@6.1.0: + resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + + request-progress@3.0.0: + resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + hasBin: true + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rimraf@5.0.1: + resolution: {integrity: sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==} + engines: {node: '>=14'} + hasBin: true + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rollup-plugin-terser@7.0.2: + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + + rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + + rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + + rtl-css-js@1.16.1: + resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + + sat@0.9.0: + resolution: {integrity: sha512-mxdv5RZJO4tdMnUURGU3gAMcnDUEwcNJwE+lPO0/V+rBeDvFLH3wEZEOR0fH7cTN0zQaNxBEbHnyQL9DzupwQQ==} + + sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + + scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + + screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + + sdp@3.2.0: + resolution: {integrity: sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw==} + + secure-compare@3.0.1: + resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + + serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-harmonic-interval@1.0.1: + resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} + engines: {node: '>=6.9'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + sharp@0.30.7: + resolution: {integrity: sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==} + engines: {node: '>=12.13.0'} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + + side-channel@1.0.5: + resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} + engines: {node: '>= 0.4'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@3.1.1: + resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + skinview-utils@0.7.1: + resolution: {integrity: sha512-4eLrMqR526ehlZbsd8SuZ/CHpS9GiH0xUMoV+PYlJVi95ZFz5HJu7Spt5XYa72DRS7wgt5qquvHZf0XZJgmu9Q==} + + skinview3d@3.0.1: + resolution: {integrity: sha512-2LUSkzGxlZrTQelGT10jcW4TLiFTg5aZqXMEuqAFoWtk3qtaNu0qRFtwK5dN8zEXyKUJ3xlxah5eGtKY/NifQg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + socket.io-adapter@1.1.2: + resolution: {integrity: sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==} + + socket.io-adapter@2.5.2: + resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} + + socket.io-client@2.5.0: + resolution: {integrity: sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==} + + socket.io-client@4.7.2: + resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} + engines: {node: '>=10.0.0'} + + socket.io-parser@3.3.3: + resolution: {integrity: sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==} + + socket.io-parser@3.4.3: + resolution: {integrity: sha512-1rE4dZN3kCI/E5wixd393hmbqa78vVpkKmnEJhLeWoS/C5hbFYAbcSfnWoaVH43u9ToUVtzKjguxEZq+1XZfCQ==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@2.5.0: + resolution: {integrity: sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==} + + socket.io@4.7.2: + resolution: {integrity: sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==} + engines: {node: '>=10.2.0'} + + socks-proxy-agent@7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + + socks@2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + + source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.6: + resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} + engines: {node: '>=0.10.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sshpk@1.17.0: + resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + ssri@9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + stack-generator@2.0.10: + resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stacktrace-gps@3.1.2: + resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} + + stacktrace-js@2.0.2: + resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + + stats-gl@1.0.5: + resolution: {integrity: sha512-XimMxvwnf1Qf5KwebhcoA34kcX+fWEkIl0QjNkCbu4IpoyDMMsOajExn7FIq5w569k45+LhmsuRlGSrsvmGdNw==} + + stats.js@0.17.0: + resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.4.3: + resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} + + store2@2.14.2: + resolution: {integrity: sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==} + + storybook@7.4.6: + resolution: {integrity: sha512-YkFSpnR47j5zz7yElA+2axLjXN7K7TxDGJRHHlqXmG5iQ0PXzmjrj2RxMDKFz4Ybp/QjEUoJ4rx//ESEY0Nb5A==} + hasBin: true + + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + + stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + + strict-event-emitter-types@2.0.0: + resolution: {integrity: sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + + string.prototype.padend@3.1.4: + resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synchronous-promise@2.0.17: + resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} + + systeminformation@5.22.7: + resolution: {integrity: sha512-AWxlP05KeHbpGdgvZkcudJpsmChc2Y5Eo/GvxG/iUA/Aws5LZKHAMSeAo+V+nD+nxWZaxrwpWcnx4SH3oxNL3A==} + engines: {node: '>=8.0.0'} + os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] + hasBin: true + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + + telejson@7.2.0: + resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} + + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + temp@0.8.4: + resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} + engines: {node: '>=6.0.0'} + + tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + + tempy@1.0.1: + resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} + engines: {node: '>=10'} + + terser@5.19.2: + resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + three-stdlib@2.28.5: + resolution: {integrity: sha512-JdLMhkpT+1ZWeQPyKQNW1zqUwISI2hsUljS6u3vB9lp5EvwsayaAzGnbVeR35895udOF+zxcTiQY3psk+qqlxg==} + peerDependencies: + three: 0.154.0 + + three.meshline@1.4.0: + resolution: {integrity: sha512-A8IsiMrWP8zmHisGDAJ76ZD7t/dOF/oCe/FUKNE6Bu01ZYEx8N6IlU/1Plb2aOZtAuWM2A8s8qS3hvY0OFuvOw==} + + three@0.154.0: + resolution: {integrity: sha512-Uzz8C/5GesJzv8i+Y2prEMYUwodwZySPcNhuJUdsVMH2Yn4Nm8qlbQe6qRN5fOhg55XB0WiLfTPBxVHxpE60ug==} + + throttle-debounce@3.0.1: + resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} + engines: {node: '>=10'} + + throttleit@1.0.0: + resolution: {integrity: sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==} + + through2@0.6.5: + resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + + timm@1.7.1: + resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==} + + tiny-invariant@1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + + tinybench@2.5.1: + resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} + + tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + + tinypool@0.7.0: + resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.0: + resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} + engines: {node: '>=14.0.0'} + + title-case@3.0.3: + resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} + + tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-array@0.1.4: + resolution: {integrity: sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tocbot@4.21.2: + resolution: {integrity: sha512-R5Muhi/TUu4i4snWVrMgNoXyJm2f8sJfdgIkQvqb+cuIXQEIMAiWGWgCgYXHqX4+XiS/Bnm7IYZ9Zy6NVe6lhw==} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + trim-newlines@4.1.1: + resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} + engines: {node: '>=12'} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + + ts-api-utils@1.0.3: + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + ts-easing@0.2.0: + resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} + + tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsx@4.7.0: + resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} + engines: {node: '>=18.0.0'} + hasBin: true + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typed-emitter@1.4.0: + resolution: {integrity: sha512-weBmoo3HhpKGgLBOYwe8EB31CzDFuaK7CCL+axXhUYhn4jo6DSkHnbefboCF5i4DQ2aMFe0C/FdTWcPdObgHyg==} + + typed-emitter@2.1.0: + resolution: {integrity: sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@1.0.37: + resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.3.1: + resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} + + uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + + uint4@0.1.2: + resolution: {integrity: sha512-lhEx78gdTwFWG+mt6cWAZD/R6qrIj0TTBeH5xwyuDJyswLNlGe+KVlUPQ6+mx5Ld332pS0AMUTo9hIly7YsWxQ==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@5.25.4: + resolution: {integrity: sha512-450yJxT29qKMf3aoudzFpIciqpx6Pji3hEWaXqXmanbXF58LTAGCKxcJjxMXWu3iG+Mudgo3ZUfDB6YDFd/dAw==} + engines: {node: '>=14.0'} + + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unidiff@1.0.2: + resolution: {integrity: sha512-2sbEzki5fBmjgAqoafwxRenfMcumMlmVAoJDwYJa3CI4ZVugkdR6qjTw5sVsl29/4JfBBXhWEAd5ars8nRdqXg==} + + unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + + union@0.5.0: + resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} + engines: {node: '>= 0.8.0'} + + unique-filename@2.0.1: + resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + unique-slug@3.0.0: + resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unplugin@1.5.0: + resolution: {integrity: sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + + update-browserslist-db@1.0.11: + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + + upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + use-callback-ref@1.3.0: + resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-deep-compare@1.1.0: + resolution: {integrity: sha512-6yY3zmKNCJ1jjIivfZMZMReZjr8e6iC6Uqtp701jvWJ6ejC/usXD+JjmslZDPJQgX8P4B1Oi5XSLHkOLeYSJsA==} + peerDependencies: + react: ^18.2.0 + + use-resize-observer@9.1.0: + resolution: {integrity: sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==} + peerDependencies: + react: ^18.2.0 + react-dom: 16.8.0 - 18 + + use-sidecar@1.1.2: + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^18.2.0 + + use-typed-event-listener@4.0.2: + resolution: {integrity: sha512-AhjRw+qg5t7OWg7en2Q4XDCdi2iyhALFl71tITL3FeZqt/jD1Qa6KnbH/UolARtID1Gd0IElizbCgolv3ZbUFA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + peerDependencies: + react: ^18.2.0 + typescript: '>=4.1.2' + peerDependenciesMeta: + typescript: + optional: true + + utf8-byte-length@1.0.4: + resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} + + utif@2.0.1: + resolution: {integrity: sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid-1345@1.0.2: + resolution: {integrity: sha512-bA5zYZui+3nwAc0s3VdGQGBfbVsJLVX7Np7ch2aqcEWFi5lsAEcmO3+lx3djM1npgpZI8KY2FITZ2uYTnYUYyw==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-to-istanbul@9.1.3: + resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} + engines: {node: '>=10.12.0'} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + valtio@1.11.2: + resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=16.8' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vec3@0.1.8: + resolution: {integrity: sha512-LfKrP625Bsg/Tj52YdYPsHmpsJuo+tc6fLxZxXjEo9k2xSspKlPvoYTHehykKhp1FvV9nm+XU3Ehej5/9tpDCg==} + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + + vite-node@0.34.6: + resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} + engines: {node: '>=v14.18.0'} + hasBin: true + + vite@4.4.10: + resolution: {integrity: sha512-TzIjiqx9BEXF8yzYdF2NTf1kFFbjMjUSV0LFZ3HyHoI3SGSPLnnFUKiIQtL3gl2AjHvMrprOvQ3amzaHgQlAxw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@4.5.3: + resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@0.34.6: + resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + + watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.5.0: + resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + + webrtc-adapter@8.2.3: + resolution: {integrity: sha512-gnmRz++suzmvxtp3ehQts6s2JtAGPuDPjA1F3a9ckNpG1kYdYuHWYpazoAnL9FS5/B21tKlhkorbdCXat0+4xQ==} + engines: {node: '>=6.0.0', npm: '>=3.10.0'} + + whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + + whatwg-fetch@3.6.18: + resolution: {integrity: sha512-ltN7j66EneWn5TFDO4L9inYC1D+Czsxlrw2SalgjMmEMkLfA5SIZxEFdE6QtHFiiM6Q7WL32c7AkI3w6yxM84Q==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + workbox-background-sync@7.0.0: + resolution: {integrity: sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==} + + workbox-broadcast-update@7.0.0: + resolution: {integrity: sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==} + + workbox-build@7.0.0: + resolution: {integrity: sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==} + engines: {node: '>=16.0.0'} + + workbox-cacheable-response@7.0.0: + resolution: {integrity: sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==} + + workbox-core@7.0.0: + resolution: {integrity: sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==} + + workbox-expiration@7.0.0: + resolution: {integrity: sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==} + + workbox-google-analytics@7.0.0: + resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==} + + workbox-navigation-preload@7.0.0: + resolution: {integrity: sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==} + + workbox-precaching@7.0.0: + resolution: {integrity: sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==} + + workbox-range-requests@7.0.0: + resolution: {integrity: sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==} + + workbox-recipes@7.0.0: + resolution: {integrity: sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==} + + workbox-routing@7.0.0: + resolution: {integrity: sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==} + + workbox-strategies@7.0.0: + resolution: {integrity: sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==} + + workbox-streams@7.0.0: + resolution: {integrity: sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==} + + workbox-sw@7.0.0: + resolution: {integrity: sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==} + + workbox-window@7.0.0: + resolution: {integrity: sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + ws@5.2.3: + resolution: {integrity: sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@6.2.2: + resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xhr@2.6.0: + resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + + xml-parse-from-string@1.0.1: + resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==} + + xml2js@0.4.23: + resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + xmlhttprequest-ssl@1.6.3: + resolution: {integrity: sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==} + engines: {node: '>=0.4.0'} + + xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + xxhash-wasm@0.4.2: + resolution: {integrity: sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.3.2: + resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} + engines: {node: '>= 14'} + + yaml@2.4.1: + resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yeast@0.1.2: + resolution: {integrity: sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==} + + yggdrasil@1.7.0: + resolution: {integrity: sha512-QBIo5fiNd7688G3FqXXYGr36uyrYzczlNuzpWFy2zL3+R+3KT2lF+wFxm51synfA3l3z6IBiGOc1/EVXWCYY1Q==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + zustand@3.6.5: + resolution: {integrity: sha512-/WfLJuXiEJimt61KGMHebrFBwckkCHGhAgVXTgPQHl6IMzjqm6MREb1OnDSnCRiSmRdhgdFCctceg6tSm79hiw==} + engines: {node: '>=12.7.0'} + peerDependencies: + react: ^18.2.0 + peerDependenciesMeta: + react: + optional: true + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@ampproject/remapping@2.2.1': + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + + '@apideck/better-ajv-errors@0.3.6(ajv@8.12.0)': dependencies: ajv: 8.12.0 json-schema: 0.4.0 jsonpointer: 5.0.1 leven: 3.1.0 - dev: false - /@aw-web-design/x-default-browser@1.4.126: - resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} - hasBin: true + '@aw-web-design/x-default-browser@1.4.126': dependencies: default-browser-id: 3.0.0 - dev: true - /@azure/msal-common@14.9.0: - resolution: {integrity: sha512-yzBPRlWPnTBeixxLNI3BBIgF5/bHpbhoRVuuDBnYjCyWRavaPUsKAHUDYLqpGkBLDciA6TCc6GOxN4/S3WiSxg==} - engines: {node: '>=0.8.0'} + '@azure/msal-common@14.9.0': {} - /@azure/msal-node@2.7.0: - resolution: {integrity: sha512-wXD8LkUvHICeSWZydqg6o8Yvv+grlBEcmLGu+QEI4FcwFendbTEZrlSygnAXXSOCVaGAirWLchca35qrgpO6Jw==} - engines: {node: '>=16'} + '@azure/msal-node@2.7.0': dependencies: '@azure/msal-common': 14.9.0 jsonwebtoken: 9.0.2 uuid: 8.3.2 - /@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@7.22.13': dependencies: '@babel/highlight': 7.22.13 chalk: 2.4.2 - /@babel/compat-data@7.22.9: - resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} - engines: {node: '>=6.9.0'} + '@babel/compat-data@7.22.9': {} - /@babel/core@7.22.11: - resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==} - engines: {node: '>=6.9.0'} + '@babel/core@7.22.11': dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.13 @@ -489,30 +8690,22 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.22.10: - resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} - engines: {node: '>=6.9.0'} + '@babel/generator@7.22.10': dependencies: '@babel/types': 7.22.11 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} - engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.22.5': dependencies: '@babel/types': 7.22.11 - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.10: - resolution: {integrity: sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.10': dependencies: '@babel/types': 7.22.11 - /@babel/helper-compilation-targets@7.22.10: - resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} - engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.22.10': dependencies: '@babel/compat-data': 7.22.9 '@babel/helper-validator-option': 7.22.5 @@ -520,11 +8713,7 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-create-class-features-plugin@7.22.11(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.22.5 @@ -537,11 +8726,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.22.5 @@ -553,23 +8738,15 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 - dev: true - /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.22.11): - resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 - /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.11): - resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-compilation-targets': 7.22.10 @@ -580,59 +8757,36 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: true + '@babel/helper-environment-visitor@7.22.20': {} - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} - engines: {node: '>=6.9.0'} + '@babel/helper-environment-visitor@7.22.5': {} - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-function-name@7.22.5': dependencies: '@babel/template': 7.22.5 '@babel/types': 7.22.11 - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} + '@babel/helper-hoist-variables@7.22.5': dependencies: '@babel/types': 7.22.11 - /@babel/helper-member-expression-to-functions@7.22.5: - resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.22.5': dependencies: '@babel/types': 7.22.11 - /@babel/helper-member-expression-to-functions@7.23.0: - resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} - engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.23.0': dependencies: '@babel/types': 7.23.0 - dev: true - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.22.15': dependencies: '@babel/types': 7.23.0 - dev: true - /@babel/helper-module-imports@7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.22.5': dependencies: '@babel/types': 7.22.11 - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-environment-visitor': 7.22.5 @@ -641,11 +8795,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.5 - /@babel/helper-module-transforms@7.23.0(@babel/core@7.22.11): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.23.0(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-environment-visitor': 7.22.20 @@ -653,91 +8803,56 @@ packages: '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 - dev: true - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} - engines: {node: '>=6.9.0'} + '@babel/helper-optimise-call-expression@7.22.5': dependencies: '@babel/types': 7.22.11 - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.22.5': {} - /@babel/helper-remap-async-to-generator@7.22.9(@babel/core@7.22.11): - resolution: {integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-remap-async-to-generator@7.22.9(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-wrap-function': 7.22.10 - /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.11): - resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-replace-supers@7.22.9(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-member-expression-to-functions': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.22.5': dependencies: '@babel/types': 7.22.11 - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} - engines: {node: '>=6.9.0'} + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': dependencies: '@babel/types': 7.22.11 - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} + '@babel/helper-split-export-declaration@7.22.6': dependencies: '@babel/types': 7.22.11 - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.22.5': {} - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: true + '@babel/helper-validator-identifier@7.22.20': {} - /@babel/helper-validator-identifier@7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.22.5': {} - /@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} - engines: {node: '>=6.9.0'} - dev: true + '@babel/helper-validator-option@7.22.15': {} - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.22.5': {} - /@babel/helper-wrap-function@7.22.10: - resolution: {integrity: sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-wrap-function@7.22.10': dependencies: '@babel/helper-function-name': 7.22.5 '@babel/template': 7.22.5 '@babel/types': 7.22.11 - /@babel/helpers@7.22.11: - resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} - engines: {node: '>=6.9.0'} + '@babel/helpers@7.22.11': dependencies: '@babel/template': 7.22.5 '@babel/traverse': 7.22.11 @@ -745,281 +8860,163 @@ packages: transitivePeerDependencies: - supports-color - /@babel/highlight@7.22.13: - resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} - engines: {node: '>=6.9.0'} + '@babel/highlight@7.22.13': dependencies: '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.22.13: - resolution: {integrity: sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/parser@7.22.13': dependencies: '@babel/types': 7.22.11 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-optional-chaining': 7.22.12(@babel/core@7.22.11) - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.11): - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.11): - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) - dev: true - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.11): - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) - dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.11): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.11): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.11): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.11): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.11): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.11): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.11): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.11): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.11): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.11): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.11)': + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.11)': + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-async-generator-functions@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-async-generator-functions@7.22.11(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-environment-visitor': 7.22.5 @@ -1027,61 +9024,37 @@ packages: '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.11) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11) - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-module-imports': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.11) - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-block-scoping@7.22.10(@babel/core@7.22.11): - resolution: {integrity: sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-block-scoping@7.22.10(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 + '@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.11) - /@babel/plugin-transform-classes@7.22.6(@babel/core@7.22.11): - resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-classes@7.22.6(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.22.5 @@ -1094,181 +9067,107 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.5 - /@babel/plugin-transform-destructuring@7.22.10(@babel/core@7.22.11): - resolution: {integrity: sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-destructuring@7.22.10(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.11) - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.11) - /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-compilation-targets': 7.22.10 '@babel/helper-function-name': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.11) - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.11) - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-commonjs@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-commonjs@7.22.11(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 - /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.22.11): - resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 - dev: true - /@babel/plugin-transform-modules-systemjs@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-systemjs@7.22.11(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-hoist-variables': 7.22.5 @@ -1276,60 +9175,36 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) - /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11) - /@babel/plugin-transform-object-rest-spread@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-object-rest-spread@7.22.11(@babel/core@7.22.11)': dependencies: '@babel/compat-data': 7.22.9 '@babel/core': 7.22.11 @@ -1338,61 +9213,37 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11) '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.11) - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.11) - /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.11) - /@babel/plugin-transform-optional-chaining@7.22.12(@babel/core@7.22.11): - resolution: {integrity: sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-optional-chaining@7.22.12(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) - /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.22.11): - resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.22.5 @@ -1400,157 +9251,90 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.11) - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.22.11): - resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.22.15(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.11) - dev: true - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.22.11): - resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.11): - resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) '@babel/helper-plugin-utils': 7.22.5 - /@babel/preset-env@7.22.10(@babel/core@7.22.11): - resolution: {integrity: sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-env@7.22.10(@babel/core@7.22.11)': dependencies: '@babel/compat-data': 7.22.9 '@babel/core': 7.22.11 @@ -1636,33 +9420,21 @@ packages: transitivePeerDependencies: - supports-color - /@babel/preset-flow@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-flow@7.22.15(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.15 '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.11) - dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.22.11): - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 '@babel/types': 7.22.11 esutils: 2.0.3 - /@babel/preset-typescript@7.23.0(@babel/core@7.22.11): - resolution: {integrity: sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/preset-typescript@7.23.0(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 '@babel/helper-plugin-utils': 7.22.5 @@ -1670,13 +9442,8 @@ packages: '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.22.11) '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.22.11) - dev: true - /@babel/register@7.22.15(@babel/core@7.22.11): - resolution: {integrity: sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/register@7.22.15(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 clone-deep: 4.0.1 @@ -1684,28 +9451,20 @@ packages: make-dir: 2.1.0 pirates: 4.0.6 source-map-support: 0.5.21 - dev: true - /@babel/regjsgen@0.8.0: - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + '@babel/regjsgen@0.8.0': {} - /@babel/runtime@7.22.11: - resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} - engines: {node: '>=6.9.0'} + '@babel/runtime@7.22.11': dependencies: regenerator-runtime: 0.14.0 - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} - engines: {node: '>=6.9.0'} + '@babel/template@7.22.5': dependencies: '@babel/code-frame': 7.22.13 '@babel/parser': 7.22.13 '@babel/types': 7.22.11 - /@babel/traverse@7.22.11: - resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} - engines: {node: '>=6.9.0'} + '@babel/traverse@7.22.11': dependencies: '@babel/code-frame': 7.22.13 '@babel/generator': 7.22.10 @@ -1720,88 +9479,44 @@ packages: transitivePeerDependencies: - supports-color - /@babel/types@7.22.11: - resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} - engines: {node: '>=6.9.0'} + '@babel/types@7.22.11': dependencies: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 - /@babel/types@7.23.0: - resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} - engines: {node: '>=6.9.0'} + '@babel/types@7.23.0': dependencies: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - dev: true - /@base2/pretty-print-object@1.0.1: - resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} - dev: true + '@base2/pretty-print-object@1.0.1': {} - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true + '@bcoe/v8-coverage@0.2.3': {} - /@cbor-extract/cbor-extract-darwin-arm64@2.2.0: - resolution: {integrity: sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@cbor-extract/cbor-extract-darwin-arm64@2.2.0': optional: true - /@cbor-extract/cbor-extract-darwin-x64@2.2.0: - resolution: {integrity: sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@cbor-extract/cbor-extract-darwin-x64@2.2.0': optional: true - /@cbor-extract/cbor-extract-linux-arm64@2.2.0: - resolution: {integrity: sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@cbor-extract/cbor-extract-linux-arm64@2.2.0': optional: true - /@cbor-extract/cbor-extract-linux-arm@2.2.0: - resolution: {integrity: sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false + '@cbor-extract/cbor-extract-linux-arm@2.2.0': optional: true - /@cbor-extract/cbor-extract-linux-x64@2.2.0: - resolution: {integrity: sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@cbor-extract/cbor-extract-linux-x64@2.2.0': optional: true - /@cbor-extract/cbor-extract-win32-x64@2.2.0: - resolution: {integrity: sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@cbor-extract/cbor-extract-win32-x64@2.2.0': optional: true - /@colors/colors@1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - requiresBuild: true + '@colors/colors@1.5.0': optional: true - /@cypress/request@2.88.12: - resolution: {integrity: sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==} - engines: {node: '>= 6'} + '@cypress/request@2.88.12': dependencies: aws-sign2: 0.7.0 aws4: 1.12.0 @@ -1822,28 +9537,24 @@ packages: tunnel-agent: 0.6.0 uuid: 8.3.2 - /@cypress/xvfb@1.2.4(supports-color@8.1.1): - resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} + '@cypress/xvfb@1.2.4(supports-color@8.1.1)': dependencies: debug: 3.2.7(supports-color@8.1.1) lodash.once: 4.1.1 transitivePeerDependencies: - supports-color - /@dimaka/interface@0.0.3-alpha.0(@babel/core@7.22.11)(@popperjs/core@2.11.8)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-BzRUaLk+jhC1uvcix4SXRGhw7k39pldlvwtRT0NGFsuQt1uMV9vOhGMzm3rLorVXQ7vAmqcZk3Hy8oYlXKQoDw==} - peerDependencies: - react: ^18.2.0 + '@dimaka/interface@0.0.3-alpha.0(@babel/core@7.22.11)(@popperjs/core@2.11.8)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@emotion/css': 11.5.0(@babel/core@7.22.11) '@juggle/resize-observer': 3.3.1 animejs: 3.2.1 clsx: 1.1.1 react: 18.2.0 - react-popper: 2.3.0(@popperjs/core@2.11.8)(react-dom@18.2.0)(react@18.2.0) - react-portal: 4.2.1(react-dom@18.2.0)(react@18.2.0) - react-use: 17.3.1(react-dom@18.2.0)(react@18.2.0) - react-use-measure: 2.1.1(react-dom@18.2.0)(react@18.2.0) + react-popper: 2.3.0(@popperjs/core@2.11.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-portal: 4.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-use: 17.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-use-measure: 2.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) valtio: 1.11.2(@types/react@18.2.20)(react@18.2.0) zustand: 3.6.5(react@18.2.0) transitivePeerDependencies: @@ -1851,15 +9562,10 @@ packages: - '@popperjs/core' - '@types/react' - react-dom - dev: false - /@discoveryjs/json-ext@0.5.7: - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - dev: true + '@discoveryjs/json-ext@0.5.7': {} - /@emotion/babel-plugin@11.11.0: - resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + '@emotion/babel-plugin@11.11.0': dependencies: '@babel/helper-module-imports': 7.22.5 '@babel/runtime': 7.22.11 @@ -1872,675 +9578,258 @@ packages: find-root: 1.1.0 source-map: 0.5.7 stylis: 4.2.0 - dev: false - /@emotion/cache@11.11.0: - resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + '@emotion/cache@11.11.0': dependencies: '@emotion/memoize': 0.8.1 '@emotion/sheet': 1.2.2 '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 stylis: 4.2.0 - dev: false - /@emotion/css@11.5.0(@babel/core@7.22.11): - resolution: {integrity: sha512-mqjz/3aqR9rp40M+pvwdKYWxlQK4Nj3cnNjo3Tx6SM14dSsEn7q/4W2/I7PlgG+mb27iITHugXuBIHH/QwUBVQ==} - peerDependencies: - '@babel/core': ^7.0.0 - peerDependenciesMeta: - '@babel/core': - optional: true + '@emotion/css@11.5.0(@babel/core@7.22.11)': dependencies: - '@babel/core': 7.22.11 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.2 '@emotion/sheet': 1.2.2 '@emotion/utils': 1.2.1 - dev: false + optionalDependencies: + '@babel/core': 7.22.11 - /@emotion/hash@0.9.1: - resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} - dev: false + '@emotion/hash@0.9.1': {} - /@emotion/memoize@0.8.1: - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - dev: false + '@emotion/memoize@0.8.1': {} - /@emotion/serialize@1.1.2: - resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==} + '@emotion/serialize@1.1.2': dependencies: '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/unitless': 0.8.1 '@emotion/utils': 1.2.1 csstype: 3.1.2 - dev: false - /@emotion/sheet@1.2.2: - resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} - dev: false + '@emotion/sheet@1.2.2': {} - /@emotion/unitless@0.8.1: - resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - dev: false + '@emotion/unitless@0.8.1': {} - /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): - resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} - peerDependencies: - react: ^18.2.0 + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0)': dependencies: react: 18.2.0 - dev: true - - /@emotion/utils@1.2.1: - resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} - dev: false - - /@emotion/weak-memoize@0.3.1: - resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} - dev: false - - /@esbuild/aix-ppc64@0.19.11: - resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: false - optional: true - - /@esbuild/android-arm64@0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - optional: true - - /@esbuild/android-arm64@0.19.11: - resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@esbuild/android-arm64@0.19.3: - resolution: {integrity: sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@esbuild/android-arm@0.18.20: - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - optional: true - - /@esbuild/android-arm@0.19.11: - resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@esbuild/android-arm@0.19.3: - resolution: {integrity: sha512-Lemgw4io4VZl9GHJmjiBGzQ7ONXRfRPHcUEerndjwiSkbxzrpq0Uggku5MxxrXdwJ+pTj1qyw4jwTu7hkPsgIA==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@esbuild/android-x64@0.18.20: - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - optional: true - - /@esbuild/android-x64@0.19.11: - resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@esbuild/android-x64@0.19.3: - resolution: {integrity: sha512-FKQJKkK5MXcBHoNZMDNUAg1+WcZlV/cuXrWCoGF/TvdRiYS4znA0m5Il5idUwfxrE20bG/vU1Cr5e1AD6IEIjQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@esbuild/darwin-arm64@0.18.20: - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - optional: true - - /@esbuild/darwin-arm64@0.19.11: - resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@esbuild/darwin-arm64@0.19.3: - resolution: {integrity: sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@esbuild/darwin-x64@0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - optional: true - - /@esbuild/darwin-x64@0.19.11: - resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@esbuild/darwin-x64@0.19.3: - resolution: {integrity: sha512-tPfZiwF9rO0jW6Jh9ipi58N5ZLoSjdxXeSrAYypy4psA2Yl1dAMhM71KxVfmjZhJmxRjSnb29YlRXXhh3GqzYw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@esbuild/freebsd-arm64@0.18.20: - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - optional: true - - /@esbuild/freebsd-arm64@0.19.11: - resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/freebsd-arm64@0.19.3: - resolution: {integrity: sha512-ERDyjOgYeKe0Vrlr1iLrqTByB026YLPzTytDTz1DRCYM+JI92Dw2dbpRHYmdqn6VBnQ9Bor6J8ZlNwdZdxjlSg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/freebsd-x64@0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - optional: true - - /@esbuild/freebsd-x64@0.19.11: - resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/freebsd-x64@0.19.3: - resolution: {integrity: sha512-nXesBZ2Ad1qL+Rm3crN7NmEVJ5uvfLFPLJev3x1j3feCQXfAhoYrojC681RhpdOph8NsvKBBwpYZHR7W0ifTTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-arm64@0.18.20: - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-arm64@0.19.11: - resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-arm64@0.19.3: - resolution: {integrity: sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-arm@0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-arm@0.19.11: - resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-arm@0.19.3: - resolution: {integrity: sha512-zr48Cg/8zkzZCzDHNxXO/89bf9e+r4HtzNUPoz4GmgAkF1gFAFmfgOdCbR8zMbzFDGb1FqBBhdXUpcTQRYS1cQ==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-ia32@0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-ia32@0.19.11: - resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-ia32@0.19.3: - resolution: {integrity: sha512-7XlCKCA0nWcbvYpusARWkFjRQNWNGlt45S+Q18UeS///K6Aw8bB2FKYe9mhVWy/XLShvCweOLZPrnMswIaDXQA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-loong64@0.19.11: - resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-loong64@0.19.3: - resolution: {integrity: sha512-qGTgjweER5xqweiWtUIDl9OKz338EQqCwbS9c2Bh5jgEH19xQ1yhgGPNesugmDFq+UUSDtWgZ264st26b3de8A==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-mips64el@0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-mips64el@0.19.11: - resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-mips64el@0.19.3: - resolution: {integrity: sha512-gy1bFskwEyxVMFRNYSvBauDIWNggD6pyxUksc0MV9UOBD138dKTzr8XnM2R4mBsHwVzeuIH8X5JhmNs2Pzrx+A==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-ppc64@0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-ppc64@0.19.11: - resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-ppc64@0.19.3: - resolution: {integrity: sha512-UrYLFu62x1MmmIe85rpR3qou92wB9lEXluwMB/STDzPF9k8mi/9UvNsG07Tt9AqwPQXluMQ6bZbTzYt01+Ue5g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-riscv64@0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-riscv64@0.19.11: - resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-riscv64@0.19.3: - resolution: {integrity: sha512-9E73TfyMCbE+1AwFOg3glnzZ5fBAFK4aawssvuMgCRqCYzE0ylVxxzjEfut8xjmKkR320BEoMui4o/t9KA96gA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-s390x@0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-s390x@0.19.11: - resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-s390x@0.19.3: - resolution: {integrity: sha512-LlmsbuBdm1/D66TJ3HW6URY8wO6IlYHf+ChOUz8SUAjVTuaisfuwCOAgcxo3Zsu3BZGxmI7yt//yGOxV+lHcEA==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-x64@0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-x64@0.19.11: - resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-x64@0.19.3: - resolution: {integrity: sha512-ogV0+GwEmvwg/8ZbsyfkYGaLACBQWDvO0Kkh8LKBGKj9Ru8VM39zssrnu9Sxn1wbapA2qNS6BiLdwJZGouyCwQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/netbsd-x64@0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - optional: true - - /@esbuild/netbsd-x64@0.19.11: - resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/netbsd-x64@0.19.3: - resolution: {integrity: sha512-o1jLNe4uzQv2DKXMlmEzf66Wd8MoIhLNO2nlQBHLtWyh2MitDG7sMpfCO3NTcoTMuqHjfufgUQDFRI5C+xsXQw==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/openbsd-x64@0.18.20: - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - optional: true - - /@esbuild/openbsd-x64@0.19.11: - resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/openbsd-x64@0.19.3: - resolution: {integrity: sha512-AZJCnr5CZgZOdhouLcfRdnk9Zv6HbaBxjcyhq0StNcvAdVZJSKIdOiPB9az2zc06ywl0ePYJz60CjdKsQacp5Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/sunos-x64@0.18.20: - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - optional: true - - /@esbuild/sunos-x64@0.19.11: - resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: false - optional: true - - /@esbuild/sunos-x64@0.19.3: - resolution: {integrity: sha512-Acsujgeqg9InR4glTRvLKGZ+1HMtDm94ehTIHKhJjFpgVzZG9/pIcWW/HA/DoMfEyXmANLDuDZ2sNrWcjq1lxw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-arm64@0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - optional: true - - /@esbuild/win32-arm64@0.19.11: - resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-arm64@0.19.3: - resolution: {integrity: sha512-FSrAfjVVy7TifFgYgliiJOyYynhQmqgPj15pzLyJk8BUsnlWNwP/IAy6GAiB1LqtoivowRgidZsfpoYLZH586A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-ia32@0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - optional: true - - /@esbuild/win32-ia32@0.19.11: - resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-ia32@0.19.3: - resolution: {integrity: sha512-xTScXYi12xLOWZ/sc5RBmMN99BcXp/eEf7scUC0oeiRoiT5Vvo9AycuqCp+xdpDyAU+LkrCqEpUS9fCSZF8J3Q==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-x64@0.18.20: - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - optional: true - - /@esbuild/win32-x64@0.19.11: - resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-x64@0.19.3: - resolution: {integrity: sha512-FbUN+0ZRXsypPyWE2IwIkVjDkDnJoMJARWOcFZn4KPPli+QnKqF0z1anvfaYe3ev5HFCpRDLLBDHyOALLppWHw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@emotion/utils@1.2.1': {} + + '@emotion/weak-memoize@0.3.1': {} + + '@esbuild/aix-ppc64@0.19.11': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.19.11': + optional: true + + '@esbuild/android-arm64@0.19.3': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.19.11': + optional: true + + '@esbuild/android-arm@0.19.3': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.19.11': + optional: true + + '@esbuild/android-x64@0.19.3': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.19.11': + optional: true + + '@esbuild/darwin-arm64@0.19.3': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.19.11': + optional: true + + '@esbuild/darwin-x64@0.19.3': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.19.11': + optional: true + + '@esbuild/freebsd-arm64@0.19.3': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.19.11': + optional: true + + '@esbuild/freebsd-x64@0.19.3': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.19.11': + optional: true + + '@esbuild/linux-arm64@0.19.3': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.19.11': + optional: true + + '@esbuild/linux-arm@0.19.3': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.19.11': + optional: true + + '@esbuild/linux-ia32@0.19.3': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.19.11': + optional: true + + '@esbuild/linux-loong64@0.19.3': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.19.11': + optional: true + + '@esbuild/linux-mips64el@0.19.3': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.19.11': + optional: true + + '@esbuild/linux-ppc64@0.19.3': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.19.11': + optional: true + + '@esbuild/linux-riscv64@0.19.3': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.19.11': + optional: true + + '@esbuild/linux-s390x@0.19.3': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.19.11': + optional: true + + '@esbuild/linux-x64@0.19.3': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.19.11': + optional: true + + '@esbuild/netbsd-x64@0.19.3': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.19.11': + optional: true + + '@esbuild/openbsd-x64@0.19.3': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.19.11': + optional: true + + '@esbuild/sunos-x64@0.19.3': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.19.11': + optional: true + + '@esbuild/win32-arm64@0.19.3': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.19.11': + optional: true + + '@esbuild/win32-ia32@0.19.3': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.19.11': + optional: true + + '@esbuild/win32-x64@0.19.3': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.50.0)': dependencies: eslint: 8.50.0 eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.8.0: - resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true + '@eslint-community/regexpp@4.8.0': {} - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@2.1.2': dependencies: ajv: 6.12.6 debug: 4.3.4(supports-color@8.1.1) @@ -2553,127 +9842,79 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - /@eslint/js@8.50.0: - resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + '@eslint/js@8.50.0': {} - /@fal-works/esbuild-plugin-global-externals@2.1.2: - resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} - dev: true + '@fal-works/esbuild-plugin-global-externals@2.1.2': {} - /@fastify/busboy@2.0.0: - resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} - engines: {node: '>=14'} - dev: true + '@fastify/busboy@2.0.0': {} - /@floating-ui/core@1.5.0: - resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==} + '@floating-ui/core@1.5.0': dependencies: '@floating-ui/utils': 0.1.6 - /@floating-ui/dom@1.5.3: - resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} + '@floating-ui/dom@1.5.3': dependencies: '@floating-ui/core': 1.5.0 '@floating-ui/utils': 0.1.6 - /@floating-ui/react-dom@2.0.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==} - peerDependencies: - react: ^18.2.0 - react-dom: '>=16.8.0' + '@floating-ui/react-dom@2.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@floating-ui/dom': 1.5.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@floating-ui/react@0.26.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-5gyJIJ2tZOPMgmZ/vEcVhdmQiy75b7LPO71sYIiDsxGcZ4hxLuygQWCuT0YXHqppt//Eese+L6t5KnX/gZ3tVA==} - peerDependencies: - react: ^18.2.0 - react-dom: '>=16.8.0' + '@floating-ui/react@0.26.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@floating-ui/utils': 0.1.6 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tabbable: 6.2.0 - dev: false - /@floating-ui/utils@0.1.6: - resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} + '@floating-ui/utils@0.1.6': {} - /@gar/promisify@1.1.3: - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - requiresBuild: true - dev: false + '@gar/promisify@1.1.3': optional: true - /@humanwhocodes/config-array@0.11.11: - resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} - engines: {node: '>=10.10.0'} + '@humanwhocodes/config-array@0.11.11': dependencies: '@humanwhocodes/object-schema': 1.2.1 debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true + '@humanwhocodes/module-importer@1.0.1': {} - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true + '@humanwhocodes/object-schema@1.2.1': {} - /@iconify/types@2.0.0: - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - dev: false + '@iconify/types@2.0.0': {} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 find-up: 4.1.0 get-package-type: 0.1.0 js-yaml: 3.14.1 resolve-from: 5.0.0 - dev: true - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true + '@istanbuljs/schema@0.1.3': {} - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 - dev: true - /@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/transform@29.7.0': dependencies: '@babel/core': 7.22.11 '@jest/types': 29.6.3 @@ -2692,11 +9933,8 @@ packages: write-file-atomic: 4.0.2 transitivePeerDependencies: - supports-color - dev: true - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@29.6.3': dependencies: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 @@ -2704,22 +9942,16 @@ packages: '@types/node': 20.8.0 '@types/yargs': 17.0.28 chalk: 4.1.2 - dev: true - /@jimp/bmp@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-keMOc5woiDmONXsB/6aXLR4Z5Q+v8lFq3EY2rcj2FmstbDMhRuGbmcBxlEgOqfRjwvtf/wOtJ3Of37oAWtVfLg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/bmp@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 bmp-js: 0.1.0 core-js: 3.32.1 - dev: false - /@jimp/core@0.10.3: - resolution: {integrity: sha512-Gd5IpL3U2bFIO57Fh/OA3HCpWm4uW/pU01E75rI03BXfTdz3T+J7TwvyG1XaqsQ7/DSlS99GXtLQPlfFIe28UA==} + '@jimp/core@0.10.3': dependencies: '@babel/runtime': 7.22.11 '@jimp/utils': 0.10.3 @@ -2733,225 +9965,143 @@ packages: phin: 2.9.3 pixelmatch: 4.0.2 tinycolor2: 1.6.0 - dev: false - /@jimp/custom@0.10.3: - resolution: {integrity: sha512-nZmSI+jwTi5IRyNLbKSXQovoeqsw+D0Jn0SxW08wYQvdkiWA8bTlDQFgQ7HVwCAKBm8oKkDB/ZEo9qvHJ+1gAQ==} + '@jimp/custom@0.10.3': dependencies: '@babel/runtime': 7.22.11 '@jimp/core': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/gif@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-vjlRodSfz1CrUvvrnUuD/DsLK1GHB/yDZXHthVdZu23zYJIW7/WrIiD1IgQ5wOMV7NocfrvPn2iqUfBP81/WWA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/gif@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 omggif: 1.0.10 - dev: false - /@jimp/jpeg@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-AAANwgUZOt6f6P7LZxY9lyJ9xclqutYJlsxt3JbriXUGJgrrFAIkcKcqv1nObgmQASSAQKYaMV9KdHjMlWFKlQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/jpeg@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 jpeg-js: 0.3.7 - dev: false - /@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-5zlKlCfx4JWw9qUVC7GI4DzXyxDWyFvgZLaoGFoT00mlXlN75SarlDwc9iZ/2e2kp4bJWxz3cGgG4G/WXrbg3Q==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-blur@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-cTOK3rjh1Yjh23jSfA6EHCHjsPJDEGLC8K2y9gM7dnTUK1y9NNmkFS23uHpyjgsWFIoH9oRh2SpEs3INjCpZhQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blur@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-circle@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-51GAPIVelqAcfuUpaM5JWJ0iWl4vEjNXB7p4P7SX5udugK5bxXUjO6KA2qgWmdpHuCKtoNgkzWU9fNSuYp7tCA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/plugin-circle@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-color@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-RgeHUElmlTH7vpI4WyQrz6u59spiKfVQbsG/XUzfWGamFSixa24ZDwX/yV/Ts+eNaz7pZeIuv533qmKPvw2ujg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/plugin-color@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 tinycolor2: 1.6.0 - dev: false - /@jimp/plugin-contain@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3)(@jimp/plugin-resize@0.10.3)(@jimp/plugin-scale@0.10.3): - resolution: {integrity: sha512-bYJKW9dqzcB0Ihc6u7jSyKa3juStzbLs2LFr6fu8TzA2WkMS/R8h+ddkiO36+F9ILTWHP0CIA3HFe5OdOGcigw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-blit': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' - '@jimp/plugin-scale': '>=0.3.5' + '@jimp/plugin-contain@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)))': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/plugin-blit': 0.10.3(@jimp/custom@0.10.3) '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3) - '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3) + '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)) '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-cover@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-crop@0.10.3)(@jimp/plugin-resize@0.10.3)(@jimp/plugin-scale@0.10.3): - resolution: {integrity: sha512-pOxu0cM0BRPzdV468n4dMocJXoMbTnARDY/EpC3ZW15SpMuc/dr1KhWQHgoQX5kVW1Wt8zgqREAJJCQ5KuPKDA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-crop': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' - '@jimp/plugin-scale': '>=0.3.5' + '@jimp/plugin-cover@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)))': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/plugin-crop': 0.10.3(@jimp/custom@0.10.3) '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3) - '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3) + '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)) '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-nB7HgOjjl9PgdHr076xZ3Sr6qHYzeBYBs9qvs3tfEEUeYMNnvzgCCGtUl6eMakazZFCMk3mhKmcB9zQuHFOvkg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-displace@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-8t3fVKCH5IVqI4lewe4lFFjpxxr69SQCz5/tlpDLQZsrNScNJivHdQ09zljTrVTCSgeCqQJIKgH2Q7Sk/pAZ0w==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/plugin-displace@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-dither@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-JCX/oNSnEg1kGQ8ffZ66bEgQOLCY3Rn+lrd6v1jjLy/mn9YVZTMsxLtGCXpiCDC2wG/KTmi4862ysmP9do9dAQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/plugin-dither@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-fisheye@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-RRZb1wqe+xdocGcFtj2xHU7sF7xmEZmIa6BmrfSchjyA2b32TGPWKnP3qyj7p6LWEsXn+19hRYbjfyzyebPElQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/plugin-fisheye@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-flip@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-rotate@0.10.3): - resolution: {integrity: sha512-0epbi8XEzp0wmSjoW9IB0iMu0yNF17aZOxLdURCN3Zr+8nWPs5VNIMqSVa1Y62GSyiMDpVpKF/ITiXre+EqrPg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-rotate': '>=0.3.5' + '@jimp/plugin-flip@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-rotate@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)))': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 - '@jimp/plugin-rotate': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3)(@jimp/plugin-crop@0.10.3)(@jimp/plugin-resize@0.10.3) + '@jimp/plugin-rotate': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)) '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-gaussian@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-25eHlFbHUDnMMGpgRBBeQ2AMI4wsqCg46sue0KklI+c2BaZ+dGXmJA5uT8RTOrt64/K9Wz5E+2n7eBnny4dfpQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/plugin-gaussian@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-invert@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-effYSApWY/FbtlzqsKXlTLkgloKUiHBKjkQnqh5RL4oQxh/33j6aX+HFdDyQKtsXb8CMd4xd7wyiD2YYabTa0g==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/plugin-invert@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-mask@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-twrg8q8TIhM9Z6Jcu9/5f+OCAPaECb0eKrrbbIajJqJ3bCUlj5zbfgIhiQIzjPJ6KjpnFPSqHQfHkU1Vvk/nVw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/plugin-mask@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-normalize@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-xkb5eZI/mMlbwKkDN79+1/t/+DBo8bBXZUMsT4gkFgMRKNRZ6NQPxlv1d3QpRzlocsl6UMxrHnhgnXdLAcgrXw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/plugin-normalize@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-print@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3): - resolution: {integrity: sha512-wjRiI6yjXsAgMe6kVjizP+RgleUCLkH256dskjoNvJzmzbEfO7xQw9g6M02VET+emnbY0CO83IkrGm2q43VRyg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-blit': '>=0.3.5' + '@jimp/plugin-print@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 @@ -2959,26 +10109,15 @@ packages: '@jimp/utils': 0.10.3 core-js: 3.32.1 load-bmfont: 1.4.1 - dev: false - /@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-rf8YmEB1d7Sg+g4LpqF0Mp+dfXfb6JFJkwlAIWPUOR7lGsPWALavEwTW91c0etEdnp0+JB9AFpy6zqq7Lwkq6w==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-rotate@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3)(@jimp/plugin-crop@0.10.3)(@jimp/plugin-resize@0.10.3): - resolution: {integrity: sha512-YXLlRjm18fkW9MOHUaVAxWjvgZM851ofOipytz5FyKp4KZWDLk+dZK1JNmVmK7MyVmAzZ5jsgSLhIgj+GgN0Eg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-blit': '>=0.3.5' - '@jimp/plugin-crop': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' + '@jimp/plugin-rotate@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 @@ -2987,27 +10126,16 @@ packages: '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3) '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3): - resolution: {integrity: sha512-5DXD7x7WVcX1gUgnlFXQa8F+Q3ThRYwJm+aesgrYvDOY+xzRoRSdQvhmdd4JEEue3lyX44DvBSgCIHPtGcEPaw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' + '@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3) '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-shadow@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blur@0.10.3)(@jimp/plugin-resize@0.10.3): - resolution: {integrity: sha512-/nkFXpt2zVcdP4ETdkAUL0fSzyrC5ZFxdcphbYBodqD7fXNqChS/Un1eD4xCXWEpW8cnG9dixZgQgStjywH0Mg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-blur': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' + '@jimp/plugin-shadow@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blur@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 @@ -3015,14 +10143,8 @@ packages: '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3) '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugin-threshold@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-color@0.10.3)(@jimp/plugin-resize@0.10.3): - resolution: {integrity: sha512-Dzh0Yq2wXP2SOnxcbbiyA4LJ2luwrdf1MghNIt9H+NX7B+IWw/N8qA2GuSm9n4BPGSLluuhdAWJqHcTiREriVA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-color': '>=0.8.0' - '@jimp/plugin-resize': '>=0.8.0' + '@jimp/plugin-threshold@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-color@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 @@ -3030,12 +10152,8 @@ packages: '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3) '@jimp/utils': 0.10.3 core-js: 3.32.1 - dev: false - /@jimp/plugins@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-jTT3/7hOScf0EIKiAXmxwayHhryhc1wWuIe3FrchjDjr9wgIGNN2a7XwCgPl3fML17DXK1x8EzDneCdh261bkw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/plugins@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 @@ -3043,54 +10161,42 @@ packages: '@jimp/plugin-blur': 0.10.3(@jimp/custom@0.10.3) '@jimp/plugin-circle': 0.10.3(@jimp/custom@0.10.3) '@jimp/plugin-color': 0.10.3(@jimp/custom@0.10.3) - '@jimp/plugin-contain': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3)(@jimp/plugin-resize@0.10.3)(@jimp/plugin-scale@0.10.3) - '@jimp/plugin-cover': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-crop@0.10.3)(@jimp/plugin-resize@0.10.3)(@jimp/plugin-scale@0.10.3) + '@jimp/plugin-contain': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))) + '@jimp/plugin-cover': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))) '@jimp/plugin-crop': 0.10.3(@jimp/custom@0.10.3) '@jimp/plugin-displace': 0.10.3(@jimp/custom@0.10.3) '@jimp/plugin-dither': 0.10.3(@jimp/custom@0.10.3) '@jimp/plugin-fisheye': 0.10.3(@jimp/custom@0.10.3) - '@jimp/plugin-flip': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-rotate@0.10.3) + '@jimp/plugin-flip': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-rotate@0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3))) '@jimp/plugin-gaussian': 0.10.3(@jimp/custom@0.10.3) '@jimp/plugin-invert': 0.10.3(@jimp/custom@0.10.3) '@jimp/plugin-mask': 0.10.3(@jimp/custom@0.10.3) '@jimp/plugin-normalize': 0.10.3(@jimp/custom@0.10.3) - '@jimp/plugin-print': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3) + '@jimp/plugin-print': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3)) '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3) - '@jimp/plugin-rotate': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3)(@jimp/plugin-crop@0.10.3)(@jimp/plugin-resize@0.10.3) - '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3) - '@jimp/plugin-shadow': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blur@0.10.3)(@jimp/plugin-resize@0.10.3) - '@jimp/plugin-threshold': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-color@0.10.3)(@jimp/plugin-resize@0.10.3) + '@jimp/plugin-rotate': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)) + '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)) + '@jimp/plugin-shadow': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-blur@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)) + '@jimp/plugin-threshold': 0.10.3(@jimp/custom@0.10.3)(@jimp/plugin-color@0.10.3(@jimp/custom@0.10.3))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3)) core-js: 3.32.1 timm: 1.7.1 - dev: false - /@jimp/png@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-YKqk/dkl+nGZxSYIDQrqhmaP8tC3IK8H7dFPnnzFVvbhDnyYunqBZZO3SaZUKTichClRw8k/CjBhbc+hifSGWg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/png@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 '@jimp/utils': 0.10.3 core-js: 3.32.1 pngjs: 3.4.0 - dev: false - /@jimp/tiff@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-7EsJzZ5Y/EtinkBGuwX3Bi4S+zgbKouxjt9c82VJTRJOQgLWsE/RHqcyRCOQBhHAZ9QexYmDz34medfLKdoX0g==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/tiff@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 core-js: 3.32.1 utif: 2.0.1 - dev: false - /@jimp/types@0.10.3(@jimp/custom@0.10.3): - resolution: {integrity: sha512-XGmBakiHZqseSWr/puGN+CHzx0IKBSpsKlmEmsNV96HKDiP6eu8NSnwdGCEq2mmIHe0JNcg1hqg59hpwtQ7Tiw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' + '@jimp/types@0.10.3(@jimp/custom@0.10.3)': dependencies: '@babel/runtime': 7.22.11 '@jimp/bmp': 0.10.3(@jimp/custom@0.10.3) @@ -3101,88 +10207,61 @@ packages: '@jimp/tiff': 0.10.3(@jimp/custom@0.10.3) core-js: 3.32.1 timm: 1.7.1 - dev: false - /@jimp/utils@0.10.3: - resolution: {integrity: sha512-VcSlQhkil4ReYmg1KkN+WqHyYfZ2XfZxDsKAHSfST1GEz/RQHxKZbX+KhFKtKflnL0F4e6DlNQj3vznMNXCR2w==} + '@jimp/utils@0.10.3': dependencies: '@babel/runtime': 7.22.11 core-js: 3.32.1 regenerator-runtime: 0.13.11 - dev: false - /@joshwooding/vite-plugin-react-docgen-typescript@0.2.1(typescript@5.2.2)(vite@4.5.3): - resolution: {integrity: sha512-ou4ZJSXMMWHqGS4g8uNRbC5TiTWxAgQZiVucoUrOCWuPrTbkpJbmVyIi9jU72SBry7gQtuMEDp4YR8EEXAg7VQ==} - peerDependencies: - typescript: '>= 4.3.x' - vite: ^3.0.0 || ^4.0.0 - peerDependenciesMeta: - typescript: - optional: true + '@joshwooding/vite-plugin-react-docgen-typescript@0.2.1(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2))': dependencies: glob: 7.2.3 glob-promise: 4.2.2(glob@7.2.3) magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.2.2) + vite: 4.5.3(@types/node@20.8.0)(terser@5.19.2) + optionalDependencies: typescript: 5.2.2 - vite: 4.5.3 - dev: true - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.3': dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.19 - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.1': {} - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.1.2': {} - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + '@jridgewell/source-map@0.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 - dev: false - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.4.15': {} - /@jridgewell/trace-mapping@0.3.19: - resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + '@jridgewell/trace-mapping@0.3.19': dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - /@jspm/core@2.0.1: - resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==} - dev: false + '@jspm/core@2.0.1': {} - /@juggle/resize-observer@3.3.1: - resolution: {integrity: sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==} + '@juggle/resize-observer@3.3.1': {} - /@lit-labs/ssr-dom-shim@1.1.1: - resolution: {integrity: sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==} + '@lit-labs/ssr-dom-shim@1.1.1': {} - /@lit/reactive-element@1.6.3: - resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + '@lit/reactive-element@1.6.3': dependencies: '@lit-labs/ssr-dom-shim': 1.1.1 - /@mapbox/node-pre-gyp@1.0.11: - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true + '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': dependencies: detect-libc: 2.0.2 https-proxy-agent: 5.0.1 make-dir: 3.1.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 @@ -3191,706 +10270,394 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /@mdx-js/react@2.3.0(react@18.2.0): - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} - peerDependencies: - react: ^18.2.0 + '@mdx-js/react@2.3.0(react@18.2.0)': dependencies: '@types/mdx': 2.0.8 '@types/react': 18.2.20 react: 18.2.0 - dev: true - /@msgpack/msgpack@2.8.0: - resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} - engines: {node: '>= 10'} - dev: false + '@msgpack/msgpack@2.8.0': {} - /@ndelangen/get-tarball@3.0.9: - resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} + '@ndelangen/get-tarball@3.0.9': dependencies: gunzip-maybe: 1.4.2 pump: 3.0.0 tar-fs: 2.1.1 - dev: true - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - dev: true - /@npmcli/fs@2.1.2: - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - requiresBuild: true + '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 semver: 7.6.0 - dev: false optional: true - /@npmcli/move-file@2.0.1: - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs - requiresBuild: true + '@npmcli/move-file@2.0.1': dependencies: mkdirp: 1.0.4 rimraf: 3.0.2 - dev: false optional: true - /@nxg-org/mineflayer-auto-jump@0.7.7: - resolution: {integrity: sha512-50FYsz5rxBuLzOh7wqmg9iN9zdVGD+QjuaPcw/mD7q8Bq6Bq+o1/DfXfpoNGIHaDag80q6FJSpc73MI3Scid8g==} + '@nxg-org/mineflayer-auto-jump@0.7.7': dependencies: '@nxg-org/mineflayer-physics-util': 1.5.8 strict-event-emitter-types: 2.0.0 - dev: false - /@nxg-org/mineflayer-physics-util@1.5.8: - resolution: {integrity: sha512-KmCkAqpUo8BbuRdIBs6+V2hWHehz++PRz3lRwIsb47CuG0u4sgLYh37RY3ifAznC6uWvmPK+q3B4ZXwJzPy1MQ==} + '@nxg-org/mineflayer-physics-util@1.5.8': dependencies: '@nxg-org/mineflayer-util-plugin': 1.8.3 - dev: false - /@nxg-org/mineflayer-tracker@1.2.1: - resolution: {integrity: sha512-SI1ffF8zvg3/ZNE021Ja2W0FZPN+WbQDZf8yFqOcXtPRXAtM9W6HvoACdzXep8BZid7WYgYLIgjKpB+9RqvCNQ==} + '@nxg-org/mineflayer-tracker@1.2.1': dependencies: '@nxg-org/mineflayer-trajectories': 1.1.1 '@nxg-org/mineflayer-util-plugin': 1.8.3 - dev: false - /@nxg-org/mineflayer-trajectories@1.1.1: - resolution: {integrity: sha512-X103KXlX8+L3uMeK4jQxMUdTizv01sQRSfBizAF/iOAdfQZehRLXr3CYKeJzfwPYGLN0X0JCl++cMEcZVn4vbg==} + '@nxg-org/mineflayer-trajectories@1.1.1': dependencies: '@nxg-org/mineflayer-util-plugin': 1.8.3 - dev: false - /@nxg-org/mineflayer-util-plugin@1.8.3: - resolution: {integrity: sha512-YlIbzCDs9822xuvmYlD0vXZz0iye9buqp9NK4nNn15gYybdqBtC/YxK6BLqXtwNohZCKoZdKgei7Xd5Bt2/rUg==} - dev: false + '@nxg-org/mineflayer-util-plugin@1.8.3': {} - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true + '@pkgjs/parseargs@0.11.0': optional: true - /@popperjs/core@2.11.8: - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - dev: false + '@popperjs/core@2.11.8': {} - /@radix-ui/number@1.0.1: - resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} + '@radix-ui/number@1.0.1': dependencies: '@babel/runtime': 7.22.11 - dev: true - /@radix-ui/primitive@1.0.1: - resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + '@radix-ui/primitive@1.0.1': dependencies: '@babel/runtime': 7.22.11 - dev: true - /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.20 - '@types/react-dom': 18.2.7 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true + optionalDependencies: + '@types/react': 18.2.20 + '@types/react-dom': 18.2.7 - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': 1.0.2(@types/react@18.2.20)(react@18.2.0) - '@types/react': 18.2.20 - '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true + optionalDependencies: + '@types/react': 18.2.20 + '@types/react-dom': 18.2.7 - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.20)(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 - '@types/react': 18.2.20 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /@radix-ui/react-context@1.0.1(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@radix-ui/react-context@1.0.1(@types/react@18.2.20)(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 - '@types/react': 18.2.20 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /@radix-ui/react-direction@1.0.1(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@radix-ui/react-direction@1.0.1(@types/react@18.2.20)(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 - '@types/react': 18.2.20 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.20)(react@18.2.0) - '@types/react': 18.2.20 - '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true + optionalDependencies: + '@types/react': 18.2.20 + '@types/react-dom': 18.2.7 - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.20)(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 - '@types/react': 18.2.20 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@types/react': 18.2.20 - '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true + optionalDependencies: + '@types/react': 18.2.20 + '@types/react-dom': 18.2.7 - /@radix-ui/react-id@1.0.1(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@radix-ui/react-id@1.0.1(@types/react@18.2.20)(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@types/react': 18.2.20 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 - '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.20 - '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true + optionalDependencies: + '@types/react': 18.2.20 + '@types/react-dom': 18.2.7 - /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.20 - '@types/react-dom': 18.2.7 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true + optionalDependencies: + '@types/react': 18.2.20 + '@types/react-dom': 18.2.7 - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.20)(react@18.2.0) - '@types/react': 18.2.20 - '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true + optionalDependencies: + '@types/react': 18.2.20 + '@types/react-dom': 18.2.7 - /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@types/react': 18.2.20 - '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true + optionalDependencies: + '@types/react': 18.2.20 + '@types/react-dom': 18.2.7 - /@radix-ui/react-select@1.2.2(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@radix-ui/react-select@1.2.2(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-id': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': 1.0.2(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.20 - '@types/react-dom': 18.2.7 + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.5(@types/react@18.2.20)(react@18.2.0) - dev: true - - /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.11 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + optionalDependencies: '@types/react': 18.2.20 '@types/react-dom': 18.2.7 + + '@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.22.11 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true + optionalDependencies: + '@types/react': 18.2.20 + '@types/react-dom': 18.2.7 - /@radix-ui/react-slot@1.0.2(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@radix-ui/react-slot@1.0.2(@types/react@18.2.20)(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@types/react': 18.2.20 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@types/react': 18.2.20 - '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true + optionalDependencies: + '@types/react': 18.2.20 + '@types/react-dom': 18.2.7 - /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@types/react': 18.2.20 - '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true + optionalDependencies: + '@types/react': 18.2.20 + '@types/react-dom': 18.2.7 - /@radix-ui/react-toolbar@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@radix-ui/react-toolbar@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.2.20)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.20 - '@types/react-dom': 18.2.7 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true + optionalDependencies: + '@types/react': 18.2.20 + '@types/react-dom': 18.2.7 - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.20)(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 - '@types/react': 18.2.20 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.20)(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@types/react': 18.2.20 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.20)(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@types/react': 18.2.20 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.20)(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 - '@types/react': 18.2.20 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@radix-ui/react-use-previous@1.0.1(@types/react@18.2.20)(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 - '@types/react': 18.2.20 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@radix-ui/react-use-rect@1.0.1(@types/react@18.2.20)(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.20 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@radix-ui/react-use-size@1.0.1(@types/react@18.2.20)(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.20)(react@18.2.0) - '@types/react': 18.2.20 react: 18.2.0 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.22.11 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: '@types/react': 18.2.20 '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - /@radix-ui/rect@1.0.1: - resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + '@radix-ui/rect@1.0.1': dependencies: '@babel/runtime': 7.22.11 - dev: true - /@react-oauth/google@0.12.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-qagsy22t+7UdkYAiT5ZhfM4StXi9PPNvw0zuwNmabrWyMKddczMtBIOARflbaIj+wHiQjnMAsZmzsUYuXeyoSg==} - peerDependencies: - react: ^18.2.0 - react-dom: '>=16.8.0' + '@react-oauth/google@0.12.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /@rollup/plugin-babel@5.3.1(@babel/core@7.22.11)(rollup@2.79.1): - resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} - engines: {node: '>= 10.0.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@types/babel__core': ^7.1.9 - rollup: ^1.20.0||^2.0.0 - peerDependenciesMeta: - '@types/babel__core': - optional: true + '@rollup/plugin-babel@5.3.1(@babel/core@7.22.11)(@types/babel__core@7.20.2)(rollup@2.79.1)': dependencies: '@babel/core': 7.22.11 '@babel/helper-module-imports': 7.22.5 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 - dev: false + optionalDependencies: + '@types/babel__core': 7.20.2 - /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): - resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} - engines: {node: '>= 10.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 + '@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@2.79.1) '@types/resolve': 1.17.1 @@ -3899,162 +10666,108 @@ packages: is-module: 1.0.0 resolve: 1.22.4 rollup: 2.79.1 - dev: false - /@rollup/plugin-replace@2.4.2(rollup@2.79.1): - resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} - peerDependencies: - rollup: ^1.20.0 || ^2.0.0 + '@rollup/plugin-replace@2.4.2(rollup@2.79.1)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@2.79.1) magic-string: 0.25.9 rollup: 2.79.1 - dev: false - /@rollup/pluginutils@3.1.0(rollup@2.79.1): - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 + '@rollup/pluginutils@3.1.0(rollup@2.79.1)': dependencies: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 rollup: 2.79.1 - dev: false - /@rollup/pluginutils@5.0.5(rollup@2.79.1): - resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rollup/pluginutils@5.0.5(rollup@2.79.1)': dependencies: '@types/estree': 1.0.2 estree-walker: 2.0.2 picomatch: 2.3.1 + optionalDependencies: rollup: 2.79.1 - dev: true - /@rushstack/eslint-patch@1.4.0: - resolution: {integrity: sha512-cEjvTPU32OM9lUFegJagO0mRnIn+rbqrG89vV8/xLnLFX0DoR0r1oy5IlTga71Q7uT3Qus7qm7wgeiMT/+Irlg==} - dev: true + '@rushstack/eslint-patch@1.4.0': {} - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true + '@sinclair/typebox@0.27.8': {} - /@socket.io/component-emitter@3.1.0: - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} - dev: false + '@socket.io/component-emitter@3.1.0': {} - /@storybook/addon-actions@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-SsqZr3js5NinKPnC8AeNI7Ij+Q6fIl9tRdRmSulEgjksjOg7E5S1/Wsn5Bb2CCgj7MaX6VxGyC7s3XskQtDiIQ==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-actions@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 7.4.6 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/preview-api': 7.4.6 - '@storybook/theming': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/types': 7.4.6 dequal: 2.0.3 lodash: 4.17.21 polished: 4.2.2 prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) react-inspector: 6.0.2(react@18.2.0) telejson: 7.2.0 ts-dedent: 2.2.0 uuid: 9.0.1 + optionalDependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' - '@types/react-dom' - dev: true - /@storybook/addon-backgrounds@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-+LHTZB/ZYMAzkyD5ZxSriBsqmsrvIaW/Nnd/BeuXGbkrVKKqM0qAKiFZAfjc2WchA1piVNy0/1Rsf+kuYCEiJw==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-backgrounds@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 7.4.6 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/preview-api': 7.4.6 - '@storybook/theming': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/types': 7.4.6 memoizerific: 1.11.3 + ts-dedent: 2.2.0 + optionalDependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@types/react-dom' - dev: true - /@storybook/addon-controls@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4lq3sycEUIsK8SUWDYc60QgF4vV9FZZ3lDr6M7j2W9bOnvGw49d2fbdlnq+bX1ZprZZ9VgglQpBAorQB3BXZRw==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-controls@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@storybook/blocks': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@storybook/blocks': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-common': 7.4.6 + '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/core-common': 7.4.6(encoding@0.1.13) '@storybook/core-events': 7.4.6 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 7.4.6 '@storybook/preview-api': 7.4.6 - '@storybook/theming': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/types': 7.4.6 lodash: 4.17.21 + ts-dedent: 2.2.0 + optionalDependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@types/react-dom' - encoding - supports-color - dev: true - /@storybook/addon-docs@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-dLaub+XWFq4hChw+xfuF9yYg0Txp77FUawKoAigccfjWXx+OOhRV3XTuAcknpXkYq94GWynHgUFXosXT9kbDNA==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/addon-docs@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@jest/transform': 29.7.0 '@mdx-js/react': 2.3.0(react@18.2.0) - '@storybook/blocks': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@storybook/blocks': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/csf-plugin': 7.4.6 '@storybook/csf-tools': 7.4.6 '@storybook/global': 5.0.0 @@ -4062,8 +10775,8 @@ packages: '@storybook/node-logger': 7.4.6 '@storybook/postinstall': 7.4.6 '@storybook/preview-api': 7.4.6 - '@storybook/react-dom-shim': 7.4.6(react-dom@18.2.0)(react@18.2.0) - '@storybook/theming': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/react-dom-shim': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/types': 7.4.6 fs-extra: 11.1.1 react: 18.2.0 @@ -4076,25 +10789,20 @@ packages: - '@types/react-dom' - encoding - supports-color - dev: true - /@storybook/addon-essentials@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-dWodufrt71TK7ELkeIvVae/x4PzECUlbOm57Iqqt4yQCyR291CgvI4PjeB8un2HbpcXCGZ+N/Oj3YkytvzBi4A==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/addon-essentials@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@storybook/addon-actions': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-backgrounds': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-controls': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-docs': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-actions': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/addon-backgrounds': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/addon-controls': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/addon-docs': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-highlight': 7.4.6 - '@storybook/addon-measure': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-outline': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-toolbars': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-viewport': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-common': 7.4.6 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-measure': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/addon-outline': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/addon-toolbars': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/addon-viewport': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/core-common': 7.4.6(encoding@0.1.13) + '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 7.4.6 '@storybook/preview-api': 7.4.6 react: 18.2.0 @@ -4105,159 +10813,107 @@ packages: - '@types/react-dom' - encoding - supports-color - dev: true - /@storybook/addon-highlight@7.4.6: - resolution: {integrity: sha512-zCufxxD2KS5VwczxfkcBxe1oR/juTTn2H1Qm8kYvWCJQx3UxzX0+G9cwafbpV7eivqaufLweEwROkH+0KjAtkQ==} + '@storybook/addon-highlight@7.4.6': dependencies: '@storybook/core-events': 7.4.6 '@storybook/global': 5.0.0 '@storybook/preview-api': 7.4.6 - dev: true - /@storybook/addon-links@7.4.6(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-BPygElZKX+CPI9Se6GJNk1dYc5oxuhA+vHigO1tBqhiM6VkHyFP3cvezJNQvpNYhkUnu3cxnZXb3UJnlRbPY3g==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-links@7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/client-logger': 7.4.6 '@storybook/core-events': 7.4.6 '@storybook/csf': 0.1.1 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/preview-api': 7.4.6 - '@storybook/router': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/router': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/types': 7.4.6 prop-types: 15.8.1 + ts-dedent: 2.2.0 + optionalDependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - ts-dedent: 2.2.0 - dev: true - /@storybook/addon-measure@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nCymMLaHnxv8TE3yEM1A9Tulb1NuRXRNmtsdHTkjv7P1aWCxZo8A/GZaottKe/GLT8jSRjZ+dnpYWrbAhw6wTQ==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-measure@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 7.4.6 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/preview-api': 7.4.6 '@storybook/types': 7.4.6 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) tiny-invariant: 1.3.1 + optionalDependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' - '@types/react-dom' - dev: true - /@storybook/addon-outline@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-errNUblRVDLpuEaHQPr/nsrnsUkD2ARmXawkRvizgDWLIDMDJYjTON3MUCaVx3x+hlZ3I6X//G5TVcma8tCc8A==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-outline@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 7.4.6 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/preview-api': 7.4.6 '@storybook/types': 7.4.6 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - dev: true - - /@storybook/addon-toolbars@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-L9m2FBcKeteGq7qIYsMJr0LEfiH7Wdrv5IDcldZTn68eZUJTh1p4GdJZcOmzX1P5IFRr76hpu03iWsNlWQjpbQ==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - dependencies: - '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@storybook/manager-api': 7.4.6(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.4.6 - '@storybook/theming': 7.4.6(react-dom@18.2.0)(react@18.2.0) + optionalDependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' - '@types/react-dom' - dev: true - /@storybook/addon-viewport@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-INDtk54j7bi7NgxMfd2ATmbA0J7nAd6X8itMkLIyPuPJtx8bYHPDORyemDOd0AojgmAdTOAyUtDYdI/PFeo4Cw==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + '@storybook/addon-toolbars@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/preview-api': 7.4.6 + '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + optionalDependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + '@storybook/addon-viewport@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@storybook/client-logger': 7.4.6 + '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 7.4.6 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/preview-api': 7.4.6 - '@storybook/theming': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) memoizerific: 1.11.3 prop-types: 15.8.1 + optionalDependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' - '@types/react-dom' - dev: true - /@storybook/blocks@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-HxBSAeOiTZW2jbHQlo1upRWFgoMsaAyKijUFf5MwwMNIesXCuuTGZDJ3xTABwAVLK2qC9Ektfbo0CZCiPVuDRQ==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/blocks@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/channels': 7.4.6 '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 7.4.6 '@storybook/csf': 0.1.1 - '@storybook/docs-tools': 7.4.6 + '@storybook/docs-tools': 7.4.6(encoding@0.1.13) '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/preview-api': 7.4.6 - '@storybook/theming': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/types': 7.4.6 '@types/lodash': 4.14.199 color-convert: 2.0.1 @@ -4267,7 +10923,7 @@ packages: memoizerific: 1.11.3 polished: 4.2.2 react: 18.2.0 - react-colorful: 5.6.1(react-dom@18.2.0)(react@18.2.0) + react-colorful: 5.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-dom: 18.2.0(react@18.2.0) telejson: 7.2.0 tocbot: 4.21.2 @@ -4278,13 +10934,11 @@ packages: - '@types/react-dom' - encoding - supports-color - dev: true - /@storybook/builder-manager@7.4.6: - resolution: {integrity: sha512-zylZCD2rmyLOOFBFmUgtJg6UNUKmRNgXiig1XApzS2TkIbTZP827DsVEUl0ey/lskCe0uArkrEBR6ICba8p/Rw==} + '@storybook/builder-manager@7.4.6(encoding@0.1.13)': dependencies: '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@storybook/core-common': 7.4.6 + '@storybook/core-common': 7.4.6(encoding@0.1.13) '@storybook/manager': 7.4.6 '@storybook/node-logger': 7.4.6 '@types/ejs': 3.1.3 @@ -4302,26 +10956,12 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@storybook/builder-vite@7.4.6(typescript@5.2.2)(vite@4.5.3): - resolution: {integrity: sha512-xV9STYK+TkqWWTf2ydm6jx+7P70fjD2UPd1XTUw08uKszIjhuuxk+bG/OF5R1E25mPunAKXm6kBFh351AKejBg==} - peerDependencies: - '@preact/preset-vite': '*' - typescript: '>= 4.3.x' - vite: ^3.0.0 || ^4.0.0 - vite-plugin-glimmerx: '*' - peerDependenciesMeta: - '@preact/preset-vite': - optional: true - typescript: - optional: true - vite-plugin-glimmerx: - optional: true + '@storybook/builder-vite@7.4.6(encoding@0.1.13)(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2))': dependencies: '@storybook/channels': 7.4.6 '@storybook/client-logger': 7.4.6 - '@storybook/core-common': 7.4.6 + '@storybook/core-common': 7.4.6(encoding@0.1.13) '@storybook/csf-plugin': 7.4.6 '@storybook/mdx2-csf': 1.1.0 '@storybook/node-logger': 7.4.6 @@ -4338,15 +10978,14 @@ packages: remark-external-links: 8.0.0 remark-slug: 6.1.0 rollup: 3.29.4 + vite: 4.5.3(@types/node@20.8.0)(terser@5.19.2) + optionalDependencies: typescript: 5.2.2 - vite: 4.5.3 transitivePeerDependencies: - encoding - supports-color - dev: true - /@storybook/channels@7.4.6: - resolution: {integrity: sha512-yPv/sfo2c18fM3fvG0i1xse63vG8l33Al/OU0k/dtovltPu001/HVa1QgBgsb/QrEfZtvGjGhmtdVeYb39fv3A==} + '@storybook/channels@7.4.6': dependencies: '@storybook/client-logger': 7.4.6 '@storybook/core-events': 7.4.6 @@ -4354,23 +10993,20 @@ packages: qs: 6.11.2 telejson: 7.2.0 tiny-invariant: 1.3.1 - dev: true - /@storybook/cli@7.4.6: - resolution: {integrity: sha512-rRwaH8pOL+FHz/pJMEkNpMH2xvZvWsrl7obBYw26NQiHmiVSAkfHJicndSN1mwc+p5w+9iXthrgzbLtSAOSvkA==} - hasBin: true + '@storybook/cli@7.4.6(encoding@0.1.13)': dependencies: '@babel/core': 7.22.11 '@babel/preset-env': 7.22.10(@babel/core@7.22.11) '@babel/types': 7.22.11 '@ndelangen/get-tarball': 3.0.9 '@storybook/codemod': 7.4.6 - '@storybook/core-common': 7.4.6 + '@storybook/core-common': 7.4.6(encoding@0.1.13) '@storybook/core-events': 7.4.6 - '@storybook/core-server': 7.4.6 + '@storybook/core-server': 7.4.6(encoding@0.1.13) '@storybook/csf-tools': 7.4.6 '@storybook/node-logger': 7.4.6 - '@storybook/telemetry': 7.4.6 + '@storybook/telemetry': 7.4.6(encoding@0.1.13) '@storybook/types': 7.4.6 '@types/semver': 7.5.3 '@yarnpkg/fslib': 2.10.3 @@ -4388,7 +11024,7 @@ packages: get-port: 5.1.1 giget: 1.1.3 globby: 11.1.0 - jscodeshift: 0.14.0(@babel/preset-env@7.22.10) + jscodeshift: 0.14.0(@babel/preset-env@7.22.10(@babel/core@7.22.11)) leven: 3.1.0 ora: 5.4.1 prettier: 2.8.8 @@ -4406,16 +11042,12 @@ packages: - encoding - supports-color - utf-8-validate - dev: true - /@storybook/client-logger@7.4.6: - resolution: {integrity: sha512-XDw31ZziU//86PKuMRnmc+L/G0VopaGKENQOGEpvAXCU9IZASwGKlKAtcyosjrpi+ZiUXlMgUXCpXM7x3b1Ehw==} + '@storybook/client-logger@7.4.6': dependencies: '@storybook/global': 5.0.0 - dev: true - /@storybook/codemod@7.4.6: - resolution: {integrity: sha512-lxmwEpwksCaAq96APN2YlooSDfKjJ1vKzN5Ni2EqQzf2TEXl7XQjLacHd7OOaII1kfsy+D5gNG4N5wBo7Ub30g==} + '@storybook/codemod@7.4.6': dependencies: '@babel/core': 7.22.11 '@babel/preset-env': 7.22.10(@babel/core@7.22.11) @@ -4427,46 +11059,37 @@ packages: '@types/cross-spawn': 6.0.3 cross-spawn: 7.0.3 globby: 11.1.0 - jscodeshift: 0.14.0(@babel/preset-env@7.22.10) + jscodeshift: 0.14.0(@babel/preset-env@7.22.10(@babel/core@7.22.11)) lodash: 4.17.21 prettier: 2.8.8 recast: 0.23.4 transitivePeerDependencies: - supports-color - dev: true - /@storybook/components@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nIRBhewAgrJJVafyCzuaLx1l+YOfvvD5dOZ0JxZsxJsefOdw1jFpUqUZ5fIpQ2moyvrR0mAUFw378rBfMdHz5Q==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/components@7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/react-select': 1.2.2(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-select': 1.2.2(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 7.4.6 '@storybook/csf': 0.1.1 '@storybook/global': 5.0.0 - '@storybook/theming': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/types': 7.4.6 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - use-resize-observer: 9.1.0(react-dom@18.2.0)(react@18.2.0) + use-resize-observer: 9.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) util-deprecate: 1.0.2 transitivePeerDependencies: - '@types/react' - '@types/react-dom' - dev: true - /@storybook/core-client@7.4.6: - resolution: {integrity: sha512-tfgxAHeCvMcs6DsVgtb4hQSDaCHeAPJOsoyhb47eDQfk4OmxzriM0qWucJV5DePSMi+KutX/rN2u0JxfOuN68g==} + '@storybook/core-client@7.4.6': dependencies: '@storybook/client-logger': 7.4.6 '@storybook/preview-api': 7.4.6 - dev: true - /@storybook/core-common@7.4.6: - resolution: {integrity: sha512-05MJFmOM86qvTLtgDskokIFz9txe0Lbhq4L3by1FtF0GwgH+p+W6I94KI7c6ANER+kVZkXQZhiRzwBFnVTW+Cg==} + '@storybook/core-common@7.4.6(encoding@0.1.13)': dependencies: '@storybook/core-events': 7.4.6 '@storybook/node-logger': 7.4.6 @@ -4485,7 +11108,7 @@ packages: glob: 10.3.3 handlebars: 4.7.8 lazy-universal-dotenv: 4.0.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) picomatch: 2.3.1 pkg-dir: 5.0.0 pretty-hrtime: 1.0.3 @@ -4494,22 +11117,18 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@storybook/core-events@7.4.6: - resolution: {integrity: sha512-r5vrE+32lwrJh1NGFr1a0mWjvxo7q8FXYShylcwRWpacmL5NTtLkrXOoJSeGvJ4yKNYkvxQFtOPId4lzDxa32w==} + '@storybook/core-events@7.4.6': dependencies: ts-dedent: 2.2.0 - dev: true - /@storybook/core-server@7.4.6: - resolution: {integrity: sha512-jqmRTGCJ1W0WReImivkisPVaLFT5sjtLnFoAk0feHp6QS5j7EYOPN7CYzliyQmARWTLUEXOVaFf3VD6nJZQhJQ==} + '@storybook/core-server@7.4.6(encoding@0.1.13)': dependencies: '@aw-web-design/x-default-browser': 1.4.126 '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-manager': 7.4.6 + '@storybook/builder-manager': 7.4.6(encoding@0.1.13) '@storybook/channels': 7.4.6 - '@storybook/core-common': 7.4.6 + '@storybook/core-common': 7.4.6(encoding@0.1.13) '@storybook/core-events': 7.4.6 '@storybook/csf': 0.1.1 '@storybook/csf-tools': 7.4.6 @@ -4518,7 +11137,7 @@ packages: '@storybook/manager': 7.4.6 '@storybook/node-logger': 7.4.6 '@storybook/preview-api': 7.4.6 - '@storybook/telemetry': 7.4.6 + '@storybook/telemetry': 7.4.6(encoding@0.1.13) '@storybook/types': 7.4.6 '@types/detect-port': 1.3.3 '@types/node': 16.18.58 @@ -4551,19 +11170,15 @@ packages: - encoding - supports-color - utf-8-validate - dev: true - /@storybook/csf-plugin@7.4.6: - resolution: {integrity: sha512-yi7Qa4NSqKOyiJTWCxlB0ih2ijXq6oY5qZKW6MuMMBP14xJNRGLbH5KabpfXgN2T7YECcOWG1uWaGj2veJb1KA==} + '@storybook/csf-plugin@7.4.6': dependencies: '@storybook/csf-tools': 7.4.6 unplugin: 1.5.0 transitivePeerDependencies: - supports-color - dev: true - /@storybook/csf-tools@7.4.6: - resolution: {integrity: sha512-ocKpcIUtTBy6hlLY34RUFQyX403cWpB2gGfqvkHbpGe2BQj7EyV0zpWnjsfVxvw+M9OWlCdxHWDOPUgXM33ELw==} + '@storybook/csf-tools@7.4.6': dependencies: '@babel/generator': 7.22.10 '@babel/parser': 7.22.13 @@ -4576,22 +11191,16 @@ packages: ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - dev: true - /@storybook/csf@0.1.1: - resolution: {integrity: sha512-4hE3AlNVxR60Wc5KSC68ASYzUobjPqtSKyhV6G+ge0FIXU55N5nTY7dXGRZHQGDBPq+XqchMkIdlkHPRs8nTHg==} + '@storybook/csf@0.1.1': dependencies: type-fest: 2.19.0 - dev: true - /@storybook/docs-mdx@0.1.0: - resolution: {integrity: sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==} - dev: true + '@storybook/docs-mdx@0.1.0': {} - /@storybook/docs-tools@7.4.6: - resolution: {integrity: sha512-nZj1L/8WwKWWJ41FW4MaKGajZUtrhnr9UwflRCkQJaWhAKmDfOb5M5TqI93uCOULpFPOm5wpoMBz2IHInQ2Lrg==} + '@storybook/docs-tools@7.4.6(encoding@0.1.13)': dependencies: - '@storybook/core-common': 7.4.6 + '@storybook/core-common': 7.4.6(encoding@0.1.13) '@storybook/preview-api': 7.4.6 '@storybook/types': 7.4.6 '@types/doctrine': 0.0.3 @@ -4600,25 +11209,18 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@storybook/global@5.0.0: - resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - dev: true + '@storybook/global@5.0.0': {} - /@storybook/manager-api@7.4.6(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-inrm3DIbCp8wjXSN/wK6e6i2ysQ/IEmtC7IN0OJ7vdrp+USCooPT448SQTUmVctUGCFmOU3fxXByq8g77oIi7w==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/manager-api@7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/channels': 7.4.6 '@storybook/client-logger': 7.4.6 '@storybook/core-events': 7.4.6 '@storybook/csf': 0.1.1 '@storybook/global': 5.0.0 - '@storybook/router': 7.4.6(react-dom@18.2.0)(react@18.2.0) - '@storybook/theming': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/router': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/types': 7.4.6 dequal: 2.0.3 lodash: 4.17.21 @@ -4629,26 +11231,16 @@ packages: store2: 2.14.2 telejson: 7.2.0 ts-dedent: 2.2.0 - dev: true - /@storybook/manager@7.4.6: - resolution: {integrity: sha512-kA1hUDxpn1i2SO9OinvLvVXDeL4xgJkModp+pbE8IXv4NJWReNq1ecMeQCzPLS3Sil2gnrullQ9uYXsnZ9bxxA==} - dev: true + '@storybook/manager@7.4.6': {} - /@storybook/mdx2-csf@1.1.0: - resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} - dev: true + '@storybook/mdx2-csf@1.1.0': {} - /@storybook/node-logger@7.4.6: - resolution: {integrity: sha512-djZb310Q27GviDug1XBv0jOEDLCiwr4hhDE0aifCEKZpfNCi/EaP31nbWimFzZwxu4hE/YAPWExzScruR1zw9Q==} - dev: true + '@storybook/node-logger@7.4.6': {} - /@storybook/postinstall@7.4.6: - resolution: {integrity: sha512-TqI5BucPAGRWrkh55BYiG2/gHLFtC0In4cuu0GsUzB/1jc4i51npLRorCwhmT7r7YliGl5F7JaP0Bni/qHN3Lg==} - dev: true + '@storybook/postinstall@7.4.6': {} - /@storybook/preview-api@7.4.6: - resolution: {integrity: sha512-byUS/Opt3ytWD4cWz3sNEKw5Yks8MkQgRN+GDSyIomaEAQkLAM0rchPC0MYjwCeUSecV7IIQweNX5RbV4a34BA==} + '@storybook/preview-api@7.4.6': dependencies: '@storybook/channels': 7.4.6 '@storybook/client-logger': 7.4.6 @@ -4664,41 +11256,27 @@ packages: synchronous-promise: 2.0.17 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - dev: true - /@storybook/preview@7.4.6: - resolution: {integrity: sha512-2RPXusJ4CTDrIipIKKvbotD7fP0+8VzoFjImunflIrzN9rni+2rq5eMjqlXAaB+77w064zIR4uDUzI9fxsMDeQ==} - dev: true + '@storybook/preview@7.4.6': {} - /@storybook/react-dom-shim@7.4.6(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-DSq8l9FDocUF1ooVI+TF83pddj1LynE/Hv0/y8XZhc3IgJ/HkuOQuUmfz29ezgfAi9gFYUR8raTIBi3/xdoRmw==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/react-dom-shim@7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true - /@storybook/react-vite@7.4.6(react-dom@18.2.0)(react@18.2.0)(rollup@2.79.1)(typescript@5.2.2)(vite@4.5.3): - resolution: {integrity: sha512-jkjnrf3FxzR5wcmebXRPflrsM4WIDjWyW/NVFJwxi5PeIOk7fE7/QAPrm4NFRUu2Q7DeuH3oLKsw8bigvUI9RA==} - engines: {node: '>=16'} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - vite: ^3.0.0 || ^4.0.0 + '@storybook/react-vite@7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@2.79.1)(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.2.2)(vite@4.5.3) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) '@rollup/pluginutils': 5.0.5(rollup@2.79.1) - '@storybook/builder-vite': 7.4.6(typescript@5.2.2)(vite@4.5.3) - '@storybook/react': 7.4.6(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@vitejs/plugin-react': 3.1.0(vite@4.5.3) + '@storybook/builder-vite': 7.4.6(encoding@0.1.13)(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) + '@storybook/react': 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.2.2) + '@vitejs/plugin-react': 3.1.0(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) ast-types: 0.14.2 magic-string: 0.30.4 react: 18.2.0 react-docgen: 6.0.0-alpha.3 react-dom: 18.2.0(react@18.2.0) - vite: 4.5.3 + vite: 4.5.3(@types/node@20.8.0)(terser@5.19.2) transitivePeerDependencies: - '@preact/preset-vite' - encoding @@ -4706,25 +11284,15 @@ packages: - supports-color - typescript - vite-plugin-glimmerx - dev: true - /@storybook/react@7.4.6(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-w0dVo64baFFPTGpUOWFqkKsu6pQincoymegSNgqaBd5DxEyMDRiRoTWSJHMKE9BwgE8SyWhRkP1ak1mkccSOhQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@storybook/react@7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.2.2)': dependencies: '@storybook/client-logger': 7.4.6 '@storybook/core-client': 7.4.6 - '@storybook/docs-tools': 7.4.6 + '@storybook/docs-tools': 7.4.6(encoding@0.1.13) '@storybook/global': 5.0.0 '@storybook/preview-api': 7.4.6 - '@storybook/react-dom-shim': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/react-dom-shim': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/types': 7.4.6 '@types/escodegen': 0.0.6 '@types/estree': 0.0.51 @@ -4738,34 +11306,28 @@ packages: prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-element-to-jsx-string: 15.0.0(react-dom@18.2.0)(react@18.2.0) + react-element-to-jsx-string: 15.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) ts-dedent: 2.2.0 type-fest: 2.19.0 - typescript: 5.2.2 util-deprecate: 1.0.2 + optionalDependencies: + typescript: 5.2.2 transitivePeerDependencies: - encoding - supports-color - dev: true - /@storybook/router@7.4.6(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Vl1esrHkcHxDKqc+HY7+6JQpBPW3zYvGk0cQ2rxVMhWdLZTAz1hss9DqzN9tFnPyfn0a1Q77EpMySkUrvWKKNQ==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/router@7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/client-logger': 7.4.6 memoizerific: 1.11.3 qs: 6.11.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true - /@storybook/telemetry@7.4.6: - resolution: {integrity: sha512-c8p/C1NIH8EMBviZkBCx8MMDk6rrITJ+b29DEp5MaWSRlklIVyhGiC4RPIRv6sxJwlD41PnqWVFtfu2j2eXLdQ==} + '@storybook/telemetry@7.4.6(encoding@0.1.13)': dependencies: '@storybook/client-logger': 7.4.6 - '@storybook/core-common': 7.4.6 + '@storybook/core-common': 7.4.6(encoding@0.1.13) '@storybook/csf-tools': 7.4.6 chalk: 4.1.2 detect-package-manager: 2.0.1 @@ -4775,13 +11337,8 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /@storybook/theming@7.4.6(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-HW77iJ9ptCMqhoBOYFjRQw7VBap+38fkJGHP5KylEJCyYCgIAm2dEcQmtWpMVYFssSGcb6djfbtAMhYU4TL4Iw==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/theming@7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@storybook/client-logger': 7.4.6 @@ -4789,28 +11346,20 @@ packages: memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true - /@storybook/types@7.4.6: - resolution: {integrity: sha512-6QLXtMVsFZFpzPkdGWsu/iuc8na9dnS67AMOBKm5qCLPwtUJOYkwhMdFRSSeJthLRpzV7JLAL8Kwvl7MFP3QSw==} + '@storybook/types@7.4.6': dependencies: '@storybook/channels': 7.4.6 '@types/babel__core': 7.20.2 '@types/express': 4.17.18 file-system-cache: 2.3.0 - dev: true - /@storybook/web-components-vite@7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)(vite@4.5.3): - resolution: {integrity: sha512-L/y6MTLbqfHaM0faK9Yl8n5PIyW4daZrtk7NfaOT6UjgNFjOx3o4CctYew6oj90cNk5HdZQX2OZny043GxDLZw==} - engines: {node: ^14.18 || >=16} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@storybook/web-components-vite@7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2))': dependencies: - '@storybook/builder-vite': 7.4.6(typescript@5.2.2)(vite@4.5.3) - '@storybook/core-server': 7.4.6 + '@storybook/builder-vite': 7.4.6(encoding@0.1.13)(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) + '@storybook/core-server': 7.4.6(encoding@0.1.13) '@storybook/node-logger': 7.4.6 - '@storybook/web-components': 7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0) + '@storybook/web-components': 7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) magic-string: 0.30.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4824,19 +11373,14 @@ packages: - utf-8-validate - vite - vite-plugin-glimmerx - dev: true - /@storybook/web-components@7.4.6(lit@2.8.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-HWqkZtdkmNimkzMmE0mGRys2ee9qgEeDVCruiffySVquBRMQ6n1xgvHZYaO6OLlMeH0YHPg083ZqUasS5GsYVg==} - engines: {node: '>=16.0.0'} - peerDependencies: - lit: ^2.0.0 + '@storybook/web-components@7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/client-logger': 7.4.6 '@storybook/core-client': 7.4.6 - '@storybook/docs-tools': 7.4.6 + '@storybook/docs-tools': 7.4.6(encoding@0.1.13) '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/preview-api': 7.4.6 '@storybook/types': 7.4.6 lit: 2.8.0 @@ -4847,393 +11391,247 @@ packages: - react - react-dom - supports-color - dev: true - /@surma/rollup-plugin-off-main-thread@2.2.3: - resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: ejs: 3.1.9 json5: 2.2.3 magic-string: 0.25.9 string.prototype.matchall: 4.0.10 - dev: false - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - requiresBuild: true - dev: false + '@tootallnate/once@2.0.0': optional: true - /@tweenjs/tween.js@18.6.4: - resolution: {integrity: sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ==} - dev: true + '@tweenjs/tween.js@18.6.4': {} - /@tweenjs/tween.js@20.0.3: - resolution: {integrity: sha512-SYUe1UgY5HM05EB4+0B4arq2IPjvyzKXoklXKxSYrc2IFxGm1cBrqg5XbiB5uwbs0xY5j+rj986NAJMM0KZaUw==} - dev: false + '@tweenjs/tween.js@20.0.3': {} - /@types/babel__core@7.20.2: - resolution: {integrity: sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==} + '@types/babel__core@7.20.2': dependencies: '@babel/parser': 7.22.13 '@babel/types': 7.22.11 '@types/babel__generator': 7.6.5 '@types/babel__template': 7.4.2 '@types/babel__traverse': 7.20.2 - dev: true - /@types/babel__generator@7.6.5: - resolution: {integrity: sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==} + '@types/babel__generator@7.6.5': dependencies: '@babel/types': 7.22.11 - dev: true - /@types/babel__template@7.4.2: - resolution: {integrity: sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==} + '@types/babel__template@7.4.2': dependencies: '@babel/parser': 7.22.13 '@babel/types': 7.22.11 - dev: true - /@types/babel__traverse@7.20.2: - resolution: {integrity: sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==} + '@types/babel__traverse@7.20.2': dependencies: '@babel/types': 7.22.11 - dev: true - /@types/body-parser@1.19.3: - resolution: {integrity: sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==} + '@types/body-parser@1.19.3': dependencies: '@types/connect': 3.4.36 '@types/node': 20.8.0 - dev: true - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + '@types/chai-subset@1.3.3': dependencies: '@types/chai': 4.3.6 - dev: true - /@types/chai@4.3.6: - resolution: {integrity: sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==} - dev: true + '@types/chai@4.3.6': {} - /@types/connect@3.4.36: - resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} + '@types/connect@3.4.36': dependencies: '@types/node': 20.8.10 - dev: true - /@types/cookie@0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - dev: false + '@types/cookie@0.4.1': {} - /@types/cors@2.8.15: - resolution: {integrity: sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==} + '@types/cors@2.8.15': dependencies: '@types/node': 20.8.0 - dev: false - /@types/cross-spawn@6.0.3: - resolution: {integrity: sha512-BDAkU7WHHRHnvBf5z89lcvACsvkz/n7Tv+HyD/uW76O29HoH1Tk/W6iQrepaZVbisvlEek4ygwT8IW7ow9XLAA==} + '@types/cross-spawn@6.0.3': dependencies: '@types/node': 20.8.10 - dev: true - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 - dev: false - /@types/detect-port@1.3.3: - resolution: {integrity: sha512-bV/jQlAJ/nPY3XqSatkGpu+nGzou+uSwrH1cROhn+jBFg47yaNH+blW4C7p9KhopC7QxCv/6M86s37k8dMk0Yg==} - dev: true + '@types/detect-port@1.3.3': {} - /@types/doctrine@0.0.3: - resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} - dev: true + '@types/doctrine@0.0.3': {} - /@types/draco3d@1.4.7: - resolution: {integrity: sha512-sjx6hQ8UArRZf+2ZhpPkjJW8iCkyxar69/IElc9NHuGE40n0U9SuvxX59CHvF4xUH7qfJDQ2lIbANZ0HHJg+BQ==} - dev: false + '@types/draco3d@1.4.7': {} - /@types/ejs@3.1.3: - resolution: {integrity: sha512-mv5T/JI/bu+pbfz1o+TLl1NF0NIBbjS0Vl6Ppz1YY9DkXfzZT0lelXpfS5i3ZS3U/p90it7uERQpBvLYoK8e4A==} - dev: true + '@types/ejs@3.1.3': {} - /@types/emscripten@1.39.8: - resolution: {integrity: sha512-Rk0HKcMXFUuqT32k1kXHZWgxiMvsyYsmlnjp0rLKa0MMoqXLE3T9dogDBTRfuc3SAsXu97KD3k4SKR1lHqd57w==} - dev: true + '@types/emscripten@1.39.8': {} - /@types/escodegen@0.0.6: - resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} - dev: true + '@types/escodegen@0.0.6': {} - /@types/estree@0.0.39: - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - dev: false + '@types/estree@0.0.39': {} - /@types/estree@0.0.51: - resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} - dev: true + '@types/estree@0.0.51': {} - /@types/estree@1.0.2: - resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} - dev: true + '@types/estree@1.0.2': {} - /@types/express-serve-static-core@4.17.37: - resolution: {integrity: sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==} + '@types/express-serve-static-core@4.17.37': dependencies: '@types/node': 20.8.0 '@types/qs': 6.9.8 '@types/range-parser': 1.2.5 '@types/send': 0.17.2 - dev: true - /@types/express@4.17.18: - resolution: {integrity: sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==} + '@types/express@4.17.18': dependencies: '@types/body-parser': 1.19.3 '@types/express-serve-static-core': 4.17.37 '@types/qs': 6.9.8 '@types/serve-static': 1.15.3 - dev: true - /@types/find-cache-dir@3.2.1: - resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} - dev: true + '@types/find-cache-dir@3.2.1': {} - /@types/gapi@0.0.47: - resolution: {integrity: sha512-/ZsLuq6BffMgbKMtZyDZ8vwQvTyKhKQ1G2K6VyWCgtHHhfSSXbk4+4JwImZiTjWNXfI2q1ZStAwFFHSkNoTkHA==} - dev: false + '@types/gapi@0.0.47': {} - /@types/glob@7.2.0: - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 '@types/node': 20.8.0 - dev: true - /@types/graceful-fs@4.1.7: - resolution: {integrity: sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==} + '@types/graceful-fs@4.1.7': dependencies: '@types/node': 20.8.10 - dev: true - /@types/http-cache-semantics@4.0.2: - resolution: {integrity: sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==} - dev: true + '@types/http-cache-semantics@4.0.2': {} - /@types/http-errors@2.0.2: - resolution: {integrity: sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==} - dev: true + '@types/http-errors@2.0.2': {} - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true + '@types/istanbul-lib-coverage@2.0.4': {} - /@types/istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==} + '@types/istanbul-lib-report@3.0.1': dependencies: '@types/istanbul-lib-coverage': 2.0.4 - dev: true - /@types/istanbul-reports@3.0.2: - resolution: {integrity: sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==} + '@types/istanbul-reports@3.0.2': dependencies: '@types/istanbul-lib-report': 3.0.1 - dev: true - /@types/js-cookie@2.2.7: - resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} - dev: false + '@types/js-cookie@2.2.7': {} - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: true + '@types/json-schema@7.0.12': {} - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true + '@types/json5@0.0.29': {} - /@types/lodash-es@4.17.9: - resolution: {integrity: sha512-ZTcmhiI3NNU7dEvWLZJkzG6ao49zOIjEgIE0RgV7wbPxU0f2xT3VSAHw2gmst8swH6V0YkLRGp4qPlX/6I90MQ==} + '@types/lodash-es@4.17.9': dependencies: '@types/lodash': 4.14.199 - dev: true - /@types/lodash@4.14.199: - resolution: {integrity: sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==} - dev: true + '@types/lodash@4.14.199': {} - /@types/mdast@4.0.3: - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + '@types/mdast@4.0.3': dependencies: '@types/unist': 2.0.8 - dev: false - /@types/mdx@2.0.8: - resolution: {integrity: sha512-r7/zWe+f9x+zjXqGxf821qz++ld8tp6Z4jUS6qmPZUXH6tfh4riXOhAqb12tWGWAevCFtMt1goLWkQMqIJKpsA==} - dev: true + '@types/mdx@2.0.8': {} - /@types/mime-types@2.1.2: - resolution: {integrity: sha512-q9QGHMGCiBJCHEvd4ZLdasdqXv570agPsUW0CeIm/B8DzhxsYMerD0l3IlI+EQ1A2RWHY2mmM9x1YIuuWxisCg==} - dev: true + '@types/mime-types@2.1.2': {} - /@types/mime@1.3.3: - resolution: {integrity: sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==} - dev: true + '@types/mime@1.3.3': {} - /@types/mime@3.0.2: - resolution: {integrity: sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ==} - dev: true + '@types/mime@3.0.2': {} - /@types/minimatch@5.1.2: - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - dev: true + '@types/minimatch@5.1.2': {} - /@types/minimist@1.2.3: - resolution: {integrity: sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==} - dev: true + '@types/minimist@1.2.3': {} - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - dev: false + '@types/ms@0.7.34': {} - /@types/node-fetch@2.6.6: - resolution: {integrity: sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==} + '@types/node-fetch@2.6.6': dependencies: '@types/node': 20.8.0 form-data: 4.0.0 - dev: true - /@types/node@14.18.56: - resolution: {integrity: sha512-+k+57NVS9opgrEn5l9c0gvD1r6C+PtyhVE4BTnMMRwiEA8ZO8uFcs6Yy2sXIy0eC95ZurBtRSvhZiHXBysbl6w==} + '@types/node@14.18.56': {} - /@types/node@16.18.58: - resolution: {integrity: sha512-YGncyA25/MaVtQkjWW9r0EFBukZ+JulsLcVZBlGUfIb96OBMjkoRWwQo5IEWJ8Fj06Go3GHw+bjYDitv6BaGsA==} - dev: true + '@types/node@16.18.58': {} - /@types/node@20.11.19: - resolution: {integrity: sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==} - requiresBuild: true + '@types/node@20.11.19': dependencies: undici-types: 5.26.5 optional: true - /@types/node@20.12.7: - resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + '@types/node@20.12.7': dependencies: undici-types: 5.26.5 - /@types/node@20.8.0: - resolution: {integrity: sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==} + '@types/node@20.8.0': {} - /@types/node@20.8.10: - resolution: {integrity: sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==} + '@types/node@20.8.10': dependencies: undici-types: 5.26.5 - /@types/normalize-package-data@2.4.2: - resolution: {integrity: sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==} - dev: true + '@types/normalize-package-data@2.4.2': {} - /@types/offscreencanvas@2019.7.2: - resolution: {integrity: sha512-ujCjOxeA07IbEBQYAkoOI+XFw5sT3nhWJ/xZfPR6reJppDG7iPQPZacQiLTtWH1b3a2NYXWlxvYqa40y/LAixQ==} - dev: false + '@types/offscreencanvas@2019.7.2': {} - /@types/parse-json@4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - dev: false + '@types/parse-json@4.0.0': {} - /@types/pretty-hrtime@1.0.1: - resolution: {integrity: sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==} - dev: true + '@types/pretty-hrtime@1.0.1': {} - /@types/prop-types@15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + '@types/prop-types@15.7.5': {} - /@types/qs@6.9.8: - resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} - dev: true + '@types/qs@6.9.8': {} - /@types/range-parser@1.2.5: - resolution: {integrity: sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==} - dev: true + '@types/range-parser@1.2.5': {} - /@types/rbush@3.0.1: - resolution: {integrity: sha512-0LecKcQjuJ/PclmThftzePIKXaKt7OMjoZZ3Xf17Ebd28ZU6OFUu1mObbvV74YXS1W3APdZO5GRHyD/ezGK4Vg==} - dev: false + '@types/rbush@3.0.1': {} - /@types/react-dom@18.2.7: - resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} + '@types/react-dom@18.2.7': dependencies: '@types/react': 18.2.20 - /@types/react-transition-group@4.4.7: - resolution: {integrity: sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg==} + '@types/react-transition-group@4.4.7': dependencies: '@types/react': 18.2.20 - dev: true - /@types/react@18.2.20: - resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} + '@types/react@18.2.20': dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 csstype: 3.1.2 - /@types/readable-stream@4.0.11: - resolution: {integrity: sha512-R3eUMUTTKoIoaz7UpYLxvZCrOmCRPRbAmoDDHKcimTEySltaJhF8hLzj4+EzyDifiX5eK6oDQGSfmNnXjxZzYQ==} + '@types/readable-stream@4.0.11': dependencies: '@types/node': 20.12.7 safe-buffer: 5.1.2 - /@types/resolve@1.17.1: - resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + '@types/resolve@1.17.1': dependencies: '@types/node': 20.8.10 - dev: false - /@types/sat@0.0.31: - resolution: {integrity: sha512-P4SVw79XheP1p92useDVpLYYOUQ6lpw2L7IdQz4dD23DZ8DiC1STgPOh72hjR5IZJBPQbzlICAbmjCKbwyYuxg==} - dev: false + '@types/sat@0.0.31': {} - /@types/scheduler@0.16.3: - resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + '@types/scheduler@0.16.3': {} - /@types/semver@7.5.3: - resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} - dev: true + '@types/semver@7.5.3': {} - /@types/send@0.17.2: - resolution: {integrity: sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==} + '@types/send@0.17.2': dependencies: '@types/mime': 1.3.3 '@types/node': 20.8.10 - dev: true - /@types/serve-static@1.15.3: - resolution: {integrity: sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==} + '@types/serve-static@1.15.3': dependencies: '@types/http-errors': 2.0.2 '@types/mime': 3.0.2 '@types/node': 20.8.0 - dev: true - /@types/sinonjs__fake-timers@8.1.1: - resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} + '@types/sinonjs__fake-timers@8.1.1': {} - /@types/sizzle@2.3.3: - resolution: {integrity: sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==} + '@types/sizzle@2.3.3': {} - /@types/stats.js@0.17.1: - resolution: {integrity: sha512-OgfYE1x2w1jRUXzzKABX+kOdwz2y9PE0uSwnZabkWfJTWOzm7Pvfm4JI2xqRE0q2nwUe2jZLWcrcnhd9lQU63w==} + '@types/stats.js@0.17.1': {} - /@types/three@0.154.0: - resolution: {integrity: sha512-IioqpGhch6FdLDh4zazRn3rXHj6Vn2nVOziJdXVbJFi9CaI65LtP9qqUtpzbsHK2Ezlox8NtsLNHSw3AQzucjA==} + '@types/three@0.154.0': dependencies: '@tweenjs/tween.js': 18.6.4 '@types/stats.js': 0.17.1 @@ -5241,72 +11639,42 @@ packages: fflate: 0.6.10 lil-gui: 0.17.0 meshoptimizer: 0.18.1 - dev: true - /@types/three@0.156.0: - resolution: {integrity: sha512-733bXDSRdlrxqOmQuOmfC1UBRuJ2pREPk8sWnx9MtIJEVDQMx8U0NQO5MVVaOrjzDPyLI+cFPim2X/ss9v0+LQ==} + '@types/three@0.156.0': dependencies: '@types/stats.js': 0.17.1 '@types/webxr': 0.5.7 fflate: 0.6.10 meshoptimizer: 0.18.1 - dev: false - /@types/trusted-types@2.0.3: - resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} + '@types/trusted-types@2.0.3': {} - /@types/ua-parser-js@0.7.39: - resolution: {integrity: sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==} - dev: true + '@types/ua-parser-js@0.7.39': {} - /@types/unist@2.0.8: - resolution: {integrity: sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==} + '@types/unist@2.0.8': {} - /@types/unist@3.0.2: - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - dev: false + '@types/unist@3.0.2': {} - /@types/webxr@0.5.7: - resolution: {integrity: sha512-Rcgs5c2eNFnHp53YOjgtKfl/zWX1Y+uFGUwlSXrWcZWu3yhANRezmph4MninmqybUYT6g9ZE0aQ9QIdPkLR3Kg==} + '@types/webxr@0.5.7': {} - /@types/wicg-file-system-access@2023.10.2: - resolution: {integrity: sha512-nSiK8qt0O7sQmDcW3HYfvya7GDoD6ipgdcUFzk3QN+UBIqXeNg38Nh6VnKv7EIPfkVETRiquyMskCbpxUzgX1Q==} - dev: false + '@types/wicg-file-system-access@2023.10.2': {} - /@types/yargs-parser@21.0.1: - resolution: {integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==} - dev: true + '@types/yargs-parser@21.0.1': {} - /@types/yargs@17.0.28: - resolution: {integrity: sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw==} + '@types/yargs@17.0.28': dependencies: '@types/yargs-parser': 21.0.1 - dev: true - /@types/yauzl@2.10.1: - resolution: {integrity: sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw==} - requiresBuild: true + '@types/yauzl@2.10.1': dependencies: '@types/node': 20.8.0 - dev: true - /@types/yauzl@2.10.3: - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - requiresBuild: true + '@types/yauzl@2.10.3': dependencies: '@types/node': 20.11.19 optional: true - /@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2): - resolution: {integrity: sha512-qg7Bm5TyP/I7iilGyp6DRqqkt8na00lI6HbjWZObgk3FFSzH5ypRwAHXJhJkwiRtTcfn+xYQIMOR5kJgpo6upw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2)': dependencies: '@eslint-community/regexpp': 4.8.0 '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) @@ -5322,20 +11690,12 @@ packages: natural-compare-lite: 1.4.0 semver: 7.5.4 ts-api-utils: 1.0.3(typescript@5.2.2) + optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2): - resolution: {integrity: sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2)': dependencies: '@typescript-eslint/scope-manager': 6.7.3 '@typescript-eslint/types': 6.7.3 @@ -5343,65 +11703,38 @@ packages: '@typescript-eslint/visitor-keys': 6.7.3 debug: 4.3.4(supports-color@8.1.1) eslint: 8.50.0 + optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@6.1.0: - resolution: {integrity: sha512-AxjgxDn27hgPpe2rQe19k0tXw84YCOsjDJ2r61cIebq1t+AIxbgiXKvD4999Wk49GVaAcdJ/d49FYel+Pp3jjw==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@6.1.0': dependencies: '@typescript-eslint/types': 6.1.0 '@typescript-eslint/visitor-keys': 6.1.0 - dev: true - /@typescript-eslint/scope-manager@6.7.3: - resolution: {integrity: sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@6.7.3': dependencies: '@typescript-eslint/types': 6.7.3 '@typescript-eslint/visitor-keys': 6.7.3 - dev: true - /@typescript-eslint/type-utils@6.1.0(eslint@8.50.0)(typescript@5.2.2): - resolution: {integrity: sha512-kFXBx6QWS1ZZ5Ni89TyT1X9Ag6RXVIVhqDs0vZE/jUeWlBv/ixq2diua6G7ece6+fXw3TvNRxP77/5mOMusx2w==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@6.1.0(eslint@8.50.0)(typescript@5.2.2)': dependencies: '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.2.2) '@typescript-eslint/utils': 6.1.0(eslint@8.50.0)(typescript@5.2.2) debug: 4.3.4(supports-color@8.1.1) eslint: 8.50.0 ts-api-utils: 1.0.3(typescript@5.2.2) + optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@6.1.0: - resolution: {integrity: sha512-+Gfd5NHCpDoHDOaU/yIF3WWRI2PcBRKKpP91ZcVbL0t5tQpqYWBs3z/GGhvU+EV1D0262g9XCnyqQh19prU0JQ==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true + '@typescript-eslint/types@6.1.0': {} - /@typescript-eslint/types@6.7.3: - resolution: {integrity: sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true + '@typescript-eslint/types@6.7.3': {} - /@typescript-eslint/typescript-estree@6.1.0(typescript@5.2.2): - resolution: {integrity: sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@6.1.0(typescript@5.2.2)': dependencies: '@typescript-eslint/types': 6.1.0 '@typescript-eslint/visitor-keys': 6.1.0 @@ -5410,19 +11743,12 @@ packages: is-glob: 4.0.3 semver: 7.6.0 ts-api-utils: 1.0.3(typescript@5.2.2) + optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/typescript-estree@6.7.3(typescript@5.2.2): - resolution: {integrity: sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@6.7.3(typescript@5.2.2)': dependencies: '@typescript-eslint/types': 6.7.3 '@typescript-eslint/visitor-keys': 6.7.3 @@ -5431,16 +11757,12 @@ packages: is-glob: 4.0.3 semver: 7.6.0 ts-api-utils: 1.0.3(typescript@5.2.2) + optionalDependencies: typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@6.1.0(eslint@8.50.0)(typescript@5.2.2): - resolution: {integrity: sha512-wp652EogZlKmQoMS5hAvWqRKplXvkuOnNzZSE0PVvsKjpexd/XznRVHAtrfHFYmqaJz0DFkjlDsGYC9OXw+OhQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@6.1.0(eslint@8.50.0)(typescript@5.2.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) '@types/json-schema': 7.0.12 @@ -5453,122 +11775,84 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@6.1.0: - resolution: {integrity: sha512-yQeh+EXhquh119Eis4k0kYhj9vmFzNpbhM3LftWQVwqVjipCkwHBQOZutcYW+JVkjtTG9k8nrZU1UoNedPDd1A==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@6.1.0': dependencies: '@typescript-eslint/types': 6.1.0 eslint-visitor-keys: 3.4.3 - dev: true - /@typescript-eslint/visitor-keys@6.7.3: - resolution: {integrity: sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@6.7.3': dependencies: '@typescript-eslint/types': 6.7.3 eslint-visitor-keys: 3.4.3 - dev: true - /@vitejs/plugin-react@3.1.0(vite@4.5.3): - resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.1.0-beta.0 + '@vitejs/plugin-react@3.1.0(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2))': dependencies: '@babel/core': 7.22.11 '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.11) '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.11) magic-string: 0.27.0 react-refresh: 0.14.0 - vite: 4.5.3 + vite: 4.5.3(@types/node@20.8.0)(terser@5.19.2) transitivePeerDependencies: - supports-color - dev: true - /@vitest/expect@0.34.6: - resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} + '@vitest/expect@0.34.6': dependencies: '@vitest/spy': 0.34.6 '@vitest/utils': 0.34.6 chai: 4.3.10 - dev: true - /@vitest/runner@0.34.6: - resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} + '@vitest/runner@0.34.6': dependencies: '@vitest/utils': 0.34.6 p-limit: 4.0.0 pathe: 1.1.1 - dev: true - /@vitest/snapshot@0.34.6: - resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} + '@vitest/snapshot@0.34.6': dependencies: magic-string: 0.30.4 pathe: 1.1.1 pretty-format: 29.7.0 - dev: true - /@vitest/spy@0.34.6: - resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} + '@vitest/spy@0.34.6': dependencies: tinyspy: 2.2.0 - dev: true - /@vitest/utils@0.34.6: - resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} + '@vitest/utils@0.34.6': dependencies: diff-sequences: 29.6.3 loupe: 2.3.6 pretty-format: 29.7.0 - dev: true - /@xboxreplay/errors@0.1.0: - resolution: {integrity: sha512-Tgz1d/OIPDWPeyOvuL5+aai5VCcqObhPnlI3skQuf80GVF3k1I0lPCnGC+8Cm5PV9aLBT5m8qPcJoIUQ2U4y9g==} + '@xboxreplay/errors@0.1.0': {} - /@xboxreplay/xboxlive-auth@3.3.3(debug@4.3.4): - resolution: {integrity: sha512-j0AU8pW10LM8O68CTZ5QHnvOjSsnPICy0oQcP7zyM7eWkDQ/InkiQiirQKsPn1XRYDl4ccNu0WM582s3UKwcBg==} + '@xboxreplay/xboxlive-auth@3.3.3(debug@4.3.4)': dependencies: '@xboxreplay/errors': 0.1.0 axios: 0.21.4(debug@4.3.4) transitivePeerDependencies: - debug - /@xmcl/asm@1.0.1: - resolution: {integrity: sha512-7vCVgm1E1IZ2cujiitFk9550Vgu2XAOn1ff90di638fMmTK0XkFMXKsSR/nGZmYKt+XiTMI/0B3TvreqbVjOug==} - engines: {node: '>=16'} - dev: true + '@xmcl/asm@1.0.1': {} - /@xmcl/core@2.12.0(yauzl@2.10.0): - resolution: {integrity: sha512-rcxy29i2fjGFpe6sEvaJxYHFGlfYMcJwElbk6TIUCrKNOiMhyLZeBtCJSk38hvaYF0kiROA3c4EJeWNGHf2zVw==} - engines: {node: '>=16.0'} + '@xmcl/core@2.12.0(yauzl@2.10.0)': dependencies: '@xmcl/unzip': 2.1.2(yauzl@2.10.0) transitivePeerDependencies: - yauzl - dev: true - /@xmcl/file-transfer@1.0.3: - resolution: {integrity: sha512-p5JsUQpNShqW4VpqaKXcQzYSO9o/9UGjXZfb5aNt/24Ty+j9qepQyPo4P1CFwfzgFuf9GGhH5cPUi6nShlKS+g==} - engines: {node: '>=16.0'} + '@xmcl/file-transfer@1.0.3': dependencies: '@types/http-cache-semantics': 4.0.2 http-cache-semantics: 4.1.1 undici: 5.25.4 - dev: true - /@xmcl/forge-site-parser@2.0.9: - resolution: {integrity: sha512-OHKG2KYE+F6TSeOQmymuGoqEifxbJb3w3X/hmxMNeqtewiYukJldPmKO559ZFnZnOuMQEnr+X0dMbTQwWs5dFg==} - engines: {node: '>=16'} + '@xmcl/forge-site-parser@2.0.9': dependencies: node-html-parser: 6.1.10 - dev: true - /@xmcl/installer@5.1.0: - resolution: {integrity: sha512-KpoxpfYdUWH4U4Yat7RifS1JZajArOdfgsJ/LdU90y6Fc3hKhHSJsiRudk1VxASTyMXKCM0lWVxH5JzywRHBDw==} - engines: {node: '>=16.0'} + '@xmcl/installer@5.1.0': dependencies: '@xmcl/asm': 1.0.1 '@xmcl/core': 2.12.0(yauzl@2.10.0) @@ -5578,82 +11862,55 @@ packages: '@xmcl/unzip': 2.1.2(yauzl@2.10.0) undici: 5.25.4 yauzl: 2.10.0 - dev: true - /@xmcl/task@4.0.6: - resolution: {integrity: sha512-h0AR7DQm6xxBgROPnRi0EY8DlaDQwuGzPA5lFRMD4EsnpHJ/3fPdzwbMLb81ZxKJlLSCn3hVR2yI0mSKIm5Heg==} - dev: true + '@xmcl/task@4.0.6': {} - /@xmcl/text-component@2.1.3: - resolution: {integrity: sha512-LdUZgC5+8F23J2ZkZi7aZb87QBNfxwJqhUyts8YBQYwxQPwei20TOBm2hr69euoAeDo7NDfbLXssD4mUvsAS0Q==} - engines: {node: '>=16'} - dev: false + '@xmcl/text-component@2.1.3': {} - /@xmcl/unzip@2.1.2(yauzl@2.10.0): - resolution: {integrity: sha512-Lm/eg/e0/p+sfj/RT2QDpsBAf39DZqQ3+XvX1JXZPb64wnjwOf8CGU1WPv6BseEcJ5CMOpm0s2NyrEQD04y0UQ==} - engines: {node: '>=16'} - peerDependencies: - yauzl: ^2.10.0 + '@xmcl/unzip@2.1.2(yauzl@2.10.0)': dependencies: '@types/yauzl': 2.10.1 yauzl: 2.10.0 - dev: true - /@xobotyi/scrollbar-width@1.9.5: - resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} - dev: false + '@xobotyi/scrollbar-width@1.9.5': {} - /@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.18.20): - resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} - engines: {node: '>=14.15.0'} - peerDependencies: - esbuild: '>=0.10.0' + '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.18.20)': dependencies: esbuild: 0.18.20 tslib: 2.6.2 - dev: true - /@yarnpkg/fslib@2.10.3: - resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} + '@yarnpkg/fslib@2.10.3': dependencies: '@yarnpkg/libzip': 2.3.0 tslib: 1.14.1 - dev: true - /@yarnpkg/libzip@2.3.0: - resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} + '@yarnpkg/libzip@2.3.0': dependencies: '@types/emscripten': 1.39.8 tslib: 1.14.1 - dev: true - /@zardoy/flying-squid@0.0.17: - resolution: {integrity: sha512-qGCS7aRmMflDdIN7IGLpDc0W2gUYc5OQ45KEn3XtcxwOP0Q7zyvo3mnsD5KSV3n2lyhQ4783Ov8V6J86xea0lw==} - engines: {node: '>=8'} - hasBin: true + '@zardoy/flying-squid@0.0.17(encoding@0.1.13)': dependencies: change-case: 4.1.2 colors: 1.4.0 - diamond-square: github.com/zardoy/diamond-square/915fce8e27fe8eb45464d89b9563956afa4f7687 + diamond-square: https://codeload.github.com/zardoy/diamond-square/tar.gz/915fce8e27fe8eb45464d89b9563956afa4f7687 emit-then: 2.0.0 event-promise: 0.0.1 exit-hook: 2.2.1 flatmap: 0.0.3 long: 5.2.3 minecraft-data: 3.62.0 - minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f + minecraft-protocol: https://codeload.github.com/zardoy/minecraft-protocol/tar.gz/2c14a686bfe7cbd9a5c87b629b402295ee86219f(encoding@0.1.13) mkdirp: 2.1.6 node-gzip: 1.1.2 node-rsa: 1.1.1 - prismarine-chunk: github.com/zardoy/prismarine-chunk/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 - prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0) + prismarine-provider-anvil: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0) prismarine-windows: 2.9.0 - prismarine-world: github.com/zardoy/prismarine-world/6ae6f009d38460de284f8c226c665f04cbad9465 + prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465 random-seed: 0.3.0 range: 0.0.3 readline: 1.3.0 @@ -5665,298 +11922,176 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /@zardoy/react-util@0.2.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-glABtx54mh4XSaK6BNALWE3mlshPjcPwPsRj/GnOXEA7WJY/6n43iJoukbaYF3758mGZRU5Fq6gklyFjBg0yHQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - react: ^18.2.0 - react-dom: ^18.0.0 + '@zardoy/react-util@0.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: classnames: 2.3.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /@zardoy/utils@0.0.11: - resolution: {integrity: sha512-d6xBnSFCOa98HcL52xSBflJKjKpxfRhtr1eVexy89YujeCHSQhUMmSz9h07xyrulfW60k9tSeYH5reuqoh4l4w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + '@zardoy/utils@0.0.11': dependencies: escape-string-regexp: 4.0.0 lodash.compact: 3.0.1 rambda: 6.9.0 type-fest: 2.19.0 - dev: false - /Base64@0.2.1: - resolution: {integrity: sha512-reGEWshDmTDQDsCec/HduOO9Wyj6yMOupMfhIf3ugN1TDlK2NQW4DDJSqNNtp380SNcvRfXtO8HSCQot0d0SMw==} - dev: true + Base64@0.2.1: {} - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: false + abbrev@1.1.1: {} - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-jsx@5.3.2(acorn@7.4.1): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@7.4.1): dependencies: acorn: 7.4.1 - dev: true - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.10.0): dependencies: acorn: 8.10.0 - dev: true - /acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - dev: true + acorn-walk@7.2.0: {} - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true + acorn-walk@8.2.0: {} - /acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@7.4.1: {} - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@8.10.0: {} - /address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} - dev: true + address@1.2.2: {} - /adm-zip@0.5.12: - resolution: {integrity: sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==} - engines: {node: '>=6.0'} - dev: false + adm-zip@0.5.12: {} - /aes-js@3.1.2: - resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} + aes-js@3.1.2: {} - /after@0.8.2: - resolution: {integrity: sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==} - dev: false + after@0.8.2: {} - /agent-base@5.1.1: - resolution: {integrity: sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==} - engines: {node: '>= 6.0.0'} - dev: true + agent-base@5.1.1: {} - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + agent-base@6.0.2: dependencies: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: false - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} - engines: {node: '>= 14'} + agent-base@7.1.0: dependencies: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - /agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - requiresBuild: true + agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 - dev: false optional: true - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: false - /animejs@3.2.1: - resolution: {integrity: sha512-sWno3ugFryK5nhiDm/2BKeFCpZv7vzerWUcUPyAZLDhMek3+S/p418ldZJbJXo5ZUOpfm2kP2XRO4NJcULMy9A==} - dev: false + animejs@3.2.1: {} - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + ansi-colors@4.1.3: {} - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.1: {} - /any-base@1.1.0: - resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==} - dev: false + any-base@1.1.0: {} - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false + any-promise@1.3.0: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true - /app-root-dir@1.0.2: - resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} - dev: true + app-root-dir@1.0.2: {} - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: false + aproba@2.0.0: {} - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + arch@2.2.0: {} - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} + are-we-there-yet@2.0.0: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - dev: false - /are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - requiresBuild: true + are-we-there-yet@3.0.1: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - dev: false optional: true - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + argparse@2.0.1: {} - /aria-hidden@1.2.3: - resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} - engines: {node: '>=10'} + aria-hidden@1.2.3: dependencies: tslib: 2.6.2 - dev: true - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + array-buffer-byte-length@1.0.0: dependencies: call-bind: 1.0.2 is-array-buffer: 3.0.2 - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - dev: true - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + array-flatten@1.1.1: {} - /array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} - engines: {node: '>= 0.4'} + array-includes@3.1.7: dependencies: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 get-intrinsic: 1.2.1 is-string: 1.0.7 - dev: true - /array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} + array-includes@3.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -5964,16 +12099,10 @@ packages: es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 - dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} + array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -5981,50 +12110,37 @@ packages: es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 es-shim-unscopables: 1.0.0 - dev: true - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 es-shim-unscopables: 1.0.0 - dev: true - /array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + array.prototype.toreversed@1.1.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + array.prototype.tosorted@1.1.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - dev: true - /arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.2: dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.2 @@ -6034,9 +12150,7 @@ packages: is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -6046,132 +12160,84 @@ packages: get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - dev: true - /arraybuffer.slice@0.0.7: - resolution: {integrity: sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==} - dev: false + arraybuffer.slice@0.0.7: {} - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true + arrify@1.0.1: {} - /asap@1.0.0: - resolution: {integrity: sha512-Ej9qjcXY+8Tuy1cNqiwNMwFRXOy9UwgTeMA8LxreodygIPV48lx8PU1ecFxb5ZeU1DpMKxiq6vGLTxcitWZPbA==} - dev: false + asap@1.0.0: {} - /asn1.js@5.4.1: - resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + asn1.js@5.4.1: dependencies: bn.js: 4.12.0 inherits: 2.0.4 minimalistic-assert: 1.0.1 safer-buffer: 2.1.2 - dev: true - /asn1@0.2.3: - resolution: {integrity: sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w==} + asn1@0.2.3: {} - /asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + asn1@0.2.6: dependencies: safer-buffer: 2.1.2 - /assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} + assert-plus@1.0.0: {} - /assert@2.0.0: - resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} + assert@2.0.0: dependencies: es6-object-assign: 1.1.0 is-nan: 1.3.2 object-is: 1.1.5 util: 0.12.5 - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true + assertion-error@1.1.0: {} - /ast-types@0.14.2: - resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} - engines: {node: '>=4'} + ast-types@0.14.2: dependencies: tslib: 2.6.2 - dev: true - /ast-types@0.15.2: - resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} - engines: {node: '>=4'} + ast-types@0.15.2: dependencies: tslib: 2.6.2 - dev: true - /ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} + ast-types@0.16.1: dependencies: tslib: 2.6.2 - dev: true - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} + astral-regex@2.0.0: {} - /async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + async-limiter@1.0.1: {} - /async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + async@2.6.4: dependencies: lodash: 4.17.21 - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + async@3.2.5: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + asynckit@0.4.0: {} - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} + at-least-node@1.0.0: {} - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.5: {} - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - dev: true - /aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + aws-sign2@0.7.0: {} - /aws4@1.12.0: - resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + aws4@1.12.0: {} - /axios@0.21.4(debug@4.3.4): - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + axios@0.21.4(debug@4.3.4): dependencies: follow-redirects: 1.15.6(debug@4.3.4) transitivePeerDependencies: - debug - /babel-core@7.0.0-bridge.0(@babel/core@7.22.11): - resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + babel-core@7.0.0-bridge.0(@babel/core@7.22.11): dependencies: '@babel/core': 7.22.11 - dev: true - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.22.5 '@istanbuljs/load-nyc-config': 1.1.0 @@ -6180,21 +12246,14 @@ packages: test-exclude: 6.0.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} + babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.22.11 cosmiconfig: 7.1.0 resolve: 1.22.4 - dev: false - /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.11): - resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.11): dependencies: '@babel/compat-data': 7.22.9 '@babel/core': 7.22.11 @@ -6203,10 +12262,7 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.11): - resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.11): dependencies: '@babel/core': 7.22.11 '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.11) @@ -6214,115 +12270,68 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.11): - resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.11): dependencies: '@babel/core': 7.22.11 '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.11) transitivePeerDependencies: - supports-color - /backo2@1.0.2: - resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} - dev: false + backo2@1.0.2: {} - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: false + bail@2.0.2: {} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@1.0.2: {} - /base64-arraybuffer@0.1.4: - resolution: {integrity: sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==} - engines: {node: '>= 0.6.0'} - dev: false + base64-arraybuffer@0.1.4: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64-js@1.5.1: {} - /base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - dev: false + base64id@2.0.0: {} - /basic-auth@2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} + basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 - dev: true - /bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + bcrypt-pbkdf@1.0.2: dependencies: tweetnacl: 0.14.5 - /better-opn@3.0.2: - resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} - engines: {node: '>=12.0.0'} + better-opn@3.0.2: dependencies: open: 8.4.2 - dev: true - /big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} - dev: true + big-integer@1.6.51: {} - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true + binary-extensions@2.2.0: {} - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - requiresBuild: true + bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 - dev: false optional: true - /bit-twiddle@1.0.2: - resolution: {integrity: sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==} - requiresBuild: true - dev: false + bit-twiddle@1.0.2: optional: true - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - /blob-util@2.0.2: - resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} + blob-util@2.0.2: {} - /blob@0.0.5: - resolution: {integrity: sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==} - dev: false + blob@0.0.5: {} - /bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + bluebird@3.7.2: {} - /bmp-js@0.1.0: - resolution: {integrity: sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==} - dev: false + bmp-js@0.1.0: {} - /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - dev: true + bn.js@4.12.0: {} - /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - dev: true + bn.js@5.2.1: {} - /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.1: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -6339,9 +12348,7 @@ packages: transitivePeerDependencies: - supports-color - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -6357,47 +12364,37 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: false - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true + boolbase@1.0.0: {} - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} + bplist-parser@0.2.0: dependencies: big-integer: 1.6.51 - dev: true - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - dev: true - /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - dev: true + brorand@1.1.0: {} - /browser-assert@1.2.1: - resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} - dev: true + browser-assert@1.2.1: {} - /browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + browserfs@https://codeload.github.com/zardoy/browserfs/tar.gz/ab58ae8ef00e3a31db01909e365e6cb5188436e0: {} + + browserfs@https://codeload.github.com/zardoy/browserfs/tar.gz/e60ca69e74888e057a96a468afe1d62347d3f56f: + dependencies: + async: 2.6.4 + + browserify-aes@1.2.0: dependencies: buffer-xor: 1.0.3 cipher-base: 1.0.4 @@ -6405,34 +12402,26 @@ packages: evp_bytestokey: 1.0.3 inherits: 2.0.4 safe-buffer: 5.2.1 - dev: true - /browserify-cipher@1.0.1: - resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + browserify-cipher@1.0.1: dependencies: browserify-aes: 1.2.0 browserify-des: 1.0.2 evp_bytestokey: 1.0.3 - dev: true - /browserify-des@1.0.2: - resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + browserify-des@1.0.2: dependencies: cipher-base: 1.0.4 des.js: 1.1.0 inherits: 2.0.4 safe-buffer: 5.2.1 - dev: true - /browserify-rsa@4.1.0: - resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + browserify-rsa@4.1.0: dependencies: bn.js: 5.2.1 randombytes: 2.1.0 - dev: true - /browserify-sign@4.2.1: - resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==} + browserify-sign@4.2.1: dependencies: bn.js: 5.2.1 browserify-rsa: 4.1.0 @@ -6443,86 +12432,55 @@ packages: parse-asn1: 5.1.6 readable-stream: 3.6.2 safe-buffer: 5.2.1 - dev: true - /browserify-zlib@0.1.4: - resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} + browserify-zlib@0.1.4: dependencies: pako: 0.2.9 - dev: true - /browserify-zlib@0.2.0: - resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + browserify-zlib@0.2.0: dependencies: pako: 1.0.11 - dev: true - /browserslist@4.21.10: - resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.21.10: dependencies: caniuse-lite: 1.0.30001524 electron-to-chromium: 1.4.504 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.10) - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + bser@2.1.1: dependencies: node-int64: 0.4.0 - dev: true - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-crc32@0.2.13: {} - /buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + buffer-equal-constant-time@1.0.1: {} - /buffer-equal@0.0.1: - resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==} - engines: {node: '>=0.4.0'} - dev: false + buffer-equal@0.0.1: {} - /buffer-equal@1.0.1: - resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} - engines: {node: '>=0.4'} + buffer-equal@1.0.1: {} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-from@1.1.2: {} - /buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - dev: true + buffer-xor@1.0.3: {} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} + builtin-modules@3.3.0: {} - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} + bytes@3.0.0: {} - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + bytes@3.1.2: {} - /c8@7.14.0: - resolution: {integrity: sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==} - engines: {node: '>=10.12.0'} - hasBin: true + c8@7.14.0: dependencies: '@bcoe/v8-coverage': 0.2.3 '@istanbuljs/schema': 0.1.3 @@ -6536,17 +12494,10 @@ packages: v8-to-istanbul: 9.1.3 yargs: 16.2.0 yargs-parser: 20.2.9 - dev: true - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true + cac@6.7.14: {} - /cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - requiresBuild: true + cacache@16.1.3: dependencies: '@npmcli/fs': 2.1.2 '@npmcli/move-file': 2.0.1 @@ -6568,22 +12519,16 @@ packages: unique-filename: 2.0.1 transitivePeerDependencies: - bluebird - dev: false optional: true - /cachedir@2.4.0: - resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} - engines: {node: '>=6'} + cachedir@2.4.0: {} - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + call-bind@1.0.2: dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.1 - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 @@ -6591,68 +12536,44 @@ packages: get-intrinsic: 1.2.4 set-function-length: 1.2.1 - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + callsites@3.1.0: {} - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + camel-case@4.1.2: dependencies: pascal-case: 3.1.2 tslib: 2.6.2 - dev: false - /camelcase-keys@7.0.2: - resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} - engines: {node: '>=12'} + camelcase-keys@7.0.2: dependencies: camelcase: 6.3.0 map-obj: 4.3.0 quick-lru: 5.1.1 type-fest: 1.4.0 - dev: true - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true + camelcase@5.3.1: {} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true + camelcase@6.3.0: {} - /caniuse-lite@1.0.30001524: - resolution: {integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==} + caniuse-lite@1.0.30001524: {} - /canvas@2.11.2: - resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} - engines: {node: '>=6'} - requiresBuild: true + canvas@2.11.2(encoding@0.1.13): dependencies: - '@mapbox/node-pre-gyp': 1.0.11 + '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) nan: 2.18.0 simple-get: 3.1.1 transitivePeerDependencies: - encoding - supports-color - dev: false - /capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + capital-case@1.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 - dev: false - /caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + caseless@0.12.0: {} - /cbor-extract@2.2.0: - resolution: {integrity: sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==} - hasBin: true - requiresBuild: true + cbor-extract@2.2.0: dependencies: node-gyp-build-optional-packages: 5.1.1 optionalDependencies: @@ -6662,18 +12583,13 @@ packages: '@cbor-extract/cbor-extract-linux-arm64': 2.2.0 '@cbor-extract/cbor-extract-linux-x64': 2.2.0 '@cbor-extract/cbor-extract-win32-x64': 2.2.0 - dev: false optional: true - /cbor-x@1.5.4: - resolution: {integrity: sha512-PVKILDn+Rf6MRhhcyzGXi5eizn1i0i3F8Fe6UMMxXBnWkalq9+C5+VTmlIjAYM4iF2IYF2N+zToqAfYOp+3rfw==} + cbor-x@1.5.4: optionalDependencies: cbor-extract: 2.2.0 - dev: false - /chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} - engines: {node: '>=4'} + chai@4.3.10: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -6682,25 +12598,19 @@ packages: loupe: 2.3.6 pathval: 1.1.1 type-detect: 4.0.8 - dev: true - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + change-case@4.1.2: dependencies: camel-case: 4.1.2 capital-case: 1.0.4 @@ -6714,29 +12624,18 @@ packages: sentence-case: 3.0.4 snake-case: 3.0.4 tslib: 2.6.2 - dev: false - /change-case@5.1.2: - resolution: {integrity: sha512-CAtbGEDulyjzs05RXy3uKcwqeztz/dMEuAc1Xu9NQBsbrhuGMneL0u9Dj5SoutLKBFYun8txxYIwhjtLNfUmCA==} - dev: false + change-case@5.1.2: {} - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: false + character-entities@2.0.2: {} - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 - dev: true - /check-more-types@2.24.0: - resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} - engines: {node: '>= 0.8.0'} + check-more-types@2.24.0: {} - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + chokidar@3.5.3: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -6747,207 +12646,124 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: true - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chownr@1.1.4: {} - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + chownr@2.0.0: {} - /ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} + ci-info@3.8.0: {} - /cipher-base@1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + cipher-base@1.0.4: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - dev: true - /classnames@2.3.2: - resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} - dev: false + classnames@2.3.2: {} - /clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + clean-stack@2.2.0: {} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - /cli-spinners@2.9.1: - resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} - engines: {node: '>=6'} - dev: true + cli-spinners@2.9.1: {} - /cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} - engines: {node: 10.* || >= 12.*} + cli-table3@0.6.3: dependencies: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 - /cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} + cli-truncate@2.1.0: dependencies: slice-ansi: 3.0.0 string-width: 4.2.3 - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@7.0.4: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: false - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + clone-deep@4.0.1: dependencies: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 - dev: true - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true + clone@1.0.4: {} - /clsx@1.1.1: - resolution: {integrity: sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==} - engines: {node: '>=6'} - dev: false + clsx@1.1.1: {} - /color-convert@0.5.3: - resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==} - dev: false + color-convert@0.5.3: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-diff@1.4.0: - resolution: {integrity: sha512-4oDB/o78lNdppbaqrg0HjOp7pHmUc+dfCxWKWFnQg6AB/1dkjtBDop3RZht5386cq9xBUDRvDvSCA7WUlM9Jqw==} - dev: false + color-diff@1.4.0: {} - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-string@1.9.1: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 - dev: false - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: false + color-support@1.1.3: {} - /color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} + color@4.2.3: dependencies: color-convert: 2.0.1 color-string: 1.9.1 - dev: false - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colorette@2.0.20: {} - /colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} - dev: false + colors@1.4.0: {} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@2.20.3: {} - /commander@5.1.0: - resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} - engines: {node: '>= 6'} + commander@5.1.0: {} - /commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - dev: true + commander@6.2.1: {} - /common-tags@1.8.2: - resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} - engines: {node: '>=4.0.0'} + common-tags@1.8.2: {} - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true + commondir@1.0.1: {} - /component-bind@1.0.0: - resolution: {integrity: sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==} - dev: false + component-bind@1.0.0: {} - /component-emitter@1.2.1: - resolution: {integrity: sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==} - dev: false + component-emitter@1.2.1: {} - /component-emitter@1.3.0: - resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} - dev: false + component-emitter@1.3.0: {} - /component-inherit@0.0.3: - resolution: {integrity: sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==} - dev: false + component-inherit@0.0.3: {} - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} + compressible@2.0.18: dependencies: mime-db: 1.52.0 - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} + compression@1.7.4: dependencies: accepts: 1.3.8 bytes: 3.0.0 @@ -6959,52 +12775,34 @@ packages: transitivePeerDependencies: - supports-color - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-map@0.0.1: {} - /concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} + concat-stream@1.6.2: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 2.3.8 typedarray: 0.0.6 - dev: true - /confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - dev: true + confusing-browser-globals@1.0.11: {} - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: false + console-control-strings@1.1.0: {} - /constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + constant-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case: 2.0.2 - dev: false - /constants-browserify@1.0.0: - resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} - dev: true + constants-browserify@1.0.0: {} - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + content-type@1.0.5: {} - /contro-max@0.1.2(typescript@5.2.2): - resolution: {integrity: sha512-mY9aRQ9on/iyzvyhb4OD/10WRRKulVd92F7cxMFVn3rq5EwI+gZitGpHN2mp9+IzwRgBJrOKr1C051b3YlEktQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + contro-max@0.1.2(typescript@5.2.2): dependencies: emittery: 0.10.2 lodash-es: 4.17.21 @@ -7013,92 +12811,60 @@ packages: use-typed-event-listener: 4.0.2(react@18.2.0)(typescript@5.2.2) transitivePeerDependencies: - typescript - dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@1.9.0: {} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true + convert-source-map@2.0.0: {} - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie-signature@1.0.6: {} - /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - dev: false + cookie@0.4.2: {} - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} + cookie@0.5.0: {} - /copy-to-clipboard@3.3.3: - resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + copy-to-clipboard@3.3.3: dependencies: toggle-selection: 1.0.6 - dev: false - /core-js-compat@3.32.1: - resolution: {integrity: sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==} + core-js-compat@3.32.1: dependencies: browserslist: 4.21.10 - /core-js@3.32.1: - resolution: {integrity: sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==} - requiresBuild: true - dev: false + core-js@3.32.1: {} - /core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + core-util-is@1.0.2: {} - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + core-util-is@1.0.3: {} - /cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} + cors@2.8.5: dependencies: object-assign: 4.1.1 vary: 1.1.2 - dev: false - /corser@2.0.1: - resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} - engines: {node: '>= 0.4.0'} - dev: true + corser@2.0.1: {} - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.0 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - dev: false - /create-ecdh@4.0.4: - resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + create-ecdh@4.0.4: dependencies: bn.js: 4.12.0 elliptic: 6.5.4 - dev: true - /create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + create-hash@1.2.0: dependencies: cipher-base: 1.0.4 inherits: 2.0.4 md5.js: 1.3.5 ripemd160: 2.0.2 sha.js: 2.4.11 - dev: true - /create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + create-hmac@1.1.7: dependencies: cipher-base: 1.0.4 create-hash: 1.2.0 @@ -7106,33 +12872,24 @@ packages: ripemd160: 2.0.2 safe-buffer: 5.2.1 sha.js: 2.4.11 - dev: true - /crelt@1.0.6: - resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} - dev: false + crelt@1.0.6: {} - /cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} + cross-spawn@6.0.5: dependencies: nice-try: 1.0.5 path-key: 2.0.1 semver: 5.7.2 shebang-command: 1.2.0 which: 1.3.1 - dev: true - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - /crypto-browserify@3.12.0: - resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + crypto-browserify@3.12.0: dependencies: browserify-cipher: 1.0.1 browserify-sign: 4.2.1 @@ -7145,53 +12902,33 @@ packages: public-encrypt: 4.0.3 randombytes: 2.1.0 randomfill: 1.0.4 - dev: true - /crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} + crypto-random-string@2.0.0: {} - /css-in-js-utils@3.1.0: - resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + css-in-js-utils@3.1.0: dependencies: hyphenate-style-name: 1.0.4 - dev: false - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-select@5.1.0: dependencies: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 domutils: 3.1.0 nth-check: 2.1.1 - dev: true - /css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} + css-tree@1.1.3: dependencies: mdn-data: 2.0.14 source-map: 0.6.1 - dev: false - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: true + css-what@6.1.0: {} - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + csstype@3.1.2: {} - /cypress-esbuild-preprocessor@1.0.2: - resolution: {integrity: sha512-JsFnm6fBQt/OEzstknJ1KLMTuUERUaG0ZB9fk0KdNUlZqxaVEoQ9/pFvKmqRfzUe2y00cWD++ptccQA4tNAAlQ==} - dev: true + cypress-esbuild-preprocessor@1.0.2: {} - /cypress-plugin-snapshots@1.4.4(cypress@10.11.0): - resolution: {integrity: sha512-rijq3RTEZNtxQA4KCUwjXinmE1Ww+z6cQW0B14iodFM/HlX5LN16XT/2QS3X1nUXRKt0QdTrAC5MQfMUrjBkSQ==} - engines: {node: '>=8.2.1'} - peerDependencies: - cypress: ^4.5.0 + cypress-plugin-snapshots@1.4.4(cypress@10.11.0): dependencies: cypress: 10.11.0 diff2html: 2.12.2 @@ -7213,13 +12950,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /cypress@10.11.0: - resolution: {integrity: sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==} - engines: {node: '>=12.0.0'} - hasBin: true - requiresBuild: true + cypress@10.11.0: dependencies: '@cypress/request': 2.88.12 '@cypress/xvfb': 1.2.4(supports-color@8.1.1) @@ -7264,212 +12996,119 @@ packages: untildify: 4.0.0 yauzl: 2.10.0 - /dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} + dashdash@1.14.1: dependencies: assert-plus: 1.0.0 - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /dayjs@1.11.9: - resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==} + dayjs@1.11.9: {} - /debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - dev: false + debounce@1.2.1: {} - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@2.6.9: dependencies: ms: 2.0.0 - /debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.1.0: dependencies: ms: 2.0.0 - dev: false - /debug@3.2.7(supports-color@8.1.1): - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7(supports-color@8.1.1): dependencies: ms: 2.1.3 + optionalDependencies: supports-color: 8.1.1 - /debug@4.1.1: - resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} - deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.1.1: dependencies: ms: 2.1.3 - dev: false - /debug@4.3.4(supports-color@8.1.1): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4(supports-color@8.1.1): dependencies: ms: 2.1.2 + optionalDependencies: supports-color: 8.1.1 - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 map-obj: 1.0.1 - dev: true - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true + decamelize@1.2.0: {} - /decamelize@5.0.1: - resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} - engines: {node: '>=10'} - dev: true + decamelize@5.0.1: {} - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-named-character-reference@1.0.2: dependencies: character-entities: 2.0.2 - dev: false - /decompress-response@4.2.1: - resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} - engines: {node: '>=8'} + decompress-response@4.2.1: dependencies: mimic-response: 2.1.0 - dev: false - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - dev: false - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + deep-eql@4.1.3: dependencies: type-detect: 4.0.8 - dev: true - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - requiresBuild: true - dev: false + deep-extend@0.6.0: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: false + deepmerge@4.3.1: {} - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} + default-browser-id@3.0.0: dependencies: bplist-parser: 0.2.0 untildify: 4.0.0 - dev: true - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - dev: true - /define-data-property@1.1.0: - resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==} - engines: {node: '>= 0.4'} + define-data-property@1.1.0: dependencies: get-intrinsic: 1.2.1 gopd: 1.0.1 has-property-descriptors: 1.0.0 - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: true + define-lazy-prop@2.0.0: {} - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.0 has-property-descriptors: 1.0.0 object-keys: 1.1.1 - /defu@6.1.2: - resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} - dev: true + defu@6.1.2: {} - /del@6.1.1: - resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} - engines: {node: '>=10'} + del@6.1.1: dependencies: globby: 11.1.0 graceful-fs: 4.2.11 @@ -7479,243 +13118,156 @@ packages: p-map: 4.0.0 rimraf: 3.0.2 slash: 3.0.0 - dev: true - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + delayed-stream@1.0.0: {} - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: false + delegates@1.0.0: {} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + depd@2.0.0: {} - /dequal@1.0.0: - resolution: {integrity: sha512-/Nd1EQbQbI9UbSHrMiKZjFLrXSnU328iQdZKPQf78XQI6C+gutkFUeoHpG5J08Ioa6HeRbRNFpSIclh1xyG0mw==} - engines: {node: '>=6'} - dev: true + dequal@1.0.0: {} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + dequal@2.0.3: {} - /des.js@1.1.0: - resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + des.js@1.1.0: dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - dev: true - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + destroy@1.2.0: {} - /detect-collisions@7.0.5: - resolution: {integrity: sha512-RiebSYJ9Vok1uVm57bxpI69EO2ySK1rdcHpRv28IDBh/wgaF8wxjoZJV7mmqz8MOKioLwMHvcMyP1R0CLZ+RbA==} + detect-collisions@7.0.5: dependencies: '@types/rbush': 3.0.1 '@types/sat': 0.0.31 poly-decomp: 0.3.0 rbush: 3.0.1 sat: 0.9.0 - dev: false - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: true + detect-indent@6.1.0: {} - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - requiresBuild: true - dev: false + detect-libc@2.0.2: {} - /detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - dev: true + detect-node-es@1.1.0: {} - /detect-package-manager@2.0.1: - resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} - engines: {node: '>=12'} + detect-package-manager@2.0.1: dependencies: execa: 5.1.1 - dev: true - /detect-port@1.5.1: - resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} - hasBin: true + detect-port@1.5.1: dependencies: address: 1.2.2 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - /devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + devlop@1.1.0: dependencies: dequal: 2.0.3 - dev: false - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + diamond-square@https://codeload.github.com/zardoy/diamond-square/tar.gz/915fce8e27fe8eb45464d89b9563956afa4f7687: + dependencies: + minecraft-data: 3.62.0 + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) + random-seed: 0.3.0 + vec3: 0.1.8 - /diff2html@2.12.2: - resolution: {integrity: sha512-G/Zn1KyG/OeC+67N/P26WHsQpjrjUiRyWGvg29ypy3MxSsBmF0bzsU/Irq70i2UAg+f/MzmLx4v/Nkt01TOU3g==} - engines: {node: '>=4'} + diff-sequences@29.6.3: {} + + diff2html@2.12.2: dependencies: diff: 4.0.2 hogan.js: 3.0.2 merge: 1.2.1 whatwg-fetch: 3.6.18 - dev: false - /diff@2.2.3: - resolution: {integrity: sha512-9wfm3RLzMp/PyTFWuw9liEzdlxsdGixCW0ZTU1XDmtlAkvpVXTPGF8KnfSs0hm3BPbg19OrUPPsRkHXoREpP1g==} - engines: {node: '>=0.3.1'} - dev: false + diff@2.2.3: {} - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: false + diff@4.0.2: {} - /diffie-hellman@5.0.3: - resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + diffie-hellman@5.0.3: dependencies: bn.js: 4.12.0 miller-rabin: 4.0.1 randombytes: 2.1.0 - dev: true - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /discontinuous-range@1.0.0: - resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} + discontinuous-range@1.0.0: {} - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.22.11 csstype: 3.1.2 - dev: false - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0 - dev: true - /dom-walk@0.1.2: - resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} - dev: false + dom-walk@0.1.2: {} - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true + domelementtype@2.3.0: {} - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + domhandler@5.0.3: dependencies: domelementtype: 2.3.0 - dev: true - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - dev: true - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 - dev: false - /dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - dev: true + dotenv-expand@10.0.0: {} - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: true + dotenv@16.3.1: {} - /draco3d@1.5.6: - resolution: {integrity: sha512-+3NaRjWktb5r61ZFoDejlykPEFKT5N/LkbXsaddlw6xNSXBanUYpFc2AXXpbJDilPHazcSreU/DpQIaxfX0NfQ==} - dev: false + draco3d@1.5.6: {} - /duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + duplexify@3.7.1: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 2.3.8 stream-shift: 1.0.1 - dev: true - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + eastasianwidth@0.2.0: {} - /ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + ecc-jsbn@0.1.2: dependencies: jsbn: 0.1.1 safer-buffer: 2.1.2 - /ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ee-first@1.1.1: {} - /ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} - engines: {node: '>=0.10.0'} - hasBin: true + ejs@3.1.9: dependencies: jake: 10.8.7 - /electron-to-chromium@1.4.504: - resolution: {integrity: sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ==} + electron-to-chromium@1.4.504: {} - /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + elliptic@6.5.4: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -7724,47 +13276,29 @@ packages: inherits: 2.0.4 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: true - /emit-then@2.0.0: - resolution: {integrity: sha512-y5JHnrygHnCndtqVHHDhCr0ZzzWHK5RBTczWRlGSIR5UnGHBXuxpoaE0UB5E82qym8ma2dI799wDSSJN2e4VSg==} - engines: {node: '>=5'} - dev: false + emit-then@2.0.0: {} - /emittery@0.10.2: - resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} - engines: {node: '>=12'} - dev: true + emittery@0.10.2: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@9.2.2: {} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + encodeurl@1.0.2: {} - /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - requiresBuild: true + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 - dev: false optional: true - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - /endian-toggle@0.0.0: - resolution: {integrity: sha512-ShfqhXeHRE4TmggSlHXG8CMGIcsOsqDw/GcoPcosToE59Rm9e4aXaMhEQf2kPBsBRrKem1bbOAv5gOKnkliMFQ==} + endian-toggle@0.0.0: {} - /engine.io-client@3.5.3: - resolution: {integrity: sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==} + engine.io-client@3.5.3: dependencies: component-emitter: 1.3.0 component-inherit: 0.0.3 @@ -7781,10 +13315,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /engine.io-client@6.5.2: - resolution: {integrity: sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==} + engine.io-client@6.5.2: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4(supports-color@8.1.1) @@ -7795,26 +13327,18 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /engine.io-parser@2.2.1: - resolution: {integrity: sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==} + engine.io-parser@2.2.1: dependencies: after: 0.8.2 arraybuffer.slice: 0.0.7 base64-arraybuffer: 0.1.4 blob: 0.0.5 has-binary2: 1.0.3 - dev: false - /engine.io-parser@5.2.1: - resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} - engines: {node: '>=10.0.0'} - dev: false + engine.io-parser@5.2.1: {} - /engine.io@3.6.1: - resolution: {integrity: sha512-dfs8EVg/i7QjFsXxn7cCRQ+Wai1G1TlEvHhdYEi80fxn5R1vZ2K661O6v/rezj1FP234SZ14r9CmJke99iYDGg==} - engines: {node: '>=8.0.0'} + engine.io@3.6.1: dependencies: accepts: 1.3.8 base64id: 2.0.0 @@ -7826,11 +13350,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /engine.io@6.5.3: - resolution: {integrity: sha512-IML/R4eG/pUS5w7OfcDE0jKrljWS9nwnEfsxWCIJF5eO6AHo6+Hlv+lQbdlAYsiJPHzUthLm1RUjnBzWOs45cw==} - engines: {node: '>=10.2.0'} + engine.io@6.5.3: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.15 @@ -7846,56 +13367,33 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + entities@4.5.0: {} - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - requiresBuild: true - dev: false + env-paths@2.2.1: optional: true - /envinfo@7.10.0: - resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} - engines: {node: '>=4'} - hasBin: true - dev: true + envinfo@7.10.0: {} - /err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - requiresBuild: true - dev: false + err-code@2.0.3: optional: true - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - /error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + error-stack-parser@2.1.4: dependencies: stackframe: 1.3.4 - dev: false - /eruda@3.0.1: - resolution: {integrity: sha512-6q1Xdwga4JTr1mKSW4mzuWSSbmXgqpm/8Wa1QGFGfCWRjC0bCQjbS4u06M1te1moucIS3hBLlbSTPWYH2W0qbQ==} - dev: false + eruda@3.0.1: {} - /es-abstract@1.22.2: - resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} - engines: {node: '>= 0.4'} + es-abstract@1.22.2: dependencies: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.2 @@ -7937,9 +13435,7 @@ packages: unbox-primitive: 1.0.2 which-typed-array: 1.1.11 - /es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -7987,21 +13483,14 @@ packages: typed-array-length: 1.0.6 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - dev: true - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + es-errors@1.3.0: {} - /es-iterator-helpers@1.0.18: - resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} - engines: {node: '>= 0.4'} + es-iterator-helpers@1.0.18: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -8017,99 +13506,63 @@ packages: internal-slot: 1.0.7 iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 - dev: true - /es-module-lexer@0.9.3: - resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} - dev: true + es-module-lexer@0.9.3: {} - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 - dev: true - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.1: dependencies: get-intrinsic: 1.2.1 has: 1.0.3 has-tostringtag: 1.0.0 - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 - dev: true - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + es-shim-unscopables@1.0.0: dependencies: has: 1.0.3 - dev: true - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - /es6-object-assign@1.1.0: - resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} + es6-object-assign@1.1.0: {} - /es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - dev: false + es6-promise@4.2.8: {} - /es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + es6-promisify@5.0.0: dependencies: es6-promise: 4.2.8 - dev: false - /esbuild-plugin-alias@0.2.1: - resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} - dev: true + esbuild-plugin-alias@0.2.1: {} - /esbuild-plugin-polyfill-node@0.3.0(esbuild@0.19.3): - resolution: {integrity: sha512-SHG6CKUfWfYyYXGpW143NEZtcVVn8S/WHcEOxk62LuDXnY4Zpmc+WmxJKN6GMTgTClXJXhEM5KQlxKY6YjbucQ==} - peerDependencies: - esbuild: '*' + esbuild-plugin-polyfill-node@0.3.0(esbuild@0.19.3): dependencies: '@jspm/core': 2.0.1 esbuild: 0.19.3 import-meta-resolve: 3.0.0 - dev: false - /esbuild-register@3.5.0(esbuild@0.18.20): - resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} - peerDependencies: - esbuild: '>=0.12 <1' + esbuild-register@3.5.0(esbuild@0.18.20): dependencies: debug: 4.3.4(supports-color@8.1.1) esbuild: 0.18.20 transitivePeerDependencies: - supports-color - dev: true - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.18.20: optionalDependencies: '@esbuild/android-arm': 0.18.20 '@esbuild/android-arm64': 0.18.20 @@ -8134,11 +13587,7 @@ packages: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - /esbuild@0.19.11: - resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.19.11: optionalDependencies: '@esbuild/aix-ppc64': 0.19.11 '@esbuild/android-arm': 0.19.11 @@ -8163,13 +13612,8 @@ packages: '@esbuild/win32-arm64': 0.19.11 '@esbuild/win32-ia32': 0.19.11 '@esbuild/win32-x64': 0.19.11 - dev: false - /esbuild@0.19.3: - resolution: {integrity: sha512-UlJ1qUUA2jL2nNib1JTSkifQTcYTroFqRjwCFW4QYEKEsixXD5Tik9xML7zh2gTxkYTBKGHNH9y7txMwVyPbjw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.19.3: optionalDependencies: '@esbuild/android-arm': 0.19.3 '@esbuild/android-arm64': 0.19.3 @@ -8193,106 +13637,57 @@ packages: '@esbuild/win32-arm64': 0.19.3 '@esbuild/win32-ia32': 0.19.3 '@esbuild/win32-x64': 0.19.3 - dev: false - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} + escalade@3.1.1: {} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-html@1.0.3: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + escape-string-regexp@4.0.0: {} - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true + escodegen@2.1.0: dependencies: esprima: 4.0.1 estraverse: 5.3.0 esutils: 2.0.3 optionalDependencies: source-map: 0.6.1 - dev: true - /eslint-config-prettier@8.10.0(eslint@8.50.0): - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@8.10.0(eslint@8.50.0): dependencies: eslint: 8.50.0 - dev: true - /eslint-config-xo-react@0.27.0(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.34.1)(eslint@8.50.0): - resolution: {integrity: sha512-wiV215xQIn71XZyyVfaOXHaFpR1B14IJttwOjMi/eqUK1s+ojJdHr7eHqTLaGUfh6FKgWha1QNwePlIXx7mBUg==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=8.6.0' - eslint-plugin-react: '>=7.29.0' - eslint-plugin-react-hooks: '>=4.3.0' + eslint-config-xo-react@0.27.0(eslint-plugin-react-hooks@4.6.0(eslint@8.50.0))(eslint-plugin-react@7.34.1(eslint@8.50.0))(eslint@8.50.0): dependencies: eslint: 8.50.0 eslint-plugin-react: 7.34.1(eslint@8.50.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.50.0) - dev: true - /eslint-config-xo-typescript@1.0.1(@typescript-eslint/eslint-plugin@6.1.0)(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2): - resolution: {integrity: sha512-vPQssnRSUgBFOEfB/KY12CXwltwFSn4RSCfa+w7gjBC2PFQ7Yfgmyei+1XUZ3K+8LRGef2NMJUcxts7PldhDjg==} - engines: {node: '>=16'} - peerDependencies: - '@typescript-eslint/eslint-plugin': '>=6.0.0' - '@typescript-eslint/parser': '>=6.0.0' - eslint: '>=8.0.0' - typescript: '>=4.7' + eslint-config-xo-typescript@1.0.1(@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2))(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2): dependencies: - '@typescript-eslint/eslint-plugin': 6.1.0(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2) '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) eslint: 8.50.0 typescript: 5.2.2 - dev: true - /eslint-config-xo@0.43.1(eslint@8.50.0): - resolution: {integrity: sha512-azv1L2PysRA0NkZOgbndUpN+581L7wPqkgJOgxxw3hxwXAbJgD6Hqb/SjHRiACifXt/AvxCzE/jIKFAlI7XjvQ==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=8.27.0' + eslint-config-xo@0.43.1(eslint@8.50.0): dependencies: confusing-browser-globals: 1.0.11 eslint: 8.50.0 - dev: true - /eslint-config-zardoy@0.2.17(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.34.1)(eslint@8.50.0)(typescript@5.2.2): - resolution: {integrity: sha512-d31WsjyVSQqHbzTpBSmH96+nw5gwY2yhDbZatU89gr+U8ou1FRUkJSApYJUgmcINt8AQocj1RDDAVYmVSILZgQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - eslint: ^8.5.0 - eslint-plugin-vue: ^8.4.1 - typescript: ^4.5.2 - vue-eslint-parser: ^8.2.0 - peerDependenciesMeta: - eslint-plugin-vue: - optional: true - vue-eslint-parser: - optional: true + eslint-config-zardoy@0.2.17(eslint-plugin-react-hooks@4.6.0(eslint@8.50.0))(eslint-plugin-react@7.34.1(eslint@8.50.0))(eslint@8.50.0)(typescript@5.2.2): dependencies: '@rushstack/eslint-patch': 1.4.0 - '@typescript-eslint/eslint-plugin': 6.1.0(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2) '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) eslint: 8.50.0 eslint-config-prettier: 8.10.0(eslint@8.50.0) eslint-config-xo: 0.43.1(eslint@8.50.0) - eslint-config-xo-react: 0.27.0(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.34.1)(eslint@8.50.0) - eslint-config-xo-typescript: 1.0.1(@typescript-eslint/eslint-plugin@6.1.0)(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2) + eslint-config-xo-react: 0.27.0(eslint-plugin-react-hooks@4.6.0(eslint@8.50.0))(eslint-plugin-react@7.34.1(eslint@8.50.0))(eslint@8.50.0) + eslint-config-xo-typescript: 1.0.1(@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2))(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2) eslint-plugin-eslint-comments: 3.2.0(eslint@8.50.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.7.3)(eslint@8.50.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0) eslint-plugin-node: 11.1.0(eslint@8.50.0) eslint-plugin-sonarjs: 0.19.0(eslint@8.50.0) eslint-plugin-unicorn: 48.0.0(eslint@8.50.0) @@ -8303,80 +13698,39 @@ packages: - eslint-plugin-react - eslint-plugin-react-hooks - supports-color - dev: true - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7(supports-color@8.1.1) is-core-module: 2.13.0 resolve: 1.22.4 transitivePeerDependencies: - supports-color - dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-node@0.3.9)(eslint@8.50.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@8.50.0): dependencies: - '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) debug: 3.2.7(supports-color@8.1.1) + optionalDependencies: + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) eslint: 8.50.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-es@3.0.1(eslint@8.50.0): - resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' + eslint-plugin-es@3.0.1(eslint@8.50.0): dependencies: eslint: 8.50.0 eslint-utils: 2.1.0 regexpp: 3.2.0 - dev: true - /eslint-plugin-eslint-comments@3.2.0(eslint@8.50.0): - resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} - engines: {node: '>=6.5.0'} - peerDependencies: - eslint: '>=4.19.1' + eslint-plugin-eslint-comments@3.2.0(eslint@8.50.0): dependencies: escape-string-regexp: 1.0.5 eslint: 8.50.0 ignore: 5.2.4 - dev: true - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.7.3)(eslint@8.50.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0): dependencies: - '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) array-includes: 3.1.7 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 @@ -8384,7 +13738,7 @@ packages: doctrine: 2.1.0 eslint: 8.50.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-node@0.3.9)(eslint@8.50.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@8.50.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -8393,17 +13747,14 @@ packages: resolve: 1.22.4 semver: 6.3.1 tsconfig-paths: 3.14.2 + optionalDependencies: + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: true - /eslint-plugin-node@11.1.0(eslint@8.50.0): - resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=5.16.0' + eslint-plugin-node@11.1.0(eslint@8.50.0): dependencies: eslint: 8.50.0 eslint-plugin-es: 3.0.1(eslint@8.50.0) @@ -8412,22 +13763,12 @@ packages: minimatch: 3.1.2 resolve: 1.22.4 semver: 6.3.1 - dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.50.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint-plugin-react-hooks@4.6.0(eslint@8.50.0): dependencies: eslint: 8.50.0 - dev: true - /eslint-plugin-react@7.34.1(eslint@8.50.0): - resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-react@7.34.1(eslint@8.50.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -8448,22 +13789,12 @@ packages: resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.11 - dev: true - /eslint-plugin-sonarjs@0.19.0(eslint@8.50.0): - resolution: {integrity: sha512-6+s5oNk5TFtVlbRxqZN7FIGmjdPCYQKaTzFPmqieCmsU1kBYDzndTeQav0xtQNwZJWu5awWfTGe8Srq9xFOGnw==} - engines: {node: '>=14'} - peerDependencies: - eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint-plugin-sonarjs@0.19.0(eslint@8.50.0): dependencies: eslint: 8.50.0 - dev: true - /eslint-plugin-unicorn@48.0.0(eslint@8.50.0): - resolution: {integrity: sha512-8fk/v3p1ro34JSVDBEmtOq6EEQRpMR0iTir79q69KnXFZ6DJyPkT3RAi+ZoTqhQMdDSpGh8BGR68ne1sP5cnAA==} - engines: {node: '>=16'} - peerDependencies: - eslint: '>=8.44.0' + eslint-plugin-unicorn@48.0.0(eslint@8.50.0): dependencies: '@babel/helper-validator-identifier': 7.22.5 '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) @@ -8481,37 +13812,21 @@ packages: regjsparser: 0.10.0 semver: 7.5.4 strip-indent: 3.0.0 - dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} + eslint-utils@2.1.0: dependencies: eslint-visitor-keys: 1.3.0 - dev: true - /eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - dev: true + eslint-visitor-keys@1.3.0: {} - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.50.0: - resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.50.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) '@eslint-community/regexpp': 4.8.0 @@ -8552,99 +13867,59 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.10.0 acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.3 - dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /estree-to-babel@3.2.1: - resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} - engines: {node: '>=8.3.0'} + estree-to-babel@3.2.1: dependencies: '@babel/traverse': 7.22.11 '@babel/types': 7.23.0 c8: 7.14.0 transitivePeerDependencies: - supports-color - dev: true - /estree-walker@1.0.1: - resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} - dev: false + estree-walker@1.0.1: {} - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true + estree-walker@2.0.2: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + esutils@2.0.3: {} - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + etag@1.8.1: {} - /event-promise@0.0.1: - resolution: {integrity: sha512-ouEmk2N0BalybPM0zmj3RHE93AX4p9hAIHZfbbqxolLChqCB6pcLDbYH6zZ8TaiFWImPHfs5kFnNpA0u9RdEaQ==} + event-promise@0.0.1: dependencies: promise: 5.0.0 - dev: false - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} + event-target-shim@5.0.1: {} - /eventemitter2@6.4.7: - resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} + eventemitter2@6.4.7: {} - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@4.0.7: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + events@3.3.0: {} - /evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + evp_bytestokey@1.0.3: dependencies: md5.js: 1.3.5 safe-buffer: 5.2.1 - dev: true - /execa@4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} + execa@4.1.0: dependencies: cross-spawn: 7.0.3 get-stream: 5.2.0 @@ -8656,9 +13931,7 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -8669,51 +13942,29 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /executable@4.1.1: - resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} - engines: {node: '>=4'} + executable@4.1.1: dependencies: pify: 2.3.0 - /exif-parser@0.1.12: - resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==} - dev: false + exif-parser@0.1.12: {} - /exit-hook@2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} - dev: false + exit-hook@2.2.1: {} - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - requiresBuild: true - dev: false + expand-template@2.0.3: {} - /exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - requiresBuild: true - dev: false + exponential-backoff@3.1.1: optional: true - /express-ws@4.0.0(express@4.18.2): - resolution: {integrity: sha512-KEyUw8AwRET2iFjFsI1EJQrJ/fHeGiJtgpYgEWG3yDv4l/To/m3a2GaYfeGyB3lsWdvbesjF5XCMx+SVBgAAYw==} - engines: {node: '>=4.5.0'} - peerDependencies: - express: ^4.0.0 || ^5.0.0-alpha.1 + express-ws@4.0.0(express@4.18.2): dependencies: express: 4.18.2 ws: 5.2.3 transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} + express@4.18.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -8749,12 +14000,9 @@ packages: transitivePeerDependencies: - supports-color - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extend@3.0.2: {} - /extract-zip@1.7.0: - resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} - hasBin: true + extract-zip@1.7.0: dependencies: concat-stream: 1.6.2 debug: 2.6.9 @@ -8762,12 +14010,8 @@ packages: yauzl: 2.10.0 transitivePeerDependencies: - supports-color - dev: true - /extract-zip@2.0.1(supports-color@8.1.1): - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true + extract-zip@2.0.1(supports-color@8.1.1): dependencies: debug: 4.3.4(supports-color@8.1.1) get-stream: 5.2.0 @@ -8777,117 +14021,73 @@ packages: transitivePeerDependencies: - supports-color - /extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} + extsprintf@1.3.0: {} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-deep-equal@3.1.3: {} - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.1: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fast-loops@1.1.3: - resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} - dev: false + fast-loops@1.1.3: {} - /fast-shallow-equal@1.0.0: - resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} - dev: false + fast-shallow-equal@1.0.0: {} - /fastest-stable-stringify@2.0.2: - resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} - dev: false + fastest-stable-stringify@2.0.2: {} - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fastq@1.15.0: dependencies: reusify: 1.0.4 - dev: true - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fb-watchman@2.0.2: dependencies: bser: 2.1.1 - dev: true - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fd-slicer@1.1.0: dependencies: pend: 1.2.0 - /fetch-retry@5.0.6: - resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} - dev: true + fetch-retry@5.0.6: {} - /fflate@0.6.10: - resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} + fflate@0.6.10: {} - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.1.0 - dev: true - /file-system-cache@2.3.0: - resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} + file-system-cache@2.3.0: dependencies: fs-extra: 11.1.1 ramda: 0.29.0 - dev: true - /file-type@9.0.0: - resolution: {integrity: sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==} - engines: {node: '>=6'} - dev: false + file-type@9.0.0: {} - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - requiresBuild: true - dev: false + file-uri-to-path@1.0.0: optional: true - /filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filelist@1.0.4: dependencies: minimatch: 5.1.6 - /filesize@10.0.12: - resolution: {integrity: sha512-6RS9gDchbn+qWmtV2uSjo5vmKizgfCQeb5jKmqx8HyzA3MoLqqyQxN+QcjkGBJt7FjJ9qFce67Auyya5rRRbpw==} - engines: {node: '>= 10.4.0'} + filesize@10.0.12: {} - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - dev: true - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + finalhandler@1.2.0: dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -8899,220 +14099,136 @@ packages: transitivePeerDependencies: - supports-color - /find-cache-dir@2.1.0: - resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} - engines: {node: '>=6'} + find-cache-dir@2.1.0: dependencies: commondir: 1.0.1 make-dir: 2.1.0 pkg-dir: 3.0.0 - dev: true - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} + find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 make-dir: 3.1.0 pkg-dir: 4.2.0 - dev: true - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: false + find-root@1.1.0: {} - /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} + find-up@3.0.0: dependencies: locate-path: 3.0.0 - dev: true - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /flat-cache@3.1.0: - resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} - engines: {node: '>=12.0.0'} + flat-cache@3.1.0: dependencies: flatted: 3.2.7 keyv: 4.5.3 rimraf: 3.0.2 - dev: true - /flatmap@0.0.3: - resolution: {integrity: sha512-OuR+o7kHVe+x9RtIujPay7Uw3bvDZBZFSBXClEphZuSDLmZTqMdclasf4vFSsogC8baDz0eaC2NdO/2dlXHBKQ==} - dev: false + flatmap@0.0.3: {} - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true + flatted@3.2.7: {} - /flow-parser@0.218.0: - resolution: {integrity: sha512-mk4e7UK4P/W3tjrJyto6oxPuCjwvRMyzBh72hTl8T0dOcTzkP0M2JJHpncgyhKphMFi9pnjwHfc8e0oe4Uk3LA==} - engines: {node: '>=0.4.0'} - dev: true + flow-parser@0.218.0: {} - /follow-redirects@1.15.3(debug@4.3.4): - resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: - debug: 4.3.4(supports-color@8.1.1) - dev: true - - /follow-redirects@1.15.6(debug@4.3.4): - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: + follow-redirects@1.15.3(debug@4.3.4): + optionalDependencies: debug: 4.3.4(supports-color@8.1.1) - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + follow-redirects@1.15.6(debug@4.3.4): + optionalDependencies: + debug: 4.3.4(supports-color@8.1.1) + + for-each@0.3.3: dependencies: is-callable: 1.2.7 - /foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} + foreground-child@2.0.0: dependencies: cross-spawn: 7.0.3 signal-exit: 3.0.7 - dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: true - /forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + forever-agent@0.6.1: {} - /form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} + form-data@2.3.3: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + forwarded@0.2.0: {} - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + fresh@0.5.2: {} - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-constants@1.0.0: {} - /fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} + fs-extra@11.1.1: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: false - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: false - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.3: optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + function-bind@1.1.1: {} - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 functions-have-names: 1.2.3 - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + functions-have-names@1.2.3: {} - /gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} + gauge@3.0.2: dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -9123,12 +14239,8 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 - dev: false - /gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - requiresBuild: true + gauge@4.0.4: dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -9138,32 +14250,22 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 - dev: false optional: true - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + get-caller-file@2.0.5: {} - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true + get-func-name@2.0.2: {} - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + get-intrinsic@1.2.1: dependencies: function-bind: 1.1.1 has: 1.0.3 has-proto: 1.0.1 has-symbols: 1.0.3 - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 @@ -9171,76 +14273,46 @@ packages: has-symbols: 1.0.3 hasown: 2.0.1 - /get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - dev: true + get-nonce@1.0.1: {} - /get-npm-tarball-url@2.0.3: - resolution: {integrity: sha512-R/PW6RqyaBQNWYaSyfrh54/qtcnOp22FHCCiRhSSZj0FP3KQWCsxxt0DzIdVTbwTqe9CtQfvl/FPD4UIPt4pqw==} - engines: {node: '>=12.17'} - dev: true + get-npm-tarball-url@2.0.3: {} - /get-own-enumerable-property-symbols@3.0.2: - resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - dev: false + get-own-enumerable-property-symbols@3.0.2: {} - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true + get-package-type@0.1.0: {} - /get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - dev: true + get-port@5.1.1: {} - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + get-stream@5.2.0: dependencies: pump: 3.0.0 - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.1: {} - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.0: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - dev: true - /get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + get-tsconfig@4.7.2: dependencies: resolve-pkg-maps: 1.0.0 - dev: false - /getos@3.2.1: - resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} + getos@3.2.1: dependencies: async: 3.2.5 - /getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + getpass@0.1.7: dependencies: assert-plus: 1.0.0 - /giget@1.1.3: - resolution: {integrity: sha512-zHuCeqtfgqgDwvXlR84UNgnJDuUHQcNI5OqWqFxxuk2BshuKbYhJWdxBsEo4PvKqoGh23lUAIvBNpChMLv7/9Q==} - hasBin: true + giget@1.1.3: dependencies: colorette: 2.0.20 defu: 6.1.2 @@ -9251,21 +14323,12 @@ packages: tar: 6.2.0 transitivePeerDependencies: - supports-color - dev: true - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - requiresBuild: true - dev: false + github-from-package@0.0.0: {} - /github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - dev: true + github-slugger@1.5.0: {} - /gl@6.0.2: - resolution: {integrity: sha512-yBbfpChOtFvg5D+KtMaBFvj6yt3vUnheNAH+UrQH2TfDB8kr0tERdL0Tjhe0W7xJ6jR6ftQBluTZR9jXUnKe8g==} - engines: {node: '>=14.0.0'} - requiresBuild: true + gl@6.0.2: dependencies: bindings: 1.5.0 bit-twiddle: 1.0.2 @@ -9277,51 +14340,32 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: false optional: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-promise@4.2.2(glob@7.2.3): - resolution: {integrity: sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==} - engines: {node: '>=12'} - peerDependencies: - glob: ^7.1.6 + glob-promise@4.2.2(glob@7.2.3): dependencies: '@types/glob': 7.2.0 glob: 7.2.3 - dev: true - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true + glob-to-regexp@0.4.1: {} - /glob@10.3.3: - resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.3: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.0 minimatch: 9.0.3 minipass: 7.0.3 path-scurry: 1.10.1 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -9330,52 +14374,35 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - requiresBuild: true + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: false optional: true - /global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} + global-dirs@3.0.1: dependencies: ini: 2.0.0 - /global@4.4.0: - resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + global@4.4.0: dependencies: min-document: 2.19.0 process: 0.11.10 - dev: false - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + globals@11.12.0: {} - /globals@13.21.0: - resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} - engines: {node: '>=8'} + globals@13.21.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -9383,31 +14410,21 @@ packages: ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 - dev: true - /glsl-tokenizer@2.1.5: - resolution: {integrity: sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==} - requiresBuild: true + glsl-tokenizer@2.1.5: dependencies: through2: 0.6.5 - dev: false optional: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.1 - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /gunzip-maybe@1.4.2: - resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} - hasBin: true + gunzip-maybe@1.4.2: dependencies: browserify-zlib: 0.1.4 is-deflate: 1.0.0 @@ -9415,12 +14432,8 @@ packages: peek-stream: 1.1.3 pumpify: 1.5.1 through2: 2.0.5 - dev: true - /handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true + handlebars@4.7.8: dependencies: minimist: 1.2.8 neo-async: 2.6.2 @@ -9428,177 +14441,108 @@ packages: wordwrap: 1.0.0 optionalDependencies: uglify-js: 3.17.4 - dev: true - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true + hard-rejection@2.1.0: {} - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.0.2: {} - /has-binary2@1.0.3: - resolution: {integrity: sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==} + has-binary2@1.0.3: dependencies: isarray: 2.0.1 - dev: false - /has-cors@1.1.0: - resolution: {integrity: sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==} - dev: false + has-cors@1.1.0: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + has-property-descriptors@1.0.0: dependencies: get-intrinsic: 1.2.1 - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} + has-proto@1.0.1: {} - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - dev: true + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + has-symbols@1.0.3: {} - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.0: dependencies: has-symbols: 1.0.3 - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - dev: true - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: false + has-unicode@2.0.1: {} - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + has@1.0.3: dependencies: function-bind: 1.1.1 - /hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} + hash-base@3.1.0: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 safe-buffer: 5.2.1 - dev: true - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + hash.js@1.1.7: dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - dev: true - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} - engines: {node: '>= 0.4'} + hasown@2.0.1: dependencies: function-bind: 1.1.2 - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - dev: true - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: true + he@1.2.0: {} - /header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + header-case@2.0.4: dependencies: capital-case: 1.0.4 tslib: 2.6.2 - dev: false - /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: true - /hogan.js@3.0.2: - resolution: {integrity: sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==} - hasBin: true + hogan.js@3.0.2: dependencies: mkdirp: 0.3.0 nopt: 1.0.10 - dev: false - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + hosted-git-info@2.8.9: {} - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 - dev: true - /html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} + html-encoding-sniffer@3.0.0: dependencies: whatwg-encoding: 2.0.0 - dev: true - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true + html-escaper@2.0.2: {} - /html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} - dev: true + html-tags@3.3.1: {} - /http-browserify@1.7.0: - resolution: {integrity: sha512-Irf/LJXmE3cBzU1eaR4+NEX6bmVLqt1wkmDiA7kBwH7zmb0D8kBAXsDmQ88hhj/qv9iEZKlyGx/hrMcFi8sOHw==} + http-browserify@1.7.0: dependencies: Base64: 0.2.1 inherits: 2.0.4 - dev: true - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.1.1: {} - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 @@ -9606,34 +14550,24 @@ packages: statuses: 2.0.1 toidentifier: 1.0.1 - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - requiresBuild: true + http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: false optional: true - /http-proxy@1.18.1(debug@4.3.4): - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + http-proxy@1.18.1(debug@4.3.4): dependencies: eventemitter3: 4.0.7 follow-redirects: 1.15.3(debug@4.3.4) requires-port: 1.0.0 transitivePeerDependencies: - debug - dev: true - /http-server@14.1.1(debug@4.3.4): - resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==} - engines: {node: '>=12'} - hasBin: true + http-server@14.1.1(debug@4.3.4): dependencies: basic-auth: 2.0.1 chalk: 4.1.2 @@ -9651,563 +14585,329 @@ packages: transitivePeerDependencies: - debug - supports-color - dev: true - /http-signature@1.3.6: - resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} - engines: {node: '>=0.10'} + http-signature@1.3.6: dependencies: assert-plus: 1.0.0 jsprim: 2.0.2 sshpk: 1.17.0 - /https-browserify@1.0.0: - resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} - dev: true + https-browserify@1.0.0: {} - /https-proxy-agent@4.0.0: - resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} - engines: {node: '>= 6.0.0'} + https-proxy-agent@4.0.0: dependencies: agent-base: 5.1.1 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: false - /https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} - engines: {node: '>= 14'} + https-proxy-agent@7.0.2: dependencies: agent-base: 7.1.0 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - /human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} + human-signals@1.1.1: {} - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + human-signals@2.1.0: {} - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - requiresBuild: true + humanize-ms@1.2.1: dependencies: ms: 2.1.3 - dev: false optional: true - /hyphenate-style-name@1.0.4: - resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} - dev: false + hyphenate-style-name@1.0.4: {} - /iconify-icon@1.0.8: - resolution: {integrity: sha512-jvbUKHXf8EnGGArmhlP2IG8VqQLFFyTvTqb9LVL2TKTh7/eCCD1o2HHE9thpbJJb6B8hzhcFb6rOKhvo7reNKA==} + iconify-icon@1.0.8: dependencies: '@iconify/types': 2.0.0 - dev: false - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - /idb@7.1.1: - resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} - dev: false + idb@7.1.1: {} - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ieee754@1.2.1: {} - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true + ignore@5.2.4: {} - /image-size@0.7.5: - resolution: {integrity: sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==} - engines: {node: '>=6.9.0'} - hasBin: true - dev: false + image-size@0.7.5: {} - /immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: false + immediate@3.0.6: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - /import-meta-resolve@3.0.0: - resolution: {integrity: sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==} - dev: false + import-meta-resolve@3.0.0: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + indent-string@4.0.0: {} - /indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - dev: true + indent-string@5.0.0: {} - /indexof@0.0.1: - resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==} - dev: false + indexof@0.0.1: {} - /infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - requiresBuild: true - dev: false + infer-owner@1.0.4: optional: true - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - requiresBuild: true - dev: false + ini@1.3.8: {} - /ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} + ini@2.0.0: {} - /inline-style-prefixer@6.0.4: - resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==} + inline-style-prefixer@6.0.4: dependencies: css-in-js-utils: 3.1.0 fast-loops: 1.1.3 - dev: false - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} + internal-slot@1.0.5: dependencies: get-intrinsic: 1.2.1 has: 1.0.3 side-channel: 1.0.4 - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - dev: true - /invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + invariant@2.2.4: dependencies: loose-envify: 1.4.0 - dev: true - /ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + ip@2.0.0: {} - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + ipaddr.js@1.9.1: {} - /is-absolute-url@3.0.3: - resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} - engines: {node: '>=8'} - dev: true + is-absolute-url@3.0.3: {} - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + is-arguments@1.1.1: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + is-array-buffer@3.0.2: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-typed-array: 1.1.12 - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.2.1: {} - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: false + is-arrayish@0.3.2: {} - /is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 - dev: true - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} + is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 - dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + is-callable@1.2.7: {} - /is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true + is-ci@3.0.1: dependencies: ci-info: 3.8.0 - /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + is-core-module@2.13.0: dependencies: has: 1.0.3 - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.2 - dev: true - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 - dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.0 - /is-deflate@1.0.0: - resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - dev: true + is-deflate@1.0.0: {} - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true + is-docker@2.2.1: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true + is-extglob@2.1.1: {} - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.0.2: dependencies: call-bind: 1.0.7 - dev: true - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + is-fullwidth-code-point@3.0.0: {} - /is-function@1.0.2: - resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} - dev: false + is-function@1.0.2: {} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.0 - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: true - /is-gzip@1.0.0: - resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} - engines: {node: '>=0.10.0'} - dev: true + is-gzip@1.0.0: {} - /is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} + is-installed-globally@0.4.0: dependencies: global-dirs: 3.0.1 is-path-inside: 3.0.3 - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true + is-interactive@1.0.0: {} - /is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - requiresBuild: true - dev: false + is-lambda@1.0.1: optional: true - /is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - dev: true + is-map@2.0.3: {} - /is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - dev: false + is-module@1.0.0: {} - /is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} + is-nan@1.3.2: dependencies: call-bind: 1.0.2 define-properties: 1.2.1 - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} + is-negative-zero@2.0.2: {} - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true + is-negative-zero@2.0.3: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.0 - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true + is-number@7.0.0: {} - /is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} - dev: false + is-obj@1.0.1: {} - /is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - dev: true + is-path-cwd@2.2.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + is-path-inside@3.0.3: {} - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true + is-plain-obj@1.1.0: {} - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: false + is-plain-obj@4.1.0: {} - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 - dev: true - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - dev: true + is-plain-object@5.0.0: {} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - /is-regexp@1.0.0: - resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} - engines: {node: '>=0.10.0'} - dev: false + is-regexp@1.0.0: {} - /is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - dev: true + is-set@2.0.3: {} - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + is-shared-array-buffer@1.0.2: dependencies: call-bind: 1.0.2 - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - dev: true - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + is-stream@2.0.1: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.0 - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.12: dependencies: which-typed-array: 1.1.11 - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 - dev: true - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + is-typedarray@1.0.0: {} - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + is-unicode-supported@0.1.0: {} - /is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - dev: true + is-weakmap@2.0.2: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.2 - /is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + is-weakset@2.0.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - dev: true - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - requiresBuild: true - dev: false + isarray@0.0.1: optional: true - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@1.0.0: {} - /isarray@2.0.1: - resolution: {integrity: sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==} - dev: false + isarray@2.0.1: {} - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@2.0.0: {} - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true + isobject@3.0.1: {} - /isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + isstream@0.1.2: {} - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true + istanbul-lib-coverage@3.2.0: {} - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.22.11 '@babel/parser': 7.22.13 @@ -10216,57 +14916,40 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.0 make-dir: 4.0.0 supports-color: 7.2.0 - dev: true - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} + istanbul-reports@3.1.6: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - dev: true - /iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 - dev: true - /jackspeak@2.3.0: - resolution: {integrity: sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==} - engines: {node: '>=14'} + jackspeak@2.3.0: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - /jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} - engines: {node: '>=10'} - hasBin: true + jake@10.8.7: dependencies: async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 - /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-haste-map@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.7 @@ -10281,16 +14964,10 @@ packages: walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - dev: true - /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + jest-regex-util@29.6.3: {} - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/node': 20.8.0 @@ -10298,29 +14975,21 @@ packages: ci-info: 3.8.0 graceful-fs: 4.2.11 picomatch: 2.3.1 - dev: true - /jest-worker@26.6.2: - resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} - engines: {node: '>= 10.13.0'} + jest-worker@26.6.2: dependencies: '@types/node': 20.8.10 merge-stream: 2.0.0 supports-color: 7.2.0 - dev: false - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@29.7.0: dependencies: '@types/node': 20.8.10 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true - /jimp@0.10.3: - resolution: {integrity: sha512-meVWmDMtyUG5uYjFkmzu0zBgnCvvxwWNi27c4cg55vWNVC9ES4Lcwb+ogx+uBBQE3Q+dLKjXaLl0JVW+nUNwbQ==} + jimp@0.10.3: dependencies: '@babel/runtime': 7.22.11 '@jimp/custom': 0.10.3 @@ -10328,54 +14997,31 @@ packages: '@jimp/types': 0.10.3(@jimp/custom@0.10.3) core-js: 3.32.1 regenerator-runtime: 0.13.11 - dev: false - /jose@4.15.5: - resolution: {integrity: sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==} + jose@4.15.5: {} - /jpeg-js@0.3.7: - resolution: {integrity: sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==} - dev: false + jpeg-js@0.3.7: {} - /js-base64@2.6.4: - resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} - dev: false + js-base64@2.6.4: {} - /js-cookie@2.2.1: - resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} - dev: false + js-cookie@2.2.1: {} - /js-graph-algorithms@1.0.18: - resolution: {integrity: sha512-Gu1wtWzXBzGeye/j9BuyplGHscwqKRZodp/0M1vyBc19RJpblSwKGu099KwwaTx9cRIV+Qupk8xUMfEiGfFqSA==} - hasBin: true - dev: false + js-graph-algorithms@1.0.18: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - dev: true - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + jsbn@0.1.1: {} - /jscodeshift@0.14.0(@babel/preset-env@7.22.10): - resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} - hasBin: true - peerDependencies: - '@babel/preset-env': ^7.1.6 + jscodeshift@0.14.0(@babel/preset-env@7.22.10(@babel/core@7.22.11)): dependencies: '@babel/core': 7.22.11 '@babel/parser': 7.22.13 @@ -10399,88 +15045,50 @@ packages: write-file-atomic: 2.4.3 transitivePeerDependencies: - supports-color - dev: true - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true + jsesc@0.5.0: {} - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true + jsesc@2.5.2: {} - /jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - dev: true + jsesc@3.0.2: {} - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true + json-parse-better-errors@1.0.2: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: false + json-schema-traverse@1.0.0: {} - /json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json-schema@0.4.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json-stringify-safe@5.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json5@1.0.2: dependencies: minimist: 1.2.8 - dev: true - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true + json5@2.2.3: {} - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true + jsonc-parser@3.2.0: {} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - dev: false - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.11 - /jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} - dev: false + jsonpointer@5.0.1: {} - /jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 lodash.includes: 4.3.0 @@ -10493,151 +15101,105 @@ packages: ms: 2.1.3 semver: 7.6.0 - /jsprim@2.0.2: - resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} - engines: {'0': node >=0.6.0} + jsprim@2.0.2: dependencies: assert-plus: 1.0.0 extsprintf: 1.3.0 json-schema: 0.4.0 verror: 1.10.0 - /jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 array.prototype.flat: 1.3.2 object.assign: 4.1.5 object.values: 1.2.0 - dev: true - /jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + jszip@3.10.1: dependencies: lie: 3.3.0 pako: 1.0.11 readable-stream: 2.3.8 setimmediate: 1.0.5 - dev: false - /jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + jwa@1.4.1: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - /jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + jws@3.2.2: dependencies: jwa: 1.4.1 safe-buffer: 5.2.1 - /keyv@4.5.3: - resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + keyv@4.5.3: dependencies: json-buffer: 3.0.1 - dev: true - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true + kind-of@6.0.3: {} - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true + kleur@3.0.3: {} - /lazy-ass@1.6.0: - resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} - engines: {node: '> 0.8'} + lazy-ass@1.6.0: {} - /lazy-universal-dotenv@4.0.0: - resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} - engines: {node: '>=14.0.0'} + lazy-universal-dotenv@4.0.0: dependencies: app-root-dir: 1.0.2 dotenv: 16.3.1 dotenv-expand: 10.0.0 - dev: true - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} + leven@3.1.0: {} - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lie@3.3.0: dependencies: immediate: 3.0.6 - dev: false - /lil-gui@0.17.0: - resolution: {integrity: sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==} - dev: true + lil-gui@0.17.0: {} - /lil-gui@0.18.2: - resolution: {integrity: sha512-DgdrLy3/KGC0PiQLKgOcJMPItP4xY4iWgJ9+91Zaxfr8GCTmMps05QS9w9jW7yspILlbscbquwjOwxmWnSx5Uw==} - dev: false + lil-gui@0.18.2: {} - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lines-and-columns@1.2.4: {} - /linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 - dev: false - /listr2@3.14.0(enquirer@2.4.1): - resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} - engines: {node: '>=10.0.0'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true + listr2@3.14.0(enquirer@2.4.1): dependencies: cli-truncate: 2.1.0 colorette: 2.0.20 - enquirer: 2.4.1 log-update: 4.0.0 p-map: 4.0.0 rfdc: 1.3.0 rxjs: 7.8.1 through: 2.3.8 wrap-ansi: 7.0.0 + optionalDependencies: + enquirer: 2.4.1 - /lit-element@3.3.3: - resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + lit-element@3.3.3: dependencies: '@lit-labs/ssr-dom-shim': 1.1.1 '@lit/reactive-element': 1.6.3 lit-html: 2.8.0 - /lit-html@2.8.0: - resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + lit-html@2.8.0: dependencies: '@types/trusted-types': 2.0.3 - /lit@2.8.0: - resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + lit@2.8.0: dependencies: '@lit/reactive-element': 1.6.3 lit-element: 3.3.3 lit-html: 2.8.0 - /load-bmfont@1.4.1: - resolution: {integrity: sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==} + load-bmfont@1.4.1: dependencies: buffer-equal: 0.0.1 mime: 1.6.0 @@ -10647,119 +15209,76 @@ packages: phin: 2.9.3 xhr: 2.6.0 xtend: 4.0.2 - dev: false - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 - dev: true - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - dev: true + local-pkg@0.4.3: {} - /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} + locate-path@3.0.0: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - dev: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash-es@4.17.21: {} - /lodash.compact@3.0.1: - resolution: {integrity: sha512-2ozeiPi+5eBXW1CLtzjk8XQFhQOEMwwfxblqeq6EGyTxZJ1bPATqilY0e6g2SLQpP4KuMeuioBhEnWz5Pr7ICQ==} - dev: false + lodash.compact@3.0.1: {} - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.debounce@4.0.8: {} - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + lodash.get@4.4.2: {} - /lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + lodash.includes@4.3.0: {} - /lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + lodash.isboolean@3.0.3: {} - /lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + lodash.isinteger@4.0.4: {} - /lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + lodash.isnumber@3.0.3: {} - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + lodash.isplainobject@4.0.6: {} - /lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.isstring@4.0.1: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.merge@4.6.2: {} - /lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash.once@4.1.1: {} - /lodash.reduce@4.6.0: - resolution: {integrity: sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==} + lodash.reduce@4.6.0: {} - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: false + lodash.sortby@4.7.0: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - /log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} + log-update@4.0.0: dependencies: ansi-escapes: 4.3.2 cli-cursor: 3.1.0 slice-ansi: 4.0.0 wrap-ansi: 6.2.0 - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: false + long@5.2.3: {} - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: false + longest-streak@3.1.0: {} - /looks-same@8.2.3: - resolution: {integrity: sha512-0LK5r4+9t2D56XPVNH3hhG4o0yBYUdeu9FEd8z0ZCs/2fR9zJQj+6ob6ued8iHk3yddrSAdUA+9YGVK2FBMGUw==} - engines: {node: '>= 12.0.0'} + looks-same@8.2.3: dependencies: color-diff: 1.4.0 fs-extra: 8.1.0 @@ -10768,97 +15287,60 @@ packages: nested-error-stacks: 2.1.1 parse-color: 1.0.0 sharp: 0.30.7 - dev: false - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + loupe@2.3.6: dependencies: get-func-name: 2.0.2 - dev: true - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lower-case@2.0.2: dependencies: tslib: 2.6.2 - dev: false - /lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} - engines: {node: 14 || >=16.14} - dev: true + lru-cache@10.0.1: {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - requiresBuild: true - dev: false + lru-cache@7.18.3: optional: true - /macaddress@0.5.3: - resolution: {integrity: sha512-vGBKTA+jwM4KgjGZ+S/8/Mkj9rWzePyGY6jManXPGhiWu63RYwW8dKPyk5koP+8qNVhPhHgFa1y/MJ4wrjsNrg==} + macaddress@0.5.3: {} - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 - dev: false - /magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} + magic-string@0.27.0: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /magic-string@0.30.4: - resolution: {integrity: sha512-Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg==} - engines: {node: '>=12'} + magic-string@0.30.4: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} + make-dir@2.1.0: dependencies: pify: 4.0.1 semver: 5.7.2 - dev: true - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-dir@3.1.0: dependencies: semver: 6.3.1 - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + make-dir@4.0.0: dependencies: semver: 7.6.0 - dev: true - /make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - requiresBuild: true + make-fetch-happen@10.2.1: dependencies: agentkeepalive: 4.5.0 cacache: 16.1.3 @@ -10879,32 +15361,19 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: false optional: true - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + makeerror@1.0.12: dependencies: tmpl: 1.0.5 - dev: true - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + map-obj@1.0.1: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true + map-obj@4.3.0: {} - /map-or-similar@1.5.0: - resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} - dev: true + map-or-similar@1.5.0: {} - /markdown-it@14.0.0: - resolution: {integrity: sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==} - hasBin: true + markdown-it@14.0.0: dependencies: argparse: 2.0.1 entities: 4.5.0 @@ -10912,39 +15381,24 @@ packages: mdurl: 2.0.0 punycode.js: 2.3.1 uc.micro: 2.1.0 - dev: false - /markdown-to-jsx@7.3.2(react@18.2.0): - resolution: {integrity: sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==} - engines: {node: '>= 10'} - peerDependencies: - react: ^18.2.0 + markdown-to-jsx@7.3.2(react@18.2.0): dependencies: react: 18.2.0 - dev: true - /md5-file@4.0.0: - resolution: {integrity: sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg==} - engines: {node: '>=6.0'} - hasBin: true - dev: false + md5-file@4.0.0: {} - /md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + md5.js@1.3.5: dependencies: hash-base: 3.1.0 inherits: 2.0.4 safe-buffer: 5.2.1 - dev: true - /mdast-util-definitions@4.0.0: - resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} + mdast-util-definitions@4.0.0: dependencies: unist-util-visit: 2.0.3 - dev: true - /mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + mdast-util-from-markdown@2.0.0: dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 @@ -10960,17 +15414,13 @@ packages: unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.3 unist-util-is: 6.0.0 - dev: false - /mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + mdast-util-to-markdown@2.1.0: dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 @@ -10980,44 +15430,26 @@ packages: micromark-util-decode-string: 2.0.0 unist-util-visit: 5.0.0 zwitch: 2.0.4 - dev: false - /mdast-util-to-string@1.1.0: - resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} - dev: true + mdast-util-to-string@1.1.0: {} - /mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.3 - dev: false - /mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - dev: false + mdn-data@2.0.14: {} - /mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - dev: false + mdurl@2.0.0: {} - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + media-typer@0.3.0: {} - /memoizerific@1.11.3: - resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + memoizerific@1.11.3: dependencies: map-or-similar: 1.5.0 - dev: true - /memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - dev: true + memorystream@0.3.1: {} - /meow@10.1.5: - resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + meow@10.1.5: dependencies: '@types/minimist': 1.2.3 camelcase-keys: 7.0.2 @@ -11031,32 +15463,20 @@ packages: trim-newlines: 4.1.1 type-fest: 1.4.0 yargs-parser: 20.2.9 - dev: true - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-descriptors@1.0.1: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /merge@1.2.1: - resolution: {integrity: sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==} - dev: false + merge@1.2.1: {} - /meshoptimizer@0.18.1: - resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==} + meshoptimizer@0.18.1: {} - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + methods@1.1.2: {} - /micromark-core-commonmark@2.0.0: - resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + micromark-core-commonmark@2.0.0: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -11074,140 +15494,100 @@ packages: micromark-util-subtokenize: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + micromark-factory-destination@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + micromark-factory-label@2.0.0: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + micromark-factory-space@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-types: 2.0.0 - dev: false - /micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + micromark-factory-title@2.0.0: dependencies: micromark-factory-space: 2.0.0 micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + micromark-factory-whitespace@2.0.0: dependencies: micromark-factory-space: 2.0.0 micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + micromark-util-character@2.1.0: dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + micromark-util-chunked@2.0.0: dependencies: micromark-util-symbol: 2.0.0 - dev: false - /micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + micromark-util-classify-character@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + micromark-util-combine-extensions@2.0.0: dependencies: micromark-util-chunked: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + micromark-util-decode-numeric-character-reference@2.0.1: dependencies: micromark-util-symbol: 2.0.0 - dev: false - /micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + micromark-util-decode-string@2.0.0: dependencies: decode-named-character-reference: 1.0.2 micromark-util-character: 2.1.0 micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-symbol: 2.0.0 - dev: false - /micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - dev: false + micromark-util-encode@2.0.0: {} - /micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - dev: false + micromark-util-html-tag-name@2.0.0: {} - /micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + micromark-util-normalize-identifier@2.0.0: dependencies: micromark-util-symbol: 2.0.0 - dev: false - /micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + micromark-util-resolve-all@2.0.0: dependencies: micromark-util-types: 2.0.0 - dev: false - /micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-sanitize-uri@2.0.0: dependencies: micromark-util-character: 2.1.0 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 - dev: false - /micromark-util-subtokenize@2.0.0: - resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + micromark-util-subtokenize@2.0.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - dev: false + micromark-util-symbol@2.0.0: {} - /micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - dev: false + micromark-util-types@2.0.0: {} - /micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + micromark@4.0.0: dependencies: '@types/debug': 4.1.12 debug: 4.3.4(supports-color@8.1.1) @@ -11228,83 +15608,77 @@ packages: micromark-util-types: 2.0.0 transitivePeerDependencies: - supports-color - dev: false - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - dev: true - /miller-rabin@4.0.1: - resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} - hasBin: true + miller-rabin@4.0.1: dependencies: bn.js: 4.12.0 brorand: 1.1.0 - dev: true - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + mime-db@1.52.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true + mime@1.6.0: {} - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: true + mime@2.6.0: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + mimic-fn@2.1.0: {} - /mimic-response@2.1.0: - resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} - engines: {node: '>=8'} - dev: false + mimic-response@2.1.0: {} - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: false + mimic-response@3.1.0: {} - /min-document@2.19.0: - resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + min-document@2.19.0: dependencies: dom-walk: 0.1.2 - dev: false - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + min-indent@1.0.1: {} - /minecraft-assets@1.12.2: - resolution: {integrity: sha512-/eMxh3LNjCXOnU6KnQMjBM8dRnoJNpWIg7mD2m2RthraYiQK2FNzPWIKxWm2j3Ufcf5nzFXupgABledE86r4fQ==} - dev: false + minecraft-assets@1.12.2: {} - /minecraft-data@3.62.0: - resolution: {integrity: sha512-jJXZ/WgyX79tIHlqvfyqG+sJDUekHiA3e9NRUCMGUno4NDrZMcpRI065DnkrI720RHTMb8iadf0NmnBP4Rla5A==} + minecraft-data@3.62.0: {} - /minecraft-folder-path@1.2.0: - resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} + minecraft-folder-path@1.2.0: {} - /minecraft-wrap@1.5.1: - resolution: {integrity: sha512-7DZ2WhrcRD3fUMau84l9Va0KWzV92SHNdB7mnNdNhgXID2aW6pjWuYPZi8MepEBemA4XKKdnDx7HmhTbkoiR8A==} - hasBin: true + minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/5554c7ab0a74bce52aa5f5f04a48eb8d3b9ac65c(@types/react@18.2.20)(react@18.2.0): + dependencies: + valtio: 1.11.2(@types/react@18.2.20)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react + + minecraft-protocol@https://codeload.github.com/zardoy/minecraft-protocol/tar.gz/2c14a686bfe7cbd9a5c87b629b402295ee86219f(encoding@0.1.13): + dependencies: + '@types/readable-stream': 4.0.11 + aes-js: 3.1.2 + buffer-equal: 1.0.1 + debug: 4.3.4(supports-color@8.1.1) + endian-toggle: 0.0.0 + lodash.get: 4.4.2 + lodash.merge: 4.6.2 + minecraft-data: 3.62.0 + minecraft-folder-path: 1.2.0 + node-fetch: 2.7.0(encoding@0.1.13) + node-rsa: 0.4.2 + prismarine-auth: 2.4.2(encoding@0.1.13) + prismarine-nbt: 2.5.0 + prismarine-realms: 1.3.2(encoding@0.1.13) + protodef: 1.15.0 + readable-stream: 4.5.2 + uuid-1345: 1.0.2 + yggdrasil: 1.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + + minecraft-wrap@1.5.1(encoding@0.1.13): dependencies: debug: 4.3.4(supports-color@8.1.1) es6-promisify: 5.0.0 @@ -11314,216 +15688,160 @@ packages: minecraft-folder-path: 1.2.0 mkdirp: 0.5.6 mz: 2.7.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) promise-queue: 2.2.5 rimraf: 3.0.2 - yggdrasil: 1.7.0 + yggdrasil: 1.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color - dev: false - /minecrafthawkeye@1.3.6: - resolution: {integrity: sha512-SlRlorxQs6nNzMiiIQ5z47wzbAI27UaCdbRB82CE8jqj4C8m3Gqk5TlgN+PSThxx8EDPXySzd8Vk+/wNigAd5A==} + minecrafthawkeye@1.3.6: dependencies: detect-collisions: 7.0.5 vec3: 0.1.8 - dev: false - /mineflayer-pathfinder@2.4.4: - resolution: {integrity: sha512-HAXakZrJRb1UC+5dv8EaDrqjW3ZnBnBk3nkb6x/YWyhHCUKn/E7VU0FO+UN9whuqPlkSaVumEdXJdydE6lSYxQ==} + mineflayer-pathfinder@2.4.4: dependencies: minecraft-data: 3.62.0 - prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.2.1 prismarine-physics: 1.8.0 vec3: 0.1.8 - dev: true - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: true + mineflayer@https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/5a544cf2547a6e0f1f17786962d77a33c661c02f(encoding@0.1.13): + dependencies: + minecraft-data: 3.62.0 + minecraft-protocol: https://codeload.github.com/zardoy/minecraft-protocol/tar.gz/2c14a686bfe7cbd9a5c87b629b402295ee86219f(encoding@0.1.13) + prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + prismarine-chat: 1.9.1 + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) + prismarine-entity: 2.3.1 + prismarine-item: 1.14.0 + prismarine-nbt: 2.5.0 + prismarine-physics: 1.8.0 + prismarine-recipe: 1.3.1(prismarine-registry@1.7.0) + prismarine-registry: 1.7.0 + prismarine-windows: 2.9.0 + prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465 + protodef: 1.15.0 + typed-emitter: 1.4.0 + vec3: 0.1.8 + transitivePeerDependencies: + - encoding + - supports-color - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - dev: true + minimalistic-assert@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimalistic-crypto-utils@1.0.1: {} + + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimist-options@4.1.0: dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimist@1.2.8: {} - /minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - requiresBuild: true + minipass-collect@1.0.2: dependencies: minipass: 3.3.6 - dev: false optional: true - /minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - requiresBuild: true + minipass-fetch@2.1.2: dependencies: minipass: 3.3.6 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: encoding: 0.1.13 - dev: false optional: true - /minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - requiresBuild: true + minipass-flush@1.0.5: dependencies: minipass: 3.3.6 - dev: false optional: true - /minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - requiresBuild: true + minipass-pipeline@1.2.4: dependencies: minipass: 3.3.6 - dev: false optional: true - /minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - requiresBuild: true + minipass-sized@1.0.3: dependencies: minipass: 3.3.6 - dev: false optional: true - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@3.3.6: dependencies: yallist: 4.0.0 - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} + minipass@5.0.0: {} - /minipass@7.0.3: - resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minipass@7.0.3: {} - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp-classic@0.5.3: {} - /mkdirp@0.3.0: - resolution: {integrity: sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==} - deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) - dev: false + mkdirp@0.3.0: {} - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true + mkdirp@1.0.4: {} - /mkdirp@2.1.6: - resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} - engines: {node: '>=10'} - hasBin: true - dev: false + mkdirp@2.1.6: {} - /mlly@1.4.2: - resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + mlly@1.4.2: dependencies: acorn: 8.10.0 pathe: 1.1.1 pkg-types: 1.0.3 ufo: 1.3.1 - dev: true - /mojangson@2.0.4: - resolution: {integrity: sha512-HYmhgDjr1gzF7trGgvcC/huIg2L8FsVbi/KacRe6r1AswbboGVZDS47SOZlomPuMWvZLas8m9vuHHucdZMwTmQ==} + mojangson@2.0.4: dependencies: nearley: 2.20.1 - /moo@0.5.2: - resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + moo@0.5.2: {} - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: true + mri@1.2.0: {} - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.0.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + ms@2.1.3: {} - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: false - /nan@2.18.0: - resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} - dev: false + nan@2.18.0: {} - /nano-css@5.3.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==} - peerDependencies: - react: ^18.2.0 - react-dom: '*' + nano-css@5.3.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: css-tree: 1.1.3 csstype: 3.1.2 @@ -11535,125 +15853,81 @@ packages: sourcemap-codec: 1.4.8 stacktrace-js: 2.0.2 stylis: 4.2.0 - dev: false - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + nanoid@3.3.6: {} - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + nanoid@3.3.7: {} - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - requiresBuild: true - dev: false + napi-build-utils@1.0.2: {} - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true + natural-compare-lite@1.4.0: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /nearley@2.20.1: - resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} - hasBin: true + nearley@2.20.1: dependencies: commander: 2.20.3 moo: 0.5.2 railroad-diagrams: 1.0.0 randexp: 0.4.6 - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + negotiator@0.6.3: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true + neo-async@2.6.2: {} - /nested-error-stacks@2.1.1: - resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} - dev: false + nested-error-stacks@2.1.1: {} - /nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - dev: true + net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d827dba61bd2f9ac9a6086fe2079a0fccadd070: + dependencies: + body-parser: 1.20.2 + express: 4.18.2 + express-ws: 4.0.0(express@4.18.2) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + nice-try@1.0.5: {} + + no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.6.2 - dev: false - /node-abi@3.47.0: - resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} - engines: {node: '>=10'} - requiresBuild: true + node-abi@3.47.0: dependencies: semver: 7.6.0 - dev: false - /node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - dev: false + node-addon-api@5.1.0: {} - /node-canvas-webgl@0.3.0: - resolution: {integrity: sha512-wDRCTEE2TCqKDeSef5cNgtLv8kgjRlnFN3aYgB9yni0kHRNnKBSSP93lT8VIV5GuMWiy5KNXBU0ilyWL5wTvFg==} - requiresBuild: true + node-canvas-webgl@0.3.0(encoding@0.1.13): dependencies: - canvas: 2.11.2 + canvas: 2.11.2(encoding@0.1.13) gl: 6.0.2 transitivePeerDependencies: - bluebird - encoding - supports-color - dev: false optional: true - /node-dir@0.1.17: - resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} - engines: {node: '>= 0.10.5'} + node-dir@0.1.17: dependencies: minimatch: 3.1.2 - dev: true - /node-fetch-native@1.4.0: - resolution: {integrity: sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==} - dev: true + node-fetch-native@1.4.0: {} - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 - /node-gyp-build-optional-packages@5.1.1: - resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} - hasBin: true - requiresBuild: true + node-gyp-build-optional-packages@5.1.1: dependencies: detect-libc: 2.0.2 - dev: false optional: true - /node-gyp@9.4.1: - resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true - requiresBuild: true + node-gyp@9.4.1: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.1 @@ -11669,91 +15943,57 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: false optional: true - /node-gzip@1.1.2: - resolution: {integrity: sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw==} - dev: false + node-gzip@1.1.2: {} - /node-html-parser@6.1.10: - resolution: {integrity: sha512-6/uWdWxjQWQ7tMcFK2wWlrflsQUzh1HsEzlIf2j5+TtzfhT2yUvg3DwZYAmjEHeR3uX74ko7exjHW69J0tOzIg==} + node-html-parser@6.1.10: dependencies: css-select: 5.1.0 he: 1.2.0 - dev: true - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true + node-int64@0.4.0: {} - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + node-releases@2.0.13: {} - /node-rsa@0.4.2: - resolution: {integrity: sha512-Bvso6Zi9LY4otIZefYrscsUpo2mUpiAVIEmSZV2q41sP8tHZoert3Yu6zv4f/RXJqMNZQKCtnhDugIuCma23YA==} + node-rsa@0.4.2: dependencies: asn1: 0.2.3 - /node-rsa@1.1.1: - resolution: {integrity: sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==} + node-rsa@1.1.1: dependencies: asn1: 0.2.6 - dev: false - /nopt@1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} - hasBin: true + nopt@1.0.10: dependencies: abbrev: 1.1.1 - dev: false - /nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true + nopt@5.0.0: dependencies: abbrev: 1.1.1 - dev: false - /nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - requiresBuild: true + nopt@6.0.0: dependencies: abbrev: 1.1.1 - dev: false optional: true - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.4 semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.0 semver: 7.6.0 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-path@3.0.0: {} - /npm-run-all@4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} - hasBin: true + npm-run-all@4.1.5: dependencies: ansi-styles: 3.2.1 chalk: 2.4.2 @@ -11764,169 +16004,113 @@ packages: read-pkg: 3.0.0 shell-quote: 1.8.1 string.prototype.padend: 3.1.4 - dev: true - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - /npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 console-control-strings: 1.1.0 gauge: 3.0.2 set-blocking: 2.0.0 - dev: false - /npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - requiresBuild: true + npmlog@6.0.2: dependencies: are-we-there-yet: 3.0.1 console-control-strings: 1.1.0 gauge: 4.0.4 set-blocking: 2.0.0 - dev: false optional: true - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 - dev: true - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + object-assign@4.1.1: {} - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + object-inspect@1.12.3: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.1: {} - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} + object-is@1.1.5: dependencies: call-bind: 1.0.2 define-properties: 1.2.1 - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + object-keys@1.1.1: {} - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.4: dependencies: call-bind: 1.0.2 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: true - /object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} + object.entries@1.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: true - /object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} + object.hasown@1.1.4: dependencies: define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: true - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} - engines: {node: '>= 0.4'} + object.values@1.1.7: dependencies: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 - dev: true - /object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + object.values@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /omggif@1.0.10: - resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} - dev: false + omggif@1.0.10: {} - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} + on-headers@1.0.2: {} - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: true - /opener@1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} - hasBin: true - dev: true + opener@1.5.2: {} - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -11934,11 +16118,8 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -11949,419 +16130,246 @@ packages: log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true - /orderedmap@2.1.1: - resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} - dev: false + orderedmap@2.1.1: {} - /os-browserify@0.3.0: - resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - dev: true + os-browserify@0.3.0: {} - /ospath@1.2.2: - resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} + ospath@1.2.2: {} - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@4.0.0: dependencies: yocto-queue: 1.0.0 - dev: true - /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} + p-locate@3.0.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-try@2.2.0: {} - /pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - dev: true + pako@0.2.9: {} - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + pako@1.0.11: {} - /param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + param-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - /parse-asn1@5.1.6: - resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + parse-asn1@5.1.6: dependencies: asn1.js: 5.4.1 browserify-aes: 1.2.0 evp_bytestokey: 1.0.3 pbkdf2: 3.1.2 safe-buffer: 5.2.1 - dev: true - /parse-bmfont-ascii@1.0.6: - resolution: {integrity: sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==} - dev: false + parse-bmfont-ascii@1.0.6: {} - /parse-bmfont-binary@1.0.6: - resolution: {integrity: sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==} - dev: false + parse-bmfont-binary@1.0.6: {} - /parse-bmfont-xml@1.1.4: - resolution: {integrity: sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==} + parse-bmfont-xml@1.1.4: dependencies: xml-parse-from-string: 1.0.1 xml2js: 0.4.23 - dev: false - /parse-color@1.0.0: - resolution: {integrity: sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==} + parse-color@1.0.0: dependencies: color-convert: 0.5.3 - dev: false - /parse-headers@2.0.5: - resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} - dev: false + parse-headers@2.0.5: {} - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + parse-json@4.0.0: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.22.13 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /parseqs@0.0.6: - resolution: {integrity: sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==} - dev: false + parseqs@0.0.6: {} - /parseuri@0.0.6: - resolution: {integrity: sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==} - dev: false + parseuri@0.0.6: {} - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + parseurl@1.3.3: {} - /pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + pascal-case@3.1.2: dependencies: no-case: 3.0.4 tslib: 2.6.2 - dev: false - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true + path-browserify@1.0.1: {} - /path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + path-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false - /path-exists-cli@2.0.0: - resolution: {integrity: sha512-qGr0A87KYCznmvabblxyxnzA/MtPZ28wH+4SCMP4tjTFAbzqwvs5xpUZExAYzq5OgHe5vIswzdH5iosCb8YF/Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true + path-exists-cli@2.0.0: dependencies: meow: 10.1.5 path-exists: 5.0.0 - dev: true - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: true + path-exists@3.0.0: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + path-exists@5.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-is-absolute@1.0.1: {} - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: true + path-key@2.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + path-key@3.1.1: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-parse@1.0.7: {} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.10.1: dependencies: lru-cache: 10.0.1 minipass: 7.0.3 - dev: true - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-to-regexp@0.1.7: {} - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} + path-type@3.0.0: dependencies: pify: 3.0.0 - dev: true - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + path-type@4.0.0: {} - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: true + pathe@1.1.1: {} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + pathval@1.1.1: {} - /pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} + pbkdf2@3.1.2: dependencies: create-hash: 1.2.0 create-hmac: 1.1.7 ripemd160: 2.0.2 safe-buffer: 5.2.1 sha.js: 2.4.11 - dev: true - /peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + peek-stream@1.1.3: dependencies: buffer-from: 1.1.2 duplexify: 3.7.1 through2: 2.0.5 - dev: true - /peerjs-js-binarypack@2.0.0: - resolution: {integrity: sha512-wu+L0Qeg4IH2DXm3B6xKP5ODeCIovwEEO/Fu3MVqApPQeVLzSdZpFzQzPobh+sdhUWMQGEO7YxHeiwpPngLjqQ==} - engines: {node: '>= 14.0.0'} - dev: false + peerjs-js-binarypack@2.0.0: {} - /peerjs@1.5.0: - resolution: {integrity: sha512-NLZ73jRNE4aLq2pmVTiSkWmwf6cvt9cH72qJHnzaLH+I2CtoWVvY42U9/O0/tYE6UYwRYJ1ktKRs2DdZ1Jrgcg==} - engines: {node: '>= 14'} + peerjs@1.5.0: dependencies: '@msgpack/msgpack': 2.8.0 cbor-x: 1.5.4 eventemitter3: 4.0.7 peerjs-js-binarypack: 2.0.0 webrtc-adapter: 8.2.3 - dev: false - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + pend@1.2.0: {} - /performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + performance-now@2.1.0: {} - /phin@2.9.3: - resolution: {integrity: sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==} - dev: false + phin@2.9.3: {} - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@2.3.1: {} - /pidtree@0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + pidtree@0.3.1: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} + pify@2.3.0: {} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true + pify@3.0.0: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: true + pify@4.0.1: {} - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true + pirates@4.0.6: {} - /pixelmatch@4.0.2: - resolution: {integrity: sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==} - hasBin: true + pixelmatch@4.0.2: dependencies: pngjs: 3.4.0 - dev: false - /pkg-dir@3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} - engines: {node: '>=6'} + pkg-dir@3.0.0: dependencies: find-up: 3.0.0 - dev: true - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - dev: true - /pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} + pkg-dir@5.0.0: dependencies: find-up: 5.0.0 - dev: true - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + pkg-types@1.0.3: dependencies: jsonc-parser: 3.2.0 mlly: 1.4.2 pathe: 1.1.1 - dev: true - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true + pluralize@8.0.0: {} - /pngjs@3.4.0: - resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} - engines: {node: '>=4.0.0'} - dev: false + pngjs@3.4.0: {} - /polished@4.2.2: - resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} - engines: {node: '>=10'} + polished@4.2.2: dependencies: '@babel/runtime': 7.22.11 - dev: true - /poly-decomp@0.3.0: - resolution: {integrity: sha512-hWeBxGzPYiybmI4548Fca7Up/0k1qS5+79cVHI9+H33dKya5YNb9hxl0ZnDaDgvrZSuYFBhkCK/HOnqN7gefkQ==} - dev: false + poly-decomp@0.3.0: {} - /portfinder@1.0.32: - resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} - engines: {node: '>= 0.12.0'} + portfinder@1.0.32: dependencies: async: 2.6.4 debug: 3.2.7(supports-color@8.1.1) mkdirp: 0.5.6 transitivePeerDependencies: - supports-color - dev: true - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: true + possible-typed-array-names@1.0.0: {} - /postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.31: dependencies: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.38: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 - dev: true - /potpack@1.0.2: - resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} - dev: false + potpack@1.0.2: {} - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true + prebuild-install@7.1.1: dependencies: detect-libc: 2.0.2 expand-template: 2.0.3 @@ -12375,228 +16383,189 @@ packages: simple-get: 4.0.1 tar-fs: 2.1.1 tunnel-agent: 0.6.0 - dev: false - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /prettier@1.19.1: - resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} - engines: {node: '>=4'} - hasBin: true - dev: false + prettier@1.19.1: {} - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true + prettier@2.8.8: {} - /pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} + pretty-bytes@5.6.0: {} - /pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} - dev: false + pretty-bytes@6.1.1: {} - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 - dev: true - /pretty-hrtime@1.0.3: - resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} - engines: {node: '>= 0.8'} - dev: true + pretty-hrtime@1.0.3: {} - /prismarine-auth@2.4.2: - resolution: {integrity: sha512-Cq4woGobnFYYfMBDh1WITW+Vs98toN91qAFBvBitwV7IwJaiSAh2Nl+WPUEGeg5eLBoSPpSyCVT8P2oi7Cav8g==} + prismarine-auth@2.4.2(encoding@0.1.13): dependencies: '@azure/msal-node': 2.7.0 '@xboxreplay/xboxlive-auth': 3.3.3(debug@4.3.4) debug: 4.3.4(supports-color@8.1.1) jose: 4.15.5 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) smart-buffer: 4.2.0 uuid-1345: 1.0.2 transitivePeerDependencies: - encoding - supports-color - /prismarine-biome@1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0): - resolution: {integrity: sha512-GY6nZxq93mTErT7jD7jt8YS1aPrOakbJHh39seYsJFXvueIOdHAmW16kYQVrTVMW5MlWLQVxV/EquRwOgr4MnQ==} - peerDependencies: - minecraft-data: 3.62.0 - prismarine-registry: ^1.1.0 + prismarine-biome@1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0): dependencies: minecraft-data: 3.62.0 prismarine-registry: 1.7.0 - /prismarine-chat@1.9.1: - resolution: {integrity: sha512-x7WWa5MNhiLZSO6tw+YyKpzquFZ+DNISVgiV6K3SU0GsishMXe+nto02WhF/4AuFerKdugm9u1d/r4C4zSkJOg==} + prismarine-block@https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0: + dependencies: + minecraft-data: 3.62.0 + prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) + prismarine-chat: 1.9.1 + prismarine-item: 1.14.0 + prismarine-nbt: 2.5.0 + prismarine-registry: 1.7.0 + + prismarine-chat@1.9.1: dependencies: mojangson: 2.0.4 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 - /prismarine-entity@2.3.1: - resolution: {integrity: sha512-HOv8l7IetHNf4hwZ7V/W4vM3GNl+e6VCtKDkH9h02TRq7jWngsggKtJV+VanCce/sNwtJUhJDjORGs728ep4MA==} + prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0): + dependencies: + prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + prismarine-nbt: 2.5.0 + prismarine-registry: 1.7.0 + smart-buffer: 4.2.0 + uint4: 0.1.2 + vec3: 0.1.8 + xxhash-wasm: 0.4.2 + transitivePeerDependencies: + - minecraft-data + + prismarine-entity@2.3.1: dependencies: prismarine-chat: 1.9.1 prismarine-item: 1.14.0 prismarine-registry: 1.7.0 vec3: 0.1.8 - /prismarine-item@1.14.0: - resolution: {integrity: sha512-udQHYGJ05klFe8Kkc0TOmwoXj5Xl1ZPgHVoMbGUAFB9exN4TFxEa1A39vkSYhxP5Et9PNufQQvFBFVom0nXikA==} + prismarine-item@1.14.0: dependencies: prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 - /prismarine-nbt@2.2.1: - resolution: {integrity: sha512-Mb50c58CPnuZ+qvM31DBa08tf9UumlTq1LkvpMoUpKfCuN05GZHTqCUwER3lxTSHLL0GZKghIPbYR/JQkINijQ==} + prismarine-nbt@2.2.1: dependencies: protodef: 1.15.0 - /prismarine-nbt@2.5.0: - resolution: {integrity: sha512-F0/8UAa9SDDnAGrBYqZc4nG8h2zj5cE2eAJU5xlDR/IsQQ3moVxkOjE3h3nMv6SbvZrvAcgX7waA/nd9LLHYdA==} + prismarine-nbt@2.5.0: dependencies: protodef: 1.15.0 - /prismarine-physics@1.8.0: - resolution: {integrity: sha512-gbM+S+bmVtOKVv+Z0WGaHMeEeBHISIDsRDRlv8sr0dex3ZJRhuq8djA02CBreguXtI18ZKh6q3TSj2qDr45NHA==} + prismarine-physics@1.8.0: dependencies: minecraft-data: 3.62.0 prismarine-nbt: 2.5.0 vec3: 0.1.8 - dev: true - /prismarine-realms@1.3.2: - resolution: {integrity: sha512-5apl9Ru8veTj5q2OozRc4GZOuSIcs3yY4UEtALiLKHstBe8bRw8vNlaz4Zla3jsQ8yP/ul1b1IJINTRbocuA6g==} + prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0): + dependencies: + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) + prismarine-nbt: 2.5.0 + uint4: 0.1.2 + vec3: 0.1.8 + transitivePeerDependencies: + - minecraft-data + + prismarine-realms@1.3.2(encoding@0.1.13): dependencies: debug: 4.3.4(supports-color@8.1.1) - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color - /prismarine-recipe@1.3.1(prismarine-registry@1.7.0): - resolution: {integrity: sha512-xfa9E9ACoaDi+YzNQ+nk8kWSIqt5vSZOOCHIT+dTXscf/dng2HaJ/59uwe1D/jvOkAd2OvM6RRJM6fFe0q/LDA==} - peerDependencies: - prismarine-registry: ^1.4.0 + prismarine-recipe@1.3.1(prismarine-registry@1.7.0): dependencies: prismarine-registry: 1.7.0 - dev: true - /prismarine-registry@1.7.0: - resolution: {integrity: sha512-yyva0FpWI078nNeMhx8ekVza5uUTYhEv+C+ADu3wUQXiG8qhXkvrf0uzsnhTgZL8BLdsi2axgCEiKw9qSKIuxQ==} + prismarine-registry@1.7.0: dependencies: minecraft-data: 3.62.0 prismarine-nbt: 2.5.0 - /prismarine-schematic@1.2.3: - resolution: {integrity: sha512-Mwpn43vEHhm3aw3cPhJjWqztkW+nX+QLajDHlTask8lEOTGl1WmpvFja4iwiws4GIvaC8x0Foptf4uvDsnjrAg==} + prismarine-schematic@1.2.3: dependencies: minecraft-data: 3.62.0 - prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-nbt: 2.2.1 - prismarine-world: github.com/zardoy/prismarine-world/6ae6f009d38460de284f8c226c665f04cbad9465 + prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465 vec3: 0.1.8 - dev: false - /prismarine-windows@2.9.0: - resolution: {integrity: sha512-fm4kOLjGFPov7TEJRmXHoiPabxIQrG36r2mDjlNxfkcLfMHFb3/1ML6mp4iRQa7wL0GK4DIAyiBqCWoeWDxARg==} + prismarine-windows@2.9.0: dependencies: prismarine-item: 1.14.0 prismarine-registry: 1.7.0 typed-emitter: 2.1.0 - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + prismarine-world@https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465: + dependencies: + vec3: 0.1.8 - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + process-nextick-args@2.0.1: {} - /progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - dev: true + process@0.11.10: {} - /promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - requiresBuild: true - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - dev: false + process@https://codeload.github.com/PrismarineJS/node-process/tar.gz/380d0b4f4c86f1b65b216c311bf00431f314e88e: {} + + progress@2.0.3: {} + + promise-inflight@1.0.1: optional: true - /promise-queue@2.2.5: - resolution: {integrity: sha512-p/iXrPSVfnqPft24ZdNNLECw/UrtLTpT3jpAAMzl/o5/rDsGCPo3/CQS2611flL6LkoEJ3oQZw7C8Q80ZISXRQ==} - engines: {node: '>= 0.8.0'} - dev: false + promise-queue@2.2.5: {} - /promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - requiresBuild: true + promise-retry@2.0.1: dependencies: err-code: 2.0.3 retry: 0.12.0 - dev: false optional: true - /promise@5.0.0: - resolution: {integrity: sha512-N2BfLz0Sigf7rsm5NnItRwTNqEDUF2ephwEXTcOAf2cO9NwZ9TnIjOmnQNtC0r70CV0S1+uc9mSMmFH7gxk87Q==} + promise@5.0.0: dependencies: asap: 1.0.0 - dev: false - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - dev: true - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - /prosemirror-commands@1.5.2: - resolution: {integrity: sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==} + prosemirror-commands@1.5.2: dependencies: prosemirror-model: 1.19.4 prosemirror-state: 1.4.3 prosemirror-transform: 1.8.0 - dev: false - /prosemirror-dropcursor@1.8.1: - resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} + prosemirror-dropcursor@1.8.1: dependencies: prosemirror-state: 1.4.3 prosemirror-transform: 1.8.0 prosemirror-view: 1.33.1 - dev: false - /prosemirror-example-setup@1.2.2: - resolution: {integrity: sha512-pHJc656IgYm249RNp0eQaWNmnyWGk6OrzysWfYI4+NwE14HQ7YNYOlRBLErUS6uCAHIYJLNXf0/XCmf1OCtNbQ==} + prosemirror-example-setup@1.2.2: dependencies: prosemirror-commands: 1.5.2 prosemirror-dropcursor: 1.8.1 @@ -12607,125 +16576,92 @@ packages: prosemirror-menu: 1.2.4 prosemirror-schema-list: 1.3.0 prosemirror-state: 1.4.3 - dev: false - /prosemirror-gapcursor@1.3.2: - resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} + prosemirror-gapcursor@1.3.2: dependencies: prosemirror-keymap: 1.2.2 prosemirror-model: 1.19.4 prosemirror-state: 1.4.3 prosemirror-view: 1.33.1 - dev: false - /prosemirror-history@1.3.2: - resolution: {integrity: sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==} + prosemirror-history@1.3.2: dependencies: prosemirror-state: 1.4.3 prosemirror-transform: 1.8.0 prosemirror-view: 1.33.1 rope-sequence: 1.3.4 - dev: false - /prosemirror-inputrules@1.4.0: - resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==} + prosemirror-inputrules@1.4.0: dependencies: prosemirror-state: 1.4.3 prosemirror-transform: 1.8.0 - dev: false - /prosemirror-keymap@1.2.2: - resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} + prosemirror-keymap@1.2.2: dependencies: prosemirror-state: 1.4.3 w3c-keyname: 2.2.8 - dev: false - /prosemirror-markdown@1.12.0: - resolution: {integrity: sha512-6F5HS8Z0HDYiS2VQDZzfZP6A0s/I0gbkJy8NCzzDMtcsz3qrfqyroMMeoSjAmOhDITyon11NbXSzztfKi+frSQ==} + prosemirror-markdown@1.12.0: dependencies: markdown-it: 14.0.0 prosemirror-model: 1.19.4 - dev: false - /prosemirror-menu@1.2.4: - resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} + prosemirror-menu@1.2.4: dependencies: crelt: 1.0.6 prosemirror-commands: 1.5.2 prosemirror-history: 1.3.2 prosemirror-state: 1.4.3 - dev: false - /prosemirror-model@1.19.4: - resolution: {integrity: sha512-RPmVXxUfOhyFdayHawjuZCxiROsm9L4FCUA6pWI+l7n2yCBsWy9VpdE1hpDHUS8Vad661YLY9AzqfjLhAKQ4iQ==} + prosemirror-model@1.19.4: dependencies: orderedmap: 2.1.1 - dev: false - /prosemirror-schema-list@1.3.0: - resolution: {integrity: sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==} + prosemirror-schema-list@1.3.0: dependencies: prosemirror-model: 1.19.4 prosemirror-state: 1.4.3 prosemirror-transform: 1.8.0 - dev: false - /prosemirror-state@1.4.3: - resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} + prosemirror-state@1.4.3: dependencies: prosemirror-model: 1.19.4 prosemirror-transform: 1.8.0 prosemirror-view: 1.33.1 - dev: false - /prosemirror-transform@1.8.0: - resolution: {integrity: sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==} + prosemirror-transform@1.8.0: dependencies: prosemirror-model: 1.19.4 - dev: false - /prosemirror-view@1.33.1: - resolution: {integrity: sha512-62qkYgSJIkwIMMCpuGuPzc52DiK1Iod6TWoIMxP4ja6BTD4yO8kCUL64PZ/WhH/dJ9fW0CDO39FhH1EMyhUFEg==} + prosemirror-view@1.33.1: dependencies: prosemirror-model: 1.19.4 prosemirror-state: 1.4.3 prosemirror-transform: 1.8.0 - dev: false - /protodef-validator@1.3.1: - resolution: {integrity: sha512-lZ5FWKZYR9xOjpMw1+EfZRfCjzNRQWPq+Dk+jki47Sikl2EeWEPnTfnJERwnU/EwFq6us+0zqHHzSsmLeYX+Lg==} - hasBin: true + protodef-validator@1.3.1: dependencies: ajv: 6.12.6 - /protodef@1.15.0: - resolution: {integrity: sha512-bZ2Omw8dT+DACjJHLrBWZlqN4MlT9g9oSpJDdkUAJOStUzgJp+Zn42FJfPUdwutUxjaxA0PftN0PDlNa2XbneA==} - engines: {node: '>=14'} + protodef@1.15.0: dependencies: lodash.get: 4.4.2 lodash.reduce: 4.6.0 protodef-validator: 1.3.1 readable-stream: 3.6.2 - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - /proxy-compare@2.5.1: - resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + proxy-compare@2.5.1: {} - /proxy-from-env@1.0.0: - resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} + proxy-from-env@1.0.0: {} - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + psl@1.9.0: {} - /public-encrypt@4.0.3: - resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + public-encrypt@4.0.3: dependencies: bn.js: 4.12.0 browserify-rsa: 4.1.0 @@ -12733,45 +16669,30 @@ packages: parse-asn1: 5.1.6 randombytes: 2.1.0 safe-buffer: 5.2.1 - dev: true - /pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@2.0.1: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - /pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pumpify@1.5.1: dependencies: duplexify: 3.7.1 inherits: 2.0.4 pump: 2.0.1 - dev: true - /punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - dev: false + punycode.js@2.3.1: {} - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} + punycode@2.3.0: {} - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + punycode@2.3.1: {} - /puppeteer-core@2.1.1: - resolution: {integrity: sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==} - engines: {node: '>=8.16.0'} + puppeteer-core@2.1.1: dependencies: '@types/mime-types': 2.1.2 debug: 4.3.4(supports-color@8.1.1) @@ -12787,155 +16708,94 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /qrcode.react@3.1.0(react@18.2.0): - resolution: {integrity: sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==} - peerDependencies: - react: ^18.2.0 + qrcode.react@3.1.0(react@18.2.0): dependencies: react: 18.2.0 - dev: false - /qs@6.10.4: - resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} - engines: {node: '>=0.6'} + qs@6.10.4: dependencies: side-channel: 1.0.5 - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} + qs@6.11.0: dependencies: side-channel: 1.0.4 - /qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} - engines: {node: '>=0.6'} + qs@6.11.2: dependencies: side-channel: 1.0.4 - dev: true - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + querystringify@2.2.0: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: true + quick-lru@5.1.1: {} - /quickselect@2.0.0: - resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} - dev: false + quickselect@2.0.0: {} - /railroad-diagrams@1.0.0: - resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} + railroad-diagrams@1.0.0: {} - /rambda@6.9.0: - resolution: {integrity: sha512-yosVdGg1hNGkXPzqGiOYNEpXKjEOxzUCg2rB0l+NKdyCaSf4z+i5ojbN0IqDSezMMf71YEglI+ZUTgTffn5afw==} - dev: false + rambda@6.9.0: {} - /ramda@0.29.0: - resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} - dev: true + ramda@0.29.0: {} - /randexp@0.4.6: - resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} - engines: {node: '>=0.12'} + randexp@0.4.6: dependencies: discontinuous-range: 1.0.0 ret: 0.1.15 - /random-seed@0.3.0: - resolution: {integrity: sha512-y13xtn3kcTlLub3HKWXxJNeC2qK4mB59evwZ5EkeRlolx+Bp2ztF7LbcZmyCnOqlHQrLnfuNbi1sVmm9lPDlDA==} - engines: {node: '>= 0.6.0'} + random-seed@0.3.0: dependencies: json-stringify-safe: 5.0.1 - dev: false - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - /randomfill@1.0.4: - resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + randomfill@1.0.4: dependencies: randombytes: 2.1.0 safe-buffer: 5.2.1 - dev: true - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + range-parser@1.2.1: {} - /range@0.0.3: - resolution: {integrity: sha512-OxK2nY2bmeEB4NxoBraQIBOOeOIxoBvm6yt8MA1kLappgkG3SyLf173iOtT5woWycrtESDD2g0Nl2yt8YPoUnw==} - engines: {node: '>=0.8'} - dev: false + range@0.0.3: {} - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} + raw-body@2.5.1: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + raw-body@2.5.2: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - dev: false - /rbush@3.0.1: - resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==} + rbush@3.0.1: dependencies: quickselect: 2.0.0 - dev: false - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - requiresBuild: true + rc@1.2.8: dependencies: deep-extend: 0.6.0 ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: false - /react-colorful@5.6.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} - peerDependencies: - react: ^18.2.0 - react-dom: '>=16.8.0' + react-colorful@5.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true - /react-docgen-typescript@2.2.2(typescript@5.2.2): - resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} - peerDependencies: - typescript: '>= 4.3.x' + react-docgen-typescript@2.2.2(typescript@5.2.2): dependencies: typescript: 5.2.2 - dev: true - /react-docgen@6.0.0-alpha.3: - resolution: {integrity: sha512-DDLvB5EV9As1/zoUsct6Iz2Cupw9FObEGD3DMcIs3EDFIoSKyz8FZtoWj3Wj+oodrU4/NfidN0BL5yrapIcTSA==} - engines: {node: '>=12.0.0'} - hasBin: true + react-docgen@6.0.0-alpha.3: dependencies: '@babel/core': 7.22.11 '@babel/generator': 7.22.10 @@ -12949,140 +16809,78 @@ packages: strip-indent: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 + react-dom@18.2.0(react@18.2.0): dependencies: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 - /react-element-to-jsx-string@15.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} - peerDependencies: - react: ^18.2.0 - react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + react-element-to-jsx-string@15.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@base2/pretty-print-object': 1.0.1 is-plain-object: 5.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-is: 18.1.0 - dev: true - /react-fast-compare@3.2.2: - resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} - dev: false + react-fast-compare@3.2.2: {} - /react-inspector@6.0.2(react@18.2.0): - resolution: {integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==} - peerDependencies: - react: ^18.2.0 + react-inspector@6.0.2(react@18.2.0): dependencies: react: 18.2.0 - dev: true - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@16.13.1: {} - /react-is@18.1.0: - resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} - dev: true + react-is@18.1.0: {} - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true + react-is@18.2.0: {} - /react-popper@2.3.0(@popperjs/core@2.11.8)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==} - peerDependencies: - '@popperjs/core': ^2.0.0 - react: ^18.2.0 - react-dom: ^16.8.0 || ^17 || ^18 + react-popper@2.3.0(@popperjs/core@2.11.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@popperjs/core': 2.11.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-fast-compare: 3.2.2 warning: 4.0.3 - dev: false - /react-portal@4.2.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-fE9kOBagwmTXZ3YGRYb4gcMy+kSA+yLO0xnPankjRlfBv4uCpFXqKPfkpsGQQR15wkZ9EssnvTOl1yMzbkxhPQ==} - peerDependencies: - react: ^18.2.0 - react-dom: ^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0 + react-portal@4.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /react-refresh@0.14.0: - resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} - engines: {node: '>=0.10.0'} - dev: true + react-refresh@0.14.0: {} - /react-remove-scroll-bar@2.3.4(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + react-remove-scroll-bar@2.3.4(@types/react@18.2.20)(react@18.2.0): dependencies: - '@types/react': 18.2.20 react: 18.2.0 react-style-singleton: 2.2.1(@types/react@18.2.20)(react@18.2.0) tslib: 2.6.2 - dev: true - - /react-remove-scroll@2.5.5(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: + optionalDependencies: '@types/react': 18.2.20 + + react-remove-scroll@2.5.5(@types/react@18.2.20)(react@18.2.0): + dependencies: react: 18.2.0 react-remove-scroll-bar: 2.3.4(@types/react@18.2.20)(react@18.2.0) react-style-singleton: 2.2.1(@types/react@18.2.20)(react@18.2.0) tslib: 2.6.2 use-callback-ref: 1.3.0(@types/react@18.2.20)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.2.20)(react@18.2.0) - dev: true - - /react-style-singleton@2.2.1(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: + optionalDependencies: '@types/react': 18.2.20 + + react-style-singleton@2.2.1(@types/react@18.2.20)(react@18.2.0): + dependencies: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 tslib: 2.6.2 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} - peerDependencies: - react: ^18.2.0 - react-dom: '>=16.6.0' + react-transition-group@4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.22.11 dom-helpers: 5.2.1 @@ -13090,34 +16888,19 @@ packages: prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.2): - resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} - peerDependencies: - react: ^18.2.0 - tslib: '*' + react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.2): dependencies: react: 18.2.0 tslib: 2.6.2 - dev: false - /react-use-measure@2.1.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==} - peerDependencies: - react: ^18.2.0 - react-dom: '>=16.13' + react-use-measure@2.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: debounce: 1.2.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /react-use@17.3.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-hs7+tS4rRm1QLHPfanLCqXIi632tP4V7Sai1ENUP2WTufU6am++tU9uSw9YrNCFqbABiEv0ndKU1XCUcfu2tXA==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 + react-use@17.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@types/js-cookie': 2.2.7 '@xobotyi/scrollbar-width': 1.9.5 @@ -13125,7 +16908,7 @@ packages: fast-deep-equal: 3.1.3 fast-shallow-equal: 1.0.0 js-cookie: 2.2.1 - nano-css: 5.3.5(react-dom@18.2.0)(react@18.2.0) + nano-css: 5.3.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.6.2) @@ -13135,74 +16918,52 @@ packages: throttle-debounce: 3.0.1 ts-easing: 0.2.0 tslib: 2.6.2 - dev: false - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} + react@18.2.0: dependencies: loose-envify: 1.4.0 - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: true - /read-pkg-up@8.0.0: - resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} - engines: {node: '>=12'} + read-pkg-up@8.0.0: dependencies: find-up: 5.0.0 read-pkg: 6.0.0 type-fest: 1.4.0 - dev: true - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 - dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.2 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: true - /read-pkg@6.0.0: - resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==} - engines: {node: '>=12'} + read-pkg@6.0.0: dependencies: '@types/normalize-package-data': 2.4.2 normalize-package-data: 3.0.3 parse-json: 5.2.0 type-fest: 1.4.0 - dev: true - /readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} - requiresBuild: true + readable-stream@1.0.34: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 isarray: 0.0.1 string_decoder: 0.10.31 - dev: false optional: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -13212,17 +16973,13 @@ packages: string_decoder: 1.1.1 util-deprecate: 1.0.2 - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readable-stream@4.5.2: dependencies: abort-controller: 3.0.0 buffer: 6.0.3 @@ -13230,49 +16987,33 @@ packages: process: 0.11.10 string_decoder: 1.3.0 - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: true - /readline@1.3.0: - resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} - dev: false + readline@1.3.0: {} - /recast@0.21.5: - resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} - engines: {node: '>= 4'} + recast@0.21.5: dependencies: ast-types: 0.15.2 esprima: 4.0.1 source-map: 0.6.1 tslib: 2.6.2 - dev: true - /recast@0.23.4: - resolution: {integrity: sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==} - engines: {node: '>= 4'} + recast@0.23.4: dependencies: assert: 2.0.0 ast-types: 0.16.1 esprima: 4.0.1 source-map: 0.6.1 tslib: 2.6.2 - dev: true - /redent@4.0.0: - resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} - engines: {node: '>=12'} + redent@4.0.0: dependencies: indent-string: 5.0.0 strip-indent: 4.0.0 - dev: true - /reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} + reflect.getprototypeof@1.0.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -13281,60 +17022,39 @@ packages: get-intrinsic: 1.2.4 globalthis: 1.0.3 which-builtin-type: 1.1.3 - dev: true - /regenerate-unicode-properties@10.1.0: - resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} - engines: {node: '>=4'} + regenerate-unicode-properties@10.1.0: dependencies: regenerate: 1.4.2 - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + regenerate@1.4.2: {} - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: false + regenerator-runtime@0.13.11: {} - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + regenerator-runtime@0.14.0: {} - /regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regenerator-transform@0.15.2: dependencies: '@babel/runtime': 7.22.11 - /regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - dev: true + regexp-tree@0.1.27: {} - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.1: dependencies: call-bind: 1.0.2 define-properties: 1.2.1 set-function-name: 2.0.1 - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - dev: true - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true + regexpp@3.2.0: {} - /regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} + regexpu-core@5.3.2: dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 @@ -13343,31 +17063,23 @@ packages: unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 - /regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true - dependencies: - jsesc: 0.5.0 - dev: true - - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true + regjsparser@0.10.0: dependencies: jsesc: 0.5.0 - /remark-external-links@8.0.0: - resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} + regjsparser@0.9.1: + dependencies: + jsesc: 0.5.0 + + remark-external-links@8.0.0: dependencies: extend: 3.0.2 is-absolute-url: 3.0.3 mdast-util-definitions: 4.0.0 space-separated-tokens: 1.1.5 unist-util-visit: 2.0.3 - dev: true - /remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-from-markdown: 2.0.0 @@ -13375,26 +17087,20 @@ packages: unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: false - /remark-slug@6.1.0: - resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} + remark-slug@6.1.0: dependencies: github-slugger: 1.5.0 mdast-util-to-string: 1.1.0 unist-util-visit: 2.0.3 - dev: true - /remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-to-markdown: 2.1.0 unified: 11.0.4 - dev: false - /remark@15.0.1: - resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + remark@15.0.1: dependencies: '@types/mdast': 4.0.3 remark-parse: 11.0.0 @@ -13402,270 +17108,165 @@ packages: unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: false - /request-progress@3.0.0: - resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} + request-progress@3.0.0: dependencies: throttleit: 1.0.0 - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + require-directory@2.1.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: false + require-from-string@2.0.2: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + requires-port@1.0.0: {} - /resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - dev: false + resize-observer-polyfill@1.5.1: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@5.0.0: {} - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: false + resolve-pkg-maps@1.0.0: {} - /resolve@1.22.4: - resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} - hasBin: true + resolve@1.22.4: dependencies: is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true + resolve@2.0.0-next.5: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - /ret@0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} + ret@0.1.15: {} - /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - requiresBuild: true - dev: false + retry@0.12.0: optional: true - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + reusify@1.0.4: {} - /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + rfdc@1.3.0: {} - /rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - hasBin: true + rimraf@2.6.3: dependencies: glob: 7.2.3 - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@2.7.1: dependencies: glob: 7.2.3 - /rimraf@5.0.1: - resolution: {integrity: sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==} - engines: {node: '>=14'} - hasBin: true + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rimraf@5.0.1: dependencies: glob: 10.3.3 - dev: true - /ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + ripemd160@2.0.2: dependencies: hash-base: 3.1.0 inherits: 2.0.4 - dev: true - /rollup-plugin-terser@7.0.2(rollup@2.79.1): - resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser - peerDependencies: - rollup: ^2.0.0 + rollup-plugin-terser@7.0.2(rollup@2.79.1): dependencies: '@babel/code-frame': 7.22.13 jest-worker: 26.6.2 rollup: 2.79.1 serialize-javascript: 4.0.0 terser: 5.19.2 - dev: false - /rollup@2.79.1: - resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} - engines: {node: '>=10.0.0'} - hasBin: true + rollup@2.79.1: optionalDependencies: fsevents: 2.3.3 - /rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true + rollup@3.29.4: optionalDependencies: fsevents: 2.3.3 - /rope-sequence@1.3.4: - resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} - dev: false + rope-sequence@1.3.4: {} - /rtl-css-js@1.16.1: - resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + rtl-css-js@1.16.1: dependencies: '@babel/runtime': 7.22.11 - dev: false - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - requiresBuild: true + rxjs@7.8.1: dependencies: tslib: 2.6.2 - /safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.0.1: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 has-symbols: 1.0.3 isarray: 2.0.5 - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + safe-regex-test@1.0.0: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-regex: 1.1.4 - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - dev: true - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + safer-buffer@2.1.2: {} - /sanitize-filename@1.6.3: - resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + sanitize-filename@1.6.3: dependencies: truncate-utf8-bytes: 1.0.2 - dev: false - /sat@0.9.0: - resolution: {integrity: sha512-mxdv5RZJO4tdMnUURGU3gAMcnDUEwcNJwE+lPO0/V+rBeDvFLH3wEZEOR0fH7cTN0zQaNxBEbHnyQL9DzupwQQ==} - dev: false + sat@0.9.0: {} - /sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - dev: false + sax@1.3.0: {} - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + scheduler@0.23.0: dependencies: loose-envify: 1.4.0 - /screenfull@5.2.0: - resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} - engines: {node: '>=0.10.0'} - dev: false + screenfull@5.2.0: {} - /sdp@3.2.0: - resolution: {integrity: sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw==} - dev: false + sdp@3.2.0: {} - /secure-compare@3.0.1: - resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} - dev: true + secure-compare@3.0.1: {} - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + semver@6.3.1: {} - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true + semver@7.5.4: dependencies: lru-cache: 6.0.0 - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + send@0.18.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -13683,23 +17284,17 @@ packages: transitivePeerDependencies: - supports-color - /sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + sentence-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 - dev: false - /serialize-javascript@4.0.0: - resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + serialize-javascript@4.0.0: dependencies: randombytes: 2.1.0 - dev: false - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + serve-static@1.15.0: dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 @@ -13708,13 +17303,9 @@ packages: transitivePeerDependencies: - supports-color - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: false + set-blocking@2.0.0: {} - /set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} - engines: {node: '>= 0.4'} + set-function-length@1.2.1: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -13723,54 +17314,35 @@ packages: gopd: 1.0.1 has-property-descriptors: 1.0.2 - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} + set-function-name@2.0.1: dependencies: define-data-property: 1.1.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.0 - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: true - /set-harmonic-interval@1.0.1: - resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} - engines: {node: '>=6.9'} - dev: false + set-harmonic-interval@1.0.1: {} - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setimmediate@1.0.5: {} - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + setprototypeof@1.2.0: {} - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true + sha.js@2.4.11: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - dev: true - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 - dev: true - /sharp@0.30.7: - resolution: {integrity: sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==} - engines: {node: '>=12.13.0'} - requiresBuild: true + sharp@0.30.7: dependencies: color: 4.2.3 detect-libc: 2.0.2 @@ -13780,168 +17352,110 @@ packages: simple-get: 4.0.1 tar-fs: 2.1.1 tunnel-agent: 0.6.0 - dev: false - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 - dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true + shebang-regex@1.0.0: {} - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + shebang-regex@3.0.0: {} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true + shell-quote@1.8.1: {} - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel@1.0.4: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 object-inspect: 1.12.3 - /side-channel@1.0.5: - resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} - engines: {node: '>= 0.4'} + side-channel@1.0.5: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - dev: true - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true + siginfo@2.0.0: {} - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: true + signal-exit@4.1.0: {} - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: false + simple-concat@1.0.1: {} - /simple-get@3.1.1: - resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + simple-get@3.1.1: dependencies: decompress-response: 4.2.1 once: 1.4.0 simple-concat: 1.0.1 - dev: false - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-get@4.0.1: dependencies: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 - dev: false - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 - dev: false - /simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} + simple-update-notifier@2.0.0: dependencies: semver: 7.6.0 - dev: true - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true + sisteransi@1.0.5: {} - /skinview-utils@0.7.1: - resolution: {integrity: sha512-4eLrMqR526ehlZbsd8SuZ/CHpS9GiH0xUMoV+PYlJVi95ZFz5HJu7Spt5XYa72DRS7wgt5qquvHZf0XZJgmu9Q==} - dev: false + skinview-utils@0.7.1: {} - /skinview3d@3.0.1: - resolution: {integrity: sha512-2LUSkzGxlZrTQelGT10jcW4TLiFTg5aZqXMEuqAFoWtk3qtaNu0qRFtwK5dN8zEXyKUJ3xlxah5eGtKY/NifQg==} + skinview3d@3.0.1: dependencies: '@types/three': 0.156.0 skinview-utils: 0.7.1 three: 0.154.0 - dev: false - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + slash@3.0.0: {} - /slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} + slice-ansi@3.0.0: dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} + slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + smart-buffer@4.2.0: {} - /snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + snake-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false - /socket.io-adapter@1.1.2: - resolution: {integrity: sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==} - dev: false + socket.io-adapter@1.1.2: {} - /socket.io-adapter@2.5.2: - resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} + socket.io-adapter@2.5.2: dependencies: ws: 8.11.0 transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /socket.io-client@2.5.0: - resolution: {integrity: sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==} + socket.io-client@2.5.0: dependencies: backo2: 1.0.2 component-bind: 1.0.0 @@ -13958,11 +17472,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /socket.io-client@4.7.2: - resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} - engines: {node: '>=10.0.0'} + socket.io-client@4.7.2: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4(supports-color@8.1.1) @@ -13972,41 +17483,31 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /socket.io-parser@3.3.3: - resolution: {integrity: sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==} + socket.io-parser@3.3.3: dependencies: component-emitter: 1.3.0 debug: 3.1.0 isarray: 2.0.1 transitivePeerDependencies: - supports-color - dev: false - /socket.io-parser@3.4.3: - resolution: {integrity: sha512-1rE4dZN3kCI/E5wixd393hmbqa78vVpkKmnEJhLeWoS/C5hbFYAbcSfnWoaVH43u9ToUVtzKjguxEZq+1XZfCQ==} - engines: {node: '>=10.0.0'} + socket.io-parser@3.4.3: dependencies: component-emitter: 1.2.1 debug: 4.1.1 isarray: 2.0.1 transitivePeerDependencies: - supports-color - dev: false - /socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} + socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: false - /socket.io@2.5.0: - resolution: {integrity: sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==} + socket.io@2.5.0: dependencies: debug: 4.1.1 engine.io: 3.6.1 @@ -14018,11 +17519,8 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /socket.io@4.7.2: - resolution: {integrity: sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==} - engines: {node: '>=10.2.0'} + socket.io@4.7.2: dependencies: accepts: 1.3.8 base64id: 2.0.0 @@ -14035,106 +17533,62 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - /socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} - requiresBuild: true + socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 debug: 4.3.4(supports-color@8.1.1) socks: 2.7.1 transitivePeerDependencies: - supports-color - dev: false optional: true - /socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} - requiresBuild: true + socks@2.7.1: dependencies: ip: 2.0.0 smart-buffer: 4.2.0 - dev: false optional: true - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} + source-map-js@1.0.2: {} - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - dev: true + source-map-js@1.2.0: {} - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - /source-map@0.5.6: - resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} - engines: {node: '>=0.10.0'} - dev: false + source-map@0.5.6: {} - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: false + source-map@0.5.7: {} - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + source-map@0.6.1: {} - /source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 - dev: false - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: false + sourcemap-codec@1.4.8: {} - /space-separated-tokens@1.1.5: - resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} - dev: true + space-separated-tokens@1.1.5: {} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.13 - dev: true - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true + spdx-exceptions@2.3.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.13 - dev: true - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} - dev: true + spdx-license-ids@3.0.13: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true + sprintf-js@1.0.3: {} - /sshpk@1.17.0: - resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} - engines: {node: '>=0.10.0'} - hasBin: true + sshpk@1.17.0: dependencies: asn1: 0.2.6 assert-plus: 1.0.0 @@ -14146,110 +17600,71 @@ packages: safer-buffer: 2.1.2 tweetnacl: 0.14.5 - /ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - requiresBuild: true + ssri@9.0.1: dependencies: minipass: 3.3.6 - dev: false optional: true - /stack-generator@2.0.10: - resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + stack-generator@2.0.10: dependencies: stackframe: 1.3.4 - dev: false - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true + stackback@0.0.2: {} - /stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - dev: false + stackframe@1.3.4: {} - /stacktrace-gps@3.1.2: - resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} + stacktrace-gps@3.1.2: dependencies: source-map: 0.5.6 stackframe: 1.3.4 - dev: false - /stacktrace-js@2.0.2: - resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + stacktrace-js@2.0.2: dependencies: error-stack-parser: 2.1.4 stack-generator: 2.0.10 stacktrace-gps: 3.1.2 - dev: false - /stats-gl@1.0.5: - resolution: {integrity: sha512-XimMxvwnf1Qf5KwebhcoA34kcX+fWEkIl0QjNkCbu4IpoyDMMsOajExn7FIq5w569k45+LhmsuRlGSrsvmGdNw==} - dev: false + stats-gl@1.0.5: {} - /stats.js@0.17.0: - resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==} - dev: false + stats.js@0.17.0: {} - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + statuses@2.0.1: {} - /std-env@3.4.3: - resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} - dev: true + std-env@3.4.3: {} - /store2@2.14.2: - resolution: {integrity: sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==} - dev: true + store2@2.14.2: {} - /storybook@7.4.6: - resolution: {integrity: sha512-YkFSpnR47j5zz7yElA+2axLjXN7K7TxDGJRHHlqXmG5iQ0PXzmjrj2RxMDKFz4Ybp/QjEUoJ4rx//ESEY0Nb5A==} - hasBin: true + storybook@7.4.6(encoding@0.1.13): dependencies: - '@storybook/cli': 7.4.6 + '@storybook/cli': 7.4.6(encoding@0.1.13) transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - dev: true - /stream-browserify@3.0.0: - resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + stream-browserify@3.0.0: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - /stream-shift@1.0.1: - resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} - dev: true + stream-shift@1.0.1: {} - /strict-event-emitter-types@2.0.0: - resolution: {integrity: sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==} - dev: false + strict-event-emitter-types@2.0.0: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true - /string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + string.prototype.matchall@4.0.10: dependencies: call-bind: 1.0.2 define-properties: 1.2.1 @@ -14260,11 +17675,8 @@ packages: regexp.prototype.flags: 1.5.1 set-function-name: 2.0.1 side-channel: 1.0.4 - dev: false - /string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} + string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -14278,203 +17690,128 @@ packages: regexp.prototype.flags: 1.5.2 set-function-name: 2.0.2 side-channel: 1.0.6 - dev: true - /string.prototype.padend@3.1.4: - resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true - - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} - engines: {node: '>= 0.4'} + string.prototype.padend@3.1.4: dependencies: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.8: + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + string.prototype.trimend@1.0.7: dependencies: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string.prototype.trimstart@1.0.7: dependencies: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - requiresBuild: true - dev: false + string_decoder@0.10.31: optional: true - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - /stringify-object@3.3.0: - resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} - engines: {node: '>=4'} + stringify-object@3.3.0: dependencies: get-own-enumerable-property-symbols: 3.0.2 is-obj: 1.0.1 is-regexp: 1.0.0 - dev: false - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: true - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + strip-bom@3.0.0: {} - /strip-comments@2.0.1: - resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} - engines: {node: '>=10'} - dev: false + strip-comments@2.0.1: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + strip-final-newline@2.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} - engines: {node: '>=12'} + strip-indent@4.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - requiresBuild: true - dev: false + strip-json-comments@2.0.1: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + strip-literal@1.3.0: dependencies: acorn: 8.10.0 - dev: true - /stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - dev: false + stylis@4.2.0: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + supports-preserve-symlinks-flag@1.0.0: {} - /synchronous-promise@2.0.17: - resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} - dev: true + synchronous-promise@2.0.17: {} - /systeminformation@5.22.7: - resolution: {integrity: sha512-AWxlP05KeHbpGdgvZkcudJpsmChc2Y5Eo/GvxG/iUA/Aws5LZKHAMSeAo+V+nD+nxWZaxrwpWcnx4SH3oxNL3A==} - engines: {node: '>=8.0.0'} - os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] - hasBin: true - requiresBuild: true - dev: false + systeminformation@5.22.7: optional: true - /tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - dev: false + tabbable@6.2.0: {} - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.1: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + tar-stream@2.2.0: dependencies: bl: 4.1.0 end-of-stream: 1.4.4 @@ -14482,9 +17819,7 @@ packages: inherits: 2.0.4 readable-stream: 3.6.2 - /tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} - engines: {node: '>=10'} + tar@6.2.0: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -14493,85 +17828,55 @@ packages: mkdirp: 1.0.4 yallist: 4.0.0 - /telejson@7.2.0: - resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} + telejson@7.2.0: dependencies: memoizerific: 1.11.3 - dev: true - /temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} + temp-dir@2.0.0: {} - /temp@0.8.4: - resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} - engines: {node: '>=6.0.0'} + temp@0.8.4: dependencies: rimraf: 2.6.3 - dev: true - /tempy@0.6.0: - resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} - engines: {node: '>=10'} + tempy@0.6.0: dependencies: is-stream: 2.0.1 temp-dir: 2.0.0 type-fest: 0.16.0 unique-string: 2.0.0 - dev: false - /tempy@1.0.1: - resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} - engines: {node: '>=10'} + tempy@1.0.1: dependencies: del: 6.1.1 is-stream: 2.0.1 temp-dir: 2.0.0 type-fest: 0.16.0 unique-string: 2.0.0 - dev: true - /terser@5.19.2: - resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} - engines: {node: '>=10'} - hasBin: true + terser@5.19.2: dependencies: '@jridgewell/source-map': 0.3.5 acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 - dev: false - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - dev: true - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - dev: false - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thenify@3.3.1: dependencies: any-promise: 1.3.0 - dev: false - /three-stdlib@2.28.5(three@0.154.0): - resolution: {integrity: sha512-JdLMhkpT+1ZWeQPyKQNW1zqUwISI2hsUljS6u3vB9lp5EvwsayaAzGnbVeR35895udOF+zxcTiQY3psk+qqlxg==} - peerDependencies: - three: 0.154.0 + three-stdlib@2.28.5(three@0.154.0): dependencies: '@types/draco3d': 1.4.7 '@types/offscreencanvas': 2019.7.2 @@ -14580,295 +17885,174 @@ packages: fflate: 0.6.10 potpack: 1.0.2 three: 0.154.0 - dev: false - /three.meshline@1.4.0: - resolution: {integrity: sha512-A8IsiMrWP8zmHisGDAJ76ZD7t/dOF/oCe/FUKNE6Bu01ZYEx8N6IlU/1Plb2aOZtAuWM2A8s8qS3hvY0OFuvOw==} - dev: false + three.meshline@1.4.0: {} - /three@0.154.0: - resolution: {integrity: sha512-Uzz8C/5GesJzv8i+Y2prEMYUwodwZySPcNhuJUdsVMH2Yn4Nm8qlbQe6qRN5fOhg55XB0WiLfTPBxVHxpE60ug==} + three@0.154.0: {} - /throttle-debounce@3.0.1: - resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} - engines: {node: '>=10'} - dev: false + throttle-debounce@3.0.1: {} - /throttleit@1.0.0: - resolution: {integrity: sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==} + throttleit@1.0.0: {} - /through2@0.6.5: - resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} - requiresBuild: true + through2@0.6.5: dependencies: readable-stream: 1.0.34 xtend: 4.0.2 - dev: false optional: true - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - dev: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + through@2.3.8: {} - /timers-browserify@2.0.12: - resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} - engines: {node: '>=0.6.0'} + timers-browserify@2.0.12: dependencies: setimmediate: 1.0.5 - dev: true - /timm@1.7.1: - resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==} - dev: false + timm@1.7.1: {} - /tiny-invariant@1.3.1: - resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} - dev: true + tiny-invariant@1.3.1: {} - /tinybench@2.5.1: - resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} - dev: true + tinybench@2.5.1: {} - /tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - dev: false + tinycolor2@1.6.0: {} - /tinypool@0.7.0: - resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} - engines: {node: '>=14.0.0'} - dev: true + tinypool@0.7.0: {} - /tinyspy@2.2.0: - resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} - engines: {node: '>=14.0.0'} - dev: true + tinyspy@2.2.0: {} - /title-case@3.0.3: - resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} + title-case@3.0.3: dependencies: tslib: 2.6.2 - dev: false - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} + tmp@0.2.1: dependencies: rimraf: 3.0.2 - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true + tmpl@1.0.5: {} - /to-array@0.1.4: - resolution: {integrity: sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==} - dev: false + to-array@0.1.4: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /tocbot@4.21.2: - resolution: {integrity: sha512-R5Muhi/TUu4i4snWVrMgNoXyJm2f8sJfdgIkQvqb+cuIXQEIMAiWGWgCgYXHqX4+XiS/Bnm7IYZ9Zy6NVe6lhw==} - dev: true + tocbot@4.21.2: {} - /toggle-selection@1.0.6: - resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} - dev: false + toggle-selection@1.0.6: {} - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + toidentifier@1.0.1: {} - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} + tough-cookie@4.1.3: dependencies: psl: 1.9.0 punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@0.0.3: {} - /tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@1.0.1: dependencies: punycode: 2.3.1 - dev: false - /trim-newlines@4.1.1: - resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} - engines: {node: '>=12'} - dev: true + trim-newlines@4.1.1: {} - /trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - dev: false + trough@2.2.0: {} - /truncate-utf8-bytes@1.0.2: - resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + truncate-utf8-bytes@1.0.2: dependencies: utf8-byte-length: 1.0.4 - dev: false - /ts-api-utils@1.0.3(typescript@5.2.2): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' + ts-api-utils@1.0.3(typescript@5.2.2): dependencies: typescript: 5.2.2 - dev: true - /ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - dev: true + ts-dedent@2.2.0: {} - /ts-easing@0.2.0: - resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} - dev: false + ts-easing@0.2.0: {} - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + tsconfig-paths@3.14.2: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true + tslib@1.14.1: {} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.2: {} - /tsx@4.7.0: - resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} - engines: {node: '>=18.0.0'} - hasBin: true + tsx@4.7.0: dependencies: esbuild: 0.19.11 get-tsconfig: 4.7.2 optionalDependencies: fsevents: 2.3.3 - dev: false - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 - /tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + tweetnacl@0.14.5: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true + type-detect@4.0.8: {} - /type-fest@0.16.0: - resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} - engines: {node: '>=10'} + type-fest@0.16.0: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + type-fest@0.21.3: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@0.6.0: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + type-fest@0.8.1: {} - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: true + type-fest@1.4.0: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} + type-fest@2.19.0: {} - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.0: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-typed-array: 1.1.12 - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.0: dependencies: call-bind: 1.0.2 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.0: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -14876,9 +18060,7 @@ packages: has-proto: 1.0.1 is-typed-array: 1.1.12 - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -14886,18 +18068,14 @@ packages: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + typed-array-length@1.0.4: dependencies: call-bind: 1.0.2 for-each: 0.3.3 is-typed-array: 1.1.12 - /typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -14905,95 +18083,57 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - dev: true - /typed-emitter@1.4.0: - resolution: {integrity: sha512-weBmoo3HhpKGgLBOYwe8EB31CzDFuaK7CCL+axXhUYhn4jo6DSkHnbefboCF5i4DQ2aMFe0C/FdTWcPdObgHyg==} + typed-emitter@1.4.0: {} - /typed-emitter@2.1.0: - resolution: {integrity: sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==} + typed-emitter@2.1.0: optionalDependencies: rxjs: 7.8.1 - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: true + typedarray@0.0.6: {} - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.2.2: {} - /ua-parser-js@1.0.37: - resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} - dev: false + ua-parser-js@1.0.37: {} - /uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - dev: false + uc.micro@2.1.0: {} - /ufo@1.3.1: - resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} - dev: true + ufo@1.3.1: {} - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - dev: true + uglify-js@3.17.4: optional: true - /uint4@0.1.2: - resolution: {integrity: sha512-lhEx78gdTwFWG+mt6cWAZD/R6qrIj0TTBeH5xwyuDJyswLNlGe+KVlUPQ6+mx5Ld332pS0AMUTo9hIly7YsWxQ==} + uint4@0.1.2: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.2 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - requiresBuild: true + undici-types@5.26.5: {} - /undici@5.25.4: - resolution: {integrity: sha512-450yJxT29qKMf3aoudzFpIciqpx6Pji3hEWaXqXmanbXF58LTAGCKxcJjxMXWu3iG+Mudgo3ZUfDB6YDFd/dAw==} - engines: {node: '>=14.0'} + undici@5.25.4: dependencies: '@fastify/busboy': 2.0.0 - dev: true - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} + unicode-canonical-property-names-ecmascript@2.0.0: {} - /unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.0 unicode-property-aliases-ecmascript: 2.1.0 - /unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} + unicode-match-property-value-ecmascript@2.1.0: {} - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} + unicode-property-aliases-ecmascript@2.1.0: {} - /unidiff@1.0.2: - resolution: {integrity: sha512-2sbEzki5fBmjgAqoafwxRenfMcumMlmVAoJDwYJa3CI4ZVugkdR6qjTw5sVsl29/4JfBBXhWEAd5ars8nRdqXg==} + unidiff@1.0.2: dependencies: diff: 2.2.3 - dev: false - /unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + unified@11.0.4: dependencies: '@types/unist': 3.0.2 bail: 2.0.2 @@ -15002,246 +18142,148 @@ packages: is-plain-obj: 4.1.0 trough: 2.2.0 vfile: 6.0.1 - dev: false - /union@0.5.0: - resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} - engines: {node: '>= 0.8.0'} + union@0.5.0: dependencies: qs: 6.11.2 - dev: true - /unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - requiresBuild: true + unique-filename@2.0.1: dependencies: unique-slug: 3.0.0 - dev: false optional: true - /unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - requiresBuild: true + unique-slug@3.0.0: dependencies: imurmurhash: 0.1.4 - dev: false optional: true - /unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} + unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 - /unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - dev: true + unist-util-is@4.1.0: {} - /unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.2 - dev: false - /unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.2 - dev: false - /unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + unist-util-visit-parents@3.1.1: dependencies: '@types/unist': 2.0.8 unist-util-is: 4.1.0 - dev: true - /unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - dev: false - /unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + unist-util-visit@2.0.3: dependencies: '@types/unist': 2.0.8 unist-util-is: 4.1.0 unist-util-visit-parents: 3.1.1 - dev: true - /unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - dev: false - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: false + universalify@0.1.2: {} - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} + universalify@0.2.0: {} - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} + universalify@2.0.0: {} - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + unpipe@1.0.0: {} - /unplugin@1.5.0: - resolution: {integrity: sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==} + unplugin@1.5.0: dependencies: acorn: 8.10.0 chokidar: 3.5.3 webpack-sources: 3.2.3 webpack-virtual-modules: 0.5.0 - dev: true - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} + untildify@4.0.0: {} - /upath@1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} - dev: false + upath@1.2.0: {} - /update-browserslist-db@1.0.11(browserslist@4.21.10): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.11(browserslist@4.21.10): dependencies: browserslist: 4.21.10 escalade: 3.1.1 picocolors: 1.0.0 - /upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + upper-case-first@2.0.2: dependencies: tslib: 2.6.2 - dev: false - /upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + upper-case@2.0.2: dependencies: tslib: 2.6.2 - dev: false - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.0 - /url-join@4.0.1: - resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} - dev: true + url-join@4.0.1: {} - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + url-parse@1.5.10: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - /use-callback-ref@1.3.0(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + use-callback-ref@1.3.0(@types/react@18.2.20)(react@18.2.0): dependencies: - '@types/react': 18.2.20 react: 18.2.0 tslib: 2.6.2 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /use-deep-compare@1.1.0(react@18.2.0): - resolution: {integrity: sha512-6yY3zmKNCJ1jjIivfZMZMReZjr8e6iC6Uqtp701jvWJ6ejC/usXD+JjmslZDPJQgX8P4B1Oi5XSLHkOLeYSJsA==} - peerDependencies: - react: ^18.2.0 + use-deep-compare@1.1.0(react@18.2.0): dependencies: dequal: 1.0.0 react: 18.2.0 - dev: true - /use-resize-observer@9.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==} - peerDependencies: - react: ^18.2.0 - react-dom: 16.8.0 - 18 + use-resize-observer@9.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@juggle/resize-observer': 3.3.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true - /use-sidecar@1.1.2(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true + use-sidecar@1.1.2(@types/react@18.2.20)(react@18.2.0): dependencies: - '@types/react': 18.2.20 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 - dev: true + optionalDependencies: + '@types/react': 18.2.20 - /use-sync-external-store@1.2.0(react@18.2.0): - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^18.2.0 + use-sync-external-store@1.2.0(react@18.2.0): dependencies: react: 18.2.0 - /use-typed-event-listener@4.0.2(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-AhjRw+qg5t7OWg7en2Q4XDCdi2iyhALFl71tITL3FeZqt/jD1Qa6KnbH/UolARtID1Gd0IElizbCgolv3ZbUFA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - peerDependencies: - react: ^18.2.0 - typescript: '>=4.1.2' - peerDependenciesMeta: - typescript: - optional: true + use-typed-event-listener@4.0.2(react@18.2.0)(typescript@5.2.2): dependencies: '@babel/runtime': 7.22.11 react: 18.2.0 - typescript: 5.2.2 use-deep-compare: 1.1.0(react@18.2.0) - dev: true + optionalDependencies: + typescript: 5.2.2 - /utf8-byte-length@1.0.4: - resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} - dev: false + utf8-byte-length@1.0.4: {} - /utif@2.0.1: - resolution: {integrity: sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==} + utif@2.0.1: dependencies: pako: 1.0.11 - dev: false - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util-deprecate@1.0.2: {} - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + util@0.12.5: dependencies: inherits: 2.0.4 is-arguments: 1.1.1 @@ -15249,98 +18291,64 @@ packages: is-typed-array: 1.1.12 which-typed-array: 1.1.11 - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + utils-merge@1.0.1: {} - /uuid-1345@1.0.2: - resolution: {integrity: sha512-bA5zYZui+3nwAc0s3VdGQGBfbVsJLVX7Np7ch2aqcEWFi5lsAEcmO3+lx3djM1npgpZI8KY2FITZ2uYTnYUYyw==} + uuid-1345@1.0.2: dependencies: macaddress: 0.5.3 - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true + uuid@8.3.2: {} - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: true + uuid@9.0.1: {} - /v8-to-istanbul@9.1.3: - resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} - engines: {node: '>=10.12.0'} + v8-to-istanbul@9.1.3: dependencies: '@jridgewell/trace-mapping': 0.3.19 '@types/istanbul-lib-coverage': 2.0.4 convert-source-map: 2.0.0 - dev: true - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /valtio@1.11.2(@types/react@18.2.20)(react@18.2.0): - resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} - engines: {node: '>=12.20.0'} - peerDependencies: - '@types/react': '>=16.8' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true + valtio@1.11.2(@types/react@18.2.20)(react@18.2.0): dependencies: - '@types/react': 18.2.20 proxy-compare: 2.5.1 - react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.20 + react: 18.2.0 - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + vary@1.1.2: {} - /vec3@0.1.8: - resolution: {integrity: sha512-LfKrP625Bsg/Tj52YdYPsHmpsJuo+tc6fLxZxXjEo9k2xSspKlPvoYTHehykKhp1FvV9nm+XU3Ehej5/9tpDCg==} + vec3@0.1.8: {} - /verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} + verror@1.10.0: dependencies: assert-plus: 1.0.0 core-util-is: 1.0.2 extsprintf: 1.3.0 - /vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 - dev: false - /vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + vfile@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - dev: false - /vite-node@0.34.6(@types/node@20.8.0): - resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} - engines: {node: '>=v14.18.0'} - hasBin: true + vite-node@0.34.6(@types/node@20.8.0)(terser@5.19.2): dependencies: cac: 6.7.14 debug: 4.3.4(supports-color@8.1.1) mlly: 1.4.2 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.10(@types/node@20.8.0) + vite: 4.4.10(@types/node@20.8.0)(terser@5.19.2) transitivePeerDependencies: - '@types/node' - less @@ -15350,108 +18358,38 @@ packages: - sugarss - supports-color - terser - dev: true - /vite@4.4.10(@types/node@20.8.0): - resolution: {integrity: sha512-TzIjiqx9BEXF8yzYdF2NTf1kFFbjMjUSV0LFZ3HyHoI3SGSPLnnFUKiIQtL3gl2AjHvMrprOvQ3amzaHgQlAxw==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@4.4.10(@types/node@20.12.7)(terser@5.19.2): dependencies: - '@types/node': 20.8.0 esbuild: 0.18.20 postcss: 8.4.31 rollup: 3.29.4 optionalDependencies: + '@types/node': 20.12.7 fsevents: 2.3.3 + terser: 5.19.2 - /vite@4.5.3: - resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@4.4.10(@types/node@20.8.0)(terser@5.19.2): + dependencies: + esbuild: 0.18.20 + postcss: 8.4.31 + rollup: 3.29.4 + optionalDependencies: + '@types/node': 20.8.0 + fsevents: 2.3.3 + terser: 5.19.2 + + vite@4.5.3(@types/node@20.8.0)(terser@5.19.2): dependencies: esbuild: 0.18.20 postcss: 8.4.38 rollup: 3.29.4 optionalDependencies: + '@types/node': 20.8.0 fsevents: 2.3.3 - dev: true + terser: 5.19.2 - /vitest@0.34.6: - resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} - engines: {node: '>=v14.18.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true + vitest@0.34.6(terser@5.19.2): dependencies: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 @@ -15474,8 +18412,8 @@ packages: strip-literal: 1.3.0 tinybench: 2.5.1 tinypool: 0.7.0 - vite: 4.4.10(@types/node@20.8.0) - vite-node: 0.34.6(@types/node@20.8.0) + vite: 4.4.10(@types/node@20.8.0)(terser@5.19.2) + vite-node: 0.34.6(@types/node@20.8.0)(terser@5.19.2) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -15485,88 +18423,56 @@ packages: - sugarss - supports-color - terser - dev: true - /w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - dev: false + w3c-keyname@2.2.8: {} - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + walker@1.0.8: dependencies: makeerror: 1.0.12 - dev: true - /warning@4.0.3: - resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + warning@4.0.3: dependencies: loose-envify: 1.4.0 - dev: false - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} + watchpack@2.4.0: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: true - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: true - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@3.0.1: {} - /webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: false + webidl-conversions@4.0.2: {} - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true + webpack-sources@3.2.3: {} - /webpack-virtual-modules@0.5.0: - resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} - dev: true + webpack-virtual-modules@0.5.0: {} - /webrtc-adapter@8.2.3: - resolution: {integrity: sha512-gnmRz++suzmvxtp3ehQts6s2JtAGPuDPjA1F3a9ckNpG1kYdYuHWYpazoAnL9FS5/B21tKlhkorbdCXat0+4xQ==} - engines: {node: '>=6.0.0', npm: '>=3.10.0'} + webrtc-adapter@8.2.3: dependencies: sdp: 3.2.0 - dev: false - /whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} + whatwg-encoding@2.0.0: dependencies: iconv-lite: 0.6.3 - dev: true - /whatwg-fetch@3.6.18: - resolution: {integrity: sha512-ltN7j66EneWn5TFDO4L9inYC1D+Czsxlrw2SalgjMmEMkLfA5SIZxEFdE6QtHFiiM6Q7WL32c7AkI3w6yxM84Q==} - dev: false + whatwg-fetch@3.6.18: {} - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 - dev: false - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 @@ -15574,9 +18480,7 @@ packages: is-string: 1.0.7 is-symbol: 1.0.4 - /which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} + which-builtin-type@1.1.3: dependencies: function.prototype.name: 1.1.6 has-tostringtag: 1.0.2 @@ -15590,21 +18494,15 @@ packages: which-boxed-primitive: 1.0.2 which-collection: 1.0.2 which-typed-array: 1.1.15 - dev: true - /which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.3 - dev: true - /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.11: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -15612,72 +18510,49 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 - dev: true - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.2.2: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - dev: true - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wide-align@1.1.5: dependencies: string-width: 4.2.3 - dev: false - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true + wordwrap@1.0.0: {} - /workbox-background-sync@7.0.0: - resolution: {integrity: sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==} + workbox-background-sync@7.0.0: dependencies: idb: 7.1.1 workbox-core: 7.0.0 - dev: false - /workbox-broadcast-update@7.0.0: - resolution: {integrity: sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==} + workbox-broadcast-update@7.0.0: dependencies: workbox-core: 7.0.0 - dev: false - /workbox-build@7.0.0: - resolution: {integrity: sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==} - engines: {node: '>=16.0.0'} + workbox-build@7.0.0(@types/babel__core@7.20.2): dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) '@babel/core': 7.22.11 '@babel/preset-env': 7.22.10(@babel/core@7.22.11) '@babel/runtime': 7.22.11 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.22.11)(rollup@2.79.1) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.22.11)(@types/babel__core@7.20.2)(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 @@ -15713,56 +18588,40 @@ packages: transitivePeerDependencies: - '@types/babel__core' - supports-color - dev: false - /workbox-cacheable-response@7.0.0: - resolution: {integrity: sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==} + workbox-cacheable-response@7.0.0: dependencies: workbox-core: 7.0.0 - dev: false - /workbox-core@7.0.0: - resolution: {integrity: sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==} - dev: false + workbox-core@7.0.0: {} - /workbox-expiration@7.0.0: - resolution: {integrity: sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==} + workbox-expiration@7.0.0: dependencies: idb: 7.1.1 workbox-core: 7.0.0 - dev: false - /workbox-google-analytics@7.0.0: - resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==} + workbox-google-analytics@7.0.0: dependencies: workbox-background-sync: 7.0.0 workbox-core: 7.0.0 workbox-routing: 7.0.0 workbox-strategies: 7.0.0 - dev: false - /workbox-navigation-preload@7.0.0: - resolution: {integrity: sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==} + workbox-navigation-preload@7.0.0: dependencies: workbox-core: 7.0.0 - dev: false - /workbox-precaching@7.0.0: - resolution: {integrity: sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==} + workbox-precaching@7.0.0: dependencies: workbox-core: 7.0.0 workbox-routing: 7.0.0 workbox-strategies: 7.0.0 - dev: false - /workbox-range-requests@7.0.0: - resolution: {integrity: sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==} + workbox-range-requests@7.0.0: dependencies: workbox-core: 7.0.0 - dev: false - /workbox-recipes@7.0.0: - resolution: {integrity: sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==} + workbox-recipes@7.0.0: dependencies: workbox-cacheable-response: 7.0.0 workbox-core: 7.0.0 @@ -15770,217 +18629,111 @@ packages: workbox-precaching: 7.0.0 workbox-routing: 7.0.0 workbox-strategies: 7.0.0 - dev: false - /workbox-routing@7.0.0: - resolution: {integrity: sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==} + workbox-routing@7.0.0: dependencies: workbox-core: 7.0.0 - dev: false - /workbox-strategies@7.0.0: - resolution: {integrity: sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==} + workbox-strategies@7.0.0: dependencies: workbox-core: 7.0.0 - dev: false - /workbox-streams@7.0.0: - resolution: {integrity: sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==} + workbox-streams@7.0.0: dependencies: workbox-core: 7.0.0 workbox-routing: 7.0.0 - dev: false - /workbox-sw@7.0.0: - resolution: {integrity: sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==} - dev: false + workbox-sw@7.0.0: {} - /workbox-window@7.0.0: - resolution: {integrity: sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==} + workbox-window@7.0.0: dependencies: '@types/trusted-types': 2.0.3 workbox-core: 7.0.0 - dev: false - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + write-file-atomic@2.4.3: dependencies: graceful-fs: 4.2.11 imurmurhash: 0.1.4 signal-exit: 3.0.7 - dev: true - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 - dev: true - /ws@5.2.3: - resolution: {integrity: sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@5.2.3: dependencies: async-limiter: 1.0.1 - dev: false - /ws@6.2.2: - resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@6.2.2: dependencies: async-limiter: 1.0.1 - dev: true - /ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false + ws@7.4.6: {} - /ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@8.11.0: {} - /xhr@2.6.0: - resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + xhr@2.6.0: dependencies: global: 4.4.0 is-function: 1.0.2 parse-headers: 2.0.5 xtend: 4.0.2 - dev: false - /xml-parse-from-string@1.0.1: - resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==} - dev: false + xml-parse-from-string@1.0.1: {} - /xml2js@0.4.23: - resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} - engines: {node: '>=4.0.0'} + xml2js@0.4.23: dependencies: sax: 1.3.0 xmlbuilder: 11.0.1 - dev: false - /xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - dev: false + xmlbuilder@11.0.1: {} - /xmlhttprequest-ssl@1.6.3: - resolution: {integrity: sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==} - engines: {node: '>=0.4.0'} - dev: false + xmlhttprequest-ssl@1.6.3: {} - /xmlhttprequest-ssl@2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} - engines: {node: '>=0.4.0'} - dev: false + xmlhttprequest-ssl@2.0.0: {} - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + xtend@4.0.2: {} - /xxhash-wasm@0.4.2: - resolution: {integrity: sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==} + xxhash-wasm@0.4.2: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@4.0.0: {} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: false + yaml@1.10.2: {} - /yaml@2.3.2: - resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} - engines: {node: '>= 14'} - dev: true + yaml@2.3.2: {} - /yaml@2.4.1: - resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} - engines: {node: '>= 14'} - hasBin: true - dev: false + yaml@2.4.1: {} - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true + yargs-parser@20.2.9: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: false + yargs-parser@21.1.1: {} - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + yargs@16.2.0: dependencies: cliui: 7.0.4 escalade: 3.1.1 @@ -15989,11 +18742,8 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: true - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.1 @@ -16002,234 +18752,27 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: false - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - /yeast@0.1.2: - resolution: {integrity: sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==} - dev: false + yeast@0.1.2: {} - /yggdrasil@1.7.0: - resolution: {integrity: sha512-QBIo5fiNd7688G3FqXXYGr36uyrYzczlNuzpWFy2zL3+R+3KT2lF+wFxm51synfA3l3z6IBiGOc1/EVXWCYY1Q==} + yggdrasil@1.7.0(encoding@0.1.13): dependencies: - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) uuid: 8.3.2 transitivePeerDependencies: - encoding - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yocto-queue@0.1.0: {} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.0.0: {} - /zustand@3.6.5(react@18.2.0): - resolution: {integrity: sha512-/WfLJuXiEJimt61KGMHebrFBwckkCHGhAgVXTgPQHl6IMzjqm6MREb1OnDSnCRiSmRdhgdFCctceg6tSm79hiw==} - engines: {node: '>=12.7.0'} - peerDependencies: - react: ^18.2.0 - peerDependenciesMeta: - react: - optional: true - dependencies: + zustand@3.6.5(react@18.2.0): + optionalDependencies: react: 18.2.0 - dev: false - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: false - - github.com/PrismarineJS/mineflayer/195b3cbd70a110080af9b77a4659991c5d9e484a: - resolution: {tarball: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/195b3cbd70a110080af9b77a4659991c5d9e484a} - name: mineflayer - version: 4.20.0 - engines: {node: '>=18'} - dependencies: - minecraft-data: 3.62.0 - minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f - prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) - prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 - prismarine-chat: 1.9.1 - prismarine-chunk: github.com/zardoy/prismarine-chunk/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b(minecraft-data@3.62.0) - prismarine-entity: 2.3.1 - prismarine-item: 1.14.0 - prismarine-nbt: 2.5.0 - prismarine-physics: 1.8.0 - prismarine-recipe: 1.3.1(prismarine-registry@1.7.0) - prismarine-registry: 1.7.0 - prismarine-windows: 2.9.0 - prismarine-world: github.com/zardoy/prismarine-world/6ae6f009d38460de284f8c226c665f04cbad9465 - protodef: 1.15.0 - typed-emitter: 1.4.0 - vec3: 0.1.8 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - github.com/PrismarineJS/node-process/380d0b4f4c86f1b65b216c311bf00431f314e88e: - resolution: {tarball: https://codeload.github.com/PrismarineJS/node-process/tar.gz/380d0b4f4c86f1b65b216c311bf00431f314e88e} - name: process - version: 0.11.10 - engines: {node: '>= 0.6.0'} - dev: true - - github.com/zardoy/browserfs/ab58ae8ef00e3a31db01909e365e6cb5188436e0: - resolution: {tarball: https://codeload.github.com/zardoy/browserfs/tar.gz/ab58ae8ef00e3a31db01909e365e6cb5188436e0} - name: browserfs - version: 2.0.0 - engines: {node: '>= 18'} - dev: false - - github.com/zardoy/browserfs/e60ca69e74888e057a96a468afe1d62347d3f56f: - resolution: {tarball: https://codeload.github.com/zardoy/browserfs/tar.gz/e60ca69e74888e057a96a468afe1d62347d3f56f} - name: browserfs - version: 2.0.0-zardoy - dependencies: - async: 2.6.4 - dev: false - - github.com/zardoy/diamond-square/915fce8e27fe8eb45464d89b9563956afa4f7687: - resolution: {tarball: https://codeload.github.com/zardoy/diamond-square/tar.gz/915fce8e27fe8eb45464d89b9563956afa4f7687} - name: diamond-square - version: 1.3.0 - dependencies: - minecraft-data: 3.62.0 - prismarine-chunk: github.com/zardoy/prismarine-chunk/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) - random-seed: 0.3.0 - vec3: 0.1.8 - dev: false - - github.com/zardoy/minecraft-inventory-gui/6685fa4a10590a5decef90a454ba0b9e045e7737(@types/react@18.2.20)(react@18.2.0): - resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/6685fa4a10590a5decef90a454ba0b9e045e7737} - id: github.com/zardoy/minecraft-inventory-gui/6685fa4a10590a5decef90a454ba0b9e045e7737 - name: minecraft-inventory-gui - version: 1.0.1 - dependencies: - valtio: 1.11.2(@types/react@18.2.20)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - react - dev: true - - github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f: - resolution: {tarball: https://codeload.github.com/zardoy/minecraft-protocol/tar.gz/2c14a686bfe7cbd9a5c87b629b402295ee86219f} - name: minecraft-protocol - version: 1.45.0 - engines: {node: '>=14'} - dependencies: - '@types/readable-stream': 4.0.11 - aes-js: 3.1.2 - buffer-equal: 1.0.1 - debug: 4.3.4(supports-color@8.1.1) - endian-toggle: 0.0.0 - lodash.get: 4.4.2 - lodash.merge: 4.6.2 - minecraft-data: 3.62.0 - minecraft-folder-path: 1.2.0 - node-fetch: 2.7.0 - node-rsa: 0.4.2 - prismarine-auth: 2.4.2 - prismarine-nbt: 2.5.0 - prismarine-realms: 1.3.2 - protodef: 1.15.0 - readable-stream: 4.5.2 - uuid-1345: 1.0.2 - yggdrasil: 1.7.0 - transitivePeerDependencies: - - encoding - - supports-color - - github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0} - name: prismarine-block - version: 1.17.1 - dependencies: - minecraft-data: 3.62.0 - prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) - prismarine-chat: 1.9.1 - prismarine-item: 1.14.0 - prismarine-nbt: 2.2.1 - prismarine-registry: 1.7.0 - - github.com/zardoy/prismarine-chunk/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b(minecraft-data@3.62.0): - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b} - id: github.com/zardoy/prismarine-chunk/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b - name: prismarine-chunk - version: 1.35.0 - engines: {node: '>=14'} - dependencies: - prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) - prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 - prismarine-nbt: 2.5.0 - prismarine-registry: 1.7.0 - smart-buffer: 4.2.0 - uint4: 0.1.2 - vec3: 0.1.8 - xxhash-wasm: 0.4.2 - transitivePeerDependencies: - - minecraft-data - - github.com/zardoy/prismarine-chunk/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0): - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f} - id: github.com/zardoy/prismarine-chunk/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f - name: prismarine-chunk - version: 1.35.0 - engines: {node: '>=14'} - dependencies: - prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) - prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 - prismarine-nbt: 2.5.0 - prismarine-registry: 1.7.0 - smart-buffer: 4.2.0 - uint4: 0.1.2 - vec3: 0.1.8 - xxhash-wasm: 0.4.2 - transitivePeerDependencies: - - minecraft-data - dev: false - - github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0): - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f} - id: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f - name: prismarine-provider-anvil - version: 2.7.0 - dependencies: - prismarine-chunk: github.com/zardoy/prismarine-chunk/3c7e679508cf8ebd1ac4df9a6c22d7cb6c45290b(minecraft-data@3.62.0) - prismarine-nbt: 2.5.0 - uint4: 0.1.2 - vec3: 0.1.8 - transitivePeerDependencies: - - minecraft-data - dev: false - - github.com/zardoy/prismarine-world/6ae6f009d38460de284f8c226c665f04cbad9465: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465} - name: prismarine-world - version: 3.6.2 - engines: {node: '>=8.0.0'} - dependencies: - vec3: 0.1.8 - - github.com/zardoy/prismarinejs-net-browserify/7d827dba61bd2f9ac9a6086fe2079a0fccadd070: - resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d827dba61bd2f9ac9a6086fe2079a0fccadd070} - name: net-browserify - version: 0.2.4 - dependencies: - body-parser: 1.20.2 - express: 4.18.2 - express-ws: 4.0.0(express@4.18.2) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false + zwitch@2.0.4: {} From d35eb040c77c7ebe155f8533b0b399ebec446bc9 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 20 Apr 2024 13:26:17 +0300 Subject: [PATCH 0137/1195] The packageManager field must be joke... --- .github/workflows/ci.yml | 2 +- .github/workflows/next-deploy.yml | 2 +- .github/workflows/preview.yml | 2 +- .github/workflows/publish.yml | 2 +- CONTRIBUTING.md | 2 +- package.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b2f04c43..b08045be 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: - name: Checkout repository uses: actions/checkout@master - name: Install pnpm - run: npm i -g pnpm + run: npm i -g pnpm@9.0.4 - uses: actions/setup-node@v4 with: node-version: 18 diff --git a/.github/workflows/next-deploy.yml b/.github/workflows/next-deploy.yml index 7ee33ac0..e3919625 100644 --- a/.github/workflows/next-deploy.yml +++ b/.github/workflows/next-deploy.yml @@ -16,7 +16,7 @@ jobs: - name: Checkout uses: actions/checkout@v2 - name: Install Global Dependencies - run: npm install --global vercel pnpm + run: npm install --global vercel pnpm@9.0.4 - name: Pull Vercel Environment Information run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }} - name: Build Project Artifacts diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 03990d04..2f866235 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -22,7 +22,7 @@ jobs: uses: actions/checkout@v2 with: ref: refs/pull/${{ github.event.issue.number }}/head - - run: npm i -g pnpm + - run: npm i -g pnpm@9.0.4 - uses: actions/setup-node@v4 with: node-version: 18 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 64fe5154..cbc09b43 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout repository uses: actions/checkout@master - name: Install pnpm - run: npm i -g vercel pnpm + run: npm i -g vercel pnpm@9.0.4 # - run: pnpm install # - run: pnpm build - run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 98017f6b..429c7197 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,7 +2,7 @@ After forking the repository, run the following commands to get started: -0. Ensure you have [Node.js](https://nodejs.org) and `pnpm` installed. To install pnpm run `npm i -g pnpm`. +0. Ensure you have [Node.js](https://nodejs.org) and `pnpm` installed. To install pnpm run `npm i -g pnpm@9.0.4`. 1. Install dependencies: `pnpm i` 2. Start the project in development mode: `pnpm start` diff --git a/package.json b/package.json index 084fbe2b..e9981866 100644 --- a/package.json +++ b/package.json @@ -158,5 +158,5 @@ "ignoreDependencies": [] } }, - "packageManager": "pnpm@9.0.0" + "packageManager": "pnpm@9.0.4" } From 976f6cab2bd24ef5cbdd8b9a1b7dec96e9ba8c70 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 20 Apr 2024 15:28:31 +0300 Subject: [PATCH 0138/1195] add mesher HMR! fix: fix all colored glass rendering! --- esbuild.mjs | 9 +-- .../viewer/lib/cleanupDecorator.ts | 28 +++++++++ prismarine-viewer/viewer/lib/mesher/models.ts | 22 ++++++- prismarine-viewer/viewer/lib/mesher/shared.ts | 10 ++++ prismarine-viewer/viewer/lib/viewer.ts | 2 + .../viewer/lib/worldDataEmitter.ts | 1 + .../viewer/lib/worldrendererCommon.ts | 10 ++-- .../viewer/lib/worldrendererThree.ts | 15 ++++- scripts/esbuildPlugins.mjs | 57 ++++++++----------- src/eruda.js | 7 --- src/index.ts | 3 +- 11 files changed, 106 insertions(+), 58 deletions(-) create mode 100644 prismarine-viewer/viewer/lib/cleanupDecorator.ts create mode 100644 prismarine-viewer/viewer/lib/mesher/shared.ts delete mode 100644 src/eruda.js diff --git a/esbuild.mjs b/esbuild.mjs index 2e360e5d..3c35f32d 100644 --- a/esbuild.mjs +++ b/esbuild.mjs @@ -3,7 +3,7 @@ import * as esbuild from 'esbuild' import fs from 'fs' // import htmlPlugin from '@chialab/esbuild-plugin-html' import server from './server.js' -import { clients, plugins } from './scripts/esbuildPlugins.mjs' +import { clients, plugins, startWatchingHmr } from './scripts/esbuildPlugins.mjs' import { generateSW } from 'workbox-build' import { getSwAdditionalEntries } from './scripts/build.js' import { build } from 'esbuild' @@ -21,11 +21,7 @@ const dev = !prod const banner = [ 'window.global = globalThis;', - // report reload time - dev && 'if (sessionStorage.lastReload) { const [rebuild, reloadStart] = sessionStorage.lastReload.split(","); const now = Date.now(); console.log(`rebuild + reload:`, +rebuild, "+", now - reloadStart, "=", ((+rebuild + (now - reloadStart)) / 1000).toFixed(1) + "s");sessionStorage.lastReload = ""; }', - // auto-reload - dev && 'window.noAutoReload ??= false;(() => new EventSource("/esbuild").onmessage = ({ data: _data }) => { if (!_data) return; const data = JSON.parse(_data); if (!data.update) return;console.log("[esbuild] Page is outdated");document.title = `[O] ${document.title}`;if (window.noAutoReload || localStorage.noAutoReload) return; if (localStorage.autoReloadVisible && document.visibilityState !== "visible") return; sessionStorage.lastReload = `${data.update.time},${Date.now()}`; location.reload() })();' -].filter(Boolean) +] const buildingVersion = new Date().toISOString().split(':')[0] @@ -91,6 +87,7 @@ const buildOptions = { if (watch) { const ctx = await esbuild.context(buildOptions) await ctx.watch() + startWatchingHmr() server.app.get('/esbuild', (req, res, next) => { res.writeHead(200, { 'Content-Type': 'text/event-stream', diff --git a/prismarine-viewer/viewer/lib/cleanupDecorator.ts b/prismarine-viewer/viewer/lib/cleanupDecorator.ts new file mode 100644 index 00000000..476546a6 --- /dev/null +++ b/prismarine-viewer/viewer/lib/cleanupDecorator.ts @@ -0,0 +1,28 @@ +export function buildCleanupDecorator (cleanupMethod: string) { + return function () { + return function (_target: {snapshotInitialValues}, propertyKey: string) { + const target = _target as any + // Store the initial value of the property + if (!target._snapshotMethodPatched) { + target.snapshotInitialValues = function () { + this._initialValues = {} + for (const key of target._toCleanup) { + this._initialValues[key] = this[key] + } + } + target._snapshotMethodPatched = true + } + (target._toCleanup ??= []).push(propertyKey) + if (!target._cleanupPatched) { + const originalMethod = target[cleanupMethod] + target[cleanupMethod] = function () { + for (const key of target._toCleanup) { + this[key] = this._initialValues[key] + } + originalMethod.apply(this, arguments) + } + } + target._cleanupPatched = true + } + } +} diff --git a/prismarine-viewer/viewer/lib/mesher/models.ts b/prismarine-viewer/viewer/lib/mesher/models.ts index 29b4edb5..fc86a671 100644 --- a/prismarine-viewer/viewer/lib/mesher/models.ts +++ b/prismarine-viewer/viewer/lib/mesher/models.ts @@ -158,6 +158,7 @@ function renderLiquid (world, cursor, texture, type, biome, water, attr) { const neighbor = world.getBlock(neighborPos) if (!neighbor) continue if (neighbor.type === type) continue + const isGlass = neighbor.name.includes('glass') if ((isCube(neighbor) && !isUp) || neighbor.material === 'plant' || neighbor.getProperties().waterlogged) continue let tint = [1, 1, 1] @@ -438,6 +439,8 @@ function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr } export function getSectionGeometry (sx, sy, sz, world: World) { + let delayedRender = [] as (() => void)[] + const attr = { sx: sx + 8, sy: sy + 8, @@ -488,7 +491,10 @@ export function getSectionGeometry (sx, sy, sz, world: World) { if (block.name === 'water' || isWaterlogged) { const waterBlock = block.name === 'water' ? block : { name: 'water', metadata: 0 } const variant = getModelVariants(waterBlock as any)[0] - renderLiquid(world, cursor, variant.model.textures.particle, block.type, biome, true, attr) + const pos = cursor.clone() + delayedRender.push(() => { + renderLiquid(world, pos, variant.model.textures.particle, block.type, biome, true, attr) + }) } else if (block.name === 'lava') { renderLiquid(world, cursor, variant.model.textures.particle, block.type, biome, false, attr) } @@ -509,7 +515,14 @@ export function getSectionGeometry (sx, sy, sz, world: World) { } for (const element of variant.model.elements) { - renderElement(world, cursor, element, variant.model.ao, attr, globalMatrix, globalShift, block, biome) + if (block.transparent) { + const pos = cursor.clone() + delayedRender.push(() => { + renderElement(world, pos, element, variant.model.ao, attr, globalMatrix, globalShift, block, biome) + }) + } else { + renderElement(world, cursor, element, variant.model.ao, attr, globalMatrix, globalShift, block, biome) + } } } } @@ -517,6 +530,11 @@ export function getSectionGeometry (sx, sy, sz, world: World) { } } + for (const render of delayedRender) { + render() + } + delayedRender = [] + let ndx = attr.positions.length / 3 for (let i = 0; i < attr.t_positions.length / 12; i++) { attr.indices.push( diff --git a/prismarine-viewer/viewer/lib/mesher/shared.ts b/prismarine-viewer/viewer/lib/mesher/shared.ts new file mode 100644 index 00000000..36c319b1 --- /dev/null +++ b/prismarine-viewer/viewer/lib/mesher/shared.ts @@ -0,0 +1,10 @@ +export const defaultMesherConfig = { + version: '', + enableLighting: true, + skyLight: 15, + smoothLighting: true, + outputFormat: 'threeJs' as 'threeJs' | 'webgl', + textureSize: 1024, // for testing +} + +export type MesherConfig = typeof defaultMesherConfig diff --git a/prismarine-viewer/viewer/lib/viewer.ts b/prismarine-viewer/viewer/lib/viewer.ts index 9097c7ec..1b11ac63 100644 --- a/prismarine-viewer/viewer/lib/viewer.ts +++ b/prismarine-viewer/viewer/lib/viewer.ts @@ -191,6 +191,8 @@ export class Viewer { skyLight = ((timeOfDay - 12000) / 6000) * 15 } + skyLight = Math.floor(skyLight) // todo: remove this after optimization + if (this.world.mesherConfig.skyLight === skyLight) return this.world.mesherConfig.skyLight = skyLight ; (this.world as WorldRendererThree).rerenderAllChunks?.() diff --git a/prismarine-viewer/viewer/lib/worldDataEmitter.ts b/prismarine-viewer/viewer/lib/worldDataEmitter.ts index ed53847d..fa916c51 100644 --- a/prismarine-viewer/viewer/lib/worldDataEmitter.ts +++ b/prismarine-viewer/viewer/lib/worldDataEmitter.ts @@ -191,6 +191,7 @@ export class WorldDataEmitter extends EventEmitter { this.lastPos.update(pos) await this._loadChunks(positions) } else { + this.emitter.emit('chunkPosUpdate', { pos }) // todo-low this.lastPos.update(pos) } } diff --git a/prismarine-viewer/viewer/lib/worldrendererCommon.ts b/prismarine-viewer/viewer/lib/worldrendererCommon.ts index 151b2679..b13443d1 100644 --- a/prismarine-viewer/viewer/lib/worldrendererCommon.ts +++ b/prismarine-viewer/viewer/lib/worldrendererCommon.ts @@ -25,8 +25,7 @@ export type WorldRendererConfig = typeof defaultWorldRendererConfig export abstract class WorldRendererCommon { worldConfig = { minY: 0, worldHeight: 256 } - // todo @sa2urami set alphaTest back to 0.1 and instead properly sort transparent and solid objects (needs to be done in worker too) - material = new THREE.MeshLambertMaterial({ vertexColors: true, transparent: true, alphaTest: 0.5 }) + material = new THREE.MeshLambertMaterial({ vertexColors: true, transparent: true, alphaTest: 0.1 }) @worldCleanup() active = false @@ -58,14 +57,14 @@ export abstract class WorldRendererCommon abstract outputFormat: 'threeJs' | 'webgl' - constructor (public config: WorldRendererConfig) { + constructor(public config: WorldRendererConfig) { // this.initWorkers(1) // preload script on page load this.snapshotInitialValues() } - snapshotInitialValues() {} + snapshotInitialValues () { } - initWorkers(numWorkers = this.config.numWorkers) { + initWorkers (numWorkers = this.config.numWorkers) { // init workers for (let i = 0; i < numWorkers; i++) { // Node environment needs an absolute path, but browser needs the url of the file @@ -154,7 +153,6 @@ export abstract class WorldRendererCommon this.workers = [] } - // new game load happens here setVersion (version, texturesVersion = version) { this.version = version diff --git a/prismarine-viewer/viewer/lib/worldrendererThree.ts b/prismarine-viewer/viewer/lib/worldrendererThree.ts index 364df12a..1fff112f 100644 --- a/prismarine-viewer/viewer/lib/worldrendererThree.ts +++ b/prismarine-viewer/viewer/lib/worldrendererThree.ts @@ -28,9 +28,8 @@ export class WorldRendererThree extends WorldRendererCommon { * Optionally update data that are depedendent on the viewer position */ updatePosDataChunk (key: string) { - if (!this.viewerPosition) return const [x, y, z] = key.split(',').map(x => Math.floor(+x / 16)) - const [xPlayer, yPlayer, zPlayer] = this.viewerPosition.toArray().map(x => Math.floor(x / 16)) + const [xPlayer, yPlayer, zPlayer] = this.camera.position.toArray().map(x => Math.floor(x / 16)) // sum of distances: x + y + z const chunkDistance = Math.abs(x - xPlayer) + Math.abs(y - yPlayer) + Math.abs(z - zPlayer) const section = this.sectionObjects[key].children.find(child => child.name === 'mesh')! @@ -185,6 +184,18 @@ export class WorldRendererThree extends WorldRendererCommon { } } + async doHmr () { + const oldSections = { ...this.sectionObjects } + this.sectionObjects = {} // skip clearing + worldView!.unloadAllChunks() + this.setVersion(this.version, this.texturesVersion) + this.sectionObjects = oldSections + // this.rerenderAllChunks() + + // supply new data + await worldView!.updatePosition(bot.entity.position, true) + } + rerenderAllChunks () { // todo not clear what to do with loading chunks for (const key of Object.keys(this.sectionObjects)) { const [x, y, z] = key.split(',').map(Number) diff --git a/scripts/esbuildPlugins.mjs b/scripts/esbuildPlugins.mjs index ddc34c18..8e037707 100644 --- a/scripts/esbuildPlugins.mjs +++ b/scripts/esbuildPlugins.mjs @@ -6,16 +6,33 @@ import * as fs from 'fs' import { filesize } from 'filesize' import MCProtocol from 'minecraft-protocol' import MCData from 'minecraft-data' +import { throttle } from 'lodash-es' const { supportedVersions } = MCProtocol const prod = process.argv.includes('--prod') let connectedClients = [] -const watchExternal = [ - // 'dist/mesher.js', - // 'dist/webglRendererWorker.js' -] +const writeToClients = (data) => { + connectedClients.forEach((res) => { + res.write(`data: ${JSON.stringify(data)}\n\n`) + res.flush() + }) +} + +export const startWatchingHmr = () => { + const eventsPerFile = { + 'mesher.js': 'mesher', + // 'dist/webglRendererWorker.js': 'webglRendererWorker', + } + for (const name of Object.keys(eventsPerFile)) { + const file = join('dist', name); + if (!fs.existsSync(file)) console.warn(`[missing worker] File ${name} does not exist`) + fs.watchFile(file, () => { + writeToClients({ replace: { type: eventsPerFile[name] } }) + }) + } +} /** @type {import('esbuild').Plugin[]} */ const plugins = [ @@ -46,8 +63,6 @@ const plugins = [ return { contents: `window.mcData ??= ${JSON.stringify(defaultVersionsObj)};module.exports = { pc: window.mcData }`, loader: 'js', - // todo use external watchers - watchFiles: watchExternal, } }) build.onResolve({ @@ -153,25 +168,8 @@ const plugins = [ let time let prevHash - let prevWorkersMtime - const updateMtime = async () => { - const workersMtime = watchExternal.map(file => { - try { - return fs.statSync(file).mtimeMs - } catch (err) { - console.log('missing file', file) - return 0 - } - }) - if (workersMtime.some((mtime, i) => mtime !== prevWorkersMtime?.[i])) { - prevWorkersMtime = workersMtime - return true - } - return false - } build.onStart(() => { time = Date.now() - updateMtime() }) build.onEnd(({ errors, outputFiles: _outputFiles, metafile, warnings }) => { /** @type {import('esbuild').OutputFile[]} */ @@ -181,10 +179,7 @@ const plugins = [ outputFiles.find(outputFile => outputFile.path) if (errors.length) { - connectedClients.forEach((res) => { - res.write(`data: ${JSON.stringify({ errors: errors.map(error => error.text) })}\n\n`) - res.flush() - }) + writeToClients({ errors: errors.map(error => error.text) }) return } @@ -194,8 +189,7 @@ const plugins = [ /** @type {import('esbuild').OutputFile} */ //@ts-ignore const outputFile = outputFiles.find(x => x.path.endsWith('.js')) - const updateWorkers = updateMtime() - if (outputFile.hash === prevHash && !updateWorkers) { + if (outputFile.hash === prevHash) { // todo also check workers and css console.log('Ignoring reload as contents the same') return @@ -212,10 +206,7 @@ const plugins = [ return } - connectedClients.forEach((res) => { - res.write(`data: ${JSON.stringify({ update: { time: elapsed } })}\n\n`) - res.flush() - }) + writeToClients({ update: { time: elapsed } }) connectedClients.length = 0 }) } diff --git a/src/eruda.js b/src/eruda.js deleted file mode 100644 index 9cb11381..00000000 --- a/src/eruda.js +++ /dev/null @@ -1,7 +0,0 @@ -import { isMobile } from './menus/components/common' - -if (process.env.NODE_ENV === 'development' && isMobile()) { - // can be changed to require('eruda') - import('https://cdn.skypack.dev/eruda').default.init() - console.log('JS Loaded in', Date.now() - window.startLoad) -} diff --git a/src/index.ts b/src/index.ts index 8ee16320..f8aef541 100644 --- a/src/index.ts +++ b/src/index.ts @@ -35,7 +35,6 @@ import './reactUi.jsx' import { contro, onBotCreate } from './controls' import './dragndrop' import { possiblyCleanHandle, resetStateAfterDisconnect } from './browserfs' -import './eruda' import { watchOptionsAfterViewerInit } from './watchOptions' import downloadAndOpenFile from './downloadAndOpenFile' @@ -96,7 +95,7 @@ import { possiblyHandleStateVariable } from './googledrive' import flyingSquidEvents from './flyingSquidEvents' import { hideNotification, notificationProxy } from './react/NotificationProvider' import { ViewerWrapper } from 'prismarine-viewer/viewer/lib/viewerWrapper' -import './hotReload' +import './devReload' window.debug = debug window.THREE = THREE From 2ca66d696d32e620a2512b8deaa17c36780197dc Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 20 Apr 2024 16:18:40 +0300 Subject: [PATCH 0139/1195] add devReload addition --- src/devReload.ts | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/devReload.ts diff --git a/src/devReload.ts b/src/devReload.ts new file mode 100644 index 00000000..ab4cbaac --- /dev/null +++ b/src/devReload.ts @@ -0,0 +1,45 @@ +import { WorldRendererThree } from 'prismarine-viewer/viewer/lib/worldrendererThree' +import { isMobile } from './menus/components/common' + +if (process.env.NODE_ENV === 'development') { + if (sessionStorage.lastReload) { + const [rebuild, reloadStart] = sessionStorage.lastReload.split(',') + const now = Date.now() + console.log(`rebuild + reload:`, `${+rebuild} + ${now - reloadStart} = ${((+rebuild + (now - reloadStart)) / 1000).toFixed(1)}s`) + sessionStorage.lastReload = '' + } + + const autoRefresh = () => { + window.noAutoReload ??= false + new EventSource('/esbuild').onmessage = async ({ data: _data }) => { + if (!_data) return + const data = JSON.parse(_data) + if (data.update) { + console.log('[esbuild] Page is outdated') + document.title = `[O] ${document.title}` + if (window.noAutoReload || localStorage.noAutoReload) return + if (localStorage.autoReloadVisible && document.visibilityState !== 'visible') return + sessionStorage.lastReload = `${data.update.time},${Date.now()}` + location.reload() + } + if (data.replace) { + console.log('[esbuild hmr] Reloading', data.replace.type, data.replace.path) + switch (data.replace.type) { + case 'mesher': { + if (!worldView || !viewer.world.version || !(viewer.world instanceof WorldRendererThree)) return + viewer.world.doHmr() + } + } + } + } + } + autoRefresh() + + // mobile devtools + if (isMobile()) { + // can be changed to require('eruda') + //@ts-expect-error + import('https://cdn.skypack.dev/eruda').default.init() + console.log('JS Loaded in', Date.now() - window.startLoad) + } +} From bade1957be000445a245617cb82bf24c10b6dd35 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 20 Apr 2024 16:22:40 +0300 Subject: [PATCH 0140/1195] fix eruda! --- src/devReload.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devReload.ts b/src/devReload.ts index ab4cbaac..32e601df 100644 --- a/src/devReload.ts +++ b/src/devReload.ts @@ -39,7 +39,7 @@ if (process.env.NODE_ENV === 'development') { if (isMobile()) { // can be changed to require('eruda') //@ts-expect-error - import('https://cdn.skypack.dev/eruda').default.init() + void import('https://cdn.skypack.dev/eruda').then(({ default: eruda }) => eruda.init()) console.log('JS Loaded in', Date.now() - window.startLoad) } } From 54b37c0e13e19c2193ca0478234d43bd7ced1400 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 20 Apr 2024 16:44:41 +0300 Subject: [PATCH 0141/1195] update test --- .../viewer/lib/mesher/test/tests.test.ts | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts b/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts index 67439b1d..22e3a7b2 100644 --- a/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts +++ b/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts @@ -39,10 +39,58 @@ test('Known blocks are not rendered', () => { // Fully expected expect(invalidBlocks).toMatchInlineSnapshot(` { + "creeper_head": [ + 0, + 6, + ], + "creeper_wall_head": [ + 0, + 6, + ], + "dragon_head": [ + 0, + 6, + ], + "dragon_wall_head": [ + 0, + 6, + ], + "player_head": [ + 0, + 6, + ], + "player_wall_head": [ + 0, + 6, + ], "powder_snow": [ 0, 6, ], + "skeleton_skull": [ + 0, + 6, + ], + "skeleton_wall_skull": [ + 0, + 6, + ], + "wither_skeleton_skull": [ + 0, + 6, + ], + "wither_skeleton_wall_skull": [ + 0, + 6, + ], + "zombie_head": [ + 0, + 6, + ], + "zombie_wall_head": [ + 0, + 6, + ], } `) }) From 18aba6edb38a5ff4bbc20c497adda81c9b4902d5 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 20 Apr 2024 17:37:48 +0300 Subject: [PATCH 0142/1195] feat: add in water blue fog --- src/dayCycle.ts | 3 ++- src/index.ts | 1 + src/water.ts | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/water.ts diff --git a/src/dayCycle.ts b/src/dayCycle.ts index 0d5043e7..2f59b530 100644 --- a/src/dayCycle.ts +++ b/src/dayCycle.ts @@ -1,5 +1,6 @@ import { options } from './optionsStorage' import { assertDefined } from './utils' +import { updateBackground } from './water' export default () => { bot.on('time', () => { @@ -34,7 +35,7 @@ export default () => { } // todo need to think wisely how to set these values & also move directional light around! const colorInt = Math.max(int, 0.1) - viewer.scene.background = new THREE.Color(dayColor.r * colorInt, dayColor.g * colorInt, dayColor.b * colorInt) + updateBackground({ r: dayColor.r * colorInt, g: dayColor.g * colorInt, b: dayColor.b * colorInt }) if (!options.newVersionsLighting && bot.supportFeature('blockStateId')) { viewer.ambientLight.intensity = Math.max(int, 0.25) viewer.directionalLight.intensity = Math.min(int, 0.5) diff --git a/src/index.ts b/src/index.ts index f8aef541..13c3c96c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -96,6 +96,7 @@ import flyingSquidEvents from './flyingSquidEvents' import { hideNotification, notificationProxy } from './react/NotificationProvider' import { ViewerWrapper } from 'prismarine-viewer/viewer/lib/viewerWrapper' import './devReload' +import './water' window.debug = debug window.THREE = THREE diff --git a/src/water.ts b/src/water.ts new file mode 100644 index 00000000..8bdb2698 --- /dev/null +++ b/src/water.ts @@ -0,0 +1,38 @@ +import { watchUnloadForCleanup } from './gameUnload' + +let inWater = false + +customEvents.on('gameLoaded', () => { + const cleanup = () => { + viewer.scene.fog = null + } + watchUnloadForCleanup(cleanup) + + const updateInWater = () => { + const waterBr = bot.entity.effects.find(effect => loadedData.effects[effect.id].name === 'water_breathing') + if (inWater && waterBr) { + viewer.scene.fog = new THREE.Fog(0x00_00_ff, 0.1, waterBr ? 100 : 20) // Set the fog color to blue if the bot is in water. + } else { + cleanup() + } + updateBackground() + } + bot.on('physicsTick', () => { + // todo + const _inWater = bot.world.getBlock(bot.entity.position.offset(0, 1, 0)).name === 'water' + if (_inWater !== inWater) { + inWater = _inWater + updateInWater() + } + }) +}) + +let sceneBg = { r: 0, g: 0, b: 0 } +export const updateBackground = (newSceneBg = sceneBg) => { + sceneBg = newSceneBg + if (inWater) { + viewer.scene.background = new THREE.Color(0x00_00_ff) + } else { + viewer.scene.background = new THREE.Color(sceneBg.r, sceneBg.g, sceneBg.b) + } +} From 0886af9b05b08898256f65924a8cc3e748e5759f Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 20 Apr 2024 17:38:23 +0300 Subject: [PATCH 0143/1195] feat: Migrate HUD to React, new hotbar and bars (#107) --- CONTRIBUTING.md | 13 +- index.html | 4 - prismarine-viewer/viewer/lib/simpleUtils.ts | 8 + .../viewer/lib/worldrendererCommon.ts | 1 + src/controls.ts | 2 +- src/devReload.ts | 2 +- src/globalState.ts | 1 + src/globals.d.ts | 1 + src/index.ts | 69 ++--- src/{playerWindows.ts => inventoryWindows.ts} | 58 +++- src/menus/components/bossbars_overlay.js | 150 ---------- src/menus/components/breath_bar.js | 89 ------ src/menus/components/debug_overlay.js | 274 ------------------ src/menus/components/food_bar.js | 122 -------- src/menus/components/health_bar.js | 163 ----------- src/menus/components/hotbar.js | 206 ------------- src/menus/components/playerlist_overlay.js | 185 ------------ src/menus/hud.js | 258 ----------------- src/menus/keybinds_screen.js | 173 ----------- src/menus/pause_screen.js | 152 ---------- src/optionsGuiScheme.tsx | 1 + src/react/ArmorBar.css | 30 ++ src/react/ArmorBar.stories.tsx | 18 ++ src/react/ArmorBar.tsx | 52 ++++ src/react/BossBarOverlay.css | 34 +++ src/react/BossBarOverlay.stories.tsx | 33 +++ src/react/BossBarOverlay.tsx | 62 ++++ src/react/BossBarOverlayProvider.tsx | 32 ++ src/react/BreathBar.css | 31 ++ src/react/BreathBar.stories.tsx | 16 + src/react/BreathBar.tsx | 55 ++++ src/react/Crosshair.css | 11 + src/react/Crosshair.tsx | 8 + src/react/DebugOverlay.module.css | 44 +++ src/react/DebugOverlay.tsx | 223 ++++++++++++++ src/react/FoodBar.css | 68 +++++ src/react/FoodBar.tsx | 76 +++++ src/react/HealthBar.css | 78 +++++ src/react/HealthBar.stories.tsx | 45 +++ src/react/HealthBar.tsx | 112 +++++++ src/react/HotbarRenderApp.tsx | 219 ++++++++++++++ src/react/HudBarsProvider.tsx | 136 +++++++++ src/react/IndicatorEffects.css | 2 +- src/react/KeybindingsScreen.tsx | 12 + src/react/KeybindingsScreenApp.tsx | 51 ++++ src/react/MessageFormatted.css | 5 + src/react/MessageFormatted.tsx | 7 +- src/react/MobileTopButtons.module.css | 37 +++ src/react/MobileTopButtons.tsx | 57 ++++ src/react/PauseScreen.module.css | 27 ++ src/react/PauseScreen.tsx | 144 +++++++++ src/react/PlayerListOverlay.css | 80 +++++ src/react/PlayerListOverlay.stories.tsx | 20 ++ src/react/PlayerListOverlay.tsx | 41 +++ src/react/PlayerListOverlayProvider.tsx | 91 ++++++ src/react/SharedHudVars.tsx | 27 ++ src/react/Singleplayer.tsx | 4 +- src/react/XPBar.module.css | 33 +++ src/react/XPBar.stories.tsx | 28 ++ src/react/XPBar.tsx | 16 + src/react/XPBarProvider.tsx | 26 ++ src/react/armorValues.ts | 52 ++++ src/react/simpleUtils.ts | 5 + src/react/singleplayer.module.css | 4 + src/react/useLongPress.ts | 64 ++++ src/reactUi.tsx | 53 ++++ src/scaleInterface.ts | 31 ++ src/texturePack.ts | 2 +- src/watchOptions.ts | 2 +- 69 files changed, 2389 insertions(+), 1847 deletions(-) rename src/{playerWindows.ts => inventoryWindows.ts} (91%) delete mode 100644 src/menus/components/bossbars_overlay.js delete mode 100644 src/menus/components/breath_bar.js delete mode 100644 src/menus/components/debug_overlay.js delete mode 100644 src/menus/components/food_bar.js delete mode 100644 src/menus/components/health_bar.js delete mode 100644 src/menus/components/hotbar.js delete mode 100644 src/menus/components/playerlist_overlay.js delete mode 100644 src/menus/hud.js delete mode 100644 src/menus/keybinds_screen.js delete mode 100644 src/menus/pause_screen.js create mode 100644 src/react/ArmorBar.css create mode 100644 src/react/ArmorBar.stories.tsx create mode 100644 src/react/ArmorBar.tsx create mode 100644 src/react/BossBarOverlay.css create mode 100644 src/react/BossBarOverlay.stories.tsx create mode 100644 src/react/BossBarOverlay.tsx create mode 100644 src/react/BossBarOverlayProvider.tsx create mode 100644 src/react/BreathBar.css create mode 100644 src/react/BreathBar.stories.tsx create mode 100644 src/react/BreathBar.tsx create mode 100644 src/react/Crosshair.css create mode 100644 src/react/Crosshair.tsx create mode 100644 src/react/DebugOverlay.module.css create mode 100644 src/react/DebugOverlay.tsx create mode 100644 src/react/FoodBar.css create mode 100644 src/react/FoodBar.tsx create mode 100644 src/react/HealthBar.css create mode 100644 src/react/HealthBar.stories.tsx create mode 100644 src/react/HealthBar.tsx create mode 100644 src/react/HotbarRenderApp.tsx create mode 100644 src/react/HudBarsProvider.tsx create mode 100644 src/react/KeybindingsScreen.tsx create mode 100644 src/react/KeybindingsScreenApp.tsx create mode 100644 src/react/MessageFormatted.css create mode 100644 src/react/MobileTopButtons.module.css create mode 100644 src/react/MobileTopButtons.tsx create mode 100644 src/react/PauseScreen.module.css create mode 100644 src/react/PauseScreen.tsx create mode 100644 src/react/PlayerListOverlay.css create mode 100644 src/react/PlayerListOverlay.stories.tsx create mode 100644 src/react/PlayerListOverlay.tsx create mode 100644 src/react/PlayerListOverlayProvider.tsx create mode 100644 src/react/SharedHudVars.tsx create mode 100644 src/react/XPBar.module.css create mode 100644 src/react/XPBar.stories.tsx create mode 100644 src/react/XPBar.tsx create mode 100644 src/react/XPBarProvider.tsx create mode 100644 src/react/armorValues.ts create mode 100644 src/react/simpleUtils.ts create mode 100644 src/react/useLongPress.ts create mode 100644 src/scaleInterface.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 429c7197..253b2a52 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,16 +27,17 @@ You can get a description of packets for the latest protocol version from repository. -### Would be useful to have +## A few other notes -- cleanup folder & modules structure, cleanup playground code - -A few other notes: - -- Use `next` branch for development and as base & target branch for pull requests if possible. - To link dependency locally e.g. flying-squid add this to `pnpm` > `overrides` of root package.json: `"flying-squid": "file:../space-squid",` (with some modules `pnpm link` also works) +- Press `Y` to reload application into the same world (server, local world or random singleplayer world) +- To start React profiling disable `REACT_APP_PROFILING` code first. - It's recommended to use debugger for debugging. VSCode has a great debugger built-in. If debugger is slow, you can use `--no-sources` flag that would allow browser to speedup .map file parsing. - Some data are cached between restarts. If you see something doesn't work after upgrading dependencies, try to clear the by simply removing the `dist` folder. - The same folder `dist` is used for both development and production builds, so be careful when deploying the project. - Use `start-prod` script to start the project in production mode after running the `build` script to build the project. + +### Would be useful to have + +- cleanup folder & modules structure, cleanup playground code diff --git a/index.html b/index.html index 362a83fe..3e921855 100644 --- a/index.html +++ b/index.html @@ -95,11 +95,7 @@
- - - -
diff --git a/prismarine-viewer/viewer/lib/simpleUtils.ts b/prismarine-viewer/viewer/lib/simpleUtils.ts index 4cf2ac0e..5c602f1c 100644 --- a/prismarine-viewer/viewer/lib/simpleUtils.ts +++ b/prismarine-viewer/viewer/lib/simpleUtils.ts @@ -11,6 +11,14 @@ export function getBufferFromStream (stream) { ) } +export function openURL (url, newTab = true) { + if (newTab) { + window.open(url, '_blank', 'noopener,noreferrer') + } else { + window.open(url, '_self') + } +} + export function chunkPos (pos: { x: number, z: number }) { const x = Math.floor(pos.x / 16) const z = Math.floor(pos.z / 16) diff --git a/prismarine-viewer/viewer/lib/worldrendererCommon.ts b/prismarine-viewer/viewer/lib/worldrendererCommon.ts index b13443d1..ae2a91d3 100644 --- a/prismarine-viewer/viewer/lib/worldrendererCommon.ts +++ b/prismarine-viewer/viewer/lib/worldrendererCommon.ts @@ -205,6 +205,7 @@ export abstract class WorldRendererCommon config: this.mesherConfig, }) } + this.renderUpdateEmitter.emit('textureDownloaded') }) }) diff --git a/src/controls.ts b/src/controls.ts index a50e0e03..734a2a6d 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -9,7 +9,7 @@ import { stringStartsWith } from 'contro-max/build/stringUtils' import { isGameActive, showModal, gameAdditionalState, activeModalStack, hideCurrentModal, miscUiState } from './globalState' import { goFullscreen, pointerLock, reloadChunks } from './utils' import { options } from './optionsStorage' -import { openPlayerInventory } from './playerWindows' +import { openPlayerInventory } from './inventoryWindows' import { chatInputValueGlobal } from './react/ChatContainer' import { fsState } from './loadSave' import { showOptionsModal } from './react/SelectOption' diff --git a/src/devReload.ts b/src/devReload.ts index 32e601df..a89551d3 100644 --- a/src/devReload.ts +++ b/src/devReload.ts @@ -27,7 +27,7 @@ if (process.env.NODE_ENV === 'development') { switch (data.replace.type) { case 'mesher': { if (!worldView || !viewer.world.version || !(viewer.world instanceof WorldRendererThree)) return - viewer.world.doHmr() + void viewer.world.doHmr() } } } diff --git a/src/globalState.ts b/src/globalState.ts index 392d5fd9..fa1c4cda 100644 --- a/src/globalState.ts +++ b/src/globalState.ts @@ -129,6 +129,7 @@ export type AppConfig = { export const miscUiState = proxy({ currentDisplayQr: null as string | null, currentTouch: null as boolean | null, + serverIp: null as string | null, hasErrors: false, singleplayer: false, flyingSquid: false, diff --git a/src/globals.d.ts b/src/globals.d.ts index 75c9d0a0..b0a8d6db 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -21,6 +21,7 @@ declare const customEvents: import('typed-emitter').default<{ singleplayer (): void digStart () gameLoaded (): void + mineflayerBotCreated (): void search (q: string): void }> declare const beforeRenderFrame: Array<() => void> diff --git a/src/index.ts b/src/index.ts index 13c3c96c..c4cff16a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,25 +7,16 @@ import './devtools' import './entities' import './globalDomListeners' import initCollisionShapes from './getCollisionShapes' -import { itemsAtlases, onGameLoad } from './playerWindows' +import { itemsAtlases, onGameLoad } from './inventoryWindows' import { supportedVersions } from 'minecraft-protocol' import './menus/components/button' import './menus/components/edit_box' -import './menus/components/hotbar' -import './menus/components/health_bar' -import './menus/components/food_bar' -import './menus/components/breath_bar' -import './menus/components/debug_overlay' -import './menus/components/playerlist_overlay' -import './menus/components/bossbars_overlay' -import './menus/hud' import './menus/play_screen' -import './menus/pause_screen' -import './menus/keybinds_screen' import 'core-js/features/array/at' import 'core-js/features/promise/with-resolvers' +import './scaleInterface' import itemsPng from 'prismarine-viewer/public/textures/items.png' import { initWithRenderer } from './topRightStats' import PrismarineBlock from 'prismarine-block' @@ -55,10 +46,11 @@ import { defaultsDeep } from 'lodash-es' import { initVR } from './vr' import { activeModalStack, - showModal, activeModalStacks, + activeModalStacks, insertActiveModalStack, isGameActive, miscUiState, + showModal } from './globalState' @@ -93,7 +85,8 @@ import { ua } from './react/utils' import { handleMovementStickDelta, joystickPointer } from './react/TouchAreasControls' import { possiblyHandleStateVariable } from './googledrive' import flyingSquidEvents from './flyingSquidEvents' -import { hideNotification, notificationProxy } from './react/NotificationProvider' +import { hideNotification, notificationProxy, showNotification } from './react/NotificationProvider' +import { saveToBrowserMemory } from './react/PauseScreen' import { ViewerWrapper } from 'prismarine-viewer/viewer/lib/viewerWrapper' import './devReload' import './water' @@ -167,16 +160,10 @@ viewer.entities.entitiesOptions = { watchOptionsAfterViewerInit() watchTexturepackInViewer(viewer) -const hud = document.getElementById('hud') -const pauseMenu = document.getElementById('pause-screen') - let mouseMovePostHandle = (e) => { } let lastMouseMove: number -let debugMenu const updateCursor = () => { worldInteractions.update() - debugMenu ??= hud.shadowRoot.querySelector('#debug-overlay') - debugMenu.cursorBlock = worldInteractions.cursorBlock } function onCameraMove (e) { if (e.type !== 'touchmove' && !pointerLock.hasPointerLock) return @@ -457,6 +444,7 @@ async function connect (connectOptions: { }) as unknown as typeof __type_bot window.bot = bot earlySoundsMapCheck() + customEvents.emit('mineflayerBotCreated') if (singleplayer || p2pMultiplayer) { // in case of p2pMultiplayer there is still flying-squid on the host side const _supportFeature = bot.supportFeature @@ -472,13 +460,13 @@ async function connect (connectOptions: { } else { const setupConnectHandlers = () => { bot._client.socket.on('connect', () => { - console.log('TCP connection established') + console.log('WebSocket connection established') //@ts-expect-error bot._client.socket._ws.addEventListener('close', () => { - console.log('TCP connection closed') + console.log('WebSocket connection closed') setTimeout(() => { if (bot) { - bot.emit('end', 'TCP connection closed with unknown reason') + bot.emit('end', 'WebSocket connection closed with unknown reason') } }) }) @@ -502,7 +490,6 @@ async function connect (connectOptions: { if (!bot) return const p2pConnectTimeout = p2pMultiplayer ? setTimeout(() => { throw new Error('Spawn timeout. There might be error on the other side, check console.') }, 20_000) : undefined - hud.preload(bot) // bot.on('inject_allowed', () => { // loadingScreen.maybeRecoverable = false @@ -574,9 +561,6 @@ async function connect (connectOptions: { bot.on('physicsTick', () => updateCursor()) - const debugMenu = hud.shadowRoot.querySelector('#debug-overlay') - - window.debugMenu = debugMenu void initVR() @@ -584,13 +568,6 @@ async function connect (connectOptions: { viewer.setFirstPersonCamera(null, bot.entity.yaw, bot.entity.pitch) } - try { - const gl = renderer.getContext() - debugMenu.rendererDevice = gl.getParameter(gl.getExtension('WEBGL_debug_renderer_info')!.UNMASKED_RENDERER_WEBGL) - } catch (err) { - console.warn(err) - debugMenu.rendererDevice = '???' - } // Link WorldDataEmitter and Viewer viewer.listen(worldView) @@ -626,13 +603,13 @@ async function connect (connectOptions: { } if (renderer.xr.isPresenting) return // todo if (!pointerLock.hasPointerLock && activeModalStack.length === 0) { - showModal(pauseMenu) + showModal({ reactType: 'pause-screen' }) } } registerListener(document, 'pointerlockchange', changeCallback, false) - const cameraControlEl = hud + const cameraControlEl = document.querySelector('#ui-root') /** after what time of holding the finger start breaking the block */ const touchStartBreakingBlockMs = 500 @@ -749,18 +726,31 @@ async function connect (connectOptions: { console.log('Done!') - // todo cleanup these onGameLoad(async () => { if (!viewer.world.downloadedBlockStatesData && !viewer.world.customBlockStatesData) { await new Promise(resolve => { viewer.world.renderUpdateEmitter.once('blockStatesDownloaded', () => resolve()) }) } - hud.init(renderer, bot, server.host) - hud.style.display = 'block' + miscUiState.serverIp = server.host as string | null }) if (appStatusState.isError) return + setTimeout(() => { + // todo + const qs = new URLSearchParams(window.location.search) + if (qs.get('suggest_save')) { + showNotification('Suggestion', 'Save the world to keep your progress!', false, undefined, async () => { + const savePath = await saveToBrowserMemory() + if (!savePath) return + const saveName = savePath.split('/').pop() + bot.end() + // todo hot reload + location.search = `loadSave=${saveName}` + }) + } + }, 600) + setLoadingScreenStatus(undefined) const start = Date.now() let done = false @@ -852,7 +842,7 @@ void window.fetch('config.json').then(async res => res.json()).then(c => c, (err downloadAndOpenFile().then((downloadAction) => { if (downloadAction) return - window.addEventListener('hud-ready', (e) => { + void Promise.resolve().then(() => { // try to connect to peer const qs = new URLSearchParams(window.location.search) const peerId = qs.get('connectPeer') @@ -869,7 +859,6 @@ downloadAndOpenFile().then((downloadAction) => { }) } }) - if (document.getElementById('hud').isReady) window.dispatchEvent(new Event('hud-ready')) }, (err) => { console.error(err) alert(`Failed to download file: ${err}`) diff --git a/src/playerWindows.ts b/src/inventoryWindows.ts similarity index 91% rename from src/playerWindows.ts rename to src/inventoryWindows.ts index b94d0f02..3345b6cd 100644 --- a/src/playerWindows.ts +++ b/src/inventoryWindows.ts @@ -12,6 +12,7 @@ import VillagerGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/conta import EnchantingGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/enchanting_table.png' import AnvilGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/anvil.png' import BeaconGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/container/beacon.png' +import WidgetsGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/widgets.png' import Dirt from 'minecraft-assets/minecraft-assets/data/1.17.1/blocks/dirt.png' import { subscribeKey } from 'valtio/utils' @@ -32,7 +33,9 @@ import Generic95 from '../assets/generic_95.png' import { activeModalStack, hideCurrentModal, miscUiState, showModal } from './globalState' import invspriteJson from './invsprite.json' import { options } from './optionsStorage' -import { assertDefined } from './utils' +import { assertDefined, inGameError } from './utils' +import { MessageFormatPart } from './botUtils' +import { currentScaling } from './scaleInterface' export const itemsAtlases: ItemsAtlasesOutputJson = _itemsAtlases const loadedImagesCache = new Map() @@ -58,7 +61,7 @@ export type BlockStates = Record }> -let lastWindow +let lastWindow: ReturnType /** bot version */ let version: string let PrismarineBlock: typeof PrismarineBlockLoader.Block @@ -198,6 +201,7 @@ const getImageSrc = (path): string | HTMLImageElement => { case 'gui/container/enchanting_table': return EnchantingGui case 'gui/container/anvil': return AnvilGui case 'gui/container/beacon': return BeaconGui + case 'gui/widgets': return WidgetsGui } return Dirt } @@ -283,6 +287,13 @@ const renderSlot = (slot: RenderSlot, skipBlock = false): { texture: string, blo slice: invspriteSlice } } + console.warn(`No render data for ${itemName}`) + if (isItem) { + return { + texture: 'blocks', + slice: [0, 0, 16, 16] + } + } } type JsonString = string @@ -290,14 +301,24 @@ type PossibleItemProps = { Damage?: number display?: { Name?: JsonString } // {"text":"Knife","color":"white","italic":"true"} } -export const getItemName = (item: import('prismarine-item').Item | null) => { +export const getItemNameRaw = (item: Pick | null) => { if (!item?.nbt) return const itemNbt: PossibleItemProps = nbt.simplify(item.nbt) const customName = itemNbt.display?.Name if (!customName) return const parsed = mojangson.simplify(mojangson.parse(customName)) + if (parsed.extra) { + return parsed as Record + } else { + return parsed as MessageFormatPart + } +} + +const getItemName = (slot: Item | null) => { + const parsed = getItemNameRaw(slot) + if (!parsed || parsed['extra']) return // todo display full text renderer from sign renderer - const text = flat(parsed).map(x => x.text) + const text = flat(parsed as MessageFormatPart).map(x => x.text) return text } @@ -320,23 +341,24 @@ const mapSlots = (slots: Array) => { const slotCustomProps = renderSlot(slot) Object.assign(slot, { ...slotCustomProps, displayName: ('nbt' in slot ? getItemName(slot) : undefined) ?? slot.displayName }) } catch (err) { - console.error(err) + inGameError(err) } return slot }) } -const upInventory = (isInventory: boolean) => { +export const upInventoryItems = (isInventory: boolean, invWindow = lastWindow) => { // inv.pwindow.inv.slots[2].displayName = 'test' // inv.pwindow.inv.slots[2].blockData = getBlockData('dirt') const customSlots = mapSlots((isInventory ? bot.inventory : bot.currentWindow)!.slots) - lastWindow.pwindow.setSlots(customSlots) + invWindow.pwindow.setSlots(customSlots) } export const onModalClose = (callback: () => any) => { - const { length } = activeModalStack + const modal = activeModalStack.at(-1) const unsubscribe = subscribe(activeModalStack, () => { - if (activeModalStack.length < length) { + const newModal = activeModalStack.at(-1) + if (modal?.reactType !== newModal?.reactType) { callback() unsubscribe() } @@ -370,9 +392,15 @@ const upJei = (search: string) => { if (!x.displayName.toLowerCase().includes(search)) return null! return new PrismarineItem(x.id, 1) }).filter(Boolean) + lastWindow.pwindow.win.jeiSlotsPage = 0 lastWindow.pwindow.win.jeiSlots = mapSlots(matchedSlots) } +export const openItemsCanvas = (type, _bot = bot as typeof bot | null) => { + const inv = showInventory(type, getImage, {}, _bot) + return inv +} + const openWindow = (type: string | undefined) => { // if (activeModalStack.some(x => x.reactType?.includes?.('player_win:'))) { if (activeModalStack.length) { // game is not in foreground, don't close current modal @@ -386,17 +414,17 @@ const openWindow = (type: string | undefined) => { // might be already closed (event fired) if (type !== undefined && bot.currentWindow) bot.currentWindow['close']() lastWindow.destroy() - lastWindow = null + lastWindow = null as any miscUiState.displaySearchInput = false destroyFn() }) cleanLoadedImagesCache() - const inv = showInventory(type, getImage, {}, bot) + const inv = openItemsCanvas(type) + // todo + inv.canvasManager.setScale(currentScaling.scale === 1 ? 1.5 : currentScaling.scale) inv.canvas.style.zIndex = '10' inv.canvas.style.position = 'fixed' inv.canvas.style.inset = '0' - // todo scaling - inv.canvasManager.setScale(window.innerWidth < 470 ? 1.5 : window.innerHeight < 480 || window.innerWidth < 760 ? 2 : window.innerHeight < 700 ? 3 : 4) inv.canvasManager.onClose = () => { hideCurrentModal() @@ -405,7 +433,7 @@ const openWindow = (type: string | undefined) => { lastWindow = inv const upWindowItems = () => { - void Promise.resolve().then(() => upInventory(type === undefined)) + void Promise.resolve().then(() => upInventoryItems(type === undefined)) } upWindowItems() @@ -414,7 +442,7 @@ const openWindow = (type: string | undefined) => { // slotItem is the slot from mapSlots const itemId = loadedData.itemsByName[slotItem.name]?.id if (!itemId) { - console.error(`Item for block ${slotItem.name} not found`) + inGameError(`Item for block ${slotItem.name} not found`) return } const item = new PrismarineItem(itemId, isRightclick ? 64 : 1, slotItem.metadata) diff --git a/src/menus/components/bossbars_overlay.js b/src/menus/components/bossbars_overlay.js deleted file mode 100644 index 015dc6db..00000000 --- a/src/menus/components/bossbars_overlay.js +++ /dev/null @@ -1,150 +0,0 @@ -const { LitElement, html, css } = require('lit') -const { styleMap } = require('lit/directives/style-map.js') - -const colors = ['pink', 'blue', 'red', 'green', 'yellow', 'purple', 'white'] -const divs = [0, 6, 10, 12, 20] -const translations = { - 'entity.minecraft.ender_dragon': 'Ender Dragon', - 'entity.minecraft.wither': 'Wither' -} -class BossBar extends LitElement { - constructor (bar) { - super() - this.bar = bar - this.title = '' - this.progress = 0 - this.bossBarStyles = {} - this.fillStyles = {} - this.div1Styles = {} - this.div2Styles = {} - } - - static get styles () { - return css` - .container { - display: flex; - flex-direction: column; - align-items: center; - } - .title { - font-size: 7px; - color: #fff; - } - .bossbar { - background-image: url("textures/1.18.1/gui/bars.png"); - width: 182px; - height: 5px; - position: relative; - } - .bossbar .fill { - content: ""; - position: absolute; - top: 0; - left: 0; - height: 5px; - width: 0; - background-image: url("textures/1.18.1/gui/bars.png"); - }` - } - - static get properties () { - return { - bar: { type: Object } - } - } - - render () { - this.updateBar(this.bar) - - return html` -
-
${this.title}
-
-
-
-
-
-
- ` - } - - setTitle (bar) { - if (bar._title.text) this.title = bar.title.text - else this.title = translations[bar.title.translate] || 'Unknown Entity' - } - - setColor (bar) { - this.bossBarStyles.backgroundPositionY = `-${colors.indexOf(bar._color) * 10}px` - this.fillStyles.backgroundPositionY = `-${colors.indexOf(bar._color) * 10 + 5}px` - } - - setProgress (bar) { - this.fillStyles.width = `${bar._health * 100}%` - this.div2Styles.width = `${bar._health * 100}%` - } - - setDiv (bar) { - this.div1Styles.backgroundPositionY = `-${divs.indexOf(bar._dividers) * 10 + 70}px` - this.div2Styles.backgroundPositionY = `-${divs.indexOf(bar._dividers) * 10 + 75}px` - } - - updateBar (bar) { - this.setTitle(bar) - this.setColor(bar) - this.setDiv(bar) - this.setProgress(bar) - } -} - -class BossBars extends LitElement { - constructor () { - super() - this.bossBars = new Map() - } - - static get styles () { - return css` - .bossBars { - display: flex; - flex-direction: column; - gap: 5px; - position: absolute; - top: 9px; - left: 50%; - transform: translate(-50%); - }` - } - - static get properties () { - return { - bossBars: { type: Map } - } - } - - render () { - return html` -
- ${[...this.bossBars.values()]} -
- ` - } - - init () { - this.bot.on('bossBarCreated', async (bossBar) => { - this.bossBars.set(bossBar.entityUUID, new BossBar(bossBar)) - this.requestUpdate() - }) - this.bot.on('bossBarUpdated', (bossBar) => { - const bar = this.bossBars.get(bossBar.entityUUID) - bar.bar = bossBar - bar.requestUpdate() - }) - this.bot.on('bossBarDeleted', (bossBar) => { - this.bossBars.delete(bossBar.entityUUID) - this.requestUpdate() - }) - } -} - -window.customElements.define('pmui-bossbars-overlay', BossBars) -window.customElements.define('pmui-bossbar', BossBar) diff --git a/src/menus/components/breath_bar.js b/src/menus/components/breath_bar.js deleted file mode 100644 index b6fcfd9c..00000000 --- a/src/menus/components/breath_bar.js +++ /dev/null @@ -1,89 +0,0 @@ -const { LitElement, html, css, unsafeCSS } = require('lit') -const { guiIcons1_17_1 } = require('../hud') - -class BreathBar extends LitElement { - static get styles () { - return css` - .breathbar { - position: absolute; - display: flex; - flex-direction: row-reverse; - left: calc(50% + 91px); - transform: translate(-100%); - bottom: 40px; - --offset: calc(-1 * 16px); - --bg-x: calc(-1 * 16px); - --bg-y: calc(-1 * 18px); - } - - .breath { - width: 9px; - height: 9px; - margin-left: -1px; - } - - .breath.full { - background-image: url('${unsafeCSS(guiIcons1_17_1)}'); - background-size: 256px; - background-position: var(--offset) var(--bg-y); - } - - .breath.half { - background-image: url('${unsafeCSS(guiIcons1_17_1)}'); - background-size: 256px; - background-position: calc(var(--offset) - 9) var(--bg-y); - } - ` - } - - gameModeChanged () { - this.shadowRoot.querySelector('#breathbar').classList.toggle('creative', bot.game.gameMode === 'creative' || bot.game.gameMode === 'spectator') - } - - updateOxygen (hValue) { - const breathbar = this.shadowRoot.querySelector('#breathbar') - breathbar.style.display = 'block' - - const breaths = breathbar.children - - for (const breath of breaths) { - breath.classList.remove('full') - breath.classList.remove('half') - } - - for (let i = 0; i < Math.ceil(hValue / 2); i++) { - if (i >= breaths.length) break - - if (hValue % 2 !== 0 && Math.ceil(hValue / 2) === i + 1) { - breaths[i].classList.add('half') - } else { - breaths[i].classList.add('full') - } - } - - // if (hValue === 20) { - // setTimeout(() => { - // breathbar.style.display = 'none' - // }, 1000) - // } - } - - render () { - return html` -
-
-
-
-
-
-
-
-
-
-
-
- ` - } -} - -window.customElements.define('pmui-breathbar', BreathBar) diff --git a/src/menus/components/debug_overlay.js b/src/menus/components/debug_overlay.js deleted file mode 100644 index a79a940a..00000000 --- a/src/menus/components/debug_overlay.js +++ /dev/null @@ -1,274 +0,0 @@ -const { LitElement, html, css } = require('lit') -const { subscribeKey } = require('valtio/utils') -const { miscUiState } = require('../../globalState') -const { options } = require('../../optionsStorage') -const { getFixedFilesize } = require('../../downloadAndOpenFile') - -class DebugOverlay extends LitElement { - static get styles () { - return css` - .debug-left-side, - .debug-right-side { - padding-left: calc(env(safe-area-inset-left) / 2); - padding-right: calc(env(safe-area-inset-right) / 2); - position: absolute; - display: flex; - flex-direction: column; - z-index: 40; - pointer-events: none; - } - - .debug-left-side { - top: 1px; - left: 1px; - } - - .debug-right-side { - top: 5px; - right: 1px; - /* limit renderer long text width */ - width: 50%; - } - - p { - display: block; - color: white; - font-size: 10px; - width: fit-content; - line-height: 9px; - margin: 0; - padding: 0; - padding-bottom: 1px; - background: rgba(110, 110, 110, 0.5); - } - - .debug-right-side p { - margin-left: auto; - } - - .empty { - display: block; - height: 9px; - } - ` - } - - static get properties () { - return { - showOverlay: { type: Boolean }, - cursorBlock: { type: Object }, - rendererDevice: { type: String }, - bot: { type: Object }, - customEntries: { type: Object }, - packetsString: { type: String } - } - } - - constructor () { - super() - this.showOverlay = false - this.customEntries = {} - this.packetsString = '' - } - - firstUpdated () { - document.addEventListener('keydown', e => { - if (e.code === 'F3') { - this.showOverlay = !this.showOverlay - e.preventDefault() - } - }) - - let receivedTotal = 0 - let received = { - count: 0, - size: 0 - } - let sent = { - count: 0, - size: 0 - } - const packetsCountByNamePerSec = { - received: {}, - sent: {} - } - const hardcodedListOfDebugPacketsToIgnore = { - received: [ - 'entity_velocity', - 'sound_effect', - 'rel_entity_move', - 'entity_head_rotation', - 'entity_metadata', - 'entity_move_look', - 'teams', - 'entity_teleport', - 'entity_look', - 'ping', - 'entity_update_attributes', - 'player_info', - 'update_time', - 'animation', - 'entity_equipment', - 'entity_destroy', - 'named_entity_spawn', - 'update_light', - 'set_slot', - 'block_break_animation', - 'map_chunk', - 'spawn_entity', - 'world_particles', - 'keep_alive', - 'chat', - 'playerlist_header', - 'scoreboard_objective', - 'scoreboard_score' - ], - sent: [ - 'pong', - 'position', - 'look', - 'keep_alive', - 'position_look' - ] - } // todo cleanup? - const ignoredPackets = new Set('') - Object.defineProperty(window, 'debugTopPackets', { - get () { - return Object.fromEntries(Object.entries(packetsCountByName).map(([s, packets]) => [s, Object.fromEntries(Object.entries(packets).sort(([, n1], [, n2]) => { - return n2 - n1 - }))])) - } - }) - setInterval(() => { - this.packetsString = `↓ ${received.count} (${(received.size / 1024).toFixed(2)} KB/s, ${getFixedFilesize(receivedTotal)}) ↑ ${sent.count}` - received = { - count: 0, - size: 0 - } - sent = { - count: 0, - size: 0 - } - packetsCountByNamePerSec.received = {} - packetsCountByNamePerSec.sent = {} - }, 1000) - const packetsCountByName = { - received: {}, - sent: {} - } - - const managePackets = (type, name, data) => { - packetsCountByName[type][name] ??= 0 - packetsCountByName[type][name]++ - if (options.debugLogNotFrequentPackets && !ignoredPackets.has(name) && !hardcodedListOfDebugPacketsToIgnore[type].includes(name)) { - packetsCountByNamePerSec[type][name] ??= 0 - packetsCountByNamePerSec[type][name]++ - if (packetsCountByNamePerSec[type][name] > 5 || packetsCountByName[type][name] > 100) { // todo think of tracking the count within 10s - console.info(`[packet ${name} was ${type} too frequent] Ignoring...`) - ignoredPackets.add(name) - } else { - console.info(`[packet ${type}] ${name}`, /* ${JSON.stringify(data, null, 2)}` */ data) - } - } - } - - subscribeKey(miscUiState, 'gameLoaded', () => { - if (!miscUiState.gameLoaded) return - packetsCountByName.received = {} - packetsCountByName.sent = {} - const readPacket = (data, { name }, _buf, fullBuffer) => { - if (fullBuffer) { - const size = fullBuffer.byteLength - receivedTotal += size - received.size += size - } - received.count++ - managePackets('received', name, data) - } - bot._client.on('packet', readPacket) - bot._client.on('packet_name', (name, data) => readPacket(data, { name })) // custom client - bot._client.on('writePacket', (name, data) => { - sent.count++ - managePackets('sent', name, data) - }) - }) - } - - updated (changedProperties) { - if (changedProperties.has('bot')) { - this.bot.on('move', () => { - this.requestUpdate() - }) - this.bot.on('time', () => { - this.requestUpdate() - }) - this.bot.on('entitySpawn', () => { - this.requestUpdate() - }) - this.bot.on('entityGone', () => { - this.requestUpdate() - }) - } - } - - render () { - if (!this.showOverlay) { - return html`` - } - - const target = this.cursorBlock - - const pos = this.bot.entity.position - const rot = [this.bot.entity.yaw, this.bot.entity.pitch] - - const viewDegToMinecraft = (yaw) => yaw % 360 - 180 * (yaw < 0 ? -1 : 1) - - const quadsDescription = [ - 'north (towards negative Z)', - 'east (towards positive X)', - 'south (towards positive Z)', - 'west (towards negative X)' - ] - - const minecraftYaw = viewDegToMinecraft(rot[0] * -180 / Math.PI) - const minecraftQuad = Math.floor(((minecraftYaw + 180) / 90 + 0.5) % 4) - - const renderProp = (name, value) => { - return html`

${name}: ${typeof value === 'boolean' ? html`${value}` : value}

` - } - - const botBlock = bot.entity.position.floored() - const skyL = bot.world.getSkyLight(botBlock) - const blockL = bot.world.getBlockLight(botBlock) - const biomeId = bot.world.getBiome(botBlock) - - return html` -
-

Prismarine Web Client (${this.bot.version})

-

E: ${Object.values(this.bot.entities).length}

-

${this.bot.game.dimension}

-
-

XYZ: ${pos.x.toFixed(3)} / ${pos.y.toFixed(3)} / ${pos.z.toFixed(3)}

-

Chunk: ${Math.floor(pos.x % 16)} ~ ${Math.floor(pos.z % 16)} in ${Math.floor(pos.x / 16)} ~ ${Math.floor(pos.z / 16)}

-

Packets: ${this.packetsString}

-

Facing (viewer): ${rot[0].toFixed(3)} ${rot[1].toFixed(3)}

-

Facing (minecraft): ${quadsDescription[minecraftQuad]} (${minecraftYaw.toFixed(1)} ${(rot[1] * -180 / Math.PI).toFixed(1)})

-

Light: ${blockL} (${skyL} sky)

- -

Biome: minecraft:${window.loadedData.biomesArray[biomeId]?.name ?? 'unknown biome'}

-

Day: ${this.bot.time.day}

-
- ${Object.entries(this.customEntries).map(([name, value]) => html`

${name}: ${value}

`)} -
- -
-

Renderer: ${this.rendererDevice} powered by three.js r${global.THREE.REVISION}

-
- ${target ? html`

${target.name}

${Object.entries(target.getProperties()).map(([n, p], idx, arr) => renderProp(n, p, arr[idx + 1]))}` : ''} - ${target ? html`

Looking at: ${target.position.x} ${target.position.y} ${target.position.z}

` : ''} -
- ` - } -} - -window.customElements.define('pmui-debug-overlay', DebugOverlay) diff --git a/src/menus/components/food_bar.js b/src/menus/components/food_bar.js deleted file mode 100644 index 48f783fb..00000000 --- a/src/menus/components/food_bar.js +++ /dev/null @@ -1,122 +0,0 @@ -const { LitElement, html, css, unsafeCSS } = require('lit') -const { guiIcons1_17_1 } = require('../hud') - -class FoodBar extends LitElement { - static get styles () { - return css` - .foodbar { - position: fixed; - display: flex; - flex-direction: row-reverse; - left: calc(50% + 91px); - transform: translate(-100%); - bottom: 30px; - --lightened: 0; - --offset: calc(-1 * (52px)); - --bg-x: calc(-1 * (16px + 9px * var(--lightened))); - --bg-y: calc(-1 * 27px); - } - - .food { - width: 9px; - height: 9px; - background-image: url('${unsafeCSS(guiIcons1_17_1)}'), url('${unsafeCSS(guiIcons1_17_1)}'); - background-size: 256px, 256px; - background-position: var(--bg-x) var(--bg-y), var(--bg-x) var(--bg-y); - margin-left: -1px; - } - - .food.full { - background-position: var(--offset) var(--bg-y), var(--bg-x) var(--bg-y); - } - - .food.half { - background-position: calc(var(--offset) - 9px) var(--bg-y), var(--bg-x) var(--bg-y); - } - - .foodbar.low .food { - animation: lowHungerAnim 0.2s steps(2, end) infinite; - } - - .foodbar.low .food:nth-of-type(2n) { - animation-direction: reverse; - } - - .foodbar.low .food:nth-of-type(3n) { - animation-duration: 0.1s; - } - - .foodbar.updated { - animation: updatedAnim 0.3s steps(2, end) 2; - } - - .creative { - display: none; - } - - @keyframes lowHungerAnim { - to { transform: translateY(1px); } - } - - @keyframes updatedAnim { - to { --lightened: 1; } - } - ` - } - - gameModeChanged (gamemode) { - this.shadowRoot.querySelector('#foodbar').classList.toggle('creative', gamemode === 1) - } - - onHungerUpdate () { - this.shadowRoot.querySelector('#foodbar').classList.toggle('updated', true) - if (this.hungerTimeout) clearTimeout(this.hungerTimeout) - this.hungerTimeout = setTimeout(() => { - this.shadowRoot.querySelector('#foodbar').classList.toggle('updated', false) - this.hungerTimeout = null - }, 1000) - } - - updateHunger (hValue, d) { - const foodbar = this.shadowRoot.querySelector('#foodbar') - foodbar.classList.toggle('low', hValue <= 5) - - const foods = foodbar.children - - for (const food of foods) { - food.classList.remove('full') - food.classList.remove('half') - } - - // if (d) this.onHungerUpdate() - - for (let i = 0; i < Math.ceil(hValue / 2); i++) { - if (i >= foods.length) break - - if (hValue % 2 !== 0 && Math.ceil(hValue / 2) === i + 1) { - foods[i].classList.add('half') - } else { - foods[i].classList.add('full') - } - } - } - - render () { - return html` -
-
-
-
-
-
-
-
-
-
-
-
- ` - } -} - -window.customElements.define('pmui-foodbar', FoodBar) diff --git a/src/menus/components/health_bar.js b/src/menus/components/health_bar.js deleted file mode 100644 index c49c510b..00000000 --- a/src/menus/components/health_bar.js +++ /dev/null @@ -1,163 +0,0 @@ -const { LitElement, html, css, unsafeCSS } = require('lit') -const { guiIcons1_17_1 } = require('../hud') - -function getEffectClass (effect) { - switch (effect.id) { - case 19: return 'poisoned' - case 20: return 'withered' - case 22: return 'absorption' - default: return '' - } -} - -class HealthBar extends LitElement { - static get styles () { - return css` - .health { - position: fixed; - display: flex; - flex-direction: row; - left: calc(50% - 91px); - bottom: 30px; - --hardcore: 0; - --kind: 0; - --lightened: 0; - --offset: calc(-1 * (52px + (9px * (4 * var(--kind) + var(--lightened) * 2)) )); - --bg-x: calc(-1 * (16px + 9px * var(--lightened))); - --bg-y: calc(-1 * var(--hardcore) * 45px); - } - - .health.creative { - display: none; - } - - .health.hardcore { - --hardcore: 1; - } - - .health.poisoned { - --kind: 1; - } - - .health.withered { - --kind: 2; - } - - .health.absorption { - --kind: 3; - } - - .heart { - width: 9px; - height: 9px; - background-image: url('${unsafeCSS(guiIcons1_17_1)}'), url('${unsafeCSS(guiIcons1_17_1)}'); - background-size: 256px, 256px; - background-position: var(--bg-x) var(--bg-y), var(--bg-x) var(--bg-y); - margin-left: -1px; - } - - .heart.full { - background-position: var(--offset) var(--bg-y), var(--bg-x) var(--bg-y); - } - - .heart.half { - background-position: calc(var(--offset) - 9px) var(--bg-y), var(--bg-x) var(--bg-y); - } - - .health.low .heart { - animation: lowHealthAnim 0.2s steps(2, end) infinite; - } - - .health.low .heart:nth-of-type(2n) { - animation-direction: reverse; - } - - .health.low .heart:nth-of-type(3n) { - animation-duration: 0.1s; - } - - .health.damaged { - animation: damagedAnim 0.3s steps(2, end) 2; - } - - @keyframes lowHealthAnim { - to { - transform: translateY(1px); - } - } - - @keyframes damagedAnim { - to { --lightened: 1; } - } - ` - } - - effectAdded (effect) { - const effectClass = getEffectClass(effect) - if (!effectClass) return - this.shadowRoot.querySelector('#health').classList.add(effectClass) - } - - effectEnded (effect) { - const effectClass = getEffectClass(effect) - if (!effectClass) return - this.shadowRoot.querySelector('#health').classList.remove(effectClass) - } - - onDamage () { - this.shadowRoot.querySelector('#health').classList.toggle('damaged', true) - if (this.hurtTimeout) clearTimeout(this.hurtTimeout) - this.hurtTimeout = setTimeout(() => { - this.shadowRoot.querySelector('#health').classList.toggle('damaged', false) - this.hurtTimeout = null - }, 1000) - } - - gameModeChanged (gamemode, hardcore) { - this.shadowRoot.querySelector('#health').classList.toggle('creative', bot.game.gameMode === 'creative' || bot.game.gameMode === 'spectator') - this.shadowRoot.querySelector('#health').classList.toggle('hardcore', hardcore) - } - - updateHealth (hValue, d) { - const health = this.shadowRoot.querySelector('#health') - health.classList.toggle('low', hValue <= 4) - - const hearts = health.children - - for (const heart of hearts) { - heart.classList.remove('full') - heart.classList.remove('half') - } - - if (d) this.onDamage() - - for (let i = 0; i < Math.ceil(hValue / 2); i++) { - if (i >= hearts.length) break - - if (hValue % 2 !== 0 && Math.ceil(hValue / 2) === i + 1) { - hearts[i].classList.add('half') - } else { - hearts[i].classList.add('full') - } - } - } - - render () { - return html` -
-
-
-
-
-
-
-
-
-
-
-
- ` - } -} - -window.customElements.define('pmui-healthbar', HealthBar) diff --git a/src/menus/components/hotbar.js b/src/menus/components/hotbar.js deleted file mode 100644 index b4d14b5b..00000000 --- a/src/menus/components/hotbar.js +++ /dev/null @@ -1,206 +0,0 @@ -const { LitElement, html, css, unsafeCSS } = require('lit') -const widgetsTexture = require('minecraft-assets/minecraft-assets/data/1.16.4/gui/widgets.png') -const { subscribeKey } = require('valtio/utils') -const invsprite = require('../../invsprite.json') -const { isGameActive, miscUiState, showModal } = require('../../globalState') - -const { openPlayerInventory, renderSlotExternal } = require('../../playerWindows') -const { isProbablyIphone } = require('./common') - -class Hotbar extends LitElement { - static get styles () { - return css` - .hotbar { - position: fixed; - /* todo use env(safe-area-inset-bottom) instead */ - bottom: ${unsafeCSS(isProbablyIphone() ? '40px' : '0')}; - left: 50%; - transform: translate(-50%); - width: 182px; - height: 22px; - background: url("${unsafeCSS(widgetsTexture)}"); - background-size: 256px; - } - - #hotbar-selected { - position: absolute; - left: -1px; - top: -1px; - width: 24px; - height: 24px; - background: url("${unsafeCSS(widgetsTexture)}"); - background-size: 256px; - background-position-y: -22px; - } - - #hotbar-items-wrapper { - position: absolute; - top: 0; - left: 1px; - display: flex; - flex-direction: row; - height: 22px; - margin: 0; - padding: 0; - } - - .hotbar-item { - position: relative; - width: 20px; - height: 22px; - } - - .item-icon { - top: 3px; - left: 2px; - position: absolute; - width: 32px; - height: 32px; - transform-origin: top left; - transform: scale(0.5); - background-size: 1024px auto; - } - - .item-stack { - position: absolute; - color: white; - font-size: 10px; - text-shadow: 1px 1px 0 rgb(63, 63, 63); - right: 1px; - bottom: 1px; - } - - #hotbar-item-name { - color: white; - position: absolute; - bottom: 51px; - left: 50%; - transform: translate(-50%); - text-shadow: rgb(63, 63, 63) 1px 1px 0px; - font-family: mojangles, minecraft, monospace; - font-size: 10px; - text-align: center; - } - - .hotbar-item-name-fader { - opacity: 0; - transition: visibility 0s, opacity 1s linear; - transition-delay: 2s; - } - - .hotbar-more { - display:flex; - justify-content: center; - border: 1px solid white; - } - .hotbar-more::before { - content: '...'; - margin-top: -1px; - } - ` - } - - static get properties () { - return { - activeItemName: { type: String }, - } - } - - constructor () { - super() - subscribeKey(miscUiState, 'currentTouch', () => { - this.requestUpdate() - }) - this.activeItemName = '' - - document.addEventListener('wheel', (e) => { - if (!isGameActive(true)) return - e.preventDefault() - const newSlot = ((bot.quickBarSlot + Math.sign(e.deltaY)) % 9 + 9) % 9 - this.reloadHotbarSelected(newSlot) - }, { - passive: false, - }) - - document.addEventListener('keydown', (e) => { - if (!isGameActive(true)) return - const numPressed = +((/Digit(\d)/.exec(e.code))?.[1] ?? -1) - if (numPressed < 1 || numPressed > 9) return - this.reloadHotbarSelected(numPressed - 1) - }) - } - - init () { - this.reloadHotbar() - this.reloadHotbarSelected(0) - - bot.inventory.on('updateSlot', (slot, oldItem, newItem) => { - if (slot >= bot.inventory.hotbarStart + 9) return - if (slot < bot.inventory.hotbarStart) return - - this.reloadHotbar(slot - bot.inventory.hotbarStart) - }) - } - - reloadHotbar (onlySlot = undefined) { - for (let i = 0; i < 9; i++) { - if (onlySlot !== undefined && onlySlot !== i) continue - const item = bot.inventory.slots[bot.inventory.hotbarStart + i] - const slotEl = this.shadowRoot.getElementById('hotbar-' + i) - const slotIcon = slotEl.children[0] - const slotStack = slotEl.children[1] - const data = item ? renderSlotExternal(item) : { sprite: [invsprite.air.x, invsprite.air.y] } - if (item) item.displayName = data?.displayName ?? item.displayName - if (data?.imageDataUrl) { - slotIcon.style['background-image'] = `url('${data.imageDataUrl}')` - } else { - slotIcon.style['background-image'] = `url('invsprite.png')` - } - const [x, y] = data?.sprite ?? [0, 0] - slotIcon.style['background-position-x'] = `-${x}px` - slotIcon.style['background-position-y'] = `-${y}px` - slotStack.textContent = item?.count > 1 ? item.count : '' - } - } - - async reloadHotbarSelected (slot) { - const item = bot.inventory.slots[bot.inventory.hotbarStart + slot] - const newLeftPos = (-1 + 20 * slot) + 'px' - this.shadowRoot.getElementById('hotbar-selected').style.left = newLeftPos - bot.setQuickBarSlot(slot) - // todo highlight on item type change - this.activeItemName = item?.displayName ?? '' - const name = this.shadowRoot.getElementById('hotbar-item-name') - name.classList.remove('hotbar-item-name-fader') - setTimeout(() => name.classList.add('hotbar-item-name-fader'), 10) - } - - render () { - return html` -
-

${this.activeItemName}

-
-
{ - if (!e.target.id.startsWith('hotbar')) return - const slot = +e.target.id.split('-')[1] - this.reloadHotbarSelected(slot) - }}> - ${Array.from({ length: 9 }).map((_, i) => html` -
{ - this.reloadHotbarSelected(i) - }}> -
- -
- `)} - ${miscUiState.currentTouch ? html`
{ - openPlayerInventory() - }}>` : undefined} -
-
-
- ` - } -} - -window.customElements.define('pmui-hotbar', Hotbar) diff --git a/src/menus/components/playerlist_overlay.js b/src/menus/components/playerlist_overlay.js deleted file mode 100644 index b4dd0ba1..00000000 --- a/src/menus/components/playerlist_overlay.js +++ /dev/null @@ -1,185 +0,0 @@ -const { LitElement, html, css } = require('lit') -const { isGameActive } = require('../../globalState') - -const MAX_ROWS_PER_COL = 10 - -class PlayerListOverlay extends LitElement { - static get styles () { - return css` - .playerlist-container { - position: absolute; - background-color: rgba(0, 0, 0, 0.3); - top: 9px; - left: 50%; - transform: translate(-50%); - width: fit-content; - padding: 1px; - display: flex; - flex-direction: column; - gap: 1px 0; - place-items: center; - z-index: 30; - } - - .title { - color: white; - text-shadow: 1px 1px 0px #3f3f3f; - font-size: 10px; - margin: 0; - padding: 0; - } - - .playerlist-entry { - overflow: hidden; - color: white; - font-size: 10px; - margin: 0px; - line-height: calc(100% - 1px); - text-shadow: 1px 1px 0px #3f3f3f; - font-family: mojangles, minecraft, monospace; - background: rgba(255, 255, 255, 0.1); - width: 100%; - } - - .active-player { - color: rgb(42, 204, 237); - text-shadow: 1px 1px 0px rgb(4, 44, 67); - } - - .playerlist-ping { - text-align: right; - float: right; - padding-left: 10px; - } - - .playerlist-ping-value { - color: rgb(114, 255, 114); - text-shadow: 1px 1px 0px rgb(28, 105, 28); - float: left; - margin: 0; - margin-right: 1px; - } - - .playerlist-ping-label { - text-shadow: 1px 1px 0px #3f3f3f; - color: white; - float: right; - margin: 0px; - } - - .player-lists { - display: flex; - flex-direction: row; - place-items: center; - place-content: center; - gap: 0 4px; - } - - .player-list { - display: flex; - flex-direction: column; - gap: 1px 0; - min-width: 80px; - } - ` - } - - static get properties () { - return { - serverIP: { type: String }, - clientId: { type: String }, - players: { type: Object } - } - } - - constructor () { - super() - this.serverIP = '' - this.clientId = '' - this.players = {} - } - - init (ip) { - const playerList = this.shadowRoot.querySelector('#playerlist-container') - - this.isOpen = false - this.players = bot.players - if (bot.player) { - this.clientId = bot.player.uuid - } else { - bot._client.on('player_info', () => { - this.clientId = bot.player?.uuid - }) - } - this.serverIP = ip - - this.requestUpdate() - - const showList = (shouldShow = true) => { - playerList.style.display = shouldShow ? 'block' : 'none' - this.isOpen = shouldShow - } - - document.addEventListener('keydown', e => { - if (!isGameActive(true)) return - if (e.key === 'Tab') { - showList(true) - e.preventDefault() - } - }) - - document.addEventListener('keyup', e => { - if (!this.isOpen) return - if (e.key === 'Tab') { - showList(false) - e.preventDefault() - } - }) - - bot.on('playerUpdated', () => this.requestUpdate()) // LitElement seems to be batching requests, so it should be fine? - bot.on('playerJoined', () => this.requestUpdate()) - bot.on('playerLeft', () => this.requestUpdate()) - } - - render () { - const lists = [] - const players = Object.values(this.players).sort((a, b) => { - if (a.username > b.username) return 1 - if (a.username < b.username) return -1 - return 0 - }) - - let tempList = [] - for (let i = 0; i < players.length; i++) { - tempList.push(players[i]) - - if ((i + 1) / MAX_ROWS_PER_COL === 1 || i + 1 === players.length) { - lists.push([...tempList]) - tempList = [] - } - } - - return html` - - ` - } -} - -window.customElements.define('pmui-playerlist-overlay', PlayerListOverlay) diff --git a/src/menus/hud.js b/src/menus/hud.js deleted file mode 100644 index 17537e0e..00000000 --- a/src/menus/hud.js +++ /dev/null @@ -1,258 +0,0 @@ -import { f3Keybinds } from '../controls' -import { showOptionsModal } from '../react/SelectOption' - -const { LitElement, html, css, unsafeCSS } = require('lit') -const { showModal, miscUiState, activeModalStack, hideCurrentModal } = require('../globalState') -const { options, watchValue } = require('../optionsStorage') -const { getGamemodeNumber } = require('../utils') -const { isMobile } = require('./components/common') - -export const guiIcons1_17_1 = require('minecraft-assets/minecraft-assets/data/1.17.1/gui/icons.png') -export const guiIcons1_16_4 = require('minecraft-assets/minecraft-assets/data/1.16.4/gui/icons.png') - -class Hud extends LitElement { - static get styles () { - return css` - :host { - position: fixed; - top: 0; - left: 0; - z-index: -2; - width: 100%; - height: 100vh; - touch-action: none; - } - - .crosshair { - width: 16px; - height: 16px; - background: url('${unsafeCSS(guiIcons1_17_1)}'); - background-size: calc(256px * var(--crosshair-scale)); - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - z-index: 2; - } - - #xp-label { - position: fixed; - top: -8px; - left: 50%; - transform: translate(-50%); - font-size: 10px; - font-family: minecraft, mojangles, monospace; - color: rgb(30, 250, 30); - text-shadow: 0px -1px #000, 0px 1px #000, 1px 0px #000, -1px 0px #000; - z-index: 10; - } - - #xp-bar-bg { - position: fixed; - left: 50%; - bottom: 24px; - transform: translate(-50%); - width: 182px; - height: 5px; - background-image: url('${unsafeCSS(guiIcons1_16_4)}'); - background-size: 256px; - background-position-y: -64px; - } - - .xp-bar { - width: 182px; - height: 5px; - background-image: url('${unsafeCSS(guiIcons1_17_1)}'); - background-size: 256px; - background-position-y: -69px; - } - - .mobile-top-btns { - display: none; - flex-direction: row; - position: fixed; - top: 0; - left: 50%; - transform: translate(-50%); - gap: 0 5px; - z-index: 20; - } - - .pause-btn, - .chat-btn { - --scale: 1.3; - border: none; - outline: 0.5px solid white; - width: calc(14px * var(--scale)); - height: calc(14px * var(--scale)); - background-image: url('extra-textures/gui.png'); - background-size: calc(256px * var(--scale)); - background-position-x: calc(var(--scale) * -202px); - background-position-y: calc(var(--scale) * -66px); - } - - .chat-btn { - background-position-y: calc(var(--scale) * -84px); - } - .debug-btn { - background: #9c8c86; - font-size: 8px; - /* todo make other buttons centered */ - /* margin-right: 5px; */ - color: white; - font-family: minecraft, mojangles, monospace; - padding: 4px 6px; - outline: 0.5px solid white; - } - ` - } - - static get properties () { - return { - bot: { type: Object } - } - } - - firstUpdated () { - this.isReady = true - window.dispatchEvent(new CustomEvent('hud-ready', { detail: this })) - - watchValue(miscUiState, o => { - this.showMobileControls(o.currentTouch) - //@ts-expect-error - this.shadowRoot.host.style.display = o.gameLoaded ? 'block' : 'none' - }) - } - - /** - * @param {import('mineflayer').Bot} bot - */ - preload (bot) { - const bossBars = this.shadowRoot.getElementById('bossbars-overlay') - bossBars.bot = bot - - bossBars.init() - } - - /** - * @param {globalThis.THREE.Renderer} renderer - * @param {import('mineflayer').Bot} bot - * @param {string} host - */ - init (renderer, bot, host) { - const debugMenu = this.shadowRoot.querySelector('#debug-overlay') - const playerList = this.shadowRoot.querySelector('#playerlist-overlay') - const healthbar = this.shadowRoot.querySelector('#health-bar') - const foodbar = this.shadowRoot.querySelector('#food-bar') - // const breathbar = this.shadowRoot.querySelector('#breath-bar') - const chat = this.shadowRoot.querySelector('#chat') - const hotbar = this.shadowRoot.querySelector('#hotbar') - const xpLabel = this.shadowRoot.querySelector('#xp-label') - - this.bot = bot - debugMenu.bot = bot - - hotbar.init() - playerList.init(host) - - bot.on('entityHurt', (entity) => { - if (entity !== bot.entity) return - healthbar.onDamage() - }) - - bot.on('entityEffect', (entity, effect) => { - if (entity !== bot.entity) return - healthbar.effectAdded(effect) - }) - - bot.on('entityEffectEnd', (entity, effect) => { - if (entity !== bot.entity) return - healthbar.effectEnded(effect) - }) - - const onGameModeChange = () => { - const gamemode = getGamemodeNumber(bot) - healthbar.gameModeChanged(gamemode, bot.game.hardcore) - foodbar.gameModeChanged(gamemode) - // breathbar.gameModeChanged(gamemode) - const creativeLike = gamemode === 1 || gamemode === 3 - this.shadowRoot.querySelector('#xp-bar-bg').style.display = creativeLike ? 'none' : 'block' - } - bot.on('game', onGameModeChange) - onGameModeChange() - - const onHealthUpdate = () => { - healthbar.updateHealth(bot.health, true) - foodbar.updateHunger(bot.food, true) - } - bot.on('health', onHealthUpdate) - onHealthUpdate() - - const onXpUpdate = () => { - // @ts-expect-error - this.shadowRoot.querySelector('#xp-bar-bg').firstElementChild.style.width = `${182 * bot.experience.progress}px` - xpLabel.innerHTML = String(bot.experience.level) - xpLabel.style.display = bot.experience.level > 0 ? 'block' : 'none' - } - bot.on('experience', onXpUpdate) - onXpUpdate() - - // bot.on('breath', () => { - // breathbar.updateOxygen(bot.oxygenLevel) - // }) - - // TODO - // breathbar.updateOxygen(bot.oxygenLevel ?? 20) - } - - /** @param {boolean} bl */ - showMobileControls (bl) { - this.shadowRoot.querySelector('#mobile-top').style.display = bl ? 'flex' : 'none' - } - - render () { - return html` - -
-
{ - window.dispatchEvent(new MouseEvent('mousedown', { button: 1 })) - }}>S
-
{ - const select = await showOptionsModal('', f3Keybinds.filter(f3Keybind => f3Keybind.mobileTitle).map(f3Keybind => f3Keybind.mobileTitle)) - if (!select) return - const f3Keybind = f3Keybinds.find(f3Keybind => f3Keybind.mobileTitle === select) - f3Keybind.action() - }} @pointerdown=${(e) => { - this.shadowRoot.getElementById('debug-overlay').showOverlay = !this.shadowRoot.getElementById('debug-overlay').showOverlay - }}>F3
-
{ - e.stopPropagation() - if (activeModalStack.at(-1)?.reactType === 'chat') { - hideCurrentModal() - } else { - showModal({ reactType: 'chat' }) - } - }}>
-
{ - e.stopPropagation() - showModal(document.getElementById('pause-screen')) - }}>
-
- - - - -
- - - -
-
- -
- - ` - } -} - -window.customElements.define('pmui-hud', Hud) diff --git a/src/menus/keybinds_screen.js b/src/menus/keybinds_screen.js deleted file mode 100644 index 739199d9..00000000 --- a/src/menus/keybinds_screen.js +++ /dev/null @@ -1,173 +0,0 @@ -const { LitElement, html, css } = require('lit') -const { hideCurrentModal } = require('../globalState') -const { commonCss } = require('./components/common') - -class KeyBindsScreen extends LitElement { - static get styles () { - return css` - ${commonCss} - .title { - top: 4px; - } - - main { - display: flex; - flex-direction: column; - position: absolute; - top: 30px; - left: 50%; - transform: translate(-50%); - width: 100%; - height: calc(100% - 64px); - place-items: center; - background: rgba(0, 0, 0, 0.5); - box-shadow: inset 0 3px 6px rgba(0, 0, 0, 0.7), inset 0 -3px 6px rgba(0, 0, 0, 0.7); - } - - .keymap-list { - width: 288px; - display: flex; - flex-direction: column; - padding: 4px 0; - overflow-y: auto; - } - - .keymap-list::-webkit-scrollbar { - width: 6px; - } - - .keymap-list::-webkit-scrollbar-track { - background: #000; - } - - .keymap-list::-webkit-scrollbar-thumb { - background: #ccc; - box-shadow: inset -1px -1px 0 #4f4f4f; - } - - .keymap-entry { - display: flex; - flex-direction: row; - width: 100%; - height: 20px; - place-content: center; - place-items: center; - justify-content: space-between; - } - - span { - color: white; - text-shadow: 1px 1px 0 rgb(63, 63, 63); - font-size: 10px; - } - - .keymap-entry-btns { - display: flex; - flex-direction: row; - gap: 4px; - } - - .bottom-btns { - display: flex; - flex-direction: row; - width: 310px; - height: 20px; - justify-content: space-between; - position: absolute; - bottom: 9px; - left: 50%; - transform: translate(-50%); - } - - ` - } - - static get properties () { - return { - keymaps: { type: Object }, - selected: { type: Number } - } - } - - constructor () { - super() - this.selected = -1 - this.keymaps = [ - { defaultKey: 'KeyW', key: 'KeyW', name: 'Walk Forwards' }, - { defaultKey: 'KeyS', key: 'KeyS', name: 'Walk Backwards' }, - { defaultKey: 'KeyA', key: 'KeyA', name: 'Strafe Left' }, - { defaultKey: 'KeyD', key: 'KeyD', name: 'Strafe Right' }, - { defaultKey: 'Space', key: 'Space', name: 'Jump' }, - { defaultKey: 'ShiftLeft', key: 'ShiftLeft', name: 'Sneak' }, - { defaultKey: 'ControlLeft', key: 'ControlLeft', name: 'Sprint' }, - { defaultKey: 'KeyT', key: 'KeyT', name: 'Open Chat' }, - { defaultKey: 'Slash', key: 'Slash', name: 'Open Command' }, - // { defaultKey: '0', key: '0', name: 'Attack/Destroy' }, - // { defaultKey: '1', key: '1', name: 'Place Block' }, - { defaultKey: 'KeyQ', key: 'KeyQ', name: 'Drop Item' }, - // { defaultKey: 'Digit1', key: 'Digit1', name: 'Hotbar Slot 1' }, - // { defaultKey: 'Digit2', key: 'Digit2', name: 'Hotbar Slot 2' }, - // { defaultKey: 'Digit3', key: 'Digit3', name: 'Hotbar Slot 3' }, - // { defaultKey: 'Digit4', key: 'Digit4', name: 'Hotbar Slot 4' }, - // { defaultKey: 'Digit5', key: 'Digit5', name: 'Hotbar Slot 5' }, - // { defaultKey: 'Digit6', key: 'Digit6', name: 'Hotbar Slot 6' }, - // { defaultKey: 'Digit7', key: 'Digit7', name: 'Hotbar Slot 7' }, - // { defaultKey: 'Digit8', key: 'Digit8', name: 'Hotbar Slot 8' }, - // { defaultKey: 'Digit9', key: 'Digit9', name: 'Hotbar Slot 9' }, - { defaultKey: 'KeyE', key: 'KeyE', name: 'Open Inventory' }, - ] - - document.addEventListener('keydown', (e) => { - if (this.selected !== -1) { - this.keymaps[this.selected].key = e.code - this.selected = -1 - this.requestUpdate() - } - }) - } - - render () { - return html` -
- -

Key Binds

- -
-
- ${this.keymaps.map((m, i) => html` -
- ${m.name} - -
- { - e.target.setAttribute('pmui-label', `> ${m.key} <`) - this.selected = i - this.requestUpdate() - }}> - { - this.keymaps[i].key = this.keymaps[i].defaultKey - this.requestUpdate() - this.selected = -1 - }}> -
-
- `)} -
-
- -
- v.key !== v.defaultKey)} @pmui-click=${this.onResetAllPress}> - hideCurrentModal()}> -
- ` - } - - onResetAllPress () { - for (const keymap of this.keymaps) { - keymap.key = keymap.defaultKey - } - this.requestUpdate() - } -} - -window.customElements.define('pmui-keybindsscreen', KeyBindsScreen) diff --git a/src/menus/pause_screen.js b/src/menus/pause_screen.js deleted file mode 100644 index 0f47395c..00000000 --- a/src/menus/pause_screen.js +++ /dev/null @@ -1,152 +0,0 @@ -//@ts-check -const { join } = require('path') -const { LitElement, html, css } = require('lit') -const { subscribe } = require('valtio') -const { subscribeKey } = require('valtio/utils') -const { usedServerPathsV1 } = require('flying-squid/dist/lib/modules/world') -const { hideCurrentModal, showModal, miscUiState, openOptionsMenu } = require('../globalState') -const { fsState } = require('../loadSave') -const { openGithub, setLoadingScreenStatus } = require('../utils') -const { disconnect } = require('../flyingSquidUtils') -const { closeWan, openToWanAndCopyJoinLink, getJoinLink } = require('../localServerMultiplayer') -const { uniqueFileNameFromWorldName, copyFilesAsyncWithProgress, existsViaStats, mkdirRecursive } = require('../browserfs') -const { showOptionsModal } = require('../react/SelectOption') -const { openURL } = require('./components/common') - -class PauseScreen extends LitElement { - static get styles () { - return css` - .bg { - position: absolute; - top: 0; - left: 0; - background: rgba(0, 0, 0, 0.75); - width: 100%; - height: 100%; - } - - .title { - position: absolute; - top: 40px; - left: 50%; - transform: translate(-50%); - font-size: 10px; - color: white; - text-shadow: 1px 1px #222; - } - - main { - display: flex; - flex-direction: column; - gap: 4px 0; - position: absolute; - left: 50%; - width: 204px; - top: calc(48px); - transform: translate(-50%); - } - - .row { - display: flex; - flex-direction: row; - justify-content: space-between; - width: 100%; - } - ` - } - - constructor () { - super() - - subscribe(fsState, () => { - this.requestUpdate() - }) - subscribeKey(miscUiState, 'singleplayer', () => this.requestUpdate()) - subscribeKey(miscUiState, 'wanOpened', () => this.requestUpdate()) - } - - async openWorldActions () { - if (fsState.inMemorySave || !miscUiState.singleplayer) { - return showOptionsModal('World actions...', []) - } - const action = await showOptionsModal('World actions...', ['Save to browser memory']) - if (action === 'Save to browser memory') { - setLoadingScreenStatus('Saving world') - try { - //@ts-expect-error - const { worldFolder } = localServer.options - const saveRootPath = await uniqueFileNameFromWorldName(worldFolder.split('/').pop(), `/data/worlds`) - await mkdirRecursive(saveRootPath) - for (const copyPath of [...usedServerPathsV1, 'icon.png']) { - const srcPath = join(worldFolder, copyPath) - const savePath = join(saveRootPath, copyPath) - // eslint-disable-next-line no-await-in-loop - await copyFilesAsyncWithProgress(srcPath, savePath, false) - } - } catch (err) { - void showOptionsModal(`Error while saving the world: ${err.message}`, []) - } finally { - setLoadingScreenStatus(undefined) - } - } - } - - render () { - const joinButton = miscUiState.singleplayer - const isOpenedToWan = miscUiState.wanOpened - - return html` -
- - this.openWorldActions()}> - -

Game Menu

- -
- -
- openGithub()}> - openURL('https://discord.gg/4Ucm684Fq3')}> -
- openOptionsMenu('main')}> - - - ${joinButton ? html` -
- this.clickJoinLinkButton()}> - this.clickJoinLinkButton(true)}> -
- ` : ''} - { - disconnect() - }}> -
- ` - } - - async clickJoinLinkButton (qr = false) { - if (!qr && miscUiState.wanOpened) { - closeWan() - return - } - if (!miscUiState.wanOpened || !qr) { - await openToWanAndCopyJoinLink(() => { }, !qr) - } - if (qr) { - const joinLink = getJoinLink() - //@ts-expect-error - miscUiState.currentDisplayQr = joinLink - - } - } - - show () { - this.focus() - } - - onReturnPress () { - hideCurrentModal() - } -} - -window.customElements.define('pmui-pausescreen', PauseScreen) diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index d80a9ebe..84a09d45 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -139,6 +139,7 @@ export const guiOptionsScheme: { { guiScale: { max: 4, + min: 1, unit: '', delayApply: true, }, diff --git a/src/react/ArmorBar.css b/src/react/ArmorBar.css new file mode 100644 index 00000000..ae13935e --- /dev/null +++ b/src/react/ArmorBar.css @@ -0,0 +1,30 @@ +.armor_container { + position: fixed; + display: flex; + z-index: -1; + flex-direction: row; + left: calc(50% - 91px); + bottom: calc(var(--safe-area-inset-bottom) + 40px); + --offset: calc(-1 * 25px); + --bg-x: calc(-1 * 16px); + --bg-y: calc(-1 * 9px); + pointer-events: none; +} + +.armor { + width: 9px; + height: calc(9px); + background-image: var(--gui-icons); + background-size: 256px, 256px; + background-position: var(--bg-x) var(--bg-y), var(--bg-x) var(--bg-y); + margin-left: -1px; +} + + +.armor.full { + background-position: calc(var(--offset) - 9px) var(--bg-y), var(--bg-x) var(--bg-y); +} + +.armor.half { + background-position: var(--offset) var(--bg-y), var(--bg-x) var(--bg-y); +} diff --git a/src/react/ArmorBar.stories.tsx b/src/react/ArmorBar.stories.tsx new file mode 100644 index 00000000..038b3692 --- /dev/null +++ b/src/react/ArmorBar.stories.tsx @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/react' +import icons from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/icons.png' + +import ArmorBar from './ArmorBar' + + +const meta: Meta = { + component: ArmorBar, +} + +export default meta +type Story = StoryObj; + +export const Primary: Story = { + args: { + armorValue: 10 + } +} diff --git a/src/react/ArmorBar.tsx b/src/react/ArmorBar.tsx new file mode 100644 index 00000000..cc9c66cd --- /dev/null +++ b/src/react/ArmorBar.tsx @@ -0,0 +1,52 @@ +import { useRef, useState, useEffect, CSSProperties } from 'react' +import SharedHudVars from './SharedHudVars' +import './ArmorBar.css' + + +export type ArmorBarProps = { + armorValue: number, + style?: CSSProperties +} + +export default ( + { + armorValue, + style + }: ArmorBarProps) => { + const armorRef = useRef(null!) + + useEffect(() => { + const armorElement = armorRef.current + const armors = armorElement.children + + for (const armor of armors) { + armor.classList.remove('full') + armor.classList.remove('half') + } + + for (let i = 0; i < Math.ceil(armorValue / 2); i++) { + if (i >= armors.length) break + + if (armorValue % 2 !== 0 && Math.ceil(armorValue / 2) === i + 1) { + armors[i].classList.add('half') + } else { + armors[i].classList.add('full') + } + } + }, [armorValue]) + + return +
+ { + Array.from({ length: 10 }, () => 0) + .map( + (num, index) =>
+ ) + } +
+
+} + + diff --git a/src/react/BossBarOverlay.css b/src/react/BossBarOverlay.css new file mode 100644 index 00000000..fdbeb594 --- /dev/null +++ b/src/react/BossBarOverlay.css @@ -0,0 +1,34 @@ +.bossBars { + display: flex; + flex-direction: column; + gap: 5px; + position: absolute; + top: 9px; + left: 50%; + transform: translate(-50%); +} + +.bossbar-container { + display: flex; + flex-direction: column; + align-items: center; +} +.bossbar-title { + font-size: 7px; + color: #fff; +} +.bossbar { + background-image: url("textures/1.18.1/gui/bars.png"); + width: 182px; + height: 5px; + position: relative; +} +.bossbar .fill { + content: ""; + position: absolute; + top: 0; + left: 0; + height: 5px; + width: 0; + background-image: url("textures/1.18.1/gui/bars.png"); +} diff --git a/src/react/BossBarOverlay.stories.tsx b/src/react/BossBarOverlay.stories.tsx new file mode 100644 index 00000000..6e9c410d --- /dev/null +++ b/src/react/BossBarOverlay.stories.tsx @@ -0,0 +1,33 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import { ChatMessage } from 'prismarine-chat' +import { BossBar } from 'mineflayer' +import BossBarOverlay from './BossBarOverlay' + +const meta: Meta = { + component: BossBarOverlay +} + +export default meta +type Story = StoryObj; + + +export const Primary: Story = { + args: { + bar: { + entityUUID: 'uuid', + title: { text: 'Boss', translate: 'test' } as ChatMessage & { text: string, translate: string }, + health: 100, + dividers: 2, + color: 'red', + shouldDarkenSky: false, + isDragonBar: false, + createFog: false, + shouldCreateFog: false, + _title: { text: 'Boss', translate: 'entity.minecraft.ender_dragon' }, + _color: 'red', + _dividers: 2, + _health: 100 + } + } +} diff --git a/src/react/BossBarOverlay.tsx b/src/react/BossBarOverlay.tsx new file mode 100644 index 00000000..b0083f0c --- /dev/null +++ b/src/react/BossBarOverlay.tsx @@ -0,0 +1,62 @@ +import type { BossBar as BossBarTypeRaw } from 'mineflayer' +import { useState, useEffect } from 'react' +import MessageFormattedString from './MessageFormattedString' +import './BossBarOverlay.css' + +const colors = ['pink', 'blue', 'red', 'green', 'yellow', 'purple', 'white'] +const divs = [0, 6, 10, 12, 20] +const translations = { + 'entity.minecraft.ender_dragon': 'Ender Dragon', + 'entity.minecraft.wither': 'Wither' +} + +export type BossBarType = BossBarTypeRaw & { + // todo why not use public properties? + title: { text: string, translate: string }, + _title: { text: string, translate: string }, + _color: string, + _dividers: number, + _health: number +} + +export default ({ bar }: {bar: BossBarType}) => { + const [title, setTitle] = useState('') + const [bossBarStyles, setBossBarStyles] = useState<{[key: string]: string | number}>({}) + const [fillStyles, setFillStyles] = useState<{[key: string]: string | number}>({}) + const [div1Styles, setDiv1Styles] = useState<{[key: string]: string | number}>({}) + const [div2Styles, setDiv2Styles] = useState<{[key: string]: string | number}>({}) + + useEffect(() => { + setTitle(bar._title.text ? bar.title.text : translations[bar.title.translate] || 'Unknown Entity') + setBossBarStyles(prevStyles => ({ + ...prevStyles, + backgroundPositionY: `-${colors.indexOf(bar._color) * 10}px` + })) + setFillStyles(prevStyles => ({ + ...prevStyles, + width: `${bar._health * 100}%`, + backgroundPositionY: `-${colors.indexOf(bar._color) * 10 + 5}px` + })) + setDiv1Styles(prevStyles => ({ + ...prevStyles, + backgroundPositionY: `-${divs.indexOf(bar._dividers) * 10 + 70}px` + })) + setDiv2Styles(prevStyles => ({ + ...prevStyles, + width: `${bar._health * 100}%`, + backgroundPositionY: `-${divs.indexOf(bar._dividers) * 10 + 75}px` + })) + }, [bar]) + + return ( +
+
+
+
+
+
+
+
+ ) +} + diff --git a/src/react/BossBarOverlayProvider.tsx b/src/react/BossBarOverlayProvider.tsx new file mode 100644 index 00000000..9bb7d948 --- /dev/null +++ b/src/react/BossBarOverlayProvider.tsx @@ -0,0 +1,32 @@ +import { useState, useEffect } from 'react' +import { BotEvents } from 'mineflayer' +import BossBar, { BossBarType } from './BossBarOverlay' +import './BossBarOverlay.css' + + +export default () => { + const [bossBars, setBossBars] = useState(new Map()) + + useEffect(() => { + // typescript error: no bossBarCreated in BotEvents. Why?? + bot.on('bossBarCreated' as keyof BotEvents, (bossBar) => { + setBossBars(prevBossBars => new Map(prevBossBars.set(bossBar.entityUUID, bossBar))) + }) + bot.on('bossBarUpdated', (bossBar) => { + setBossBars(prevBossBars => new Map(prevBossBars.set(bossBar.entityUUID, bossBar as BossBarType))) + }) + bot.on('bossBarDeleted', (bossBar) => { + const newBossBars = new Map(bossBars) + newBossBars.delete(bossBar.entityUUID) + setBossBars(newBossBars) + }) + }, []) + + return ( +
+ {[...bossBars.values()].map(bar => ( + + ))} +
+ ) +} diff --git a/src/react/BreathBar.css b/src/react/BreathBar.css new file mode 100644 index 00000000..a7e38c7c --- /dev/null +++ b/src/react/BreathBar.css @@ -0,0 +1,31 @@ +.breathbar { + position: fixed; + display: flex; + z-index: -1; + flex-direction: row-reverse; + left: calc(50% + 91px); + transform: translate(-100%); + bottom: 40px; + --offset: calc(-1 * 16px); + --bg-x: calc(-1 * 16px); + --bg-y: calc(-1 * 18px); + pointer-events: none; +} + +.breath { + width: 9px; + height: 9px; + margin-left: -1px; + background-position: 20px 20px; + background-image: var(--gui-icons); +} + +.breath.full { + background-size: 256px; + background-position: var(--offset) var(--bg-y); +} + +.breath.half { + background-size: 256px; + background-position: calc(var(--offset) - 9px) var(--bg-y); +} diff --git a/src/react/BreathBar.stories.tsx b/src/react/BreathBar.stories.tsx new file mode 100644 index 00000000..ea3ba026 --- /dev/null +++ b/src/react/BreathBar.stories.tsx @@ -0,0 +1,16 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import BreathBar from './BreathBar' + +const meta: Meta = { + component: BreathBar +} + +export default meta +type Story = StoryObj; + +export const Primary: Story = { + args: { + oxygen: 20 + } +} diff --git a/src/react/BreathBar.tsx b/src/react/BreathBar.tsx new file mode 100644 index 00000000..f36fbb93 --- /dev/null +++ b/src/react/BreathBar.tsx @@ -0,0 +1,55 @@ +import { useRef, useEffect } from 'react' +import SharedHudVars from './SharedHudVars' +import './BreathBar.css' + +export type BreathBarProps = { + oxygen: number, +} + +export default ( + { + oxygen, + }: BreathBarProps) => { + const breathRef = useRef(null) + + useEffect(() => { + const breathbar = breathRef.current + if (breathbar && oxygen < 20) { + breathbar.style.display = 'flex' + breathbar.classList.toggle('low', oxygen <= 5) + + const breaths = breathbar.children + + for (const breath of breaths) { + breath.classList.remove('full') + breath.classList.remove('half') + } + + for (let i = 0; i < Math.ceil(oxygen / 2); i++) { + if (i >= breaths.length) break + + if (oxygen % 2 !== 0 && Math.ceil(oxygen / 2) === i + 1) { + breaths[i].classList.add('half') + } else { + breaths[i].classList.add('full') + } + } + } else if (breathbar && oxygen >= 20) { + breathbar.style.display = 'none' + } + }, [oxygen]) + + return +
+ { + Array.from({ length: 10 }, () => 0) + .map( + (num, index) =>
+ ) + } +
+
+} diff --git a/src/react/Crosshair.css b/src/react/Crosshair.css new file mode 100644 index 00000000..94312669 --- /dev/null +++ b/src/react/Crosshair.css @@ -0,0 +1,11 @@ +.crosshair { + z-index: -1; + width: 16px; + height: 16px; + background: var(--gui-icons); + background-size: calc(256px * var(--crosshair-scale)); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } diff --git a/src/react/Crosshair.tsx b/src/react/Crosshair.tsx new file mode 100644 index 00000000..877b8df4 --- /dev/null +++ b/src/react/Crosshair.tsx @@ -0,0 +1,8 @@ +import './Crosshair.css' +import SharedHudVars from './SharedHudVars' + +export default () => { + return +
+ +} diff --git a/src/react/DebugOverlay.module.css b/src/react/DebugOverlay.module.css new file mode 100644 index 00000000..9ea30ebf --- /dev/null +++ b/src/react/DebugOverlay.module.css @@ -0,0 +1,44 @@ + +.debug-left-side, +.debug-right-side { + padding-left: calc(env(safe-area-inset-left) / 2); + padding-right: calc(env(safe-area-inset-right) / 2); + position: absolute; + display: flex; + flex-direction: column; + z-index: -1; + pointer-events: none; +} + +.debug-left-side { + top: 1px; + left: 1px; +} + +.debug-right-side { + top: 5px; + right: 1px; + /* limit renderer long text width */ + width: 50%; +} + +.debug-left-side p, .debug-right-side p { + display: block; + color: white; + font-size: 10px; + width: fit-content; + line-height: 9px; + margin: 0; + padding: 0; + padding-bottom: 1px; + background: rgba(110, 110, 110, 0.5); +} + +.debug-right-side p { + margin-left: auto; +} + +.empty { + display: block; + height: 9px; +} diff --git a/src/react/DebugOverlay.tsx b/src/react/DebugOverlay.tsx new file mode 100644 index 00000000..4b3c19b1 --- /dev/null +++ b/src/react/DebugOverlay.tsx @@ -0,0 +1,223 @@ +import { useEffect, useRef, useMemo, useState } from 'react' +import { getFixedFilesize } from '../downloadAndOpenFile' +import { options } from '../optionsStorage' +import worldInteractions from '../worldInteractions' +import styles from './DebugOverlay.module.css' + +export default () => { + const received = useRef({ ...defaultPacketsCount }) + const sent = useRef({ ...defaultPacketsCount }) + const customEntries = useRef({} as any) + const receivedTotal = useRef(0) + const packetsCountByNamePerSec = useRef({ + received: {} as { [key: string]: number }, + sent: {} as { [key: string]: number } + }) + const packetsCountByName = useRef({ + received: {} as { [key: string]: number }, + sent: {} as { [key: string]: number } + }) + const ignoredPackets = useRef(new Set([] as any[])) + const [packetsString, setPacketsString] = useState('') + const [showDebug, setShowDebug] = useState(false) + const [pos, setPos] = useState<{ x: number, y: number, z: number }>({ x: 0, y: 0, z: 0 }) + const [skyL, setSkyL] = useState(0) + const [blockL, setBlockL] = useState(0) + const [biomeId, setBiomeId] = useState(0) + const [day, setDay] = useState(0) + const [entitiesCount, setEntitiesCount] = useState(0) + const [dimension, setDimension] = useState('') + const [cursorBlock, setCursorBlock] = useState(null) + const [rendererDevice, setRendererDevice] = useState('') + const minecraftYaw = useRef(0) + const minecraftQuad = useRef(0) + + const quadsDescription = [ + 'north (towards negative Z)', + 'east (towards positive X)', + 'south (towards positive Z)', + 'west (towards negative X)' + ] + + const viewDegToMinecraft = (yaw) => yaw % 360 - 180 * (yaw < 0 ? -1 : 1) + + const handleF3 = (e) => { + if (e.code === 'F3') { + setShowDebug(prev => !prev) + e.preventDefault() + } + } + + const readPacket = (data, { name }, _buf, fullBuffer) => { + if (fullBuffer) { + const size = fullBuffer.byteLength + receivedTotal.current += size + received.current.size += size + } + received.current.count++ + managePackets('received', name, data) + } + + const managePackets = (type, name, data) => { + packetsCountByName.current[type][name] ??= 0 + packetsCountByName.current[type][name]++ + if (options.debugLogNotFrequentPackets && !ignoredPackets.current.has(name) && !hardcodedListOfDebugPacketsToIgnore[type].includes(name)) { + packetsCountByNamePerSec.current[type][name] ??= 0 + packetsCountByNamePerSec.current[type][name]++ + if (packetsCountByNamePerSec.current[type][name] > 5 || packetsCountByName.current[type][name] > 100) { // todo think of tracking the count within 10s + console.info(`[packet ${name} was ${type} too frequent] Ignoring...`) + ignoredPackets.current.add(name) + } else { + console.info(`[packet ${type}] ${name}`, /* ${JSON.stringify(data, null, 2)}` */ data) + } + } + } + + useMemo(() => { + document.addEventListener('keydown', handleF3) + const packetsUpdateInterval = setInterval(() => { + setPacketsString(prev => `↓ ${received.current.count} (${(received.current.size / 1024).toFixed(2)} KB/s, ${getFixedFilesize(receivedTotal.current)}) ↑ ${sent.current.count}`) + received.current = { ...defaultPacketsCount } + sent.current = { ...defaultPacketsCount } + packetsCountByNamePerSec.current.received = {} + packetsCountByNamePerSec.current.sent = {} + }, 1000) + + // @ts-expect-error + bot._client.on('packet', readPacket) + // @ts-expect-error + bot._client.on('packet_name' as any, (name, data) => readPacket(data, { name })) // custom client + bot._client.on('writePacket' as any, (name, data) => { + sent.current.count++ + managePackets('sent', name, data) + }) + bot.on('move', () => { + setPos(prev => { return { ...bot.entity.position }}) + setSkyL(prev => bot.world.getSkyLight(bot.entity.position)) + setBlockL(prev => bot.world.getBlockLight(bot.entity.position)) + setBiomeId(prev => bot.world.getBiome(bot.entity.position)) + setDimension(bot.game.dimension) + }) + bot.on('time', () => { + setDay(bot.time.day) + }) + bot.on('entitySpawn', () => { + setEntitiesCount(Object.values(bot.entities).length) + }) + bot.on('entityGone', () => { + setEntitiesCount(Object.values(bot.entities).length) + }) + bot.on('physicsTick', () => { + setCursorBlock(worldInteractions.cursorBlock) + }) + + try { + const gl = window.renderer.getContext() + setRendererDevice(gl.getParameter(gl.getExtension('WEBGL_debug_renderer_info')!.UNMASKED_RENDERER_WEBGL)) + } catch (err) { + console.warn(err) + } + + return () => { + document.removeEventListener('keydown', handleF3) + clearInterval(packetsUpdateInterval) + } + }, []) + + useEffect(() => { + minecraftYaw.current = viewDegToMinecraft(bot.entity.yaw * -180 / Math.PI) + minecraftQuad.current = Math.floor(((minecraftYaw.current + 180) / 90 + 0.5) % 4) + }, [bot.entity.yaw]) + + if (!showDebug) return null + + return <> +
+

Prismarine Web Client ({bot.version})

+

E: {entitiesCount}

+

{dimension}

+
+

XYZ: {pos.x.toFixed(3)} / {pos.y.toFixed(3)} / {pos.z.toFixed(3)}

+

Chunk: {Math.floor(pos.x % 16)} ~ {Math.floor(pos.z % 16)} in {Math.floor(pos.x / 16)} ~ {Math.floor(pos.z / 16)}

+

Packets: {packetsString}

+

Facing (viewer): {bot.entity.yaw.toFixed(3)} {bot.entity.pitch.toFixed(3)}

+

Facing (minecraft): {quadsDescription[minecraftQuad.current]} ({minecraftYaw.current.toFixed(1)} {(bot.entity.pitch * -180 / Math.PI).toFixed(1)})

+

Light: {blockL} ({skyL} sky)

+ +

Biome: minecraft:{loadedData.biomesArray[biomeId]?.name ?? 'unknown biome'}

+

Day: {day}

+
+ {Object.entries(customEntries.current).map(([name, value]) =>

{name}: {value}

)} +
+ +
+

Renderer: {rendererDevice} powered by three.js r{THREE.REVISION}

+
+ {cursorBlock ? (<> +

{cursorBlock.name}

+ { + Object.entries(cursorBlock.getProperties()).map( + ([name, value], idx, arr) => { + return

+ {name}: { + typeof value === 'boolean' ? ( + {value} + ) : value + } +

+ } + ) + } + ) + : '' } + {cursorBlock ? ( +

Looking at: {cursorBlock.position.x} {cursorBlock.position.y} {cursorBlock.position.z}

+ ) : ''} +
+ +} + +const hardcodedListOfDebugPacketsToIgnore = { + received: [ + 'entity_velocity', + 'sound_effect', + 'rel_entity_move', + 'entity_head_rotation', + 'entity_metadata', + 'entity_move_look', + 'teams', + 'entity_teleport', + 'entity_look', + 'ping', + 'entity_update_attributes', + 'player_info', + 'update_time', + 'animation', + 'entity_equipment', + 'entity_destroy', + 'named_entity_spawn', + 'update_light', + 'set_slot', + 'block_break_animation', + 'map_chunk', + 'spawn_entity', + 'world_particles', + 'keep_alive', + 'chat', + 'playerlist_header', + 'scoreboard_objective', + 'scoreboard_score' + ], + sent: [ + 'pong', + 'position', + 'look', + 'keep_alive', + 'position_look' + ] +} + +const defaultPacketsCount = { + count: 0, + size: 0 +} diff --git a/src/react/FoodBar.css b/src/react/FoodBar.css new file mode 100644 index 00000000..bd31e818 --- /dev/null +++ b/src/react/FoodBar.css @@ -0,0 +1,68 @@ +.foodbar { + position: fixed; + display: flex; + z-index: -1; + flex-direction: row-reverse; + left: calc(50% + 91px); + transform: translate(-100%); + bottom: calc(var(--safe-area-inset-bottom) + 30px); + --kind: 0; + --lightened: 0; + --offset: calc(-1 * (52px + (9px * (4 * var(--kind) + var(--lightened) * 2)))); + --bg-x: calc(-1 * (16px + 9px * var(--lightened))); + --bg-y: calc(-1 * 27px); + pointer-events: none; +} + +.foodbar.poisoned { + --kind: 1; +} + +.foodbar.withered { + --kind: 2; +} + +.food { + width: 9px; + height: 9px; + background-size: 256px, 256px; + background-position: var(--bg-x) var(--bg-y), var(--bg-x) var(--bg-y); + background-image: var(--gui-icons); + margin-left: -1px; +} + +.food.full { + background-position: var(--offset) var(--bg-y), var(--bg-x) var(--bg-y); +} + +.food.half { + background-position: calc(var(--offset) - 9px) var(--bg-y), var(--bg-x) var(--bg-y); +} + +.foodbar.low .food { + animation: lowHungerAnim 0.2s steps(2, end) infinite; +} + +.foodbar.low .food:nth-of-type(2n) { + animation-direction: reverse; +} + +.foodbar.low .food:nth-of-type(3n) { + animation-duration: 0.1s; +} + +.foodbar.updated { + animation: updatedAnim 0.3s steps(2, end) 2; +} + +.creative { + display: none; +} + +@keyframes lowHungerAnim { + to { transform: translateY(1px); } +} + +@keyframes updatedAnim { + to { --lightened: 1; } +} diff --git a/src/react/FoodBar.tsx b/src/react/FoodBar.tsx new file mode 100644 index 00000000..c7680b68 --- /dev/null +++ b/src/react/FoodBar.tsx @@ -0,0 +1,76 @@ +import { useRef, useState, useEffect } from 'react' +import SharedHudVars from './SharedHudVars' +import './FoodBar.css' + + +export type FoodBarProps = { + gameMode: string, + food: number, + effectToAdd: number | null, + effectToRemove: number | null, + effectAdded: (htmlElement: HTMLDivElement | null, effect: number | null) => void, + effectEnded: (htmlElement: HTMLDivElement | null, effect: number | null) => void, +} + +export default ( + { + gameMode, + food, + effectToAdd, + effectToRemove, + effectAdded, + effectEnded + }: FoodBarProps) => { + const foodRef = useRef(null) + + useEffect(() => { + if (foodRef.current) { + foodRef.current.classList.toggle('creative', gameMode === 'creative') + } + }, [gameMode]) + + useEffect(() => { + const foodbar = foodRef.current + if (foodbar) { + foodbar.classList.toggle('low', food <= 5) + + const foods = foodbar.children + + for (const food of foods) { + food.classList.remove('full') + food.classList.remove('half') + } + + for (let i = 0; i < Math.ceil(food / 2); i++) { + if (i >= foods.length) break + + if (food % 2 !== 0 && Math.ceil(food / 2) === i + 1) { + foods[i].classList.add('half') + } else { + foods[i].classList.add('full') + } + } + } + }, [food]) + + useEffect(() => { + effectAdded(foodRef.current, effectToAdd) + }, [effectToAdd]) + + useEffect(() => { + effectEnded(foodRef.current, effectToRemove) + }, [effectToRemove]) + + return +
+ { + Array.from({ length: 10 }, () => 0) + .map( + (num, index) =>
+ ) + } +
+
+} diff --git a/src/react/HealthBar.css b/src/react/HealthBar.css new file mode 100644 index 00000000..bbf0f205 --- /dev/null +++ b/src/react/HealthBar.css @@ -0,0 +1,78 @@ +.health { + position: fixed; + display: flex; + z-index: -1; + flex-direction: row; + left: calc(50% - 91px); + bottom: calc(var(--safe-area-inset-bottom) + 30px); + --hardcore: 0; + --kind: 0; + --lightened: 0; + --offset: calc(-1 * (52px + (9px * (4 * var(--kind) + var(--lightened) * 2)) )); + --bg-x: calc(-1 * (16px + 9px * var(--lightened))); + --bg-y: calc(-1 * var(--hardcore) * 45px); + pointer-events: none; +} + +.health.creative { + display: none; +} + +.health.hardcore { + --hardcore: 1; +} + +.health.poisoned { + --kind: 1; +} + +.health.withered { + --kind: 2; +} + +.health.absorption { + --kind: 3; +} + +.heart { + width: 9px; + height: calc(9px - var(--hardcore) * 0.2px); + background-image: var(--gui-icons); + background-size: 256px, 256px; + background-position: var(--bg-x) var(--bg-y), var(--bg-x) var(--bg-y); + margin-left: -1px; +} + +.heart.full { + background-position: var(--offset) var(--bg-y), var(--bg-x) var(--bg-y); +} + +.heart.half { + background-position: calc(var(--offset) - 9px) var(--bg-y), var(--bg-x) var(--bg-y); +} + +.health.low .heart { + animation: lowHealthAnim 0.2s steps(2, end) infinite; +} + +.health.low .heart:nth-of-type(2n) { + animation-direction: reverse; +} + +.health.low .heart:nth-of-type(3n) { + animation-duration: 0.1s; +} + +.health.damaged { + animation: damagedAnim 0.3s steps(2, end) 2; +} + +@keyframes lowHealthAnim { + to { + transform: translateY(1px); + } +} + +@keyframes damagedAnim { + to { --lightened: 1; } +} diff --git a/src/react/HealthBar.stories.tsx b/src/react/HealthBar.stories.tsx new file mode 100644 index 00000000..bcec2e0a --- /dev/null +++ b/src/react/HealthBar.stories.tsx @@ -0,0 +1,45 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import HealthBar from './HealthBar' + +const meta: Meta = { + component: HealthBar +} + +export default meta +type Story = StoryObj; + +const getEffectClass = (effect) => { + switch (effect.id) { + case 19: + return 'poisoned' + case 20: + return 'withered' + case 22: + return 'absorption' + default: + return '' + } +} + +export const Primary: Story = { + args: { + gameMode: 'survival', + isHardcore: true, + damaged: false, + healthValue: 10, + effectToAdd: 19, + effectToRemove: 20, + effectAdded (htmlElement, effect) { + const effectClass = getEffectClass(effect) + if (!effectClass) return + if (htmlElement) htmlElement.classList.add(effectClass) + }, + effectEnded (htmlElement, effect) { + const effectClass = getEffectClass(effect) + if (!effectClass) return + if (htmlElement) htmlElement.classList.remove(effectClass) + } + + } +} diff --git a/src/react/HealthBar.tsx b/src/react/HealthBar.tsx new file mode 100644 index 00000000..46ed8a34 --- /dev/null +++ b/src/react/HealthBar.tsx @@ -0,0 +1,112 @@ +import { useRef, useState, useEffect } from 'react' +import SharedHudVars from './SharedHudVars' +import './HealthBar.css' + + +export type HealthBarProps = { + gameMode: string, + isHardcore: boolean, + damaged: boolean, + healthValue: number, + effectToAdd: number | null, + effectToRemove: number | null, + effectAdded: (htmlElement: HTMLDivElement | null, effect: number | null) => void, + effectEnded: (htmlElement: HTMLDivElement | null, effect: number | null) => void, +} + +export default ( + { + gameMode, + isHardcore, + damaged, + healthValue, + effectToAdd, + effectToRemove, + effectAdded, + effectEnded + }: HealthBarProps) => { + const healthRef = useRef(null) + const [className, setClassName] = useState('') + + useEffect(() => { + if (healthRef.current) { + healthRef.current.classList.toggle('creative', gameMode === 'creative' || gameMode === 'spectator') + // if (gameMode === 'creative' || gameMode === 'spectator') { + // healthRef.current.classList.add('creative') + // } else { + // healthRef.current.classList.remove('creative') + // } + } + }, [gameMode]) + + useEffect(() => { + if (healthRef.current) { + if (isHardcore) { + healthRef.current.classList.add('hardcore') + } else { + healthRef.current.classList.remove('hardcore') + } + } + }, [isHardcore]) + + useEffect(() => { + if (healthRef.current) { + if (damaged) { + healthRef.current.classList.add('damaged') + console.log('damage') + } else { + healthRef.current.classList.remove('damaged') + } + } + }, [damaged]) + + useEffect(() => { + if (healthRef.current) { + if (healthValue <= 4) { + healthRef.current.classList.add('low') + } else { + healthRef.current.classList.remove('low') + } + + const healthElement = healthRef.current + const hearts = healthElement.children + + for (const heart of hearts) { + heart.classList.remove('full') + heart.classList.remove('half') + } + + for (let i = 0; i < Math.ceil(healthValue / 2); i++) { + if (i >= hearts.length) break + + if (healthValue % 2 !== 0 && Math.ceil(healthValue / 2) === i + 1) { + hearts[i].classList.add('half') + } else { + hearts[i].classList.add('full') + } + } + } + }, [healthValue]) + + useEffect(() => { + effectAdded(healthRef.current, effectToAdd) + }, [effectToAdd]) + + useEffect(() => { + effectEnded(healthRef.current, effectToRemove) + }, [effectToRemove]) + + return +
+ { + Array.from({ length: 10 }, () => 0) + .map( + (num, index) =>
+ ) + } +
+
} + + diff --git a/src/react/HotbarRenderApp.tsx b/src/react/HotbarRenderApp.tsx new file mode 100644 index 00000000..2e7ee1d1 --- /dev/null +++ b/src/react/HotbarRenderApp.tsx @@ -0,0 +1,219 @@ +import { useEffect, useRef, useState } from 'react' +import { Transition } from 'react-transition-group' +import { createPortal } from 'react-dom' +import { subscribe, useSnapshot } from 'valtio' +import { getItemNameRaw, openItemsCanvas, openPlayerInventory, upInventoryItems } from '../inventoryWindows' +import { activeModalStack, isGameActive, miscUiState } from '../globalState' +import { currentScaling } from '../scaleInterface' +import { watchUnloadForCleanup } from '../gameUnload' +import MessageFormattedString from './MessageFormattedString' +import SharedHudVars from './SharedHudVars' + + +const ItemName = ({ itemKey }: { itemKey: string }) => { + const nodeRef = useRef(null) + const [show, setShow] = useState(false) + const [itemName, setItemName] = useState | string>('') + + const duration = 300 + + const defaultStyle: React.CSSProperties = { + position: 'fixed', + bottom: `calc(var(--safe-area-inset-bottom) + ${bot ? bot.game.gameMode === 'creative' ? '35px' : '50px' : '50px'})`, + left: 0, + right: 0, + fontSize: 10, + textAlign: 'center', + transition: `opacity ${duration}ms ease-in-out`, + opacity: 0, + pointerEvents: 'none', + } + + const transitionStyles = { + entering: { opacity: 1 }, + entered: { opacity: 1 }, + exiting: { opacity: 0 }, + exited: { opacity: 0 }, + } + + useEffect(() => { + const itemData = itemKey.split('_split_') + if (!itemKey) { + setItemName('') + } else if (itemData[3]) { + const customDisplay = getItemNameRaw({ + nbt: JSON.parse(itemData[3]) + }) + if (customDisplay) { + setItemName(customDisplay) + } else { + setItemName(itemData[0]) + } + } else { + setItemName(itemData[0]) + } + setShow(true) + const id = setTimeout(() => { + setShow(false) + }, 1500) + return () => { + setShow(false) + clearTimeout(id) + } + }, [itemKey]) + + return + {state => ( + +
+ +
+
+ )} +
+} + +export default () => { + const container = useRef(null!) + const [itemKey, setItemKey] = useState('') + const hasModals = useSnapshot(activeModalStack).length + + useEffect(() => { + const controller = new AbortController() + + const inv = openItemsCanvas('HotbarWin', { + clickWindow (slot, mouseButton, mode) { + if (mouseButton === 1) { + console.log('right click') + return + } + const hotbarSlot = slot - bot.inventory.hotbarStart + if (hotbarSlot < 0 || hotbarSlot > 9) return + bot.setQuickBarSlot(hotbarSlot) + }, + } as any) + const { canvasManager } = inv + inv.inventory.supportsOffhand = bot.supportFeature('doesntHaveOffHandSlot') + inv.pwindow.disablePicking = true + + canvasManager.children[0].disableHighlight = true + canvasManager.minimizedWindow = true + canvasManager.minimizedWindow = true + + function setSize () { + canvasManager.setScale(currentScaling.scale) + + canvasManager.windowHeight = 25 * canvasManager.scale + canvasManager.windowWidth = (210 - (inv.inventory.supportsOffhand ? 0 : 25) + (miscUiState.currentTouch ? 28 : 0)) * canvasManager.scale + } + setSize() + watchUnloadForCleanup(subscribe(currentScaling, setSize)) + container.current.appendChild(inv.canvas) + const upHotbarItems = () => { + if (!viewer.world.downloadedTextureImage && !viewer.world.customTexturesDataUrl) return + upInventoryItems(true, inv) + } + + canvasManager.canvas.onpointerdown = (e) => { + if (!isGameActive(true)) return + const pos = inv.canvasManager.getMousePos(inv.canvas, e) + if (pos.x > canvasManager.canvas.width - 30) { + openPlayerInventory() + } + } + + upHotbarItems() + bot.inventory.on('updateSlot', upHotbarItems) + viewer.world.renderUpdateEmitter.on('textureDownloaded', upHotbarItems) + viewer.world.renderUpdateEmitter.on('blockStatesDownloaded', upHotbarItems) + + const setSelectedSlot = (index: number) => { + if (index === bot.quickBarSlot) return + bot.setQuickBarSlot(index) + if (!bot.inventory.slots?.[bot.quickBarSlot + 36]) setItemKey('') + } + const heldItemChanged = () => { + inv.inventory.activeHotbarSlot = bot.quickBarSlot + + if (!bot.inventory.slots?.[bot.quickBarSlot + 36]) return + const item = bot.inventory.slots[bot.quickBarSlot + 36]! + const itemNbt = item.nbt ? JSON.stringify(item.nbt) : '' + setItemKey(`${item.displayName}_split_${item.type}_split_${item.metadata}_split_${itemNbt}`) + } + heldItemChanged() + bot.on('heldItemChanged' as any, heldItemChanged) + + document.addEventListener('wheel', (e) => { + if (!isGameActive(true)) return + e.preventDefault() + const newSlot = ((bot.quickBarSlot + Math.sign(e.deltaY)) % 9 + 9) % 9 + setSelectedSlot(newSlot) + }, { + passive: false, + signal: controller.signal + }) + + document.addEventListener('keydown', (e) => { + if (!isGameActive(true)) return + const numPressed = +((/Digit(\d)/.exec(e.code))?.[1] ?? -1) + if (numPressed < 1 || numPressed > 9) return + setSelectedSlot(numPressed - 1) + }, { + passive: false, + signal: controller.signal + }) + + let touchStart = 0 + document.addEventListener('touchstart', (e) => { + if ((e.target as HTMLElement).closest('.hotbar')) { + touchStart = Date.now() + } else { + touchStart = 0 + } + }) + document.addEventListener('touchend', (e) => { + if (touchStart && (e.target as HTMLElement).closest('.hotbar') && Date.now() - touchStart > 700) { + // drop item + bot._client.write('block_dig', { + 'status': 4, + 'location': { + 'x': 0, + 'z': 0, + 'y': 0 + }, + 'face': 0, + sequence: 0 + }) + } + touchStart = 0 + }) + + return () => { + inv.destroy() + controller.abort() + viewer.world.renderUpdateEmitter.off('textureDownloaded', upHotbarItems) + viewer.world.renderUpdateEmitter.off('blockStatesDownloaded', upHotbarItems) + } + }, []) + + return + + + +
+ + + +} + +const Portal = ({ children, to = document.body }) => { + return createPortal(children, to) +} diff --git a/src/react/HudBarsProvider.tsx b/src/react/HudBarsProvider.tsx new file mode 100644 index 00000000..0b0cec24 --- /dev/null +++ b/src/react/HudBarsProvider.tsx @@ -0,0 +1,136 @@ +import { useRef, useState, useMemo } from 'react' +import { GameMode } from 'mineflayer' +import { armor } from './armorValues' +import HealthBar from './HealthBar' +import FoodBar from './FoodBar' +import ArmorBar from './ArmorBar' +import BreathBar from './BreathBar' +import './HealthBar.css' + +export default () => { + const [damaged, setDamaged] = useState(false) + const [healthValue, setHealthValue] = useState(bot.health) + const [food, setFood] = useState(bot.food) + const [oxygen, setOxygen] = useState(bot.oxygenLevel) + const [armorValue, setArmorValue] = useState(0) + const [gameMode, setGameMode] = useState(bot.game.gameMode) + const [isHardcore, setIsHardcore] = useState(false) + const [effectToAdd, setEffectToAdd] = useState(null) + const [effectToRemove, setEffectToRemove] = useState(null) + const hurtTimeout = useRef | null>(null) + + const getEffectClass = (effect) => { + switch (effect) { + case 19: + return 'poisoned' + case 20: + return 'withered' + case 22: + return 'absorption' + default: + return '' + } + } + + const effectAdded = (htmlElement, effect) => { + const effectClass = getEffectClass(effect) + if (effectClass) { + htmlElement.classList.add(effectClass) + } + setEffectToAdd(null) + } + + const effectEnded = (htmlElement, effect) => { + const effectClass = getEffectClass(effect) + if (effectClass) { + htmlElement.classList.remove(effectClass) + } + setEffectToRemove(null) + } + + const onDamage = () => { + setDamaged(prev => true) + if (hurtTimeout.current) clearTimeout(hurtTimeout.current) + hurtTimeout.current = setTimeout(() => { + setDamaged(prev => false) + }, 1000) + } + + const updateHealth = (hValue) => { + setHealthValue(prev => hValue) + } + + useMemo(() => { + bot.on('entityHurt', (entity) => { + if (entity !== bot.entity) return + onDamage() + }) + + bot.on('game', () => { + setGameMode(prev => bot.game.gameMode) + setIsHardcore(prev => bot.game.hardcore) + }) + + bot.on('entityEffect', (entity, effect) => { + if (entity !== bot.entity) return + setEffectToAdd(prev => effect.id) + }) + + bot.on('entityEffectEnd', (entity, effect) => { + if (entity !== bot.entity) return + setEffectToRemove(prev => effect.id) + }) + + bot.on('health', () => { + if (bot.health < healthValue) onDamage() + updateHealth(bot.health) + setFood(prev => bot.food) + }) + + bot.on('breath', () => { + setOxygen(prev => bot.oxygenLevel) + }) + + const upArmour = () => { + const armorSlots = new Set([5, 6, 7, 8]) + let points = 0 + for (const slotIndex of armorSlots) { + const item = bot.inventory.slots[slotIndex] ?? null + if (!item) continue + const armorName = item.name.split('_') + points += armor[armorName[0]][armorName[1]] + } + setArmorValue(points) + } + bot.inventory.on('updateSlot', upArmour) + upArmour() + }, []) + + return
+ + + + +
+} diff --git a/src/react/IndicatorEffects.css b/src/react/IndicatorEffects.css index 2902bfee..7ddad807 100644 --- a/src/react/IndicatorEffects.css +++ b/src/react/IndicatorEffects.css @@ -2,7 +2,7 @@ position: fixed; top: 6%; left: 0px; - z-index: -1; + z-index: -2; pointer-events: none; } diff --git a/src/react/KeybindingsScreen.tsx b/src/react/KeybindingsScreen.tsx new file mode 100644 index 00000000..19038a71 --- /dev/null +++ b/src/react/KeybindingsScreen.tsx @@ -0,0 +1,12 @@ +import Screen from './Screen' + +export default ({ + onBack, + onReset, + onSet, + keybindings +}) => { + return +

Here you can change the keybindings for the game.

+
+} diff --git a/src/react/KeybindingsScreenApp.tsx b/src/react/KeybindingsScreenApp.tsx new file mode 100644 index 00000000..e0630eab --- /dev/null +++ b/src/react/KeybindingsScreenApp.tsx @@ -0,0 +1,51 @@ +import { useState } from 'react' +import { contro } from '../controls' +import Button from './Button' +import Screen from './Screen' + +export default () => { + const { commands } = contro.inputSchema + const [awaitingInputType, setAwaitingInputType] = useState(null as null | 'keyboard' | 'gamepad') + + // const + + return + {awaitingInputType && } +

Here you can change the keybindings for the game.

+
+ {Object.entries(commands).map(([group, actions]) => { + return
+

{group}

+ {Object.entries(actions).map(([action, { keys, gamepadButtons }]) => { + return
+ + +
+ })} +
+ })} +
+
+} + +const AwaitingInputOverlay = ({ isGamepad }) => { + return
+ {isGamepad ? 'Press the button on the gamepad' : 'Press the key'}. + Press ESC to cancel. +
+} diff --git a/src/react/MessageFormatted.css b/src/react/MessageFormatted.css new file mode 100644 index 00000000..7e5be00a --- /dev/null +++ b/src/react/MessageFormatted.css @@ -0,0 +1,5 @@ +/* base global styles */ + +.formatted-message { + text-shadow: 1px 1px 0px #3f3f3f;; +} diff --git a/src/react/MessageFormatted.tsx b/src/react/MessageFormatted.tsx index cc1a089c..95ab064c 100644 --- a/src/react/MessageFormatted.tsx +++ b/src/react/MessageFormatted.tsx @@ -2,9 +2,10 @@ import { ComponentProps } from 'react' import { render } from '@xmcl/text-component' import { noCase } from 'change-case' import mojangson from 'mojangson' +import { openURL } from 'prismarine-viewer/viewer/lib/simpleUtils' import { MessageFormatPart } from '../botUtils' -import { openURL } from '../menus/components/common' import { chatInputValueGlobal } from './ChatContainer' +import './MessageFormatted.css' const hoverItemToText = (hoverEvent: MessageFormatPart['hoverEvent']) => { try { @@ -27,7 +28,7 @@ const hoverItemToText = (hoverEvent: MessageFormatPart['hoverEvent']) => { } } catch (err) { // todo report critical error - console.error('Failed to parse message hover', err) + reportError?.('Failed to parse message hover' + err.message) return undefined } } @@ -84,7 +85,7 @@ export const MessagePart = ({ part, ...props }: { part: MessageFormatPart } & Co export default ({ parts }: { parts: readonly MessageFormatPart[] }) => { return ( - + {parts.map((part, i) => )} ) diff --git a/src/react/MobileTopButtons.module.css b/src/react/MobileTopButtons.module.css new file mode 100644 index 00000000..1b142d3f --- /dev/null +++ b/src/react/MobileTopButtons.module.css @@ -0,0 +1,37 @@ +.mobile-top-btns { + display: none; + flex-direction: row; + position: fixed; + top: 0; + left: 50%; + transform: translate(-50%); + gap: 0 5px; + z-index: -1; +} + +.pause-btn, +.chat-btn { + --scale: 1.3; + border: none; + outline: 0.5px solid white; + width: calc(14px * var(--scale)); + height: calc(14px * var(--scale)); + background-image: url('extra-textures/gui.png'); + background-size: calc(256px * var(--scale)); + background-position-x: calc(var(--scale) * -202px); + background-position-y: calc(var(--scale) * -66px); +} + +.chat-btn { + background-position-y: calc(var(--scale) * -84px); +} +.debug-btn { + background: #9c8c86; + font-size: 8px; + /* todo make other buttons centered */ + /* margin-right: 5px; */ + color: white; + font-family: minecraft, mojangles, monospace; + padding: 4px 6px; + outline: 0.5px solid white; +} diff --git a/src/react/MobileTopButtons.tsx b/src/react/MobileTopButtons.tsx new file mode 100644 index 00000000..c4acb028 --- /dev/null +++ b/src/react/MobileTopButtons.tsx @@ -0,0 +1,57 @@ +import { useEffect, useRef } from 'react' +import { f3Keybinds } from '../controls' +import { watchValue } from '../optionsStorage' +import { showModal, miscUiState, activeModalStack, hideCurrentModal } from '../globalState' +import { showOptionsModal } from './SelectOption' +import useLongPress from './useLongPress' +import styles from './MobileTopButtons.module.css' + + +export default () => { + const elRef = useRef(null) + + const showMobileControls = (bl) => { + if (elRef.current) elRef.current.style.display = bl ? 'flex' : 'none' + } + + useEffect(() => { + watchValue(miscUiState, o => { + showMobileControls(o.currentTouch) + }) + }, []) + + const onLongPress = async () => { + const select = await showOptionsModal('', f3Keybinds.filter(f3Keybind => f3Keybind.mobileTitle).map(f3Keybind => f3Keybind.mobileTitle)) + if (!select) return + const f3Keybind = f3Keybinds.find(f3Keybind => f3Keybind.mobileTitle === select) + if (f3Keybind) f3Keybind.action() + } + + const defaultOptions = { + shouldPreventDefault: true, + delay: 500, + } + const longPressEvent = useLongPress(onLongPress, () => {}, defaultOptions) + + // ios note: just don't use +
+ + +
+ + {singleplayer ? ( +
+ + {(navigator.share as typeof navigator.share | undefined) ? ( +
+ ) : null} + +
+ +} diff --git a/src/react/PlayerListOverlay.css b/src/react/PlayerListOverlay.css new file mode 100644 index 00000000..b36801c0 --- /dev/null +++ b/src/react/PlayerListOverlay.css @@ -0,0 +1,80 @@ + +.playerlist-container { + position: absolute; + background-color: rgba(0, 0, 0, 0.3); + top: 9px; + left: 50%; + transform: translate(-50%); + width: fit-content; + padding: 1px; + display: flex; + flex-direction: column; + gap: 1px 0; + place-items: center; + z-index: 30; +} + +.playerlist-header, .playerlist-footer { + font-size: 0.5rem +} + +.playerlist-title { + color: white; + text-shadow: 1px 1px 0px #3f3f3f; + font-size: 10px; + margin: 0; + padding: 0; +} + +.playerlist-entry { + overflow: hidden; + color: white; + font-size: 10px; + margin: 0px; + line-height: calc(100% - 1px); + text-shadow: 1px 1px 0px #3f3f3f; + font-family: mojangles, minecraft, monospace; + background: rgba(255, 255, 255, 0.1); + width: 100%; +} + +.active-player { + color: rgb(42, 204, 237); + text-shadow: 1px 1px 0px rgb(4, 44, 67); +} + +.playerlist-ping { + text-align: right; + float: right; + padding-left: 10px; +} + +.playerlist-ping-value { + color: rgb(114, 255, 114); + text-shadow: 1px 1px 0px rgb(28, 105, 28); + float: left; + margin: 0; + margin-right: 1px; +} + +.playerlist-ping-label { + text-shadow: 1px 1px 0px #3f3f3f; + color: white; + float: right; + margin: 0px; +} + +.player-lists { + display: flex; + flex-direction: row; + place-items: center; + place-content: center; + gap: 0 4px; +} + +.player-list { + display: flex; + flex-direction: column; + gap: 1px 0; + min-width: 80px; +} diff --git a/src/react/PlayerListOverlay.stories.tsx b/src/react/PlayerListOverlay.stories.tsx new file mode 100644 index 00000000..cb2d972f --- /dev/null +++ b/src/react/PlayerListOverlay.stories.tsx @@ -0,0 +1,20 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import PlayerListOverlay from './PlayerListOverlay' + +const meta: Meta = { + component: PlayerListOverlay +} + +export default meta +type Story = StoryObj; + +export const Primary: Story = { + args: { + playersLists: [], + clientId: '', + tablistHeader: 'Header', + tablistFooter: 'Footer', + serverIP: '95.163.228.101', + } +} diff --git a/src/react/PlayerListOverlay.tsx b/src/react/PlayerListOverlay.tsx new file mode 100644 index 00000000..ee43ae2c --- /dev/null +++ b/src/react/PlayerListOverlay.tsx @@ -0,0 +1,41 @@ +import MessageFormattedString from './MessageFormattedString' +import './PlayerListOverlay.css' + + +type PlayersLists = Array> + +type PlayerListOverlayProps = { + playersLists: PlayersLists, + clientId: string, + tablistHeader: string | Record | null, + tablistFooter: string | Record | null, + serverIP: string +} + +export default ({ playersLists, clientId, tablistHeader, tablistFooter, serverIP }: PlayerListOverlayProps) => { + + return
+ Server IP: {serverIP} +
+ +
+
+ {playersLists.map((list, index) => ( +
+ {list.map(player => ( +
+ +
+

{player.ping}

+

ms

+
+
+ ))} +
+ ))} +
+
+ +
+
+} diff --git a/src/react/PlayerListOverlayProvider.tsx b/src/react/PlayerListOverlayProvider.tsx new file mode 100644 index 00000000..42e8c735 --- /dev/null +++ b/src/react/PlayerListOverlayProvider.tsx @@ -0,0 +1,91 @@ +import { useSnapshot } from 'valtio' +import { useState, useEffect, useMemo } from 'react' +import { isGameActive, miscUiState } from '../globalState' +import MessageFormattedString from './MessageFormattedString' +import PlayerListOverlay from './PlayerListOverlay' +import './PlayerListOverlay.css' + + +const MAX_ROWS_PER_COL = 10 + +type Players = typeof bot.players + +export default () => { + const { serverIp } = useSnapshot(miscUiState) + const [clientId, setClientId] = useState('') + const [players, setPlayers] = useState({}) + const [isOpen, setIsOpen] = useState(false) + + const handleKeyDown = (e) => { + if (!isGameActive(true)) return + if (e.key === 'Tab') { + setIsOpen(prev => true) + e.preventDefault() + } + } + + const handleKeyUp = (e) => { + if (e.key === 'Tab') { + setIsOpen(prev => false) + e.preventDefault() + } + } + + useMemo(() => { + function requestUpdate () { + // Placeholder for requestUpdate logic + setPlayers(bot.players) + } + + bot.on('playerUpdated', () => requestUpdate()) + bot.on('playerJoined', () => requestUpdate()) + bot.on('playerLeft', () => requestUpdate()) + }, []) + + useEffect(() => { + setPlayers(bot.players) + if (bot.player) { + setClientId(bot.player.uuid) + } else { + bot._client.on('player_info', () => { + setClientId(bot.player?.uuid) + }) + } + + document.addEventListener('keydown', handleKeyDown) + document.addEventListener('keyup', handleKeyUp) + + return () => { + document.removeEventListener('keydown', handleKeyDown) + document.removeEventListener('keyup', handleKeyUp) + } + }, [serverIp]) + + + const playersArray = Object.values(players).sort((a, b) => { + if (a.username > b.username) return 1 + if (a.username < b.username) return -1 + return 0 + }) + const lists = [] as Array + + let tempList = [] as typeof playersArray + for (let i = 0; i < playersArray.length; i++) { + tempList.push(playersArray[i]) + + if ((i + 1) % MAX_ROWS_PER_COL === 0 || i + 1 === playersArray.length) { + lists.push([...tempList]) + tempList = [] + } + } + + if (!isOpen) return null + + return +} diff --git a/src/react/SharedHudVars.tsx b/src/react/SharedHudVars.tsx new file mode 100644 index 00000000..acdcc237 --- /dev/null +++ b/src/react/SharedHudVars.tsx @@ -0,0 +1,27 @@ +import { CSSProperties, useEffect } from 'react' +import icons from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/icons.png' + +export default ({ children }) => { + useEffect(() => { + if (document.getElementById('hud-vars-style')) return + // 1. Don't inline long data URLs for better DX in elements tab + // 2. Easier application to globally override icons with custom image (eg from resourcepacks) + const css = /* css */` + :root { + --gui-icons: url(${icons}), url(${icons}); + } + ` + const style = document.createElement('style') + style.id = 'hud-vars-style' + style.textContent = css + document.head.appendChild(style) + }, []) + + const customVars = { + '--safe-area-inset-bottom': 'calc(env(safe-area-inset-bottom) / 2)' + } as CSSProperties + + return
{children}
+} diff --git a/src/react/Singleplayer.tsx b/src/react/Singleplayer.tsx index c00ffc8c..a4d8c559 100644 --- a/src/react/Singleplayer.tsx +++ b/src/react/Singleplayer.tsx @@ -51,8 +51,8 @@ const World = ({ name, isFocused, title, lastPlayed, size, detail = '', onFocus, world preview
{title}
-
{timeRelativeFormatted} {detail.slice(-30)}
-
{sizeFormatted}
+
{timeRelativeFormatted} {detail.slice(-30)}
+
{sizeFormatted}
} diff --git a/src/react/XPBar.module.css b/src/react/XPBar.module.css new file mode 100644 index 00000000..e9598f99 --- /dev/null +++ b/src/react/XPBar.module.css @@ -0,0 +1,33 @@ +.xp-bar-bg { + z-index: -1; + position: fixed; + left: 50%; + bottom: calc(var(--safe-area-inset-bottom) + 25px); + transform: translate(-50%); + width: 182px; + height: 5px; + background-image: url('minecraft-assets/minecraft-assets/data/1.16.4/gui/icons.png'); + background-size: 256px; + background-position-y: -64px; +} + +.xp-bar { + width: 182px; + height: 5px; + background-image: url('minecraft-assets/minecraft-assets/data/1.17.1/gui/icons.png'); + background-size: 256px; + background-position-y: -69px; +} + + +.xp-label { + position: fixed; + top: -8px; + left: 50%; + transform: translate(-50%); + font-size: 10px; + font-family: minecraft, mojangles, monospace; + color: rgb(30, 250, 30); + text-shadow: 0px -1px #000, 0px 1px #000, 1px 0px #000, -1px 0px #000; + z-index: 10; +} diff --git a/src/react/XPBar.stories.tsx b/src/react/XPBar.stories.tsx new file mode 100644 index 00000000..a7890b1a --- /dev/null +++ b/src/react/XPBar.stories.tsx @@ -0,0 +1,28 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import XPBar from './XPBar' + +const meta: Meta = { + component: XPBar +} + +export default meta +type Story = StoryObj; + +export const Primary: Story = { + args: { + progress: 1, + level: 5 + }, + // add slider for progress + argTypes: { + progress: { + control: { + type: 'range', + min: 0, + max: 1, + step: 0.1 + } + } + } +} diff --git a/src/react/XPBar.tsx b/src/react/XPBar.tsx new file mode 100644 index 00000000..1b3a7a85 --- /dev/null +++ b/src/react/XPBar.tsx @@ -0,0 +1,16 @@ +import SharedHudVars from './SharedHudVars' +import styles from './XPBar.module.css' + +export default ({ progress, level, gamemode }: { progress: number; level: number, gamemode: string }) => ( + +
+
+ 0 ? 'block' : 'none' }}>{level} +
+
+) + diff --git a/src/react/XPBarProvider.tsx b/src/react/XPBarProvider.tsx new file mode 100644 index 00000000..4ee1a392 --- /dev/null +++ b/src/react/XPBarProvider.tsx @@ -0,0 +1,26 @@ +import { useState, useMemo } from 'react' +import { GameMode } from 'mineflayer' +import XPBar from './XPBar' + + +export default () => { + const [progress, setProgress] = useState(0) + const [level, setLevel] = useState(0) + const [gamemode, setGamemode] = useState(bot.game.gameMode) + + useMemo(() => { + const onXpUpdate = () => { + setProgress(bot.experience.progress) + setLevel(bot.experience.level) + } + onXpUpdate() + + bot.on('experience', onXpUpdate) + + bot.on('game', () => { + setGamemode(prev => bot.game.gameMode) + }) + }, []) + + return +} diff --git a/src/react/armorValues.ts b/src/react/armorValues.ts new file mode 100644 index 00000000..cf17edbc --- /dev/null +++ b/src/react/armorValues.ts @@ -0,0 +1,52 @@ +interface Armor { + 'helmet': number; + 'chestplate': number | null; + 'leggings': number | null; + 'boots': number | null; +} + +export const armor: { [material: string]: Armor } = { + 'turtle': { + 'helmet': 2, + 'chestplate': null, + 'leggings': null, + 'boots': null + }, + 'leather': { + 'helmet': 1, + 'chestplate': 3, + 'leggings': 2, + 'boots': 1 + }, + 'golden': { + 'helmet': 2, + 'chestplate': 5, + 'leggings': 3, + 'boots': 1 + }, + 'chainmail': { + 'helmet': 2, + 'chestplate': 5, + 'leggings': 4, + 'boots': 1 + }, + 'iron': { + 'helmet': 2, + 'chestplate': 6, + 'leggings': 5, + 'boots': 2 + }, + 'diamond': { + 'helmet': 3, + 'chestplate': 8, + 'leggings': 6, + 'boots': 3 + }, + 'netherite': { + 'helmet': 3, + 'chestplate': 8, + 'leggings': 6, + 'boots': 3 + } +} + diff --git a/src/react/simpleUtils.ts b/src/react/simpleUtils.ts new file mode 100644 index 00000000..d9519d20 --- /dev/null +++ b/src/react/simpleUtils.ts @@ -0,0 +1,5 @@ +import prettyBytes from 'pretty-bytes' + +export const getFixedFilesize = (bytes: number) => { + return prettyBytes(bytes, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) +} diff --git a/src/react/singleplayer.module.css b/src/react/singleplayer.module.css index 3258ba29..1e092b39 100644 --- a/src/react/singleplayer.module.css +++ b/src/react/singleplayer.module.css @@ -34,6 +34,10 @@ flex-direction: column; font-size: 11px; } +.world_info_description_line { + color: #999; + white-space: nowrap; +} .world_image { height: 100%; aspect-ratio: 1; diff --git a/src/react/useLongPress.ts b/src/react/useLongPress.ts new file mode 100644 index 00000000..3807221d --- /dev/null +++ b/src/react/useLongPress.ts @@ -0,0 +1,64 @@ +import { useCallback, useRef, useState } from 'react' + +interface LongPressOptions { + shouldPreventDefault?: boolean; + delay?: number; +} + +const useLongPress = ( + onLongPress: () => void, + onClick: () => void, + { shouldPreventDefault = true, delay = 300 }: LongPressOptions = {} +) => { + const [longPressTriggered, setLongPressTriggered] = useState(false) + const timeout = useRef() + const target = useRef(null) + + const start = useCallback( + (event: React.MouseEvent | React.TouchEvent) => { + if (shouldPreventDefault && event.target) { + event.target.addEventListener('touchend', preventDefault, { + passive: false + }) + target.current = event.target + } + timeout.current = window.setTimeout(() => { + onLongPress() + setLongPressTriggered(true) + }, delay) + }, + [onLongPress, delay, shouldPreventDefault] + ) + + const clear = useCallback( + (event: React.MouseEvent | React.TouchEvent, shouldTriggerClick = true) => { + if (timeout.current) clearTimeout(timeout.current) + if (shouldTriggerClick && !longPressTriggered) onClick() + setLongPressTriggered(false) + if (shouldPreventDefault && target.current) { + target.current.removeEventListener('touchend', preventDefault) + } + }, + [shouldPreventDefault, onClick, longPressTriggered] + ) + + return { + onMouseDown: (e: React.MouseEvent) => start(e), + onTouchStart: (e: React.TouchEvent) => start(e), + onMouseUp: (e: React.MouseEvent) => clear(e), + onMouseLeave: (e: React.MouseEvent) => clear(e, false), + onTouchEnd: (e: React.TouchEvent) => clear(e) + } +} + +const preventDefault = (event: Event) => { + if (!('touches' in event)) return + + const touchEvent = event as TouchEvent + if (touchEvent.touches.length < 2 && event.preventDefault) { + event.preventDefault() + } +} + +export default useLongPress + diff --git a/src/reactUi.tsx b/src/reactUi.tsx index d56cb805..4c5f1516 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -3,6 +3,7 @@ import { renderToDom, ErrorBoundary } from '@zardoy/react-util' import { useSnapshot } from 'valtio' import { QRCodeSVG } from 'qrcode.react' import { createPortal } from 'react-dom' +import { useEffect, useMemo, useState } from 'react' import { miscUiState } from './globalState' import DeathScreenProvider from './react/DeathScreenProvider' import OptionsRenderApp from './react/OptionsRenderApp' @@ -17,6 +18,12 @@ import TitleProvider from './react/TitleProvider' import ScoreboardProvider from './react/ScoreboardProvider' import SignEditorProvider from './react/SignEditorProvider' import IndicatorEffectsProvider from './react/IndicatorEffectsProvider' +import PlayerListOverlayProvider from './react/PlayerListOverlayProvider' +import HudBarsProvider from './react/HudBarsProvider' +import XPBarProvider from './react/XPBarProvider' +import DebugOverlay from './react/DebugOverlay' +import MobileTopButtons from './react/MobileTopButtons' +import PauseScreen from './react/PauseScreen' import SoundMuffler from './react/SoundMuffler' import TouchControls from './react/TouchControls' import widgets from './react/widgets' @@ -24,6 +31,8 @@ import { useIsWidgetActive } from './react/utils' import GlobalSearchInput from './GlobalSearchInput' import TouchAreasControlsProvider from './react/TouchAreasControlsProvider' import NotificationProvider, { showNotification } from './react/NotificationProvider' +import HotbarRenderApp from './react/HotbarRenderApp' +import Crosshair from './react/Crosshair' const RobustPortal = ({ children, to }) => { return createPortal({children}, to) @@ -54,6 +63,25 @@ const DisplayQr = () => {
} +// mounted earlier than ingame ui TODO +const GameHud = ({ children }) => { + const { loadedDataVersion } = useSnapshot(miscUiState) + const [gameLoaded, setGameLoaded] = useState(false) + + useEffect(() => { + customEvents.on('mineflayerBotCreated', () => { + bot.once('inject_allowed', () => { + setGameLoaded(true) + }) + }) + }, []) + useEffect(() => { + if (!loadedDataVersion) setGameLoaded(false) + }, [loadedDataVersion]) + + return gameLoaded ? children : null +} + const InGameUi = () => { const { gameLoaded } = useSnapshot(miscUiState) if (!gameLoaded) return @@ -62,12 +90,21 @@ const InGameUi = () => { {/* apply scaling */} + + + + + + + + + @@ -105,6 +142,8 @@ const App = () => { + {/* + */}
} @@ -121,3 +160,17 @@ renderToDom(, { strictMode: false, selector: '#react-root', }) + +disableReactProfiling() +function disableReactProfiling () { + //@ts-expect-error + window.performance.markOrig = window.performance.mark + //@ts-expect-error + window.performance.mark = (name, options) => { + // ignore react internal marks + if (!name.startsWith('⚛') && !localStorage.enableReactProfiling) { + //@ts-expect-error + window.performance.markOrig(name, options) + } + } +} diff --git a/src/scaleInterface.ts b/src/scaleInterface.ts new file mode 100644 index 00000000..9eac457d --- /dev/null +++ b/src/scaleInterface.ts @@ -0,0 +1,31 @@ +import { proxy } from 'valtio' +import { subscribeKey } from 'valtio/utils' +import { options } from './optionsStorage' + +export const currentScaling = proxy({ + scale: 1, +}) + +const setScale = () => { + const scaleValues = [ + { width: 971, height: 670, scale: 2 }, + { width: null, height: 430, scale: 1.5 }, + { width: 590, height: null, scale: 1 } + ] + + const { innerWidth, innerHeight } = window + + let result = options.guiScale + for (const { width, height, scale } of scaleValues) { + if ((width && innerWidth <= width) || (height && innerHeight <= height)) { + result = scale + } + } + + currentScaling.scale = result + document.documentElement.style.setProperty('--guiScale', String(result)) +} + +setScale() +subscribeKey(options, 'guiScale', setScale) +window.addEventListener('resize', setScale) diff --git a/src/texturePack.ts b/src/texturePack.ts index 8c251b49..566e10da 100644 --- a/src/texturePack.ts +++ b/src/texturePack.ts @@ -6,7 +6,7 @@ import { subscribeKey } from 'valtio/utils' import { proxy, ref } from 'valtio' import { getVersion } from 'prismarine-viewer/viewer/lib/version' import blocksFileNames from '../generated/blocks.json' -import type { BlockStates } from './playerWindows' +import type { BlockStates } from './inventoryWindows' import { copyFilesAsync, copyFilesAsyncWithProgress, mkdirRecursive, removeFileRecursiveAsync } from './browserfs' import { setLoadingScreenStatus } from './utils' import { showNotification } from './react/NotificationProvider' diff --git a/src/watchOptions.ts b/src/watchOptions.ts index 4380c6f3..1493e7d1 100644 --- a/src/watchOptions.ts +++ b/src/watchOptions.ts @@ -14,7 +14,7 @@ watchValue(options, o => { document.documentElement.style.setProperty('--chatScale', `${o.chatScale / 100}`) document.documentElement.style.setProperty('--chatWidth', `${o.chatWidth}px`) document.documentElement.style.setProperty('--chatHeight', `${o.chatHeight}px`) - document.documentElement.style.setProperty('--guiScale', `${o.guiScale}`) + // gui scale is set in scaleInterface.ts }) /** happens once */ From 7a28dfc4888d4d546d6dbfdc7944494de1da8c4a Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 20 Apr 2024 22:10:10 +0300 Subject: [PATCH 0144/1195] fix water fog --- src/water.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/water.ts b/src/water.ts index 8bdb2698..9f8ec557 100644 --- a/src/water.ts +++ b/src/water.ts @@ -9,8 +9,8 @@ customEvents.on('gameLoaded', () => { watchUnloadForCleanup(cleanup) const updateInWater = () => { - const waterBr = bot.entity.effects.find(effect => loadedData.effects[effect.id].name === 'water_breathing') - if (inWater && waterBr) { + const waterBr = Object.keys(bot.entity.effects).find((effect: any) => loadedData.effects[effect.id].name === 'water_breathing') + if (inWater) { viewer.scene.fog = new THREE.Fog(0x00_00_ff, 0.1, waterBr ? 100 : 20) // Set the fog color to blue if the bot is in water. } else { cleanup() From 241e5d3d1aa528b0a45b8b961b0c16b8d6fb2714 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Wed, 24 Apr 2024 17:10:44 +0300 Subject: [PATCH 0145/1195] do not override pnpm ver --- .github/workflows/preview.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 2f866235..9da50d0a 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -28,7 +28,7 @@ jobs: node-version: 18 cache: "pnpm" - name: Install Global Dependencies - run: npm install --global vercel pnpm + run: npm install --global vercel - name: Pull Vercel Environment Information run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }} - name: Build Project Artifacts From 619aa5b06376e4fcf6335205cd350dd977ae367b Mon Sep 17 00:00:00 2001 From: Vitaly Date: Wed, 24 Apr 2024 17:16:16 +0300 Subject: [PATCH 0146/1195] optimize light update in single chunks --- prismarine-viewer/viewer/lib/viewer.ts | 8 ++++---- prismarine-viewer/viewer/lib/worldDataEmitter.ts | 6 +++--- prismarine-viewer/viewer/lib/worldrendererCommon.ts | 12 +++++++----- src/watchOptions.ts | 3 ++- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/prismarine-viewer/viewer/lib/viewer.ts b/prismarine-viewer/viewer/lib/viewer.ts index 1b11ac63..9cb7eb3d 100644 --- a/prismarine-viewer/viewer/lib/viewer.ts +++ b/prismarine-viewer/viewer/lib/viewer.ts @@ -77,8 +77,8 @@ export class Viewer { // this.primitives.clear() } - addColumn (x, z, chunk) { - this.world.addColumn(x, z, chunk) + addColumn (x, z, chunk, isLightUpdate = false) { + this.world.addColumn(x, z, chunk, isLightUpdate) } removeColumn (x: string, z: string) { @@ -148,9 +148,9 @@ export class Viewer { // this.updatePrimitive(p) }) - emitter.on('loadChunk', ({ x, z, chunk, worldConfig }) => { + emitter.on('loadChunk', ({ x, z, chunk, worldConfig, isLightUpdate }) => { this.world.worldConfig = worldConfig - this.addColumn(x, z, chunk) + this.addColumn(x, z, chunk, isLightUpdate) }) // todo remove and use other architecture instead so data flow is clear emitter.on('blockEntities', (blockEntities) => { diff --git a/prismarine-viewer/viewer/lib/worldDataEmitter.ts b/prismarine-viewer/viewer/lib/worldDataEmitter.ts index fa916c51..6743e337 100644 --- a/prismarine-viewer/viewer/lib/worldDataEmitter.ts +++ b/prismarine-viewer/viewer/lib/worldDataEmitter.ts @@ -75,7 +75,7 @@ export class WorldDataEmitter extends EventEmitter { bot._client.on('update_light', ({ chunkX, chunkZ }) => { const chunkPos = new Vec3(chunkX * 16, 0, chunkZ * 16) - this.loadChunk(chunkPos) + this.loadChunk(chunkPos, true) }) this.emitter.on('listening', () => { @@ -128,7 +128,7 @@ export class WorldDataEmitter extends EventEmitter { } } - async loadChunk (pos: ChunkPos) { + async loadChunk (pos: ChunkPos, isLightUpdate = false) { const [botX, botZ] = chunkPos(this.lastPos) const dx = Math.abs(botX - Math.floor(pos.x / 16)) const dz = Math.abs(botZ - Math.floor(pos.z / 16)) @@ -143,7 +143,7 @@ export class WorldDataEmitter extends EventEmitter { worldHeight: column['worldHeight'] ?? 256, } //@ts-ignore - this.emitter.emit('loadChunk', { x: pos.x, z: pos.z, chunk, blockEntities: column.blockEntities, worldConfig }) + this.emitter.emit('loadChunk', { x: pos.x, z: pos.z, chunk, blockEntities: column.blockEntities, worldConfig, isLightUpdate }) this.loadedChunks[`${pos.x},${pos.z}`] = true } } else { diff --git a/prismarine-viewer/viewer/lib/worldrendererCommon.ts b/prismarine-viewer/viewer/lib/worldrendererCommon.ts index ae2a91d3..43983977 100644 --- a/prismarine-viewer/viewer/lib/worldrendererCommon.ts +++ b/prismarine-viewer/viewer/lib/worldrendererCommon.ts @@ -211,7 +211,7 @@ export abstract class WorldRendererCommon } - addColumn (x, z, chunk) { + addColumn (x: number, z: number, chunk: any, isLightUpdate: boolean) { if (this.workers.length === 0) throw new Error('workers not initialized yet') this.initialChunksLoad = false this.loadedChunks[`${x},${z}`] = true @@ -222,10 +222,12 @@ export abstract class WorldRendererCommon for (let y = this.worldConfig.minY; y < this.worldConfig.worldHeight; y += 16) { const loc = new Vec3(x, y, z) this.setSectionDirty(loc) - this.setSectionDirty(loc.offset(-16, 0, 0)) - this.setSectionDirty(loc.offset(16, 0, 0)) - this.setSectionDirty(loc.offset(0, 0, -16)) - this.setSectionDirty(loc.offset(0, 0, 16)) + if (!isLightUpdate || this.mesherConfig.smoothLighting) { + this.setSectionDirty(loc.offset(-16, 0, 0)) + this.setSectionDirty(loc.offset(16, 0, 0)) + this.setSectionDirty(loc.offset(0, 0, -16)) + this.setSectionDirty(loc.offset(0, 0, 16)) + } } } diff --git a/src/watchOptions.ts b/src/watchOptions.ts index 1493e7d1..009463be 100644 --- a/src/watchOptions.ts +++ b/src/watchOptions.ts @@ -44,7 +44,8 @@ export const watchOptionsAfterViewerInit = () => { viewer.entities.setVisible(o.renderEntities) }) - viewer.world.mesherConfig.smoothLighting = options.smoothLighting + // viewer.world.mesherConfig.smoothLighting = options.smoothLighting + viewer.world.mesherConfig.smoothLighting = false // todo not supported for now subscribeKey(options, 'smoothLighting', () => { viewer.world.mesherConfig.smoothLighting = options.smoothLighting; (viewer.world as WorldRendererThree).rerenderAllChunks() From d7f5e98fe35164fc9351f3bb814b1a260ffd784e Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 26 Apr 2024 09:44:04 +0300 Subject: [PATCH 0147/1195] update typescript to 5.5 --- package.json | 2 +- pnpm-lock.yaml | 138 +++++++++--------- .../viewer/lib/worldDataEmitter.ts | 4 +- src/inventoryWindows.ts | 4 +- src/react/MessageFormatted.tsx | 2 +- src/react/SoundMuffler.tsx | 6 +- 6 files changed, 78 insertions(+), 78 deletions(-) diff --git a/package.json b/package.json index e9981866..dee909a8 100644 --- a/package.json +++ b/package.json @@ -133,7 +133,7 @@ "stream-browserify": "^3.0.0", "three": "0.154.0", "timers-browserify": "^2.0.12", - "typescript": "^5.2.2", + "typescript": "5.5.0-beta", "use-typed-event-listener": "^4.0.2", "vitest": "^0.34.6", "yaml": "^2.3.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5eb5111a..fc504d17 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -207,16 +207,16 @@ importers: version: 7.4.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/react': specifier: ^7.4.6 - version: 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.2.2) + version: 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.5.0-beta) '@storybook/react-vite': specifier: ^7.4.6 - version: 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@2.79.1)(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) + version: 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@2.79.1)(typescript@5.5.0-beta)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) '@storybook/web-components': specifier: ^7.4.6 version: 7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/web-components-vite': specifier: ^7.4.6 - version: 7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) + version: 7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.5.0-beta)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) '@types/lodash-es': specifier: ^4.17.9 version: 4.17.9 @@ -249,7 +249,7 @@ importers: version: 1.0.0 contro-max: specifier: ^0.1.2 - version: 0.1.2(typescript@5.2.2) + version: 0.1.2(typescript@5.5.0-beta) crypto-browserify: specifier: ^3.12.0 version: 3.12.0 @@ -264,7 +264,7 @@ importers: version: 8.50.0 eslint-config-zardoy: specifier: ^0.2.17 - version: 0.2.17(eslint-plugin-react-hooks@4.6.0(eslint@8.50.0))(eslint-plugin-react@7.34.1(eslint@8.50.0))(eslint@8.50.0)(typescript@5.2.2) + version: 0.2.17(eslint-plugin-react-hooks@4.6.0(eslint@8.50.0))(eslint-plugin-react@7.34.1(eslint@8.50.0))(eslint@8.50.0)(typescript@5.5.0-beta) events: specifier: ^3.3.0 version: 3.3.0 @@ -323,11 +323,11 @@ importers: specifier: ^2.0.12 version: 2.0.12 typescript: - specifier: ^5.2.2 - version: 5.2.2 + specifier: 5.5.0-beta + version: 5.5.0-beta use-typed-event-listener: specifier: ^4.0.2 - version: 4.0.2(react@18.2.0)(typescript@5.2.2) + version: 4.0.2(react@18.2.0)(typescript@5.5.0-beta) vitest: specifier: ^0.34.6 version: 0.34.6(terser@5.19.2) @@ -7996,8 +7996,8 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + typescript@5.5.0-beta: + resolution: {integrity: sha512-FRg3e/aQg3olEG3ff8YjHOERsO4IM0m4qGrsE4UMvILaq4TdDZ6gQX4+2Rq9SjTpfSe/ebwiHcsjm/7FfWWQ6Q==} engines: {node: '>=14.17'} hasBin: true @@ -10214,15 +10214,15 @@ snapshots: core-js: 3.32.1 regenerator-runtime: 0.13.11 - '@joshwooding/vite-plugin-react-docgen-typescript@0.2.1(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.2.1(typescript@5.5.0-beta)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2))': dependencies: glob: 7.2.3 glob-promise: 4.2.2(glob@7.2.3) magic-string: 0.27.0 - react-docgen-typescript: 2.2.2(typescript@5.2.2) + react-docgen-typescript: 2.2.2(typescript@5.5.0-beta) vite: 4.5.3(@types/node@20.8.0)(terser@5.19.2) optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.0-beta '@jridgewell/gen-mapping@0.3.3': dependencies: @@ -10957,7 +10957,7 @@ snapshots: - encoding - supports-color - '@storybook/builder-vite@7.4.6(encoding@0.1.13)(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2))': + '@storybook/builder-vite@7.4.6(encoding@0.1.13)(typescript@5.5.0-beta)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2))': dependencies: '@storybook/channels': 7.4.6 '@storybook/client-logger': 7.4.6 @@ -10980,7 +10980,7 @@ snapshots: rollup: 3.29.4 vite: 4.5.3(@types/node@20.8.0)(terser@5.19.2) optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.0-beta transitivePeerDependencies: - encoding - supports-color @@ -11264,12 +11264,12 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@storybook/react-vite@7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@2.79.1)(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2))': + '@storybook/react-vite@7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@2.79.1)(typescript@5.5.0-beta)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.2.1(typescript@5.5.0-beta)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) '@rollup/pluginutils': 5.0.5(rollup@2.79.1) - '@storybook/builder-vite': 7.4.6(encoding@0.1.13)(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) - '@storybook/react': 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.2.2) + '@storybook/builder-vite': 7.4.6(encoding@0.1.13)(typescript@5.5.0-beta)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) + '@storybook/react': 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.5.0-beta) '@vitejs/plugin-react': 3.1.0(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) ast-types: 0.14.2 magic-string: 0.30.4 @@ -11285,7 +11285,7 @@ snapshots: - typescript - vite-plugin-glimmerx - '@storybook/react@7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.2.2)': + '@storybook/react@7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.5.0-beta)': dependencies: '@storybook/client-logger': 7.4.6 '@storybook/core-client': 7.4.6 @@ -11311,7 +11311,7 @@ snapshots: type-fest: 2.19.0 util-deprecate: 1.0.2 optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.0-beta transitivePeerDependencies: - encoding - supports-color @@ -11354,9 +11354,9 @@ snapshots: '@types/express': 4.17.18 file-system-cache: 2.3.0 - '@storybook/web-components-vite@7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2))': + '@storybook/web-components-vite@7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.5.0-beta)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2))': dependencies: - '@storybook/builder-vite': 7.4.6(encoding@0.1.13)(typescript@5.2.2)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) + '@storybook/builder-vite': 7.4.6(encoding@0.1.13)(typescript@5.5.0-beta)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) '@storybook/core-server': 7.4.6(encoding@0.1.13) '@storybook/node-logger': 7.4.6 '@storybook/web-components': 7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -11674,13 +11674,13 @@ snapshots: '@types/node': 20.11.19 optional: true - '@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2)': + '@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.5.0-beta))(eslint@8.50.0)(typescript@5.5.0-beta)': dependencies: '@eslint-community/regexpp': 4.8.0 - '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.5.0-beta) '@typescript-eslint/scope-manager': 6.1.0 - '@typescript-eslint/type-utils': 6.1.0(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.1.0(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/type-utils': 6.1.0(eslint@8.50.0)(typescript@5.5.0-beta) + '@typescript-eslint/utils': 6.1.0(eslint@8.50.0)(typescript@5.5.0-beta) '@typescript-eslint/visitor-keys': 6.1.0 debug: 4.3.4(supports-color@8.1.1) eslint: 8.50.0 @@ -11689,22 +11689,22 @@ snapshots: natural-compare: 1.4.0 natural-compare-lite: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) + ts-api-utils: 1.0.3(typescript@5.5.0-beta) optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.0-beta transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2)': + '@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.5.0-beta)': dependencies: '@typescript-eslint/scope-manager': 6.7.3 '@typescript-eslint/types': 6.7.3 - '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.5.0-beta) '@typescript-eslint/visitor-keys': 6.7.3 debug: 4.3.4(supports-color@8.1.1) eslint: 8.50.0 optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.0-beta transitivePeerDependencies: - supports-color @@ -11718,15 +11718,15 @@ snapshots: '@typescript-eslint/types': 6.7.3 '@typescript-eslint/visitor-keys': 6.7.3 - '@typescript-eslint/type-utils@6.1.0(eslint@8.50.0)(typescript@5.2.2)': + '@typescript-eslint/type-utils@6.1.0(eslint@8.50.0)(typescript@5.5.0-beta)': dependencies: - '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.1.0(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.5.0-beta) + '@typescript-eslint/utils': 6.1.0(eslint@8.50.0)(typescript@5.5.0-beta) debug: 4.3.4(supports-color@8.1.1) eslint: 8.50.0 - ts-api-utils: 1.0.3(typescript@5.2.2) + ts-api-utils: 1.0.3(typescript@5.5.0-beta) optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.0-beta transitivePeerDependencies: - supports-color @@ -11734,7 +11734,7 @@ snapshots: '@typescript-eslint/types@6.7.3': {} - '@typescript-eslint/typescript-estree@6.1.0(typescript@5.2.2)': + '@typescript-eslint/typescript-estree@6.1.0(typescript@5.5.0-beta)': dependencies: '@typescript-eslint/types': 6.1.0 '@typescript-eslint/visitor-keys': 6.1.0 @@ -11742,13 +11742,13 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.0 - ts-api-utils: 1.0.3(typescript@5.2.2) + ts-api-utils: 1.0.3(typescript@5.5.0-beta) optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.0-beta transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@6.7.3(typescript@5.2.2)': + '@typescript-eslint/typescript-estree@6.7.3(typescript@5.5.0-beta)': dependencies: '@typescript-eslint/types': 6.7.3 '@typescript-eslint/visitor-keys': 6.7.3 @@ -11756,20 +11756,20 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.0 - ts-api-utils: 1.0.3(typescript@5.2.2) + ts-api-utils: 1.0.3(typescript@5.5.0-beta) optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.0-beta transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.1.0(eslint@8.50.0)(typescript@5.2.2)': + '@typescript-eslint/utils@6.1.0(eslint@8.50.0)(typescript@5.5.0-beta)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.3 '@typescript-eslint/scope-manager': 6.1.0 '@typescript-eslint/types': 6.1.0 - '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.5.0-beta) eslint: 8.50.0 semver: 7.6.0 transitivePeerDependencies: @@ -12802,13 +12802,13 @@ snapshots: content-type@1.0.5: {} - contro-max@0.1.2(typescript@5.2.2): + contro-max@0.1.2(typescript@5.5.0-beta): dependencies: emittery: 0.10.2 lodash-es: 4.17.21 optionalDependencies: react: 18.2.0 - use-typed-event-listener: 4.0.2(react@18.2.0)(typescript@5.2.2) + use-typed-event-listener: 4.0.2(react@18.2.0)(typescript@5.5.0-beta) transitivePeerDependencies: - typescript @@ -13664,34 +13664,34 @@ snapshots: eslint-plugin-react: 7.34.1(eslint@8.50.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.50.0) - eslint-config-xo-typescript@1.0.1(@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2))(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2): + eslint-config-xo-typescript@1.0.1(@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.5.0-beta))(eslint@8.50.0)(typescript@5.5.0-beta))(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.5.0-beta))(eslint@8.50.0)(typescript@5.5.0-beta): dependencies: - '@typescript-eslint/eslint-plugin': 6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.5.0-beta))(eslint@8.50.0)(typescript@5.5.0-beta) + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.5.0-beta) eslint: 8.50.0 - typescript: 5.2.2 + typescript: 5.5.0-beta eslint-config-xo@0.43.1(eslint@8.50.0): dependencies: confusing-browser-globals: 1.0.11 eslint: 8.50.0 - eslint-config-zardoy@0.2.17(eslint-plugin-react-hooks@4.6.0(eslint@8.50.0))(eslint-plugin-react@7.34.1(eslint@8.50.0))(eslint@8.50.0)(typescript@5.2.2): + eslint-config-zardoy@0.2.17(eslint-plugin-react-hooks@4.6.0(eslint@8.50.0))(eslint-plugin-react@7.34.1(eslint@8.50.0))(eslint@8.50.0)(typescript@5.5.0-beta): dependencies: '@rushstack/eslint-patch': 1.4.0 - '@typescript-eslint/eslint-plugin': 6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.5.0-beta))(eslint@8.50.0)(typescript@5.5.0-beta) + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.5.0-beta) eslint: 8.50.0 eslint-config-prettier: 8.10.0(eslint@8.50.0) eslint-config-xo: 0.43.1(eslint@8.50.0) eslint-config-xo-react: 0.27.0(eslint-plugin-react-hooks@4.6.0(eslint@8.50.0))(eslint-plugin-react@7.34.1(eslint@8.50.0))(eslint@8.50.0) - eslint-config-xo-typescript: 1.0.1(@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2))(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2) + eslint-config-xo-typescript: 1.0.1(@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.5.0-beta))(eslint@8.50.0)(typescript@5.5.0-beta))(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.5.0-beta))(eslint@8.50.0)(typescript@5.5.0-beta) eslint-plugin-eslint-comments: 3.2.0(eslint@8.50.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.5.0-beta))(eslint@8.50.0) eslint-plugin-node: 11.1.0(eslint@8.50.0) eslint-plugin-sonarjs: 0.19.0(eslint@8.50.0) eslint-plugin-unicorn: 48.0.0(eslint@8.50.0) - typescript: 5.2.2 + typescript: 5.5.0-beta transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -13707,11 +13707,11 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@8.50.0): + eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.5.0-beta))(eslint-import-resolver-node@0.3.9)(eslint@8.50.0): dependencies: debug: 3.2.7(supports-color@8.1.1) optionalDependencies: - '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.5.0-beta) eslint: 8.50.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: @@ -13729,7 +13729,7 @@ snapshots: eslint: 8.50.0 ignore: 5.2.4 - eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0): + eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.5.0-beta))(eslint@8.50.0): dependencies: array-includes: 3.1.7 array.prototype.flat: 1.3.2 @@ -13738,7 +13738,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.50.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@8.50.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.5.0-beta))(eslint-import-resolver-node@0.3.9)(eslint@8.50.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -13748,7 +13748,7 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.14.2 optionalDependencies: - '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.5.0-beta) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -16791,9 +16791,9 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-docgen-typescript@2.2.2(typescript@5.2.2): + react-docgen-typescript@2.2.2(typescript@5.5.0-beta): dependencies: - typescript: 5.2.2 + typescript: 5.5.0-beta react-docgen@6.0.0-alpha.3: dependencies: @@ -17968,9 +17968,9 @@ snapshots: dependencies: utf8-byte-length: 1.0.4 - ts-api-utils@1.0.3(typescript@5.2.2): + ts-api-utils@1.0.3(typescript@5.5.0-beta): dependencies: - typescript: 5.2.2 + typescript: 5.5.0-beta ts-dedent@2.2.0: {} @@ -18092,7 +18092,7 @@ snapshots: typedarray@0.0.6: {} - typescript@5.2.2: {} + typescript@5.5.0-beta: {} ua-parser-js@1.0.37: {} @@ -18267,13 +18267,13 @@ snapshots: dependencies: react: 18.2.0 - use-typed-event-listener@4.0.2(react@18.2.0)(typescript@5.2.2): + use-typed-event-listener@4.0.2(react@18.2.0)(typescript@5.5.0-beta): dependencies: '@babel/runtime': 7.22.11 react: 18.2.0 use-deep-compare: 1.1.0(react@18.2.0) optionalDependencies: - typescript: 5.2.2 + typescript: 5.5.0-beta utf8-byte-length@1.0.4: {} diff --git a/prismarine-viewer/viewer/lib/worldDataEmitter.ts b/prismarine-viewer/viewer/lib/worldDataEmitter.ts index 6743e337..f4ce9675 100644 --- a/prismarine-viewer/viewer/lib/worldDataEmitter.ts +++ b/prismarine-viewer/viewer/lib/worldDataEmitter.ts @@ -186,8 +186,8 @@ export class WorldDataEmitter extends EventEmitter { const positions = generateSpiralMatrix(this.viewDistance).map(([x, z]) => { const pos = new Vec3((botX + x) * 16, 0, (botZ + z) * 16) if (!this.loadedChunks[`${pos.x},${pos.z}`]) return pos - return undefined! - }).filter(Boolean) + return undefined + }).filter(a => !!a) this.lastPos.update(pos) await this._loadChunks(positions) } else { diff --git a/src/inventoryWindows.ts b/src/inventoryWindows.ts index 3345b6cd..d9fda1c7 100644 --- a/src/inventoryWindows.ts +++ b/src/inventoryWindows.ts @@ -389,9 +389,9 @@ const upJei = (search: string) => { search = search.toLowerCase() // todo fix pre flat const matchedSlots = loadedData.itemsArray.map(x => { - if (!x.displayName.toLowerCase().includes(search)) return null! + if (!x.displayName.toLowerCase().includes(search)) return null return new PrismarineItem(x.id, 1) - }).filter(Boolean) + }).filter(a => a !== null) lastWindow.pwindow.win.jeiSlotsPage = 0 lastWindow.pwindow.win.jeiSlots = mapSlots(matchedSlots) } diff --git a/src/react/MessageFormatted.tsx b/src/react/MessageFormatted.tsx index 95ab064c..e9a0641a 100644 --- a/src/react/MessageFormatted.tsx +++ b/src/react/MessageFormatted.tsx @@ -78,7 +78,7 @@ export const MessagePart = ({ part, ...props }: { part: MessageFormatPart } & Co underlined && messageFormatStylesMap.underlined, strikethrough && messageFormatStylesMap.strikethrough, obfuscated && messageFormatStylesMap.obfuscated - ].filter(Boolean) + ].filter(a => a !== false && a !== undefined).filter(Boolean) return {text} } diff --git a/src/react/SoundMuffler.tsx b/src/react/SoundMuffler.tsx index 4f162940..869abc1c 100644 --- a/src/react/SoundMuffler.tsx +++ b/src/react/SoundMuffler.tsx @@ -42,16 +42,16 @@ export default () => { Last World Played {Object.entries(lastPlayedSounds.lastServerPlayed).map(([key, value]) => { - if (!showMuted && mutedSounds.includes(key)) return null as never + if (!showMuted && mutedSounds.includes(key)) return null return [key, value.count] as const - }).filter(Boolean).sort((a, b) => b[1] - a[1]).slice(0, 20).map(([key, count]) => { + }).filter(a => !!a).sort((a, b) => b[1] - a[1]).slice(0, 20).map(([key, count]) => { return {count} })} Last Client Played {lastPlayedSounds.lastClientPlayed.map((key) => { - if (!showMuted && mutedSounds.includes(key)) return null as never + if (!showMuted && mutedSounds.includes(key)) return null return })} From cf83844281217f4ec52b8f62855844511bd7343e Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 26 Apr 2024 09:44:47 +0300 Subject: [PATCH 0148/1195] fix annoying f3 issue --- src/react/MobileTopButtons.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/react/MobileTopButtons.tsx b/src/react/MobileTopButtons.tsx index c4acb028..c686bb0b 100644 --- a/src/react/MobileTopButtons.tsx +++ b/src/react/MobileTopButtons.tsx @@ -40,6 +40,7 @@ export default () => { }}>S
{ document.dispatchEvent(new KeyboardEvent('keydown', { code: 'F3' })) + document.dispatchEvent(new KeyboardEvent('keyup', { code: 'F3' })) }} { ...longPressEvent }>F3
{ e.stopPropagation() From b9aa44907100a7c3a136da6c39d26cfb46a1ab45 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 27 Apr 2024 15:51:06 +0300 Subject: [PATCH 0149/1195] fix ios hotbar, fix item name display, fix item select, fix inv open --- src/botUtils.ts | 2 +- src/react/HotbarRenderApp.tsx | 29 +++++++++++++++-------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/botUtils.ts b/src/botUtils.ts index 5dacbf4f..a76f889b 100644 --- a/src/botUtils.ts +++ b/src/botUtils.ts @@ -114,6 +114,6 @@ const blockToItemRemaps = { } export const getItemFromBlock = (block: import('prismarine-block').Block) => { - const item = loadedData.items[blockToItemRemaps[block.name] ?? block.name] + const item = loadedData.itemsByName[blockToItemRemaps[block.name] ?? block.name] return item } diff --git a/src/react/HotbarRenderApp.tsx b/src/react/HotbarRenderApp.tsx index 2e7ee1d1..e747c4e3 100644 --- a/src/react/HotbarRenderApp.tsx +++ b/src/react/HotbarRenderApp.tsx @@ -19,7 +19,7 @@ const ItemName = ({ itemKey }: { itemKey: string }) => { const defaultStyle: React.CSSProperties = { position: 'fixed', - bottom: `calc(var(--safe-area-inset-bottom) + ${bot ? bot.game.gameMode === 'creative' ? '35px' : '50px' : '50px'})`, + bottom: `calc(env(safe-area-inset-bottom) + ${bot ? bot.game.gameMode === 'creative' ? '35px' : '50px' : '50px'})`, left: 0, right: 0, fontSize: 10, @@ -117,7 +117,7 @@ export default () => { canvasManager.canvas.onpointerdown = (e) => { if (!isGameActive(true)) return const pos = inv.canvasManager.getMousePos(inv.canvas, e) - if (pos.x > canvasManager.canvas.width - 30) { + if (canvasManager.canvas.width - pos.x < 35 * inv.canvasManager.scale) { openPlayerInventory() } } @@ -135,7 +135,10 @@ export default () => { const heldItemChanged = () => { inv.inventory.activeHotbarSlot = bot.quickBarSlot - if (!bot.inventory.slots?.[bot.quickBarSlot + 36]) return + if (!bot.inventory.slots?.[bot.quickBarSlot + 36]) { + setItemKey('') + return + } const item = bot.inventory.slots[bot.quickBarSlot + 36]! const itemNbt = item.nbt ? JSON.stringify(item.nbt) : '' setItemKey(`${item.displayName}_split_${item.type}_split_${item.metadata}_split_${itemNbt}`) @@ -199,17 +202,15 @@ export default () => { return - -
- +
} From 6615984966ee22670965bbbacb418f30818833fa Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 27 Apr 2024 16:04:52 +0300 Subject: [PATCH 0150/1195] fix water rendering TODO still need to be correctly mapped to block named water instead --- prismarine-viewer/viewer/lib/mesher/world.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/prismarine-viewer/viewer/lib/mesher/world.ts b/prismarine-viewer/viewer/lib/mesher/world.ts index 50616f82..63263809 100644 --- a/prismarine-viewer/viewer/lib/mesher/world.ts +++ b/prismarine-viewer/viewer/lib/mesher/world.ts @@ -114,6 +114,8 @@ export class World { } const block = this.blockCache[stateId] + if (block.name === 'flowing_water') block.name = 'water' + if (block.name === 'flowing_lava') block.name = 'lava' // block.position = loc // it overrides position of all currently loaded blocks block.biome = this.biomeCache[column.getBiome(locInChunk)] ?? this.biomeCache[1] ?? this.biomeCache[0] if (block.name === 'redstone_ore') block.transparent = false From a504d3f5aa9b830ea47db577f2cb593e328bd236 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 27 Apr 2024 16:11:38 +0300 Subject: [PATCH 0151/1195] disable some useless warnings --- src/loadSave.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/loadSave.ts b/src/loadSave.ts index 655fbea8..c332e670 100644 --- a/src/loadSave.ts +++ b/src/loadSave.ts @@ -85,8 +85,10 @@ export const loadSave = async (root = '/world') => { const qs = new URLSearchParams(window.location.search) version = qs.get('mapVersion') ?? levelDat.Version?.Name if (!version) { - const newVersion = disablePrompts ? '1.8.8' : prompt(`In 1.8 and before world save doesn't contain version info, please enter version you want to use to load the world.\nSupported versions ${supportedVersions.join(', ')}`, '1.8.8') - if (!newVersion) return + // const newVersion = disablePrompts ? '1.8.8' : prompt(`In 1.8 and before world save doesn't contain version info, please enter version you want to use to load the world.\nSupported versions ${supportedVersions.join(', ')}`, '1.8.8') + // if (!newVersion) return + // todo detect world load issues + const newVersion = '1.8.8' version = newVersion } const lastSupportedVersion = supportedVersions.at(-1)! @@ -110,7 +112,7 @@ export const loadSave = async (root = '/world') => { isFlat = levelDat.generatorName === 'flat' } if (!isFlat && levelDat.generatorName !== 'default' && levelDat.generatorName !== 'customized') { - warnings.push(`Generator ${levelDat.generatorName} may not be supported yet`) + // warnings.push(`Generator ${levelDat.generatorName} may not be supported yet, be careful of new chunks writes`) } const playerUuid = nameToMcOfflineUUID(options.localUsername) @@ -150,7 +152,7 @@ export const loadSave = async (root = '/world') => { if (!fsState.isReadonly && !fsState.inMemorySave && !disablePrompts) { // todo allow also to ctrl+s - alert('Note: the world is saved only on /save or disconnect! Ensure you have backup!') + alert('Note: the world is saved on interval, /save or disconnect! Ensure you have backup and be careful of new chunks writes!') } // improve compatibility with community saves From 9322e09a836a0d896ccaa0e5aa8ebd48e31f34f2 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 27 Apr 2024 22:55:25 +0300 Subject: [PATCH 0152/1195] fix: "modern" controls now correctly works with flying fix: right stick button on gamepad now toggles sneaking --- src/controls.ts | 13 +++++++++++-- src/react/HotbarRenderApp.tsx | 4 +++- src/react/TouchAreasControls.tsx | 29 ++++++++++++++++++++++------- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/controls.ts b/src/controls.ts index 734a2a6d..26405082 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -32,7 +32,8 @@ export const contro = new ControMax({ jump: ['Space', 'A'], inventory: ['KeyE', 'X'], drop: ['KeyQ', 'B'], - sneak: ['ShiftLeft', 'Right Stick'], + sneak: ['ShiftLeft'], + toggleSneakOrDown: [null, 'Right Stick'], sprint: ['ControlLeft', 'Left Stick'], nextHotbarSlot: [null, 'Left Bumper'], prevHotbarSlot: [null, 'Right Bumper'], @@ -152,7 +153,7 @@ const uiCommand = (command: Command) => { } } -export const setSneaking = (state: boolean) => { +const setSneaking = (state: boolean) => { gameAdditionalState.isSneaking = state bot.setControlState('sneak', state) } @@ -178,6 +179,14 @@ const onTriggerOrReleased = (command: Command, pressed: boolean) => { if (pressed) { setSprinting(pressed) } + break + case 'general.toggleSneakOrDown': + if (gameAdditionalState.isFlying) { + setSneaking(pressed) + } else if (pressed) { + setSneaking(!gameAdditionalState.isSneaking) + } + break case 'general.attackDestroy': document.dispatchEvent(new MouseEvent(pressed ? 'mousedown' : 'mouseup', { button: 0 })) diff --git a/src/react/HotbarRenderApp.tsx b/src/react/HotbarRenderApp.tsx index e747c4e3..5b32e3cc 100644 --- a/src/react/HotbarRenderApp.tsx +++ b/src/react/HotbarRenderApp.tsx @@ -108,13 +108,14 @@ export default () => { } setSize() watchUnloadForCleanup(subscribe(currentScaling, setSize)) + inv.canvas.style.pointerEvents = 'auto' container.current.appendChild(inv.canvas) const upHotbarItems = () => { if (!viewer.world.downloadedTextureImage && !viewer.world.customTexturesDataUrl) return upInventoryItems(true, inv) } - canvasManager.canvas.onpointerdown = (e) => { + canvasManager.canvas.onclick = (e) => { if (!isGameActive(true)) return const pos = inv.canvasManager.getMousePos(inv.canvas, e) if (canvasManager.canvas.width - pos.x < 35 * inv.canvasManager.scale) { @@ -209,6 +210,7 @@ export default () => { display: 'flex', justifyContent: 'center', zIndex: hasModals ? 1 : 8, + pointerEvents: 'none', bottom: 'env(safe-area-inset-bottom)' }} /> diff --git a/src/react/TouchAreasControls.tsx b/src/react/TouchAreasControls.tsx index e2a3fd87..f56db047 100644 --- a/src/react/TouchAreasControls.tsx +++ b/src/react/TouchAreasControls.tsx @@ -1,6 +1,6 @@ -import { CSSProperties, PointerEvent, PointerEventHandler, useEffect, useRef, useState } from 'react' +import { CSSProperties, PointerEvent, useEffect, useRef } from 'react' import { proxy, ref, useSnapshot } from 'valtio' -import { contro, setSneaking } from '../controls' +import { contro } from '../controls' import worldInteractions from '../worldInteractions' import PixelartIcon from './PixelartIcon' import Button from './Button' @@ -56,6 +56,7 @@ export default ({ touchActive, setupActive, buttonsPositions, closeButtonsSetup const joystickInner = useRef(null) const { pointer } = useSnapshot(joystickPointer) + // const { isFlying, isSneaking } = useSnapshot(gameAdditionalState) const newButtonPositions = { ...buttonsPositions } const buttonProps = (name: ButtonName) => { @@ -72,7 +73,10 @@ export default ({ touchActive, setupActive, buttonsPositions, closeButtonsSetup document.dispatchEvent(new MouseEvent('mouseup', { button: 2 })) }, sneak () { - setSneaking(!bot.getControlState('sneak')) + void contro.emit('trigger', { + command: 'general.toggleSneakOrDown', + schema: null as any, + }) active = bot.getControlState('sneak') }, break () { @@ -81,14 +85,22 @@ export default ({ touchActive, setupActive, buttonsPositions, closeButtonsSetup active = true }, jump () { - bot.setControlState('jump', true) - active = true + void contro.emit('trigger', { + command: 'general.jump', + schema: null as any, + }) + active = bot.controlState.jump } } const holdUp = { action () { }, sneak () { + void contro.emit('release', { + command: 'general.toggleSneakOrDown', + schema: null as any, + }) + active = bot.getControlState('sneak') }, break () { document.dispatchEvent(new MouseEvent('mouseup', { button: 0 })) @@ -96,8 +108,11 @@ export default ({ touchActive, setupActive, buttonsPositions, closeButtonsSetup active = false }, jump () { - bot.setControlState('jump', false) - active = false + void contro.emit('release', { + command: 'general.jump', + schema: null as any, + }) + active = bot.controlState.jump } } From e44c7cece26d36ff18ce0bbc15314d3a72c520cb Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 27 Apr 2024 23:17:06 +0300 Subject: [PATCH 0153/1195] workaround gpu textures overflow issue with many unknown entities TODO should be reworked completely --- prismarine-viewer/examples/playground.ts | 2 +- prismarine-viewer/viewer/lib/entities.js | 38 ++++++++++++++---------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/prismarine-viewer/examples/playground.ts b/prismarine-viewer/examples/playground.ts index bc9294ac..295cc47d 100644 --- a/prismarine-viewer/examples/playground.ts +++ b/prismarine-viewer/examples/playground.ts @@ -132,7 +132,7 @@ async function main () { document.body.appendChild(renderer.domElement) // Create viewer - const viewer = new Viewer(renderer, 1) + const viewer = new Viewer(renderer, { numWorkers: 1, showChunkBorders: false }) viewer.entities.setDebugMode('basic') viewer.setVersion(version) viewer.entities.onSkinUpdate = () => { diff --git a/prismarine-viewer/viewer/lib/entities.js b/prismarine-viewer/viewer/lib/entities.js index 350dc53e..290c3932 100644 --- a/prismarine-viewer/viewer/lib/entities.js +++ b/prismarine-viewer/viewer/lib/entities.js @@ -17,7 +17,7 @@ import externalTexturesJson from './entity/externalTextures.json' export const TWEEN_DURATION = 50 // todo should be 100 -function getUsernameTexture (username, { fontFamily = 'sans-serif' }) { +function getUsernameTexture(username, { fontFamily = 'sans-serif' }) { const canvas = document.createElement('canvas') const ctx = canvas.getContext('2d') if (!ctx) throw new Error('Could not get 2d context') @@ -58,7 +58,10 @@ const addNametag = (entity, options, mesh) => { } } -function getEntityMesh (entity, scene, options, overrides) { +// todo cleanup +const nametags = {} + +function getEntityMesh(entity, scene, options, overrides) { if (entity.name) { try { // https://github.com/PrismarineJS/prismarine-viewer/pull/410 @@ -78,10 +81,13 @@ function getEntityMesh (entity, scene, options, overrides) { geometry.translate(0, entity.height / 2, 0) const material = new THREE.MeshBasicMaterial({ color: 0xff_00_ff }) const cube = new THREE.Mesh(geometry, material) - addNametag({ - username: entity.name, - height: entity.height, - }, options, cube) + const nametagCount = (nametags[entity.name] = (nametags[entity.name] || 0) + 1) + if (nametagCount < 6) { + addNametag({ + username: entity.name, + height: entity.height, + }, options, cube) + } return cube } @@ -99,7 +105,7 @@ export class Entities extends EventEmitter { this.getItemUv = undefined } - clear () { + clear() { for (const mesh of Object.values(this.entities)) { this.scene.remove(mesh) dispose3(mesh) @@ -107,7 +113,7 @@ export class Entities extends EventEmitter { this.entities = {} } - setDebugMode (mode, /** @type {THREE.Object3D?} */entity = null) { + setDebugMode(mode, /** @type {THREE.Object3D?} */entity = null) { this.debugMode = mode for (const mesh of entity ? [entity] : Object.values(this.entities)) { const boxHelper = mesh.children.find(c => c.name === 'debug') @@ -119,14 +125,14 @@ export class Entities extends EventEmitter { } } - setVisible (visible, /** @type {THREE.Object3D?} */entity = null) { + setVisible(visible, /** @type {THREE.Object3D?} */entity = null) { this.visible = visible for (const mesh of entity ? [entity] : Object.values(this.entities)) { mesh.visible = visible } } - render () { + render() { const dt = this.clock.getDelta() for (const entityId of Object.keys(this.entities)) { const playerObject = this.getPlayerObject(entityId) @@ -136,7 +142,7 @@ export class Entities extends EventEmitter { } } - getPlayerObject (entityId) { + getPlayerObject(entityId) { /** @type {(PlayerObject & { animation?: PlayerAnimation }) | undefined} */ const playerObject = this.entities[entityId]?.playerObject return playerObject @@ -146,7 +152,7 @@ export class Entities extends EventEmitter { defaultSteveTexture // true means use default skin url - updatePlayerSkin (entityId, username, /** @type {string | true} */skinUrl, /** @type {string | true | undefined} */capeUrl = undefined) { + updatePlayerSkin(entityId, username, /** @type {string | true} */skinUrl, /** @type {string | true | undefined} */capeUrl = undefined) { let playerObject = this.getPlayerObject(entityId) if (!playerObject) return // const username = this.entities[entityId].username @@ -229,14 +235,14 @@ export class Entities extends EventEmitter { playerObject.cape.map = null } - function isCanvasBlank (canvas) { + function isCanvasBlank(canvas) { return !canvas.getContext('2d') .getImageData(0, 0, canvas.width, canvas.height).data .some(channel => channel !== 0) } } - playAnimation (entityPlayerId, /** @type {'walking' | 'running' | 'oneSwing' | 'idle'} */animation) { + playAnimation(entityPlayerId, /** @type {'walking' | 'running' | 'oneSwing' | 'idle'} */animation) { const playerObject = this.getPlayerObject(entityPlayerId) if (!playerObject) return @@ -256,14 +262,14 @@ export class Entities extends EventEmitter { } - displaySimpleText (jsonLike) { + displaySimpleText(jsonLike) { if (!jsonLike) return const parsed = mojangson.simplify(mojangson.parse(jsonLike)) const text = flat(parsed).map(x => x.text) return text.join('') } - update (/** @type {import('prismarine-entity').Entity & {delete?, pos}} */entity, overrides) { + update(/** @type {import('prismarine-entity').Entity & {delete?, pos}} */entity, overrides) { let isPlayerModel = entity.name === 'player' if (entity.name === 'zombie' || entity.name === 'zombie_villager' || entity.name === 'husk') { isPlayerModel = true From d83120fdce389f5c88b1c17dcbbb549747849523 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Mon, 22 Apr 2024 09:37:44 +0300 Subject: [PATCH 0154/1195] disable smooth lighting for now as it doesn't work correctly --- prismarine-viewer/viewer/lib/mesher/models.ts | 10 ++++------ prismarine-viewer/viewer/lib/mesher/world.ts | 4 +++- src/optionsGuiScheme.tsx | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/prismarine-viewer/viewer/lib/mesher/models.ts b/prismarine-viewer/viewer/lib/mesher/models.ts index fc86a671..833de180 100644 --- a/prismarine-viewer/viewer/lib/mesher/models.ts +++ b/prismarine-viewer/viewer/lib/mesher/models.ts @@ -387,15 +387,12 @@ function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr const corner = world.getBlock(cursor.offset(...cornerDir)) let cornerLightResult = 15 - if (world.config.smoothLighting) { + if (/* world.config.smoothLighting */false) { // todo fix const side1Light = world.getLight(cursor.plus(new Vec3(...side1Dir)), true) const side2Light = world.getLight(cursor.plus(new Vec3(...side2Dir)), true) const cornerLight = world.getLight(cursor.plus(new Vec3(...cornerDir)), true) // interpolate - cornerLightResult = Math.min( - Math.min(side1Light, side2Light), - cornerLight - ) + cornerLightResult = (side1Light + side2Light + cornerLight) / 3 } const side1Block = world.shouldMakeAo(side1) ? 1 : 0 @@ -405,7 +402,8 @@ function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr // TODO: correctly interpolate ao light based on pos (evaluate once for each corner of the block) const ao = (side1Block && side2Block) ? 0 : (3 - (side1Block + side2Block + cornerBlock)) - light = (ao + 1) / 4 * cornerLightResult / 15 + // todo light should go upper on lower blocks + light = (ao + 1) / 4 * (cornerLightResult / 15) aos.push(ao) } diff --git a/prismarine-viewer/viewer/lib/mesher/world.ts b/prismarine-viewer/viewer/lib/mesher/world.ts index 63263809..9a4f0ab3 100644 --- a/prismarine-viewer/viewer/lib/mesher/world.ts +++ b/prismarine-viewer/viewer/lib/mesher/world.ts @@ -130,7 +130,9 @@ export class World { // todo export in chunk instead const hasChunkSection = (column, pos) => { if (column._getSection) return column._getSection(pos) - if (column.skyLightSections) return column.skyLightSections[getLightSectionIndex(pos, column.minY)] + if (column.skyLightSections) { + return column.skyLightSections[getLightSectionIndex(pos, column.minY)] || column.blockLightSections[getLightSectionIndex(pos, column.minY)] + } if (column.sections) return column.sections[pos.y >> 4] } diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index 84a09d45..96840af5 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -50,7 +50,7 @@ export const guiOptionsScheme: { dayCycleAndLighting: { text: 'Day Cycle', }, - smoothLighting: {}, + // smoothLighting: {}, newVersionsLighting: { text: 'Lighting in newer versions', }, From b278016460f2c659533fba05e0dfc5bac9898be9 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Mon, 22 Apr 2024 11:09:09 +0300 Subject: [PATCH 0155/1195] implement disableDuringGame --- src/optionsGuiScheme.tsx | 3 ++- src/react/OptionsItems.tsx | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index 96840af5..2457c34f 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -56,7 +56,8 @@ export const guiOptionsScheme: { }, lowMemoryMode: { text: 'Low Memory Mode', - enableWarning: 'Enabling it will make chunks load ~4x slower' + enableWarning: 'Enabling it will make chunks load ~4x slower', + disabledDuringGame: true }, }, ], diff --git a/src/react/OptionsItems.tsx b/src/react/OptionsItems.tsx index 5dd31923..1ff589ca 100644 --- a/src/react/OptionsItems.tsx +++ b/src/react/OptionsItems.tsx @@ -3,6 +3,7 @@ import { noCase } from 'change-case' import { titleCase } from 'title-case' import { useMemo } from 'react' import { options, qsOptions } from '../optionsStorage' +import { miscUiState } from '../globalState' import Button from './Button' import Slider from './Slider' import Screen from './Screen' @@ -12,6 +13,7 @@ type GeneralItem = { id?: string text?: string, disabledReason?: string, + disabledDuringGame?: boolean tooltip?: string // description?: string enableWarning?: string @@ -34,8 +36,8 @@ export type OptionMeta = GeneralItem & ({ }) // todo not reactive -const isDisabled = (id) => { - return Object.keys(qsOptions).includes(id) +const isDisabled = (item: GeneralItem) => { + return Object.keys(qsOptions).includes(item.id!) } export const OptionButton = ({ item }: { item: Extract }) => { @@ -60,6 +62,10 @@ export const OptionButton = ({ item }: { item: Extract { + if (item.disabledReason) { + await showOptionsModal(`The option is unavailable. ${item.disabledReason}`, []) + return + } if (item.enableWarning && !options[item.id!]) { const result = await showOptionsModal(item.enableWarning, ['Enable']) if (!result) return @@ -86,7 +92,7 @@ export const OptionButton = ({ item }: { item: Extract { + return { options[item.id!] = value }} unit={item.unit} valueDisplay={valueDisplay} updateOnDragEnd={item.delayApply} /> } @@ -111,9 +117,13 @@ const OptionElement = ({ item }: { item: Extract { + const { gameLoaded } = useSnapshot(miscUiState) if (item.id) { item.text ??= titleCase(noCase(item.id)) } + if (item.disabledDuringGame && gameLoaded) { + item.disabledReason = 'Cannot be changed during game' + } let baseElement = null as React.ReactNode | null if (item.type === 'toggle') baseElement = From cfb9b17fd4aff13ebad063b0253b213584fd0b6e Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 4 May 2024 13:10:03 +0300 Subject: [PATCH 0156/1195] fix: don't attack on right click --- src/worldInteractions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/worldInteractions.ts b/src/worldInteractions.ts index b2602cc5..544027a5 100644 --- a/src/worldInteractions.ts +++ b/src/worldInteractions.ts @@ -87,7 +87,7 @@ class WorldInteraction { const entity = getEntityCursor() - if (entity) { + if (entity && e.button === 2) { bot.attack(entity) } }) From 826c66b9ec51f89c41de7dbd643a43ea9af1bc11 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 4 May 2024 16:07:18 +0300 Subject: [PATCH 0157/1195] feat: brand new Servers List UI /w auto login feature! (#110) --- config.json | 18 +- cypress/e2e/index.spec.ts | 13 +- package.json | 2 +- pnpm-lock.yaml | 94 +++++- prismarine-viewer/viewer/lib/simpleUtils.ts | 4 + src/connect.ts | 15 + src/devReload.ts | 2 +- src/downloadAndOpenFile.ts | 5 +- src/globalState.ts | 15 +- src/globals.d.ts | 10 +- src/index.ts | 41 ++- src/menus/components/button.js | 136 -------- src/menus/components/common.js | 60 ---- src/menus/components/edit_box.js | 161 ---------- src/menus/play_screen.js | 250 --------------- src/optionsGuiScheme.tsx | 2 +- src/react/AddServer.tsx | 110 +++++++ src/react/Button.tsx | 4 +- src/react/ChatProvider.tsx | 18 +- src/react/Input.tsx | 4 +- src/react/MainMenu.tsx | 4 +- src/react/MainMenuRenderApp.tsx | 4 +- src/react/MessageFormatted.tsx | 2 +- src/react/PauseScreen.tsx | 2 +- src/react/ServersList.stories.tsx | 55 ++++ src/react/ServersList.tsx | 165 ++++++++++ src/react/ServersListProvider.tsx | 339 ++++++++++++++++++++ src/react/Singleplayer.tsx | 73 +++-- src/react/SingleplayerProvider.tsx | 2 +- src/react/input.module.css | 61 ++-- src/react/simpleHooks.ts | 6 + src/react/singleplayer.module.css | 14 + src/reactUi.tsx | 2 + src/watchOptions.ts | 2 +- 34 files changed, 976 insertions(+), 719 deletions(-) create mode 100644 src/connect.ts delete mode 100644 src/menus/components/button.js delete mode 100644 src/menus/components/common.js delete mode 100644 src/menus/components/edit_box.js delete mode 100644 src/menus/play_screen.js create mode 100644 src/react/AddServer.tsx create mode 100644 src/react/ServersList.stories.tsx create mode 100644 src/react/ServersList.tsx create mode 100644 src/react/ServersListProvider.tsx create mode 100644 src/react/simpleHooks.ts diff --git a/config.json b/config.json index b7fa1d7e..c1db50c3 100644 --- a/config.json +++ b/config.json @@ -2,6 +2,20 @@ "version": 1, "defaultHost": "", "defaultProxy": "proxy.mcraft.fun", - "defaultVersion": "1.18.2", - "mapsProvider": "https://maps.mcraft.fun/" + "mapsProvider": "https://maps.mcraft.fun/", + "promoteServers": [ + { + "ip": "kaboom.pw", + "description": "Chaos and destruction server. Free for everyone." + }, + { + "ip": "go.mineberry.org", + "version": "1.18.2", + "description": "One of the best servers here. Join now!" + }, + { + "ip": "play.minemalia.com", + "description": "Only login with existing accounts." + } + ] } diff --git a/cypress/e2e/index.spec.ts b/cypress/e2e/index.spec.ts index 8b168bf1..35399393 100644 --- a/cypress/e2e/index.spec.ts +++ b/cypress/e2e/index.spec.ts @@ -53,20 +53,19 @@ it('Loads & renders singleplayer', () => { }) it.only('Joins to server', () => { - // visit('/?version=1.16.1') + visit('/?ip=localhost&version=1.16.1') window.localStorage.version = '' - visit() // todo replace with data-test - cy.get('[data-test-id="connect-screen-button"]', { includeShadowDom: true }).click() - cy.get('input#serverip', { includeShadowDom: true }).clear().focus().type('localhost') - cy.get('input#botversion', { includeShadowDom: true }).clear().focus().type('1.16.1') // todo needs to fix autoversion - cy.get('[data-test-id="connect-to-server"]', { includeShadowDom: true }).click() + // cy.get('[data-test-id="servers-screen-button"]').click() + // cy.get('[data-test-id="server-ip"]').clear().focus().type('localhost') + // cy.get('[data-test-id="version"]').clear().focus().type('1.16.1') // todo needs to fix autoversion + cy.get('[data-test-id="connect-qs"]').click() testWorldLoad() }) it('Loads & renders zip world', () => { cleanVisit() - cy.get('[data-test-id="select-file-folder"]', { includeShadowDom: true }).click({ shiftKey: true }) + cy.get('[data-test-id="select-file-folder"]').click({ shiftKey: true }) cy.get('input[type="file"]').selectFile('cypress/superflat.zip', { force: true }) testWorldLoad() }) diff --git a/package.json b/package.json index dee909a8..4d99a6d5 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "dependencies": { "@dimaka/interface": "0.0.3-alpha.0", "@floating-ui/react": "^0.26.1", + "@mui/base": "5.0.0-beta.40", "@nxg-org/mineflayer-auto-jump": "^0.7.7", "@nxg-org/mineflayer-tracker": "^1.2.1", "@react-oauth/google": "^0.12.1", @@ -60,7 +61,6 @@ "google-drive-browserfs": "github:zardoy/browserfs#google-drive", "iconify-icon": "^1.0.8", "jszip": "^3.10.1", - "lit": "^2.8.0", "lodash-es": "^4.17.21", "minecraft-assets": "^1.12.2", "minecraft-data": "3.62.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc504d17..1ef5b1d0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: '@floating-ui/react': specifier: ^0.26.1 version: 0.26.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/base': + specifier: 5.0.0-beta.40 + version: 5.0.0-beta.40(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@nxg-org/mineflayer-auto-jump': specifier: ^0.7.7 version: 0.7.7 @@ -104,9 +107,6 @@ importers: jszip: specifier: ^3.10.1 version: 3.10.1 - lit: - specifier: ^2.8.0 - version: 2.8.0 lodash-es: specifier: ^4.17.21 version: 4.17.21 @@ -1110,6 +1110,10 @@ packages: resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.24.5': + resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + engines: {node: '>=6.9.0'} + '@babel/template@7.22.5': resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} @@ -1661,6 +1665,12 @@ packages: react: ^18.2.0 react-dom: '>=16.8.0' + '@floating-ui/react-dom@2.0.9': + resolution: {integrity: sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==} + peerDependencies: + react: ^18.2.0 + react-dom: '>=16.8.0' + '@floating-ui/react@0.26.1': resolution: {integrity: sha512-5gyJIJ2tZOPMgmZ/vEcVhdmQiy75b7LPO71sYIiDsxGcZ4hxLuygQWCuT0YXHqppt//Eese+L6t5KnX/gZ3tVA==} peerDependencies: @@ -1931,6 +1941,35 @@ packages: resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} engines: {node: '>= 10'} + '@mui/base@5.0.0-beta.40': + resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^18.2.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/types@7.2.14': + resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/utils@5.15.14': + resolution: {integrity: sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@ndelangen/get-tarball@3.0.9': resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} @@ -2774,6 +2813,9 @@ packages: '@types/pretty-hrtime@1.0.1': resolution: {integrity: sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==} + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/prop-types@15.7.5': resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} @@ -3664,6 +3706,10 @@ packages: resolution: {integrity: sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==} engines: {node: '>=6'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@0.5.3: resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==} @@ -9458,6 +9504,10 @@ snapshots: dependencies: regenerator-runtime: 0.14.0 + '@babel/runtime@7.24.5': + dependencies: + regenerator-runtime: 0.14.0 + '@babel/template@7.22.5': dependencies: '@babel/code-frame': 7.22.13 @@ -9864,6 +9914,12 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + '@floating-ui/react-dom@2.0.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@floating-ui/dom': 1.5.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + '@floating-ui/react@0.26.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -10279,6 +10335,34 @@ snapshots: '@msgpack/msgpack@2.8.0': {} + '@mui/base@5.0.0-beta.40(@types/react@18.2.20)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.5 + '@floating-ui/react-dom': 2.0.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/types': 7.2.14(@types/react@18.2.20) + '@mui/utils': 5.15.14(@types/react@18.2.20)(react@18.2.0) + '@popperjs/core': 2.11.8 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.20 + + '@mui/types@7.2.14(@types/react@18.2.20)': + optionalDependencies: + '@types/react': 18.2.20 + + '@mui/utils@5.15.14(@types/react@18.2.20)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.5 + '@types/prop-types': 15.7.12 + prop-types: 15.8.1 + react: 18.2.0 + react-is: 18.2.0 + optionalDependencies: + '@types/react': 18.2.20 + '@ndelangen/get-tarball@3.0.9': dependencies: gunzip-maybe: 1.4.2 @@ -11577,6 +11661,8 @@ snapshots: '@types/pretty-hrtime@1.0.1': {} + '@types/prop-types@15.7.12': {} + '@types/prop-types@15.7.5': {} '@types/qs@6.9.8': {} @@ -12705,6 +12791,8 @@ snapshots: clsx@1.1.1: {} + clsx@2.1.1: {} + color-convert@0.5.3: {} color-convert@1.9.3: diff --git a/prismarine-viewer/viewer/lib/simpleUtils.ts b/prismarine-viewer/viewer/lib/simpleUtils.ts index 5c602f1c..3f17e5ad 100644 --- a/prismarine-viewer/viewer/lib/simpleUtils.ts +++ b/prismarine-viewer/viewer/lib/simpleUtils.ts @@ -19,6 +19,10 @@ export function openURL (url, newTab = true) { } } +export const isMobile = () => { + return window.matchMedia('(pointer: coarse)').matches || navigator.userAgent.includes('Mobile') +} + export function chunkPos (pos: { x: number, z: number }) { const x = Math.floor(pos.x / 16) const z = Math.floor(pos.z / 16) diff --git a/src/connect.ts b/src/connect.ts new file mode 100644 index 00000000..5e4df859 --- /dev/null +++ b/src/connect.ts @@ -0,0 +1,15 @@ +export type ConnectOptions = { + server?: string; + singleplayer?: any; + username: string; + password?: any; + proxy?: any; + botVersion?: any; + serverOverrides?; + serverOverridesFlat?; + peerId?: string; + ignoreQs?: boolean; + onSuccessfulPlay?: () => void + autoLoginPassword?: string + serverIndex?: string +} diff --git a/src/devReload.ts b/src/devReload.ts index a89551d3..19e50263 100644 --- a/src/devReload.ts +++ b/src/devReload.ts @@ -1,5 +1,5 @@ +import { isMobile } from 'prismarine-viewer/viewer/lib/simpleUtils' import { WorldRendererThree } from 'prismarine-viewer/viewer/lib/worldrendererThree' -import { isMobile } from './menus/components/common' if (process.env.NODE_ENV === 'development') { if (sessionStorage.lastReload) { diff --git a/src/downloadAndOpenFile.ts b/src/downloadAndOpenFile.ts index b3d3a059..7ac154fc 100644 --- a/src/downloadAndOpenFile.ts +++ b/src/downloadAndOpenFile.ts @@ -20,9 +20,6 @@ const inner = async () => { if (resourcePackState.resourcePackInstalled) { if (!confirm(`You are going to install a new resource pack, which will REPLACE the current one: ${await getResourcePackName()} Continue?`)) return } - } else { - const menu = document.getElementById('play-screen') - menu.style = 'display: none;' } const name = mapUrl.slice(mapUrl.lastIndexOf('/') + 1).slice(-25) const downloadThing = texturepack ? 'texturepack' : 'world' @@ -78,7 +75,7 @@ export default async () => { try { return await inner() } catch (err) { - setLoadingScreenStatus(`Failed to download. Either refresh page or remove mapUrl param from URL. Reason: ${err.message}`) + setLoadingScreenStatus(`Failed to download. Either refresh page or remove map param from URL. Reason: ${err.message}`) return true } } diff --git a/src/globalState.ts b/src/globalState.ts index fa1c4cda..1b0526f9 100644 --- a/src/globalState.ts +++ b/src/globalState.ts @@ -56,10 +56,10 @@ const showModalInner = (modal: Modal) => { return true } -export const showModal = (elem: (HTMLElement & Record) | { reactType: string }) => { +export const showModal = (elem: /* (HTMLElement & Record) | */{ reactType: string }) => { const resolved = elem instanceof HTMLElement ? { elem: ref(elem) } : elem const curModal = activeModalStack.at(-1) - if (elem === curModal?.elem || (elem.reactType && elem.reactType === curModal?.reactType) || !showModalInner(resolved)) return + if (/* elem === curModal?.elem || */(elem.reactType && elem.reactType === curModal?.reactType) || !showModalInner(resolved)) return if (curModal) defaultModalActions.hide(curModal) activeModalStack.push(resolved) } @@ -118,11 +118,12 @@ export const showContextmenu = (items: ContextMenuItem[], { clientX, clientY }) // --- export type AppConfig = { - defaultHost?: string - defaultHostSave?: string + // defaultHost?: string + // defaultHostSave?: string defaultProxy?: string - defaultProxySave?: string - defaultVersion?: string + // defaultProxySave?: string + // defaultVersion?: string + promoteServers?: Array<{ip, description, version?}> mapsProvider?: string } @@ -130,12 +131,14 @@ export const miscUiState = proxy({ currentDisplayQr: null as string | null, currentTouch: null as boolean | null, serverIp: null as string | null, + username: '', hasErrors: false, singleplayer: false, flyingSquid: false, wanOpened: false, /** wether game hud is shown (in playing state) */ gameLoaded: false, + loadedServerIndex: '', /** currently trying to load or loaded mc version, after all data is loaded */ loadedDataVersion: null as string | null, appLoaded: false, diff --git a/src/globals.d.ts b/src/globals.d.ts index b0a8d6db..7d2a478c 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -27,7 +27,6 @@ declare const customEvents: import('typed-emitter').default<{ declare const beforeRenderFrame: Array<() => void> declare interface Document { - getElementById (id): any exitPointerLock?(): void } @@ -37,14 +36,7 @@ declare namespace JSX { } } -declare interface DocumentFragment { - getElementById (id): HTMLElement & Record - querySelector (id): HTMLElement & Record -} - -declare interface Window extends Record { - -} +declare interface Window extends Record {} type StringKeys = Extract diff --git a/src/index.ts b/src/index.ts index c4cff16a..0cd178d9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,9 +10,6 @@ import initCollisionShapes from './getCollisionShapes' import { itemsAtlases, onGameLoad } from './inventoryWindows' import { supportedVersions } from 'minecraft-protocol' -import './menus/components/button' -import './menus/components/edit_box' -import './menus/play_screen' import 'core-js/features/array/at' import 'core-js/features/promise/with-resolvers' @@ -90,6 +87,7 @@ import { saveToBrowserMemory } from './react/PauseScreen' import { ViewerWrapper } from 'prismarine-viewer/viewer/lib/viewerWrapper' import './devReload' import './water' +import { ConnectOptions } from './connect' window.debug = debug window.THREE = THREE @@ -240,13 +238,10 @@ const cleanConnectIp = (host: string | undefined, defaultPort: string | undefine } } -async function connect (connectOptions: { - server?: string; singleplayer?: any; username: string; password?: any; proxy?: any; botVersion?: any; serverOverrides?; serverOverridesFlat?; peerId?: string; ignoreQs?: boolean -}) { +async function connect (connectOptions: ConnectOptions) { if (miscUiState.gameLoaded) return miscUiState.hasErrors = false lastConnectOptions.value = connectOptions - document.getElementById('play-screen').style = 'display: none;' removePanorama() const { singleplayer } = connectOptions @@ -331,7 +326,7 @@ async function connect (connectOptions: { }) if (proxy) { - console.log(`using proxy ${proxy.host}${proxy.port && `:${proxy.port}`}`) + console.log(`using proxy ${proxy.host}:${proxy.port || location.port}`) net['setProxy']({ hostname: proxy.host, port: proxy.port }) } @@ -528,12 +523,6 @@ async function connect (connectOptions: { bot.once('login', () => { worldInteractions.initBot() - // server is ok, add it to the history - if (!connectOptions.server) return - const serverHistory: string[] = JSON.parse(localStorage.getItem('serverHistory') || '[]') - serverHistory.unshift(connectOptions.server) - localStorage.setItem('serverHistory', JSON.stringify([...new Set(serverHistory)])) - setLoadingScreenStatus('Loading world') }) @@ -548,10 +537,16 @@ async function connect (connectOptions: { window.pathfinder = pathfinder miscUiState.gameLoaded = true + miscUiState.loadedServerIndex = connectOptions.serverIndex ?? '' customEvents.emit('gameLoaded') if (p2pConnectTimeout) clearTimeout(p2pConnectTimeout) setLoadingScreenStatus('Placing blocks (starting viewer)') + localStorage.lastConnectOptions = JSON.stringify(connectOptions) + connectOptions.onSuccessfulPlay?.() + if (connectOptions.autoLoginPassword) { + bot.chat(`/login ${connectOptions.autoLoginPassword}`) + } console.log('bot spawned - starting viewer') @@ -726,6 +721,7 @@ async function connect (connectOptions: { console.log('Done!') + // todo onGameLoad(async () => { if (!viewer.world.downloadedBlockStatesData && !viewer.world.customBlockStatesData) { await new Promise(resolve => { @@ -733,6 +729,7 @@ async function connect (connectOptions: { }) } miscUiState.serverIp = server.host as string | null + miscUiState.username = username }) if (appStatusState.isError) return @@ -839,12 +836,26 @@ void window.fetch('config.json').then(async res => res.json()).then(c => c, (err miscUiState.appConfig = config }) +// qs open actions downloadAndOpenFile().then((downloadAction) => { if (downloadAction) return + const qs = new URLSearchParams(window.location.search) + if (qs.get('reconnect') && process.env.NODE_ENV === 'development') { + const ip = qs.get('ip') + const lastConnect = JSON.parse(localStorage.lastConnectOptions ?? {}) + void connect({ + ...lastConnect, // todo mixing is not good idea + ip: ip || undefined + }) + return + } + if (qs.get('ip') || qs.get('proxy')) { + // show server editor for connect or save + showModal({ reactType: 'editServer' }) + } void Promise.resolve().then(() => { // try to connect to peer - const qs = new URLSearchParams(window.location.search) const peerId = qs.get('connectPeer') const version = qs.get('peerVersion') if (peerId) { diff --git a/src/menus/components/button.js b/src/menus/components/button.js deleted file mode 100644 index 1f726821..00000000 --- a/src/menus/components/button.js +++ /dev/null @@ -1,136 +0,0 @@ -//@ts-check -import { LitElement, html, css, unsafeCSS } from 'lit' -import widgetsGui from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/widgets.png' -import { playSound, loadSound } from '../../basicSounds' - -class Button extends LitElement { - static get styles () { - return css` - .button { - --txrV: 66px; - position: relative; - width: 200px; - height: 20px; - font-family: minecraft, mojangles, monospace; - font-size: 10px; - color: white; - text-shadow: 1px 1px #222; - border: none; - z-index: 1; - outline: none; - display: inline-flex; - justify-content: center; - align-items: center; - } - - .button:hover, - .button:focus-visible { - --txrV: 86px; - } - - .button:disabled { - --txrV: 46px; - color: #A0A0A0; - text-shadow: 1px 1px #111; - } - - .button::after { - content: ''; - display: block; - position: absolute; - top: 0; - left: 0; - width: calc(50% + 1px); - height: 20px; - background: url('${unsafeCSS(widgetsGui)}'); - background-size: 256px; - background-position-y: calc(var(--txrV) * -1); - z-index: -1; - } - - .button::before { - content: ''; - display: block; - position: absolute; - top: 0; - left: 50%; - width: 50%; - height: 20px; - background: url('${unsafeCSS(widgetsGui)}'); - background-size: 256px; - background-position-x: calc(-200px + 100%); - background-position-y: calc(var(--txrV) * -1); - z-index: -1; - } - - .icon { - position: absolute; - top: 3px; - left: 3px; - font-size: 14px; - } - ` - } - - static get properties () { - return { - label: { - type: String, - attribute: 'pmui-label' - }, - width: { - type: String, - attribute: 'pmui-width' - }, - disabled: { - type: Boolean, - }, - onPress: { - type: Function, - attribute: 'pmui-click' - }, - icon: { - type: Function, - attribute: 'pmui-icon' - }, - testId: { - type: String, - attribute: 'pmui-test-id' - } - } - } - - constructor () { - super() - this.label = '' - this.icon = undefined - this.testId = undefined - this.disabled = false - this.width = '200px' - this.onPress = () => { } - } - - render () { - return html` - - ` - } - - onBtnClick (e) { - playSound('button_click.mp3') - this.dispatchEvent(new window.CustomEvent('pmui-click', { detail: e })) - } -} - -loadSound('button_click.mp3') -window.customElements.define('pmui-button', Button) diff --git a/src/menus/components/common.js b/src/menus/components/common.js deleted file mode 100644 index 83c74abd..00000000 --- a/src/menus/components/common.js +++ /dev/null @@ -1,60 +0,0 @@ -import { css } from 'lit' - -const commonCss = css` - .bg { - position: absolute; - top: 0; - left: 0; - background: rgba(0, 0, 0, 0.75); - width: 100%; - height: 100%; - } - - .title { - position: absolute; - top: 0; - left: 50%; - transform: translate(-50%); - font-size: 10px; - color: white; - text-align: center; - text-shadow: 1px 1px #222; - } - - .text { - color: white; - font-size: 10px; - text-shadow: 1px 1px #222; - } -` - -/** @returns {boolean} */ -function isMobile () { - return window.matchMedia('(pointer: coarse)').matches || navigator.userAgent.includes('Mobile') -} - -// todo there are better workarounds and proper way to detect notch -/** @returns {boolean} */ -function isProbablyIphone () { - if (!isMobile()) return false - const smallest = window.innerWidth < window.innerHeight ? window.innerWidth : window.innerHeight - return smallest < 600 -} - -/** - * @param {string} url - */ -function openURL (url, newTab = true) { - if (newTab) { - window.open(url, '_blank', 'noopener,noreferrer') - } else { - window.open(url, '_self') - } -} - -export { - isProbablyIphone, - commonCss, - isMobile, - openURL, -} diff --git a/src/menus/components/edit_box.js b/src/menus/components/edit_box.js deleted file mode 100644 index c7210d43..00000000 --- a/src/menus/components/edit_box.js +++ /dev/null @@ -1,161 +0,0 @@ -const { LitElement, html, css } = require('lit') -const { ifDefined } = require('lit/directives/if-defined.js') - -class EditBox extends LitElement { - static get styles () { - return css` - .edit-container { - position: relative; - width: 200px; - height: 20px; - background: black; - border: 1px solid grey; - } - .edit-container.invalid { - border: 1px solid #c70000; - } - - .edit-container.warning { - border: 1px solid rgb(159, 151, 0); - } - - .edit-container.invalid:hover, - .edit-container.invalid:focus-within { - border-color: red; - } - .edit-container.warning:hover, - .edit-container.warning:focus-within { - border-color: yellow; - } - - .edit-container:hover, - .edit-container:focus-within { - border-color: white; - } - - .edit-container label { - position: absolute; - z-index: 2; - pointer-events: none; - bottom: 21px; - left: 0; - font-size: 10px; - color: rgb(206, 206, 206); - text-shadow: 1px 1px black; - } - - .edit-box { - position: relative; - outline: none; - border: none; - background: none; - left: 1px; - width: calc(100% - 2px); - height: 100%; - font-family: minecraft, mojangles, monospace; - font-size: 10px; - color: white; - text-shadow: 1px 1px #222; - } - - input::-webkit-outer-spin-button, - input::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; - } - - /* Firefox */ - input[type=number] { - appearance: textfield; - -moz-appearance: textfield; - } - ` - } - - constructor () { - super() - this.width = '200px' - this.id = '' - this.value = '' - this.label = '' - this.required = false - } - - static get properties () { - return { - width: { - type: String, - attribute: 'pmui-width' - }, - id: { - type: String, - attribute: 'pmui-id' - }, - label: { - type: String, - attribute: 'pmui-label' - }, - value: { - type: String, - attribute: 'pmui-value' - }, - autocompleteValues: { - type: Array, - }, - type: { - type: String, - attribute: 'pmui-type' - }, - inputMode: { - type: String, - attribute: 'pmui-inputmode' - }, - required: { - type: Boolean, - attribute: 'pmui-required' - }, - placeholder: { - type: String, - attribute: 'pmui-placeholder' - }, - state: { - type: String, - attribute: true - } - } - } - - render () { - return html` -
- - ${this.autocompleteValues ? html` - - ${this.autocompleteValues.map(value => html` - - `)} - - ` : ''} - { this.value = this.inputMode === 'decimal' ? value.replaceAll(',', '.') : value }} - class="edit-box"> -
- ` - } -} - -window.customElements.define('pmui-editbox', EditBox) diff --git a/src/menus/play_screen.js b/src/menus/play_screen.js deleted file mode 100644 index e9517d9e..00000000 --- a/src/menus/play_screen.js +++ /dev/null @@ -1,250 +0,0 @@ -//@ts-check -const { LitElement, html, css } = require('lit') -const viewerSupportedVersions = require('prismarine-viewer/viewer/supportedVersions.json') -const { supportedVersions } = require('minecraft-protocol') -const { hideCurrentModal, miscUiState } = require('../globalState') -const { commonCss } = require('./components/common') - -const fullySupporedVersions = viewerSupportedVersions - -class PlayScreen extends LitElement { - static get styles () { - return css` - ${commonCss} - .title { - top: 12px; - } - - .edit-boxes { - position: fixed; - top: 59px; - left: 50%; - display: flex; - flex-direction: column; - gap: 14px 0; - transform: translate(-50%); - width: 310px; - } - - .wrapper { - width: 100%; - display: flex; - flex-direction: row; - gap: 0 4px; - } - - .button-wrapper { - display: flex; - flex-direction: row; - gap: 0 4px; - position: absolute; - bottom: 9px; - left: 50%; - transform: translate(-50%); - width: 310px; - } - - .extra-info-version { - font-size: 10px; - color: rgb(206, 206, 206); - text-shadow: 1px 1px black; - position: absolute; - left: calc(50% + 2px); - bottom: -34px; - } - - .extra-info-proxy { - font-size: 8px; - color: rgb(206, 206, 206); - text-shadow: 1px 1px black; - margin:0; - margin-top:-12px; - } - - a { - color: white; - } - ` - } - - static get properties () { - return { - server: { type: String }, - serverImplicit: { type: String }, - serverport: { type: Number }, - proxy: { type: String }, - proxyImplicit: { type: String }, - proxyport: { type: Number }, - username: { type: String }, - password: { type: String }, - version: { type: String } - } - } - - constructor () { - super() - this.version = '' - this.serverport = '' - this.proxyport = '' - this.server = '' - this.proxy = '' - this.username = '' - this.password = '' - this.serverImplicit = '' - this.proxyImplicit = '' - // todo set them sooner add indicator - void window.fetch('config.json').then(async res => res.json()).then(c => c, (error) => { - console.warn('Failed to load optional config.json', error) - return {} - }).then(async (/** @type {import('../globalState').AppConfig} */config) => { - miscUiState.appConfig = config - const params = new URLSearchParams(window.location.search) - - const getParam = (localStorageKey, qs = localStorageKey) => { - const qsValue = qs ? params.get(qs) : undefined - if (qsValue) { - this.style.display = 'block' - } - return qsValue || window.localStorage.getItem(localStorageKey) - } - - if (config.defaultHost === '' || config.defaultHostSave === '') { - let proxy = config.defaultProxy || config.defaultProxySave || params.get('proxy') - const cleanUrl = url => url.replaceAll(/(https?:\/\/|\/$)/g, '') - if (proxy && cleanUrl(proxy) !== cleanUrl(location.origin + location.pathname)) { - if (!proxy.startsWith('http')) proxy = 'https://' + proxy - const proxyConfig = await fetch(proxy + '/config.json').then(async res => res.json()).then(c => c, (error) => { - console.warn(`Failed to load config.json from proxy ${proxy}`, error) - return {} - }) - if (config.defaultHost === '' && proxyConfig.defaultHost) { - config.defaultHost = proxyConfig.defaultHost - } else { - config.defaultHost = '' - } - if (config.defaultHostSave === '' && proxyConfig.defaultHostSave) { - config.defaultHostSave = proxyConfig.defaultHostSave - } else { - config.defaultHostSave = '' - } - } - this.server = this.serverImplicit - } - - this.serverImplicit = config.defaultHost ?? '' - this.proxyImplicit = config.defaultProxy ?? '' - this.server = getParam('server', 'ip') ?? config.defaultHostSave ?? '' - this.proxy = getParam('proxy') ?? config.defaultProxySave ?? '' - this.version = getParam('version') || (window.localStorage.getItem('version') ?? config.defaultVersion ?? '') - this.username = getParam('username') || 'pviewer' + (Math.floor(Math.random() * 1000)) - this.password = getParam('password') || '' - if (process.env.NODE_ENV === 'development' && params.get('reconnect') && this.server && this.username) { - this.onConnectPress() - } - }) - } - - render () { - return html` -
- -

Join a Server

- -
-
- { this.server = e.target.value }} - > - { this.serverport = e.target.value }} - > -
-
- { this.proxy = e.target.value }} - > - { this.proxyport = e.target.value }} - > -
-
-

Enter proxy url you want to use. Learn more.

-
-
- { this.username = e.target.value }} - > - { this.version = e.target.value = e.target.value.replaceAll(',', '.') }} - > -
-

Leave blank and it will be chosen automatically

-
- -
- - hideCurrentModal()}> -
- ` - } - - onConnectPress () { - const server = this.server ? `${this.server}${this.serverport && `:${this.serverport}`}` : this.serverImplicit - const proxy = this.proxy ? `${this.proxy}${this.proxyport && `:${this.proxyport}`}` : this.proxyImplicit - - window.localStorage.setItem('username', this.username) - window.localStorage.setItem('password', this.password) - window.localStorage.setItem('server', server) - window.localStorage.setItem('proxy', proxy) - window.localStorage.setItem('version', this.version) - - window.dispatchEvent(new window.CustomEvent('connect', { - detail: { - server, - proxy, - username: this.username, - password: this.password, - botVersion: this.version - } - })) - } -} - -window.customElements.define('pmui-playscreen', PlayScreen) diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index 2457c34f..1c92a39c 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -1,7 +1,7 @@ import { useState } from 'react' import { useSnapshot } from 'valtio' +import { openURL } from 'prismarine-viewer/viewer/lib/simpleUtils' import { miscUiState, openOptionsMenu, showModal } from './globalState' -import { openURL } from './menus/components/common' import { AppOptions, options } from './optionsStorage' import Button from './react/Button' import { OptionMeta, OptionSlider } from './react/OptionsItems' diff --git a/src/react/AddServer.tsx b/src/react/AddServer.tsx new file mode 100644 index 00000000..bae39ac9 --- /dev/null +++ b/src/react/AddServer.tsx @@ -0,0 +1,110 @@ +import React from 'react' +import Screen from './Screen' +import Input from './Input' +import Button from './Button' +import { useIsSmallWidth } from './simpleHooks' + +export interface NewServerInfo { + ip: string + name?: string + versionOverride?: string + proxyOverride?: string + usernameOverride?: string + passwordOverride?: string +} + +interface Props { + onBack: () => void + onConfirm: (info: NewServerInfo) => void + title?: string + initialData?: NewServerInfo + parseQs?: boolean + onQsConnect?: (server: NewServerInfo) => void + defaults?: Pick +} + +export default ({ onBack, onConfirm, title = 'Add a Server', initialData, parseQs, onQsConnect, defaults }: Props) => { + const qsParams = parseQs ? new URLSearchParams(window.location.search) : undefined + + const [serverName, setServerName] = React.useState(initialData?.name ?? qsParams?.get('name') ?? '') + + const ipWithoutPort = initialData?.ip.split(':')[0] + const port = initialData?.ip.split(':')[1] + + const [serverIp, setServerIp] = React.useState(ipWithoutPort ?? qsParams?.get('ip') ?? '') + const [serverPort, setServerPort] = React.useState(port ?? '') + const [versionOverride, setVersionOverride] = React.useState(initialData?.versionOverride ?? qsParams?.get('version') ?? '') + const [proxyOverride, setProxyOverride] = React.useState(initialData?.proxyOverride ?? qsParams?.get('proxy') ?? '') + const [usernameOverride, setUsernameOverride] = React.useState(initialData?.usernameOverride ?? qsParams?.get('username') ?? '') + const [passwordOverride, setPasswordOverride] = React.useState(initialData?.passwordOverride ?? qsParams?.get('password') ?? '') + const smallWidth = useIsSmallWidth() + + return +
{ + e.preventDefault() + let ip = serverIp.includes(':') ? serverIp : `${serverIp}:${serverPort}` + ip = ip.replace(/:$/, '') + onConfirm({ + name: serverName, + ip, + versionOverride, + proxyOverride, + usernameOverride, + passwordOverride + }) + }} + > +
+
+ setServerName(value)} placeholder='Defaults to IP' /> +
+ setServerIp(value)} /> + setServerPort(value)} placeholder='25565' /> +
Overrides:
+ setVersionOverride(value)} placeholder='Optional, but recommended to specify' /> + setProxyOverride(value)} placeholder={defaults?.proxyOverride} /> + setUsernameOverride(value)} placeholder={defaults?.usernameOverride} /> + setPasswordOverride(value)} /* placeholder='For advanced usage only' */ /> + + + {qsParams?.get('ip') &&
+ +
} +
+
+
+} + +const InputWithLabel = ({ label, span, ...props }: React.ComponentProps & { label, span?}) => { + return
+ + +
+} diff --git a/src/react/Button.tsx b/src/react/Button.tsx index 4d346b14..db7e575a 100644 --- a/src/react/Button.tsx +++ b/src/react/Button.tsx @@ -15,7 +15,7 @@ interface Props extends React.ComponentProps<'button'> { void loadSound('button_click.mp3') -export default (({ label, icon, children, inScreen, rootRef, ...args }) => { +export default (({ label, icon, children, inScreen, rootRef, type = 'button', ...args }) => { const onClick = (e) => { void playSound('button_click.mp3') args.onClick?.(e) @@ -29,7 +29,7 @@ export default (({ label, icon, children, inScreen, rootRef, ...args }) => { args.style.width = 20 } - return +
+ } + searchRowChildrenOverride={ +
+
+ Proxy: +
+ + {autocomplete.groupedOptions &&
    + {autocomplete.groupedOptions.map((proxy, index) => { + const { itemRef, ...optionProps } = autocomplete.getOptionProps({ option: proxy, index }) + return + })} +
} +
+ + setUsername(value)} /> +
+
+ } + serversLayout + onWorldAction={(action, serverName) => { + if (action === 'load') { + joinServer(serverName, {}) + } + props.onWorldAction?.(action, serverName) + }} + /> +} + +type Status = 'unknown' | 'error' | 'success' + +const ProxyRender = ({ status, ip, inputRef, value, setValue, ...props }: { + status: Status + ip: string +} & Record) => { + const iconPerStatus = { + unknown: 'cellular-signal-0', + error: 'cellular-signal-off', + success: 'cellular-signal-3', + } + + return
+ setValue?.(value)} + onChange={props.onChange} + /> +
+ +
+ {ip} +
+
+
+} diff --git a/src/react/ServersListProvider.tsx b/src/react/ServersListProvider.tsx new file mode 100644 index 00000000..ecd74916 --- /dev/null +++ b/src/react/ServersListProvider.tsx @@ -0,0 +1,339 @@ +import { useEffect, useMemo, useState } from 'react' +import { proxy } from 'valtio' +import { qsOptions } from '../optionsStorage' +import { ConnectOptions } from '../connect' +import { hideCurrentModal, miscUiState, showModal } from '../globalState' +import ServersList from './ServersList' +import AddServer from './AddServer' +import { useDidUpdateEffect, useIsModalActive } from './utils' + +interface StoreServerItem { + ip: string, + name?: string + version?: string + lastJoined?: number + description?: string + proxyOverride?: string + usernameOverride?: string + passwordOverride?: string + optionsOverride?: Record + autoLogin?: Record +} + +type ServerResponse = { + version: { + name_raw: string + } + // display tooltip + players?: { + online: number + max: number + list: Array<{ + name_raw: string + name_clean: string + }> + } + icon: string + motd: { + raw: string + } + // todo circle error icon + mods?: Array<{ name, version }> + // todo display via hammer icon + software?: string + plugins?: Array<{ name, version }> +} + +type AdditionalDisplayData = { + formattedText: string + textNameRight: string + icon?: string +} + +const getInitialServersList = () => { + if (localStorage['serversList']) return JSON.parse(localStorage['serversList']) as StoreServerItem[] + + const servers = [] as StoreServerItem[] + + const legacyServersList = localStorage['serverHistory'] ? JSON.parse(localStorage['serverHistory']) as string[] : null + if (legacyServersList) { + for (const server of legacyServersList) { + if (!server || localStorage['server'] === server) continue + servers.push({ ip: server, lastJoined: Date.now() }) + } + } + + if (localStorage['server']) { + const legacyLastJoinedServer: StoreServerItem = { + ip: localStorage['server'], + passwordOverride: localStorage['password'], + version: localStorage['version'], + lastJoined: Date.now() + } + servers.push(legacyLastJoinedServer) + } + + if (servers.length === 0) { // server list is empty, let's suggest some + for (const server of miscUiState.appConfig?.promoteServers ?? []) { + servers.push({ + ip: server.ip, + description: server.description, + version: server.version, + }) + } + } + + return servers +} + +const setNewServersList = (serversList: StoreServerItem[]) => { + localStorage['serversList'] = JSON.stringify(serversList) + + // cleanup legacy + localStorage.removeItem('serverHistory') + localStorage.removeItem('server') + localStorage.removeItem('password') + localStorage.removeItem('version') +} + +const getInitialProxies = () => { + const proxies = [] as string[] + if (miscUiState.appConfig?.defaultProxy) { + proxies.push(miscUiState.appConfig.defaultProxy) + } + if (localStorage['proxy']) { + proxies.push(localStorage['proxy']) + localStorage.removeItem('proxy') + } + return proxies +} + +export const updateLoadedServerData = (callback: (data: StoreServerItem) => StoreServerItem) => { + // function assumes component is not mounted to avoid sync issues after save + const { loadedServerIndex } = miscUiState + if (!loadedServerIndex) return + const servers = getInitialServersList() + const server = servers[loadedServerIndex] + servers[loadedServerIndex] = callback(server) + setNewServersList(servers) +} + +const Inner = () => { + const [proxies, setProxies] = useState(localStorage['proxies'] ? JSON.parse(localStorage['proxies']) : getInitialProxies()) + const [selectedProxy, setSelectedProxy] = useState(localStorage.getItem('selectedProxy') ?? proxies?.[0] ?? '') + const [serverEditScreen, setServerEditScreen] = useState(null) // true for add + const [defaultUsername, setDefaultUsername] = useState(localStorage['username'] ?? (`mcrafter${Math.floor(Math.random() * 1000)}`)) + + useEffect(() => { + localStorage.setItem('username', defaultUsername) + }, [defaultUsername]) + + useEffect(() => { + // TODO! do not unmount on connecting screen + // if (proxies.length) { + // localStorage.setItem('proxies', JSON.stringify(proxies)) + // } + // if (selectedProxy) { + // localStorage.setItem('selectedProxy', selectedProxy) + // } + }, [proxies]) + + const [serversList, setServersList] = useState(() => getInitialServersList()) + const [additionalData, setAdditionalData] = useState>({}) + + useDidUpdateEffect(() => { + // save data only on user changes + setNewServersList(serversList) + }, [serversList]) + + // by lastJoined + const serversListSorted = useMemo(() => { + return serversList.map((server, index) => ({ ...server, index })).sort((a, b) => (b.lastJoined ?? 0) - (a.lastJoined ?? 0)) + }, [serversList]) + + useEffect(() => { + const update = async () => { + for (const server of serversListSorted) { + const isInLocalNetwork = server.ip.startsWith('192.168.') || server.ip.startsWith('10.') || server.ip.startsWith('172.') || server.ip.startsWith('127.') || server.ip.startsWith('localhost') + if (isInLocalNetwork) continue + // eslint-disable-next-line no-await-in-loop + await fetch(`https://api.mcstatus.io/v2/status/java/${server.ip}`).then(async r => r.json()).then((data: ServerResponse) => { + const versionClean = data.version.name_raw.replace(/^[^\d.]+/, '') + setAdditionalData(old => { + return ({ + ...old, + [server.ip]: { + formattedText: data.motd.raw, + textNameRight: `${versionClean} ${data.players?.online ?? '??'}/${data.players?.max ?? '??'}`, + icon: data.icon, + } + }) + }) + }) + } + } + void update() + }, [serversListSorted]) + + const isEditScreenModal = useIsModalActive('editServer') + + useEffect(() => { + if (!isEditScreenModal) { + setServerEditScreen(null) + } + }, [isEditScreenModal]) + + useEffect(() => { + if (serverEditScreen && !isEditScreenModal) { + showModal({ reactType: 'editServer' }) + } + }, [serverEditScreen]) + + if (isEditScreenModal) { + return { + hideCurrentModal() + }} + onConfirm={(info) => { + if (!serverEditScreen) return + if (serverEditScreen === true) { + const server: StoreServerItem = { ...info, lastJoined: Date.now() } // so it appears first + setServersList(old => [...old, server]) + } else { + const index = serversList.indexOf(serverEditScreen) + serversList[index] = info + setServersList([...serversList]) + } + setServerEditScreen(null) + }} + initialData={!serverEditScreen || serverEditScreen === true ? undefined : serverEditScreen} + onQsConnect={(info) => { + const connectOptions: ConnectOptions = { + username: info.usernameOverride || defaultUsername, + server: info.ip, + proxy: info.proxyOverride || selectedProxy, + botVersion: info.versionOverride, + password: info.passwordOverride, + ignoreQs: true, + } + dispatchEvent(new CustomEvent('connect', { detail: connectOptions })) + }} + /> + } + + return { + let ip = indexOrIp + let server: StoreServerItem | undefined + if (overrides.shouldSave === undefined) { + // hack: inner component doesn't know of overrides for existing servers + server = serversListSorted.find(s => s.index.toString() === indexOrIp)! + ip = server.ip + overrides = server + } + + const lastJoinedUsername = serversListSorted.find(s => s.usernameOverride)?.usernameOverride + let username = overrides.username || defaultUsername + if (!username) { + username = prompt('Username', lastJoinedUsername || '') + if (!username) return + setDefaultUsername(username) + } + const options = { + username, + server: ip, + proxy: overrides.proxy || selectedProxy, + botVersion: overrides.version, + password: overrides.password, + ignoreQs: true, + autoLoginPassword: server?.autoLogin?.[username], + onSuccessfulPlay () { + if (overrides.shouldSave && !serversList.some(s => s.ip === ip)) { + const newServersList = [...serversList, { + ip, + lastJoined: Date.now(), + }] + // setServersList(newServersList) + setNewServersList(newServersList) // component is not mounted + } + + if (overrides.shouldSave === undefined) { // loading saved + // find and update + const server = serversList.find(s => s.ip === ip) + if (server) { + server.lastJoined = Date.now() + // setServersList([...serversList]) + setNewServersList(serversList) // component is not mounted + } + } + + // save new selected proxy (if new) + if (!proxies.includes(selectedProxy)) { + // setProxies([...proxies, selectedProxy]) + localStorage.setItem('proxies', JSON.stringify([...proxies, selectedProxy])) + } + if (selectedProxy) { + localStorage.setItem('selectedProxy', selectedProxy) + } + }, + serverIndex: overrides.shouldSave ? serversList.length.toString() : indexOrIp // assume last + } satisfies ConnectOptions + dispatchEvent(new CustomEvent('connect', { detail: options })) + // qsOptions + }} + username={defaultUsername} + setUsername={setDefaultUsername} + onWorldAction={(action, index) => { + const server = serversList[index] + if (!server) return + + if (action === 'edit') { + setServerEditScreen(server) + } + if (action === 'delete') { + setServersList(old => old.filter(s => s !== server)) + } + }} + onGeneralAction={(action) => { + if (action === 'create') { + setServerEditScreen(true) + } + if (action === 'cancel') { + hideCurrentModal() + } + }} + worldData={serversListSorted.map(server => { + const additional = additionalData[server.ip] + return { + name: server.index.toString(), + title: server.name || server.ip, + detail: (server.version ?? '') + ' ' + (server.usernameOverride ?? ''), + // lastPlayed: server.lastJoined, + formattedTextOverride: additional?.formattedText, + worldNameRight: additional?.textNameRight ?? '', + iconSrc: additional?.icon, + } + })} + initialProxies={{ + proxies, + selected: selectedProxy, + }} + updateProxies={({ proxies, selected }) => { + // new proxy is saved in joinServer + setProxies(proxies) + setSelectedProxy(selected) + }} + /> +} + +export default () => { + const editServerModalActive = useIsModalActive('editServer') + const isServersListModalActive = useIsModalActive('serversList') + const eitherModal = isServersListModalActive || editServerModalActive + return eitherModal ? : null +} diff --git a/src/react/Singleplayer.tsx b/src/react/Singleplayer.tsx index a4d8c559..76a75e82 100644 --- a/src/react/Singleplayer.tsx +++ b/src/react/Singleplayer.tsx @@ -10,22 +10,25 @@ import styles from './singleplayer.module.css' import Input from './Input' import Button from './Button' import Tabs from './Tabs' +import MessageFormattedString from './MessageFormattedString' export interface WorldProps { name: string title: string - iconBase64?: string size?: number lastPlayed?: number isFocused?: boolean - onFocus?: (name: string) => void + iconSrc?: string detail?: string + formattedTextOverride?: string + worldNameRight?: string + onFocus?: (name: string) => void onInteraction?(interaction: 'enter' | 'space') } -const World = ({ name, isFocused, title, lastPlayed, size, detail = '', onFocus, onInteraction, iconBase64 }: WorldProps) => { +const World = ({ name, isFocused, title, lastPlayed, size, detail = '', onFocus, onInteraction, iconSrc, formattedTextOverride, worldNameRight }: WorldProps) => { const timeRelativeFormatted = useMemo(() => { - if (!lastPlayed) return + if (!lastPlayed) return '' const formatter = new Intl.RelativeTimeFormat('en', { numeric: 'auto' }) const diff = Date.now() - lastPlayed const minutes = Math.floor(diff / 1000 / 60) @@ -38,7 +41,7 @@ const World = ({ name, isFocused, title, lastPlayed, size, detail = '', onFocus, return formatter.format(-minutes, 'minute') }, [lastPlayed]) const sizeFormatted = useMemo(() => { - if (!size) return + if (!size) return '' return filesize(size) }, [size]) @@ -48,18 +51,29 @@ const World = ({ name, isFocused, title, lastPlayed, size, detail = '', onFocus, onInteraction?.(e.code === 'Enter' ? 'enter' : 'space') } }} onDoubleClick={() => onInteraction?.('enter')}> - world preview + world preview
-
{title}
-
{timeRelativeFormatted} {detail.slice(-30)}
-
{sizeFormatted}
+
+
{title}
+
{worldNameRight}
+
+ {formattedTextOverride ?
+ +
: + <> +
{timeRelativeFormatted} {detail.slice(-30)}
+
{sizeFormatted}
+ }
} interface Props { worldData: WorldProps[] | null // null means loading - providers: Record + serversLayout?: boolean + firstRowChildrenOverride?: React.ReactNode + searchRowChildrenOverride?: React.ReactNode + providers?: Record activeProvider?: string setActiveProvider?: (provider: string) => void providerActions?: Record void) | undefined | JSX.Element> @@ -74,9 +88,24 @@ interface Props { onGeneralAction (action: 'cancel' | 'create'): void } -export default ({ worldData, onGeneralAction, onWorldAction, activeProvider, setActiveProvider, providerActions, providers, disabledProviders, error, isReadonly, warning, warningAction, warningActionLabel }: Props) => { +export default ({ + worldData, + onGeneralAction, + onWorldAction, + firstRowChildrenOverride, + serversLayout, + searchRowChildrenOverride, + activeProvider, + setActiveProvider, + providerActions, + providers = {}, + disabledProviders, + error, + isReadonly, + warning, warningAction, warningActionLabel +}: Props) => { const containerRef = useRef() - const firstButton = useRef(null!) + const firstButton = useRef(null) useTypedEventListener(window, 'keydown', (e) => { if (e.code === 'ArrowDown' || e.code === 'ArrowUp') { @@ -100,10 +129,10 @@ export default ({ worldData, onGeneralAction, onWorldAction, activeProvider, set return
-
- Select Saved World + {serversLayout ? 'Join Java Servers' : 'Select Saved World'} + {searchRowChildrenOverride ||
setSearch(value)} /> -
+
}
{ setActiveProvider?.(tab as any) @@ -147,15 +176,17 @@ export default ({ worldData, onGeneralAction, onWorldAction, activeProvider, set }
-
-
- +
+ {firstRowChildrenOverride ||
+ -
+
}
- + {serversLayout ? : } - + {serversLayout ? + : + }
diff --git a/src/react/SingleplayerProvider.tsx b/src/react/SingleplayerProvider.tsx index 8eb3af0f..35704e8e 100644 --- a/src/react/SingleplayerProvider.tsx +++ b/src/react/SingleplayerProvider.tsx @@ -85,7 +85,7 @@ export const readWorlds = (abortController: AbortController) => { title: levelName ?? folder, lastPlayed: levelDat.LastPlayed && longArrayToNumber(levelDat.LastPlayed), detail: `${levelDat.Version?.Name ?? 'unknown version'}, ${folder}`, - iconBase64, + iconSrc: iconBase64 ? `data:image/png;base64,${iconBase64}` : undefined, size, } satisfies WorldProps }))).filter((x, i) => { diff --git a/src/react/input.module.css b/src/react/input.module.css index 9ad01c90..ce889645 100644 --- a/src/react/input.module.css +++ b/src/react/input.module.css @@ -1,39 +1,40 @@ .container { - position: relative; - width: 200px; - height: 20px; - background: black; - border: 1px solid grey; - box-sizing: content-box; + position: relative; + width: 200px; + height: 20px; + background: black; + border: 1px solid grey; + box-sizing: content-box; } .input { - position: relative; - outline: none; - border: none; - background: none; - left: 1px; - width: calc(100% - 2px); - height: 100%; - font-family: minecraft, mojangles, monospace; - font-size: 10px; - color: white; - text-shadow: 1px 1px #222; + position: relative; + outline: none; + border: none; + background: none; + left: 1px; + width: calc(100% - 2px); + height: 100%; + font-family: minecraft, mojangles, monospace; + font-size: 10px; + color: white; + text-shadow: 1px 1px #222; + padding-left: 2px; } .container:hover, - .container:focus-within { - border-color: white; - } +.container:focus-within { + border-color: white; +} - input::-webkit-outer-spin-button, - input::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; - } +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} - /* Firefox */ - input[type=number] { - appearance: textfield; - -moz-appearance: textfield; - } +/* Firefox */ +input[type=number] { + appearance: textfield; + -moz-appearance: textfield; +} diff --git a/src/react/simpleHooks.ts b/src/react/simpleHooks.ts new file mode 100644 index 00000000..9202bfa2 --- /dev/null +++ b/src/react/simpleHooks.ts @@ -0,0 +1,6 @@ +import { useMedia } from 'react-use' + +const SMALL_SCREEN_MEDIA = '@media (max-width: 440px)' +export const useIsSmallWidth = () => { + return useMedia(SMALL_SCREEN_MEDIA.replace('@media ', '')) +} diff --git a/src/react/singleplayer.module.css b/src/react/singleplayer.module.css index 1e092b39..fef43b76 100644 --- a/src/react/singleplayer.module.css +++ b/src/react/singleplayer.module.css @@ -28,11 +28,25 @@ display: flex; outline: none; } +.world_title { + display: flex; + justify-content: space-between; + align-items: center; +} +.world_title_right { + color: #999; + font-size: 9px; +} .world_info { margin-left: 3px; display: flex; flex-direction: column; font-size: 11px; + white-space: nowrap; +} +.world_info_formatted { + font-size: 10px; + white-space: pre; } .world_info_description_line { color: #999; diff --git a/src/reactUi.tsx b/src/reactUi.tsx index 4c5f1516..419d8dff 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -33,6 +33,7 @@ import TouchAreasControlsProvider from './react/TouchAreasControlsProvider' import NotificationProvider, { showNotification } from './react/NotificationProvider' import HotbarRenderApp from './react/HotbarRenderApp' import Crosshair from './react/Crosshair' +import ServersListProvider from './react/ServersListProvider' const RobustPortal = ({ children, to }) => { return createPortal({children}, to) @@ -139,6 +140,7 @@ const App = () => { + diff --git a/src/watchOptions.ts b/src/watchOptions.ts index 009463be..56fc9c2c 100644 --- a/src/watchOptions.ts +++ b/src/watchOptions.ts @@ -2,10 +2,10 @@ import { subscribeKey } from 'valtio/utils' import { WorldRendererThree } from 'prismarine-viewer/viewer/lib/worldrendererThree' +import { isMobile } from 'prismarine-viewer/viewer/lib/simpleUtils' import { options, watchValue } from './optionsStorage' import { reloadChunks } from './utils' import { miscUiState } from './globalState' -import { isMobile } from './menus/components/common' subscribeKey(options, 'renderDistance', reloadChunks) subscribeKey(options, 'multiplayerRenderDistance', reloadChunks) From ab9e5db4453e7a31d33f30e0e4439030a4e517d2 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sun, 5 May 2024 02:58:08 +0300 Subject: [PATCH 0158/1195] up flying squid --- package.json | 4 +- pnpm-lock.yaml | 165 +++++++++++++------------------------------------ 2 files changed, 44 insertions(+), 125 deletions(-) diff --git a/package.json b/package.json index 4d99a6d5..d1f4c7eb 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "esbuild": "^0.19.3", "esbuild-plugin-polyfill-node": "^0.3.0", "express": "^4.18.2", - "flying-squid": "npm:@zardoy/flying-squid@^0.0.17", + "flying-squid": "npm:@zardoy/flying-squid@^0.0.19", "fs-extra": "^11.1.1", "google-drive-browserfs": "github:zardoy/browserfs#google-drive", "iconify-icon": "^1.0.8", @@ -96,8 +96,6 @@ "@storybook/blocks": "^7.4.6", "@storybook/react": "^7.4.6", "@storybook/react-vite": "^7.4.6", - "@storybook/web-components": "^7.4.6", - "@storybook/web-components-vite": "^7.4.6", "@types/lodash-es": "^4.17.9", "@types/react-transition-group": "^4.4.7", "@types/stats.js": "^0.17.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ef5b1d0..9d1b69cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,8 +93,8 @@ importers: specifier: ^4.18.2 version: 4.18.2 flying-squid: - specifier: npm:@zardoy/flying-squid@^0.0.17 - version: '@zardoy/flying-squid@0.0.17(encoding@0.1.13)' + specifier: npm:@zardoy/flying-squid@^0.0.19 + version: '@zardoy/flying-squid@0.0.19(encoding@0.1.13)' fs-extra: specifier: ^11.1.1 version: 11.1.1 @@ -130,7 +130,7 @@ importers: version: 6.1.1 prismarine-provider-anvil: specifier: github:zardoy/prismarine-provider-anvil#everything - version: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0) + version: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29(minecraft-data@3.62.0) prosemirror-example-setup: specifier: ^1.2.2 version: 1.2.2 @@ -211,12 +211,6 @@ importers: '@storybook/react-vite': specifier: ^7.4.6 version: 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@2.79.1)(typescript@5.5.0-beta)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) - '@storybook/web-components': - specifier: ^7.4.6 - version: 7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/web-components-vite': - specifier: ^7.4.6 - version: 7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.5.0-beta)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) '@types/lodash-es': specifier: ^4.17.9 version: 4.17.9 @@ -409,7 +403,7 @@ importers: dependencies: vite: specifier: ^4.4.9 - version: 4.4.10(@types/node@20.12.7)(terser@5.19.2) + version: 4.4.10(@types/node@20.12.8)(terser@5.19.2) packages: @@ -1922,12 +1916,6 @@ packages: '@juggle/resize-observer@3.3.1': resolution: {integrity: sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==} - '@lit-labs/ssr-dom-shim@1.1.1': - resolution: {integrity: sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==} - - '@lit/reactive-element@1.6.3': - resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} - '@mapbox/node-pre-gyp@1.0.11': resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true @@ -2619,19 +2607,6 @@ packages: '@storybook/types@7.4.6': resolution: {integrity: sha512-6QLXtMVsFZFpzPkdGWsu/iuc8na9dnS67AMOBKm5qCLPwtUJOYkwhMdFRSSeJthLRpzV7JLAL8Kwvl7MFP3QSw==} - '@storybook/web-components-vite@7.4.6': - resolution: {integrity: sha512-L/y6MTLbqfHaM0faK9Yl8n5PIyW4daZrtk7NfaOT6UjgNFjOx3o4CctYew6oj90cNk5HdZQX2OZny043GxDLZw==} - engines: {node: ^14.18 || >=16} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/web-components@7.4.6': - resolution: {integrity: sha512-HWqkZtdkmNimkzMmE0mGRys2ee9qgEeDVCruiffySVquBRMQ6n1xgvHZYaO6OLlMeH0YHPg083ZqUasS5GsYVg==} - engines: {node: '>=16.0.0'} - peerDependencies: - lit: ^2.0.0 - '@surma/rollup-plugin-off-main-thread@2.2.3': resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} @@ -2792,8 +2767,8 @@ packages: '@types/node@20.11.19': resolution: {integrity: sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==} - '@types/node@20.12.7': - resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + '@types/node@20.12.8': + resolution: {integrity: sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==} '@types/node@20.8.0': resolution: {integrity: sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==} @@ -2837,8 +2812,8 @@ packages: '@types/react@18.2.20': resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} - '@types/readable-stream@4.0.11': - resolution: {integrity: sha512-R3eUMUTTKoIoaz7UpYLxvZCrOmCRPRbAmoDDHKcimTEySltaJhF8hLzj4+EzyDifiX5eK6oDQGSfmNnXjxZzYQ==} + '@types/readable-stream@4.0.12': + resolution: {integrity: sha512-SCaw+bs9o/HCX1eTa3glTcQgW1oPxof49mqP2Qikik3xzTimNv2M4p43BQHhBuf7CwOJdQW0s1SrWU3MZxz6lw==} '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} @@ -3059,8 +3034,8 @@ packages: resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - '@zardoy/flying-squid@0.0.17': - resolution: {integrity: sha512-qGCS7aRmMflDdIN7IGLpDc0W2gUYc5OQ45KEn3XtcxwOP0Q7zyvo3mnsD5KSV3n2lyhQ4783Ov8V6J86xea0lw==} + '@zardoy/flying-squid@0.0.19': + resolution: {integrity: sha512-q0eW/AO66bA5YQfGd+mnZjenZ7oocCrxlU4ktJbS4vfhjC2PPLzXLpWhXnzqN9A3VSzMzraV/9SY9kGQkw8xNA==} engines: {node: '>=8'} hasBin: true @@ -4295,8 +4270,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.0.18: - resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} + es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} engines: {node: '>= 0.4'} es-module-lexer@0.9.3: @@ -4963,6 +4938,10 @@ packages: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -5697,15 +5676,6 @@ packages: enquirer: optional: true - lit-element@3.3.3: - resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} - - lit-html@2.8.0: - resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} - - lit@2.8.0: - resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} - load-bmfont@1.4.1: resolution: {integrity: sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==} @@ -6742,8 +6712,8 @@ packages: prismarine-physics@1.8.0: resolution: {integrity: sha512-gbM+S+bmVtOKVv+Z0WGaHMeEeBHISIDsRDRlv8sr0dex3ZJRhuq8djA02CBreguXtI18ZKh6q3TSj2qDr45NHA==} - prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f} + prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29} version: 2.7.0 prismarine-realms@1.3.2: @@ -6937,6 +6907,9 @@ packages: rambda@6.9.0: resolution: {integrity: sha512-yosVdGg1hNGkXPzqGiOYNEpXKjEOxzUCg2rB0l+NKdyCaSf4z+i5ojbN0IqDSezMMf71YEglI+ZUTgTffn5afw==} + rambda@9.2.0: + resolution: {integrity: sha512-RjM8TBNPR+iSvWLqbBpFveDfEf2RPRKHuwBHjQdXsYFDwn3MIvgmJiqVVC1CIQKnOwzeDQd44zqDFgSKQ7RT1Q==} + ramda@0.29.0: resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} @@ -10306,12 +10279,6 @@ snapshots: '@juggle/resize-observer@3.3.1': {} - '@lit-labs/ssr-dom-shim@1.1.1': {} - - '@lit/reactive-element@1.6.3': - dependencies: - '@lit-labs/ssr-dom-shim': 1.1.1 - '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': dependencies: detect-libc: 2.0.2 @@ -11438,44 +11405,6 @@ snapshots: '@types/express': 4.17.18 file-system-cache: 2.3.0 - '@storybook/web-components-vite@7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.5.0-beta)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2))': - dependencies: - '@storybook/builder-vite': 7.4.6(encoding@0.1.13)(typescript@5.5.0-beta)(vite@4.5.3(@types/node@20.8.0)(terser@5.19.2)) - '@storybook/core-server': 7.4.6(encoding@0.1.13) - '@storybook/node-logger': 7.4.6 - '@storybook/web-components': 7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - magic-string: 0.30.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@preact/preset-vite' - - bufferutil - - encoding - - lit - - supports-color - - typescript - - utf-8-validate - - vite - - vite-plugin-glimmerx - - '@storybook/web-components@7.4.6(encoding@0.1.13)(lit@2.8.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@storybook/client-logger': 7.4.6 - '@storybook/core-client': 7.4.6 - '@storybook/docs-tools': 7.4.6(encoding@0.1.13) - '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.6 - '@storybook/types': 7.4.6 - lit: 2.8.0 - tiny-invariant: 1.3.1 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - encoding - - react - - react-dom - - supports-color - '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: ejs: 3.1.9 @@ -11643,7 +11572,7 @@ snapshots: undici-types: 5.26.5 optional: true - '@types/node@20.12.7': + '@types/node@20.12.8': dependencies: undici-types: 5.26.5 @@ -11685,9 +11614,9 @@ snapshots: '@types/scheduler': 0.16.3 csstype: 3.1.2 - '@types/readable-stream@4.0.11': + '@types/readable-stream@4.0.12': dependencies: - '@types/node': 20.12.7 + '@types/node': 20.12.8 safe-buffer: 5.1.2 '@types/resolve@1.17.1': @@ -11975,7 +11904,7 @@ snapshots: '@types/emscripten': 1.39.8 tslib: 1.14.1 - '@zardoy/flying-squid@0.0.17(encoding@0.1.13)': + '@zardoy/flying-squid@0.0.19(encoding@0.1.13)': dependencies: change-case: 4.1.2 colors: 1.4.0 @@ -11994,9 +11923,10 @@ snapshots: prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 - prismarine-provider-anvil: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0) + prismarine-provider-anvil: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29(minecraft-data@3.62.0) prismarine-windows: 2.9.0 prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465 + rambda: 9.2.0 random-seed: 0.3.0 range: 0.0.3 readline: 1.3.0 @@ -13540,7 +13470,7 @@ snapshots: function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 get-symbol-description: 1.0.2 - globalthis: 1.0.3 + globalthis: 1.0.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 has-proto: 1.0.3 @@ -13578,7 +13508,7 @@ snapshots: es-errors@1.3.0: {} - es-iterator-helpers@1.0.18: + es-iterator-helpers@1.0.19: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -13587,7 +13517,7 @@ snapshots: es-set-tostringtag: 2.0.3 function-bind: 1.1.2 get-intrinsic: 1.2.4 - globalthis: 1.0.3 + globalthis: 1.0.4 has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 @@ -13864,7 +13794,7 @@ snapshots: array.prototype.toreversed: 1.1.2 array.prototype.tosorted: 1.1.3 doctrine: 2.1.0 - es-iterator-helpers: 1.0.18 + es-iterator-helpers: 1.0.19 eslint: 8.50.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 @@ -14490,6 +14420,11 @@ snapshots: dependencies: define-properties: 1.2.1 + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -15271,22 +15206,6 @@ snapshots: optionalDependencies: enquirer: 2.4.1 - lit-element@3.3.3: - dependencies: - '@lit-labs/ssr-dom-shim': 1.1.1 - '@lit/reactive-element': 1.6.3 - lit-html: 2.8.0 - - lit-html@2.8.0: - dependencies: - '@types/trusted-types': 2.0.3 - - lit@2.8.0: - dependencies: - '@lit/reactive-element': 1.6.3 - lit-element: 3.3.3 - lit-html: 2.8.0 - load-bmfont@1.4.1: dependencies: buffer-equal: 0.0.1 @@ -15744,7 +15663,7 @@ snapshots: minecraft-protocol@https://codeload.github.com/zardoy/minecraft-protocol/tar.gz/2c14a686bfe7cbd9a5c87b629b402295ee86219f(encoding@0.1.13): dependencies: - '@types/readable-stream': 4.0.11 + '@types/readable-stream': 4.0.12 aes-js: 3.1.2 buffer-equal: 1.0.1 debug: 4.3.4(supports-color@8.1.1) @@ -16563,7 +16482,7 @@ snapshots: prismarine-nbt: 2.5.0 vec3: 0.1.8 - prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.62.0): + prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29(minecraft-data@3.62.0): dependencies: prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) prismarine-nbt: 2.5.0 @@ -16825,6 +16744,8 @@ snapshots: rambda@6.9.0: {} + rambda@9.2.0: {} + ramda@0.29.0: {} randexp@0.4.6: @@ -17108,7 +17029,7 @@ snapshots: es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 - globalthis: 1.0.3 + globalthis: 1.0.4 which-builtin-type: 1.1.3 regenerate-unicode-properties@10.1.0: @@ -18447,13 +18368,13 @@ snapshots: - supports-color - terser - vite@4.4.10(@types/node@20.12.7)(terser@5.19.2): + vite@4.4.10(@types/node@20.12.8)(terser@5.19.2): dependencies: esbuild: 0.18.20 postcss: 8.4.31 rollup: 3.29.4 optionalDependencies: - '@types/node': 20.12.7 + '@types/node': 20.12.8 fsevents: 2.3.3 terser: 5.19.2 From 1e7153c2e299273577ad7876d6445b709c1ebf20 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sun, 5 May 2024 03:25:08 +0300 Subject: [PATCH 0159/1195] feat: publish all stories UI components to npm! (#111) --- .github/workflows/ci.yml | 1 + .github/workflows/publish.yml | 7 + .gitignore | 4 +- README.MD | 5 +- README.NPM.MD | 32 ++++ experiments/UiStandaloneExample.tsx | 71 +++++++++ package.json | 14 +- package.npm.json | 36 +++++ pnpm-lock.yaml | 51 +++--- scripts/buildNpmReact.ts | 148 ++++++++++++++++++ src/botUtils.test.ts | 4 +- src/botUtils.ts | 11 +- src/controls.ts | 2 +- src/entities.ts | 4 + src/flyingSquidEvents.ts | 2 +- src/globals.d.ts | 44 +----- src/react/AppStatusProvider.tsx | 3 +- src/react/ArmorBar.css | 1 + src/react/ArmorBar.tsx | 4 +- src/react/BarsCommon.tsx | 26 +++ src/react/BossBarOverlay.css | 4 +- src/react/BreathBar.css | 1 + src/react/Button.stories.tsx | 18 +++ src/react/Button.tsx | 28 ++-- src/react/ButtonAppProvider.tsx | 10 ++ src/react/{ChatContainer.css => Chat.css} | 0 src/react/Chat.stories.tsx | 2 +- src/react/{ChatContainer.tsx => Chat.tsx} | 5 +- src/react/ChatProvider.tsx | 6 +- src/react/CreateWorldProvider.tsx | 2 +- src/react/DeathScreenProvider.tsx | 2 +- ...n.module.css => DiveTransition.module.css} | 0 ...stories.tsx => DiveTransition.stories.tsx} | 0 src/react/DiveTransition.tsx | 2 +- src/react/EnterFullscreenButton.tsx | 2 +- src/react/FoodBar.css | 1 + src/react/FoodBar.stories.tsx | 19 +++ src/react/FoodBar.tsx | 33 ++-- src/react/FullScreenWidget.tsx | 2 +- src/react/HealthBar.css | 1 + src/react/HealthBar.stories.tsx | 24 --- src/react/HealthBar.tsx | 51 +++--- src/react/HudBarsProvider.tsx | 28 +--- src/react/Input.tsx | 5 +- src/react/MessageFormatted.tsx | 2 +- src/react/PauseScreen.tsx | 2 +- src/react/PixelartIcon.tsx | 2 +- src/react/PlayerListOverlay.css | 5 +- src/react/PlayerListOverlay.stories.tsx | 10 +- src/react/PlayerListOverlay.tsx | 9 +- src/react/Scoreboard.tsx | 10 +- src/react/SelectOption.tsx | 2 +- src/react/ServersListProvider.tsx | 3 +- src/react/SharedHudVars.tsx | 11 +- src/react/SignEditorProvider.tsx | 2 +- src/react/SingleplayerProvider.tsx | 2 +- src/react/Slider.tsx | 63 ++++---- src/react/SoundMuffler.tsx | 2 +- src/react/TouchAreasControlsProvider.tsx | 2 +- src/react/TouchControls.tsx | 2 +- src/react/globals.d.ts | 45 ++++++ src/react/npmReactEntrypoint.ts | 1 + src/react/utils.ts | 19 +-- src/react/utilsApp.ts | 15 ++ src/reactUi.tsx | 37 +++-- src/styles.css | 1 - src/worldInteractions.ts | 2 + tsconfig.npm.json | 12 ++ 68 files changed, 688 insertions(+), 289 deletions(-) create mode 100644 README.NPM.MD create mode 100644 experiments/UiStandaloneExample.tsx create mode 100644 package.npm.json create mode 100644 scripts/buildNpmReact.ts create mode 100644 src/react/BarsCommon.tsx create mode 100644 src/react/Button.stories.tsx create mode 100644 src/react/ButtonAppProvider.tsx rename src/react/{ChatContainer.css => Chat.css} (100%) rename src/react/{ChatContainer.tsx => Chat.tsx} (99%) rename src/react/{diveAnimation.module.css => DiveTransition.module.css} (100%) rename src/react/{Dive.stories.tsx => DiveTransition.stories.tsx} (100%) create mode 100644 src/react/FoodBar.stories.tsx create mode 100644 src/react/globals.d.ts create mode 100644 src/react/npmReactEntrypoint.ts create mode 100644 src/react/utilsApp.ts create mode 100644 tsconfig.npm.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b08045be..0663fce7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,6 +18,7 @@ jobs: - run: pnpm check-build - run: pnpm test-unit - run: pnpm lint + - run: pnpm tsx scripts/buildNpmReact.ts - run: nohup pnpm prod-start & - run: nohup pnpm test-mc-server & - uses: cypress-io/github-action@v5 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index cbc09b43..79bc5ffd 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -33,9 +33,16 @@ jobs: pnpx zardoy-release node --footer "This release URL: ${{ steps.deploy.outputs.stdout }}" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - run: | + pnpx zardoy-release npm + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: cp vercel.json .vercel/output/static/vercel.json - uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: .vercel/output/static force_orphan: true + - run: pnpm tsx scripts/buildNpmReact.ts + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore index c4434877..240b751a 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ package-lock.json Thumbs.db build localSettings.mjs -dist +dist* .DS_Store .idea/ world @@ -17,3 +17,5 @@ out .vercel generated storybook-static + +src/react/npmReactComponents.ts diff --git a/README.MD b/README.MD index 7a93ce7e..1b8b84ac 100644 --- a/README.MD +++ b/README.MD @@ -4,7 +4,7 @@ A true Minecraft client running in your browser! A port of the original game to the web, written in JavaScript using modern web technologies. -This project is a work in progress, but I consider it to be usable. If you encounter any bugs or usability issues, please report them! +If you encounter any bugs or usability issues, please report them! You can try this out at [mcraft.fun](https://mcraft.fun/), [pcm.gg](https://pcm.gg) (short link) [mcon.vercel.app](https://mcon.vercel.app/) or the GitHub pages deploy. Every commit from the `develop` (default) branch is deployed to [s.mcraft.fun](https://s.mcraft.fun/) - so it's usually newer, but might be less stable. @@ -19,6 +19,8 @@ You can try this out at [mcraft.fun](https://mcraft.fun/), [pcm.gg](https://pcm. - Resource pack support - even even more! +All components that are in [Storybook](https://mcraft.fun/storybook) are published as npm module and can be used in other projects: [`minecraft-react`](https://npmjs.com/minecraft-react) + ### Recommended Settings - Controls -> **Raw Input** -> **On** - This will make the controls more precise @@ -65,7 +67,6 @@ To open the console, press `F12`, or if you are on mobile, you can type `#debug` It should be easy to build/start the project locally. See [CONTRIBUTING.MD](./CONTRIBUTING.md) for more info. -There is storybook for fast UI development. Run `pnpm storybook` to start it. There is world renderer playground ([link](https://mcon.vercel.app/playground.html)). However, there are many things that can be done in online version. You can access some global variables in the console and useful examples: diff --git a/README.NPM.MD b/README.NPM.MD new file mode 100644 index 00000000..24c90bc9 --- /dev/null +++ b/README.NPM.MD @@ -0,0 +1,32 @@ +# Minecraft React + +```bash +yarn add minecraft-react +``` + +## Usage + +```jsx +import { Scoreboard } from 'minecraft-react' + +const App = () => { + return ( + + ) +} +``` + +See [Storybook](https://mcraft.fun/storybook/) or [Storybook (Mirror link)](https://mcon.vercel.app/storybook/) for more examples and full components list. Also take a look at the full [standalone example](https://github.com/zardoy/prismarine-web-client/tree/experiments/UiStandaloneExample.tsx). + +There are two types of components: + +- Small UI components or HUD components +- Full screen components (like sign editor, worlds selector) diff --git a/experiments/UiStandaloneExample.tsx b/experiments/UiStandaloneExample.tsx new file mode 100644 index 00000000..80f68e8d --- /dev/null +++ b/experiments/UiStandaloneExample.tsx @@ -0,0 +1,71 @@ +import React, { useState } from 'react' +import { createRoot } from 'react-dom/client' +import { + Button, + Slider, + ArmorBar, + BreathBar, + Chat, + HealthBar, + PlayerListOverlay, + Scoreboard, + MessageFormattedString, + XPBar, + FoodBar +} from '../dist-npm' + +const ExampleDemo = () => { + const [sliderValue, setSliderValue] = useState(0) + + return ( +
+ + setSliderValue(value)} /> + + { + console.log('typed', message) + // close + }} + /> + + + + + "§bRed" displays as + + +
+ ) +} + +createRoot(document.body as Element).render() diff --git a/package.json b/package.json index d1f4c7eb..25a87472 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,12 @@ "web", "client" ], - "author": "PrismarineJS", + "publish": { + "preset": { + "publishOnlyIfChanged": true, + "runBuild": false + } + }, "license": "MIT", "dependencies": { "@dimaka/interface": "0.0.3-alpha.0", @@ -48,6 +53,7 @@ "adm-zip": "^0.5.12", "browserfs": "github:zardoy/browserfs#build", "change-case": "^5.1.2", + "classnames": "^2.5.1", "compression": "^1.7.4", "cors": "^2.8.5", "cypress-plugin-snapshots": "^1.4.4", @@ -78,11 +84,15 @@ "react-dom": "^18.2.0", "react-transition-group": "^4.4.5", "remark": "^15.0.1", + "filesize": "^10.0.12", "sanitize-filename": "^1.6.3", "skinview3d": "^3.0.1", "source-map-js": "^1.0.2", "stats-gl": "^1.0.5", "stats.js": "^0.17.0", + "use-typed-event-listener": "^4.0.2", + "mojangson": "^2.0.4", + "prosemirror-menu": "^1.2.4", "tabbable": "^6.2.0", "title-case": "3.x", "ua-parser-js": "^1.0.37", @@ -113,7 +123,6 @@ "eslint": "^8.50.0", "eslint-config-zardoy": "^0.2.17", "events": "^3.3.0", - "filesize": "^10.0.12", "http-browserify": "^1.7.0", "http-server": "^14.1.1", "https-browserify": "^1.0.0", @@ -132,7 +141,6 @@ "three": "0.154.0", "timers-browserify": "^2.0.12", "typescript": "5.5.0-beta", - "use-typed-event-listener": "^4.0.2", "vitest": "^0.34.6", "yaml": "^2.3.2" }, diff --git a/package.npm.json b/package.npm.json new file mode 100644 index 00000000..bae8b60f --- /dev/null +++ b/package.npm.json @@ -0,0 +1,36 @@ +{ + "name": "minecraft-react", + "description": "A Minecraft-like React UI library", + "keywords": [ + "minecraft", + "minecraft style" + ], + "license": "MIT", + "sideEffects": false, + "files": [ + "**" + ], + "exports": { + ".": { + "default": "./dist/react/npmReactComponents.js", + "types": "./dist/react/npmReactComponents.d.ts" + }, + "./*": { + "default": "./dist/react/*", + "types": "./dist/react/*" + }, + "./dist": { + "default": "./dist/*", + "types": "./dist/*" + } + }, + "module": "./dist/react/npmReactComponents.js", + "types": "./dist/react/npmReactComponents.d.ts", + "repository": "zardoy/prismarine-web-client", + "version": "0.0.0-dev", + "dependencies": {}, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d1b69cc..054539d5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,6 +68,9 @@ importers: change-case: specifier: ^5.1.2 version: 5.1.2 + classnames: + specifier: ^2.5.1 + version: 2.5.1 compression: specifier: ^1.7.4 version: 1.7.4 @@ -92,6 +95,9 @@ importers: express: specifier: ^4.18.2 version: 4.18.2 + filesize: + specifier: ^10.0.12 + version: 10.0.12 flying-squid: specifier: npm:@zardoy/flying-squid@^0.0.19 version: '@zardoy/flying-squid@0.0.19(encoding@0.1.13)' @@ -116,6 +122,9 @@ importers: minecraft-data: specifier: 3.62.0 version: 3.62.0 + mojangson: + specifier: ^2.0.4 + version: 2.0.4 net-browserify: specifier: github:zardoy/prismarinejs-net-browserify version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d827dba61bd2f9ac9a6086fe2079a0fccadd070 @@ -137,6 +146,9 @@ importers: prosemirror-markdown: specifier: ^1.12.0 version: 1.12.0 + prosemirror-menu: + specifier: ^1.2.4 + version: 1.2.4 prosemirror-state: specifier: ^1.4.3 version: 1.4.3 @@ -182,6 +194,9 @@ importers: ua-parser-js: specifier: ^1.0.37 version: 1.0.37 + use-typed-event-listener: + specifier: ^4.0.2 + version: 4.0.2(react@18.2.0)(typescript@5.5.0-beta) valtio: specifier: ^1.11.1 version: 1.11.2(@types/react@18.2.20)(react@18.2.0) @@ -262,9 +277,6 @@ importers: events: specifier: ^3.3.0 version: 3.3.0 - filesize: - specifier: ^10.0.12 - version: 10.0.12 http-browserify: specifier: ^1.7.0 version: 1.7.0 @@ -319,9 +331,6 @@ importers: typescript: specifier: 5.5.0-beta version: 5.5.0-beta - use-typed-event-listener: - specifier: ^4.0.2 - version: 4.0.2(react@18.2.0)(typescript@5.5.0-beta) vitest: specifier: ^0.34.6 version: 0.34.6(terser@5.19.2) @@ -3635,8 +3644,8 @@ packages: cipher-base@1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} - classnames@2.3.2: - resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} @@ -9968,7 +9977,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.2 - '@types/node': 20.8.0 + '@types/node': 20.12.8 '@types/yargs': 17.0.28 chalk: 4.1.2 @@ -11459,11 +11468,11 @@ snapshots: '@types/cors@2.8.15': dependencies: - '@types/node': 20.8.0 + '@types/node': 20.12.8 '@types/cross-spawn@6.0.3': dependencies: - '@types/node': 20.8.10 + '@types/node': 20.12.8 '@types/debug@4.1.12': dependencies: @@ -11512,7 +11521,7 @@ snapshots: '@types/graceful-fs@4.1.7': dependencies: - '@types/node': 20.8.10 + '@types/node': 20.12.8 '@types/http-cache-semantics@4.0.2': {} @@ -11621,7 +11630,7 @@ snapshots: '@types/resolve@1.17.1': dependencies: - '@types/node': 20.8.10 + '@types/node': 20.12.8 '@types/sat@0.0.31': {} @@ -11632,7 +11641,7 @@ snapshots: '@types/send@0.17.2': dependencies: '@types/mime': 1.3.3 - '@types/node': 20.8.10 + '@types/node': 20.12.8 '@types/serve-static@1.15.3': dependencies: @@ -11941,7 +11950,7 @@ snapshots: '@zardoy/react-util@0.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - classnames: 2.3.2 + classnames: 2.5.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -12674,7 +12683,7 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 - classnames@2.3.2: {} + classnames@2.5.1: {} clean-regexp@1.0.0: dependencies: @@ -13373,7 +13382,7 @@ snapshots: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.15 - '@types/node': 20.8.0 + '@types/node': 20.12.8 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 @@ -14976,7 +14985,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.7 - '@types/node': 20.8.0 + '@types/node': 20.12.8 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -14993,7 +15002,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.8.0 + '@types/node': 20.12.8 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -15001,13 +15010,13 @@ snapshots: jest-worker@26.6.2: dependencies: - '@types/node': 20.8.10 + '@types/node': 20.12.8 merge-stream: 2.0.0 supports-color: 7.2.0 jest-worker@29.7.0: dependencies: - '@types/node': 20.8.10 + '@types/node': 20.12.8 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 diff --git a/scripts/buildNpmReact.ts b/scripts/buildNpmReact.ts new file mode 100644 index 00000000..71513cb3 --- /dev/null +++ b/scripts/buildNpmReact.ts @@ -0,0 +1,148 @@ +import fs from 'fs' +import path from 'path' +import { build, transform } from 'esbuild' +import { execSync } from 'child_process' +// import { copy } from 'fs-extra' +import { glob } from 'glob' + +const isAbsolute = (path: string) => path.startsWith('/') || /^[A-Z]:/i.test(path) + +fs.promises.readdir(path.resolve(__dirname, '../src/react')).then(async (files) => { + const components = files + .filter((file) => { + if (file.startsWith('Concept')) return false + return file.endsWith('.stories.tsx'); + }) + .map((file) => { + return file.replace('.stories.tsx', '') + }) + + const content = components.map((component) => { + return `export { default as ${component} } from './${component}'` + }).join('\n') + + await fs.promises.writeFile( + path.resolve(__dirname, '../src/react/npmReactComponents.ts'), + content + ) + + execSync('pnpm tsc -p tsconfig.npm.json', { + cwd: path.resolve(__dirname, '../'), + stdio: 'inherit', + }) + + const packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../package.npm.json'), 'utf-8')) + const packageJsonRoot = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../package.json'), 'utf-8')) + const external = Object.keys(packageJson.peerDependencies) + const dependencies = new Set() + const version = packageJsonRoot.version + packageJson.version = version + + const externalize = ['minecraft-assets', 'prismarine-viewer'] + const { metafile } = await build({ + entryPoints: [path.resolve(__dirname, '../src/react/npmReactComponents.ts')], + bundle: true, + outfile: path.resolve(__dirname, '../dist-npm/bundle.esm.js'), + format: 'esm', + platform: 'browser', + target: 'es2020', + external: external, + metafile: true, + minify: true, + write: false, // todo + loader: { + '.png': 'dataurl', + }, + plugins: [ + // on external module resolve + { + name: 'collect-imports', + setup (build) { + build.onResolve({ filter: /.*/ }, (args) => { + if (args.importer.includes('node_modules') || external.some(x => args.path.startsWith(x)) || isAbsolute(args.path)) { + return undefined + } + if (args.path.startsWith('./') || args.path.startsWith('../')) { + if (args.path.endsWith('.png') || args.path.endsWith('.css') || args.path.endsWith('.jpg') || args.path.endsWith('.jpeg')) { + const absoluteImporting = path.join(path.dirname(args.importer), args.path) + const absoluteRoot = path.resolve(__dirname, '../src') + const relativeToRoot = path.relative(absoluteRoot, absoluteImporting) + fs.copyFileSync(absoluteImporting, path.resolve(__dirname, '../dist-npm/dist-pre', relativeToRoot)) + } + // default behavior + return undefined + } + const dep = args.path.startsWith('@') ? args.path.split('/').slice(0, 2).join('/') : args.path.split('/')[0] + if (!dependencies.has(dep)) { + dependencies.add(dep) + console.log('Adding dependency:', dep, 'from', args.importer) + } + // return { external: true } + }) + }, + }, + ], + }) + for (const dependency of dependencies) { + if (externalize.includes(dependency)) continue + if (!packageJsonRoot.dependencies[dependency]) throw new Error(`Dependency ${dependency} not found in package.json`) + packageJson.dependencies[dependency] = packageJsonRoot.dependencies[dependency] + } + fs.writeFileSync(path.resolve(__dirname, '../dist-npm/package.json'), JSON.stringify(packageJson, null, 2)) + // fs.promises.writeFile('./dist-npm/metafile.json', JSON.stringify(metafile, null, 2)) + + await build({ + entryPoints: ['dist-npm/dist-pre/**/*.js'], + outdir: 'dist-npm/dist', + // allowOverwrite: true, + jsx: 'preserve', + bundle: true, + target: 'esnext', + platform: 'browser', + format: 'esm', + loader: { + '.css': 'copy', + '.module.css': 'copy', + '.png': 'copy', + }, + minifyWhitespace: false, + logOverride: { + // 'ignored-bare-import': "info" + }, + plugins: [ + { + name: 'all-external', + setup (build) { + build.onResolve({ filter: /.*/ }, (args) => { + // todo use workspace deps + if (externalize.some(x => args.path.startsWith(x))) { + return undefined // bundle + } + if (args.path.endsWith('.css') || args.path.endsWith('.png') || args.path.endsWith('.jpg') || args.path.endsWith('.jpeg')) { + return undefined // loader action + } + return { + path: args.path, + external: true, + } + }) + }, + } + ], + }) + + const paths = await glob('dist-npm/dist-pre/**/*.d.ts') + // copy to dist + for (const p of paths) { + const relative = path.relative('dist-npm/dist-pre', p) + const target = path.resolve('dist-npm/dist', relative) + fs.copyFileSync(p, target) + } + // rm dist-pre + fs.rmSync('dist-npm/dist-pre', { recursive: true }) + fs.copyFileSync(path.resolve(__dirname, '../README.NPM.MD'), path.resolve(__dirname, '../dist-npm/README.md')) + + if (version !== '0.0.0-dev') { + execSync('npm publish', { cwd: path.resolve(__dirname, '../dist-npm') }) + } +}) diff --git a/src/botUtils.test.ts b/src/botUtils.test.ts index 91531138..99aa07b4 100644 --- a/src/botUtils.test.ts +++ b/src/botUtils.test.ts @@ -2,8 +2,8 @@ import { test, expect } from 'vitest' import mcData from 'minecraft-data' import { formatMessage } from './botUtils' -globalThis.window ??= {} as any -globalThis.window.loadedData ??= mcData('1.20.1') +//@ts-expect-error +globalThis.loadedData ??= mcData('1.20.1') const mapIncludeDefined = (props) => { return (x) => { diff --git a/src/botUtils.ts b/src/botUtils.ts index a76f889b..fb4000a1 100644 --- a/src/botUtils.ts +++ b/src/botUtils.ts @@ -1,6 +1,7 @@ // this should actually be moved to mineflayer / prismarine-viewer import { fromFormattedString, TextComponent } from '@xmcl/text-component' +import type { IndexedData } from 'minecraft-data' export type MessageFormatPart = Pick & { text: string @@ -26,8 +27,10 @@ type MessageInput = { json?: any } -// todo move to sign-renderer, replace with prismarine-chat -export const formatMessage = (message: MessageInput) => { +const global = globalThis as any + +// todo move to sign-renderer, replace with prismarine-chat, fix mcData issue! +export const formatMessage = (message: MessageInput, mcData: IndexedData = global.loadedData) => { let msglist: MessageFormatPart[] = [] const readMsg = (msg: MessageInput) => { @@ -47,7 +50,7 @@ export const formatMessage = (message: MessageInput) => { ...styles }) } else if (msg.translate) { - const tText = window.loadedData.language[msg.translate] ?? msg.translate + const tText = mcData?.language[msg.translate] ?? msg.translate if (msg.with) { const splitted = tText.split(/%s|%\d+\$s/g) @@ -114,6 +117,6 @@ const blockToItemRemaps = { } export const getItemFromBlock = (block: import('prismarine-block').Block) => { - const item = loadedData.itemsByName[blockToItemRemaps[block.name] ?? block.name] + const item = global.mcData.itemsByName[blockToItemRemaps[block.name] ?? block.name] return item } diff --git a/src/controls.ts b/src/controls.ts index 26405082..f5e18ae7 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -10,7 +10,7 @@ import { isGameActive, showModal, gameAdditionalState, activeModalStack, hideCur import { goFullscreen, pointerLock, reloadChunks } from './utils' import { options } from './optionsStorage' import { openPlayerInventory } from './inventoryWindows' -import { chatInputValueGlobal } from './react/ChatContainer' +import { chatInputValueGlobal } from './react/Chat' import { fsState } from './loadSave' import { showOptionsModal } from './react/SelectOption' import widgets from './react/widgets' diff --git a/src/entities.ts b/src/entities.ts index 3e075f71..dbb59bed 100644 --- a/src/entities.ts +++ b/src/entities.ts @@ -58,7 +58,11 @@ customEvents.on('gameLoaded', () => { } } + let lastCall = 0 bot.on('physicsTick', () => { + // throttle, tps: 6 + if (Date.now() - lastCall < 166) return + lastCall = Date.now() for (const [id, { tracking, info }] of Object.entries(bot.tracker.trackingData)) { if (!tracking) continue const e = bot.entities[id] diff --git a/src/flyingSquidEvents.ts b/src/flyingSquidEvents.ts index fbab268b..fb5b00e3 100644 --- a/src/flyingSquidEvents.ts +++ b/src/flyingSquidEvents.ts @@ -1,5 +1,5 @@ import { showModal } from './globalState' -import { chatInputValueGlobal } from './react/ChatContainer' +import { chatInputValueGlobal } from './react/Chat' import { showNotification } from './react/NotificationProvider' export default () => { diff --git a/src/globals.d.ts b/src/globals.d.ts index 7d2a478c..6a38a21d 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -30,46 +30,4 @@ declare interface Document { exitPointerLock?(): void } -declare namespace JSX { - interface IntrinsicElements { - [elemName: string]: any - } -} - -declare interface Window extends Record {} - -type StringKeys = Extract - - -interface ObjectConstructor { - keys (obj: T): Array> - entries (obj: T): Array<[StringKeys, T[keyof T]]> - // todo review https://stackoverflow.com/questions/57390305/trying-to-get-fromentries-type-right - fromEntries> (obj: T): Record - assign, K extends Record> (target: T, source: K): asserts target is T & K -} - -declare module '*.module.css' { - const css: Record - export default css -} -declare module '*.css' { - const css: string - export default css -} -declare module '*.json' { - const json: any - export = json -} -declare module '*.png' { - const png: string - export default png -} - -interface PromiseConstructor { - withResolvers (): { - resolve: (value: T) => void; - reject: (reason: any) => void; - promise: Promise; - } -} +declare interface Window extends Record { } diff --git a/src/react/AppStatusProvider.tsx b/src/react/AppStatusProvider.tsx index 52c95383..6ae39308 100644 --- a/src/react/AppStatusProvider.tsx +++ b/src/react/AppStatusProvider.tsx @@ -6,7 +6,8 @@ import { fsState } from '../loadSave' import { guessProblem } from '../guessProblem' import AppStatus from './AppStatus' import DiveTransition from './DiveTransition' -import { useDidUpdateEffect, useIsModalActive } from './utils' +import { useDidUpdateEffect } from './utils' +import { useIsModalActive } from './utilsApp' import Button from './Button' const initialState = { diff --git a/src/react/ArmorBar.css b/src/react/ArmorBar.css index ae13935e..ca579a72 100644 --- a/src/react/ArmorBar.css +++ b/src/react/ArmorBar.css @@ -9,6 +9,7 @@ --bg-x: calc(-1 * 16px); --bg-y: calc(-1 * 9px); pointer-events: none; + image-rendering: pixelated; } .armor { diff --git a/src/react/ArmorBar.tsx b/src/react/ArmorBar.tsx index cc9c66cd..777f753d 100644 --- a/src/react/ArmorBar.tsx +++ b/src/react/ArmorBar.tsx @@ -40,7 +40,7 @@ export default ( { Array.from({ length: 10 }, () => 0) .map( - (num, index) =>
) @@ -48,5 +48,3 @@ export default (
} - - diff --git a/src/react/BarsCommon.tsx b/src/react/BarsCommon.tsx new file mode 100644 index 00000000..1ddc89cc --- /dev/null +++ b/src/react/BarsCommon.tsx @@ -0,0 +1,26 @@ +const getEffectClass = (effect) => { + switch (effect.id) { + case 19: + return 'poisoned' + case 20: + return 'withered' + case 22: + return 'absorption' + default: + return '' + } +} + +export const barEffectAdded = (htmlElement, effect) => { + const effectClass = getEffectClass(effect) + if (effectClass) { + htmlElement.classList.add(effectClass) + } +} + +export const barEffectEnded = (htmlElement, effect) => { + const effectClass = getEffectClass(effect) + if (effectClass) { + htmlElement.classList.remove(effectClass) + } +} diff --git a/src/react/BossBarOverlay.css b/src/react/BossBarOverlay.css index fdbeb594..95ce44ec 100644 --- a/src/react/BossBarOverlay.css +++ b/src/react/BossBarOverlay.css @@ -18,7 +18,7 @@ color: #fff; } .bossbar { - background-image: url("textures/1.18.1/gui/bars.png"); + background-image: url("minecraft-assets/minecraft-assets/data/1.18.1/gui/bars.png"); width: 182px; height: 5px; position: relative; @@ -30,5 +30,5 @@ left: 0; height: 5px; width: 0; - background-image: url("textures/1.18.1/gui/bars.png"); + background-image: url("minecraft-assets/minecraft-assets/data/1.18.1/gui/bars.png"); } diff --git a/src/react/BreathBar.css b/src/react/BreathBar.css index a7e38c7c..e98cf7c2 100644 --- a/src/react/BreathBar.css +++ b/src/react/BreathBar.css @@ -10,6 +10,7 @@ --bg-x: calc(-1 * 16px); --bg-y: calc(-1 * 18px); pointer-events: none; + image-rendering: pixelated; } .breath { diff --git a/src/react/Button.stories.tsx b/src/react/Button.stories.tsx new file mode 100644 index 00000000..88ad0074 --- /dev/null +++ b/src/react/Button.stories.tsx @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import Button from './Button' + +const meta: Meta = { + component: Button, +} + +export default meta +type Story = StoryObj; + +export const Primary: Story = { + args: { + label: 'Hello!', + icon: 'pixelarticons:lock-open', + inScreen: false, + }, +} diff --git a/src/react/Button.tsx b/src/react/Button.tsx index db7e575a..20dc0801 100644 --- a/src/react/Button.tsx +++ b/src/react/Button.tsx @@ -1,7 +1,7 @@ import classNames from 'classnames' -import { FC, Ref } from 'react' -import { loadSound, playSound } from '../basicSounds' +import { createContext, FC, Ref, useContext } from 'react' import buttonCss from './button.module.css' +import SharedHudVars from './SharedHudVars' // testing in storybook from deathscreen @@ -13,11 +13,19 @@ interface Props extends React.ComponentProps<'button'> { rootRef?: Ref } -void loadSound('button_click.mp3') +const ButtonContext = createContext({ + onClick () { }, +}) + +export const ButtonProvider: FC<{children, onClick}> = ({ children, onClick }) => { + return {children} +} export default (({ label, icon, children, inScreen, rootRef, type = 'button', ...args }) => { + const ctx = useContext(ButtonContext) + const onClick = (e) => { - void playSound('button_click.mp3') + ctx.onClick() args.onClick?.(e) } if (inScreen) { @@ -29,9 +37,11 @@ export default (({ label, icon, children, inScreen, rootRef, type = 'button', .. args.style.width = 20 } - return + return + + }) satisfies FC diff --git a/src/react/ButtonAppProvider.tsx b/src/react/ButtonAppProvider.tsx new file mode 100644 index 00000000..206b52a2 --- /dev/null +++ b/src/react/ButtonAppProvider.tsx @@ -0,0 +1,10 @@ +import { loadSound, playSound } from '../basicSounds' +import { ButtonProvider } from './Button' + +void loadSound('button_click.mp3') + +export default ({ children }) => { + return { + void playSound('button_click.mp3') + }}>{children} +} diff --git a/src/react/ChatContainer.css b/src/react/Chat.css similarity index 100% rename from src/react/ChatContainer.css rename to src/react/Chat.css diff --git a/src/react/Chat.stories.tsx b/src/react/Chat.stories.tsx index c568f23b..901368d5 100644 --- a/src/react/Chat.stories.tsx +++ b/src/react/Chat.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react' import { useEffect, useState } from 'react' import { formatMessage } from '../botUtils' -import Chat, { fadeMessage, chatInputValueGlobal } from './ChatContainer' +import Chat, { fadeMessage, chatInputValueGlobal } from './Chat' import Button from './Button' window.spamMessage = window.spamMessage ?? '' diff --git a/src/react/ChatContainer.tsx b/src/react/Chat.tsx similarity index 99% rename from src/react/ChatContainer.tsx rename to src/react/Chat.tsx index 86a3641a..b05f9930 100644 --- a/src/react/ChatContainer.tsx +++ b/src/react/Chat.tsx @@ -3,9 +3,8 @@ import { useEffect, useMemo, useRef, useState } from 'react' import { isCypress } from '../standaloneUtils' import { MessageFormatPart } from '../botUtils' import { MessagePart } from './MessageFormatted' -import './ChatContainer.css' -import { isIos } from './utils' -import { reactKeyForMessage } from './Scoreboard' +import './Chat.css' +import { isIos, reactKeyForMessage } from './utils' export type Message = { parts: MessageFormatPart[], diff --git a/src/react/ChatProvider.tsx b/src/react/ChatProvider.tsx index 1a4d88b6..0322c60f 100644 --- a/src/react/ChatProvider.tsx +++ b/src/react/ChatProvider.tsx @@ -4,8 +4,8 @@ import { formatMessage } from '../botUtils' import { getBuiltinCommandsList, tryHandleBuiltinCommand } from '../builtinCommands' import { hideCurrentModal, miscUiState } from '../globalState' import { options } from '../optionsStorage' -import ChatContainer, { Message, fadeMessage } from './ChatContainer' -import { useIsModalActive } from './utils' +import Chat, { Message, fadeMessage } from './Chat' +import { useIsModalActive } from './utilsApp' import { hideNotification, showNotification } from './NotificationProvider' import { updateLoadedServerData } from './ServersListProvider' @@ -37,7 +37,7 @@ export default () => { }) }, []) - return { diff --git a/src/react/DeathScreenProvider.tsx b/src/react/DeathScreenProvider.tsx index 930ed070..4e68dbec 100644 --- a/src/react/DeathScreenProvider.tsx +++ b/src/react/DeathScreenProvider.tsx @@ -5,7 +5,7 @@ import { MessageFormatPart, formatMessage } from '../botUtils' import { showModal, hideModal } from '../globalState' import { options } from '../optionsStorage' import DeathScreen from './DeathScreen' -import { useIsModalActive } from './utils' +import { useIsModalActive } from './utilsApp' const dieReasonProxy = proxy({ value: null as MessageFormatPart[] | null }) diff --git a/src/react/diveAnimation.module.css b/src/react/DiveTransition.module.css similarity index 100% rename from src/react/diveAnimation.module.css rename to src/react/DiveTransition.module.css diff --git a/src/react/Dive.stories.tsx b/src/react/DiveTransition.stories.tsx similarity index 100% rename from src/react/Dive.stories.tsx rename to src/react/DiveTransition.stories.tsx diff --git a/src/react/DiveTransition.tsx b/src/react/DiveTransition.tsx index a3188305..cd78dd66 100644 --- a/src/react/DiveTransition.tsx +++ b/src/react/DiveTransition.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react' import { Transition } from 'react-transition-group' -import styles from './diveAnimation.module.css' +import styles from './DiveTransition.module.css' // dive animation from framework7 diff --git a/src/react/EnterFullscreenButton.tsx b/src/react/EnterFullscreenButton.tsx index 12c47f40..ad78ddad 100644 --- a/src/react/EnterFullscreenButton.tsx +++ b/src/react/EnterFullscreenButton.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react' import Button from './Button' -import { useUsingTouch } from './utils' +import { useUsingTouch } from './utilsApp' export default () => { const [fullScreen, setFullScreen] = useState(false) diff --git a/src/react/FoodBar.css b/src/react/FoodBar.css index bd31e818..ca3629cd 100644 --- a/src/react/FoodBar.css +++ b/src/react/FoodBar.css @@ -12,6 +12,7 @@ --bg-x: calc(-1 * (16px + 9px * var(--lightened))); --bg-y: calc(-1 * 27px); pointer-events: none; + image-rendering: pixelated; } .foodbar.poisoned { diff --git a/src/react/FoodBar.stories.tsx b/src/react/FoodBar.stories.tsx new file mode 100644 index 00000000..abf351e3 --- /dev/null +++ b/src/react/FoodBar.stories.tsx @@ -0,0 +1,19 @@ +import type { Meta, StoryObj } from '@storybook/react' + +import FoodBar from './FoodBar' + +const meta: Meta = { + component: FoodBar +} + +export default meta +type Story = StoryObj; + +export const Primary: Story = { + args: { + gameMode: 'survival', + food: 10, + effectToAdd: 19, + effectToRemove: 20, + } +} diff --git a/src/react/FoodBar.tsx b/src/react/FoodBar.tsx index c7680b68..d4141e45 100644 --- a/src/react/FoodBar.tsx +++ b/src/react/FoodBar.tsx @@ -1,15 +1,16 @@ import { useRef, useState, useEffect } from 'react' import SharedHudVars from './SharedHudVars' import './FoodBar.css' +import { barEffectAdded, barEffectEnded } from './BarsCommon' export type FoodBarProps = { - gameMode: string, + gameMode?: string, food: number, - effectToAdd: number | null, - effectToRemove: number | null, - effectAdded: (htmlElement: HTMLDivElement | null, effect: number | null) => void, - effectEnded: (htmlElement: HTMLDivElement | null, effect: number | null) => void, + effectToAdd?: number | null, + effectToRemove?: number | null, + resetEffects?: () => void, + style?: React.CSSProperties } export default ( @@ -18,8 +19,8 @@ export default ( food, effectToAdd, effectToRemove, - effectAdded, - effectEnded + resetEffects, + style }: FoodBarProps) => { const foodRef = useRef(null) @@ -54,15 +55,17 @@ export default ( }, [food]) useEffect(() => { - effectAdded(foodRef.current, effectToAdd) - }, [effectToAdd]) + if (effectToAdd) { + barEffectAdded(foodRef.current, effectToAdd) + } + if (effectToRemove) { + barEffectEnded(foodRef.current, effectToRemove) + } + resetEffects?.() + }, [effectToAdd, effectToRemove]) - useEffect(() => { - effectEnded(foodRef.current, effectToRemove) - }, [effectToRemove]) - - return -
+ return +
{ Array.from({ length: 10 }, () => 0) .map( diff --git a/src/react/FullScreenWidget.tsx b/src/react/FullScreenWidget.tsx index ecec1813..79869446 100644 --- a/src/react/FullScreenWidget.tsx +++ b/src/react/FullScreenWidget.tsx @@ -1,5 +1,5 @@ import Screen from './Screen' -import { useIsWidgetActive } from './utils' +import { useIsWidgetActive } from './utilsApp' export default ({ name, title, children }) => { const isWidgetActive = useIsWidgetActive(name) diff --git a/src/react/HealthBar.css b/src/react/HealthBar.css index bbf0f205..a6fefe09 100644 --- a/src/react/HealthBar.css +++ b/src/react/HealthBar.css @@ -12,6 +12,7 @@ --bg-x: calc(-1 * (16px + 9px * var(--lightened))); --bg-y: calc(-1 * var(--hardcore) * 45px); pointer-events: none; + image-rendering: pixelated; } .health.creative { diff --git a/src/react/HealthBar.stories.tsx b/src/react/HealthBar.stories.tsx index bcec2e0a..69e84429 100644 --- a/src/react/HealthBar.stories.tsx +++ b/src/react/HealthBar.stories.tsx @@ -9,19 +9,6 @@ const meta: Meta = { export default meta type Story = StoryObj; -const getEffectClass = (effect) => { - switch (effect.id) { - case 19: - return 'poisoned' - case 20: - return 'withered' - case 22: - return 'absorption' - default: - return '' - } -} - export const Primary: Story = { args: { gameMode: 'survival', @@ -30,16 +17,5 @@ export const Primary: Story = { healthValue: 10, effectToAdd: 19, effectToRemove: 20, - effectAdded (htmlElement, effect) { - const effectClass = getEffectClass(effect) - if (!effectClass) return - if (htmlElement) htmlElement.classList.add(effectClass) - }, - effectEnded (htmlElement, effect) { - const effectClass = getEffectClass(effect) - if (!effectClass) return - if (htmlElement) htmlElement.classList.remove(effectClass) - } - } } diff --git a/src/react/HealthBar.tsx b/src/react/HealthBar.tsx index 46ed8a34..14e27fe6 100644 --- a/src/react/HealthBar.tsx +++ b/src/react/HealthBar.tsx @@ -1,41 +1,36 @@ -import { useRef, useState, useEffect } from 'react' +import { useRef, useEffect } from 'react' import SharedHudVars from './SharedHudVars' import './HealthBar.css' +import { barEffectAdded, barEffectEnded } from './BarsCommon' export type HealthBarProps = { - gameMode: string, + gameMode?: string, isHardcore: boolean, damaged: boolean, healthValue: number, - effectToAdd: number | null, - effectToRemove: number | null, - effectAdded: (htmlElement: HTMLDivElement | null, effect: number | null) => void, - effectEnded: (htmlElement: HTMLDivElement | null, effect: number | null) => void, + effectToAdd?: number | null, + effectToRemove?: number | null, + resetEffects?: () => void + style?: React.CSSProperties } export default ( { - gameMode, - isHardcore, - damaged, - healthValue, + gameMode, + isHardcore, + damaged, + healthValue, effectToAdd, effectToRemove, - effectAdded, - effectEnded + resetEffects, + style }: HealthBarProps) => { const healthRef = useRef(null) - const [className, setClassName] = useState('') useEffect(() => { if (healthRef.current) { healthRef.current.classList.toggle('creative', gameMode === 'creative' || gameMode === 'spectator') - // if (gameMode === 'creative' || gameMode === 'spectator') { - // healthRef.current.classList.add('creative') - // } else { - // healthRef.current.classList.remove('creative') - // } } }, [gameMode]) @@ -89,24 +84,24 @@ export default ( }, [healthValue]) useEffect(() => { - effectAdded(healthRef.current, effectToAdd) - }, [effectToAdd]) - - useEffect(() => { - effectEnded(healthRef.current, effectToRemove) - }, [effectToRemove]) + if (effectToAdd) { + barEffectAdded(healthRef.current, effectToAdd) + } + if (effectToRemove) { + barEffectEnded(healthRef.current, effectToRemove) + } + resetEffects?.() + }, [effectToAdd, effectToRemove]) return -
+
{ Array.from({ length: 10 }, () => 0) .map( - (num, index) =>
) }
} - - diff --git a/src/react/HudBarsProvider.tsx b/src/react/HudBarsProvider.tsx index 0b0cec24..746d4819 100644 --- a/src/react/HudBarsProvider.tsx +++ b/src/react/HudBarsProvider.tsx @@ -32,22 +32,6 @@ export default () => { } } - const effectAdded = (htmlElement, effect) => { - const effectClass = getEffectClass(effect) - if (effectClass) { - htmlElement.classList.add(effectClass) - } - setEffectToAdd(null) - } - - const effectEnded = (htmlElement, effect) => { - const effectClass = getEffectClass(effect) - if (effectClass) { - htmlElement.classList.remove(effectClass) - } - setEffectToRemove(null) - } - const onDamage = () => { setDamaged(prev => true) if (hurtTimeout.current) clearTimeout(hurtTimeout.current) @@ -114,8 +98,10 @@ export default () => { healthValue={healthValue} effectToAdd={effectToAdd} effectToRemove={effectToRemove} - effectAdded={effectAdded} - effectEnded={effectEnded} + resetEffects={() => { + setEffectToAdd(null) + setEffectToRemove(null) + }} /> { food={food} effectToAdd={effectToAdd} effectToRemove={effectToRemove} - effectAdded={effectAdded} - effectEnded={effectEnded} + resetEffects={() => { + setEffectToAdd(null) + setEffectToRemove(null) + }} /> { rootStyles?: React.CSSProperties @@ -10,11 +10,10 @@ interface Props extends React.ComponentProps<'input'> { export default ({ autoFocus, rootStyles, inputRef, ...inputProps }: Props) => { const ref = useRef(null!) - const isTouch = useUsingTouch() useEffect(() => { if (inputRef) (inputRef as any).current = ref.current - if (!autoFocus || isTouch) return // Don't make screen keyboard popup on mobile + if (!autoFocus || isMobile()) return // Don't make screen keyboard popup on mobile ref.current.focus() }, []) diff --git a/src/react/MessageFormatted.tsx b/src/react/MessageFormatted.tsx index baab8171..6b9620ca 100644 --- a/src/react/MessageFormatted.tsx +++ b/src/react/MessageFormatted.tsx @@ -4,7 +4,7 @@ import { noCase } from 'change-case' import mojangson from 'mojangson' import { openURL } from 'prismarine-viewer/viewer/lib/simpleUtils' import { MessageFormatPart } from '../botUtils' -import { chatInputValueGlobal } from './ChatContainer' +import { chatInputValueGlobal } from './Chat' import './MessageFormatted.css' const hoverItemToText = (hoverEvent: MessageFormatPart['hoverEvent']) => { diff --git a/src/react/PauseScreen.tsx b/src/react/PauseScreen.tsx index 92e6c8c7..a224f9e6 100644 --- a/src/react/PauseScreen.tsx +++ b/src/react/PauseScreen.tsx @@ -15,7 +15,7 @@ import { disconnect } from '../flyingSquidUtils' import { pointerLock, setLoadingScreenStatus } from '../utils' import { closeWan, openToWanAndCopyJoinLink, getJoinLink } from '../localServerMultiplayer' import { copyFilesAsyncWithProgress, mkdirRecursive, uniqueFileNameFromWorldName } from '../browserfs' -import { useIsModalActive } from './utils' +import { useIsModalActive } from './utilsApp' import { showOptionsModal } from './SelectOption' import Button from './Button' import Screen from './Screen' diff --git a/src/react/PixelartIcon.tsx b/src/react/PixelartIcon.tsx index a54cd40e..919b8309 100644 --- a/src/react/PixelartIcon.tsx +++ b/src/react/PixelartIcon.tsx @@ -3,5 +3,5 @@ import { CSSProperties } from 'react' // names: https://pixelarticons.com/free/ export default ({ iconName, width = undefined as undefined | number, styles = {} as CSSProperties, className = undefined }) => { if (width !== undefined) styles = { width, height: width, ...styles } - return + return } diff --git a/src/react/PlayerListOverlay.css b/src/react/PlayerListOverlay.css index b36801c0..aa141181 100644 --- a/src/react/PlayerListOverlay.css +++ b/src/react/PlayerListOverlay.css @@ -3,8 +3,9 @@ position: absolute; background-color: rgba(0, 0, 0, 0.3); top: 9px; - left: 50%; - transform: translate(-50%); + left: 0; + right: 0; + margin: auto; width: fit-content; padding: 1px; display: flex; diff --git a/src/react/PlayerListOverlay.stories.tsx b/src/react/PlayerListOverlay.stories.tsx index cb2d972f..0353e32e 100644 --- a/src/react/PlayerListOverlay.stories.tsx +++ b/src/react/PlayerListOverlay.stories.tsx @@ -11,8 +11,14 @@ type Story = StoryObj; export const Primary: Story = { args: { - playersLists: [], - clientId: '', + playersLists: [ + [ + { username: 'Player 1', ping: 10, uuid: '1' }, + { username: 'Player 2', ping: 20, uuid: '2' }, + { username: 'Player 3', ping: 30, uuid: '3' }, + ] + ], + clientId: '2', tablistHeader: 'Header', tablistFooter: 'Footer', serverIP: '95.163.228.101', diff --git a/src/react/PlayerListOverlay.tsx b/src/react/PlayerListOverlay.tsx index ee43ae2c..a1479c14 100644 --- a/src/react/PlayerListOverlay.tsx +++ b/src/react/PlayerListOverlay.tsx @@ -2,7 +2,7 @@ import MessageFormattedString from './MessageFormattedString' import './PlayerListOverlay.css' -type PlayersLists = Array> +type PlayersLists = Array>> type PlayerListOverlayProps = { playersLists: PlayersLists, @@ -10,11 +10,12 @@ type PlayerListOverlayProps = { tablistHeader: string | Record | null, tablistFooter: string | Record | null, serverIP: string + style?: React.CSSProperties } -export default ({ playersLists, clientId, tablistHeader, tablistFooter, serverIP }: PlayerListOverlayProps) => { +export default ({ playersLists, clientId, tablistHeader, tablistFooter, serverIP, style }: PlayerListOverlayProps) => { - return
+ return
Server IP: {serverIP}
@@ -23,7 +24,7 @@ export default ({ playersLists, clientId, tablistHeader, tablistFooter, serverIP {playersLists.map((list, index) => (
{list.map(player => ( -
+

{player.ping}

diff --git a/src/react/Scoreboard.tsx b/src/react/Scoreboard.tsx index 546a0f58..8970f004 100644 --- a/src/react/Scoreboard.tsx +++ b/src/react/Scoreboard.tsx @@ -1,5 +1,6 @@ import './Scoreboard.css' import MessageFormattedString from './MessageFormattedString' +import { reactKeyForMessage } from './utils' export type ScoreboardItems = Array<{name: string, value: number, displayName?: any}> @@ -8,17 +9,14 @@ type ScoreboardProps = { title: string, items: ScoreboardItems, open: boolean + style?: React.CSSProperties } -export const reactKeyForMessage = (message) => { - return typeof message === 'string' ? message : JSON.stringify(message) -} - -export default function Scoreboard ({ title, items, open }: ScoreboardProps) { +export default function Scoreboard ({ title, items, open, style }: ScoreboardProps) { if (!open) return null return ( -
+
diff --git a/src/react/SelectOption.tsx b/src/react/SelectOption.tsx index b74434e1..e2879e10 100644 --- a/src/react/SelectOption.tsx +++ b/src/react/SelectOption.tsx @@ -1,7 +1,7 @@ import { proxy, useSnapshot } from 'valtio' import { hideCurrentModal, showModal } from '../globalState' import Screen from './Screen' -import { useIsModalActive } from './utils' +import { useIsModalActive } from './utilsApp' import Button from './Button' const state = proxy({ diff --git a/src/react/ServersListProvider.tsx b/src/react/ServersListProvider.tsx index ecd74916..0de15e1e 100644 --- a/src/react/ServersListProvider.tsx +++ b/src/react/ServersListProvider.tsx @@ -5,7 +5,8 @@ import { ConnectOptions } from '../connect' import { hideCurrentModal, miscUiState, showModal } from '../globalState' import ServersList from './ServersList' import AddServer from './AddServer' -import { useDidUpdateEffect, useIsModalActive } from './utils' +import { useDidUpdateEffect } from './utils' +import { useIsModalActive } from './utilsApp' interface StoreServerItem { ip: string, diff --git a/src/react/SharedHudVars.tsx b/src/react/SharedHudVars.tsx index acdcc237..ca48453a 100644 --- a/src/react/SharedHudVars.tsx +++ b/src/react/SharedHudVars.tsx @@ -1,5 +1,6 @@ import { CSSProperties, useEffect } from 'react' import icons from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/icons.png' +import widgets from 'minecraft-assets/minecraft-assets/data/1.17.1/gui/widgets.png' export default ({ children }) => { useEffect(() => { @@ -8,7 +9,9 @@ export default ({ children }) => { // 2. Easier application to globally override icons with custom image (eg from resourcepacks) const css = /* css */` :root { + --widgets-gui-atlas: url(${widgets}); --gui-icons: url(${icons}), url(${icons}); + --safe-area-inset-bottom: calc(env(safe-area-inset-bottom) / 2); } ` const style = document.createElement('style') @@ -17,11 +20,5 @@ export default ({ children }) => { document.head.appendChild(style) }, []) - const customVars = { - '--safe-area-inset-bottom': 'calc(env(safe-area-inset-bottom) / 2)' - } as CSSProperties - - return
{children}
+ return children } diff --git a/src/react/SignEditorProvider.tsx b/src/react/SignEditorProvider.tsx index b6ade625..666935b6 100644 --- a/src/react/SignEditorProvider.tsx +++ b/src/react/SignEditorProvider.tsx @@ -2,7 +2,7 @@ import { useMemo, useEffect, useState, useRef } from 'react' import { showModal, hideModal } from '../globalState' import { setDoPreventDefault } from '../controls' import { options } from '../optionsStorage' -import { useIsModalActive } from './utils' +import { useIsModalActive } from './utilsApp' import SignEditor, { ResultType } from './SignEditor' diff --git a/src/react/SingleplayerProvider.tsx b/src/react/SingleplayerProvider.tsx index 35704e8e..83d28637 100644 --- a/src/react/SingleplayerProvider.tsx +++ b/src/react/SingleplayerProvider.tsx @@ -9,7 +9,7 @@ import { haveDirectoryPicker, setLoadingScreenStatus } from '../utils' import { exportWorld } from '../builtinCommands' import { googleProviderState, useGoogleLogIn, GoogleDriveProvider, isGoogleDriveAvailable, APP_ID } from '../googledrive' import Singleplayer, { WorldProps } from './Singleplayer' -import { useIsModalActive } from './utils' +import { useIsModalActive } from './utilsApp' import { showOptionsModal } from './SelectOption' import Input from './Input' import GoogleButton from './GoogleButton' diff --git a/src/react/Slider.tsx b/src/react/Slider.tsx index bc6c5890..34cc2717 100644 --- a/src/react/Slider.tsx +++ b/src/react/Slider.tsx @@ -1,6 +1,7 @@ // Slider.tsx import React, { useState, useEffect } from 'react' import styles from './slider.module.css' +import SharedHudVars from './SharedHudVars' interface Props extends React.ComponentProps<'div'> { label: string; @@ -47,36 +48,38 @@ const Slider: React.FC = ({ } return ( -
- { - const newValue = Number(e.target.value) - setValue(newValue) - fireValueUpdate(false, newValue) - }} - // todo improve correct handling of drag end - onLostPointerCapture={() => { - fireValueUpdate(true) - }} - onPointerUp={() => { - fireValueUpdate(true) - }} - onKeyUp={() => { - fireValueUpdate(true) - }} - /> -
-
- -
+ +
+ { + const newValue = Number(e.target.value) + setValue(newValue) + fireValueUpdate(false, newValue) + }} + // todo improve correct handling of drag end + onLostPointerCapture={() => { + fireValueUpdate(true) + }} + onPointerUp={() => { + fireValueUpdate(true) + }} + onKeyUp={() => { + fireValueUpdate(true) + }} + /> +
+
+ +
+
) } diff --git a/src/react/SoundMuffler.tsx b/src/react/SoundMuffler.tsx index 869abc1c..ecbae14d 100644 --- a/src/react/SoundMuffler.tsx +++ b/src/react/SoundMuffler.tsx @@ -5,7 +5,7 @@ import { lastPlayedSounds } from '../soundSystem' import { options } from '../optionsStorage' import Button from './Button' import Screen from './Screen' -import { useIsModalActive } from './utils' +import { useIsModalActive } from './utilsApp' const SoundRow = ({ sound, children }) => { const { mutedSounds } = useSnapshot(options) diff --git a/src/react/TouchAreasControlsProvider.tsx b/src/react/TouchAreasControlsProvider.tsx index 7de8eaca..24479e89 100644 --- a/src/react/TouchAreasControlsProvider.tsx +++ b/src/react/TouchAreasControlsProvider.tsx @@ -2,7 +2,7 @@ import { useSnapshot } from 'valtio' import { activeModalStack, hideModal } from '../globalState' import { options } from '../optionsStorage' import TouchAreasControls from './TouchAreasControls' -import { useIsModalActive, useUsingTouch } from './utils' +import { useIsModalActive, useUsingTouch } from './utilsApp' export default () => { const usingTouch = useUsingTouch() diff --git a/src/react/TouchControls.tsx b/src/react/TouchControls.tsx index db71ae1f..b49d57c4 100644 --- a/src/react/TouchControls.tsx +++ b/src/react/TouchControls.tsx @@ -4,7 +4,7 @@ import { useSnapshot } from 'valtio' import { contro } from '../controls' import { miscUiState, activeModalStack } from '../globalState' import { watchValue, options } from '../optionsStorage' -import { useUsingTouch } from './utils' +import { useUsingTouch } from './utilsApp' // todo useInterfaceState.setState({ diff --git a/src/react/globals.d.ts b/src/react/globals.d.ts new file mode 100644 index 00000000..842d27c4 --- /dev/null +++ b/src/react/globals.d.ts @@ -0,0 +1,45 @@ +type StringKeys = Extract + + +interface ObjectConstructor { + keys (obj: T): Array> + entries (obj: T): Array<[StringKeys, T[keyof T]]> + // todo review https://stackoverflow.com/questions/57390305/trying-to-get-fromentries-type-right + fromEntries> (obj: T): Record + assign, K extends Record> (target: T, source: K): asserts target is T & K +} + +declare module '*.module.css' { + const css: Record + export default css +} +declare module '*.css' { + const css: string + export default css +} +declare module '*.json' { + const json: any + export = json +} +declare module '*.png' { + const png: string + export default png +} + +interface PromiseConstructor { + withResolvers (): { + resolve: (value: T) => void; + reject: (reason: any) => void; + promise: Promise; + } +} + +declare namespace JSX { + interface IntrinsicElements { + 'iconify-icon': { + icon: string + style?: React.CSSProperties + class?: string + } + } +} diff --git a/src/react/npmReactEntrypoint.ts b/src/react/npmReactEntrypoint.ts new file mode 100644 index 00000000..643930d7 --- /dev/null +++ b/src/react/npmReactEntrypoint.ts @@ -0,0 +1 @@ +// export * from './npmReactComponents' diff --git a/src/react/utils.ts b/src/react/utils.ts index 900b279f..b8caeddf 100644 --- a/src/react/utils.ts +++ b/src/react/utils.ts @@ -1,16 +1,5 @@ -import { useSnapshot } from 'valtio' import { useEffect, useRef } from 'react' import { UAParser } from 'ua-parser-js' -import { activeModalStack, miscUiState } from '../globalState' - -export const useIsModalActive = (modal: string, useIncludes = false) => { - const allStack = useSnapshot(activeModalStack) - return useIncludes ? allStack.some(x => x.reactType === modal) : allStack.at(-1)?.reactType === modal -} - -export const useIsWidgetActive = (name: string) => { - return useIsModalActive(`widget-${name}`) -} export function useDidUpdateEffect (fn, inputs) { const isMountingRef = useRef(false) @@ -28,10 +17,10 @@ export function useDidUpdateEffect (fn, inputs) { }, inputs) } -export const useUsingTouch = () => { - return useSnapshot(miscUiState).currentTouch -} - export const ua = new UAParser(navigator.userAgent) export const isIos = ua.getOS().name === 'iOS' + +export const reactKeyForMessage = (message) => { + return typeof message === 'string' ? message : JSON.stringify(message) +} diff --git a/src/react/utilsApp.ts b/src/react/utilsApp.ts new file mode 100644 index 00000000..3fd18515 --- /dev/null +++ b/src/react/utilsApp.ts @@ -0,0 +1,15 @@ +import { useSnapshot } from 'valtio' +import { activeModalStack, miscUiState } from '../globalState' + + +export const useUsingTouch = () => { + return useSnapshot(miscUiState).currentTouch +} +export const useIsModalActive = (modal: string, useIncludes = false) => { + const allStack = useSnapshot(activeModalStack) + return useIncludes ? allStack.some(x => x.reactType === modal) : allStack.at(-1)?.reactType === modal +} + +export const useIsWidgetActive = (name: string) => { + return useIsModalActive(`widget-${name}`) +} diff --git a/src/reactUi.tsx b/src/reactUi.tsx index 419d8dff..760a1a7b 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -27,12 +27,13 @@ import PauseScreen from './react/PauseScreen' import SoundMuffler from './react/SoundMuffler' import TouchControls from './react/TouchControls' import widgets from './react/widgets' -import { useIsWidgetActive } from './react/utils' +import { useIsWidgetActive } from './react/utilsApp' import GlobalSearchInput from './GlobalSearchInput' import TouchAreasControlsProvider from './react/TouchAreasControlsProvider' import NotificationProvider, { showNotification } from './react/NotificationProvider' import HotbarRenderApp from './react/HotbarRenderApp' import Crosshair from './react/Crosshair' +import ButtonAppProvider from './react/ButtonAppProvider' import ServersListProvider from './react/ServersListProvider' const RobustPortal = ({ children, to }) => { @@ -112,7 +113,7 @@ const InGameUi = () => { - {/* becaues of z-index */} + {/* because of z-index */} @@ -132,21 +133,23 @@ const WidgetDisplay = ({ name, Component }) => { const App = () => { return
- - - - - - - - - - - - - {/* - */} - + + + + + + + + + + + + + + {/* + */} + +
} diff --git a/src/styles.css b/src/styles.css index 64fc054d..30abc52b 100644 --- a/src/styles.css +++ b/src/styles.css @@ -26,7 +26,6 @@ html { } body { - --widgets-gui-atlas: url('minecraft-assets/minecraft-assets/data/1.17.1/gui/widgets.png'); --title-gui: url('minecraft-assets/minecraft-assets/data/1.17.1/gui/title/minecraft.png'); } diff --git a/src/worldInteractions.ts b/src/worldInteractions.ts index 544027a5..c3263f2f 100644 --- a/src/worldInteractions.ts +++ b/src/worldInteractions.ts @@ -89,6 +89,8 @@ class WorldInteraction { if (entity && e.button === 2) { bot.attack(entity) + } else { + // bot } }) document.addEventListener('blur', (e) => { diff --git a/tsconfig.npm.json b/tsconfig.npm.json new file mode 100644 index 00000000..0aec498f --- /dev/null +++ b/tsconfig.npm.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist-npm/dist-pre", + "noEmit": false, + "declaration": true + }, + "include": [ + "src/react/npmReactComponents.ts", + "src/react/globals.d.ts" + ] +} From 86554050c372904af9d2616bfeaa41ab5a4982f6 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sun, 5 May 2024 03:26:56 +0300 Subject: [PATCH 0160/1195] up tested ver --- src/loadSave.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/loadSave.ts b/src/loadSave.ts index c332e670..af9d078c 100644 --- a/src/loadSave.ts +++ b/src/loadSave.ts @@ -91,12 +91,13 @@ export const loadSave = async (root = '/world') => { const newVersion = '1.8.8' version = newVersion } - const lastSupportedVersion = supportedVersions.at(-1)! + // const lastSupportedVersion = supportedVersions.at(-1)! + const lastTestedVersion = '1.18.2' const firstSupportedVersion = supportedVersions[0] const lowerBound = isMajorVersionGreater(firstSupportedVersion, version) - const upperBound = isMajorVersionGreater(version, lastSupportedVersion) + const upperBound = isMajorVersionGreater(version, lastTestedVersion) if (lowerBound || upperBound) { - version = prompt(`Version ${version} is not supported, supported versions are ${supportedVersions.join(', ')}, what try to use instead?`, lowerBound ? firstSupportedVersion : lastSupportedVersion) + version = prompt(`Version ${version} is not supported, supported versions are ${supportedVersions.join(', ')}, what try to use instead?`, lowerBound ? firstSupportedVersion : lastTestedVersion) if (!version) return } if (levelDat.WorldGenSettings) { From 038dfc415be3fd4b657e804d5299d2a6acd97adc Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 5 May 2024 03:34:46 +0300 Subject: [PATCH 0161/1195] ci: remove wrong command --- .github/workflows/publish.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 79bc5ffd..616a241a 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -33,10 +33,6 @@ jobs: pnpx zardoy-release node --footer "This release URL: ${{ steps.deploy.outputs.stdout }}" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - run: | - pnpx zardoy-release npm - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: cp vercel.json .vercel/output/static/vercel.json - uses: peaceiris/actions-gh-pages@v3 with: From 2e93e90d287bf19c22653804e35bf3bb80fd02e9 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 5 May 2024 03:45:57 +0300 Subject: [PATCH 0162/1195] impr auto publish for npm --- .github/workflows/publish.yml | 6 +++++- scripts/buildNpmReact.ts | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 616a241a..18c1a9bf 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -33,12 +33,16 @@ jobs: pnpx zardoy-release node --footer "This release URL: ${{ steps.deploy.outputs.stdout }}" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # has possible output: tag + id: release + # has output - run: cp vercel.json .vercel/output/static/vercel.json - uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: .vercel/output/static force_orphan: true - - run: pnpm tsx scripts/buildNpmReact.ts + - run: pnpm tsx scripts/buildNpmReact.ts ${{ steps.release.outputs.tag }} + if: steps.release.outputs.tag env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/scripts/buildNpmReact.ts b/scripts/buildNpmReact.ts index 71513cb3..4516f1b7 100644 --- a/scripts/buildNpmReact.ts +++ b/scripts/buildNpmReact.ts @@ -35,7 +35,8 @@ fs.promises.readdir(path.resolve(__dirname, '../src/react')).then(async (files) const packageJsonRoot = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../package.json'), 'utf-8')) const external = Object.keys(packageJson.peerDependencies) const dependencies = new Set() - const version = packageJsonRoot.version + let version = process.argv[2] || packageJsonRoot.version + version = version.replace(/^v/, '') packageJson.version = version const externalize = ['minecraft-assets', 'prismarine-viewer'] From 228d60056bbd22c175e2bf174d4f50d8b1c63164 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 5 May 2024 03:57:21 +0300 Subject: [PATCH 0163/1195] hotfix: offline server check crashes other servers checks --- src/react/ServersListProvider.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/react/ServersListProvider.tsx b/src/react/ServersListProvider.tsx index 0de15e1e..85c55ed6 100644 --- a/src/react/ServersListProvider.tsx +++ b/src/react/ServersListProvider.tsx @@ -22,7 +22,8 @@ interface StoreServerItem { } type ServerResponse = { - version: { + online: boolean + version?: { name_raw: string } // display tooltip @@ -34,8 +35,8 @@ type ServerResponse = { name_clean: string }> } - icon: string - motd: { + icon?: string + motd?: { raw: string } // todo circle error icon @@ -159,12 +160,13 @@ const Inner = () => { if (isInLocalNetwork) continue // eslint-disable-next-line no-await-in-loop await fetch(`https://api.mcstatus.io/v2/status/java/${server.ip}`).then(async r => r.json()).then((data: ServerResponse) => { - const versionClean = data.version.name_raw.replace(/^[^\d.]+/, '') + const versionClean = data.version?.name_raw.replace(/^[^\d.]+/, '') + if (!versionClean) return setAdditionalData(old => { return ({ ...old, [server.ip]: { - formattedText: data.motd.raw, + formattedText: data.motd?.raw ?? '', textNameRight: `${versionClean} ${data.players?.online ?? '??'}/${data.players?.max ?? '??'}`, icon: data.icon, } From d1d47b334c7525c9083a2a3b39797fef368c914a Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 6 May 2024 01:04:04 +0300 Subject: [PATCH 0164/1195] fix camera desync issues --- prismarine-viewer/viewer/lib/viewer.ts | 8 +++++++- prismarine-viewer/viewer/lib/worldrendererCommon.ts | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/prismarine-viewer/viewer/lib/viewer.ts b/prismarine-viewer/viewer/lib/viewer.ts index 9cb7eb3d..9f8067db 100644 --- a/prismarine-viewer/viewer/lib/viewer.ts +++ b/prismarine-viewer/viewer/lib/viewer.ts @@ -12,7 +12,6 @@ export class Viewer { scene: THREE.Scene ambientLight: THREE.AmbientLight directionalLight: THREE.DirectionalLight - camera: THREE.PerspectiveCamera world: WorldRendererCommon entities: Entities // primitives: Primitives @@ -25,6 +24,13 @@ export class Viewer { renderingUntilNoUpdates = false processEntityOverrides = (e, overrides) => overrides + get camera () { + return this.world.camera + } + set camera (camera) { + this.world.camera = camera + } + constructor(public renderer: THREE.WebGLRenderer, worldConfig = defaultWorldRendererConfig) { // https://discourse.threejs.org/t/updates-to-color-management-in-three-js-r152/50791 THREE.ColorManagement.enabled = false diff --git a/prismarine-viewer/viewer/lib/worldrendererCommon.ts b/prismarine-viewer/viewer/lib/worldrendererCommon.ts index 43983977..05fb6f4e 100644 --- a/prismarine-viewer/viewer/lib/worldrendererCommon.ts +++ b/prismarine-viewer/viewer/lib/worldrendererCommon.ts @@ -54,6 +54,7 @@ export abstract class WorldRendererCommon allChunksFinished = false handleResize = () => { } mesherConfig = defaultMesherConfig + camera: THREE.PerspectiveCamera abstract outputFormat: 'threeJs' | 'webgl' From 36962331d17bdcd65951f00e6383b6eb60662c2e Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 6 May 2024 01:54:29 +0300 Subject: [PATCH 0165/1195] chore: up mc-data, fix cam reset fix: hide add server UI after adding a server --- package.json | 4 +- pnpm-lock.yaml | 60 +++++++++---------- prismarine-viewer/viewer/lib/mesher/models.ts | 4 +- .../viewer/lib/mesher/test/mesherTester.ts | 15 +++-- prismarine-viewer/viewer/lib/viewer.ts | 4 +- .../viewer/lib/worldrendererThree.ts | 2 +- src/react/ServersListProvider.tsx | 9 +-- 7 files changed, 51 insertions(+), 47 deletions(-) diff --git a/package.json b/package.json index 25a87472..fdaecb65 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "jszip": "^3.10.1", "lodash-es": "^4.17.21", "minecraft-assets": "^1.12.2", - "minecraft-data": "3.62.0", + "minecraft-data": "3.65.0", "net-browserify": "github:zardoy/prismarinejs-net-browserify", "node-gzip": "^1.1.2", "peerjs": "^1.5.0", @@ -154,7 +154,7 @@ "diamond-square": "github:zardoy/diamond-square", "prismarine-block": "github:zardoy/prismarine-block#next-era", "prismarine-world": "github:zardoy/prismarine-world#next-era", - "minecraft-data": "3.62.0", + "minecraft-data": "3.65.0", "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", "minecraft-protocol": "github:zardoy/minecraft-protocol#everything", "react": "^18.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 054539d5..21d48b30 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ overrides: diamond-square: github:zardoy/diamond-square prismarine-block: github:zardoy/prismarine-block#next-era prismarine-world: github:zardoy/prismarine-world#next-era - minecraft-data: 3.62.0 + minecraft-data: 3.65.0 prismarine-provider-anvil: github:zardoy/prismarine-provider-anvil#everything minecraft-protocol: github:zardoy/minecraft-protocol#everything react: ^18.2.0 @@ -120,8 +120,8 @@ importers: specifier: ^1.12.2 version: 1.12.2 minecraft-data: - specifier: 3.62.0 - version: 3.62.0 + specifier: 3.65.0 + version: 3.65.0 mojangson: specifier: ^2.0.4 version: 2.0.4 @@ -139,7 +139,7 @@ importers: version: 6.1.1 prismarine-provider-anvil: specifier: github:zardoy/prismarine-provider-anvil#everything - version: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29(minecraft-data@3.62.0) + version: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29(minecraft-data@3.65.0) prosemirror-example-setup: specifier: ^1.2.2 version: 1.2.2 @@ -375,7 +375,7 @@ importers: version: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chunk: specifier: github:zardoy/prismarine-chunk - version: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) + version: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.65.0) prismarine-schematic: specifier: ^1.2.0 version: 1.2.3 @@ -6028,8 +6028,8 @@ packages: minecraft-assets@1.12.2: resolution: {integrity: sha512-/eMxh3LNjCXOnU6KnQMjBM8dRnoJNpWIg7mD2m2RthraYiQK2FNzPWIKxWm2j3Ufcf5nzFXupgABledE86r4fQ==} - minecraft-data@3.62.0: - resolution: {integrity: sha512-jJXZ/WgyX79tIHlqvfyqG+sJDUekHiA3e9NRUCMGUno4NDrZMcpRI065DnkrI720RHTMb8iadf0NmnBP4Rla5A==} + minecraft-data@3.65.0: + resolution: {integrity: sha512-9K8dOrdrcpUklTdqKBtRcKur0gLZnguTvhM/1Xv52qzh8Unkto4290RJc4ueRIYo1VqN4zzQrRxO8lnqtkERDQ==} minecraft-folder-path@1.2.0: resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} @@ -6691,7 +6691,7 @@ packages: prismarine-biome@1.3.0: resolution: {integrity: sha512-GY6nZxq93mTErT7jD7jt8YS1aPrOakbJHh39seYsJFXvueIOdHAmW16kYQVrTVMW5MlWLQVxV/EquRwOgr4MnQ==} peerDependencies: - minecraft-data: 3.62.0 + minecraft-data: 3.65.0 prismarine-registry: ^1.1.0 prismarine-block@https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0: @@ -11923,16 +11923,16 @@ snapshots: exit-hook: 2.2.1 flatmap: 0.0.3 long: 5.2.3 - minecraft-data: 3.62.0 + minecraft-data: 3.65.0 minecraft-protocol: https://codeload.github.com/zardoy/minecraft-protocol/tar.gz/2c14a686bfe7cbd9a5c87b629b402295ee86219f(encoding@0.1.13) mkdirp: 2.1.6 node-gzip: 1.1.2 node-rsa: 1.1.1 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.65.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 - prismarine-provider-anvil: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29(minecraft-data@3.62.0) + prismarine-provider-anvil: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29(minecraft-data@3.65.0) prismarine-windows: 2.9.0 prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465 rambda: 9.2.0 @@ -13194,8 +13194,8 @@ snapshots: diamond-square@https://codeload.github.com/zardoy/diamond-square/tar.gz/915fce8e27fe8eb45464d89b9563956afa4f7687: dependencies: - minecraft-data: 3.62.0 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) + minecraft-data: 3.65.0 + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.65.0) random-seed: 0.3.0 vec3: 0.1.8 @@ -15659,7 +15659,7 @@ snapshots: minecraft-assets@1.12.2: {} - minecraft-data@3.62.0: {} + minecraft-data@3.65.0: {} minecraft-folder-path@1.2.0: {} @@ -15679,7 +15679,7 @@ snapshots: endian-toggle: 0.0.0 lodash.get: 4.4.2 lodash.merge: 4.6.2 - minecraft-data: 3.62.0 + minecraft-data: 3.65.0 minecraft-folder-path: 1.2.0 node-fetch: 2.7.0(encoding@0.1.13) node-rsa: 0.4.2 @@ -15719,7 +15719,7 @@ snapshots: mineflayer-pathfinder@2.4.4: dependencies: - minecraft-data: 3.62.0 + minecraft-data: 3.65.0 prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-entity: 2.3.1 prismarine-item: 1.14.0 @@ -15729,12 +15729,12 @@ snapshots: mineflayer@https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/5a544cf2547a6e0f1f17786962d77a33c661c02f(encoding@0.1.13): dependencies: - minecraft-data: 3.62.0 + minecraft-data: 3.65.0 minecraft-protocol: https://codeload.github.com/zardoy/minecraft-protocol/tar.gz/2c14a686bfe7cbd9a5c87b629b402295ee86219f(encoding@0.1.13) - prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) + prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chat: 1.9.1 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.65.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 @@ -16431,15 +16431,15 @@ snapshots: - encoding - supports-color - prismarine-biome@1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0): + prismarine-biome@1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0): dependencies: - minecraft-data: 3.62.0 + minecraft-data: 3.65.0 prismarine-registry: 1.7.0 prismarine-block@https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0: dependencies: - minecraft-data: 3.62.0 - prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) + minecraft-data: 3.65.0 + prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) prismarine-chat: 1.9.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 @@ -16452,9 +16452,9 @@ snapshots: prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 - prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0): + prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.65.0): dependencies: - prismarine-biome: 1.3.0(minecraft-data@3.62.0)(prismarine-registry@1.7.0) + prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 @@ -16487,13 +16487,13 @@ snapshots: prismarine-physics@1.8.0: dependencies: - minecraft-data: 3.62.0 + minecraft-data: 3.65.0 prismarine-nbt: 2.5.0 vec3: 0.1.8 - prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29(minecraft-data@3.62.0): + prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29(minecraft-data@3.65.0): dependencies: - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.62.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.65.0) prismarine-nbt: 2.5.0 uint4: 0.1.2 vec3: 0.1.8 @@ -16514,12 +16514,12 @@ snapshots: prismarine-registry@1.7.0: dependencies: - minecraft-data: 3.62.0 + minecraft-data: 3.65.0 prismarine-nbt: 2.5.0 prismarine-schematic@1.2.3: dependencies: - minecraft-data: 3.62.0 + minecraft-data: 3.65.0 prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-nbt: 2.2.1 prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465 diff --git a/prismarine-viewer/viewer/lib/mesher/models.ts b/prismarine-viewer/viewer/lib/mesher/models.ts index 833de180..bfb96d11 100644 --- a/prismarine-viewer/viewer/lib/mesher/models.ts +++ b/prismarine-viewer/viewer/lib/mesher/models.ts @@ -349,8 +349,7 @@ function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr const aos: number[] = [] const neighborPos = position.plus(new Vec3(...dir)) - let baseLightLevel = world.getLight(neighborPos) - const baseLight = baseLightLevel / 15 + const baseLight = world.getLight(neighborPos) / 15 for (const pos of corners) { let vertex = [ (pos[0] ? maxx : minx), @@ -418,6 +417,7 @@ function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr attr.tiles[`${cursor.x},${cursor.y},${cursor.z}`].faces.push({ face, neighbor: `${neighborPos.x},${neighborPos.y},${neighborPos.z}`, + light: baseLight // texture: eFace.texture.name, }) } diff --git a/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts b/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts index 21c5d129..a665db6b 100644 --- a/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts +++ b/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts @@ -1,6 +1,6 @@ import { setBlockStatesData, getSectionGeometry } from '../models' import { World as MesherWorld } from '../world' -import ChunkLoader from 'prismarine-chunk' +import ChunkLoader, { PCChunk } from 'prismarine-chunk' import { Vec3 } from 'vec3' import MinecraftData from 'minecraft-data' @@ -26,18 +26,25 @@ export const setup = (version, initialBlocks: [number[], string][]) => { return { centerFaces, totalTiles, - centerTileNeighbors + centerTileNeighbors, + faces: sectionGeometry.tiles[`${pos.x},${pos.y},${pos.z}`]?.faces ?? [] } } setBlockStatesData(blockStates, true) - mesherWorld.addColumn(0, 0, chunk1.toJson()) + const reload = () => { + mesherWorld.removeColumn(0, 0) + mesherWorld.addColumn(0, 0, chunk1.toJson()) + } + reload() return { mesherWorld, getGeometry, pos, - mcData + mcData, + reload, + chunk: chunk1 as PCChunk } } diff --git a/prismarine-viewer/viewer/lib/viewer.ts b/prismarine-viewer/viewer/lib/viewer.ts index 9f8067db..65091f3e 100644 --- a/prismarine-viewer/viewer/lib/viewer.ts +++ b/prismarine-viewer/viewer/lib/viewer.ts @@ -38,9 +38,9 @@ export class Viewer { this.scene = new THREE.Scene() this.scene.matrixAutoUpdate = false // for perf - this.resetScene() - this.threeJsWorld = new WorldRendererThree(this.scene, this.renderer, this.camera, worldConfig) + this.threeJsWorld = new WorldRendererThree(this.scene, this.renderer, worldConfig) this.setWorld() + this.resetScene() this.entities = new Entities(this.scene) // this.primitives = new Primitives(this.scene, this.camera) diff --git a/prismarine-viewer/viewer/lib/worldrendererThree.ts b/prismarine-viewer/viewer/lib/worldrendererThree.ts index 1fff112f..a099dbbc 100644 --- a/prismarine-viewer/viewer/lib/worldrendererThree.ts +++ b/prismarine-viewer/viewer/lib/worldrendererThree.ts @@ -20,7 +20,7 @@ export class WorldRendererThree extends WorldRendererCommon { return Object.values(this.sectionObjects).reduce((acc, obj) => acc + (obj as any).tilesCount, 0) } - constructor(public scene: THREE.Scene, public renderer: THREE.WebGLRenderer, public camera: THREE.PerspectiveCamera, public config: WorldRendererConfig) { + constructor(public scene: THREE.Scene, public renderer: THREE.WebGLRenderer, public config: WorldRendererConfig) { super(config) } diff --git a/src/react/ServersListProvider.tsx b/src/react/ServersListProvider.tsx index 85c55ed6..5da2fc68 100644 --- a/src/react/ServersListProvider.tsx +++ b/src/react/ServersListProvider.tsx @@ -180,16 +180,13 @@ const Inner = () => { const isEditScreenModal = useIsModalActive('editServer') - useEffect(() => { - if (!isEditScreenModal) { - setServerEditScreen(null) - } - }, [isEditScreenModal]) - useEffect(() => { if (serverEditScreen && !isEditScreenModal) { showModal({ reactType: 'editServer' }) } + if (!serverEditScreen && isEditScreenModal) { + hideCurrentModal() + } }, [serverEditScreen]) if (isEditScreenModal) { From 03b3e56a74eb8c375b67209b88892bea35292378 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Mon, 6 May 2024 19:06:44 +0300 Subject: [PATCH 0166/1195] fix: reload the page on quit button until issues with time desync are fixed up squid to restore support for 1.14 worlds --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- src/flyingSquidUtils.ts | 1 + src/react/AppStatus.tsx | 2 +- src/react/PauseScreen.tsx | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index fdaecb65..acee3c83 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "esbuild": "^0.19.3", "esbuild-plugin-polyfill-node": "^0.3.0", "express": "^4.18.2", - "flying-squid": "npm:@zardoy/flying-squid@^0.0.19", + "flying-squid": "npm:@zardoy/flying-squid@^0.0.20", "fs-extra": "^11.1.1", "google-drive-browserfs": "github:zardoy/browserfs#google-drive", "iconify-icon": "^1.0.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 21d48b30..36cc8e30 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -99,8 +99,8 @@ importers: specifier: ^10.0.12 version: 10.0.12 flying-squid: - specifier: npm:@zardoy/flying-squid@^0.0.19 - version: '@zardoy/flying-squid@0.0.19(encoding@0.1.13)' + specifier: npm:@zardoy/flying-squid@^0.0.20 + version: '@zardoy/flying-squid@0.0.20(encoding@0.1.13)' fs-extra: specifier: ^11.1.1 version: 11.1.1 @@ -3043,8 +3043,8 @@ packages: resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - '@zardoy/flying-squid@0.0.19': - resolution: {integrity: sha512-q0eW/AO66bA5YQfGd+mnZjenZ7oocCrxlU4ktJbS4vfhjC2PPLzXLpWhXnzqN9A3VSzMzraV/9SY9kGQkw8xNA==} + '@zardoy/flying-squid@0.0.20': + resolution: {integrity: sha512-WyejZS2Upzv86g6Ez5Z/4Pd0ea9tkFL2itAj24UNpO7fyzxuTN2Ag1Ouvh+MSkCloXhR4E/yoER2krHW8vzwBw==} engines: {node: '>=8'} hasBin: true @@ -11913,7 +11913,7 @@ snapshots: '@types/emscripten': 1.39.8 tslib: 1.14.1 - '@zardoy/flying-squid@0.0.19(encoding@0.1.13)': + '@zardoy/flying-squid@0.0.20(encoding@0.1.13)': dependencies: change-case: 4.1.2 colors: 1.4.0 diff --git a/src/flyingSquidUtils.ts b/src/flyingSquidUtils.ts index 2590468d..bd312bfb 100644 --- a/src/flyingSquidUtils.ts +++ b/src/flyingSquidUtils.ts @@ -38,4 +38,5 @@ export const disconnect = async () => { } window.history.replaceState({}, '', `${window.location.pathname}`) // remove qs bot.end('You left the server') + location.reload() } diff --git a/src/react/AppStatus.tsx b/src/react/AppStatus.tsx index b1b98c35..9bf2ece1 100644 --- a/src/react/AppStatus.tsx +++ b/src/react/AppStatus.tsx @@ -44,7 +44,7 @@ export default ({ status, isError, hideDots = false, lastStatus = '', backAction <> {backAction && + )} diff --git a/src/react/PauseScreen.tsx b/src/react/PauseScreen.tsx index a224f9e6..0d63df5d 100644 --- a/src/react/PauseScreen.tsx +++ b/src/react/PauseScreen.tsx @@ -137,7 +137,7 @@ export default () => {
) : null}
From 3046524ff6243dbcccb43985cf11970ac02b76f6 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 8 May 2024 20:36:05 +0300 Subject: [PATCH 0167/1195] chore: fix all tests feat: add lockConnect to QS options for alt connection screen UI --- README.MD | 9 +++++---- cypress/e2e/index.spec.ts | 4 ++-- src/react/{AddServer.tsx => AddServerOrConnect.tsx} | 6 +++--- src/react/ServersList.stories.tsx | 4 ++-- src/react/ServersListProvider.tsx | 6 +++--- 5 files changed, 15 insertions(+), 14 deletions(-) rename src/react/{AddServer.tsx => AddServerOrConnect.tsx} (96%) diff --git a/README.MD b/README.MD index 1b8b84ac..bc39fb98 100644 --- a/README.MD +++ b/README.MD @@ -103,10 +103,11 @@ world chunks have a *yellow* border, hostile mobs have a *red* outline, passive Press `Y` to set query parameters to url of your current game state. -- `?server=` - Display connect screen to the server on load -- `?username=` - Set the username on load -- `?proxy=` - Set the proxy server address on load -- `?version=` - Set the version on load +- `?ip=` - Display connect screen to the server on load +- `?username=` - Set the username for server +- `?proxy=` - Set the proxy server address to use for server +- `?version=` - Set the version for server +- `?lockConnect=true` - Disable cancel / save buttons, useful for integrates iframes - `?reconnect=true` - Reconnect to the server on page reloads. Available in **dev mode only** and very useful on server testing. - `?loadSave=` - Load the save on load with the specified folder name (not title) diff --git a/cypress/e2e/index.spec.ts b/cypress/e2e/index.spec.ts index 35399393..455b1283 100644 --- a/cypress/e2e/index.spec.ts +++ b/cypress/e2e/index.spec.ts @@ -38,7 +38,7 @@ const setOptions = (options: Partial) => { } it('Loads & renders singleplayer', () => { - cleanVisit('/?singleplayer=1') + visit('/?singleplayer=1') setOptions({ localServerOptions: { generation: { @@ -52,7 +52,7 @@ it('Loads & renders singleplayer', () => { testWorldLoad() }) -it.only('Joins to server', () => { +it('Joins to server', () => { visit('/?ip=localhost&version=1.16.1') window.localStorage.version = '' // todo replace with data-test diff --git a/src/react/AddServer.tsx b/src/react/AddServerOrConnect.tsx similarity index 96% rename from src/react/AddServer.tsx rename to src/react/AddServerOrConnect.tsx index bae39ac9..54f04af1 100644 --- a/src/react/AddServer.tsx +++ b/src/react/AddServerOrConnect.tsx @@ -38,6 +38,7 @@ export default ({ onBack, onConfirm, title = 'Add a Server', initialData, parseQ const [usernameOverride, setUsernameOverride] = React.useState(initialData?.usernameOverride ?? qsParams?.get('username') ?? '') const [passwordOverride, setPasswordOverride] = React.useState(initialData?.passwordOverride ?? qsParams?.get('password') ?? '') const smallWidth = useIsSmallWidth() + const lockConnect = qsParams?.get('lockConnect') === 'true' return
setProxyOverride(value)} placeholder={defaults?.proxyOverride} /> setUsernameOverride(value)} placeholder={defaults?.usernameOverride} /> setPasswordOverride(value)} /* placeholder='For advanced usage only' */ /> - - + } }>Cancel} {qsParams?.get('ip') &&
} diff --git a/src/styles.css b/src/styles.css index 30abc52b..fa57e51d 100644 --- a/src/styles.css +++ b/src/styles.css @@ -134,6 +134,18 @@ body { -ms-interpolation-mode: nearest-neighbor; } +.overlay-top-scaled { + position: fixed; + inset: 0; + transform-origin: top left; + transform: scale(var(--guiScale)); + width: calc(100% / var(--guiScale)); + height: calc(100% / var(--guiScale)); + z-index: 80; + image-rendering: pixelated; + pointer-events: none; +} + #viewer-canvas { position: fixed; top: 0; From 620488af201a02fc38bc19a604876a26884c01a2 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 10 May 2024 05:08:28 +0300 Subject: [PATCH 0173/1195] Add Gamepad UI Cursor component and styles --- src/react/GamepadUiCursor.module.css | 11 ++++++++ src/react/GamepadUiCursor.tsx | 40 ++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/react/GamepadUiCursor.module.css create mode 100644 src/react/GamepadUiCursor.tsx diff --git a/src/react/GamepadUiCursor.module.css b/src/react/GamepadUiCursor.module.css new file mode 100644 index 00000000..f3f114e4 --- /dev/null +++ b/src/react/GamepadUiCursor.module.css @@ -0,0 +1,11 @@ +.crosshair { + width: 16px; + height: 16px; + background: var(--gui-icons); + background-size: calc(256px * var(--crosshair-scale)); + position: fixed; + z-index: 100; + transform: translate(-50%, -50%); + pointer-events: none; + image-rendering: pixelated; +} diff --git a/src/react/GamepadUiCursor.tsx b/src/react/GamepadUiCursor.tsx new file mode 100644 index 00000000..84c9b63a --- /dev/null +++ b/src/react/GamepadUiCursor.tsx @@ -0,0 +1,40 @@ +import { proxy, useSnapshot } from 'valtio' +import { useEffect } from 'react' +import { activeModalStack, miscUiState } from '../globalState' +import SharedHudVars from './SharedHudVars' +import styles from './GamepadUiCursor.module.css' + +export const gamepadUiCursorState = proxy({ + x: 50, + y: 50, + multiply: 1, + display: false +}) + +export const moveGamepadCursorByPx = (value: number, isX: boolean) => { + value *= gamepadUiCursorState.multiply * 3 + const valueToPercentage = value / (isX ? window.innerWidth : window.innerHeight) * 100 + gamepadUiCursorState[isX ? 'x' : 'y'] += valueToPercentage +} + +export default () => { + const hasModals = useSnapshot(activeModalStack).length > 0 + const { x, y } = useSnapshot(gamepadUiCursorState) + const { usingGamepadInput, gameLoaded } = useSnapshot(miscUiState) + + const doDisplay = usingGamepadInput && (hasModals || !gameLoaded) + + useEffect(() => { + document.body.style.cursor = gameLoaded && !hasModals && usingGamepadInput ? 'none' : 'auto' + }, [usingGamepadInput, hasModals, gameLoaded]) + + useEffect(() => { + gamepadUiCursorState.display = doDisplay + }, [doDisplay]) + + if (!doDisplay) return null + + return +
+ +} From e9443cd2fe0dece8749e291444473a89c6767459 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 9 May 2024 21:17:16 +0300 Subject: [PATCH 0174/1195] ui: fix input alignment --- src/react/input.module.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/react/input.module.css b/src/react/input.module.css index ce889645..ce181ade 100644 --- a/src/react/input.module.css +++ b/src/react/input.module.css @@ -8,7 +8,7 @@ } .input { - position: relative; + position: absolute; outline: none; border: none; background: none; From 3f068ed0da7ebb4cd6519c0d473683cb86ebd28d Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 10 May 2024 06:03:25 +0300 Subject: [PATCH 0175/1195] fix tsc --- src/react/TouchAreasControls.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/react/TouchAreasControls.tsx b/src/react/TouchAreasControls.tsx index f56db047..b660fcb2 100644 --- a/src/react/TouchAreasControls.tsx +++ b/src/react/TouchAreasControls.tsx @@ -40,12 +40,14 @@ export const handleMovementStickDelta = (e?: { clientX, clientY }) => { } joystickPointer.joystickInner!.style.transform = `translate(${x}px, ${y}px)` + const vector = { + x: x / max, + y: 0, + z: y / max, + } void contro.emit('movementUpdate', { - vector: { - x: x / max, - y: 0, - z: y / max, - }, + vector, + soleVector: vector }) } From b7d317825f1f32a03b235249a2f403e9584d3a82 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 11 May 2024 21:15:51 +0300 Subject: [PATCH 0176/1195] fix lighting in playround for pre-flat versions --- prismarine-viewer/examples/playground.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/prismarine-viewer/examples/playground.ts b/prismarine-viewer/examples/playground.ts index 295cc47d..223fc6f2 100644 --- a/prismarine-viewer/examples/playground.ts +++ b/prismarine-viewer/examples/playground.ts @@ -138,6 +138,7 @@ async function main () { viewer.entities.onSkinUpdate = () => { viewer.render() } + viewer.world.mesherConfig.enableLighting = false viewer.listen(worldView) // Load chunks From 54a7e52cff8c6d372ca93f921188a17399955758 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 11 May 2024 21:20:30 +0300 Subject: [PATCH 0177/1195] add light test utils --- .../viewer/lib/mesher/test/mesherTester.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts b/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts index a665db6b..6103a3d4 100644 --- a/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts +++ b/prismarine-viewer/viewer/lib/mesher/test/mesherTester.ts @@ -38,8 +38,22 @@ export const setup = (version, initialBlocks: [number[], string][]) => { } reload() + const getLights = () => { + return Object.fromEntries(getGeometry().faces.map(({ face, light }) => ([face, light * 15 - 2]))) + } + + const setLight = (x: number, y: number, z: number, val = 0) => { + // create columns first + chunk1.setBlockLight(pos.offset(x, y, z), 15) + chunk1.setSkyLight(pos.offset(x, y, z), 15) + chunk1.setBlockLight(pos.offset(x, y, z), val) + chunk1.setSkyLight(pos.offset(x, y, z), 0) + } + return { mesherWorld, + setLight, + getLights, getGeometry, pos, mcData, From 02fb4c93940ec995ccf89dca52d28c8b44c49781 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 13 May 2024 02:15:58 +0300 Subject: [PATCH 0178/1195] fix different width in server menu --- src/react/singleplayer.module.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/react/singleplayer.module.css b/src/react/singleplayer.module.css index fef43b76..c7ec49f6 100644 --- a/src/react/singleplayer.module.css +++ b/src/react/singleplayer.module.css @@ -23,7 +23,7 @@ .world_root { height: 40px; - width: 300px; + width: 308px; border: 1px solid transparent; display: flex; outline: none; @@ -43,6 +43,7 @@ flex-direction: column; font-size: 11px; white-space: nowrap; + width: 100%; } .world_info_formatted { font-size: 10px; From ef146f7a28c5105f47810d50db6b6995db120924 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 13 May 2024 03:42:31 +0300 Subject: [PATCH 0179/1195] fix(hud): fix safe bottom area for iOS devices when clicked "Hide Toolbar" https://forums.developer.apple.com/forums/thread/716552 chore: add new experiment for demo --- experiments/ios-safe-area-bottom-bug.html | 15 +++++++++++++++ package.json | 2 +- src/react/HotbarRenderApp.tsx | 2 +- src/react/SharedHudVars.tsx | 6 ++++-- 4 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 experiments/ios-safe-area-bottom-bug.html diff --git a/experiments/ios-safe-area-bottom-bug.html b/experiments/ios-safe-area-bottom-bug.html new file mode 100644 index 00000000..53d867f5 --- /dev/null +++ b/experiments/ios-safe-area-bottom-bug.html @@ -0,0 +1,15 @@ + +
+ bottom: env(safe-area-inset-bottom) +
diff --git a/package.json b/package.json index 11324549..92de17cf 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "lint": "eslint \"{src,cypress}/**/*.{ts,js,jsx,tsx}\"", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build && node scripts/build.js moveStorybookFiles", - "start-experiments": "vite --config experiments/vite.config.ts", + "start-experiments": "vite --config experiments/vite.config.ts --host", "watch-other-workers": "echo NOT IMPLEMENTED", "watch-mesher": "node prismarine-viewer/buildMesherWorker.mjs -w", "run-playground": "run-p watch-mesher watch-other-workers playground-server watch-playground", diff --git a/src/react/HotbarRenderApp.tsx b/src/react/HotbarRenderApp.tsx index 5b32e3cc..3b50f49b 100644 --- a/src/react/HotbarRenderApp.tsx +++ b/src/react/HotbarRenderApp.tsx @@ -211,7 +211,7 @@ export default () => { justifyContent: 'center', zIndex: hasModals ? 1 : 8, pointerEvents: 'none', - bottom: 'env(safe-area-inset-bottom)' + bottom: 'var(--hud-bottom-raw)' }} /> diff --git a/src/react/SharedHudVars.tsx b/src/react/SharedHudVars.tsx index 9a9392fd..6cc0c54e 100644 --- a/src/react/SharedHudVars.tsx +++ b/src/react/SharedHudVars.tsx @@ -8,10 +8,12 @@ export default ({ children }): React.ReactElement => { // 1. Don't inline long data URLs for better DX in elements tab // 2. Easier application to globally override icons with custom image (eg from resourcepacks) const css = /* css */` - :root { + html { --widgets-gui-atlas: url(${widgets}); --gui-icons: url(${icons}), url(${icons}); - --safe-area-inset-bottom: calc(env(safe-area-inset-bottom) / 2); + --hud-bottom-max: 0px; + --hud-bottom-raw: max(env(safe-area-inset-bottom), var(--hud-bottom-max)); + --safe-area-inset-bottom: calc(var(--hud-bottom-raw) / 2); } ` const style = document.createElement('style') From 0a1b97857c4c464da0fc306154420b577e9dad9c Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 13 May 2024 03:43:10 +0300 Subject: [PATCH 0180/1195] feat: add a way to specify version from quick connect e.g. test.com:1.18.2 or 192.168.0.100:25566:1.17.1 --- src/react/ServersList.tsx | 12 ++++++++++-- src/react/ServersListProvider.tsx | 7 +++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/react/ServersList.tsx b/src/react/ServersList.tsx index 2fbbd349..f6b89452 100644 --- a/src/react/ServersList.tsx +++ b/src/react/ServersList.tsx @@ -60,14 +60,22 @@ export default ({ initialProxies, updateProxies: updateProxiesProp, joinServer, return { e.preventDefault() - joinServer(serverIp, { + let ip = serverIp + let version + const parts = ip.split(':') + if (parts.length > 1 && parts.at(-1)!.includes('.')) { + version = parts.at(-1)! + ip = parts.slice(0, -1).join(':') + } + joinServer(ip, { shouldSave: save, + versionOverride: version, }) }} >
{/* todo history */} - setServerIp(value)} /> + setServerIp(value)} />
- ) : null } + ) : null} {level > 0 && level < 256 ? (
{level + 1}
- ) : null } + ) : null}
} @@ -56,7 +56,7 @@ const indicatorIcons: Record = { readonlyFiles: 'file-off', } -export default ({ indicators, effects }: {indicators: typeof defaultIndicatorsState, effects: readonly EffectType[]}) => { +export default ({ indicators, effects }: { indicators: typeof defaultIndicatorsState, effects: readonly EffectType[] }) => { const effectsRef = useRef(effects) useEffect(() => { effectsRef.current = effects diff --git a/src/reactUi.tsx b/src/reactUi.tsx index 94ea6b88..9a79de34 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -36,6 +36,7 @@ import Crosshair from './react/Crosshair' import ButtonAppProvider from './react/ButtonAppProvider' import ServersListProvider from './react/ServersListProvider' import GamepadUiCursor from './react/GamepadUiCursor' +import HeldMapUi from './react/HeldMapUi' const RobustPortal = ({ children, to }) => { return createPortal({children}, to) @@ -85,6 +86,12 @@ const GameHud = ({ children }) => { return gameLoaded ? children : null } +const InGameComponent = ({ children }) => { + const { gameLoaded } = useSnapshot(miscUiState) + if (!gameLoaded) return null + return children +} + const InGameUi = () => { const { gameLoaded } = useSnapshot(miscUiState) if (!gameLoaded) return @@ -135,6 +142,14 @@ const WidgetDisplay = ({ name, Component }) => { const App = () => { return
+ +
+ + + +
+
+
@@ -151,6 +166,7 @@ const App = () => { */} + {/* todo correct mounting! */}
diff --git a/src/styles.css b/src/styles.css index fa57e51d..139996e9 100644 --- a/src/styles.css +++ b/src/styles.css @@ -134,7 +134,7 @@ body { -ms-interpolation-mode: nearest-neighbor; } -.overlay-top-scaled { +.overlay-top-scaled, .overlay-bottom-scaled { position: fixed; inset: 0; transform-origin: top left; @@ -146,6 +146,10 @@ body { pointer-events: none; } +.overlay-bottom-scaled { + z-index: 1; +} + #viewer-canvas { position: fixed; top: 0; diff --git a/src/worldInteractions.ts b/src/worldInteractions.ts index c3263f2f..2e20de29 100644 --- a/src/worldInteractions.ts +++ b/src/worldInteractions.ts @@ -197,7 +197,7 @@ class WorldInteraction { 'minecart', 'boat', 'tnt_minecart', 'chest_minecart', 'hopper_minecart', 'command_block_minecart', 'armor_stand', 'lead', 'name_tag', // - 'writable_book', 'written_book', 'compass', 'clock', 'filled_map', 'empty_map', + 'writable_book', 'written_book', 'compass', 'clock', 'filled_map', 'empty_map', 'map', 'shears', 'carrot_on_a_stick', 'warped_fungus_on_a_stick', 'spawn_egg', 'trident', 'crossbow', 'elytra', 'shield', 'turtle_helmet', ].includes(bot.heldItem.name) @@ -219,10 +219,10 @@ class WorldInteraction { bot.lookAt = oldLookAt }).catch(console.warn) } - this.lastBlockPlaced = 0 } else { bot.activateItem() // todo offhand } + this.lastBlockPlaced = 0 } // Stop break From 3329d0e75eaffca181d652f0fb80df96a8e3b90c Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 13 May 2024 04:14:16 +0300 Subject: [PATCH 0183/1195] fix: held item display was not updated after server/window GUI manipulation on inventory --- src/index.ts | 9 +++++++++ src/react/HeldMapUi.tsx | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 69886b3b..8dbc46cf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -547,6 +547,15 @@ async function connect (connectOptions: ConnectOptions) { window.Vec3 = Vec3 window.pathfinder = pathfinder + // patch mineflayer + // todo move to mineflayer + bot.inventory.on('updateSlot', (index) => { + if ((index as unknown as number) === bot.quickBarSlot + bot.inventory.hotbarStart) { + //@ts-expect-error + bot.emit('heldItemChanged') + } + }) + miscUiState.gameLoaded = true miscUiState.loadedServerIndex = connectOptions.serverIndex ?? '' customEvents.emit('gameLoaded') diff --git a/src/react/HeldMapUi.tsx b/src/react/HeldMapUi.tsx index 242cba03..9187c98b 100644 --- a/src/react/HeldMapUi.tsx +++ b/src/react/HeldMapUi.tsx @@ -20,13 +20,14 @@ export default () => { return canvas.toDataURL('image/png') }) + // TODO delete maps! const updateHeldMap = () => { setDataUrl(null) if (!bot.heldItem || !['filled_map', 'map'].includes(bot.heldItem.name)) return // setDataUrl(true) const mapNumber = (bot.heldItem?.nbt?.value as any)?.map?.value // if (!mapNumber) return - setDataUrl(bot.mapDownloader.maps[mapNumber] as unknown as string) + setDataUrl(bot.mapDownloader.maps?.[mapNumber] as unknown as string) } bot.on('heldItemChanged' as any, () => { From c1651ce3b55ec846fd459b9c61461ce3040211e2 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 13 May 2024 15:36:11 +0300 Subject: [PATCH 0184/1195] fix: some collision shapes were missing for 1.20.4 --- ...Shapes.mjs => generateMoreCollisionShapes.mjs} | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) rename scripts/{getMoreCollisionShapes.mjs => generateMoreCollisionShapes.mjs} (94%) diff --git a/scripts/getMoreCollisionShapes.mjs b/scripts/generateMoreCollisionShapes.mjs similarity index 94% rename from scripts/getMoreCollisionShapes.mjs rename to scripts/generateMoreCollisionShapes.mjs index 3f772af1..ee178478 100644 --- a/scripts/getMoreCollisionShapes.mjs +++ b/scripts/generateMoreCollisionShapes.mjs @@ -1,8 +1,11 @@ +//@ts-check import minecraftData from 'minecraft-data' import minecraftAssets from 'minecraft-assets' import fs from 'fs' -const latestData = minecraftData('1.20.2') +const latestVersion = minecraftData.versions.pc[0] + +const latestData = minecraftData(latestVersion.minecraftVersion) // dont touch, these are the ones that are already full box const fullBoxInteractionShapes = [ @@ -62,7 +65,7 @@ const fullBoxInteractionShapesTemp = [ 'white_wall_banner', ] -const shapes = latestData.blockCollisionShapes; +const shapes = latestData.blockCollisionShapes const fullShape = shapes.shapes[1] const outputJson = {} @@ -97,8 +100,8 @@ const interestedBlocks = latestData.blocksArray.filter(block => { const { blocksStates, blocksModels } = minecraftAssets(latestData.version.minecraftVersion) const getShapeFromModel = (block,) => { - const blockStates = JSON.parse(fs.readFileSync('./prismarine-viewer/public/blocksStates/1.19.1.json')) - const blockState = blockStates[block]; + const blockStates = JSON.parse(fs.readFileSync('./prismarine-viewer/public/blocksStates/1.19.1.json', 'utf8')) + const blockState = blockStates[block] const perVariant = {} for (const [key, variant] of Object.entries(blockState.variants)) { // const shapes = (Array.isArray(variant) ? variant : [variant]).flatMap((v) => v.model?.elements).filter(Boolean).map(({ from, to }) => [...from, ...to]).reduce((acc, cur) => { @@ -146,7 +149,7 @@ outer: for (const interestedBlock of [...interestedBlocksNoStates, ...interested } } - const hasStates = interestedBlocksStates.includes(interestedBlock); + const hasStates = interestedBlocksStates.includes(interestedBlock) if (hasStates) { const states = blocksStates[interestedBlock] if (!states) { @@ -159,7 +162,7 @@ outer: for (const interestedBlock of [...interestedBlocksNoStates, ...interested continue } let outputStates = {} - for (const {when} of states.multipart) { + for (const { when } of states.multipart) { if (when) { for (const [key, value] of Object.entries(when)) { if (key === 'OR') { From 6f085ac5061e2d38b2f7fa71c1df3127b549186f Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 13 May 2024 15:49:10 +0300 Subject: [PATCH 0185/1195] fix: entity text was not displayed in some edge-cases --- prismarine-viewer/viewer/lib/entities.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/prismarine-viewer/viewer/lib/entities.js b/prismarine-viewer/viewer/lib/entities.js index 290c3932..136c77fe 100644 --- a/prismarine-viewer/viewer/lib/entities.js +++ b/prismarine-viewer/viewer/lib/entities.js @@ -1,10 +1,10 @@ //@ts-check -const THREE = require('three') -const TWEEN = require('@tweenjs/tween.js') - -const Entity = require('./entity/EntityMesh') -const { dispose3 } = require('./dispose') -const EventEmitter = require('events') +import * as THREE from 'three' +import * as TWEEN from '@tweenjs/tween.js' +import * as Entity from './entity/EntityMesh' +import { dispose3 } from './dispose' +import nbt from 'prismarine-nbt' +import EventEmitter from 'events' import { PlayerObject, PlayerAnimation } from 'skinview3d' import { loadSkinToCanvas, loadEarsToCanvasFromSkin, inferModelType, loadCapeToCanvas, loadImage } from 'skinview-utils' // todo replace with url @@ -264,7 +264,7 @@ export class Entities extends EventEmitter { displaySimpleText(jsonLike) { if (!jsonLike) return - const parsed = mojangson.simplify(mojangson.parse(jsonLike)) + const parsed = typeof jsonLike === 'string' ? mojangson.simplify(mojangson.parse(jsonLike)) : nbt.simplify(jsonLike) const text = flat(parsed).map(x => x.text) return text.join('') } From 8d710e297eb116c45160d19f791cddf1ab485ea0 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 13 May 2024 15:54:33 +0300 Subject: [PATCH 0186/1195] save version override from quick connect --- src/react/ServersListProvider.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/react/ServersListProvider.tsx b/src/react/ServersListProvider.tsx index 07bbba31..bd39bc10 100644 --- a/src/react/ServersListProvider.tsx +++ b/src/react/ServersListProvider.tsx @@ -252,9 +252,10 @@ const Inner = () => { autoLoginPassword: server?.autoLogin?.[username], onSuccessfulPlay () { if (overrides.shouldSave && !serversList.some(s => s.ip === ip)) { - const newServersList = [...serversList, { + const newServersList: StoreServerItem[] = [...serversList, { ip, lastJoined: Date.now(), + versionOverride: overrides.versionOverride, }] // setServersList(newServersList) setNewServersList(newServersList) // component is not mounted From 5198e698160483fcc2aaacb508cee63501d546a2 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 18 May 2024 05:57:50 +0300 Subject: [PATCH 0187/1195] fix: correctly display item names in inventory GUI fix: fix opening nested inventory GUI on servers! --- README.MD | 4 ++++ src/globalState.ts | 6 +++--- src/inventoryWindows.ts | 27 +++++++++++++++++++++------ 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/README.MD b/README.MD index ce368540..225cdda2 100644 --- a/README.MD +++ b/README.MD @@ -126,3 +126,7 @@ Press `Y` to set query parameters to url of your current game state. - [Minecraft Protocol](https://github.com/PrismarineJS/node-minecraft-protocol) - Makes connections to servers possible - [Peer.js](https://peerjs.com/) - P2P networking (when you open to wan) - [Three.js](https://threejs.org/) - Helping in 3D rendering + +### Alternatives + +- [https://github.com/ClassiCube/ClassiCube](ClassiCube - Better C# Rewrite) [https://www.classicube.net/](https://www.classicube.net/server/play/?warned=true) diff --git a/src/globalState.ts b/src/globalState.ts index 1b0526f9..4b62f8d6 100644 --- a/src/globalState.ts +++ b/src/globalState.ts @@ -8,7 +8,7 @@ import type { OptionsGroupType } from './optionsGuiScheme' const notHideableModalsWithoutForce = new Set(['app-status']) -type Modal = ({ elem?: HTMLElement & Record } & { reactType?: string }) +type Modal = ({ elem?: HTMLElement & Record } & { reactType: string }) type ContextMenuItem = { callback; label } @@ -57,7 +57,7 @@ const showModalInner = (modal: Modal) => { } export const showModal = (elem: /* (HTMLElement & Record) | */{ reactType: string }) => { - const resolved = elem instanceof HTMLElement ? { elem: ref(elem) } : elem + const resolved = elem const curModal = activeModalStack.at(-1) if (/* elem === curModal?.elem || */(elem.reactType && elem.reactType === curModal?.reactType) || !showModalInner(resolved)) return if (curModal) defaultModalActions.hide(curModal) @@ -123,7 +123,7 @@ export type AppConfig = { defaultProxy?: string // defaultProxySave?: string // defaultVersion?: string - promoteServers?: Array<{ip, description, version?}> + promoteServers?: Array<{ ip, description, version?}> mapsProvider?: string } diff --git a/src/inventoryWindows.ts b/src/inventoryWindows.ts index d9fda1c7..d87d4008 100644 --- a/src/inventoryWindows.ts +++ b/src/inventoryWindows.ts @@ -123,6 +123,11 @@ export const onGameLoad = (onLoad) => { // todo hide up to the window itself! hideCurrentModal() }) + bot.on('respawn', () => { // todo validate logic against native client (maybe login) + if (lastWindow) { + hideCurrentModal() + } + }) customEvents.on('search', (q) => { if (!lastWindow) return @@ -316,10 +321,10 @@ export const getItemNameRaw = (item: Pick const getItemName = (slot: Item | null) => { const parsed = getItemNameRaw(slot) - if (!parsed || parsed['extra']) return + if (!parsed) return // todo display full text renderer from sign renderer const text = flat(parsed as MessageFormatPart).map(x => x.text) - return text + return text.join('') } export const renderSlotExternal = (slot) => { @@ -362,12 +367,15 @@ export const onModalClose = (callback: () => any) => { callback() unsubscribe() } - }) + }, true) } const implementedContainersGuiMap = { // todo allow arbitrary size instead! + 'minecraft:generic_9x1': 'ChestWin', + 'minecraft:generic_9x2': 'ChestWin', 'minecraft:generic_9x3': 'ChestWin', + 'minecraft:generic_9x4': 'Generic95Win', 'minecraft:generic_9x5': 'Generic95Win', // hopper 'minecraft:generic_5x1': 'HopperWin', @@ -401,22 +409,29 @@ export const openItemsCanvas = (type, _bot = bot as typeof bot | null) => { return inv } +let skipClosePacketSending = false const openWindow = (type: string | undefined) => { // if (activeModalStack.some(x => x.reactType?.includes?.('player_win:'))) { if (activeModalStack.length) { // game is not in foreground, don't close current modal - if (type) bot.currentWindow?.['close']() - return + if (type) { + skipClosePacketSending = true + hideCurrentModal() + } else { + bot.currentWindow?.['close']() + return + } } showModal({ reactType: `player_win:${type}`, }) onModalClose(() => { // might be already closed (event fired) - if (type !== undefined && bot.currentWindow) bot.currentWindow['close']() + if (type !== undefined && bot.currentWindow && !skipClosePacketSending) bot.currentWindow['close']() lastWindow.destroy() lastWindow = null as any miscUiState.displaySearchInput = false destroyFn() + skipClosePacketSending = false }) cleanLoadedImagesCache() const inv = openItemsCanvas(type) From 6375df15763c0bae6eb36a59801be43f6ad27384 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 18 May 2024 22:24:52 +0300 Subject: [PATCH 0188/1195] improve readme clarity --- README.MD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.MD b/README.MD index 225cdda2..af966101 100644 --- a/README.MD +++ b/README.MD @@ -120,7 +120,7 @@ Press `Y` to set query parameters to url of your current game state. ### Notable Things that Power this Project - [Mineflayer](https://github.com/PrismarineJS/mineflayer) - Handles all client-side communications with the server (including the builtin one) - forked -- [Flying Squid](https://github.com/prismarineJS/flying-squid) - The builtin server that makes single player possible! Here forked version is used. +- [Forked Flying Squid (Space Squid)](https://github.com/zardoy/space-squid) - The builtin offline server that makes single player & P2P possible! - [Prismarine Provider Anvil](https://github.com/PrismarineJS/prismarine-provider-anvil) - Handles world loading (region format) - [Prismarine Physics](https://github.com/PrismarineJS/prismarine-physics) - Does all the physics calculations - [Minecraft Protocol](https://github.com/PrismarineJS/node-minecraft-protocol) - Makes connections to servers possible @@ -129,4 +129,4 @@ Press `Y` to set query parameters to url of your current game state. ### Alternatives -- [https://github.com/ClassiCube/ClassiCube](ClassiCube - Better C# Rewrite) [https://www.classicube.net/](https://www.classicube.net/server/play/?warned=true) +- [https://github.com/ClassiCube/ClassiCube](ClassiCube - Better C# Rewrite) [DEMO](https://www.classicube.net/server/play/?warned=true) From 6bf1085fbe422b3e926fcb89e29da70ea2804c8d Mon Sep 17 00:00:00 2001 From: gguio <109200692+gguio@users.noreply.github.com> Date: Sat, 18 May 2024 23:51:35 +0400 Subject: [PATCH 0189/1195] feat: Key binds screen (#108) --------- Co-authored-by: gguio Co-authored-by: Vitaly --- esbuild.mjs | 1 + package.json | 2 +- pnpm-lock.yaml | 10 +- src/controls.ts | 28 +- ...tation_console_controller_gamepad_icon.svg | 1 + src/customCommands.ts | 91 ++++ src/optionsGuiScheme.tsx | 23 +- src/react/KeybindingsCustom.tsx | 171 ++++++++ src/react/KeybindingsScreen.module.css | 88 ++++ src/react/KeybindingsScreen.tsx | 388 +++++++++++++++++- src/react/KeybindingsScreenApp.tsx | 51 --- src/react/KeybindingsScreenProvider.tsx | 50 +++ src/react/OptionsGroup.tsx | 2 +- src/react/globals.d.ts | 4 + ...tation_console_controller_gamepad_icon.svg | 1 + ...tation_console_controller_gamepad_icon.svg | 1 + ...square_console_controller_gamepad_icon.svg | 1 + ...iangle_console_controller_gamepad_icon.svg | 1 + src/react/storageProvider.ts | 13 + src/reactUi.tsx | 2 + src/screens.css | 1 + 21 files changed, 858 insertions(+), 72 deletions(-) create mode 100644 src/cross_playstation_console_controller_gamepad_icon.svg create mode 100644 src/customCommands.ts create mode 100644 src/react/KeybindingsCustom.tsx create mode 100644 src/react/KeybindingsScreen.module.css delete mode 100644 src/react/KeybindingsScreenApp.tsx create mode 100644 src/react/KeybindingsScreenProvider.tsx create mode 100644 src/react/ps_icons/circle_playstation_console_controller_gamepad_icon.svg create mode 100644 src/react/ps_icons/cross_playstation_console_controller_gamepad_icon.svg create mode 100644 src/react/ps_icons/playstation_square_console_controller_gamepad_icon.svg create mode 100644 src/react/ps_icons/playstation_triangle_console_controller_gamepad_icon.svg create mode 100644 src/react/storageProvider.ts diff --git a/esbuild.mjs b/esbuild.mjs index 1e8d6478..d68693d8 100644 --- a/esbuild.mjs +++ b/esbuild.mjs @@ -79,6 +79,7 @@ const buildOptions = { loader: { // todo use external or resolve issues with duplicating '.png': 'dataurl', + '.svg': 'dataurl', '.map': 'empty', '.vert': 'text', '.frag': 'text', diff --git a/package.json b/package.json index 4bbeaf81..6905a8b7 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "browserify-zlib": "^0.2.0", "buffer": "^6.0.3", "constants-browserify": "^1.0.0", - "contro-max": "^0.1.6", + "contro-max": "^0.1.7", "crypto-browserify": "^3.12.0", "cypress": "^10.11.0", "cypress-esbuild-preprocessor": "^1.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index beb0c0a9..dcacb13a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -268,8 +268,8 @@ importers: specifier: ^1.0.0 version: 1.0.0 contro-max: - specifier: ^0.1.6 - version: 0.1.6(typescript@5.5.0-beta) + specifier: ^0.1.7 + version: 0.1.7(typescript@5.5.0-beta) crypto-browserify: specifier: ^3.12.0 version: 3.12.0 @@ -3811,8 +3811,8 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - contro-max@0.1.6: - resolution: {integrity: sha512-QsoOcAlbtNgkCGBvwKsh+GUVZ2c5zfMgYQCu+v4MplX5VolkWhMwAcEOBRxt8oENbnRXOKUGQr816Ey1G4/jpg==} + contro-max@0.1.7: + resolution: {integrity: sha512-HIYF1Dl50tUyTKaDsX+mPMDv2OjleNMVedYuBTX0n1wKNm9WxjWu2w74ATjz/8fHVL9GgmziIxAlFStd2je6kg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} convert-source-map@1.9.0: @@ -12851,7 +12851,7 @@ snapshots: content-type@1.0.5: {} - contro-max@0.1.6(typescript@5.5.0-beta): + contro-max@0.1.7(typescript@5.5.0-beta): dependencies: events: 3.3.0 lodash-es: 4.17.21 diff --git a/src/controls.ts b/src/controls.ts index 6dd47be2..6e38b90c 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -6,21 +6,24 @@ import { proxy, subscribe } from 'valtio' import { ControMax } from 'contro-max/build/controMax' import { CommandEventArgument, SchemaCommandInput } from 'contro-max/build/types' import { stringStartsWith } from 'contro-max/build/stringUtils' +import { UserOverridesConfig } from 'contro-max/build/types/store' import { isGameActive, showModal, gameAdditionalState, activeModalStack, hideCurrentModal, miscUiState } from './globalState' import { goFullscreen, pointerLock, reloadChunks } from './utils' import { options } from './optionsStorage' import { openPlayerInventory } from './inventoryWindows' import { chatInputValueGlobal } from './react/Chat' import { fsState } from './loadSave' +import { customCommandsConfig } from './customCommands' +import { CustomCommand } from './react/KeybindingsCustom' import { showOptionsModal } from './react/SelectOption' import widgets from './react/widgets' import { getItemFromBlock } from './botUtils' import { gamepadUiCursorState, moveGamepadCursorByPx } from './react/GamepadUiCursor' -// todo move this to shared file with component -export const customKeymaps = proxy(JSON.parse(localStorage.keymap || '{}')) + +export const customKeymaps = proxy(JSON.parse(localStorage.keymap || '{}')) as UserOverridesConfig subscribe(customKeymaps, () => { - localStorage.keymap = JSON.parse(customKeymaps) + localStorage.keymap = JSON.stringify(customKeymaps) }) const controlOptions = { @@ -53,7 +56,8 @@ export const contro = new ControMax({ }, advanced: { lockUrl: ['KeyY'], - } + }, + custom: {} as Record, // waila: { // showLookingBlockRecipe: ['Numpad3'], // showLookingBlockUsages: ['Numpad4'] @@ -81,6 +85,8 @@ export const contro = new ControMax({ window.controMax = contro export type Command = CommandEventArgument['command'] +// updateCustomBinds() + export const setDoPreventDefault = (state: boolean) => { controlOptions.preventDefault = state } @@ -285,6 +291,20 @@ function cycleHotbarSlot (dir: 1 | -1) { bot.setQuickBarSlot(newHotbarSlot) } +// custom commands hamdler +const customCommandsHandler = (buttonData: { code?: string, button?: string, state: boolean }) => { + if (!buttonData.state || !isGameActive(true)) return + + const codeOrButton = buttonData.code ?? buttonData.button + const inputType = buttonData.code ? 'keys' : 'gamepad' + for (const value of Object.values(contro.userConfig!.custom)) { + if (value[inputType]?.includes(codeOrButton!)) { + customCommandsConfig[(value as CustomCommand).type].handler((value as CustomCommand).inputs) + } + } +} +contro.on('pressedKeyOrButtonChanged', customCommandsHandler) + contro.on('trigger', ({ command }) => { const willContinue = !isGameActive(true) alwaysPressedHandledCommand(command) diff --git a/src/cross_playstation_console_controller_gamepad_icon.svg b/src/cross_playstation_console_controller_gamepad_icon.svg new file mode 100644 index 00000000..d7d176e2 --- /dev/null +++ b/src/cross_playstation_console_controller_gamepad_icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/customCommands.ts b/src/customCommands.ts new file mode 100644 index 00000000..eddfc89e --- /dev/null +++ b/src/customCommands.ts @@ -0,0 +1,91 @@ +import { guiOptionsScheme, tryFindOptionConfig } from './optionsGuiScheme' +import { options } from './optionsStorage' + +export const customCommandsConfig = { + chat: { + input: [ + { + type: 'text', + placeholder: 'Command to send e.g. gamemode creative' + } + ], + handler ([command]) { + bot.chat(`/${command.replace(/^\//, '')}`) + } + }, + setOrToggleSetting: { + input: [ + { + type: 'select', + // maybe title case? + options: Object.keys(options) + }, + { + type: 'select', + options: ['toggle', 'set'] + }, + ([setting = '', action = ''] = []) => { + const value = options[setting] + if (!action || value === undefined || action === 'toggle') return null + if (action === 'set') { + const getBase = () => { + const config = tryFindOptionConfig(setting as any) + if (config && 'values' in config) { + return { + type: 'select', + options: config.values + } + } + if (config?.type === 'toggle' || typeof value === 'boolean') { + return { + type: 'select', + options: ['true', 'false'] + } + } + if (config?.type === 'slider' || value.type === 'number') { + return { + type: 'number', + } + } + return { + type: 'text' + } + } + return { + ...getBase(), + placeholder: value + } + } + } + ], + handler ([setting, action, value]) { + if (action === 'toggle') { + const value = options[setting] + const config = tryFindOptionConfig(setting) + if (config && 'values' in config && config.values) { + const { values } = config + const currentIndex = values.indexOf(value) + const nextIndex = (currentIndex + 1) % values.length + options[setting] = values[nextIndex] + } else { + options[setting] = typeof value === 'boolean' ? !value : typeof value === 'number' ? value + 1 : value + } + } else { + options[setting] = value + } + } + }, + jsScripts: { + input: [ + { + type: 'text', + placeholder: 'JavaScript code to run in main thread (sensitive!)' + } + ], + handler ([code]) { + // eslint-disable-next-line no-new-func -- this is a feature, not a bug + new Function(code)() + } + }, + // openCommandsScreen: {} +} diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index 1c92a39c..b847fe11 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -184,7 +184,16 @@ export const guiOptionsScheme: { custom () { return Keyboard & Mouse }, - // keybindings + }, + { + custom () { + return + }, mouseSensX: {}, mouseSensY: { min: -1, @@ -282,3 +291,15 @@ const Category = ({ children }) =>
{children}
+ +export const tryFindOptionConfig = (option: keyof AppOptions) => { + for (const group of Object.values(guiOptionsScheme)) { + for (const optionConfig of group) { + if (option in optionConfig) { + return optionConfig[option] + } + } + } + + return null +} diff --git a/src/react/KeybindingsCustom.tsx b/src/react/KeybindingsCustom.tsx new file mode 100644 index 00000000..bee991bf --- /dev/null +++ b/src/react/KeybindingsCustom.tsx @@ -0,0 +1,171 @@ +import { useEffect, useState, useContext } from 'react' +import { customCommandsConfig } from '../customCommands' +import { ButtonWithMatchesAlert, Context } from './KeybindingsScreen' +import Button from './Button' +import styles from './KeybindingsScreen.module.css' +import Input from './Input' + + +export type CustomCommand = { + keys: undefined | string[] + gamepad: undefined | string[] + type: string + inputs: any[] +} + +export type CustomCommandsMap = Record + +export default ( + { + customCommands, + updateCurrBind, + resetBinding, + }: { + customCommands: CustomCommandsMap, + updateCurrBind: (group: string, action: string) => void, + resetBinding: (group: string, action: string, inputType: string) => void, + } +) => { + const { userConfig, setUserConfig } = useContext(Context) + const [customConfig, setCustomConfig] = useState({ ...customCommands }) + + useEffect(() => { + setUserConfig({ ...userConfig, custom: { ...customConfig } }) + }, [customConfig]) + + const addNewCommand = (type: string) => { + // max key + 1 + const newKey = String(Math.max(...Object.keys(customConfig).map(Number).filter(key => !isNaN(key)), 0) + 1) + setCustomConfig(prev => { + const newCustomConf = { ...prev } + newCustomConf[newKey] = { + keys: undefined as string[] | undefined, + gamepad: undefined as string[] | undefined, + type, + inputs: [] as any[] + } + return newCustomConf + }) + } + + return <> +
+ {Object.entries(customCommandsConfig).map(([group, { input }]) => ( +
+
{group}
+ {Object.entries(customConfig).filter(([key, data]) => data.type === group).map((commandData, indexOption) => { + return + })} +
+ ))} +
+ +} + +const CustomCommandContainer = ( + { + indexOption, + commandData, + updateCurrBind, + setCustomConfig, + resetBinding, + groupData + } +) => { + const { userConfig } = useContext(Context) + + const [commandKey, { keys, gamepad, inputs }] = commandData + const [group, { input }] = groupData + + const setInputValue = (optionKey, indexInput, value) => { + setCustomConfig(prev => { + const newConfig = { ...prev } + newConfig[optionKey].inputs = [...prev[optionKey].inputs] + newConfig[optionKey].inputs[indexInput] = value + return newConfig + }) + } + + return
+ {input.map((obj, indexInput) => { + const config = typeof obj === 'function' ? obj(inputs) : obj + if (!config) return null + + return config.type === 'select' + ? + : setInputValue(commandKey, indexInput, e.target.value)} /> + })} +
+ { + userConfig?.['custom']?.[commandKey]?.keys ?
+
+} diff --git a/src/react/KeybindingsScreen.module.css b/src/react/KeybindingsScreen.module.css new file mode 100644 index 00000000..e8a9f69b --- /dev/null +++ b/src/react/KeybindingsScreen.module.css @@ -0,0 +1,88 @@ +.container { + overflow-x: auto; + width: 100%; + display: flex; + flex-direction: column; + gap: 10px; +} + +@media (max-width: 590px) { + .container { + width: 90vw; + } +} + +.group { + display: flex; + flex-direction: column; + gap: 5px; +} + +.group-category { + font-size: 1rem; + text-align: center; + margin-top: 15px; + margin-bottom: 7px; + text-transform: capitalize; +} + +.actionBinds { + position: relative; + display: flex; +} + +.warning-container { + flex-basis: 25%; + display: flex; + flex-direction: column; + height: inherit; +} + +.actionName { + flex-basis: 30%; + margin-right: 5px; + flex-wrap: wrap; + align-self: center; + font-size: 10px; +} + +.undo-keyboard, +.undo-gamepad { + aspect-ratio: 1; +} + +.button { + width: 100%; + font-size: 7px; +} + +.margin-left { + margin-left: 25px; +} + +.matched-bind { + border: 1px solid red; + border-bottom: 1px solid red; +} + +.matched-bind-warning { + display: flex; + color: yellow; + font-family: inherit; + font-size: 5px; + width: fit-content; +} + +.matched-bind-warning a { + color: inherit; +} + +/* ~~~~ custom bindings styles */ + +.chat-command { + font: inherit; + color: white; + display: block; + height: 100%; + flex-grow: 1; +} diff --git a/src/react/KeybindingsScreen.tsx b/src/react/KeybindingsScreen.tsx index 19038a71..97126655 100644 --- a/src/react/KeybindingsScreen.tsx +++ b/src/react/KeybindingsScreen.tsx @@ -1,12 +1,382 @@ +import { useState, useEffect, useRef, createContext, useContext } from 'react' +import { UserOverridesConfig } from 'contro-max/build/types/store' +import { contro as controEx } from '../controls' +import { hideModal } from '../globalState' +import triangle from './ps_icons/playstation_triangle_console_controller_gamepad_icon.svg' +import square from './ps_icons/playstation_square_console_controller_gamepad_icon.svg' +import circle from './ps_icons/circle_playstation_console_controller_gamepad_icon.svg' +import cross from './ps_icons/cross_playstation_console_controller_gamepad_icon.svg' +import PixelartIcon from './PixelartIcon' +import KeybindingsCustom, { CustomCommandsMap } from './KeybindingsCustom' +import { BindingActionsContext } from './KeybindingsScreenProvider' +import Button from './Button' import Screen from './Screen' +import styles from './KeybindingsScreen.module.css' -export default ({ - onBack, - onReset, - onSet, - keybindings -}) => { - return -

Here you can change the keybindings for the game.

-
+ +type HandleClick = (group: string, action: string, index: number, type: string | null) => void + +type setBinding = (data: any, group: string, command: string, buttonIndex: number) => void + +export const Context = createContext( + { + isPS: false as boolean | undefined, + userConfig: controEx?.userConfig ?? {} as UserOverridesConfig | undefined, + setUserConfig (config) { }, + handleClick: (() => { }) as HandleClick, + parseBindingName (binding) { return '' as string }, + bindsMap: { keyboard: {} as any, gamepad: {} as any } + } +) + +export default ( + { + contro, + isPS, + }: { + contro: typeof controEx, + isPS?: boolean + } +) => { + const containerRef = useRef(null) + const bindsMap = useRef({ keyboard: {} as any, gamepad: {} as any }) + const { commands } = contro.inputSchema + const [userConfig, setUserConfig] = useState(contro.userConfig ?? {}) + const [awaitingInputType, setAwaitingInputType] = useState(null as null | 'keyboard' | 'gamepad') + const [groupName, setGroupName] = useState('') + const [actionName, setActionName] = useState('') + const [buttonNum, setButtonNum] = useState(0) + const { updateBinds } = useContext(BindingActionsContext) + const [customCommands, setCustomCommands] = useState(userConfig.custom as CustomCommandsMap ?? {}) + + const updateCurrBind = (group: string, action: string) => { + setGroupName(prev => group) + setActionName(prev => action) + } + + const handleClick: HandleClick = (group, action, index, type) => { + //@ts-expect-error + setAwaitingInputType(type) + updateCurrBind(group, action) + setButtonNum(prev => index) + } + + const setBinding: setBinding = (data, group, command, buttonIndex) => { + setUserConfig(prev => { + const newConfig = { ...prev } + newConfig[group] ??= {} + newConfig[group][command] ??= {} + + // keys and buttons should always exist in commands + const type = 'code' in data ? 'keys' : 'button' in data ? 'gamepad' : null + if (type) { + newConfig[group][command][type] ??= group === 'custom' ? [] : [...contro.inputSchema.commands[group][command][type]] + newConfig[group][command][type]![buttonIndex] = data.code ?? data.button + } + + return newConfig + }) + } + + const resetBinding = (group: string, command: string, inputType: string) => { + if (!userConfig?.[group]?.[command]) return + + setUserConfig(prev => { + const newConfig = { ...prev } + const prop = inputType === 'keyboard' ? 'keys' : 'gamepad' + newConfig[group][command][prop] = undefined + return newConfig + }) + } + + useEffect(() => { + updateBinds(userConfig) + setCustomCommands({ ...userConfig.custom as CustomCommandsMap }) + + updateBindMap() + }, [userConfig]) + + // const updateKeyboardBinding = (e: import('react').KeyboardEvent) => { + // if (!e.code || e.key === 'Escape' || !awaitingInputType) return + // setBinding({ code: e.code, state: true }, groupName, actionName, buttonNum) + // } + + const updateBinding = (data: any) => { + if ((!data.state && awaitingInputType) || !awaitingInputType) { + setAwaitingInputType(null) + return + } + if ('code' in data) { + if (data.code === 'Escape' || ['Mouse0', 'Mouse1', 'Mouse2'].includes(data.code)) { + setAwaitingInputType(null) + return + } + setBinding({ code: data.code, state: true }, groupName, actionName, buttonNum) + } + if ('button' in data) { + contro.enabled = false + void Promise.resolve().then(() => { contro.enabled = true }) + setBinding(data, groupName, actionName, buttonNum) + } + + setAwaitingInputType(null) + } + + const updateBindMap = () => { + bindsMap.current = { keyboard: {} as any, gamepad: {} as any } + if (commands) { + for (const [group, actions] of Object.entries(commands)) { + for (const [action, { keys, gamepad }] of Object.entries(actions)) { + if (keys) { + let currKeys + if (userConfig?.[group]?.[action]?.keys) { + currKeys = userConfig[group][action].keys + } else { + currKeys = keys + } + for (const [index, key] of currKeys.entries()) { + bindsMap.current.keyboard[key] ??= [] + if (!bindsMap.current.keyboard[key].some(obj => obj.group === group && obj.action === action && obj.index === index)) { + bindsMap.current.keyboard[key].push({ group, action, index }) + } + } + } + if (gamepad) { + let currButtons + if (userConfig?.[group]?.[action]?.gamepad) { + currButtons = userConfig[group][action].gamepad + } else { + currButtons = gamepad + } + if (currButtons.length > 0) { + bindsMap.current.gamepad[currButtons[0]] ??= [] + bindsMap.current.gamepad[currButtons[0]].push({ group, action, index: 0 }) + } + } + } + } + } + } + + // fill binds map + useEffect(() => { + updateBindMap() + }, []) + + useEffect(() => { + contro.on('pressedKeyOrButtonChanged', updateBinding) + + return () => { + contro.off('pressedKeyOrButtonChanged', updateBinding) + } + }, [groupName, actionName, awaitingInputType]) + + + return + + {awaitingInputType && } +
+ + + {Object.entries(commands).map(([group, actions], index) => { + if (group === 'custom') return null + return
+
{group}
+ {group === 'general' ? ( +
+ Note: Left, right and middle click keybindings are hardcoded and cannot be changed currently. +
+ ) : null} + {Object.entries(actions).map(([action, { keys, gamepad }]) => { + return
+
{parseActionName(action)}
+ +
+ })} +
+ })} + + +
+
+
+} + +export const ButtonWithMatchesAlert = ({ + group, + action, + index, + inputType, + keys, + gamepad, +}) => { + const { isPS, userConfig, handleClick, parseBindingName, bindsMap } = useContext(Context) + const [buttonSign, setButtonSign] = useState('') + + useEffect(() => { + const type = inputType === 'keyboard' ? 'keys' : 'gamepad' + + const customValue = userConfig?.[group]?.[action]?.[type]?.[index] + if (customValue) { + if (type === 'keys') { + setButtonSign(parseBindingName(customValue)) + } else { + setButtonSign(isPS && buttonsMap[customValue] ? buttonsMap[customValue] : customValue) + } + } else if (type === 'keys') { + setButtonSign(keys?.length ? parseBindingName(keys[index]) : '') + } else { + setButtonSign(gamepad?.[0] ? + isPS ? + buttonsMap[gamepad[0]] ?? gamepad[0] + : gamepad[0] + : '') + } + }, [userConfig, isPS]) + + return
+ + {userConfig?.[group]?.[action]?.[inputType === 'keyboard' ? 'keys' : 'gamepad']?.some( + key => Object.keys(bindsMap[inputType]).includes(key) + && bindsMap[inputType][key].length > 1 + && bindsMap[inputType][key].some( + prop => prop.index === index + && prop.group === group + && prop.action === action + ) + ) ? ( +
+ +
+ This bind is already in use. +
+
+ ) : null} +
+} + +export const AwaitingInputOverlay = ({ isGamepad }) => { + return
+
+ {isGamepad ? 'Press the button on the gamepad ' : 'Press the key, side mouse button '} + or ESC to cancel. +
+ +
+} + +const parseActionName = (action: string) => { + const parts = action.split(/(?=[A-Z])/) + parts[0] = parts[0].charAt(0).toUpperCase() + parts[0].slice(1) + return parts.join(' ') +} + +const parseBindingName = (binding: string | undefined) => { + if (!binding) return '' + const cut = binding.replaceAll(/(Numpad|Digit|Key)/g, '') + const parts = cut.split(/(?=[A-Z\d])/) + return parts.reverse().join(' ') +} + +const buttonsMap = { + 'A': cross, + 'B': circle, + 'X': square, + 'Y': triangle } diff --git a/src/react/KeybindingsScreenApp.tsx b/src/react/KeybindingsScreenApp.tsx deleted file mode 100644 index e0630eab..00000000 --- a/src/react/KeybindingsScreenApp.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { useState } from 'react' -import { contro } from '../controls' -import Button from './Button' -import Screen from './Screen' - -export default () => { - const { commands } = contro.inputSchema - const [awaitingInputType, setAwaitingInputType] = useState(null as null | 'keyboard' | 'gamepad') - - // const - - return - {awaitingInputType && } -

Here you can change the keybindings for the game.

-
- {Object.entries(commands).map(([group, actions]) => { - return
-

{group}

- {Object.entries(actions).map(([action, { keys, gamepadButtons }]) => { - return
- - -
- })} -
- })} -
-
-} - -const AwaitingInputOverlay = ({ isGamepad }) => { - return
- {isGamepad ? 'Press the button on the gamepad' : 'Press the key'}. - Press ESC to cancel. -
-} diff --git a/src/react/KeybindingsScreenProvider.tsx b/src/react/KeybindingsScreenProvider.tsx new file mode 100644 index 00000000..97f04a62 --- /dev/null +++ b/src/react/KeybindingsScreenProvider.tsx @@ -0,0 +1,50 @@ +import { createContext, useState } from 'react' +import { contro } from '../controls' +import KeybindingsScreen from './KeybindingsScreen' +import { useIsModalActive } from './utilsApp' + + +export const updateBinds = (commands: any) => { + contro.inputSchema.commands.custom = Object.fromEntries(Object.entries(commands?.custom ?? {}).map(([key, value]) => { + return [key, { + keys: [], + gamepad: [], + type: '', + inputs: [] + }] + })) + + for (const [group, actions] of Object.entries(commands)) { + contro.userConfig![group] = Object.fromEntries(Object.entries(actions).map(([key, value]) => { + const newValue = { + keys: value?.keys ?? undefined, + gamepad: value?.gamepad ?? undefined, + } + + if (group === 'custom') { + newValue['type'] = (value).type + newValue['inputs'] = (value).inputs + } + + return [key, newValue] + })) + } +} + +const bindingActions = { + updateBinds +} + +export const BindingActionsContext = createContext(bindingActions) + +export default () => { + const [bindActions, setBindActions] = useState(bindingActions) + const isModalActive = useIsModalActive('keybindings') + + if (!isModalActive) return null + + const hasPsGamepad = [...(navigator.getGamepads?.() ?? [])].some(gp => gp?.id.match(/playstation|dualsense|dualshock/i)) // todo: use last used gamepad detection + return + + +} diff --git a/src/react/OptionsGroup.tsx b/src/react/OptionsGroup.tsx index bbfac00e..81df531b 100644 --- a/src/react/OptionsGroup.tsx +++ b/src/react/OptionsGroup.tsx @@ -3,7 +3,7 @@ import { options } from '../optionsStorage' import { OptionsGroupType, guiOptionsScheme } from '../optionsGuiScheme' import OptionsItems, { OptionMeta } from './OptionsItems' -const optionValueToType = (optionValue: any, item: OptionMeta) => { +export const optionValueToType = (optionValue: any, item: OptionMeta) => { if (typeof optionValue === 'boolean' || item.values) return 'toggle' if (typeof optionValue === 'number') return 'slider' if (typeof optionValue === 'string') return 'element' diff --git a/src/react/globals.d.ts b/src/react/globals.d.ts index 842d27c4..108fae54 100644 --- a/src/react/globals.d.ts +++ b/src/react/globals.d.ts @@ -25,6 +25,10 @@ declare module '*.png' { const png: string export default png } +declare module '*.svg' { + const svg: string + export default svg +} interface PromiseConstructor { withResolvers (): { diff --git a/src/react/ps_icons/circle_playstation_console_controller_gamepad_icon.svg b/src/react/ps_icons/circle_playstation_console_controller_gamepad_icon.svg new file mode 100644 index 00000000..d49af336 --- /dev/null +++ b/src/react/ps_icons/circle_playstation_console_controller_gamepad_icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/react/ps_icons/cross_playstation_console_controller_gamepad_icon.svg b/src/react/ps_icons/cross_playstation_console_controller_gamepad_icon.svg new file mode 100644 index 00000000..d7d176e2 --- /dev/null +++ b/src/react/ps_icons/cross_playstation_console_controller_gamepad_icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/react/ps_icons/playstation_square_console_controller_gamepad_icon.svg b/src/react/ps_icons/playstation_square_console_controller_gamepad_icon.svg new file mode 100644 index 00000000..9f08790e --- /dev/null +++ b/src/react/ps_icons/playstation_square_console_controller_gamepad_icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/react/ps_icons/playstation_triangle_console_controller_gamepad_icon.svg b/src/react/ps_icons/playstation_triangle_console_controller_gamepad_icon.svg new file mode 100644 index 00000000..a397c517 --- /dev/null +++ b/src/react/ps_icons/playstation_triangle_console_controller_gamepad_icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/react/storageProvider.ts b/src/react/storageProvider.ts new file mode 100644 index 00000000..df97d228 --- /dev/null +++ b/src/react/storageProvider.ts @@ -0,0 +1,13 @@ +import { CustomCommand } from './KeybindingsCustom' + +type StorageData = { + customCommands: Record + // ... +} + +export const getStoredValue = (name: T): StorageData[T] | undefined => { + return localStorage[name] ? JSON.parse(localStorage[name]) : undefined +} +export const setStoredValue = (name: T, value: StorageData[T]) => { + localStorage[name] = JSON.stringify(value) +} diff --git a/src/reactUi.tsx b/src/reactUi.tsx index 9a79de34..e384fbfd 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -36,6 +36,7 @@ import Crosshair from './react/Crosshair' import ButtonAppProvider from './react/ButtonAppProvider' import ServersListProvider from './react/ServersListProvider' import GamepadUiCursor from './react/GamepadUiCursor' +import KeybindingsScreenProvider from './react/KeybindingsScreenProvider' import HeldMapUi from './react/HeldMapUi' const RobustPortal = ({ children, to }) => { @@ -157,6 +158,7 @@ const App = () => { + diff --git a/src/screens.css b/src/screens.css index c4e7fe9b..32765506 100644 --- a/src/screens.css +++ b/src/screens.css @@ -33,6 +33,7 @@ margin-top: 35px; /* todo remove it but without it in chrome android the screen is not scrollable */ overflow: auto; + height: fit-content; /* todo I'm not sure about it */ /* margin-top: calc(100% / 6 - 16px); */ align-items: center; From 97ca34e8f93002d6e54e2c842d13cd4d7cd3ee0e Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sun, 19 May 2024 15:32:50 +0300 Subject: [PATCH 0190/1195] hotfix: input handler crash --- src/controls.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controls.ts b/src/controls.ts index 6e38b90c..7d1e4cdf 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -297,7 +297,7 @@ const customCommandsHandler = (buttonData: { code?: string, button?: string, sta const codeOrButton = buttonData.code ?? buttonData.button const inputType = buttonData.code ? 'keys' : 'gamepad' - for (const value of Object.values(contro.userConfig!.custom)) { + for (const value of Object.values(contro.userConfig!.custom ?? {})) { if (value[inputType]?.includes(codeOrButton!)) { customCommandsConfig[(value as CustomCommand).type].handler((value as CustomCommand).inputs) } From 2bec255b7da0c9142c606cc3c0d9a93fd8cc4cba Mon Sep 17 00:00:00 2001 From: Vitaly Date: Mon, 20 May 2024 05:47:38 +0300 Subject: [PATCH 0191/1195] fix: update flying-squid to respect time in saves! --- package.json | 2 +- pnpm-lock.yaml | 36 +++++-------------- .../viewer/lib/worldDataEmitter.ts | 1 + 3 files changed, 10 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index 6905a8b7..6e73b981 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "esbuild-plugin-polyfill-node": "^0.3.0", "express": "^4.18.2", "filesize": "^10.0.12", - "flying-squid": "npm:@zardoy/flying-squid@^0.0.20", + "flying-squid": "npm:@zardoy/flying-squid@^0.0.24", "fs-extra": "^11.1.1", "google-drive-browserfs": "github:zardoy/browserfs#google-drive", "iconify-icon": "^1.0.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dcacb13a..6d784e17 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -104,8 +104,8 @@ importers: specifier: ^10.0.12 version: 10.0.12 flying-squid: - specifier: npm:@zardoy/flying-squid@^0.0.20 - version: '@zardoy/flying-squid@0.0.20(encoding@0.1.13)' + specifier: npm:@zardoy/flying-squid@^0.0.24 + version: '@zardoy/flying-squid@0.0.24(encoding@0.1.13)' fs-extra: specifier: ^11.1.1 version: 11.1.1 @@ -3054,8 +3054,8 @@ packages: resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - '@zardoy/flying-squid@0.0.20': - resolution: {integrity: sha512-WyejZS2Upzv86g6Ez5Z/4Pd0ea9tkFL2itAj24UNpO7fyzxuTN2Ag1Ouvh+MSkCloXhR4E/yoER2krHW8vzwBw==} + '@zardoy/flying-squid@0.0.24': + resolution: {integrity: sha512-C+VNHyh9yYB7aG9OL6r9NR5bF73fyRQ0rHhkvvz901hLBZI3+5nOPdcA6XwJm9XX9BYStXbLTHp6shmo20JRHQ==} engines: {node: '>=8'} hasBin: true @@ -3274,9 +3274,6 @@ packages: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} - asap@1.0.0: - resolution: {integrity: sha512-Ej9qjcXY+8Tuy1cNqiwNMwFRXOy9UwgTeMA8LxreodygIPV48lx8PU1ecFxb5ZeU1DpMKxiq6vGLTxcitWZPbA==} - asn1.js@5.4.1: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} @@ -4551,9 +4548,6 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - event-promise@0.0.1: - resolution: {integrity: sha512-ouEmk2N0BalybPM0zmj3RHE93AX4p9hAIHZfbbqxolLChqCB6pcLDbYH6zZ8TaiFWImPHfs5kFnNpA0u9RdEaQ==} - event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -6801,9 +6795,6 @@ packages: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} - promise@5.0.0: - resolution: {integrity: sha512-N2BfLz0Sigf7rsm5NnItRwTNqEDUF2ephwEXTcOAf2cO9NwZ9TnIjOmnQNtC0r70CV0S1+uc9mSMmFH7gxk87Q==} - prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -11443,8 +11434,7 @@ snapshots: magic-string: 0.25.9 string.prototype.matchall: 4.0.10 - '@tootallnate/once@2.0.0': - optional: true + '@tootallnate/once@2.0.0': {} '@tweenjs/tween.js@18.6.4': {} @@ -11935,18 +11925,18 @@ snapshots: '@types/emscripten': 1.39.8 tslib: 1.14.1 - '@zardoy/flying-squid@0.0.20(encoding@0.1.13)': + '@zardoy/flying-squid@0.0.24(encoding@0.1.13)': dependencies: + '@tootallnate/once': 2.0.0 change-case: 4.1.2 colors: 1.4.0 diamond-square: https://codeload.github.com/zardoy/diamond-square/tar.gz/915fce8e27fe8eb45464d89b9563956afa4f7687 emit-then: 2.0.0 - event-promise: 0.0.1 exit-hook: 2.2.1 flatmap: 0.0.3 long: 5.2.3 minecraft-data: 3.65.0 - minecraft-protocol: 1.47.0(patch_hash=2uxevyasyasdavsxuehfavgkjq)(encoding@0.1.13) + minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/ccab9fb39681f3ebe0d264e2a3f833aa3c5a1ac7(patch_hash=2uxevyasyasdavsxuehfavgkjq)(encoding@0.1.13) mkdirp: 2.1.6 node-gzip: 1.1.2 node-rsa: 1.1.1 @@ -12212,8 +12202,6 @@ snapshots: arrify@1.0.1: {} - asap@1.0.0: {} - asn1.js@5.4.1: dependencies: bn.js: 4.12.0 @@ -13950,10 +13938,6 @@ snapshots: etag@1.8.1: {} - event-promise@0.0.1: - dependencies: - promise: 5.0.0 - event-target-shim@5.0.1: {} eventemitter2@6.4.7: {} @@ -16638,10 +16622,6 @@ snapshots: retry: 0.12.0 optional: true - promise@5.0.0: - dependencies: - asap: 1.0.0 - prompts@2.4.2: dependencies: kleur: 3.0.3 diff --git a/prismarine-viewer/viewer/lib/worldDataEmitter.ts b/prismarine-viewer/viewer/lib/worldDataEmitter.ts index f4ce9675..40cc3413 100644 --- a/prismarine-viewer/viewer/lib/worldDataEmitter.ts +++ b/prismarine-viewer/viewer/lib/worldDataEmitter.ts @@ -87,6 +87,7 @@ export class WorldDataEmitter extends EventEmitter { }, })) this.emitter.emit('renderDistance', this.viewDistance) + this.emitter.emit('time', bot.time.timeOfDay) }) // node.js stream data event pattern if (this.emitter.listenerCount('blockEntities')) { From 5e9423909167090b244b26b4493d8a6336d4751c Mon Sep 17 00:00:00 2001 From: Vitaly Date: Mon, 20 May 2024 05:47:53 +0300 Subject: [PATCH 0192/1195] feat: big fix: rendering blocks for preflat versions (<1.13)! (#125) --- prismarine-viewer/buildMesherWorker.mjs | 2 + prismarine-viewer/viewer/lib/mesher/mesher.ts | 1 + prismarine-viewer/viewer/lib/mesher/models.ts | 76 +- prismarine-viewer/viewer/lib/mesher/world.ts | 39 +- prismarine-viewer/viewer/lib/viewer.ts | 4 +- .../viewer/prepare/generateTextures.ts | 5 + scripts/esbuildPlugins.mjs | 24 +- src/preflatMap.json | 1741 +++++++++++++++++ 8 files changed, 1880 insertions(+), 12 deletions(-) create mode 100644 src/preflatMap.json diff --git a/prismarine-viewer/buildMesherWorker.mjs b/prismarine-viewer/buildMesherWorker.mjs index 819324de..e9f6a16f 100644 --- a/prismarine-viewer/buildMesherWorker.mjs +++ b/prismarine-viewer/buildMesherWorker.mjs @@ -6,6 +6,7 @@ import path from 'path' import { fileURLToPath } from 'url' import fs from 'fs' import { dynamicMcDataFiles } from './buildMesherConfig.mjs' +import { mesherSharedPlugins } from '../scripts/esbuildPlugins.mjs' const allowedBundleFiles = ['legacy', 'versions', 'protocolVersions', 'features'] @@ -34,6 +35,7 @@ const buildOptions = { 'process.env.BROWSER': '"true"', }, plugins: [ + ...mesherSharedPlugins, { name: 'external-json', setup (build) { diff --git a/prismarine-viewer/viewer/lib/mesher/mesher.ts b/prismarine-viewer/viewer/lib/mesher/mesher.ts index 0bcf7250..bc1d3bbb 100644 --- a/prismarine-viewer/viewer/lib/mesher/mesher.ts +++ b/prismarine-viewer/viewer/lib/mesher/mesher.ts @@ -53,6 +53,7 @@ self.onmessage = ({ data }) => { if (data.config) { world ??= new World(data.config.version) world.config = {...world.config, ...data.config} + globalThis.world = world } if (data.type === 'mesherData') { diff --git a/prismarine-viewer/viewer/lib/mesher/models.ts b/prismarine-viewer/viewer/lib/mesher/models.ts index bfb96d11..40b82ea2 100644 --- a/prismarine-viewer/viewer/lib/mesher/models.ts +++ b/prismarine-viewer/viewer/lib/mesher/models.ts @@ -1,7 +1,9 @@ import { Vec3 } from 'vec3' import type { BlockStatesOutput } from '../../prepare/modelsBuilder' import { World } from './world' -import { Block } from 'prismarine-block' +import { WorldBlock as Block } from './world' +import legacyJson from '../../../../src/preflatMap.json' +import { versionToNumber } from '../../prepare/utils' const tints: any = {} let blockStates: BlockStatesOutput @@ -33,6 +35,53 @@ function prepareTints (tints) { }) } +const calculatedBlocksEntries = Object.entries(legacyJson.clientCalculatedBlocks); +export function preflatBlockCalculation (block: Block, world: World, position: Vec3) { + const type = calculatedBlocksEntries.find(([name, blocks]) => blocks.includes(block.name))?.[0] + if (!type) return + switch (type) { + case 'directional': { + const isSolidConnection = !block.name.includes('redstone') && !block.name.includes('tripwire') + const neighbors = [ + world.getBlock(position.offset(0, 0, 1)), + world.getBlock(position.offset(0, 0, -1)), + world.getBlock(position.offset(1, 0, 0)), + world.getBlock(position.offset(-1, 0, 0)) + ] + // set needed props to true: east:'false',north:'false',south:'false',west:'false' + const props = {} + for (const [i, neighbor] of neighbors.entries()) { + const isConnectedToSolid = isSolidConnection ? (neighbor && !neighbor.transparent) : false + if (isConnectedToSolid || neighbor?.name === block.name) { + props[['south', 'north', 'east', 'west'][i]] = 'true' + } + } + return props + } + // case 'gate_in_wall': {} + case 'block_snowy': { + const aboveIsSnow = world.getBlock(position.offset(0, 1, 0))?.name === 'snow' + return { + snowy: `${aboveIsSnow}` + } + } + case 'door': { + // upper half matches lower in + const half = block.getProperties().half + if (half === 'upper') { + // copy other properties + const lower = world.getBlock(position.offset(0, -1, 0)) + if (lower?.name === block.name) { + return { + ...lower.getProperties(), + half: 'upper' + } + } + } + } + } +} + function tintToGl (tint) { const r = (tint >> 16) & 0xff const g = (tint >> 8) & 0xff @@ -349,7 +398,7 @@ function renderElement (world: World, cursor: Vec3, element, doAO: boolean, attr const aos: number[] = [] const neighborPos = position.plus(new Vec3(...dir)) - const baseLight = world.getLight(neighborPos) / 15 + const baseLight = world.getLight(neighborPos, undefined, undefined, block.name) / 15 for (const pos of corners) { let vertex = [ (pos[0] ? maxx : minx), @@ -462,7 +511,7 @@ export function getSectionGeometry (sx, sy, sz, world: World) { for (cursor.z = sz; cursor.z < sz + 16; cursor.z++) { for (cursor.x = sx; cursor.x < sx + 16; cursor.x++) { const block = world.getBlock(cursor)! - if (block.name.includes('_sign')) { + if (block.name.includes('_sign') || block.name === 'sign') { const key = `${cursor.x},${cursor.y},${cursor.z}` const props: any = block.getProperties() const facingRotationMap = { @@ -478,7 +527,24 @@ export function getSectionGeometry (sx, sy, sz, world: World) { } } const biome = block.biome.name - if (block.variant === undefined) { + + let preflatRecomputeVariant = !!(block as any)._originalProperties + if (world.preflat) { + const patchProperties = preflatBlockCalculation(block, world, cursor) + if (patchProperties) { + //@ts-ignore + block._originalProperties ??= block._properties + //@ts-ignore + block._properties = { ...block._originalProperties, ...patchProperties } + preflatRecomputeVariant = true + } else { + //@ts-ignore + block._properties = block._originalProperties ?? block._properties + //@ts-ignore + block._originalProperties = undefined + } + } + if (block.variant === undefined || preflatRecomputeVariant) { block.variant = getModelVariants(block) } @@ -592,7 +658,7 @@ function matchProperties (block: Block, /* to match against */properties: Record return true } -function getModelVariants (block: import('prismarine-block').Block) { +function getModelVariants (block: Block) { // air, cave_air, void_air and so on... // full list of invisible & special blocks https://minecraft.wiki/w/Model#Blocks_and_fluids if (block.name === '' || block.name === 'air' || block.name.endsWith('_air')) return [] diff --git a/prismarine-viewer/viewer/lib/mesher/world.ts b/prismarine-viewer/viewer/lib/mesher/world.ts index 9a4f0ab3..5f3a281d 100644 --- a/prismarine-viewer/viewer/lib/mesher/world.ts +++ b/prismarine-viewer/viewer/lib/mesher/world.ts @@ -4,6 +4,7 @@ import { Block } from "prismarine-block" import { Vec3 } from 'vec3' import moreBlockDataGeneratedJson from '../moreBlockDataGenerated.json' import { defaultMesherConfig } from './shared' +import legacyJson from '../../../../src/preflatMap.json' const ignoreAoBlocks = Object.keys(moreBlockDataGeneratedJson.noOcclusions) @@ -17,7 +18,7 @@ function isCube (shapes) { return shape[0] === 0 && shape[1] === 0 && shape[2] === 0 && shape[3] === 1 && shape[4] === 1 && shape[5] === 1 } -export type WorldBlock = Block & { +export type WorldBlock = Omit & { variant?: any // todo isCube: boolean @@ -30,14 +31,16 @@ export class World { columns = {} as { [key: string]: import('prismarine-chunk/types/index').PCChunk } blockCache = {} biomeCache: { [id: number]: mcData.Biome } + preflat: boolean constructor(version) { this.Chunk = Chunks(version) as any this.biomeCache = mcData(version).biomes + this.preflat = !mcData(version).supportFeature('blockStateId') this.config.version = version } - getLight (pos: Vec3, isNeighbor = false) { + getLight (pos: Vec3, isNeighbor = false, skipMoreChecks = false, curBlockName = '') { const { enableLighting, skyLight } = this.config if (!enableLighting) return 15 // const key = `${pos.x},${pos.y},${pos.z}` @@ -52,8 +55,17 @@ export class World { ) + 2 ) // lightsCache.set(key, result) - if (result === 2 && this.getBlock(pos)?.name.match(/_stairs|slab/)) { // todo this is obviously wrong - result = this.getLight(pos.offset(0, 1, 0)) + if (result === 2 && [this.getBlock(pos)?.name ?? '', curBlockName].some(x => x.match(/_stairs|slab|glass_pane/)) && !skipMoreChecks) { // todo this is obviously wrong + const lights = [ + this.getLight(pos.offset(0, 1, 0), undefined, true), + this.getLight(pos.offset(0, -1, 0), undefined, true), + this.getLight(pos.offset(0, 0, 1), undefined, true), + this.getLight(pos.offset(0, 0, -1), undefined, true), + this.getLight(pos.offset(1, 0, 0), undefined, true), + this.getLight(pos.offset(-1, 0, 0), undefined, true) + ].filter(x => x !== 2) + const min = Math.min(...lights) + result = min } if (isNeighbor && result === 2) result = 15 // TODO return result @@ -91,6 +103,8 @@ export class World { } getBlock (pos: Vec3): WorldBlock | null { + // for easier testing + if (!(pos instanceof Vec3)) pos = new Vec3(...pos as [number, number, number]) const key = columnKey(Math.floor(pos.x / 16) * 16, Math.floor(pos.z / 16) * 16) const column = this.columns[key] @@ -111,6 +125,23 @@ export class World { throw new Error('position is not reliable, use pos parameter instead of block.position') } }) + if (this.preflat) { + const namePropsStr = legacyJson.blocks[b.type + ':' + b.metadata] || legacyJson.blocks[b.type + ':' + '0'] + b.name = namePropsStr.split('[')[0] + const propsStr = namePropsStr.split('[')?.[1]?.split(']'); + if (propsStr) { + const newProperties = Object.fromEntries(propsStr.join('').split(',').map(x => { + let [key, val] = x.split('=') as any + if (!isNaN(val)) val = parseInt(val) + return [key, val] + })) + //@ts-ignore + b._properties = newProperties + } else { + //@ts-ignore + b._properties = {} + } + } } const block = this.blockCache[stateId] diff --git a/prismarine-viewer/viewer/lib/viewer.ts b/prismarine-viewer/viewer/lib/viewer.ts index 65091f3e..2a240104 100644 --- a/prismarine-viewer/viewer/lib/viewer.ts +++ b/prismarine-viewer/viewer/lib/viewer.ts @@ -7,6 +7,7 @@ import EventEmitter from 'events' import { WorldRendererThree } from './worldrendererThree' import { generateSpiralMatrix } from 'flying-squid/dist/utils' import { WorldRendererCommon, WorldRendererConfig, defaultWorldRendererConfig } from './worldrendererCommon' +import { versionToNumber } from '../prepare/utils' export class Viewer { scene: THREE.Scene @@ -76,7 +77,8 @@ export class Viewer { } setVersion (userVersion: string) { - const texturesVersion = getVersion(userVersion) + let texturesVersion = getVersion(userVersion) + if (versionToNumber(userVersion) < versionToNumber('1.13')) texturesVersion = '1.13.2' // we normalize to post-flatenning in mesher console.log('[viewer] Using version:', userVersion, 'textures:', texturesVersion) this.world.setVersion(userVersion, texturesVersion) this.entities.clear() diff --git a/prismarine-viewer/viewer/prepare/generateTextures.ts b/prismarine-viewer/viewer/prepare/generateTextures.ts index 2a196ccb..dc838c65 100644 --- a/prismarine-viewer/viewer/prepare/generateTextures.ts +++ b/prismarine-viewer/viewer/prepare/generateTextures.ts @@ -5,6 +5,7 @@ import mcAssets from 'minecraft-assets' import fs from 'fs-extra' import { prepareMoreGeneratedBlocks } from './moreGeneratedBlocks' import { generateItemsAtlases } from './genItemsAtlas' +import { versionToNumber } from './utils' const publicPath = path.resolve(__dirname, '../../public') @@ -23,6 +24,10 @@ Promise.resolve().then(async () => { if (!mcAssets.versions.includes(version)) { throw new Error(`Version ${version} is not supported by minecraft-assets`) } + if (versionToNumber(version) < versionToNumber('1.13')) { + // we normalize data to 1.13 for pre 1.13 versions + continue + } const assets = mcAssets(version) const { warnings: _warnings } = await prepareMoreGeneratedBlocks(assets) _warnings.forEach(x => warnings.add(x)) diff --git a/scripts/esbuildPlugins.mjs b/scripts/esbuildPlugins.mjs index 999f9dc7..49547ea1 100644 --- a/scripts/esbuildPlugins.mjs +++ b/scripts/esbuildPlugins.mjs @@ -8,6 +8,7 @@ import MCProtocol from 'minecraft-protocol' import MCData from 'minecraft-data' import { throttle } from 'lodash-es' +const __dirname = dirname(new URL(import.meta.url).pathname) const { supportedVersions } = MCProtocol const prod = process.argv.includes('--prod') @@ -26,7 +27,7 @@ export const startWatchingHmr = () => { // 'dist/webglRendererWorker.js': 'webglRendererWorker', } for (const name of Object.keys(eventsPerFile)) { - const file = join('dist', name); + const file = join('dist', name) if (!fs.existsSync(file)) console.warn(`[missing worker] File ${name} does not exist`) fs.watchFile(file, () => { writeToClients({ replace: { type: eventsPerFile[name] } }) @@ -34,8 +35,27 @@ export const startWatchingHmr = () => { } } +/** @type {import('esbuild').Plugin[]} */ +const mesherSharedPlugins = [ + { + name: 'minecraft-data', + setup (build) { + build.onLoad({ + filter: /data[\/\\]pc[\/\\]common[\/\\]legacy.json$/, + }, async (args) => { + const data = fs.readFileSync(join(__dirname, '../src/preflatMap.json'), 'utf8') + return { + contents: `module.exports = ${data}`, + loader: 'js', + } + }) + } + } +] + /** @type {import('esbuild').Plugin[]} */ const plugins = [ + ...mesherSharedPlugins, { name: 'strict-aliases', setup (build) { @@ -339,4 +359,4 @@ const plugins = [ }) ] -export { plugins, connectedClients as clients } +export { plugins, connectedClients as clients, mesherSharedPlugins } diff --git a/src/preflatMap.json b/src/preflatMap.json new file mode 100644 index 00000000..fdf2640f --- /dev/null +++ b/src/preflatMap.json @@ -0,0 +1,1741 @@ +{ + "blocks": { + "0:0": "air", + "1:0": "stone", + "1:1": "granite", + "1:2": "polished_granite", + "1:3": "diorite", + "1:4": "polished_diorite", + "1:5": "andesite", + "1:6": "polished_andesite", + "2:0": "grass_block[snowy=false]", + "3:0": "dirt", + "3:1": "coarse_dirt", + "3:2": "podzol[snowy=false]", + "4:0": "cobblestone", + "5:0": "oak_planks", + "5:1": "spruce_planks", + "5:2": "birch_planks", + "5:3": "jungle_planks", + "5:4": "acacia_planks", + "5:5": "dark_oak_planks", + "6:0": "oak_sapling[stage=0]", + "6:1": "spruce_sapling[stage=0]", + "6:2": "birch_sapling[stage=0]", + "6:3": "jungle_sapling[stage=0]", + "6:4": "acacia_sapling[stage=0]", + "6:5": "dark_oak_sapling[stage=0]", + "6:8": "oak_sapling[stage=1]", + "6:9": "spruce_sapling[stage=1]", + "6:10": "birch_sapling[stage=1]", + "6:11": "jungle_sapling[stage=1]", + "6:12": "acacia_sapling[stage=1]", + "6:13": "dark_oak_sapling[stage=1]", + "7:0": "bedrock", + "8:0": "water[level=0]", + "8:1": "water[level=1]", + "8:2": "water[level=2]", + "8:3": "water[level=3]", + "8:4": "water[level=4]", + "8:5": "water[level=5]", + "8:6": "water[level=6]", + "8:7": "water[level=7]", + "8:8": "water[level=8]", + "8:9": "water[level=9]", + "8:10": "water[level=10]", + "8:11": "water[level=11]", + "8:12": "water[level=12]", + "8:13": "water[level=13]", + "8:14": "water[level=14]", + "8:15": "water[level=15]", + "9:0": "water[level=0]", + "9:1": "water[level=1]", + "9:2": "water[level=2]", + "9:3": "water[level=3]", + "9:4": "water[level=4]", + "9:5": "water[level=5]", + "9:6": "water[level=6]", + "9:7": "water[level=7]", + "9:8": "water[level=8]", + "9:9": "water[level=9]", + "9:10": "water[level=10]", + "9:11": "water[level=11]", + "9:12": "water[level=12]", + "9:13": "water[level=13]", + "9:14": "water[level=14]", + "9:15": "water[level=15]", + "10:0": "lava[level=0]", + "10:1": "lava[level=1]", + "10:2": "lava[level=2]", + "10:3": "lava[level=3]", + "10:4": "lava[level=4]", + "10:5": "lava[level=5]", + "10:6": "lava[level=6]", + "10:7": "lava[level=7]", + "10:8": "lava[level=8]", + "10:9": "lava[level=9]", + "10:10": "lava[level=10]", + "10:11": "lava[level=11]", + "10:12": "lava[level=12]", + "10:13": "lava[level=13]", + "10:14": "lava[level=14]", + "10:15": "lava[level=15]", + "11:0": "lava[level=0]", + "11:1": "lava[level=1]", + "11:2": "lava[level=2]", + "11:3": "lava[level=3]", + "11:4": "lava[level=4]", + "11:5": "lava[level=5]", + "11:6": "lava[level=6]", + "11:7": "lava[level=7]", + "11:8": "lava[level=8]", + "11:9": "lava[level=9]", + "11:10": "lava[level=10]", + "11:11": "lava[level=11]", + "11:12": "lava[level=12]", + "11:13": "lava[level=13]", + "11:14": "lava[level=14]", + "11:15": "lava[level=15]", + "12:0": "sand", + "12:1": "red_sand", + "13:0": "gravel", + "14:0": "gold_ore", + "15:0": "iron_ore", + "16:0": "coal_ore", + "17:0": "oak_log[axis=y]", + "17:1": "spruce_log[axis=y]", + "17:2": "birch_log[axis=y]", + "17:3": "jungle_log[axis=y]", + "17:4": "oak_log[axis=x]", + "17:5": "spruce_log[axis=x]", + "17:6": "birch_log[axis=x]", + "17:7": "jungle_log[axis=x]", + "17:8": "oak_log[axis=z]", + "17:9": "spruce_log[axis=z]", + "17:10": "birch_log[axis=z]", + "17:11": "jungle_log[axis=z]", + "17:12": "oak_bark", + "17:13": "spruce_bark", + "17:14": "birch_bark", + "17:15": "jungle_bark", + "18:0": "oak_leaves[check_decay=false,decayable=true]", + "18:1": "spruce_leaves[check_decay=false,decayable=true]", + "18:2": "birch_leaves[check_decay=false,decayable=true]", + "18:3": "jungle_leaves[check_decay=false,decayable=true]", + "18:4": "oak_leaves[check_decay=false,decayable=false]", + "18:5": "spruce_leaves[check_decay=false,decayable=false]", + "18:6": "birch_leaves[check_decay=false,decayable=false]", + "18:7": "jungle_leaves[check_decay=false,decayable=false]", + "18:8": "oak_leaves[check_decay=true,decayable=true]", + "18:9": "spruce_leaves[check_decay=true,decayable=true]", + "18:10": "birch_leaves[check_decay=true,decayable=true]", + "18:11": "jungle_leaves[check_decay=true,decayable=true]", + "18:12": "oak_leaves[check_decay=true,decayable=false]", + "18:13": "spruce_leaves[check_decay=true,decayable=false]", + "18:14": "birch_leaves[check_decay=true,decayable=false]", + "18:15": "jungle_leaves[check_decay=true,decayable=false]", + "19:0": "sponge", + "19:1": "wet_sponge", + "20:0": "glass", + "21:0": "lapis_ore", + "22:0": "lapis_block", + "23:0": "dispenser[facing=down,triggered=false]", + "23:1": "dispenser[facing=up,triggered=false]", + "23:2": "dispenser[facing=north,triggered=false]", + "23:3": "dispenser[facing=south,triggered=false]", + "23:4": "dispenser[facing=west,triggered=false]", + "23:5": "dispenser[facing=east,triggered=false]", + "23:8": "dispenser[facing=down,triggered=true]", + "23:9": "dispenser[facing=up,triggered=true]", + "23:10": "dispenser[facing=north,triggered=true]", + "23:11": "dispenser[facing=south,triggered=true]", + "23:12": "dispenser[facing=west,triggered=true]", + "23:13": "dispenser[facing=east,triggered=true]", + "24:0": "sandstone", + "24:1": "chiseled_sandstone", + "24:2": "cut_sandstone", + "25:0": "note_block", + "26:0": "red_bed[facing=south,occupied=false,part=foot]", + "26:1": "red_bed[facing=west,occupied=false,part=foot]", + "26:2": "red_bed[facing=north,occupied=false,part=foot]", + "26:3": "red_bed[facing=east,occupied=false,part=foot]", + "26:8": "red_bed[facing=south,occupied=false,part=head]", + "26:9": "red_bed[facing=west,occupied=false,part=head]", + "26:10": "red_bed[facing=north,occupied=false,part=head]", + "26:11": "red_bed[facing=east,occupied=false,part=head]", + "26:12": "red_bed[facing=south,occupied=true,part=head]", + "26:13": "red_bed[facing=west,occupied=true,part=head]", + "26:14": "red_bed[facing=north,occupied=true,part=head]", + "26:15": "red_bed[facing=east,occupied=true,part=head]", + "27:0": "powered_rail[powered=false,shape=north_south]", + "27:1": "powered_rail[powered=false,shape=east_west]", + "27:2": "powered_rail[powered=false,shape=ascending_east]", + "27:3": "powered_rail[powered=false,shape=ascending_west]", + "27:4": "powered_rail[powered=false,shape=ascending_north]", + "27:5": "powered_rail[powered=false,shape=ascending_south]", + "27:8": "powered_rail[powered=true,shape=north_south]", + "27:9": "powered_rail[powered=true,shape=east_west]", + "27:10": "powered_rail[powered=true,shape=ascending_east]", + "27:11": "powered_rail[powered=true,shape=ascending_west]", + "27:12": "powered_rail[powered=true,shape=ascending_north]", + "27:13": "powered_rail[powered=true,shape=ascending_south]", + "28:0": "detector_rail[powered=false,shape=north_south]", + "28:1": "detector_rail[powered=false,shape=east_west]", + "28:2": "detector_rail[powered=false,shape=ascending_east]", + "28:3": "detector_rail[powered=false,shape=ascending_west]", + "28:4": "detector_rail[powered=false,shape=ascending_north]", + "28:5": "detector_rail[powered=false,shape=ascending_south]", + "28:8": "detector_rail[powered=true,shape=north_south]", + "28:9": "detector_rail[powered=true,shape=east_west]", + "28:10": "detector_rail[powered=true,shape=ascending_east]", + "28:11": "detector_rail[powered=true,shape=ascending_west]", + "28:12": "detector_rail[powered=true,shape=ascending_north]", + "28:13": "detector_rail[powered=true,shape=ascending_south]", + "29:0": "sticky_piston[extended=false,facing=down]", + "29:1": "sticky_piston[extended=false,facing=up]", + "29:2": "sticky_piston[extended=false,facing=north]", + "29:3": "sticky_piston[extended=false,facing=south]", + "29:4": "sticky_piston[extended=false,facing=west]", + "29:5": "sticky_piston[extended=false,facing=east]", + "29:8": "sticky_piston[extended=true,facing=down]", + "29:9": "sticky_piston[extended=true,facing=up]", + "29:10": "sticky_piston[extended=true,facing=north]", + "29:11": "sticky_piston[extended=true,facing=south]", + "29:12": "sticky_piston[extended=true,facing=west]", + "29:13": "sticky_piston[extended=true,facing=east]", + "30:0": "cobweb", + "31:0": "dead_bush", + "31:1": "grass", + "31:2": "fern", + "32:0": "dead_bush", + "33:0": "piston[extended=false,facing=down]", + "33:1": "piston[extended=false,facing=up]", + "33:2": "piston[extended=false,facing=north]", + "33:3": "piston[extended=false,facing=south]", + "33:4": "piston[extended=false,facing=west]", + "33:5": "piston[extended=false,facing=east]", + "33:8": "piston[extended=true,facing=down]", + "33:9": "piston[extended=true,facing=up]", + "33:10": "piston[extended=true,facing=north]", + "33:11": "piston[extended=true,facing=south]", + "33:12": "piston[extended=true,facing=west]", + "33:13": "piston[extended=true,facing=east]", + "34:0": "piston_head[facing=down,short=false,type=normal]", + "34:1": "piston_head[facing=up,short=false,type=normal]", + "34:2": "piston_head[facing=north,short=false,type=normal]", + "34:3": "piston_head[facing=south,short=false,type=normal]", + "34:4": "piston_head[facing=west,short=false,type=normal]", + "34:5": "piston_head[facing=east,short=false,type=normal]", + "34:8": "piston_head[facing=down,short=false,type=sticky]", + "34:9": "piston_head[facing=up,short=false,type=sticky]", + "34:10": "piston_head[facing=north,short=false,type=sticky]", + "34:11": "piston_head[facing=south,short=false,type=sticky]", + "34:12": "piston_head[facing=west,short=false,type=sticky]", + "34:13": "piston_head[facing=east,short=false,type=sticky]", + "35:0": "white_wool", + "35:1": "orange_wool", + "35:2": "magenta_wool", + "35:3": "light_blue_wool", + "35:4": "yellow_wool", + "35:5": "lime_wool", + "35:6": "pink_wool", + "35:7": "gray_wool", + "35:8": "light_gray_wool", + "35:9": "cyan_wool", + "35:10": "purple_wool", + "35:11": "blue_wool", + "35:12": "brown_wool", + "35:13": "green_wool", + "35:14": "red_wool", + "35:15": "black_wool", + "36:0": "moving_piston[facing=down,type=normal]", + "36:1": "moving_piston[facing=up,type=normal]", + "36:2": "moving_piston[facing=north,type=normal]", + "36:3": "moving_piston[facing=south,type=normal]", + "36:4": "moving_piston[facing=west,type=normal]", + "36:5": "moving_piston[facing=east,type=normal]", + "36:8": "moving_piston[facing=down,type=sticky]", + "36:9": "moving_piston[facing=up,type=sticky]", + "36:10": "moving_piston[facing=north,type=sticky]", + "36:11": "moving_piston[facing=south,type=sticky]", + "36:12": "moving_piston[facing=west,type=sticky]", + "36:13": "moving_piston[facing=east,type=sticky]", + "37:0": "dandelion", + "38:0": "poppy", + "38:1": "blue_orchid", + "38:2": "allium", + "38:3": "azure_bluet", + "38:4": "red_tulip", + "38:5": "orange_tulip", + "38:6": "white_tulip", + "38:7": "pink_tulip", + "38:8": "oxeye_daisy", + "39:0": "brown_mushroom", + "40:0": "red_mushroom", + "41:0": "gold_block", + "42:0": "iron_block", + "43:0": "stone_slab[type=double]", + "43:1": "sandstone_slab[type=double]", + "43:2": "petrified_oak_slab[type=double]", + "43:3": "cobblestone_slab[type=double]", + "43:4": "brick_slab[type=double]", + "43:5": "stone_brick_slab[type=double]", + "43:6": "nether_brick_slab[type=double]", + "43:7": "quartz_slab[type=double]", + "43:8": "smooth_stone", + "43:9": "smooth_sandstone", + "43:10": "petrified_oak_slab[type=double]", + "43:11": "cobblestone_slab[type=double]", + "43:12": "brick_slab[type=double]", + "43:13": "stone_brick_slab[type=double]", + "43:14": "nether_brick_slab[type=double]", + "43:15": "smooth_quartz", + "44:0": "stone_slab[type=bottom]", + "44:1": "sandstone_slab[type=bottom]", + "44:2": "petrified_oak_slab[type=bottom]", + "44:3": "cobblestone_slab[type=bottom]", + "44:4": "brick_slab[type=bottom]", + "44:5": "stone_brick_slab[type=bottom]", + "44:6": "nether_brick_slab[type=bottom]", + "44:7": "quartz_slab[type=bottom]", + "44:8": "stone_slab[type=top]", + "44:9": "sandstone_slab[type=top]", + "44:10": "petrified_oak_slab[type=top]", + "44:11": "cobblestone_slab[type=top]", + "44:12": "brick_slab[type=top]", + "44:13": "stone_brick_slab[type=top]", + "44:14": "nether_brick_slab[type=top]", + "44:15": "quartz_slab[type=top]", + "45:0": "bricks", + "46:0": "tnt[unstable=false]", + "46:1": "tnt[unstable=true]", + "47:0": "bookshelf", + "48:0": "mossy_cobblestone", + "49:0": "obsidian", + "50:1": "wall_torch[facing=east]", + "50:2": "wall_torch[facing=west]", + "50:3": "wall_torch[facing=south]", + "50:4": "wall_torch[facing=north]", + "50:5": "torch", + "51:0": "fire[age=0,east=false,north=false,south=false,up=false,west=false]", + "51:1": "fire[age=1,east=false,north=false,south=false,up=false,west=false]", + "51:2": "fire[age=2,east=false,north=false,south=false,up=false,west=false]", + "51:3": "fire[age=3,east=false,north=false,south=false,up=false,west=false]", + "51:4": "fire[age=4,east=false,north=false,south=false,up=false,west=false]", + "51:5": "fire[age=5,east=false,north=false,south=false,up=false,west=false]", + "51:6": "fire[age=6,east=false,north=false,south=false,up=false,west=false]", + "51:7": "fire[age=7,east=false,north=false,south=false,up=false,west=false]", + "51:8": "fire[age=8,east=false,north=false,south=false,up=false,west=false]", + "51:9": "fire[age=9,east=false,north=false,south=false,up=false,west=false]", + "51:10": "fire[age=10,east=false,north=false,south=false,up=false,west=false]", + "51:11": "fire[age=11,east=false,north=false,south=false,up=false,west=false]", + "51:12": "fire[age=12,east=false,north=false,south=false,up=false,west=false]", + "51:13": "fire[age=13,east=false,north=false,south=false,up=false,west=false]", + "51:14": "fire[age=14,east=false,north=false,south=false,up=false,west=false]", + "51:15": "fire[age=15,east=false,north=false,south=false,up=false,west=false]", + "52:0": "mob_spawner", + "53:0": "oak_stairs[facing=east,half=bottom,shape=straight]", + "53:1": "oak_stairs[facing=west,half=bottom,shape=straight]", + "53:2": "oak_stairs[facing=south,half=bottom,shape=straight]", + "53:3": "oak_stairs[facing=north,half=bottom,shape=straight]", + "53:4": "oak_stairs[facing=east,half=top,shape=straight]", + "53:5": "oak_stairs[facing=west,half=top,shape=straight]", + "53:6": "oak_stairs[facing=south,half=top,shape=straight]", + "53:7": "oak_stairs[facing=north,half=top,shape=straight]", + "54:2": "chest[facing=north,type=single]", + "54:3": "chest[facing=south,type=single]", + "54:4": "chest[facing=west,type=single]", + "54:5": "chest[facing=east,type=single]", + "55:0": "redstone_wire[east=none,north=none,power=0,south=none,west=none]", + "55:1": "redstone_wire[east=none,north=none,power=1,south=none,west=none]", + "55:2": "redstone_wire[east=none,north=none,power=2,south=none,west=none]", + "55:3": "redstone_wire[east=none,north=none,power=3,south=none,west=none]", + "55:4": "redstone_wire[east=none,north=none,power=4,south=none,west=none]", + "55:5": "redstone_wire[east=none,north=none,power=5,south=none,west=none]", + "55:6": "redstone_wire[east=none,north=none,power=6,south=none,west=none]", + "55:7": "redstone_wire[east=none,north=none,power=7,south=none,west=none]", + "55:8": "redstone_wire[east=none,north=none,power=8,south=none,west=none]", + "55:9": "redstone_wire[east=none,north=none,power=9,south=none,west=none]", + "55:10": "redstone_wire[east=none,north=none,power=10,south=none,west=none]", + "55:11": "redstone_wire[east=none,north=none,power=11,south=none,west=none]", + "55:12": "redstone_wire[east=none,north=none,power=12,south=none,west=none]", + "55:13": "redstone_wire[east=none,north=none,power=13,south=none,west=none]", + "55:14": "redstone_wire[east=none,north=none,power=14,south=none,west=none]", + "55:15": "redstone_wire[east=none,north=none,power=15,south=none,west=none]", + "56:0": "diamond_ore", + "57:0": "diamond_block", + "58:0": "crafting_table", + "59:0": "wheat[age=0]", + "59:1": "wheat[age=1]", + "59:2": "wheat[age=2]", + "59:3": "wheat[age=3]", + "59:4": "wheat[age=4]", + "59:5": "wheat[age=5]", + "59:6": "wheat[age=6]", + "59:7": "wheat[age=7]", + "60:0": "farmland[moisture=0]", + "60:1": "farmland[moisture=1]", + "60:2": "farmland[moisture=2]", + "60:3": "farmland[moisture=3]", + "60:4": "farmland[moisture=4]", + "60:5": "farmland[moisture=5]", + "60:6": "farmland[moisture=6]", + "60:7": "farmland[moisture=7]", + "61:2": "furnace[facing=north,lit=false]", + "61:3": "furnace[facing=south,lit=false]", + "61:4": "furnace[facing=west,lit=false]", + "61:5": "furnace[facing=east,lit=false]", + "62:2": "furnace[facing=north,lit=true]", + "62:3": "furnace[facing=south,lit=true]", + "62:4": "furnace[facing=west,lit=true]", + "62:5": "furnace[facing=east,lit=true]", + "63:0": "sign[rotation=0]", + "63:1": "sign[rotation=1]", + "63:2": "sign[rotation=2]", + "63:3": "sign[rotation=3]", + "63:4": "sign[rotation=4]", + "63:5": "sign[rotation=5]", + "63:6": "sign[rotation=6]", + "63:7": "sign[rotation=7]", + "63:8": "sign[rotation=8]", + "63:9": "sign[rotation=9]", + "63:10": "sign[rotation=10]", + "63:11": "sign[rotation=11]", + "63:12": "sign[rotation=12]", + "63:13": "sign[rotation=13]", + "63:14": "sign[rotation=14]", + "63:15": "sign[rotation=15]", + "64:0": "oak_door[facing=east,half=lower,hinge=right,open=false,powered=false]", + "64:1": "oak_door[facing=south,half=lower,hinge=right,open=false,powered=false]", + "64:2": "oak_door[facing=west,half=lower,hinge=right,open=false,powered=false]", + "64:3": "oak_door[facing=north,half=lower,hinge=right,open=false,powered=false]", + "64:4": "oak_door[facing=east,half=lower,hinge=right,open=true,powered=false]", + "64:5": "oak_door[facing=south,half=lower,hinge=right,open=true,powered=false]", + "64:6": "oak_door[facing=west,half=lower,hinge=right,open=true,powered=false]", + "64:7": "oak_door[facing=north,half=lower,hinge=right,open=true,powered=false]", + "64:8": "oak_door[facing=east,half=upper,hinge=left,open=false,powered=false]", + "64:9": "oak_door[facing=east,half=upper,hinge=right,open=false,powered=false]", + "64:10": "oak_door[facing=east,half=upper,hinge=left,open=false,powered=true]", + "64:11": "oak_door[facing=east,half=upper,hinge=right,open=false,powered=true]", + "65:2": "ladder[facing=north]", + "65:3": "ladder[facing=south]", + "65:4": "ladder[facing=west]", + "65:5": "ladder[facing=east]", + "66:0": "rail[shape=north_south]", + "66:1": "rail[shape=east_west]", + "66:2": "rail[shape=ascending_east]", + "66:3": "rail[shape=ascending_west]", + "66:4": "rail[shape=ascending_north]", + "66:5": "rail[shape=ascending_south]", + "66:6": "rail[shape=south_east]", + "66:7": "rail[shape=south_west]", + "66:8": "rail[shape=north_west]", + "66:9": "rail[shape=north_east]", + "67:0": "cobblestone_stairs[facing=east,half=bottom,shape=straight]", + "67:1": "cobblestone_stairs[facing=west,half=bottom,shape=straight]", + "67:2": "cobblestone_stairs[facing=south,half=bottom,shape=straight]", + "67:3": "cobblestone_stairs[facing=north,half=bottom,shape=straight]", + "67:4": "cobblestone_stairs[facing=east,half=top,shape=straight]", + "67:5": "cobblestone_stairs[facing=west,half=top,shape=straight]", + "67:6": "cobblestone_stairs[facing=south,half=top,shape=straight]", + "67:7": "cobblestone_stairs[facing=north,half=top,shape=straight]", + "68:2": "wall_sign[facing=north]", + "68:3": "wall_sign[facing=south]", + "68:4": "wall_sign[facing=west]", + "68:5": "wall_sign[facing=east]", + "69:0": "lever[face=ceiling,facing=west,powered=false]", + "69:1": "lever[face=wall,facing=east,powered=false]", + "69:2": "lever[face=wall,facing=west,powered=false]", + "69:3": "lever[face=wall,facing=south,powered=false]", + "69:4": "lever[face=wall,facing=north,powered=false]", + "69:5": "lever[face=floor,facing=north,powered=false]", + "69:6": "lever[face=floor,facing=west,powered=false]", + "69:7": "lever[face=ceiling,facing=north,powered=false]", + "69:8": "lever[face=ceiling,facing=west,powered=true]", + "69:9": "lever[face=wall,facing=east,powered=true]", + "69:10": "lever[face=wall,facing=west,powered=true]", + "69:11": "lever[face=wall,facing=south,powered=true]", + "69:12": "lever[face=wall,facing=north,powered=true]", + "69:13": "lever[face=floor,facing=north,powered=true]", + "69:14": "lever[face=floor,facing=west,powered=true]", + "69:15": "lever[face=ceiling,facing=north,powered=true]", + "70:0": "stone_pressure_plate[powered=false]", + "70:1": "stone_pressure_plate[powered=true]", + "71:0": "iron_door[facing=east,half=lower,hinge=right,open=false,powered=false]", + "71:1": "iron_door[facing=south,half=lower,hinge=right,open=false,powered=false]", + "71:2": "iron_door[facing=west,half=lower,hinge=right,open=false,powered=false]", + "71:3": "iron_door[facing=north,half=lower,hinge=right,open=false,powered=false]", + "71:4": "iron_door[facing=east,half=lower,hinge=right,open=true,powered=false]", + "71:5": "iron_door[facing=south,half=lower,hinge=right,open=true,powered=false]", + "71:6": "iron_door[facing=west,half=lower,hinge=right,open=true,powered=false]", + "71:7": "iron_door[facing=north,half=lower,hinge=right,open=true,powered=false]", + "71:8": "iron_door[facing=east,half=upper,hinge=left,open=false,powered=false]", + "71:9": "iron_door[facing=east,half=upper,hinge=right,open=false,powered=false]", + "71:10": "iron_door[facing=east,half=upper,hinge=left,open=false,powered=true]", + "71:11": "iron_door[facing=east,half=upper,hinge=right,open=false,powered=true]", + "72:0": "oak_pressure_plate[powered=false]", + "72:1": "oak_pressure_plate[powered=true]", + "73:0": "redstone_ore[lit=false]", + "74:0": "redstone_ore[lit=true]", + "75:1": "redstone_wall_torch[facing=east,lit=false]", + "75:2": "redstone_wall_torch[facing=west,lit=false]", + "75:3": "redstone_wall_torch[facing=south,lit=false]", + "75:4": "redstone_wall_torch[facing=north,lit=false]", + "75:5": "redstone_torch[lit=false]", + "76:1": "redstone_wall_torch[facing=east,lit=true]", + "76:2": "redstone_wall_torch[facing=west,lit=true]", + "76:3": "redstone_wall_torch[facing=south,lit=true]", + "76:4": "redstone_wall_torch[facing=north,lit=true]", + "76:5": "redstone_torch[lit=true]", + "77:0": "stone_button[face=ceiling,facing=north,powered=false]", + "77:1": "stone_button[face=wall,facing=east,powered=false]", + "77:2": "stone_button[face=wall,facing=west,powered=false]", + "77:3": "stone_button[face=wall,facing=south,powered=false]", + "77:4": "stone_button[face=wall,facing=north,powered=false]", + "77:5": "stone_button[face=floor,facing=north,powered=false]", + "77:8": "stone_button[face=ceiling,facing=north,powered=true]", + "77:9": "stone_button[face=wall,facing=east,powered=true]", + "77:10": "stone_button[face=wall,facing=west,powered=true]", + "77:11": "stone_button[face=wall,facing=south,powered=true]", + "77:12": "stone_button[face=wall,facing=north,powered=true]", + "77:13": "stone_button[face=floor,facing=north,powered=true]", + "78:0": "snow[layers=1]", + "78:1": "snow[layers=2]", + "78:2": "snow[layers=3]", + "78:3": "snow[layers=4]", + "78:4": "snow[layers=5]", + "78:5": "snow[layers=6]", + "78:6": "snow[layers=7]", + "78:7": "snow[layers=8]", + "79:0": "ice", + "80:0": "snow_block", + "81:0": "cactus[age=0]", + "81:1": "cactus[age=1]", + "81:2": "cactus[age=2]", + "81:3": "cactus[age=3]", + "81:4": "cactus[age=4]", + "81:5": "cactus[age=5]", + "81:6": "cactus[age=6]", + "81:7": "cactus[age=7]", + "81:8": "cactus[age=8]", + "81:9": "cactus[age=9]", + "81:10": "cactus[age=10]", + "81:11": "cactus[age=11]", + "81:12": "cactus[age=12]", + "81:13": "cactus[age=13]", + "81:14": "cactus[age=14]", + "81:15": "cactus[age=15]", + "82:0": "clay", + "83:0": "sugar_cane[age=0]", + "83:1": "sugar_cane[age=1]", + "83:2": "sugar_cane[age=2]", + "83:3": "sugar_cane[age=3]", + "83:4": "sugar_cane[age=4]", + "83:5": "sugar_cane[age=5]", + "83:6": "sugar_cane[age=6]", + "83:7": "sugar_cane[age=7]", + "83:8": "sugar_cane[age=8]", + "83:9": "sugar_cane[age=9]", + "83:10": "sugar_cane[age=10]", + "83:11": "sugar_cane[age=11]", + "83:12": "sugar_cane[age=12]", + "83:13": "sugar_cane[age=13]", + "83:14": "sugar_cane[age=14]", + "83:15": "sugar_cane[age=15]", + "84:0": "jukebox[has_record=false]", + "84:1": "jukebox[has_record=true]", + "85:0": "oak_fence[east=false,north=false,south=false,west=false]", + "86:0": "carved_pumpkin[facing=south]", + "86:1": "carved_pumpkin[facing=west]", + "86:2": "carved_pumpkin[facing=north]", + "86:3": "carved_pumpkin[facing=east]", + "87:0": "netherrack", + "88:0": "soul_sand", + "89:0": "glowstone", + "90:1": "portal[axis=x]", + "90:2": "portal[axis=z]", + "91:0": "jack_o_lantern[facing=south]", + "91:1": "jack_o_lantern[facing=west]", + "91:2": "jack_o_lantern[facing=north]", + "91:3": "jack_o_lantern[facing=east]", + "92:0": "cake[bites=0]", + "92:1": "cake[bites=1]", + "92:2": "cake[bites=2]", + "92:3": "cake[bites=3]", + "92:4": "cake[bites=4]", + "92:5": "cake[bites=5]", + "92:6": "cake[bites=6]", + "93:0": "repeater[delay=1,facing=south,locked=false,powered=false]", + "93:1": "repeater[delay=1,facing=west,locked=false,powered=false]", + "93:2": "repeater[delay=1,facing=north,locked=false,powered=false]", + "93:3": "repeater[delay=1,facing=east,locked=false,powered=false]", + "93:4": "repeater[delay=2,facing=south,locked=false,powered=false]", + "93:5": "repeater[delay=2,facing=west,locked=false,powered=false]", + "93:6": "repeater[delay=2,facing=north,locked=false,powered=false]", + "93:7": "repeater[delay=2,facing=east,locked=false,powered=false]", + "93:8": "repeater[delay=3,facing=south,locked=false,powered=false]", + "93:9": "repeater[delay=3,facing=west,locked=false,powered=false]", + "93:10": "repeater[delay=3,facing=north,locked=false,powered=false]", + "93:11": "repeater[delay=3,facing=east,locked=false,powered=false]", + "93:12": "repeater[delay=4,facing=south,locked=false,powered=false]", + "93:13": "repeater[delay=4,facing=west,locked=false,powered=false]", + "93:14": "repeater[delay=4,facing=north,locked=false,powered=false]", + "93:15": "repeater[delay=4,facing=east,locked=false,powered=false]", + "94:0": "repeater[delay=1,facing=south,locked=false,powered=true]", + "94:1": "repeater[delay=1,facing=west,locked=false,powered=true]", + "94:2": "repeater[delay=1,facing=north,locked=false,powered=true]", + "94:3": "repeater[delay=1,facing=east,locked=false,powered=true]", + "94:4": "repeater[delay=2,facing=south,locked=false,powered=true]", + "94:5": "repeater[delay=2,facing=west,locked=false,powered=true]", + "94:6": "repeater[delay=2,facing=north,locked=false,powered=true]", + "94:7": "repeater[delay=2,facing=east,locked=false,powered=true]", + "94:8": "repeater[delay=3,facing=south,locked=false,powered=true]", + "94:9": "repeater[delay=3,facing=west,locked=false,powered=true]", + "94:10": "repeater[delay=3,facing=north,locked=false,powered=true]", + "94:11": "repeater[delay=3,facing=east,locked=false,powered=true]", + "94:12": "repeater[delay=4,facing=south,locked=false,powered=true]", + "94:13": "repeater[delay=4,facing=west,locked=false,powered=true]", + "94:14": "repeater[delay=4,facing=north,locked=false,powered=true]", + "94:15": "repeater[delay=4,facing=east,locked=false,powered=true]", + "95:0": "white_stained_glass", + "95:1": "orange_stained_glass", + "95:2": "magenta_stained_glass", + "95:3": "light_blue_stained_glass", + "95:4": "yellow_stained_glass", + "95:5": "lime_stained_glass", + "95:6": "pink_stained_glass", + "95:7": "gray_stained_glass", + "95:8": "light_gray_stained_glass", + "95:9": "cyan_stained_glass", + "95:10": "purple_stained_glass", + "95:11": "blue_stained_glass", + "95:12": "brown_stained_glass", + "95:13": "green_stained_glass", + "95:14": "red_stained_glass", + "95:15": "black_stained_glass", + "96:0": "oak_trapdoor[facing=north,half=bottom,open=false]", + "96:1": "oak_trapdoor[facing=south,half=bottom,open=false]", + "96:2": "oak_trapdoor[facing=west,half=bottom,open=false]", + "96:3": "oak_trapdoor[facing=east,half=bottom,open=false]", + "96:4": "oak_trapdoor[facing=north,half=bottom,open=true]", + "96:5": "oak_trapdoor[facing=south,half=bottom,open=true]", + "96:6": "oak_trapdoor[facing=west,half=bottom,open=true]", + "96:7": "oak_trapdoor[facing=east,half=bottom,open=true]", + "96:8": "oak_trapdoor[facing=north,half=top,open=false]", + "96:9": "oak_trapdoor[facing=south,half=top,open=false]", + "96:10": "oak_trapdoor[facing=west,half=top,open=false]", + "96:11": "oak_trapdoor[facing=east,half=top,open=false]", + "96:12": "oak_trapdoor[facing=north,half=top,open=true]", + "96:13": "oak_trapdoor[facing=south,half=top,open=true]", + "96:14": "oak_trapdoor[facing=west,half=top,open=true]", + "96:15": "oak_trapdoor[facing=east,half=top,open=true]", + "97:0": "infested_stone", + "97:1": "infested_cobblestone", + "97:2": "infested_stone_bricks", + "97:3": "infested_mossy_stone_bricks", + "97:4": "infested_cracked_stone_bricks", + "97:5": "infested_chiseled_stone_bricks", + "98:0": "stone_bricks", + "98:1": "mossy_stone_bricks", + "98:2": "cracked_stone_bricks", + "98:3": "chiseled_stone_bricks", + "99:0": "brown_mushroom_block[north=false,east=false,south=false,west=false,up=false,down=false]", + "99:1": "brown_mushroom_block[north=true,east=false,south=false,west=true,up=true,down=false]", + "99:2": "brown_mushroom_block[north=true,east=false,south=false,west=false,up=true,down=false]", + "99:3": "brown_mushroom_block[north=true,east=true,south=false,west=false,up=true,down=false]", + "99:4": "brown_mushroom_block[north=false,east=false,south=false,west=true,up=true,down=false]", + "99:5": "brown_mushroom_block[north=false,east=false,south=false,west=false,up=true,down=false]", + "99:6": "brown_mushroom_block[north=false,east=true,south=false,west=false,up=true,down=false]", + "99:7": "brown_mushroom_block[north=false,east=false,south=true,west=true,up=true,down=false]", + "99:8": "brown_mushroom_block[north=false,east=false,south=true,west=false,up=true,down=false]", + "99:9": "brown_mushroom_block[north=false,east=true,south=true,west=false,up=true,down=false]", + "99:10": "mushroom_stem[north=true,east=true,south=true,west=true,up=false,down=false]", + "99:14": "brown_mushroom_block[north=true,east=true,south=true,west=true,up=true,down=true]", + "99:15": "mushroom_stem[north=true,east=true,south=true,west=true,up=true,down=true]", + "100:0": "red_mushroom_block[north=false,east=false,south=false,west=false,up=false,down=false]", + "100:1": "red_mushroom_block[north=true,east=false,south=false,west=true,up=true,down=false]", + "100:2": "red_mushroom_block[north=true,east=false,south=false,west=false,up=true,down=false]", + "100:3": "red_mushroom_block[north=true,east=true,south=false,west=false,up=true,down=false]", + "100:4": "red_mushroom_block[north=false,east=false,south=false,west=true,up=true,down=false]", + "100:5": "red_mushroom_block[north=false,east=false,south=false,west=false,up=true,down=false]", + "100:6": "red_mushroom_block[north=false,east=true,south=false,west=false,up=true,down=false]", + "100:7": "red_mushroom_block[north=false,east=false,south=true,west=true,up=true,down=false]", + "100:8": "red_mushroom_block[north=false,east=false,south=true,west=false,up=true,down=false]", + "100:9": "red_mushroom_block[north=false,east=true,south=true,west=false,up=true,down=false]", + "100:10": "mushroom_stem[north=true,east=true,south=true,west=true,up=false,down=false]", + "100:14": "red_mushroom_block[north=true,east=true,south=true,west=true,up=true,down=true]", + "100:15": "mushroom_stem[north=true,east=true,south=true,west=true,up=true,down=true]", + "101:0": "iron_bars[east=false,north=false,south=false,west=false]", + "102:0": "glass_pane[east=false,north=false,south=false,west=false]", + "103:0": "melon_block", + "104:0": "pumpkin_stem[age=0]", + "104:1": "pumpkin_stem[age=1]", + "104:2": "pumpkin_stem[age=2]", + "104:3": "pumpkin_stem[age=3]", + "104:4": "pumpkin_stem[age=4]", + "104:5": "pumpkin_stem[age=5]", + "104:6": "pumpkin_stem[age=6]", + "104:7": "pumpkin_stem[age=7]", + "105:0": "melon_stem[age=0]", + "105:1": "melon_stem[age=1]", + "105:2": "melon_stem[age=2]", + "105:3": "melon_stem[age=3]", + "105:4": "melon_stem[age=4]", + "105:5": "melon_stem[age=5]", + "105:6": "melon_stem[age=6]", + "105:7": "melon_stem[age=7]", + "106:0": "vine[east=false,north=false,south=false,up=true,west=false]", + "106:1": "vine[east=false,north=false,south=true,up=true,west=false]", + "106:2": "vine[east=false,north=false,south=false,up=true,west=true]", + "106:3": "vine[east=false,north=false,south=true,up=true,west=true]", + "106:4": "vine[east=false,north=true,south=false,up=true,west=false]", + "106:5": "vine[east=false,north=true,south=true,up=true,west=false]", + "106:6": "vine[east=false,north=true,south=false,up=true,west=true]", + "106:7": "vine[east=false,north=true,south=true,up=true,west=true]", + "106:8": "vine[east=true,north=false,south=false,up=true,west=false]", + "106:9": "vine[east=true,north=false,south=true,up=true,west=false]", + "106:10": "vine[east=true,north=false,south=false,up=true,west=true]", + "106:11": "vine[east=true,north=false,south=true,up=true,west=true]", + "106:12": "vine[east=true,north=true,south=false,up=true,west=false]", + "106:13": "vine[east=true,north=true,south=true,up=true,west=false]", + "106:14": "vine[east=true,north=true,south=false,up=true,west=true]", + "106:15": "vine[east=true,north=true,south=true,up=true,west=true]", + "107:0": "oak_fence_gate[facing=south,in_wall=false,open=false,powered=false]", + "107:1": "oak_fence_gate[facing=west,in_wall=false,open=false,powered=false]", + "107:2": "oak_fence_gate[facing=north,in_wall=false,open=false,powered=false]", + "107:3": "oak_fence_gate[facing=east,in_wall=false,open=false,powered=false]", + "107:4": "oak_fence_gate[facing=south,in_wall=false,open=true,powered=false]", + "107:5": "oak_fence_gate[facing=west,in_wall=false,open=true,powered=false]", + "107:6": "oak_fence_gate[facing=north,in_wall=false,open=true,powered=false]", + "107:7": "oak_fence_gate[facing=east,in_wall=false,open=true,powered=false]", + "107:8": "oak_fence_gate[facing=south,in_wall=false,open=false,powered=true]", + "107:9": "oak_fence_gate[facing=west,in_wall=false,open=false,powered=true]", + "107:10": "oak_fence_gate[facing=north,in_wall=false,open=false,powered=true]", + "107:11": "oak_fence_gate[facing=east,in_wall=false,open=false,powered=true]", + "107:12": "oak_fence_gate[facing=south,in_wall=false,open=true,powered=true]", + "107:13": "oak_fence_gate[facing=west,in_wall=false,open=true,powered=true]", + "107:14": "oak_fence_gate[facing=north,in_wall=false,open=true,powered=true]", + "107:15": "oak_fence_gate[facing=east,in_wall=false,open=true,powered=true]", + "108:0": "brick_stairs[facing=east,half=bottom,shape=straight]", + "108:1": "brick_stairs[facing=west,half=bottom,shape=straight]", + "108:2": "brick_stairs[facing=south,half=bottom,shape=straight]", + "108:3": "brick_stairs[facing=north,half=bottom,shape=straight]", + "108:4": "brick_stairs[facing=east,half=top,shape=straight]", + "108:5": "brick_stairs[facing=west,half=top,shape=straight]", + "108:6": "brick_stairs[facing=south,half=top,shape=straight]", + "108:7": "brick_stairs[facing=north,half=top,shape=straight]", + "109:0": "stone_brick_stairs[facing=east,half=bottom,shape=straight]", + "109:1": "stone_brick_stairs[facing=west,half=bottom,shape=straight]", + "109:2": "stone_brick_stairs[facing=south,half=bottom,shape=straight]", + "109:3": "stone_brick_stairs[facing=north,half=bottom,shape=straight]", + "109:4": "stone_brick_stairs[facing=east,half=top,shape=straight]", + "109:5": "stone_brick_stairs[facing=west,half=top,shape=straight]", + "109:6": "stone_brick_stairs[facing=south,half=top,shape=straight]", + "109:7": "stone_brick_stairs[facing=north,half=top,shape=straight]", + "110:0": "mycelium[snowy=false]", + "111:0": "lily_pad", + "112:0": "nether_bricks", + "113:0": "nether_brick_fence[east=false,north=false,south=false,west=false]", + "114:0": "nether_brick_stairs[facing=east,half=bottom,shape=straight]", + "114:1": "nether_brick_stairs[facing=west,half=bottom,shape=straight]", + "114:2": "nether_brick_stairs[facing=south,half=bottom,shape=straight]", + "114:3": "nether_brick_stairs[facing=north,half=bottom,shape=straight]", + "114:4": "nether_brick_stairs[facing=east,half=top,shape=straight]", + "114:5": "nether_brick_stairs[facing=west,half=top,shape=straight]", + "114:6": "nether_brick_stairs[facing=south,half=top,shape=straight]", + "114:7": "nether_brick_stairs[facing=north,half=top,shape=straight]", + "115:0": "nether_wart[age=0]", + "115:1": "nether_wart[age=1]", + "115:2": "nether_wart[age=2]", + "115:3": "nether_wart[age=3]", + "116:0": "enchanting_table", + "117:0": "brewing_stand[has_bottle_0=false,has_bottle_1=false,has_bottle_2=false]", + "117:1": "brewing_stand[has_bottle_0=true,has_bottle_1=false,has_bottle_2=false]", + "117:2": "brewing_stand[has_bottle_0=false,has_bottle_1=true,has_bottle_2=false]", + "117:3": "brewing_stand[has_bottle_0=true,has_bottle_1=true,has_bottle_2=false]", + "117:4": "brewing_stand[has_bottle_0=false,has_bottle_1=false,has_bottle_2=true]", + "117:5": "brewing_stand[has_bottle_0=true,has_bottle_1=false,has_bottle_2=true]", + "117:6": "brewing_stand[has_bottle_0=false,has_bottle_1=true,has_bottle_2=true]", + "117:7": "brewing_stand[has_bottle_0=true,has_bottle_1=true,has_bottle_2=true]", + "118:0": "cauldron[level=0]", + "118:1": "cauldron[level=1]", + "118:2": "cauldron[level=2]", + "118:3": "cauldron[level=3]", + "119:0": "end_portal", + "120:0": "end_portal_frame[eye=false,facing=south]", + "120:1": "end_portal_frame[eye=false,facing=west]", + "120:2": "end_portal_frame[eye=false,facing=north]", + "120:3": "end_portal_frame[eye=false,facing=east]", + "120:4": "end_portal_frame[eye=true,facing=south]", + "120:5": "end_portal_frame[eye=true,facing=west]", + "120:6": "end_portal_frame[eye=true,facing=north]", + "120:7": "end_portal_frame[eye=true,facing=east]", + "121:0": "end_stone", + "122:0": "dragon_egg", + "123:0": "redstone_lamp[lit=false]", + "124:0": "redstone_lamp[lit=true]", + "125:0": "oak_slab[type=double]", + "125:1": "spruce_slab[type=double]", + "125:2": "birch_slab[type=double]", + "125:3": "jungle_slab[type=double]", + "125:4": "acacia_slab[type=double]", + "125:5": "dark_oak_slab[type=double]", + "126:0": "oak_slab[type=bottom]", + "126:1": "spruce_slab[type=bottom]", + "126:2": "birch_slab[type=bottom]", + "126:3": "jungle_slab[type=bottom]", + "126:4": "acacia_slab[type=bottom]", + "126:5": "dark_oak_slab[type=bottom]", + "126:8": "oak_slab[type=top]", + "126:9": "spruce_slab[type=top]", + "126:10": "birch_slab[type=top]", + "126:11": "jungle_slab[type=top]", + "126:12": "acacia_slab[type=top]", + "126:13": "dark_oak_slab[type=top]", + "127:0": "cocoa[age=0,facing=south]", + "127:1": "cocoa[age=0,facing=west]", + "127:2": "cocoa[age=0,facing=north]", + "127:3": "cocoa[age=0,facing=east]", + "127:4": "cocoa[age=1,facing=south]", + "127:5": "cocoa[age=1,facing=west]", + "127:6": "cocoa[age=1,facing=north]", + "127:7": "cocoa[age=1,facing=east]", + "127:8": "cocoa[age=2,facing=south]", + "127:9": "cocoa[age=2,facing=west]", + "127:10": "cocoa[age=2,facing=north]", + "127:11": "cocoa[age=2,facing=east]", + "128:0": "sandstone_stairs[facing=east,half=bottom,shape=straight]", + "128:1": "sandstone_stairs[facing=west,half=bottom,shape=straight]", + "128:2": "sandstone_stairs[facing=south,half=bottom,shape=straight]", + "128:3": "sandstone_stairs[facing=north,half=bottom,shape=straight]", + "128:4": "sandstone_stairs[facing=east,half=top,shape=straight]", + "128:5": "sandstone_stairs[facing=west,half=top,shape=straight]", + "128:6": "sandstone_stairs[facing=south,half=top,shape=straight]", + "128:7": "sandstone_stairs[facing=north,half=top,shape=straight]", + "129:0": "emerald_ore", + "130:2": "ender_chest[facing=north]", + "130:3": "ender_chest[facing=south]", + "130:4": "ender_chest[facing=west]", + "130:5": "ender_chest[facing=east]", + "131:0": "tripwire_hook[attached=false,facing=south,powered=false]", + "131:1": "tripwire_hook[attached=false,facing=west,powered=false]", + "131:2": "tripwire_hook[attached=false,facing=north,powered=false]", + "131:3": "tripwire_hook[attached=false,facing=east,powered=false]", + "131:4": "tripwire_hook[attached=true,facing=south,powered=false]", + "131:5": "tripwire_hook[attached=true,facing=west,powered=false]", + "131:6": "tripwire_hook[attached=true,facing=north,powered=false]", + "131:7": "tripwire_hook[attached=true,facing=east,powered=false]", + "131:8": "tripwire_hook[attached=false,facing=south,powered=true]", + "131:9": "tripwire_hook[attached=false,facing=west,powered=true]", + "131:10": "tripwire_hook[attached=false,facing=north,powered=true]", + "131:11": "tripwire_hook[attached=false,facing=east,powered=true]", + "131:12": "tripwire_hook[attached=true,facing=south,powered=true]", + "131:13": "tripwire_hook[attached=true,facing=west,powered=true]", + "131:14": "tripwire_hook[attached=true,facing=north,powered=true]", + "131:15": "tripwire_hook[attached=true,facing=east,powered=true]", + "132:0": "tripwire[attached=false,disarmed=false,east=false,north=false,powered=false,south=false,west=false]", + "132:1": "tripwire[attached=false,disarmed=false,east=false,north=false,powered=true,south=false,west=false]", + "132:4": "tripwire[attached=true,disarmed=false,east=false,north=false,powered=false,south=false,west=false]", + "132:5": "tripwire[attached=true,disarmed=false,east=false,north=false,powered=true,south=false,west=false]", + "132:8": "tripwire[attached=false,disarmed=true,east=false,north=false,powered=false,south=false,west=false]", + "132:9": "tripwire[attached=false,disarmed=true,east=false,north=false,powered=true,south=false,west=false]", + "132:12": "tripwire[attached=true,disarmed=true,east=false,north=false,powered=false,south=false,west=false]", + "132:13": "tripwire[attached=true,disarmed=true,east=false,north=false,powered=true,south=false,west=false]", + "133:0": "emerald_block", + "134:0": "spruce_stairs[facing=east,half=bottom,shape=straight]", + "134:1": "spruce_stairs[facing=west,half=bottom,shape=straight]", + "134:2": "spruce_stairs[facing=south,half=bottom,shape=straight]", + "134:3": "spruce_stairs[facing=north,half=bottom,shape=straight]", + "134:4": "spruce_stairs[facing=east,half=top,shape=straight]", + "134:5": "spruce_stairs[facing=west,half=top,shape=straight]", + "134:6": "spruce_stairs[facing=south,half=top,shape=straight]", + "134:7": "spruce_stairs[facing=north,half=top,shape=straight]", + "135:0": "birch_stairs[facing=east,half=bottom,shape=straight]", + "135:1": "birch_stairs[facing=west,half=bottom,shape=straight]", + "135:2": "birch_stairs[facing=south,half=bottom,shape=straight]", + "135:3": "birch_stairs[facing=north,half=bottom,shape=straight]", + "135:4": "birch_stairs[facing=east,half=top,shape=straight]", + "135:5": "birch_stairs[facing=west,half=top,shape=straight]", + "135:6": "birch_stairs[facing=south,half=top,shape=straight]", + "135:7": "birch_stairs[facing=north,half=top,shape=straight]", + "136:0": "jungle_stairs[facing=east,half=bottom,shape=straight]", + "136:1": "jungle_stairs[facing=west,half=bottom,shape=straight]", + "136:2": "jungle_stairs[facing=south,half=bottom,shape=straight]", + "136:3": "jungle_stairs[facing=north,half=bottom,shape=straight]", + "136:4": "jungle_stairs[facing=east,half=top,shape=straight]", + "136:5": "jungle_stairs[facing=west,half=top,shape=straight]", + "136:6": "jungle_stairs[facing=south,half=top,shape=straight]", + "136:7": "jungle_stairs[facing=north,half=top,shape=straight]", + "137:0": "command_block[conditional=false,facing=down]", + "137:1": "command_block[conditional=false,facing=up]", + "137:2": "command_block[conditional=false,facing=north]", + "137:3": "command_block[conditional=false,facing=south]", + "137:4": "command_block[conditional=false,facing=west]", + "137:5": "command_block[conditional=false,facing=east]", + "137:8": "command_block[conditional=true,facing=down]", + "137:9": "command_block[conditional=true,facing=up]", + "137:10": "command_block[conditional=true,facing=north]", + "137:11": "command_block[conditional=true,facing=south]", + "137:12": "command_block[conditional=true,facing=west]", + "137:13": "command_block[conditional=true,facing=east]", + "138:0": "beacon", + "139:0": "cobblestone_wall[east=false,north=false,south=false,up=false,west=false]", + "139:1": "mossy_cobblestone_wall[east=false,north=false,south=false,up=false,west=false]", + "140:0": "potted_cactus", + "140:1": "potted_cactus", + "140:2": "potted_cactus", + "140:3": "potted_cactus", + "140:4": "potted_cactus", + "140:5": "potted_cactus", + "140:6": "potted_cactus", + "140:7": "potted_cactus", + "140:8": "potted_cactus", + "140:9": "potted_cactus", + "140:10": "potted_cactus", + "140:11": "potted_cactus", + "140:12": "potted_cactus", + "140:13": "potted_cactus", + "140:14": "potted_cactus", + "140:15": "potted_cactus", + "141:0": "carrots[age=0]", + "141:1": "carrots[age=1]", + "141:2": "carrots[age=2]", + "141:3": "carrots[age=3]", + "141:4": "carrots[age=4]", + "141:5": "carrots[age=5]", + "141:6": "carrots[age=6]", + "141:7": "carrots[age=7]", + "142:0": "potatoes[age=0]", + "142:1": "potatoes[age=1]", + "142:2": "potatoes[age=2]", + "142:3": "potatoes[age=3]", + "142:4": "potatoes[age=4]", + "142:5": "potatoes[age=5]", + "142:6": "potatoes[age=6]", + "142:7": "potatoes[age=7]", + "143:0": "oak_button[face=ceiling,facing=north,powered=false]", + "143:1": "oak_button[face=wall,facing=east,powered=false]", + "143:2": "oak_button[face=wall,facing=west,powered=false]", + "143:3": "oak_button[face=wall,facing=south,powered=false]", + "143:4": "oak_button[face=wall,facing=north,powered=false]", + "143:5": "oak_button[face=floor,facing=north,powered=false]", + "143:8": "oak_button[face=ceiling,facing=north,powered=true]", + "143:9": "oak_button[face=wall,facing=east,powered=true]", + "143:10": "oak_button[face=wall,facing=west,powered=true]", + "143:11": "oak_button[face=wall,facing=south,powered=true]", + "143:12": "oak_button[face=wall,facing=north,powered=true]", + "143:13": "oak_button[face=floor,facing=north,powered=true]", + "144:0": "undefined[facing=down,nodrop=false]", + "144:1": "undefined[facing=up,nodrop=false]", + "144:2": "undefined[facing=north,nodrop=false]", + "144:3": "undefined[facing=south,nodrop=false]", + "144:4": "undefined[facing=west,nodrop=false]", + "144:5": "undefined[facing=east,nodrop=false]", + "144:8": "undefined[facing=down,nodrop=true]", + "144:9": "undefined[facing=up,nodrop=true]", + "144:10": "undefined[facing=north,nodrop=true]", + "144:11": "undefined[facing=south,nodrop=true]", + "144:12": "undefined[facing=west,nodrop=true]", + "144:13": "undefined[facing=east,nodrop=true]", + "145:0": "anvil[facing=south]", + "145:1": "anvil[facing=west]", + "145:2": "anvil[facing=north]", + "145:3": "anvil[facing=east]", + "145:4": "chipped_anvil[facing=south]", + "145:5": "chipped_anvil[facing=west]", + "145:6": "chipped_anvil[facing=north]", + "145:7": "chipped_anvil[facing=east]", + "145:8": "damaged_anvil[facing=south]", + "145:9": "damaged_anvil[facing=west]", + "145:10": "damaged_anvil[facing=north]", + "145:11": "damaged_anvil[facing=east]", + "146:2": "trapped_chest[facing=north,type=single]", + "146:3": "trapped_chest[facing=south,type=single]", + "146:4": "trapped_chest[facing=west,type=single]", + "146:5": "trapped_chest[facing=east,type=single]", + "147:0": "light_weighted_pressure_plate[power=0]", + "147:1": "light_weighted_pressure_plate[power=1]", + "147:2": "light_weighted_pressure_plate[power=2]", + "147:3": "light_weighted_pressure_plate[power=3]", + "147:4": "light_weighted_pressure_plate[power=4]", + "147:5": "light_weighted_pressure_plate[power=5]", + "147:6": "light_weighted_pressure_plate[power=6]", + "147:7": "light_weighted_pressure_plate[power=7]", + "147:8": "light_weighted_pressure_plate[power=8]", + "147:9": "light_weighted_pressure_plate[power=9]", + "147:10": "light_weighted_pressure_plate[power=10]", + "147:11": "light_weighted_pressure_plate[power=11]", + "147:12": "light_weighted_pressure_plate[power=12]", + "147:13": "light_weighted_pressure_plate[power=13]", + "147:14": "light_weighted_pressure_plate[power=14]", + "147:15": "light_weighted_pressure_plate[power=15]", + "148:0": "heavy_weighted_pressure_plate[power=0]", + "148:1": "heavy_weighted_pressure_plate[power=1]", + "148:2": "heavy_weighted_pressure_plate[power=2]", + "148:3": "heavy_weighted_pressure_plate[power=3]", + "148:4": "heavy_weighted_pressure_plate[power=4]", + "148:5": "heavy_weighted_pressure_plate[power=5]", + "148:6": "heavy_weighted_pressure_plate[power=6]", + "148:7": "heavy_weighted_pressure_plate[power=7]", + "148:8": "heavy_weighted_pressure_plate[power=8]", + "148:9": "heavy_weighted_pressure_plate[power=9]", + "148:10": "heavy_weighted_pressure_plate[power=10]", + "148:11": "heavy_weighted_pressure_plate[power=11]", + "148:12": "heavy_weighted_pressure_plate[power=12]", + "148:13": "heavy_weighted_pressure_plate[power=13]", + "148:14": "heavy_weighted_pressure_plate[power=14]", + "148:15": "heavy_weighted_pressure_plate[power=15]", + "149:0": "comparator[facing=south,mode=compare,powered=false]", + "149:1": "comparator[facing=west,mode=compare,powered=false]", + "149:2": "comparator[facing=north,mode=compare,powered=false]", + "149:3": "comparator[facing=east,mode=compare,powered=false]", + "149:4": "comparator[facing=south,mode=subtract,powered=false]", + "149:5": "comparator[facing=west,mode=subtract,powered=false]", + "149:6": "comparator[facing=north,mode=subtract,powered=false]", + "149:7": "comparator[facing=east,mode=subtract,powered=false]", + "149:8": "comparator[facing=south,mode=compare,powered=true]", + "149:9": "comparator[facing=west,mode=compare,powered=true]", + "149:10": "comparator[facing=north,mode=compare,powered=true]", + "149:11": "comparator[facing=east,mode=compare,powered=true]", + "149:12": "comparator[facing=south,mode=subtract,powered=true]", + "149:13": "comparator[facing=west,mode=subtract,powered=true]", + "149:14": "comparator[facing=north,mode=subtract,powered=true]", + "149:15": "comparator[facing=east,mode=subtract,powered=true]", + "150:0": "comparator[facing=south,mode=compare,powered=false]", + "150:1": "comparator[facing=west,mode=compare,powered=false]", + "150:2": "comparator[facing=north,mode=compare,powered=false]", + "150:3": "comparator[facing=east,mode=compare,powered=false]", + "150:4": "comparator[facing=south,mode=subtract,powered=false]", + "150:5": "comparator[facing=west,mode=subtract,powered=false]", + "150:6": "comparator[facing=north,mode=subtract,powered=false]", + "150:7": "comparator[facing=east,mode=subtract,powered=false]", + "150:8": "comparator[facing=south,mode=compare,powered=true]", + "150:9": "comparator[facing=west,mode=compare,powered=true]", + "150:10": "comparator[facing=north,mode=compare,powered=true]", + "150:11": "comparator[facing=east,mode=compare,powered=true]", + "150:12": "comparator[facing=south,mode=subtract,powered=true]", + "150:13": "comparator[facing=west,mode=subtract,powered=true]", + "150:14": "comparator[facing=north,mode=subtract,powered=true]", + "150:15": "comparator[facing=east,mode=subtract,powered=true]", + "151:0": "daylight_detector[inverted=false,power=0]", + "151:1": "daylight_detector[inverted=false,power=1]", + "151:2": "daylight_detector[inverted=false,power=2]", + "151:3": "daylight_detector[inverted=false,power=3]", + "151:4": "daylight_detector[inverted=false,power=4]", + "151:5": "daylight_detector[inverted=false,power=5]", + "151:6": "daylight_detector[inverted=false,power=6]", + "151:7": "daylight_detector[inverted=false,power=7]", + "151:8": "daylight_detector[inverted=false,power=8]", + "151:9": "daylight_detector[inverted=false,power=9]", + "151:10": "daylight_detector[inverted=false,power=10]", + "151:11": "daylight_detector[inverted=false,power=11]", + "151:12": "daylight_detector[inverted=false,power=12]", + "151:13": "daylight_detector[inverted=false,power=13]", + "151:14": "daylight_detector[inverted=false,power=14]", + "151:15": "daylight_detector[inverted=false,power=15]", + "152:0": "redstone_block", + "153:0": "nether_quartz_ore", + "154:0": "hopper[enabled=true,facing=down]", + "154:2": "hopper[enabled=true,facing=north]", + "154:3": "hopper[enabled=true,facing=south]", + "154:4": "hopper[enabled=true,facing=west]", + "154:5": "hopper[enabled=true,facing=east]", + "154:8": "hopper[enabled=false,facing=down]", + "154:10": "hopper[enabled=false,facing=north]", + "154:11": "hopper[enabled=false,facing=south]", + "154:12": "hopper[enabled=false,facing=west]", + "154:13": "hopper[enabled=false,facing=east]", + "155:0": "quartz_block", + "155:1": "chiseled_quartz_block", + "155:2": "quartz_pillar[axis=y]", + "155:3": "quartz_pillar[axis=x]", + "155:4": "quartz_pillar[axis=z]", + "156:0": "quartz_stairs[facing=east,half=bottom,shape=straight]", + "156:1": "quartz_stairs[facing=west,half=bottom,shape=straight]", + "156:2": "quartz_stairs[facing=south,half=bottom,shape=straight]", + "156:3": "quartz_stairs[facing=north,half=bottom,shape=straight]", + "156:4": "quartz_stairs[facing=east,half=top,shape=straight]", + "156:5": "quartz_stairs[facing=west,half=top,shape=straight]", + "156:6": "quartz_stairs[facing=south,half=top,shape=straight]", + "156:7": "quartz_stairs[facing=north,half=top,shape=straight]", + "157:0": "activator_rail[powered=false,shape=north_south]", + "157:1": "activator_rail[powered=false,shape=east_west]", + "157:2": "activator_rail[powered=false,shape=ascending_east]", + "157:3": "activator_rail[powered=false,shape=ascending_west]", + "157:4": "activator_rail[powered=false,shape=ascending_north]", + "157:5": "activator_rail[powered=false,shape=ascending_south]", + "157:8": "activator_rail[powered=true,shape=north_south]", + "157:9": "activator_rail[powered=true,shape=east_west]", + "157:10": "activator_rail[powered=true,shape=ascending_east]", + "157:11": "activator_rail[powered=true,shape=ascending_west]", + "157:12": "activator_rail[powered=true,shape=ascending_north]", + "157:13": "activator_rail[powered=true,shape=ascending_south]", + "158:0": "dropper[facing=down,triggered=false]", + "158:1": "dropper[facing=up,triggered=false]", + "158:2": "dropper[facing=north,triggered=false]", + "158:3": "dropper[facing=south,triggered=false]", + "158:4": "dropper[facing=west,triggered=false]", + "158:5": "dropper[facing=east,triggered=false]", + "158:8": "dropper[facing=down,triggered=true]", + "158:9": "dropper[facing=up,triggered=true]", + "158:10": "dropper[facing=north,triggered=true]", + "158:11": "dropper[facing=south,triggered=true]", + "158:12": "dropper[facing=west,triggered=true]", + "158:13": "dropper[facing=east,triggered=true]", + "159:0": "white_terracotta", + "159:1": "orange_terracotta", + "159:2": "magenta_terracotta", + "159:3": "light_blue_terracotta", + "159:4": "yellow_terracotta", + "159:5": "lime_terracotta", + "159:6": "pink_terracotta", + "159:7": "gray_terracotta", + "159:8": "light_gray_terracotta", + "159:9": "cyan_terracotta", + "159:10": "purple_terracotta", + "159:11": "blue_terracotta", + "159:12": "brown_terracotta", + "159:13": "green_terracotta", + "159:14": "red_terracotta", + "159:15": "black_terracotta", + "160:0": "white_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:1": "orange_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:2": "magenta_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:3": "light_blue_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:4": "yellow_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:5": "lime_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:6": "pink_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:7": "gray_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:8": "light_gray_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:9": "cyan_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:10": "purple_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:11": "blue_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:12": "brown_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:13": "green_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:14": "red_stained_glass_pane[east=false,north=false,south=false,west=false]", + "160:15": "black_stained_glass_pane[east=false,north=false,south=false,west=false]", + "161:0": "acacia_leaves[check_decay=false,decayable=true]", + "161:1": "dark_oak_leaves[check_decay=false,decayable=true]", + "161:4": "acacia_leaves[check_decay=false,decayable=false]", + "161:5": "dark_oak_leaves[check_decay=false,decayable=false]", + "161:8": "acacia_leaves[check_decay=true,decayable=true]", + "161:9": "dark_oak_leaves[check_decay=true,decayable=true]", + "161:12": "acacia_leaves[check_decay=true,decayable=false]", + "161:13": "dark_oak_leaves[check_decay=true,decayable=false]", + "162:0": "acacia_log[axis=y]", + "162:1": "dark_oak_log[axis=y]", + "162:4": "acacia_log[axis=x]", + "162:5": "dark_oak_log[axis=x]", + "162:8": "acacia_log[axis=z]", + "162:9": "dark_oak_log[axis=z]", + "162:12": "acacia_bark", + "162:13": "dark_oak_bark", + "163:0": "acacia_stairs[facing=east,half=bottom,shape=straight]", + "163:1": "acacia_stairs[facing=west,half=bottom,shape=straight]", + "163:2": "acacia_stairs[facing=south,half=bottom,shape=straight]", + "163:3": "acacia_stairs[facing=north,half=bottom,shape=straight]", + "163:4": "acacia_stairs[facing=east,half=top,shape=straight]", + "163:5": "acacia_stairs[facing=west,half=top,shape=straight]", + "163:6": "acacia_stairs[facing=south,half=top,shape=straight]", + "163:7": "acacia_stairs[facing=north,half=top,shape=straight]", + "164:0": "dark_oak_stairs[facing=east,half=bottom,shape=straight]", + "164:1": "dark_oak_stairs[facing=west,half=bottom,shape=straight]", + "164:2": "dark_oak_stairs[facing=south,half=bottom,shape=straight]", + "164:3": "dark_oak_stairs[facing=north,half=bottom,shape=straight]", + "164:4": "dark_oak_stairs[facing=east,half=top,shape=straight]", + "164:5": "dark_oak_stairs[facing=west,half=top,shape=straight]", + "164:6": "dark_oak_stairs[facing=south,half=top,shape=straight]", + "164:7": "dark_oak_stairs[facing=north,half=top,shape=straight]", + "165:0": "slime_block", + "166:0": "barrier", + "167:0": "iron_trapdoor[facing=north,half=bottom,open=false]", + "167:1": "iron_trapdoor[facing=south,half=bottom,open=false]", + "167:2": "iron_trapdoor[facing=west,half=bottom,open=false]", + "167:3": "iron_trapdoor[facing=east,half=bottom,open=false]", + "167:4": "iron_trapdoor[facing=north,half=bottom,open=true]", + "167:5": "iron_trapdoor[facing=south,half=bottom,open=true]", + "167:6": "iron_trapdoor[facing=west,half=bottom,open=true]", + "167:7": "iron_trapdoor[facing=east,half=bottom,open=true]", + "167:8": "iron_trapdoor[facing=north,half=top,open=false]", + "167:9": "iron_trapdoor[facing=south,half=top,open=false]", + "167:10": "iron_trapdoor[facing=west,half=top,open=false]", + "167:11": "iron_trapdoor[facing=east,half=top,open=false]", + "167:12": "iron_trapdoor[facing=north,half=top,open=true]", + "167:13": "iron_trapdoor[facing=south,half=top,open=true]", + "167:14": "iron_trapdoor[facing=west,half=top,open=true]", + "167:15": "iron_trapdoor[facing=east,half=top,open=true]", + "168:0": "prismarine", + "168:1": "prismarine_bricks", + "168:2": "dark_prismarine", + "169:0": "sea_lantern", + "170:0": "hay_block[axis=y]", + "170:4": "hay_block[axis=x]", + "170:8": "hay_block[axis=z]", + "171:0": "white_carpet", + "171:1": "orange_carpet", + "171:2": "magenta_carpet", + "171:3": "light_blue_carpet", + "171:4": "yellow_carpet", + "171:5": "lime_carpet", + "171:6": "pink_carpet", + "171:7": "gray_carpet", + "171:8": "light_gray_carpet", + "171:9": "cyan_carpet", + "171:10": "purple_carpet", + "171:11": "blue_carpet", + "171:12": "brown_carpet", + "171:13": "green_carpet", + "171:14": "red_carpet", + "171:15": "black_carpet", + "172:0": "terracotta", + "173:0": "coal_block", + "174:0": "packed_ice", + "175:0": "sunflower[half=lower]", + "175:1": "lilac[half=lower]", + "175:2": "tall_grass[half=lower]", + "175:3": "large_fern[half=lower]", + "175:4": "rose_bush[half=lower]", + "175:5": "peony[half=lower]", + "175:8": "peony[half=upper]", + "175:9": "peony[half=upper]", + "175:10": "peony[half=upper]", + "175:11": "peony[half=upper]", + "176:0": "white_banner[rotation=0]", + "176:1": "white_banner[rotation=1]", + "176:2": "white_banner[rotation=2]", + "176:3": "white_banner[rotation=3]", + "176:4": "white_banner[rotation=4]", + "176:5": "white_banner[rotation=5]", + "176:6": "white_banner[rotation=6]", + "176:7": "white_banner[rotation=7]", + "176:8": "white_banner[rotation=8]", + "176:9": "white_banner[rotation=9]", + "176:10": "white_banner[rotation=10]", + "176:11": "white_banner[rotation=11]", + "176:12": "white_banner[rotation=12]", + "176:13": "white_banner[rotation=13]", + "176:14": "white_banner[rotation=14]", + "176:15": "white_banner[rotation=15]", + "177:2": "white_wall_banner[facing=north]", + "177:3": "white_wall_banner[facing=south]", + "177:4": "white_wall_banner[facing=west]", + "177:5": "white_wall_banner[facing=east]", + "178:0": "daylight_detector[inverted=true,power=0]", + "178:1": "daylight_detector[inverted=true,power=1]", + "178:2": "daylight_detector[inverted=true,power=2]", + "178:3": "daylight_detector[inverted=true,power=3]", + "178:4": "daylight_detector[inverted=true,power=4]", + "178:5": "daylight_detector[inverted=true,power=5]", + "178:6": "daylight_detector[inverted=true,power=6]", + "178:7": "daylight_detector[inverted=true,power=7]", + "178:8": "daylight_detector[inverted=true,power=8]", + "178:9": "daylight_detector[inverted=true,power=9]", + "178:10": "daylight_detector[inverted=true,power=10]", + "178:11": "daylight_detector[inverted=true,power=11]", + "178:12": "daylight_detector[inverted=true,power=12]", + "178:13": "daylight_detector[inverted=true,power=13]", + "178:14": "daylight_detector[inverted=true,power=14]", + "178:15": "daylight_detector[inverted=true,power=15]", + "179:0": "red_sandstone", + "179:1": "chiseled_red_sandstone", + "179:2": "cut_red_sandstone", + "180:0": "red_sandstone_stairs[facing=east,half=bottom,shape=straight]", + "180:1": "red_sandstone_stairs[facing=west,half=bottom,shape=straight]", + "180:2": "red_sandstone_stairs[facing=south,half=bottom,shape=straight]", + "180:3": "red_sandstone_stairs[facing=north,half=bottom,shape=straight]", + "180:4": "red_sandstone_stairs[facing=east,half=top,shape=straight]", + "180:5": "red_sandstone_stairs[facing=west,half=top,shape=straight]", + "180:6": "red_sandstone_stairs[facing=south,half=top,shape=straight]", + "180:7": "red_sandstone_stairs[facing=north,half=top,shape=straight]", + "181:0": "red_sandstone_slab[type=double]", + "181:8": "smooth_red_sandstone", + "182:0": "red_sandstone_slab[type=bottom]", + "182:8": "red_sandstone_slab[type=top]", + "183:0": "spruce_fence_gate[facing=south,in_wall=false,open=false,powered=false]", + "183:1": "spruce_fence_gate[facing=west,in_wall=false,open=false,powered=false]", + "183:2": "spruce_fence_gate[facing=north,in_wall=false,open=false,powered=false]", + "183:3": "spruce_fence_gate[facing=east,in_wall=false,open=false,powered=false]", + "183:4": "spruce_fence_gate[facing=south,in_wall=false,open=true,powered=false]", + "183:5": "spruce_fence_gate[facing=west,in_wall=false,open=true,powered=false]", + "183:6": "spruce_fence_gate[facing=north,in_wall=false,open=true,powered=false]", + "183:7": "spruce_fence_gate[facing=east,in_wall=false,open=true,powered=false]", + "183:8": "spruce_fence_gate[facing=south,in_wall=false,open=false,powered=true]", + "183:9": "spruce_fence_gate[facing=west,in_wall=false,open=false,powered=true]", + "183:10": "spruce_fence_gate[facing=north,in_wall=false,open=false,powered=true]", + "183:11": "spruce_fence_gate[facing=east,in_wall=false,open=false,powered=true]", + "183:12": "spruce_fence_gate[facing=south,in_wall=false,open=true,powered=true]", + "183:13": "spruce_fence_gate[facing=west,in_wall=false,open=true,powered=true]", + "183:14": "spruce_fence_gate[facing=north,in_wall=false,open=true,powered=true]", + "183:15": "spruce_fence_gate[facing=east,in_wall=false,open=true,powered=true]", + "184:0": "birch_fence_gate[facing=south,in_wall=false,open=false,powered=false]", + "184:1": "birch_fence_gate[facing=west,in_wall=false,open=false,powered=false]", + "184:2": "birch_fence_gate[facing=north,in_wall=false,open=false,powered=false]", + "184:3": "birch_fence_gate[facing=east,in_wall=false,open=false,powered=false]", + "184:4": "birch_fence_gate[facing=south,in_wall=false,open=true,powered=false]", + "184:5": "birch_fence_gate[facing=west,in_wall=false,open=true,powered=false]", + "184:6": "birch_fence_gate[facing=north,in_wall=false,open=true,powered=false]", + "184:7": "birch_fence_gate[facing=east,in_wall=false,open=true,powered=false]", + "184:8": "birch_fence_gate[facing=south,in_wall=false,open=false,powered=true]", + "184:9": "birch_fence_gate[facing=west,in_wall=false,open=false,powered=true]", + "184:10": "birch_fence_gate[facing=north,in_wall=false,open=false,powered=true]", + "184:11": "birch_fence_gate[facing=east,in_wall=false,open=false,powered=true]", + "184:12": "birch_fence_gate[facing=south,in_wall=false,open=true,powered=true]", + "184:13": "birch_fence_gate[facing=west,in_wall=false,open=true,powered=true]", + "184:14": "birch_fence_gate[facing=north,in_wall=false,open=true,powered=true]", + "184:15": "birch_fence_gate[facing=east,in_wall=false,open=true,powered=true]", + "185:0": "jungle_fence_gate[facing=south,in_wall=false,open=false,powered=false]", + "185:1": "jungle_fence_gate[facing=west,in_wall=false,open=false,powered=false]", + "185:2": "jungle_fence_gate[facing=north,in_wall=false,open=false,powered=false]", + "185:3": "jungle_fence_gate[facing=east,in_wall=false,open=false,powered=false]", + "185:4": "jungle_fence_gate[facing=south,in_wall=false,open=true,powered=false]", + "185:5": "jungle_fence_gate[facing=west,in_wall=false,open=true,powered=false]", + "185:6": "jungle_fence_gate[facing=north,in_wall=false,open=true,powered=false]", + "185:7": "jungle_fence_gate[facing=east,in_wall=false,open=true,powered=false]", + "185:8": "jungle_fence_gate[facing=south,in_wall=false,open=false,powered=true]", + "185:9": "jungle_fence_gate[facing=west,in_wall=false,open=false,powered=true]", + "185:10": "jungle_fence_gate[facing=north,in_wall=false,open=false,powered=true]", + "185:11": "jungle_fence_gate[facing=east,in_wall=false,open=false,powered=true]", + "185:12": "jungle_fence_gate[facing=south,in_wall=false,open=true,powered=true]", + "185:13": "jungle_fence_gate[facing=west,in_wall=false,open=true,powered=true]", + "185:14": "jungle_fence_gate[facing=north,in_wall=false,open=true,powered=true]", + "185:15": "jungle_fence_gate[facing=east,in_wall=false,open=true,powered=true]", + "186:0": "dark_oak_fence_gate[facing=south,in_wall=false,open=false,powered=false]", + "186:1": "dark_oak_fence_gate[facing=west,in_wall=false,open=false,powered=false]", + "186:2": "dark_oak_fence_gate[facing=north,in_wall=false,open=false,powered=false]", + "186:3": "dark_oak_fence_gate[facing=east,in_wall=false,open=false,powered=false]", + "186:4": "dark_oak_fence_gate[facing=south,in_wall=false,open=true,powered=false]", + "186:5": "dark_oak_fence_gate[facing=west,in_wall=false,open=true,powered=false]", + "186:6": "dark_oak_fence_gate[facing=north,in_wall=false,open=true,powered=false]", + "186:7": "dark_oak_fence_gate[facing=east,in_wall=false,open=true,powered=false]", + "186:8": "dark_oak_fence_gate[facing=south,in_wall=false,open=false,powered=true]", + "186:9": "dark_oak_fence_gate[facing=west,in_wall=false,open=false,powered=true]", + "186:10": "dark_oak_fence_gate[facing=north,in_wall=false,open=false,powered=true]", + "186:11": "dark_oak_fence_gate[facing=east,in_wall=false,open=false,powered=true]", + "186:12": "dark_oak_fence_gate[facing=south,in_wall=false,open=true,powered=true]", + "186:13": "dark_oak_fence_gate[facing=west,in_wall=false,open=true,powered=true]", + "186:14": "dark_oak_fence_gate[facing=north,in_wall=false,open=true,powered=true]", + "186:15": "dark_oak_fence_gate[facing=east,in_wall=false,open=true,powered=true]", + "187:0": "acacia_fence_gate[facing=south,in_wall=false,open=false,powered=false]", + "187:1": "acacia_fence_gate[facing=west,in_wall=false,open=false,powered=false]", + "187:2": "acacia_fence_gate[facing=north,in_wall=false,open=false,powered=false]", + "187:3": "acacia_fence_gate[facing=east,in_wall=false,open=false,powered=false]", + "187:4": "acacia_fence_gate[facing=south,in_wall=false,open=true,powered=false]", + "187:5": "acacia_fence_gate[facing=west,in_wall=false,open=true,powered=false]", + "187:6": "acacia_fence_gate[facing=north,in_wall=false,open=true,powered=false]", + "187:7": "acacia_fence_gate[facing=east,in_wall=false,open=true,powered=false]", + "187:8": "acacia_fence_gate[facing=south,in_wall=false,open=false,powered=true]", + "187:9": "acacia_fence_gate[facing=west,in_wall=false,open=false,powered=true]", + "187:10": "acacia_fence_gate[facing=north,in_wall=false,open=false,powered=true]", + "187:11": "acacia_fence_gate[facing=east,in_wall=false,open=false,powered=true]", + "187:12": "acacia_fence_gate[facing=south,in_wall=false,open=true,powered=true]", + "187:13": "acacia_fence_gate[facing=west,in_wall=false,open=true,powered=true]", + "187:14": "acacia_fence_gate[facing=north,in_wall=false,open=true,powered=true]", + "187:15": "acacia_fence_gate[facing=east,in_wall=false,open=true,powered=true]", + "188:0": "spruce_fence[east=false,north=false,south=false,west=false]", + "189:0": "birch_fence[east=false,north=false,south=false,west=false]", + "190:0": "jungle_fence[east=false,north=false,south=false,west=false]", + "191:0": "dark_oak_fence[east=false,north=false,south=false,west=false]", + "192:0": "acacia_fence[east=false,north=false,south=false,west=false]", + "193:0": "spruce_door[facing=east,half=lower,hinge=right,open=false,powered=false]", + "193:1": "spruce_door[facing=south,half=lower,hinge=right,open=false,powered=false]", + "193:2": "spruce_door[facing=west,half=lower,hinge=right,open=false,powered=false]", + "193:3": "spruce_door[facing=north,half=lower,hinge=right,open=false,powered=false]", + "193:4": "spruce_door[facing=east,half=lower,hinge=right,open=true,powered=false]", + "193:5": "spruce_door[facing=south,half=lower,hinge=right,open=true,powered=false]", + "193:6": "spruce_door[facing=west,half=lower,hinge=right,open=true,powered=false]", + "193:7": "spruce_door[facing=north,half=lower,hinge=right,open=true,powered=false]", + "193:8": "spruce_door[facing=east,half=upper,hinge=left,open=false,powered=false]", + "193:9": "spruce_door[facing=east,half=upper,hinge=right,open=false,powered=false]", + "193:10": "spruce_door[facing=east,half=upper,hinge=left,open=false,powered=true]", + "193:11": "spruce_door[facing=east,half=upper,hinge=right,open=false,powered=true]", + "194:0": "birch_door[facing=east,half=lower,hinge=right,open=false,powered=false]", + "194:1": "birch_door[facing=south,half=lower,hinge=right,open=false,powered=false]", + "194:2": "birch_door[facing=west,half=lower,hinge=right,open=false,powered=false]", + "194:3": "birch_door[facing=north,half=lower,hinge=right,open=false,powered=false]", + "194:4": "birch_door[facing=east,half=lower,hinge=right,open=true,powered=false]", + "194:5": "birch_door[facing=south,half=lower,hinge=right,open=true,powered=false]", + "194:6": "birch_door[facing=west,half=lower,hinge=right,open=true,powered=false]", + "194:7": "birch_door[facing=north,half=lower,hinge=right,open=true,powered=false]", + "194:8": "birch_door[facing=east,half=upper,hinge=left,open=false,powered=false]", + "194:9": "birch_door[facing=east,half=upper,hinge=right,open=false,powered=false]", + "194:10": "birch_door[facing=east,half=upper,hinge=left,open=false,powered=true]", + "194:11": "birch_door[facing=east,half=upper,hinge=right,open=false,powered=true]", + "195:0": "jungle_door[facing=east,half=lower,hinge=right,open=false,powered=false]", + "195:1": "jungle_door[facing=south,half=lower,hinge=right,open=false,powered=false]", + "195:2": "jungle_door[facing=west,half=lower,hinge=right,open=false,powered=false]", + "195:3": "jungle_door[facing=north,half=lower,hinge=right,open=false,powered=false]", + "195:4": "jungle_door[facing=east,half=lower,hinge=right,open=true,powered=false]", + "195:5": "jungle_door[facing=south,half=lower,hinge=right,open=true,powered=false]", + "195:6": "jungle_door[facing=west,half=lower,hinge=right,open=true,powered=false]", + "195:7": "jungle_door[facing=north,half=lower,hinge=right,open=true,powered=false]", + "195:8": "jungle_door[facing=east,half=upper,hinge=left,open=false,powered=false]", + "195:9": "jungle_door[facing=east,half=upper,hinge=right,open=false,powered=false]", + "195:10": "jungle_door[facing=east,half=upper,hinge=left,open=false,powered=true]", + "195:11": "jungle_door[facing=east,half=upper,hinge=right,open=false,powered=true]", + "196:0": "acacia_door[facing=east,half=lower,hinge=right,open=false,powered=false]", + "196:1": "acacia_door[facing=south,half=lower,hinge=right,open=false,powered=false]", + "196:2": "acacia_door[facing=west,half=lower,hinge=right,open=false,powered=false]", + "196:3": "acacia_door[facing=north,half=lower,hinge=right,open=false,powered=false]", + "196:4": "acacia_door[facing=east,half=lower,hinge=right,open=true,powered=false]", + "196:5": "acacia_door[facing=south,half=lower,hinge=right,open=true,powered=false]", + "196:6": "acacia_door[facing=west,half=lower,hinge=right,open=true,powered=false]", + "196:7": "acacia_door[facing=north,half=lower,hinge=right,open=true,powered=false]", + "196:8": "acacia_door[facing=east,half=upper,hinge=left,open=false,powered=false]", + "196:9": "acacia_door[facing=east,half=upper,hinge=right,open=false,powered=false]", + "196:10": "acacia_door[facing=east,half=upper,hinge=left,open=false,powered=true]", + "196:11": "acacia_door[facing=east,half=upper,hinge=right,open=false,powered=true]", + "197:0": "dark_oak_door[facing=east,half=lower,hinge=right,open=false,powered=false]", + "197:1": "dark_oak_door[facing=south,half=lower,hinge=right,open=false,powered=false]", + "197:2": "dark_oak_door[facing=west,half=lower,hinge=right,open=false,powered=false]", + "197:3": "dark_oak_door[facing=north,half=lower,hinge=right,open=false,powered=false]", + "197:4": "dark_oak_door[facing=east,half=lower,hinge=right,open=true,powered=false]", + "197:5": "dark_oak_door[facing=south,half=lower,hinge=right,open=true,powered=false]", + "197:6": "dark_oak_door[facing=west,half=lower,hinge=right,open=true,powered=false]", + "197:7": "dark_oak_door[facing=north,half=lower,hinge=right,open=true,powered=false]", + "197:8": "dark_oak_door[facing=east,half=upper,hinge=left,open=false,powered=false]", + "197:9": "dark_oak_door[facing=east,half=upper,hinge=right,open=false,powered=false]", + "197:10": "dark_oak_door[facing=east,half=upper,hinge=left,open=false,powered=true]", + "197:11": "dark_oak_door[facing=east,half=upper,hinge=right,open=false,powered=true]", + "198:0": "end_rod[facing=down]", + "198:1": "end_rod[facing=up]", + "198:2": "end_rod[facing=north]", + "198:3": "end_rod[facing=south]", + "198:4": "end_rod[facing=west]", + "198:5": "end_rod[facing=east]", + "199:0": "chorus_plant[down=false,east=false,north=false,south=false,up=false,west=false]", + "200:0": "chorus_flower[age=0]", + "200:1": "chorus_flower[age=1]", + "200:2": "chorus_flower[age=2]", + "200:3": "chorus_flower[age=3]", + "200:4": "chorus_flower[age=4]", + "200:5": "chorus_flower[age=5]", + "201:0": "purpur_block", + "202:0": "purpur_pillar[axis=y]", + "202:4": "purpur_pillar[axis=x]", + "202:8": "purpur_pillar[axis=z]", + "203:0": "purpur_stairs[facing=east,half=bottom,shape=straight]", + "203:1": "purpur_stairs[facing=west,half=bottom,shape=straight]", + "203:2": "purpur_stairs[facing=south,half=bottom,shape=straight]", + "203:3": "purpur_stairs[facing=north,half=bottom,shape=straight]", + "203:4": "purpur_stairs[facing=east,half=top,shape=straight]", + "203:5": "purpur_stairs[facing=west,half=top,shape=straight]", + "203:6": "purpur_stairs[facing=south,half=top,shape=straight]", + "203:7": "purpur_stairs[facing=north,half=top,shape=straight]", + "204:0": "purpur_slab[type=double]", + "205:0": "purpur_slab[type=bottom]", + "205:8": "purpur_slab[type=top]", + "206:0": "end_stone_bricks", + "207:0": "beetroots[age=0]", + "207:1": "beetroots[age=1]", + "207:2": "beetroots[age=2]", + "207:3": "beetroots[age=3]", + "208:0": "grass_path", + "209:0": "end_gateway", + "210:0": "repeating_command_block[conditional=false,facing=down]", + "210:1": "repeating_command_block[conditional=false,facing=up]", + "210:2": "repeating_command_block[conditional=false,facing=north]", + "210:3": "repeating_command_block[conditional=false,facing=south]", + "210:4": "repeating_command_block[conditional=false,facing=west]", + "210:5": "repeating_command_block[conditional=false,facing=east]", + "210:8": "repeating_command_block[conditional=true,facing=down]", + "210:9": "repeating_command_block[conditional=true,facing=up]", + "210:10": "repeating_command_block[conditional=true,facing=north]", + "210:11": "repeating_command_block[conditional=true,facing=south]", + "210:12": "repeating_command_block[conditional=true,facing=west]", + "210:13": "repeating_command_block[conditional=true,facing=east]", + "211:0": "chain_command_block[conditional=false,facing=down]", + "211:1": "chain_command_block[conditional=false,facing=up]", + "211:2": "chain_command_block[conditional=false,facing=north]", + "211:3": "chain_command_block[conditional=false,facing=south]", + "211:4": "chain_command_block[conditional=false,facing=west]", + "211:5": "chain_command_block[conditional=false,facing=east]", + "211:8": "chain_command_block[conditional=true,facing=down]", + "211:9": "chain_command_block[conditional=true,facing=up]", + "211:10": "chain_command_block[conditional=true,facing=north]", + "211:11": "chain_command_block[conditional=true,facing=south]", + "211:12": "chain_command_block[conditional=true,facing=west]", + "211:13": "chain_command_block[conditional=true,facing=east]", + "212:0": "frosted_ice[age=0]", + "212:1": "frosted_ice[age=1]", + "212:2": "frosted_ice[age=2]", + "212:3": "frosted_ice[age=3]", + "213:0": "magma_block", + "214:0": "nether_wart_block", + "215:0": "red_nether_bricks", + "216:0": "bone_block[axis=y]", + "216:4": "bone_block[axis=x]", + "216:8": "bone_block[axis=z]", + "217:0": "structure_void", + "218:0": "observer[facing=down,powered=false]", + "218:1": "observer[facing=up,powered=false]", + "218:2": "observer[facing=north,powered=false]", + "218:3": "observer[facing=south,powered=false]", + "218:4": "observer[facing=west,powered=false]", + "218:5": "observer[facing=east,powered=false]", + "218:8": "observer[facing=down,powered=true]", + "218:9": "observer[facing=up,powered=true]", + "218:10": "observer[facing=north,powered=true]", + "218:11": "observer[facing=south,powered=true]", + "218:12": "observer[facing=west,powered=true]", + "218:13": "observer[facing=east,powered=true]", + "219:0": "white_shulker_box[facing=down]", + "219:1": "white_shulker_box[facing=up]", + "219:2": "white_shulker_box[facing=north]", + "219:3": "white_shulker_box[facing=south]", + "219:4": "white_shulker_box[facing=west]", + "219:5": "white_shulker_box[facing=east]", + "220:0": "orange_shulker_box[facing=down]", + "220:1": "orange_shulker_box[facing=up]", + "220:2": "orange_shulker_box[facing=north]", + "220:3": "orange_shulker_box[facing=south]", + "220:4": "orange_shulker_box[facing=west]", + "220:5": "orange_shulker_box[facing=east]", + "221:0": "magenta_shulker_box[facing=down]", + "221:1": "magenta_shulker_box[facing=up]", + "221:2": "magenta_shulker_box[facing=north]", + "221:3": "magenta_shulker_box[facing=south]", + "221:4": "magenta_shulker_box[facing=west]", + "221:5": "magenta_shulker_box[facing=east]", + "222:0": "light_blue_shulker_box[facing=down]", + "222:1": "light_blue_shulker_box[facing=up]", + "222:2": "light_blue_shulker_box[facing=north]", + "222:3": "light_blue_shulker_box[facing=south]", + "222:4": "light_blue_shulker_box[facing=west]", + "222:5": "light_blue_shulker_box[facing=east]", + "223:0": "yellow_shulker_box[facing=down]", + "223:1": "yellow_shulker_box[facing=up]", + "223:2": "yellow_shulker_box[facing=north]", + "223:3": "yellow_shulker_box[facing=south]", + "223:4": "yellow_shulker_box[facing=west]", + "223:5": "yellow_shulker_box[facing=east]", + "224:0": "lime_shulker_box[facing=down]", + "224:1": "lime_shulker_box[facing=up]", + "224:2": "lime_shulker_box[facing=north]", + "224:3": "lime_shulker_box[facing=south]", + "224:4": "lime_shulker_box[facing=west]", + "224:5": "lime_shulker_box[facing=east]", + "225:0": "pink_shulker_box[facing=down]", + "225:1": "pink_shulker_box[facing=up]", + "225:2": "pink_shulker_box[facing=north]", + "225:3": "pink_shulker_box[facing=south]", + "225:4": "pink_shulker_box[facing=west]", + "225:5": "pink_shulker_box[facing=east]", + "226:0": "gray_shulker_box[facing=down]", + "226:1": "gray_shulker_box[facing=up]", + "226:2": "gray_shulker_box[facing=north]", + "226:3": "gray_shulker_box[facing=south]", + "226:4": "gray_shulker_box[facing=west]", + "226:5": "gray_shulker_box[facing=east]", + "227:0": "light_gray_shulker_box[facing=down]", + "227:1": "light_gray_shulker_box[facing=up]", + "227:2": "light_gray_shulker_box[facing=north]", + "227:3": "light_gray_shulker_box[facing=south]", + "227:4": "light_gray_shulker_box[facing=west]", + "227:5": "light_gray_shulker_box[facing=east]", + "228:0": "cyan_shulker_box[facing=down]", + "228:1": "cyan_shulker_box[facing=up]", + "228:2": "cyan_shulker_box[facing=north]", + "228:3": "cyan_shulker_box[facing=south]", + "228:4": "cyan_shulker_box[facing=west]", + "228:5": "cyan_shulker_box[facing=east]", + "229:0": "purple_shulker_box[facing=down]", + "229:1": "purple_shulker_box[facing=up]", + "229:2": "purple_shulker_box[facing=north]", + "229:3": "purple_shulker_box[facing=south]", + "229:4": "purple_shulker_box[facing=west]", + "229:5": "purple_shulker_box[facing=east]", + "230:0": "blue_shulker_box[facing=down]", + "230:1": "blue_shulker_box[facing=up]", + "230:2": "blue_shulker_box[facing=north]", + "230:3": "blue_shulker_box[facing=south]", + "230:4": "blue_shulker_box[facing=west]", + "230:5": "blue_shulker_box[facing=east]", + "231:0": "brown_shulker_box[facing=down]", + "231:1": "brown_shulker_box[facing=up]", + "231:2": "brown_shulker_box[facing=north]", + "231:3": "brown_shulker_box[facing=south]", + "231:4": "brown_shulker_box[facing=west]", + "231:5": "brown_shulker_box[facing=east]", + "232:0": "green_shulker_box[facing=down]", + "232:1": "green_shulker_box[facing=up]", + "232:2": "green_shulker_box[facing=north]", + "232:3": "green_shulker_box[facing=south]", + "232:4": "green_shulker_box[facing=west]", + "232:5": "green_shulker_box[facing=east]", + "233:0": "red_shulker_box[facing=down]", + "233:1": "red_shulker_box[facing=up]", + "233:2": "red_shulker_box[facing=north]", + "233:3": "red_shulker_box[facing=south]", + "233:4": "red_shulker_box[facing=west]", + "233:5": "red_shulker_box[facing=east]", + "234:0": "black_shulker_box[facing=down]", + "234:1": "black_shulker_box[facing=up]", + "234:2": "black_shulker_box[facing=north]", + "234:3": "black_shulker_box[facing=south]", + "234:4": "black_shulker_box[facing=west]", + "234:5": "black_shulker_box[facing=east]", + "235:0": "white_glazed_terracotta[facing=south]", + "235:1": "white_glazed_terracotta[facing=west]", + "235:2": "white_glazed_terracotta[facing=north]", + "235:3": "white_glazed_terracotta[facing=east]", + "236:0": "orange_glazed_terracotta[facing=south]", + "236:1": "orange_glazed_terracotta[facing=west]", + "236:2": "orange_glazed_terracotta[facing=north]", + "236:3": "orange_glazed_terracotta[facing=east]", + "237:0": "magenta_glazed_terracotta[facing=south]", + "237:1": "magenta_glazed_terracotta[facing=west]", + "237:2": "magenta_glazed_terracotta[facing=north]", + "237:3": "magenta_glazed_terracotta[facing=east]", + "238:0": "light_blue_glazed_terracotta[facing=south]", + "238:1": "light_blue_glazed_terracotta[facing=west]", + "238:2": "light_blue_glazed_terracotta[facing=north]", + "238:3": "light_blue_glazed_terracotta[facing=east]", + "239:0": "yellow_glazed_terracotta[facing=south]", + "239:1": "yellow_glazed_terracotta[facing=west]", + "239:2": "yellow_glazed_terracotta[facing=north]", + "239:3": "yellow_glazed_terracotta[facing=east]", + "240:0": "lime_glazed_terracotta[facing=south]", + "240:1": "lime_glazed_terracotta[facing=west]", + "240:2": "lime_glazed_terracotta[facing=north]", + "240:3": "lime_glazed_terracotta[facing=east]", + "241:0": "pink_glazed_terracotta[facing=south]", + "241:1": "pink_glazed_terracotta[facing=west]", + "241:2": "pink_glazed_terracotta[facing=north]", + "241:3": "pink_glazed_terracotta[facing=east]", + "242:0": "gray_glazed_terracotta[facing=south]", + "242:1": "gray_glazed_terracotta[facing=west]", + "242:2": "gray_glazed_terracotta[facing=north]", + "242:3": "gray_glazed_terracotta[facing=east]", + "243:0": "light_gray_glazed_terracotta[facing=south]", + "243:1": "light_gray_glazed_terracotta[facing=west]", + "243:2": "light_gray_glazed_terracotta[facing=north]", + "243:3": "light_gray_glazed_terracotta[facing=east]", + "244:0": "cyan_glazed_terracotta[facing=south]", + "244:1": "cyan_glazed_terracotta[facing=west]", + "244:2": "cyan_glazed_terracotta[facing=north]", + "244:3": "cyan_glazed_terracotta[facing=east]", + "245:0": "purple_glazed_terracotta[facing=south]", + "245:1": "purple_glazed_terracotta[facing=west]", + "245:2": "purple_glazed_terracotta[facing=north]", + "245:3": "purple_glazed_terracotta[facing=east]", + "246:0": "blue_glazed_terracotta[facing=south]", + "246:1": "blue_glazed_terracotta[facing=west]", + "246:2": "blue_glazed_terracotta[facing=north]", + "246:3": "blue_glazed_terracotta[facing=east]", + "247:0": "brown_glazed_terracotta[facing=south]", + "247:1": "brown_glazed_terracotta[facing=west]", + "247:2": "brown_glazed_terracotta[facing=north]", + "247:3": "brown_glazed_terracotta[facing=east]", + "248:0": "green_glazed_terracotta[facing=south]", + "248:1": "green_glazed_terracotta[facing=west]", + "248:2": "green_glazed_terracotta[facing=north]", + "248:3": "green_glazed_terracotta[facing=east]", + "249:0": "red_glazed_terracotta[facing=south]", + "249:1": "red_glazed_terracotta[facing=west]", + "249:2": "red_glazed_terracotta[facing=north]", + "249:3": "red_glazed_terracotta[facing=east]", + "250:0": "black_glazed_terracotta[facing=south]", + "250:1": "black_glazed_terracotta[facing=west]", + "250:2": "black_glazed_terracotta[facing=north]", + "250:3": "black_glazed_terracotta[facing=east]", + "251:0": "white_concrete", + "251:1": "orange_concrete", + "251:2": "magenta_concrete", + "251:3": "light_blue_concrete", + "251:4": "yellow_concrete", + "251:5": "lime_concrete", + "251:6": "pink_concrete", + "251:7": "gray_concrete", + "251:8": "light_gray_concrete", + "251:9": "cyan_concrete", + "251:10": "purple_concrete", + "251:11": "blue_concrete", + "251:12": "brown_concrete", + "251:13": "green_concrete", + "251:14": "red_concrete", + "251:15": "black_concrete", + "252:0": "white_concrete_powder", + "252:1": "orange_concrete_powder", + "252:2": "magenta_concrete_powder", + "252:3": "light_blue_concrete_powder", + "252:4": "yellow_concrete_powder", + "252:5": "lime_concrete_powder", + "252:6": "pink_concrete_powder", + "252:7": "gray_concrete_powder", + "252:8": "light_gray_concrete_powder", + "252:9": "cyan_concrete_powder", + "252:10": "purple_concrete_powder", + "252:11": "blue_concrete_powder", + "252:12": "brown_concrete_powder", + "252:13": "green_concrete_powder", + "252:14": "red_concrete_powder", + "252:15": "black_concrete_powder", + "255:0": "structure_block[mode=save]", + "255:1": "structure_block[mode=load]", + "255:2": "structure_block[mode=corner]", + "255:3": "structure_block[mode=data]" + }, + "clientCalculatedBlocks": { + "block_snowy": [ + "grass_block", + "dirt", + "coarse_dirt", + "podzol", + "mycelium" + ], + "directional": [ + "fire", + "redstone_wire", + "oak_fence", + "iron_bars", + "glass_pane", + "vine", + "nether_brick_fence", + "tripwire", + "cobblestone_wall", + "mossy_cobblestone_wall", + "white_stained_glass_pane", + "orange_stained_glass_pane", + "magenta_stained_glass_pane", + "light_blue_stained_glass_pane", + "yellow_stained_glass_pane", + "lime_stained_glass_pane", + "pink_stained_glass_pane", + "gray_stained_glass_pane", + "light_gray_stained_glass_pane", + "cyan_stained_glass_pane", + "purple_stained_glass_pane", + "blue_stained_glass_pane", + "brown_stained_glass_pane", + "green_stained_glass_pane", + "red_stained_glass_pane", + "black_stained_glass_pane", + "spruce_fence", + "birch_fence", + "jungle_fence", + "dark_oak_fence", + "acacia_fence", + "chorus_plant" + ], + "door": [ + "oak_door", + "iron_door", + "spruce_door", + "birch_door", + "jungle_door", + "acacia_door", + "dark_oak_door" + ], + "repeater_locked": [ + "repeater" + ], + "gate_in_wall": [ + "oak_fence_gate", + "spruce_fence_gate", + "birch_fence_gate", + "jungle_fence_gate", + "dark_oak_fence_gate", + "acacia_fence_gate" + ] + } +} From 93e9cf877b5de2cc9409fa9920db14d6d0abd525 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Mon, 20 May 2024 06:01:14 +0300 Subject: [PATCH 0193/1195] fix project build on windows --- scripts/esbuildPlugins.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/esbuildPlugins.mjs b/scripts/esbuildPlugins.mjs index 49547ea1..f6b539c1 100644 --- a/scripts/esbuildPlugins.mjs +++ b/scripts/esbuildPlugins.mjs @@ -7,8 +7,9 @@ import { filesize } from 'filesize' import MCProtocol from 'minecraft-protocol' import MCData from 'minecraft-data' import { throttle } from 'lodash-es' +import { fileURLToPath } from 'url' -const __dirname = dirname(new URL(import.meta.url).pathname) +const __dirname = dirname(fileURLToPath(new URL(import.meta.url))) const { supportedVersions } = MCProtocol const prod = process.argv.includes('--prod') From b6cb302457ab232200e34e1a165dc7aff0f1a832 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 20 May 2024 06:11:09 +0300 Subject: [PATCH 0194/1195] fix build! --- src/flyingSquidUtils.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/flyingSquidUtils.ts b/src/flyingSquidUtils.ts index bd312bfb..1f070022 100644 --- a/src/flyingSquidUtils.ts +++ b/src/flyingSquidUtils.ts @@ -33,7 +33,6 @@ export const saveServer = async (autoSave = true) => { export const disconnect = async () => { if (localServer) { await saveServer() - //@ts-expect-error todo expose! void localServer.quit() // todo investigate we should await } window.history.replaceState({}, '', `${window.location.pathname}`) // remove qs From 0dfa7c3c9a283bc96a248333bcc40f098e5df18b Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 20 May 2024 06:17:47 +0300 Subject: [PATCH 0195/1195] fix: fix default gamepad bindings of nextHotbarSlot, prevHotbarSlot --- src/controls.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controls.ts b/src/controls.ts index 7d1e4cdf..b23d3beb 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -39,8 +39,8 @@ export const contro = new ControMax({ sneak: ['ShiftLeft'], toggleSneakOrDown: [null, 'Right Stick'], sprint: ['ControlLeft', 'Left Stick'], - nextHotbarSlot: [null, 'Left Bumper'], - prevHotbarSlot: [null, 'Right Bumper'], + nextHotbarSlot: [null, 'Right Bumper'], + prevHotbarSlot: [null, 'Left Bumper'], attackDestroy: [null, 'Right Trigger'], interactPlace: [null, 'Left Trigger'], chat: [['KeyT', 'Enter']], From 2a2667918b3cbfb0d4a028934d7d18641973bab3 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 21 May 2024 05:25:14 +0300 Subject: [PATCH 0196/1195] feat: limit rendering in background to 20fps so it uses less resources (+setting to control that) --- prismarine-viewer/viewer/lib/viewerWrapper.ts | 12 ++++++----- src/index.ts | 1 + src/optionsGuiScheme.tsx | 10 ++++++++++ src/optionsStorage.ts | 1 + src/react/OptionsItems.tsx | 20 ++++++++++++++++--- 5 files changed, 36 insertions(+), 8 deletions(-) diff --git a/prismarine-viewer/viewer/lib/viewerWrapper.ts b/prismarine-viewer/viewer/lib/viewerWrapper.ts index c6419dff..b8017f38 100644 --- a/prismarine-viewer/viewer/lib/viewerWrapper.ts +++ b/prismarine-viewer/viewer/lib/viewerWrapper.ts @@ -5,9 +5,10 @@ export class ViewerWrapper { previousWindowWidth: number previousWindowHeight: number globalObject = globalThis as any - stopRenderOnBlur = true + stopRenderOnBlur = false addedToPage = false renderInterval = 0 + renderIntervalUnfocused: number | undefined fpsInterval constructor(public canvas: HTMLCanvasElement, public renderer?: THREE.WebGLRenderer) { @@ -44,7 +45,7 @@ export class ViewerWrapper { this.globalObject.requestAnimationFrame(this.render.bind(this)) } if (typeof window !== 'undefined') { - // this.trackWindowFocus() + this.trackWindowFocus() } } @@ -77,11 +78,12 @@ export class ViewerWrapper { for (const fn of beforeRenderFrame) fn() this.globalObject.requestAnimationFrame(this.render.bind(this)) if (this.globalObject.stopRender || this.renderer?.xr.isPresenting || (this.stopRenderOnBlur && !this.windowFocused)) return - if (this.renderInterval) { + const renderInterval = (this.windowFocused ? this.renderInterval : this.renderIntervalUnfocused) ?? this.renderInterval + if (renderInterval) { this.delta += time - this.lastTime this.lastTime = time - if (this.delta > this.renderInterval) { - this.delta %= this.renderInterval + if (this.delta > renderInterval) { + this.delta %= renderInterval // continue rendering } else { return diff --git a/src/index.ts b/src/index.ts index 8dbc46cf..1797c894 100644 --- a/src/index.ts +++ b/src/index.ts @@ -120,6 +120,7 @@ const renderWrapper = new ViewerWrapper(renderer.domElement, renderer) renderWrapper.addToPage() watchValue(options, (o) => { renderWrapper.renderInterval = o.frameLimit ? 1000 / o.frameLimit : 0 + renderWrapper.renderIntervalUnfocused = o.backgroundRendering === '5fps' ? 1000 / 5 : o.backgroundRendering === '20fps' ? 1000 / 20 : undefined }) const isFirefox = ua.getBrowser().name === 'Firefox' diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index b847fe11..46f258a8 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -43,6 +43,16 @@ export const guiOptionsScheme: { return +
+} diff --git a/src/reactUi.tsx b/src/reactUi.tsx index e384fbfd..d86cf202 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -38,6 +38,7 @@ import ServersListProvider from './react/ServersListProvider' import GamepadUiCursor from './react/GamepadUiCursor' import KeybindingsScreenProvider from './react/KeybindingsScreenProvider' import HeldMapUi from './react/HeldMapUi' +import BedTime from './react/BedTime' const RobustPortal = ({ children, to }) => { return createPortal({children}, to) @@ -116,6 +117,7 @@ const InGameUi = () => { + diff --git a/src/worldInteractions.ts b/src/worldInteractions.ts index 2e20de29..85884b2f 100644 --- a/src/worldInteractions.ts +++ b/src/worldInteractions.ts @@ -14,7 +14,7 @@ import destroyStage9 from 'minecraft-assets/minecraft-assets/data/1.10/blocks/de import { Vec3 } from 'vec3' import { LineMaterial, Wireframe, LineSegmentsGeometry } from 'three-stdlib' -import { isGameActive } from './globalState' +import { hideCurrentModal, isGameActive, showModal } from './globalState' import { assertDefined } from './utils' import { options } from './optionsStorage' @@ -201,7 +201,29 @@ class WorldInteraction { 'shears', 'carrot_on_a_stick', 'warped_fungus_on_a_stick', 'spawn_egg', 'trident', 'crossbow', 'elytra', 'shield', 'turtle_helmet', ].includes(bot.heldItem.name) - if (cursorBlock && !activate) { + let stop = false + if (!bot.controlState.sneak) { + if (cursorBlock?.name === 'bed' || cursorBlock?.name.endsWith('_bed')) { + stop = true + showModal({ reactType: 'bed' }) + let cancelSleep = true + void bot.sleep(cursorBlock).catch((e) => { + if (cancelSleep) { + hideCurrentModal() + } + // if (e.message === 'bot is not sleeping') return + bot._client.emit('chat', { + message: JSON.stringify({ + text: e.message, + }) + }) + }) + setTimeout(() => { + cancelSleep = false + }) + } + } + if (cursorBlock && !activate && !stop) { const vecArray = [new Vec3(0, -1, 0), new Vec3(0, 1, 0), new Vec3(0, 0, -1), new Vec3(0, 0, 1), new Vec3(-1, 0, 0), new Vec3(1, 0, 0)] //@ts-expect-error const delta = cursorBlock.intersect.minus(cursorBlock.position) @@ -219,7 +241,7 @@ class WorldInteraction { bot.lookAt = oldLookAt }).catch(console.warn) } - } else { + } else if (!stop) { bot.activateItem() // todo offhand } this.lastBlockPlaced = 0 From bb85512cc10636e73ddb26b9e9bcfb40bde1fce1 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 22 May 2024 04:26:33 +0300 Subject: [PATCH 0201/1195] update known block are not rendered test --- .../viewer/lib/mesher/test/tests.test.ts | 237 +++++++++++------- .../viewer/prepare/moreGeneratedBlocks.ts | 1 + 2 files changed, 153 insertions(+), 85 deletions(-) diff --git a/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts b/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts index 22e3a7b2..75dd98fa 100644 --- a/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts +++ b/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts @@ -1,96 +1,163 @@ import { test, expect } from 'vitest' import { setup } from './mesherTester' +import minecraftData from 'minecraft-data' +import minecraftAssets from 'minecraft-assets' -const version = '1.18.1' +const version = minecraftAssets.versions.at(-1) const addPositions = [ - // [[0, 0, 0], 'diamond_block'], - [[1, 0, 0], 'stone'], - [[-1, 0, 0], 'stone'], - [[0, 1, 0], 'stone'], - [[0, -1, 0], 'stone'], - [[0, 0, 1], 'stone'], - [[0, 0, -1], 'stone'], + // [[0, 0, 0], 'diamond_block'], + // [[1, 0, 0], 'stone'], + // [[-1, 0, 0], 'stone'], + // [[0, 1, 0], 'stone'], + // [[0, -1, 0], 'stone'], + // [[0, 0, 1], 'stone'], + // [[0, 0, -1], 'stone'], ] as const test('Known blocks are not rendered', () => { - const { mesherWorld, getGeometry, pos, mcData } = setup(version, addPositions as any) + const { mesherWorld, getGeometry, pos, mcData } = setup(version, addPositions as any) + const ignoreAsExpected = ['air', 'cave_air', 'void_air', 'barrier', 'water', 'lava', 'moving_piston', 'light'] - let time = 0 - let times = 0 - const invalidBlocks = {}/* as {[number, number]} */ - for (const block of mcData.blocksArray) { - if (block.maxStateId! - block.minStateId! > 100) continue - for (let i = block.minStateId!; i <= block.maxStateId!; i++) { - if (block.transparent) continue - mesherWorld.setBlockStateId(pos, i) - const start = performance.now() - const { centerFaces, totalTiles, centerTileNeighbors } = getGeometry() - time += performance.now() - start - times++ - if (centerFaces === 0 && centerTileNeighbors !== 0) { - if (invalidBlocks[block.name]) continue - invalidBlocks[block.name] = [i - block.minStateId!, centerTileNeighbors] - // console.log('INVALID', block.name, centerTileNeighbors, i - block.minStateId) - } - } - } - console.log('Average time', time / times) - // Fully expected - expect(invalidBlocks).toMatchInlineSnapshot(` - { - "creeper_head": [ - 0, - 6, - ], - "creeper_wall_head": [ - 0, - 6, - ], - "dragon_head": [ - 0, - 6, - ], - "dragon_wall_head": [ - 0, - 6, - ], - "player_head": [ - 0, - 6, - ], - "player_wall_head": [ - 0, - 6, - ], - "powder_snow": [ - 0, - 6, - ], - "skeleton_skull": [ - 0, - 6, - ], - "skeleton_wall_skull": [ - 0, - 6, - ], - "wither_skeleton_skull": [ - 0, - 6, - ], - "wither_skeleton_wall_skull": [ - 0, - 6, - ], - "zombie_head": [ - 0, - 6, - ], - "zombie_wall_head": [ - 0, - 6, - ], + let time = 0 + let times = 0 + const invalidBlocks = {}/* as {[number, number]} */ + for (const block of mcData.blocksArray) { + if (ignoreAsExpected.includes(block.name)) continue + // if (block.maxStateId! - block.minStateId! > 100) continue + // for (let i = block.minStateId!; i <= block.maxStateId!; i++) { + for (let i = block.defaultState!; i <= block.defaultState!; i++) { + // if (block.transparent) continue + mesherWorld.setBlockStateId(pos, i) + const start = performance.now() + const { centerFaces, totalTiles, centerTileNeighbors } = getGeometry() + time += performance.now() - start + times++ + if (centerFaces === 0) { + if (invalidBlocks[block.name]) continue + invalidBlocks[block.name] = true + // invalidBlocks[block.name] = [i - block.defaultState!, centerTileNeighbors] + // console.log('INVALID', block.name, centerTileNeighbors, i - block.minStateId) } - `) + } + } + console.log('Average time', time / times) + // should be fixed, but to avoid regressions & for visibility + expect(invalidBlocks).toMatchInlineSnapshot(` + { + "acacia_hanging_sign": true, + "acacia_wall_hanging_sign": true, + "bamboo_hanging_sign": true, + "bamboo_wall_hanging_sign": true, + "birch_hanging_sign": true, + "birch_wall_hanging_sign": true, + "black_banner": true, + "black_bed": true, + "black_candle": true, + "black_wall_banner": true, + "blue_banner": true, + "blue_bed": true, + "blue_candle": true, + "blue_wall_banner": true, + "brown_banner": true, + "brown_bed": true, + "brown_candle": true, + "brown_wall_banner": true, + "bubble_column": true, + "candle": true, + "cherry_hanging_sign": true, + "cherry_wall_hanging_sign": true, + "creeper_head": true, + "creeper_wall_head": true, + "crimson_hanging_sign": true, + "crimson_wall_hanging_sign": true, + "cyan_banner": true, + "cyan_bed": true, + "cyan_candle": true, + "cyan_wall_banner": true, + "dark_oak_hanging_sign": true, + "dark_oak_wall_hanging_sign": true, + "decorated_pot": true, + "dragon_head": true, + "dragon_wall_head": true, + "end_gateway": true, + "end_portal": true, + "gray_banner": true, + "gray_bed": true, + "gray_candle": true, + "gray_wall_banner": true, + "green_banner": true, + "green_bed": true, + "green_candle": true, + "green_wall_banner": true, + "jungle_hanging_sign": true, + "jungle_wall_hanging_sign": true, + "light_blue_banner": true, + "light_blue_bed": true, + "light_blue_candle": true, + "light_blue_wall_banner": true, + "light_gray_banner": true, + "light_gray_bed": true, + "light_gray_candle": true, + "light_gray_wall_banner": true, + "lime_banner": true, + "lime_bed": true, + "lime_candle": true, + "lime_wall_banner": true, + "magenta_banner": true, + "magenta_bed": true, + "magenta_candle": true, + "magenta_wall_banner": true, + "mangrove_hanging_sign": true, + "mangrove_wall_hanging_sign": true, + "oak_hanging_sign": true, + "oak_wall_hanging_sign": true, + "orange_banner": true, + "orange_bed": true, + "orange_candle": true, + "orange_wall_banner": true, + "piglin_head": true, + "piglin_wall_head": true, + "pink_banner": true, + "pink_bed": true, + "pink_candle": true, + "pink_petals": true, + "pink_wall_banner": true, + "player_head": true, + "player_wall_head": true, + "powder_snow_cauldron": true, + "purple_banner": true, + "purple_bed": true, + "purple_candle": true, + "purple_wall_banner": true, + "red_banner": true, + "red_bed": true, + "red_candle": true, + "red_wall_banner": true, + "repeater": true, + "sea_pickle": true, + "skeleton_skull": true, + "skeleton_wall_skull": true, + "snow": true, + "spruce_hanging_sign": true, + "spruce_wall_hanging_sign": true, + "structure_void": true, + "turtle_egg": true, + "warped_hanging_sign": true, + "warped_wall_hanging_sign": true, + "water_cauldron": true, + "white_banner": true, + "white_bed": true, + "white_candle": true, + "white_wall_banner": true, + "wither_skeleton_skull": true, + "wither_skeleton_wall_skull": true, + "yellow_banner": true, + "yellow_bed": true, + "yellow_candle": true, + "yellow_wall_banner": true, + "zombie_head": true, + "zombie_wall_head": true, + } + `) }) diff --git a/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts b/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts index e0d2ef41..24b85cc3 100644 --- a/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts +++ b/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts @@ -419,6 +419,7 @@ const handlers = [ [/(.+)_wall_sign$/, handleSign], [/(.+)_sign$/, handleSign], [/^(?:(ender|trapped)_)?chest$/, handleChest], + // [/(^|(.+)_)bed$/, handleBed], // no-op just suppress warning [/(^light|^moving_piston$)/, true], ] as const From 893f6182413e8ea5fef964a5a59897fb4be1e455 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Thu, 23 May 2024 00:54:41 +0300 Subject: [PATCH 0202/1195] hotfix starfield crash (#127) --- prismarine-viewer/viewer/lib/worldrendererThree.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prismarine-viewer/viewer/lib/worldrendererThree.ts b/prismarine-viewer/viewer/lib/worldrendererThree.ts index acf0e7bf..24b6a28a 100644 --- a/prismarine-viewer/viewer/lib/worldrendererThree.ts +++ b/prismarine-viewer/viewer/lib/worldrendererThree.ts @@ -323,7 +323,7 @@ class StarField { const clock = new THREE.Clock(); this.points.onBeforeRender = (renderer, scene, camera) => { - this.points!.position.copy(camera.position) + this.points?.position.copy?.(camera.position) material.uniforms.time.value = clock.getElapsedTime() * speed } } From c1d7d7c33f68c46f1a51cd33ba975251bc6bf77f Mon Sep 17 00:00:00 2001 From: gguio <109200692+gguio@users.noreply.github.com> Date: Thu, 23 May 2024 09:46:59 +0400 Subject: [PATCH 0203/1195] feat: Support for binds with modifiers (#130) Co-authored-by: gguio --- package.json | 2 +- pnpm-lock.yaml | 64 ++++++++++++++++++++++++++++----- src/controls.ts | 24 ++++++------- src/react/KeybindingsScreen.tsx | 32 +++++++++++++---- 4 files changed, 94 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 6e73b981..9451b266 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "browserify-zlib": "^0.2.0", "buffer": "^6.0.3", "constants-browserify": "^1.0.0", - "contro-max": "^0.1.7", + "contro-max": "^0.1.8", "crypto-browserify": "^3.12.0", "cypress": "^10.11.0", "cypress-esbuild-preprocessor": "^1.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6d784e17..8d34f233 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -268,8 +268,8 @@ importers: specifier: ^1.0.0 version: 1.0.0 contro-max: - specifier: ^0.1.7 - version: 0.1.7(typescript@5.5.0-beta) + specifier: ^0.1.8 + version: 0.1.8(typescript@5.5.0-beta) crypto-browserify: specifier: ^3.12.0 version: 3.12.0 @@ -3808,8 +3808,8 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - contro-max@0.1.7: - resolution: {integrity: sha512-HIYF1Dl50tUyTKaDsX+mPMDv2OjleNMVedYuBTX0n1wKNm9WxjWu2w74ATjz/8fHVL9GgmziIxAlFStd2je6kg==} + contro-max@0.1.8: + resolution: {integrity: sha512-5SoeudO8Zzfj/gbFTDrMRFJny02+MY1lBtb2NyCNiBLtHAfvhWZxZs/Z3yJvKL2rY/qKUZs9gTQOIDygBcBrdw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} convert-source-map@1.9.0: @@ -6043,6 +6043,11 @@ packages: resolution: {integrity: sha512-IHL8faXLLIWv1O+2v2NgyKlooilu/OiSL9orI8Kqed/rZvVOrFPzs2PwMAYjpQX9gxLPhiSU19KqZ8CjfNuqhg==} engines: {node: '>=14'} + minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/495eed56ab230b2615596590064671356d86a2dc: + resolution: {tarball: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/495eed56ab230b2615596590064671356d86a2dc} + version: 1.47.0 + engines: {node: '>=14'} + minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/ccab9fb39681f3ebe0d264e2a3f833aa3c5a1ac7: resolution: {tarball: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/ccab9fb39681f3ebe0d264e2a3f833aa3c5a1ac7} version: 1.47.0 @@ -6717,6 +6722,11 @@ packages: prismarine-chat@1.9.1: resolution: {integrity: sha512-x7WWa5MNhiLZSO6tw+YyKpzquFZ+DNISVgiV6K3SU0GsishMXe+nto02WhF/4AuFerKdugm9u1d/r4C4zSkJOg==} + prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/eb39a905761a36f733a456110e6b49d655bf5c16: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/eb39a905761a36f733a456110e6b49d655bf5c16} + version: 1.35.0 + engines: {node: '>=14'} + prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f: resolution: {tarball: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f} version: 1.35.0 @@ -11936,11 +11946,11 @@ snapshots: flatmap: 0.0.3 long: 5.2.3 minecraft-data: 3.65.0 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/ccab9fb39681f3ebe0d264e2a3f833aa3c5a1ac7(patch_hash=2uxevyasyasdavsxuehfavgkjq)(encoding@0.1.13) + minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/495eed56ab230b2615596590064671356d86a2dc(patch_hash=2uxevyasyasdavsxuehfavgkjq)(encoding@0.1.13) mkdirp: 2.1.6 node-gzip: 1.1.2 node-rsa: 1.1.1 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.65.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/eb39a905761a36f733a456110e6b49d655bf5c16(minecraft-data@3.65.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 @@ -12839,7 +12849,7 @@ snapshots: content-type@1.0.5: {} - contro-max@0.1.7(typescript@5.5.0-beta): + contro-max@0.1.8(typescript@5.5.0-beta): dependencies: events: 3.3.0 lodash-es: 4.17.21 @@ -13206,7 +13216,7 @@ snapshots: diamond-square@https://codeload.github.com/zardoy/diamond-square/tar.gz/915fce8e27fe8eb45464d89b9563956afa4f7687: dependencies: minecraft-data: 3.65.0 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.65.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/eb39a905761a36f733a456110e6b49d655bf5c16(minecraft-data@3.65.0) random-seed: 0.3.0 vec3: 0.1.8 @@ -15700,6 +15710,31 @@ snapshots: - encoding - supports-color + minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/495eed56ab230b2615596590064671356d86a2dc(patch_hash=2uxevyasyasdavsxuehfavgkjq)(encoding@0.1.13): + dependencies: + '@types/readable-stream': 4.0.12 + aes-js: 3.1.2 + buffer-equal: 1.0.1 + debug: 4.3.4(supports-color@8.1.1) + endian-toggle: 0.0.0 + lodash.get: 4.4.2 + lodash.merge: 4.6.2 + minecraft-data: 3.65.0 + minecraft-folder-path: 1.2.0 + node-fetch: 2.7.0(encoding@0.1.13) + node-rsa: 0.4.2 + prismarine-auth: 2.4.2(encoding@0.1.13) + prismarine-chat: 1.10.1 + prismarine-nbt: 2.5.0 + prismarine-realms: 1.3.2(encoding@0.1.13) + protodef: 1.15.0 + readable-stream: 4.5.2 + uuid-1345: 1.0.2 + yggdrasil: 1.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/ccab9fb39681f3ebe0d264e2a3f833aa3c5a1ac7(patch_hash=2uxevyasyasdavsxuehfavgkjq)(encoding@0.1.13): dependencies: '@types/readable-stream': 4.0.12 @@ -16520,6 +16555,19 @@ snapshots: prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 + prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/eb39a905761a36f733a456110e6b49d655bf5c16(minecraft-data@3.65.0): + dependencies: + prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + prismarine-nbt: 2.5.0 + prismarine-registry: 1.7.0 + smart-buffer: 4.2.0 + uint4: 0.1.2 + vec3: 0.1.8 + xxhash-wasm: 0.4.2 + transitivePeerDependencies: + - minecraft-data + prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.65.0): dependencies: prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) diff --git a/src/controls.ts b/src/controls.ts index 847741cf..f940d59d 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -6,7 +6,7 @@ import { proxy, subscribe } from 'valtio' import { ControMax } from 'contro-max/build/controMax' import { CommandEventArgument, SchemaCommandInput } from 'contro-max/build/types' import { stringStartsWith } from 'contro-max/build/stringUtils' -import { UserOverridesConfig } from 'contro-max/build/types/store' +import { UserOverrideCommand, UserOverridesConfig } from 'contro-max/build/types/store' import { isGameActive, showModal, gameAdditionalState, activeModalStack, hideCurrentModal, miscUiState } from './globalState' import { goFullscreen, pointerLock, reloadChunks } from './utils' import { options } from './optionsStorage' @@ -19,6 +19,7 @@ import { showOptionsModal } from './react/SelectOption' import widgets from './react/widgets' import { getItemFromBlock } from './botUtils' import { gamepadUiCursorState, moveGamepadCursorByPx } from './react/GamepadUiCursor' +import { updateBinds } from './react/KeybindingsScreenProvider' export const customKeymaps = proxy(JSON.parse(localStorage.keymap || '{}')) as UserOverridesConfig @@ -86,7 +87,7 @@ export const contro = new ControMax({ window.controMax = contro export type Command = CommandEventArgument['command'] -// updateCustomBinds() +updateBinds(customKeymaps) const updateDoPreventDefault = () => { controlOptions.preventDefault = miscUiState.gameLoaded && !activeModalStack.length @@ -296,19 +297,18 @@ function cycleHotbarSlot (dir: 1 | -1) { bot.setQuickBarSlot(newHotbarSlot) } -// custom commands hamdler -const customCommandsHandler = (buttonData: { code?: string, button?: string, state: boolean }) => { - if (!buttonData.state || !isGameActive(true)) return +// custom commands handler +const customCommandsHandler = ({ command }) => { + const [section, name] = command.split('.') + if (!isGameActive(true) || section !== 'custom') return - const codeOrButton = buttonData.code ?? buttonData.button - const inputType = buttonData.code ? 'keys' : 'gamepad' - for (const value of Object.values(contro.userConfig!.custom ?? {})) { - if (value[inputType]?.includes(codeOrButton!)) { - customCommandsConfig[(value as CustomCommand).type].handler((value as CustomCommand).inputs) - } + if (contro.userConfig?.custom) { + customCommandsConfig[(contro.userConfig.custom[name] as CustomCommand).type].handler( + (contro.userConfig.custom[name] as CustomCommand).inputs + ) } } -contro.on('pressedKeyOrButtonChanged', customCommandsHandler) +contro.on('trigger', customCommandsHandler) contro.on('trigger', ({ command }) => { const willContinue = !isGameActive(true) diff --git a/src/react/KeybindingsScreen.tsx b/src/react/KeybindingsScreen.tsx index 57d7d7ef..2de24de8 100644 --- a/src/react/KeybindingsScreen.tsx +++ b/src/react/KeybindingsScreen.tsx @@ -1,5 +1,6 @@ import { useState, useEffect, useRef, createContext, useContext } from 'react' import { UserOverridesConfig } from 'contro-max/build/types/store' +import { ModifierOnlyKeys } from 'contro-max/build/types/keyCodes' import { contro as controEx } from '../controls' import { hideModal } from '../globalState' import triangle from './ps_icons/playstation_triangle_console_controller_gamepad_icon.svg' @@ -96,22 +97,35 @@ export default ( updateBindMap() }, [userConfig]) - const updateBinding = (data) => { - if (data.state === true || !awaitingInputType) return + const updateBinding = (data: any) => { + if ((!data.state && awaitingInputType) || !awaitingInputType) { + setAwaitingInputType(null) + return + } + + if ('code' in data) { + if (data.state && [...contro.pressedKeys].includes(data.code)) return + if (data.code === 'Escape' || ['Mouse0', 'Mouse1', 'Mouse2'].includes(data.code)) { setAwaitingInputType(null) return } - setBinding({ code: data.code, state: true }, groupName, actionName, buttonNum) + const pressedModifiers = [...contro.pressedKeys].filter( + key => /^(Meta|Control|Alt|Shift)?$/.test(key) + ) + setBinding( + { code: pressedModifiers.length ? `${pressedModifiers[0]}+${data.code}` : data.code, state: true }, + groupName, + actionName, + buttonNum + ) } if ('button' in data) { contro.enabled = false void Promise.resolve().then(() => { contro.enabled = true }) setBinding(data, groupName, actionName, buttonNum) } - - setAwaitingInputType(null) } const updateBindMap = () => { @@ -368,8 +382,12 @@ const parseActionName = (action: string) => { const parseBindingName = (binding: string | undefined) => { if (!binding) return '' const cut = binding.replaceAll(/(Numpad|Digit|Key)/g, '') - const parts = cut.split(/(?=[A-Z\d])/) - return parts.reverse().join(' ') + + const parts = cut.includes('+') ? cut.split('+') : [cut] + for (let i = 0; i < parts.length; i++) { + parts[i] = parts[i].split(/(?=[A-Z\d])/).reverse().join(' ') + } + return parts.join(' + ') } const buttonsMap = { From 1de6ae8f2c71cc8a2d2ebbb9029c962dfe079f61 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 24 May 2024 04:19:33 +0300 Subject: [PATCH 0204/1195] fix: Fix crash in getItemUv function. now dropped items are always displayed --- src/index.ts | 39 ++++++++++++++++++++++++-------------- src/react/ChatProvider.tsx | 2 +- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/index.ts b/src/index.ts index 1797c894..89baaa10 100644 --- a/src/index.ts +++ b/src/index.ts @@ -142,24 +142,35 @@ new THREE.TextureLoader().load(itemsPng, (texture) => { viewer.entities.itemsTexture = texture // todo unify viewer.entities.getItemUv = (id) => { - const name = loadedData.items[id]?.name - const uv = itemsAtlases.latest.textures[name] - if (!uv) { - const variant = viewer.world.downloadedBlockStatesData[name]?.variants?.[''] - if (!variant) return - const uvBlock = (Array.isArray(variant) ? variant[0] : variant).model?.elements?.[0]?.faces?.north.texture - if (!uvBlock) return + try { + const name = loadedData.items[id]?.name + const uv = itemsAtlases.latest.textures[name] + if (!uv) { + const variant = viewer.world.downloadedBlockStatesData[name]?.variants?.[''] + if (!variant) return + const faces = (Array.isArray(variant) ? variant[0] : variant).model?.elements?.[0]?.faces + const uvBlock = faces?.north?.texture ?? faces?.up?.texture ?? faces?.down?.texture ?? faces?.west?.texture ?? faces?.east?.texture ?? faces?.south?.texture + if (!uvBlock) return + return { + ...uvBlock, + size: Math.abs(uvBlock.su), + texture: viewer.world.material.map + } + } return { - ...uvBlock, - size: Math.abs(uvBlock.su), + ...uv, + size: itemsAtlases.latest.size, + texture: viewer.entities.itemsTexture + } + } catch (err) { + reportError?.(err) + return { + u: 0, + v: 0, + size: 16 / viewer.world.material.map!.image.width, texture: viewer.world.material.map } } - return { - ...uv, - size: itemsAtlases.latest.size, - texture: viewer.entities.itemsTexture - } } }) viewer.entities.entitiesOptions = { diff --git a/src/react/ChatProvider.tsx b/src/react/ChatProvider.tsx index 0322c60f..ad4a705d 100644 --- a/src/react/ChatProvider.tsx +++ b/src/react/ChatProvider.tsx @@ -74,7 +74,7 @@ export default () => { if (items[0].match) items = items.map(i => i.match) } if (completeValue === '/') { - if (!items[0].startsWith('/')) { + if (!items[0]?.startsWith('/')) { // normalize items = items.map(item => `/${item}`) } From 8fdcbdfc60bd42e769c4aa0895722f586690ecfe Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 24 May 2024 04:21:41 +0300 Subject: [PATCH 0205/1195] fix: fix more starfield issues, make disableable --- .../viewer/lib/worldrendererThree.ts | 13 ++++++ src/entities.ts | 1 + src/optionsGuiScheme.tsx | 1 + src/optionsStorage.ts | 42 +++++++++++-------- src/watchOptions.ts | 5 +++ 5 files changed, 44 insertions(+), 18 deletions(-) diff --git a/prismarine-viewer/viewer/lib/worldrendererThree.ts b/prismarine-viewer/viewer/lib/worldrendererThree.ts index 24b6a28a..a2082a53 100644 --- a/prismarine-viewer/viewer/lib/worldrendererThree.ts +++ b/prismarine-viewer/viewer/lib/worldrendererThree.ts @@ -277,11 +277,23 @@ export class WorldRendererThree extends WorldRendererCommon { class StarField { points?: THREE.Points + private _enabled = true + get enabled () { + return this._enabled + } + set enabled (value) { + this._enabled = value + if (this.points) { + this.points.visible = value + } + } constructor(private scene: THREE.Scene) { } addToScene () { + if (this.points || !this.enabled) return + const radius = 80 const depth = 50 const count = 7000 @@ -332,6 +344,7 @@ class StarField { if (this.points) { this.points.geometry.dispose(); (this.points.material as THREE.Material).dispose(); + this.scene.remove(this.points) this.points = undefined; } diff --git a/src/entities.ts b/src/entities.ts index dbb59bed..b238d4ea 100644 --- a/src/entities.ts +++ b/src/entities.ts @@ -14,6 +14,7 @@ const updateAutoJump = () => { jumpOnAllEdges: options.autoParkour, // strictBlockCollision: true, }) + if (autoJump === bot.autoJumper.enabled) return if (autoJump) { bot.autoJumper.enable() } else { diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index 46f258a8..88e6115f 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -69,6 +69,7 @@ export const guiOptionsScheme: { enableWarning: 'Enabling it will make chunks load ~4x slower', disabledDuringGame: true }, + starfieldRendering: {} }, ], main: [ diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts index 9350d5ab..ed71cfdb 100644 --- a/src/optionsStorage.ts +++ b/src/optionsStorage.ts @@ -30,24 +30,7 @@ const defaultOptions = { touchButtonsSize: 40, touchButtonsOpacity: 80, touchButtonsPosition: 12, - touchControlsPositions: { - action: [ - 70, - 85 - ], - sneak: [ - 90, - 85 - ], - break: [ - 70, - 65 - ], - jump: [ - 90, - 65 - ], - } as Record, + touchControlsPositions: getDefaultTouchControlsPositions(), touchControlsType: 'classic' as 'classic' | 'joystick-buttons', gpuPreference: 'default' as 'default' | 'high-performance' | 'low-power', backgroundRendering: '20fps' as 'full' | '20fps' | '5fps', @@ -59,6 +42,7 @@ const defaultOptions = { dayCycleAndLighting: true, loadPlayerSkins: true, lowMemoryMode: false, + starfieldRendering: true, // antiAliasing: false, showChunkBorders: false, // todo rename option @@ -73,6 +57,7 @@ const defaultOptions = { disableLoadPrompts: false, guestUsername: 'guest', askGuestName: true, + errorReporting: true, /** Actually might be useful */ showCursorBlockInSpectator: false, renderEntities: true, @@ -91,6 +76,27 @@ const defaultOptions = { wysiwygSignEditor: 'auto' as 'auto' | 'always' | 'never', } +function getDefaultTouchControlsPositions () { + return { + action: [ + 70, + 85 + ], + sneak: [ + 90, + 85 + ], + break: [ + 70, + 65 + ], + jump: [ + 90, + 65 + ], + } as Record +} + const qsOptionsRaw = new URLSearchParams(location.search).getAll('setting') export const qsOptions = Object.fromEntries(qsOptionsRaw.map(o => { const [key, value] = o.split(':') diff --git a/src/watchOptions.ts b/src/watchOptions.ts index 56fc9c2c..4ff34be4 100644 --- a/src/watchOptions.ts +++ b/src/watchOptions.ts @@ -57,4 +57,9 @@ export const watchOptionsAfterViewerInit = () => { customEvents.on('gameLoaded', () => { viewer.world.mesherConfig.enableLighting = !bot.supportFeature('blockStateId') || options.newVersionsLighting }) + + watchValue(options, o => { + if (!(viewer.world instanceof WorldRendererThree)) return + viewer.world.starField.enabled = o.starfieldRendering + }) } From f2137d95a1a1ca0af04ebde6bd4c3b9194a1370f Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 24 May 2024 04:33:54 +0300 Subject: [PATCH 0206/1195] fix: fix critical memory leak block in the scene were not removed from the memory --- prismarine-viewer/viewer/lib/dispose.js | 6 ---- prismarine-viewer/viewer/lib/entities.js | 30 +++++++++---------- prismarine-viewer/viewer/lib/primitives.js | 7 ++--- prismarine-viewer/viewer/lib/threeJsUtils.ts | 13 ++++++++ .../viewer/lib/worldrendererThree.ts | 7 ++--- 5 files changed, 34 insertions(+), 29 deletions(-) delete mode 100644 prismarine-viewer/viewer/lib/dispose.js create mode 100644 prismarine-viewer/viewer/lib/threeJsUtils.ts diff --git a/prismarine-viewer/viewer/lib/dispose.js b/prismarine-viewer/viewer/lib/dispose.js deleted file mode 100644 index 15ec7b4b..00000000 --- a/prismarine-viewer/viewer/lib/dispose.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - dispose3 (o) { - o.geometry?.dispose() - o.dispose?.() - } -} diff --git a/prismarine-viewer/viewer/lib/entities.js b/prismarine-viewer/viewer/lib/entities.js index 136c77fe..930f62c9 100644 --- a/prismarine-viewer/viewer/lib/entities.js +++ b/prismarine-viewer/viewer/lib/entities.js @@ -2,7 +2,6 @@ import * as THREE from 'three' import * as TWEEN from '@tweenjs/tween.js' import * as Entity from './entity/EntityMesh' -import { dispose3 } from './dispose' import nbt from 'prismarine-nbt' import EventEmitter from 'events' import { PlayerObject, PlayerAnimation } from 'skinview3d' @@ -14,10 +13,11 @@ import { NameTagObject } from 'skinview3d/libs/nametag' import { flat, fromFormattedString } from '@xmcl/text-component' import mojangson from 'mojangson' import externalTexturesJson from './entity/externalTextures.json' +import { disposeObject } from './threeJsUtils' export const TWEEN_DURATION = 50 // todo should be 100 -function getUsernameTexture(username, { fontFamily = 'sans-serif' }) { +function getUsernameTexture (username, { fontFamily = 'sans-serif' }) { const canvas = document.createElement('canvas') const ctx = canvas.getContext('2d') if (!ctx) throw new Error('Could not get 2d context') @@ -61,7 +61,7 @@ const addNametag = (entity, options, mesh) => { // todo cleanup const nametags = {} -function getEntityMesh(entity, scene, options, overrides) { +function getEntityMesh (entity, scene, options, overrides) { if (entity.name) { try { // https://github.com/PrismarineJS/prismarine-viewer/pull/410 @@ -105,15 +105,15 @@ export class Entities extends EventEmitter { this.getItemUv = undefined } - clear() { + clear () { for (const mesh of Object.values(this.entities)) { this.scene.remove(mesh) - dispose3(mesh) + disposeObject(mesh) } this.entities = {} } - setDebugMode(mode, /** @type {THREE.Object3D?} */entity = null) { + setDebugMode (mode, /** @type {THREE.Object3D?} */entity = null) { this.debugMode = mode for (const mesh of entity ? [entity] : Object.values(this.entities)) { const boxHelper = mesh.children.find(c => c.name === 'debug') @@ -125,14 +125,14 @@ export class Entities extends EventEmitter { } } - setVisible(visible, /** @type {THREE.Object3D?} */entity = null) { + setVisible (visible, /** @type {THREE.Object3D?} */entity = null) { this.visible = visible for (const mesh of entity ? [entity] : Object.values(this.entities)) { mesh.visible = visible } } - render() { + render () { const dt = this.clock.getDelta() for (const entityId of Object.keys(this.entities)) { const playerObject = this.getPlayerObject(entityId) @@ -142,7 +142,7 @@ export class Entities extends EventEmitter { } } - getPlayerObject(entityId) { + getPlayerObject (entityId) { /** @type {(PlayerObject & { animation?: PlayerAnimation }) | undefined} */ const playerObject = this.entities[entityId]?.playerObject return playerObject @@ -152,7 +152,7 @@ export class Entities extends EventEmitter { defaultSteveTexture // true means use default skin url - updatePlayerSkin(entityId, username, /** @type {string | true} */skinUrl, /** @type {string | true | undefined} */capeUrl = undefined) { + updatePlayerSkin (entityId, username, /** @type {string | true} */skinUrl, /** @type {string | true | undefined} */capeUrl = undefined) { let playerObject = this.getPlayerObject(entityId) if (!playerObject) return // const username = this.entities[entityId].username @@ -235,14 +235,14 @@ export class Entities extends EventEmitter { playerObject.cape.map = null } - function isCanvasBlank(canvas) { + function isCanvasBlank (canvas) { return !canvas.getContext('2d') .getImageData(0, 0, canvas.width, canvas.height).data .some(channel => channel !== 0) } } - playAnimation(entityPlayerId, /** @type {'walking' | 'running' | 'oneSwing' | 'idle'} */animation) { + playAnimation (entityPlayerId, /** @type {'walking' | 'running' | 'oneSwing' | 'idle'} */animation) { const playerObject = this.getPlayerObject(entityPlayerId) if (!playerObject) return @@ -262,14 +262,14 @@ export class Entities extends EventEmitter { } - displaySimpleText(jsonLike) { + displaySimpleText (jsonLike) { if (!jsonLike) return const parsed = typeof jsonLike === 'string' ? mojangson.simplify(mojangson.parse(jsonLike)) : nbt.simplify(jsonLike) const text = flat(parsed).map(x => x.text) return text.join('') } - update(/** @type {import('prismarine-entity').Entity & {delete?, pos}} */entity, overrides) { + update (/** @type {import('prismarine-entity').Entity & {delete?, pos}} */entity, overrides) { let isPlayerModel = entity.name === 'player' if (entity.name === 'zombie' || entity.name === 'zombie_villager' || entity.name === 'husk') { isPlayerModel = true @@ -456,7 +456,7 @@ export class Entities extends EventEmitter { if (e.additionalCleanup) e.additionalCleanup() this.emit('remove', entity) this.scene.remove(e) - dispose3(e) + disposeObject(e) // todo dispose textures as well ? delete this.entities[entity.id] } diff --git a/prismarine-viewer/viewer/lib/primitives.js b/prismarine-viewer/viewer/lib/primitives.js index f206ee87..c8a0c006 100644 --- a/prismarine-viewer/viewer/lib/primitives.js +++ b/prismarine-viewer/viewer/lib/primitives.js @@ -1,6 +1,5 @@ const THREE = require('three') const { MeshLine, MeshLineMaterial } = require('three.meshline') -const { dispose3 } = require('./dispose') function getMesh (primitive, camera) { if (primitive.type === 'line') { @@ -48,7 +47,7 @@ function getMesh (primitive, camera) { } class Primitives { - constructor (scene, camera) { + constructor(scene, camera) { this.scene = scene this.camera = camera this.primitives = {} @@ -57,7 +56,7 @@ class Primitives { clear () { for (const mesh of Object.values(this.primitives)) { this.scene.remove(mesh) - dispose3(mesh) + disposeObject(mesh) } this.primitives = {} } @@ -65,7 +64,7 @@ class Primitives { update (primitive) { if (this.primitives[primitive.id]) { this.scene.remove(this.primitives[primitive.id]) - dispose3(this.primitives[primitive.id]) + disposeObject(this.primitives[primitive.id]) delete this.primitives[primitive.id] } diff --git a/prismarine-viewer/viewer/lib/threeJsUtils.ts b/prismarine-viewer/viewer/lib/threeJsUtils.ts new file mode 100644 index 00000000..f856c244 --- /dev/null +++ b/prismarine-viewer/viewer/lib/threeJsUtils.ts @@ -0,0 +1,13 @@ +import * as THREE from 'three'; + +export const disposeObject = (obj: THREE.Object3D) => { + if (!obj) return + // not cleaning texture there as it might be used by other objects, but would be good to also do that + if (obj instanceof THREE.Mesh) { + obj.geometry.dispose(); + obj.material.dispose(); + } + if (obj.children) { + obj.children.forEach(disposeObject); + } +} diff --git a/prismarine-viewer/viewer/lib/worldrendererThree.ts b/prismarine-viewer/viewer/lib/worldrendererThree.ts index a2082a53..60156a50 100644 --- a/prismarine-viewer/viewer/lib/worldrendererThree.ts +++ b/prismarine-viewer/viewer/lib/worldrendererThree.ts @@ -1,13 +1,13 @@ import * as THREE from 'three' import { Vec3 } from 'vec3' import nbt from 'prismarine-nbt' -import { dispose3 } from './dispose' import PrismarineChatLoader from 'prismarine-chat' import { renderSign } from '../sign-renderer/' import { chunkPos, sectionPos } from './simpleUtils' import { WorldRendererCommon, WorldRendererConfig } from './worldrendererCommon' import * as tweenJs from '@tweenjs/tween.js' import { BloomPass, RenderPass, UnrealBloomPass, EffectComposer, WaterPass, GlitchPass } from 'three-stdlib' +import { disposeObject } from './threeJsUtils' export class WorldRendererThree extends WorldRendererCommon { outputFormat = 'threeJs' as const @@ -62,7 +62,7 @@ export class WorldRendererThree extends WorldRendererCommon { let object: THREE.Object3D = this.sectionObjects[data.key] if (object) { this.scene.remove(object) - dispose3(object) + disposeObject(object) delete this.sectionObjects[data.key] } @@ -263,7 +263,7 @@ export class WorldRendererThree extends WorldRendererCommon { const mesh = this.sectionObjects[key] if (mesh) { this.scene.remove(mesh) - dispose3(mesh) + disposeObject(mesh) } delete this.sectionObjects[key] } @@ -327,7 +327,6 @@ class StarField { material.blending = THREE.AdditiveBlending material.depthTest = false material.transparent = true - // material.unifo // Create points and add them to the scene this.points = new THREE.Points(geometry, material) From fcec85baa39f212a98e43a46b6bffa0eebc8455c Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 24 May 2024 10:21:03 +0300 Subject: [PATCH 0207/1195] feat: Make bow, foods cancellable and add use progression indicator feat: make item in offhand activatable --- prismarine-viewer/viewer/lib/threeJsUtils.ts | 5 +- src/react/Crosshair.css | 35 +++++++---- src/react/Crosshair.tsx | 64 +++++++++++++++++++- src/react/TitleProvider.tsx | 1 + src/worldInteractions.ts | 42 +++++++++---- 5 files changed, 121 insertions(+), 26 deletions(-) diff --git a/prismarine-viewer/viewer/lib/threeJsUtils.ts b/prismarine-viewer/viewer/lib/threeJsUtils.ts index f856c244..e4f9404b 100644 --- a/prismarine-viewer/viewer/lib/threeJsUtils.ts +++ b/prismarine-viewer/viewer/lib/threeJsUtils.ts @@ -1,11 +1,10 @@ import * as THREE from 'three'; export const disposeObject = (obj: THREE.Object3D) => { - if (!obj) return // not cleaning texture there as it might be used by other objects, but would be good to also do that if (obj instanceof THREE.Mesh) { - obj.geometry.dispose(); - obj.material.dispose(); + obj.geometry?.dispose?.(); + obj.material?.dispose?.(); } if (obj.children) { obj.children.forEach(disposeObject); diff --git a/src/react/Crosshair.css b/src/react/Crosshair.css index 94252ffa..7076f475 100644 --- a/src/react/Crosshair.css +++ b/src/react/Crosshair.css @@ -1,12 +1,25 @@ .crosshair { - z-index: -1; - width: 16px; - height: 16px; - background: var(--gui-icons); - background-size: calc(256px * var(--crosshair-scale)); - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - image-rendering: pixelated; - } + z-index: -1; + width: 16px; + height: 16px; + background: var(--gui-icons); + background-size: calc(256px * var(--crosshair-scale)); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + image-rendering: pixelated; + pointer-events: none; +} + +.crosshair-indicator { + z-index: -1; + width: var(--crosshair-indicator-size); + height: 1.5px; + position: fixed; + top: calc(50% + 8px); + left: 50%; + transform: translate(-50%, -50%); + background: lightgray; + pointer-events: none; +} diff --git a/src/react/Crosshair.tsx b/src/react/Crosshair.tsx index 877b8df4..ab289db8 100644 --- a/src/react/Crosshair.tsx +++ b/src/react/Crosshair.tsx @@ -1,8 +1,70 @@ +import { useEffect, useState } from 'react' import './Crosshair.css' +import { proxy, useSnapshot } from 'valtio' import SharedHudVars from './SharedHudVars' +// todo move to mineflayer +export const itemBeingUsed = proxy({ + name: null as string | null, + hand: 0 as 0 | 1 +}) + export default () => { + const { name: usingItem, hand } = useSnapshot(itemBeingUsed) + + const [displayIndicator, setDisplayIndicator] = useState(true) + const [indicatorProgress, setIndicatorProgress] = useState(0) + const [alternativeIndicator, setAlternativeIndicator] = useState(false) + const boxMaxTimeMs = 1000 + // todo add sword indicator + const indicatorSize = 20 + + useEffect(() => { + bot.on('heldItemChanged' as any, () => { + const displayBar = (item: import('prismarine-item').Item | null) => { + const itemName = item?.name + if (!itemName) return + return loadedData.foodsArray.map((food) => food.name).includes(itemName) || itemName === 'bow' || itemName === 'shield' || itemName === 'crossbow' + } + setDisplayIndicator(displayBar(bot.heldItem) || displayBar(bot.inventory.slots[45]) || false) + }) + }, []) + + useEffect(() => { + setAlternativeIndicator(usingItem === 'shield') + if (!usingItem) return + const startTime = Date.now() + let maxTime = 0 + if (usingItem === 'bow' || usingItem === 'crossbow') { + maxTime = 1000 + } + const isFood = loadedData.foodsArray.some((food) => food.name === usingItem) + if (isFood) { + maxTime = 32 * 50 + } + if (!maxTime) return + + const id = setInterval(() => { + const progress = (Date.now() - startTime) / boxMaxTimeMs + if (progress >= 1) { + clearInterval(id) + } else { + setIndicatorProgress(progress) + } + }, 1000 / 60) + return () => { + setIndicatorProgress(0) + clearInterval(id) + } + }, [usingItem]) + return -
+
+ {displayIndicator &&
} } diff --git a/src/react/TitleProvider.tsx b/src/react/TitleProvider.tsx index 151a93c1..f19669ec 100644 --- a/src/react/TitleProvider.tsx +++ b/src/react/TitleProvider.tsx @@ -23,6 +23,7 @@ export default () => { const [openActionBar, setOpenActionBar] = useState(false) useMemo(() => { + // todo move to mineflayer bot._client.on('set_title_text', (packet) => { setTitle(JSON.parse(packet.text)) setOpenTitle(true) diff --git a/src/worldInteractions.ts b/src/worldInteractions.ts index 85884b2f..239c02c2 100644 --- a/src/worldInteractions.ts +++ b/src/worldInteractions.ts @@ -17,6 +17,7 @@ import { LineMaterial, Wireframe, LineSegmentsGeometry } from 'three-stdlib' import { hideCurrentModal, isGameActive, showModal } from './globalState' import { assertDefined } from './utils' import { options } from './optionsStorage' +import { itemBeingUsed } from './react/Crosshair' function getViewDirection (pitch, yaw) { const csPitch = Math.cos(pitch) @@ -133,6 +134,9 @@ class WorldInteraction { } this.lastDugBlock = null }) + bot.on('heldItemChanged' as any, () => { + itemBeingUsed.name = null + }) const upLineMaterial = () => { const inCreative = bot.game.gameMode === 'creative' @@ -191,16 +195,20 @@ class WorldInteraction { // Place / interact / activate if (this.buttons[2] && this.lastBlockPlaced >= 4) { - const activate = bot.heldItem && ['egg', 'fishing_rod', 'firework_rocket', - 'fire_charge', 'snowball', 'ender_pearl', 'experience_bottle', 'potion', - 'glass_bottle', 'bucket', 'water_bucket', 'lava_bucket', 'milk_bucket', - 'minecart', 'boat', 'tnt_minecart', 'chest_minecart', 'hopper_minecart', - 'command_block_minecart', 'armor_stand', 'lead', 'name_tag', - // - 'writable_book', 'written_book', 'compass', 'clock', 'filled_map', 'empty_map', 'map', - 'shears', 'carrot_on_a_stick', 'warped_fungus_on_a_stick', - 'spawn_egg', 'trident', 'crossbow', 'elytra', 'shield', 'turtle_helmet', - ].includes(bot.heldItem.name) + const activatableItems = (itemName: string) => { + return ['egg', 'fishing_rod', 'firework_rocket', + 'fire_charge', 'snowball', 'ender_pearl', 'experience_bottle', 'potion', + 'glass_bottle', 'bucket', 'water_bucket', 'lava_bucket', 'milk_bucket', + 'minecart', 'boat', 'tnt_minecart', 'chest_minecart', 'hopper_minecart', + 'command_block_minecart', 'armor_stand', 'lead', 'name_tag', + // + 'writable_book', 'written_book', 'compass', 'clock', 'filled_map', 'empty_map', 'map', + 'shears', 'carrot_on_a_stick', 'warped_fungus_on_a_stick', + 'spawn_egg', 'trident', 'crossbow', 'elytra', 'shield', 'turtle_helmet', 'bow', 'crossbow', 'bucket_of_cod', + ...loadedData.foodsArray.map((f) => f.name), + ].includes(itemName) + } + const activate = bot.heldItem && activatableItems(bot.heldItem.name) let stop = false if (!bot.controlState.sneak) { if (cursorBlock?.name === 'bed' || cursorBlock?.name.endsWith('_bed')) { @@ -223,6 +231,7 @@ class WorldInteraction { }) } } + // todo placing with offhand if (cursorBlock && !activate && !stop) { const vecArray = [new Vec3(0, -1, 0), new Vec3(0, 1, 0), new Vec3(0, 0, -1), new Vec3(0, 0, 1), new Vec3(-1, 0, 0), new Vec3(1, 0, 0)] //@ts-expect-error @@ -242,10 +251,21 @@ class WorldInteraction { }).catch(console.warn) } } else if (!stop) { - bot.activateItem() // todo offhand + const offhand = activate ? false : activatableItems(bot.inventory.slots[45]?.name ?? '') + bot.activateItem(offhand) // todo offhand + itemBeingUsed.name = (offhand ? bot.inventory.slots[45]?.name : bot.heldItem?.name) ?? null + itemBeingUsed.hand = offhand ? 1 : 0 } this.lastBlockPlaced = 0 } + // stop using activated item (cancel) + if (itemBeingUsed.name && !this.buttons[2]) { + itemBeingUsed.name = null + // "only foods and bow can be deactivated" - not true, shields also can be deactivated and client always sends this + // if (bot.heldItem && (loadedData.foodsArray.map((f) => f.name).includes(bot.heldItem.name) || bot.heldItem.name === 'bow')) { + bot.deactivateItem() + // } + } // Stop break if ((!this.buttons[0] && this.lastButtons[0]) || cursorChanged) { From 87e724d5f6d7d4b8630a5f491857e8042f3206c6 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 24 May 2024 11:05:44 +0300 Subject: [PATCH 0208/1195] fix: fix offhand slot in hotbar display --- pnpm-lock.yaml | 8 ++++---- src/react/HotbarRenderApp.tsx | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d34f233..6fdf4afa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -299,7 +299,7 @@ importers: version: 1.0.0 minecraft-inventory-gui: specifier: github:zardoy/minecraft-inventory-gui#next - version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/5554c7ab0a74bce52aa5f5f04a48eb8d3b9ac65c(@types/react@18.2.20)(react@18.2.0) + version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/200902aca941475e7feb610070e662b172a000b5(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:PrismarineJS/mineflayer version: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/5a544cf2547a6e0f1f17786962d77a33c661c02f(encoding@0.1.13) @@ -6035,8 +6035,8 @@ packages: minecraft-folder-path@1.2.0: resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} - minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/5554c7ab0a74bce52aa5f5f04a48eb8d3b9ac65c: - resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/5554c7ab0a74bce52aa5f5f04a48eb8d3b9ac65c} + minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/200902aca941475e7feb610070e662b172a000b5: + resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/200902aca941475e7feb610070e662b172a000b5} version: 1.0.1 minecraft-protocol@1.47.0: @@ -15678,7 +15678,7 @@ snapshots: minecraft-folder-path@1.2.0: {} - minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/5554c7ab0a74bce52aa5f5f04a48eb8d3b9ac65c(@types/react@18.2.20)(react@18.2.0): + minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/200902aca941475e7feb610070e662b172a000b5(@types/react@18.2.20)(react@18.2.0): dependencies: valtio: 1.11.2(@types/react@18.2.20)(react@18.2.0) transitivePeerDependencies: diff --git a/src/react/HotbarRenderApp.tsx b/src/react/HotbarRenderApp.tsx index 3b50f49b..02689485 100644 --- a/src/react/HotbarRenderApp.tsx +++ b/src/react/HotbarRenderApp.tsx @@ -93,7 +93,7 @@ export default () => { }, } as any) const { canvasManager } = inv - inv.inventory.supportsOffhand = bot.supportFeature('doesntHaveOffHandSlot') + inv.inventory.supportsOffhand = !bot.supportFeature('doesntHaveOffHandSlot') inv.pwindow.disablePicking = true canvasManager.children[0].disableHighlight = true From f4ef8f7d85e16727887fddc6c90228ccf235690d Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 25 May 2024 00:18:43 +0300 Subject: [PATCH 0209/1195] cleanup: remove preflat handling --- .../viewer/prepare/moreGeneratedBlocks.ts | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts b/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts index 24b85cc3..ffb1a705 100644 --- a/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts +++ b/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts @@ -1,6 +1,5 @@ import Jimp from 'jimp' import minecraftData from 'minecraft-data' -import prismarineRegistry from 'prismarine-registry' import { McAssets } from './modelsBuilder' import path from 'path' import fs from 'fs' @@ -11,8 +10,6 @@ const twoTileTextures: string[] = [] let currentImage: Jimp let currentBlockName: string let currentMcAssets: McAssets -let isPreFlattening = false -const postFlatenningRegistry = prismarineRegistry('1.13') const __dirname = path.dirname(fileURLToPath(new URL(import.meta.url))) type SidesType = { @@ -24,9 +21,9 @@ type SidesType = { "down": string } -const getBlockStates = (name: string, postFlatenningName = name) => { - const mcData = isPreFlattening ? postFlatenningRegistry : minecraftData(currentMcAssets.version) - return mcData.blocksByName[isPreFlattening ? postFlatenningName : name]?.states +const getBlockStates = (name: string) => { + const mcData = minecraftData(currentMcAssets.version) + return mcData.blocksByName[name]?.states } export const addBlockCustomSidesModel = (name: string, sides: SidesType) => { @@ -124,7 +121,7 @@ const handleShulkerBox = async (dataBase: string, match: RegExpExecArray) => { } const handleSign = async (dataBase: string, match: RegExpExecArray) => { - const states = getBlockStates(currentBlockName, currentBlockName === 'wall_sign' ? 'wall_sign' : 'sign') + const states = getBlockStates(currentBlockName) if (!states) return const [, signMaterial = ''] = match @@ -375,17 +372,11 @@ const handleChest = async (dataBase: string, match: RegExpExecArray) => { if (modelName.endsWith('_left')) chestTextureName = `${chestTextureName}_left` if (modelName.endsWith('_right')) chestTextureName = `${chestTextureName}_right` - // reading latest version since the texture wasn't changed, but in pre-flatenning need custom mapping for doubled_chest const texture = path.join(currentMcAssets.directory, `../1.19.1/entity/chest/${chestTextureName}.png`) currentImage = await Jimp.read(texture) const model = structuredClone(chestModels[modelName]) - // todo < 1.9 - if (currentMcAssets.version === '1.8.8') { - // doesn't have definition of block yet - model.parent = undefined - } model.textures.particle = particle const newModelName = `${currentBlockName}_${modelName}` for (const variant of blockStatesVariants) { @@ -438,7 +429,6 @@ export const tryHandleBlockEntity = async (dataBase, blockName) => { export const prepareMoreGeneratedBlocks = async (mcAssets: McAssets) => { const mcData = minecraftData(mcAssets.version) - isPreFlattening = !mcData.supportFeature('blockStateId') const allTheBlocks = mcData.blocksArray.map(x => x.name) currentMcAssets = mcAssets From 0d8beef65c5022cf32dd2ea758891bad700e2374 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 26 May 2024 18:58:46 +0300 Subject: [PATCH 0210/1195] feat: add gamemode selector in create world screen. always use creative with ?singleplayer=1 --- cypress/e2e/index.spec.ts | 27 ++----------------- cypress/e2e/shared.ts | 15 +++++++++++ .../viewer/prepare/generateTextures.ts | 7 ++--- scripts/esbuildPlugins.mjs | 18 ++++++------- scripts/githubActions.mjs | 8 +++--- src/optionsStorage.ts | 4 ++- src/react/CreateWorld.tsx | 14 +++++++--- src/react/CreateWorldProvider.tsx | 7 ++--- src/react/Crosshair.tsx | 2 +- src/workerWorkaround.ts | 2 ++ tsconfig.json | 2 +- 11 files changed, 56 insertions(+), 50 deletions(-) create mode 100644 cypress/e2e/shared.ts create mode 100644 src/workerWorkaround.ts diff --git a/cypress/e2e/index.spec.ts b/cypress/e2e/index.spec.ts index 455b1283..05b50211 100644 --- a/cypress/e2e/index.spec.ts +++ b/cypress/e2e/index.spec.ts @@ -1,15 +1,5 @@ /// -import type { AppOptions } from '../../src/optionsStorage' - -const cleanVisit = (url?) => { - cy.clearLocalStorage() - visit(url) -} - -const visit = (url = '/') => { - window.localStorage.cypress = 'true' - cy.visit(url) -} +import { setOptions, cleanVisit, visit } from './shared' // todo use ssl @@ -31,14 +21,8 @@ const testWorldLoad = () => { }) } -const setOptions = (options: Partial) => { - cy.window().then(win => { - Object.assign(win['options'], options) - }) -} - it('Loads & renders singleplayer', () => { - visit('/?singleplayer=1') + cleanVisit('/?singleplayer=1') setOptions({ localServerOptions: { generation: { @@ -69,10 +53,3 @@ it('Loads & renders zip world', () => { cy.get('input[type="file"]').selectFile('cypress/superflat.zip', { force: true }) testWorldLoad() }) - -it.skip('Performance test', () => { - // select that world - // from -2 85 24 - // await bot.loadPlugin(pathfinder.pathfinder) - // bot.pathfinder.goto(new pathfinder.goals.GoalXZ(28, -28)) -}) diff --git a/cypress/e2e/shared.ts b/cypress/e2e/shared.ts new file mode 100644 index 00000000..9292a8d5 --- /dev/null +++ b/cypress/e2e/shared.ts @@ -0,0 +1,15 @@ +import { AppOptions } from '../../src/optionsStorage' + +export const cleanVisit = (url?) => { + cy.clearLocalStorage() + visit(url) +} +export const visit = (url = '/') => { + window.localStorage.cypress = 'true' + cy.visit(url) +} +export const setOptions = (options: Partial) => { + cy.window().then(win => { + Object.assign(win['options'], options) + }) +} diff --git a/prismarine-viewer/viewer/prepare/generateTextures.ts b/prismarine-viewer/viewer/prepare/generateTextures.ts index dc838c65..f66fb5d7 100644 --- a/prismarine-viewer/viewer/prepare/generateTextures.ts +++ b/prismarine-viewer/viewer/prepare/generateTextures.ts @@ -19,9 +19,10 @@ const warnings = new Set() Promise.resolve().then(async () => { generateItemsAtlases() console.time('generateTextures') - for (const version of mcAssets.versions as typeof mcAssets['versions']) { + const versions = process.argv.includes('-l') ? [mcAssets.versions.at(-1)!] : mcAssets.versions + for (const version of versions as typeof mcAssets['versions']) { // for debugging (e.g. when above is overridden) - if (!mcAssets.versions.includes(version)) { + if (!versions.includes(version)) { throw new Error(`Version ${version} is not supported by minecraft-assets`) } if (versionToNumber(version) < versionToNumber('1.13')) { @@ -45,7 +46,7 @@ Promise.resolve().then(async () => { fs.copySync(assets.directory, path.resolve(texturesPath, version), { overwrite: true }) } - fs.writeFileSync(path.join(publicPath, 'supportedVersions.json'), '[' + mcAssets.versions.map(v => `"${v}"`).toString() + ']') + fs.writeFileSync(path.join(publicPath, 'supportedVersions.json'), '[' + versions.map(v => `"${v}"`).toString() + ']') warnings.forEach(x => console.warn(x)) console.timeEnd('generateTextures') }) diff --git a/scripts/esbuildPlugins.mjs b/scripts/esbuildPlugins.mjs index f6b539c1..fe4018f3 100644 --- a/scripts/esbuildPlugins.mjs +++ b/scripts/esbuildPlugins.mjs @@ -40,7 +40,7 @@ export const startWatchingHmr = () => { const mesherSharedPlugins = [ { name: 'minecraft-data', - setup (build) { + setup(build) { build.onLoad({ filter: /data[\/\\]pc[\/\\]common[\/\\]legacy.json$/, }, async (args) => { @@ -59,7 +59,7 @@ const plugins = [ ...mesherSharedPlugins, { name: 'strict-aliases', - setup (build) { + setup(build) { build.onResolve({ filter: /^minecraft-protocol$/, }, async ({ kind, resolveDir }) => { @@ -110,7 +110,7 @@ const plugins = [ }, { name: 'data-assets', - setup (build) { + setup(build) { build.onResolve({ filter: /.*/, }, async ({ path, ...rest }) => { @@ -161,7 +161,7 @@ const plugins = [ }, { name: 'prevent-incorrect-linking', - setup (build) { + setup(build) { build.onResolve({ filter: /.+/, }, async ({ resolveDir, path, importer, kind, pluginData }) => { @@ -184,7 +184,7 @@ const plugins = [ }, { name: 'watch-notify', - setup (build) { + setup(build) { let count = 0 let time let prevHash @@ -234,7 +234,7 @@ const plugins = [ }, { name: 'esbuild-readdir', - setup (build) { + setup(build) { build.onResolve({ filter: /^esbuild-readdir:.+$/, }, ({ resolveDir, path }) => { @@ -262,7 +262,7 @@ const plugins = [ }, { name: 'esbuild-import-glob', - setup (build) { + setup(build) { build.onResolve({ filter: /^esbuild-import-glob\(path:(.+),skipFiles:(.+)\)+$/, }, ({ resolveDir, path }) => { @@ -292,7 +292,7 @@ const plugins = [ }, { name: 'fix-dynamic-require', - setup (build) { + setup(build) { build.onResolve({ filter: /1\.14\/chunk/, }, async ({ resolveDir, path }) => { @@ -321,7 +321,7 @@ const plugins = [ }, { name: 'react-displayname', - setup (build) { + setup(build) { build.onLoad({ filter: /.tsx$/, }, async ({ path }) => { diff --git a/scripts/githubActions.mjs b/scripts/githubActions.mjs index ba7b8566..ab786ea9 100644 --- a/scripts/githubActions.mjs +++ b/scripts/githubActions.mjs @@ -6,10 +6,10 @@ const fns = { async getAlias () { const aliasesRaw = process.env.ALIASES if (!aliasesRaw) throw new Error('No aliases found') - const aliases = aliasesRaw.split('\n').map((x) => x.split('=')) + const aliases = aliasesRaw.split('\n').map((x) => x.trim().split('=')) const githubActionsPull = process.env.PULL_URL?.split('/').at(-1) - if (!githubActionsPull) throw new Error(`Not a pull request, got ${process.env.GITHUB_REF}`) - const prNumber = githubActionsPull[1] + if (!githubActionsPull) throw new Error(`Not a pull request, got ${process.env.PULL_URL}`) + const prNumber = githubActionsPull const alias = aliases.find((x) => x[0] === prNumber) if (alias) { // set github output @@ -18,7 +18,7 @@ const fns = { } } -function setOutput(key, value) { +function setOutput (key, value) { // Temporary hack until core actions library catches up with github new recommendations const output = process.env['GITHUB_OUTPUT'] fs.appendFileSync(output, `${key}=${value}${os.EOL}`) diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts index ed71cfdb..2a13abf4 100644 --- a/src/optionsStorage.ts +++ b/src/optionsStorage.ts @@ -52,7 +52,9 @@ const defaultOptions = { excludeCommunicationDebugEvents: [], preventDevReloadWhilePlaying: false, numWorkers: 4, - localServerOptions: {} as any, + localServerOptions: { + gameMode: 1 + } as any, preferLoadReadonly: false, disableLoadPrompts: false, guestUsername: 'guest', diff --git a/src/react/CreateWorld.tsx b/src/react/CreateWorld.tsx index ceed77ec..87b36777 100644 --- a/src/react/CreateWorld.tsx +++ b/src/react/CreateWorld.tsx @@ -8,17 +8,19 @@ import styles from './createWorld.module.css' // const worldTypes = ['default', 'flat', 'largeBiomes', 'amplified', 'customized', 'buffet', 'debug_all_block_states'] const worldTypes = ['default', 'flat'/* , 'void' */] +const gameModes = ['survival', 'creative'/* , 'adventure', 'spectator' */] export const creatingWorldState = proxy({ title: '', type: worldTypes[0], + gameMode: gameModes[0], version: '' }) export default ({ cancelClick, createClick, customizeClick, versions, defaultVersion }) => { const [quota, setQuota] = useState('') - const { title, type, version } = useSnapshot(creatingWorldState) + const { title, type, version, gameMode } = useSnapshot(creatingWorldState) useEffect(() => { creatingWorldState.version = defaultVersion void navigator.storage?.estimate?.().then(({ quota, usage }) => { @@ -54,9 +56,15 @@ export default ({ cancelClick, createClick, customizeClick, versions, defaultVer - + {/* */} +
Default and other world types are WIP
diff --git a/src/react/CreateWorldProvider.tsx b/src/react/CreateWorldProvider.tsx index 728e47ff..0f99ec42 100644 --- a/src/react/CreateWorldProvider.tsx +++ b/src/react/CreateWorldProvider.tsx @@ -3,8 +3,8 @@ import { hideCurrentModal, showModal } from '../globalState' import defaultLocalServerOptions from '../defaultLocalServerOptions' import { mkdirRecursive, uniqueFileNameFromWorldName } from '../browserfs' import CreateWorld, { WorldCustomize, creatingWorldState } from './CreateWorld' -import { useIsModalActive } from './utilsApp' import { getWorldsPath } from './SingleplayerProvider' +import { useIsModalActive } from './utilsApp' export default () => { const activeCreate = useIsModalActive('create-world') @@ -23,7 +23,7 @@ export default () => { }} createClick={async () => { // create new world - const { title, type, version } = creatingWorldState + const { title, type, version, gameMode } = creatingWorldState // todo display path in ui + disable if exist const savePath = await uniqueFileNameFromWorldName(title, getWorldsPath()) await mkdirRecursive(savePath) @@ -51,7 +51,8 @@ export default () => { levelName: title, version, generation, - 'worldFolder': savePath + 'worldFolder': savePath, + gameMode: gameMode === 'survival' ? 0 : 1, }, })) }} diff --git a/src/react/Crosshair.tsx b/src/react/Crosshair.tsx index ab289db8..9079fb66 100644 --- a/src/react/Crosshair.tsx +++ b/src/react/Crosshair.tsx @@ -12,7 +12,7 @@ export const itemBeingUsed = proxy({ export default () => { const { name: usingItem, hand } = useSnapshot(itemBeingUsed) - const [displayIndicator, setDisplayIndicator] = useState(true) + const [displayIndicator, setDisplayIndicator] = useState(false) const [indicatorProgress, setIndicatorProgress] = useState(0) const [alternativeIndicator, setAlternativeIndicator] = useState(false) const boxMaxTimeMs = 1000 diff --git a/src/workerWorkaround.ts b/src/workerWorkaround.ts new file mode 100644 index 00000000..00419b8c --- /dev/null +++ b/src/workerWorkaround.ts @@ -0,0 +1,2 @@ +global = globalThis +globalThis.window = globalThis diff --git a/tsconfig.json b/tsconfig.json index 5d018a46..dbbb9ced 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,7 +15,7 @@ "forceConsistentCasingInFileNames": true, "useUnknownInCatchVariables": false, "skipLibCheck": true, - "experimentalDecorators": true, + "strictBindCallApply": true, // this the only options that allows smooth transition from js to ts (by not dropping types from js files) // however might need to consider includeing *only needed libraries* instead of using this "maxNodeModuleJsDepth": 1, From e129184ff1d14388a0d4d7b2d5a57e5a7f031422 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Mon, 27 May 2024 10:14:42 +0300 Subject: [PATCH 0211/1195] fix tsc --- src/workerWorkaround.ts | 2 ++ tsconfig.json | 1 + 2 files changed, 3 insertions(+) diff --git a/src/workerWorkaround.ts b/src/workerWorkaround.ts index 00419b8c..7fad22cf 100644 --- a/src/workerWorkaround.ts +++ b/src/workerWorkaround.ts @@ -1,2 +1,4 @@ +//@ts-nocheck +// eslint-disable-next-line no-global-assign global = globalThis globalThis.window = globalThis diff --git a/tsconfig.json b/tsconfig.json index dbbb9ced..454e60cb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,6 +15,7 @@ "forceConsistentCasingInFileNames": true, "useUnknownInCatchVariables": false, "skipLibCheck": true, + "experimentalDecorators": true, "strictBindCallApply": true, // this the only options that allows smooth transition from js to ts (by not dropping types from js files) // however might need to consider includeing *only needed libraries* instead of using this From 68269ee975f7c1f0d620dc6aac02b3efe2d5b533 Mon Sep 17 00:00:00 2001 From: gguio <109200692+gguio@users.noreply.github.com> Date: Mon, 27 May 2024 12:24:28 +0400 Subject: [PATCH 0212/1195] feat: Screenshot on F2 and hide/show UI on F1 (#136) Co-authored-by: gguio --- src/controls.ts | 18 ++++++++++++++++++ src/globalState.ts | 1 + src/index.ts | 2 ++ src/reactUi.tsx | 4 +++- 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/controls.ts b/src/controls.ts index f940d59d..a3a22029 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -651,6 +651,24 @@ window.addEventListener('keydown', (e) => { } }) +window.addEventListener('keydown', (e) => { + if (e.code !== 'F2' || e.repeat || !isGameActive(true)) return + e.preventDefault() + const canvas = document.getElementById('viewer-canvas') as HTMLCanvasElement + if (!canvas) return + const link = document.createElement('a') + link.href = canvas.toDataURL('image/png') + const date = new Date() + link.download = `screenshot ${date.toLocaleString().replaceAll('.', '-').replace(',', '')}.png` + link.click() +}) + +window.addEventListener('keydown', (e) => { + if (e.code !== 'F1' || e.repeat || !isGameActive(true)) return + e.preventDefault() + miscUiState.showUI = !miscUiState.showUI +}) + // #region experimental debug things window.addEventListener('keydown', (e) => { if (e.code === 'F11') { diff --git a/src/globalState.ts b/src/globalState.ts index 4b62f8d6..b7dc1602 100644 --- a/src/globalState.ts +++ b/src/globalState.ts @@ -138,6 +138,7 @@ export const miscUiState = proxy({ wanOpened: false, /** wether game hud is shown (in playing state) */ gameLoaded: false, + showUI: true, loadedServerIndex: '', /** currently trying to load or loaded mc version, after all data is loaded */ loadedDataVersion: null as string | null, diff --git a/src/index.ts b/src/index.ts index 89baaa10..d02f7b92 100644 --- a/src/index.ts +++ b/src/index.ts @@ -108,6 +108,8 @@ let renderer: THREE.WebGLRenderer try { renderer = new THREE.WebGLRenderer({ powerPreference: options.gpuPreference, + preserveDrawingBuffer: true, + logarithmicDepthBuffer: true, }) } catch (err) { console.error(err) diff --git a/src/reactUi.tsx b/src/reactUi.tsx index d86cf202..497f091f 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -143,6 +143,8 @@ const WidgetDisplay = ({ name, Component }) => { } const App = () => { + const { showUI } = useSnapshot(miscUiState) + return
@@ -154,7 +156,7 @@ const App = () => {
- + {showUI && } From cbaeb8c9186be140634f577d9396f129e39b81e0 Mon Sep 17 00:00:00 2001 From: gguio <109200692+gguio@users.noreply.github.com> Date: Tue, 28 May 2024 13:34:22 +0400 Subject: [PATCH 0213/1195] fix hide ui was resetting state (#138) --- src/reactUi.tsx | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/reactUi.tsx b/src/reactUi.tsx index 497f091f..ab1e4ae5 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -95,7 +95,7 @@ const InGameComponent = ({ children }) => { } const InGameUi = () => { - const { gameLoaded } = useSnapshot(miscUiState) + const { gameLoaded, showUI } = useSnapshot(miscUiState) if (!gameLoaded) return return <> @@ -107,17 +107,21 @@ const InGameUi = () => { - - - +
+ + + + +
- - - - - +
+ + + +
+ {showUI && }
From def2baba8fd728a16f38feb9649b3a4b95d6a12e Mon Sep 17 00:00:00 2001 From: Vitaly Date: Tue, 28 May 2024 18:52:15 +0300 Subject: [PATCH 0214/1195] rm unused pmui-playscreen --- index.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/index.html b/index.html index 3e921855..6d3b326b 100644 --- a/index.html +++ b/index.html @@ -94,9 +94,7 @@
-
- -
+
From 295967cc4d6ff4b5b9f83b6fe4f6b2c7f4600158 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 29 May 2024 10:56:57 +0300 Subject: [PATCH 0215/1195] fix inspectPacket function --- src/devtools.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devtools.ts b/src/devtools.ts index 4dbeb51d..e836af02 100644 --- a/src/devtools.ts +++ b/src/devtools.ts @@ -29,7 +29,7 @@ window.len = (obj) => Object.keys(obj).length window.inspectPacket = (packetName, full = false) => { const listener = (...args) => console.log('packet', packetName, full ? args : args[0]) const attach = () => { - bot?.on(packetName, listener) + bot?._client.on(packetName, listener) } attach() customEvents.on('mineflayerBotCreated', attach) From d96ff9ef3a23fc130a0133cc5c2b67dfa41da538 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 29 May 2024 11:16:42 +0300 Subject: [PATCH 0216/1195] fix: was unable to go edit server screen after hitting cancel --- src/react/ServersListProvider.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/react/ServersListProvider.tsx b/src/react/ServersListProvider.tsx index bd39bc10..bb23004f 100644 --- a/src/react/ServersListProvider.tsx +++ b/src/react/ServersListProvider.tsx @@ -186,6 +186,12 @@ const Inner = () => { } }, [serverEditScreen]) + useDidUpdateEffect(() => { + if (!isEditScreenModal) { + setServerEditScreen(null) + } + }, [isEditScreenModal]) + if (isEditScreenModal) { return Date: Sat, 1 Jun 2024 10:36:04 +0300 Subject: [PATCH 0217/1195] fix: page was reloading infinitely in some edge cases, give some time service workers to unregister in these cases --- src/react/MainMenu.tsx | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/react/MainMenu.tsx b/src/react/MainMenu.tsx index f99b6b98..3e3170f4 100644 --- a/src/react/MainMenu.tsx +++ b/src/react/MainMenu.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from 'react' import { openURL } from 'prismarine-viewer/viewer/lib/simpleUtils' import { haveDirectoryPicker } from '../utils' +import { activeModalStack } from '../globalState' import styles from './mainMenu.module.css' import Button from './Button' import ButtonWithTooltip from './ButtonWithTooltip' @@ -17,12 +18,24 @@ interface Props { mapsProvider?: string } -const refreshApp = async () => { +const refreshApp = async (failedUpdate = false) => { const registration = await navigator.serviceWorker.getRegistration() await registration?.unregister() - window.justReloaded = true - sessionStorage.justReloaded = true - window.location.reload() + if (failedUpdate) { + await new Promise(resolve => { + setTimeout(resolve, 2000) + }) + } + if (activeModalStack.length !== 0) return + if (failedUpdate) { + sessionStorage.justReloaded = false + // try to force bypass cache + location.search = '?update=true' + } else { + window.justReloaded = true + sessionStorage.justReloaded = true + window.location.reload() + } } const httpsRegex = /^https?:\/\// @@ -40,10 +53,10 @@ export default ({ connectToServerAction, mapsProvider, singleplayerAction, optio const contents = await f.text() const isLatest = contents === process.env.BUILD_VERSION if (!isLatest && sessionStorage.justReloaded) { - // try to force bypass cache - location.search = '?update=true' + setVersionStatus('(force reloading, wait)') + void refreshApp(true) + return } - sessionStorage.justReloaded = false setVersionStatus(`(${isLatest ? 'latest' : 'new version available'})`) setVersionTitle(`Loaded: ${process.env.BUILD_VERSION}. Remote: ${contents}`) }, () => { }) From c5e636f2416312cf58c8a84cb0937f5cad007c23 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 2 Jun 2024 00:59:23 +0300 Subject: [PATCH 0218/1195] fix (and now check) hide ui --- src/reactUi.tsx | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/reactUi.tsx b/src/reactUi.tsx index ab1e4ae5..2f57e6f0 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -101,19 +101,19 @@ const InGameUi = () => { return <> {/* apply scaling */} - - - - - -
+ + + + + + +
-
@@ -129,7 +129,7 @@ const InGameUi = () => { {/* because of z-index */} - + {showUI && } @@ -147,8 +147,6 @@ const WidgetDisplay = ({ name, Component }) => { } const App = () => { - const { showUI } = useSnapshot(miscUiState) - return
@@ -160,7 +158,7 @@ const App = () => {
- {showUI && } + From 0b2e92c8606a66782243fc632985b569178112f2 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 2 Jun 2024 10:29:29 +0300 Subject: [PATCH 0219/1195] fix sentry 5431874132 --- src/react/HotbarRenderApp.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/react/HotbarRenderApp.tsx b/src/react/HotbarRenderApp.tsx index 02689485..9c6dbe40 100644 --- a/src/react/HotbarRenderApp.tsx +++ b/src/react/HotbarRenderApp.tsx @@ -88,7 +88,7 @@ export default () => { return } const hotbarSlot = slot - bot.inventory.hotbarStart - if (hotbarSlot < 0 || hotbarSlot > 9) return + if (hotbarSlot < 0 || hotbarSlot > 8) return bot.setQuickBarSlot(hotbarSlot) }, } as any) From b317d8ad354e375b4a00c146eafeebf4d86a4170 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 2 Jun 2024 14:20:21 +0300 Subject: [PATCH 0220/1195] fix: reduce fps drops on chunks load a bit by batching operations with a few other minor optimizations --- prismarine-viewer/viewer/lib/entities.js | 39 +++++++++-------- prismarine-viewer/viewer/lib/mesher/mesher.ts | 36 +++++++++++++++- prismarine-viewer/viewer/lib/threeJsUtils.ts | 8 ++-- .../viewer/lib/worldDataEmitter.ts | 11 ++++- .../viewer/lib/worldrendererCommon.ts | 34 +++++++++++++-- .../viewer/lib/worldrendererThree.ts | 43 ++++++++++++++++--- src/optionsGuiScheme.tsx | 3 +- src/react/DebugOverlay.tsx | 26 ++++++----- src/watchOptions.ts | 2 +- src/worldInteractions.ts | 1 + 10 files changed, 153 insertions(+), 50 deletions(-) diff --git a/prismarine-viewer/viewer/lib/entities.js b/prismarine-viewer/viewer/lib/entities.js index 930f62c9..28fc6d89 100644 --- a/prismarine-viewer/viewer/lib/entities.js +++ b/prismarine-viewer/viewer/lib/entities.js @@ -17,7 +17,7 @@ import { disposeObject } from './threeJsUtils' export const TWEEN_DURATION = 50 // todo should be 100 -function getUsernameTexture (username, { fontFamily = 'sans-serif' }) { +function getUsernameTexture(username, { fontFamily = 'sans-serif' }) { const canvas = document.createElement('canvas') const ctx = canvas.getContext('2d') if (!ctx) throw new Error('Could not get 2d context') @@ -61,7 +61,7 @@ const addNametag = (entity, options, mesh) => { // todo cleanup const nametags = {} -function getEntityMesh (entity, scene, options, overrides) { +function getEntityMesh(entity, scene, options, overrides) { if (entity.name) { try { // https://github.com/PrismarineJS/prismarine-viewer/pull/410 @@ -94,18 +94,19 @@ function getEntityMesh (entity, scene, options, overrides) { export class Entities extends EventEmitter { constructor(scene) { super() + /** @type {THREE.Scene} */ this.scene = scene this.entities = {} this.entitiesOptions = {} this.debugMode = 'none' this.onSkinUpdate = () => { } this.clock = new THREE.Clock() - this.visible = true + this.rendering = true this.itemsTexture = null this.getItemUv = undefined } - clear () { + clear() { for (const mesh of Object.values(this.entities)) { this.scene.remove(mesh) disposeObject(mesh) @@ -113,7 +114,7 @@ export class Entities extends EventEmitter { this.entities = {} } - setDebugMode (mode, /** @type {THREE.Object3D?} */entity = null) { + setDebugMode(mode, /** @type {THREE.Object3D?} */entity = null) { this.debugMode = mode for (const mesh of entity ? [entity] : Object.values(this.entities)) { const boxHelper = mesh.children.find(c => c.name === 'debug') @@ -125,14 +126,18 @@ export class Entities extends EventEmitter { } } - setVisible (visible, /** @type {THREE.Object3D?} */entity = null) { - this.visible = visible - for (const mesh of entity ? [entity] : Object.values(this.entities)) { - mesh.visible = visible + setRendering(rendering, /** @type {THREE.Object3D?} */entity = null) { + this.rendering = rendering + for (const ent of entity ? [entity] : Object.values(this.entities)) { + if (rendering) { + if (!this.scene.children.includes(ent)) this.scene.add(ent) + } else { + this.scene.remove(ent) + } } } - render () { + render() { const dt = this.clock.getDelta() for (const entityId of Object.keys(this.entities)) { const playerObject = this.getPlayerObject(entityId) @@ -142,7 +147,7 @@ export class Entities extends EventEmitter { } } - getPlayerObject (entityId) { + getPlayerObject(entityId) { /** @type {(PlayerObject & { animation?: PlayerAnimation }) | undefined} */ const playerObject = this.entities[entityId]?.playerObject return playerObject @@ -152,7 +157,7 @@ export class Entities extends EventEmitter { defaultSteveTexture // true means use default skin url - updatePlayerSkin (entityId, username, /** @type {string | true} */skinUrl, /** @type {string | true | undefined} */capeUrl = undefined) { + updatePlayerSkin(entityId, username, /** @type {string | true} */skinUrl, /** @type {string | true | undefined} */capeUrl = undefined) { let playerObject = this.getPlayerObject(entityId) if (!playerObject) return // const username = this.entities[entityId].username @@ -235,14 +240,14 @@ export class Entities extends EventEmitter { playerObject.cape.map = null } - function isCanvasBlank (canvas) { + function isCanvasBlank(canvas) { return !canvas.getContext('2d') .getImageData(0, 0, canvas.width, canvas.height).data .some(channel => channel !== 0) } } - playAnimation (entityPlayerId, /** @type {'walking' | 'running' | 'oneSwing' | 'idle'} */animation) { + playAnimation(entityPlayerId, /** @type {'walking' | 'running' | 'oneSwing' | 'idle'} */animation) { const playerObject = this.getPlayerObject(entityPlayerId) if (!playerObject) return @@ -262,14 +267,14 @@ export class Entities extends EventEmitter { } - displaySimpleText (jsonLike) { + displaySimpleText(jsonLike) { if (!jsonLike) return const parsed = typeof jsonLike === 'string' ? mojangson.simplify(mojangson.parse(jsonLike)) : nbt.simplify(jsonLike) const text = flat(parsed).map(x => x.text) return text.join('') } - update (/** @type {import('prismarine-entity').Entity & {delete?, pos}} */entity, overrides) { + update(/** @type {import('prismarine-entity').Entity & {delete?, pos}} */entity, overrides) { let isPlayerModel = entity.name === 'player' if (entity.name === 'zombie' || entity.name === 'zombie_villager' || entity.name === 'husk') { isPlayerModel = true @@ -392,7 +397,7 @@ export class Entities extends EventEmitter { this.updatePlayerSkin(entity.id, '', overrides?.texture || stevePng) } this.setDebugMode(this.debugMode, group) - this.setVisible(this.visible, group) + this.setRendering(this.rendering, group) } //@ts-ignore diff --git a/prismarine-viewer/viewer/lib/mesher/mesher.ts b/prismarine-viewer/viewer/lib/mesher/mesher.ts index bc1d3bbb..d0c82280 100644 --- a/prismarine-viewer/viewer/lib/mesher/mesher.ts +++ b/prismarine-viewer/viewer/lib/mesher/mesher.ts @@ -19,6 +19,29 @@ function sectionKey (x, y, z) { return `${x},${y},${z}` } +const batchMessagesLimit = 100 + +let queuedMessages = [] as any[] +let queueWaiting = false +const postMessage = (data, transferList = []) => { + queuedMessages.push({ data, transferList }) + if (queuedMessages.length > batchMessagesLimit) { + drainQueue(0, batchMessagesLimit) + } + if (queueWaiting) return + queueWaiting = true + setTimeout(() => { + queueWaiting = false + drainQueue(0, queuedMessages.length) + }) +} + +function drainQueue (from, to) { + const messages = queuedMessages.slice(from, to) + global.postMessage(messages.map(m => m.data), messages.flatMap(m => m.transferList) as unknown as string) + queuedMessages = queuedMessages.slice(to) +} + function setSectionDirty (pos, value = true) { const x = Math.floor(pos.x / 16) * 16 const y = Math.floor(pos.y / 16) * 16 @@ -43,7 +66,7 @@ const softCleanup = () => { world = new World(world.config.version) } -self.onmessage = ({ data }) => { +const handleMessage = data => { const globalVar: any = globalThis if (data.type === 'mcData') { @@ -52,7 +75,7 @@ self.onmessage = ({ data }) => { if (data.config) { world ??= new World(data.config.version) - world.config = {...world.config, ...data.config} + world.config = { ...world.config, ...data.config } globalThis.world = world } @@ -80,6 +103,15 @@ self.onmessage = ({ data }) => { } } +self.onmessage = ({ data }) => { + if (Array.isArray(data)) { + data.forEach(handleMessage) + return + } + + handleMessage(data) +} + setInterval(() => { if (world === null || !blockStatesReady) return diff --git a/prismarine-viewer/viewer/lib/threeJsUtils.ts b/prismarine-viewer/viewer/lib/threeJsUtils.ts index e4f9404b..ee22c477 100644 --- a/prismarine-viewer/viewer/lib/threeJsUtils.ts +++ b/prismarine-viewer/viewer/lib/threeJsUtils.ts @@ -1,12 +1,12 @@ -import * as THREE from 'three'; +import * as THREE from 'three' export const disposeObject = (obj: THREE.Object3D) => { // not cleaning texture there as it might be used by other objects, but would be good to also do that if (obj instanceof THREE.Mesh) { - obj.geometry?.dispose?.(); - obj.material?.dispose?.(); + obj.geometry?.dispose?.() + obj.material?.dispose?.() } if (obj.children) { - obj.children.forEach(disposeObject); + obj.children.forEach(disposeObject) } } diff --git a/prismarine-viewer/viewer/lib/worldDataEmitter.ts b/prismarine-viewer/viewer/lib/worldDataEmitter.ts index 40cc3413..3a8fbd40 100644 --- a/prismarine-viewer/viewer/lib/worldDataEmitter.ts +++ b/prismarine-viewer/viewer/lib/worldDataEmitter.ts @@ -129,6 +129,15 @@ export class WorldDataEmitter extends EventEmitter { } } + readdDebug () { + const clonedLoadedChunks = { ...this.loadedChunks } + this.unloadAllChunks() + for (const loadedChunk in clonedLoadedChunks) { + const [x, z] = loadedChunk.split(',').map(Number) + this.loadChunk(new Vec3(x, 0, z)) + } + } + async loadChunk (pos: ChunkPos, isLightUpdate = false) { const [botX, botZ] = chunkPos(this.lastPos) const dx = Math.abs(botX - Math.floor(pos.x / 16)) @@ -187,7 +196,7 @@ export class WorldDataEmitter extends EventEmitter { const positions = generateSpiralMatrix(this.viewDistance).map(([x, z]) => { const pos = new Vec3((botX + x) * 16, 0, (botZ + z) * 16) if (!this.loadedChunks[`${pos.x},${pos.z}`]) return pos - return undefined + return undefined! }).filter(a => !!a) this.lastPos.update(pos) await this._loadChunks(positions) diff --git a/prismarine-viewer/viewer/lib/worldrendererCommon.ts b/prismarine-viewer/viewer/lib/worldrendererCommon.ts index d1786650..1a87fa5d 100644 --- a/prismarine-viewer/viewer/lib/worldrendererCommon.ts +++ b/prismarine-viewer/viewer/lib/worldrendererCommon.ts @@ -73,10 +73,10 @@ export abstract class WorldRendererCommon const src = typeof window === 'undefined' ? `${__dirname}/${workerName}` : workerName const worker: any = new Worker(src) - worker.onmessage = async ({ data }) => { + const handleMessage = (data) => { if (!this.active) return this.handleWorkerMessage(data) - await new Promise(resolve => { + new Promise(resolve => { setTimeout(resolve, 0) }) if (data.type === 'sectionFinished') { @@ -105,6 +105,13 @@ export abstract class WorldRendererCommon this.renderUpdateEmitter.emit('update') } } + worker.onmessage = ({ data }) => { + if (Array.isArray(data)) { + data.forEach(handleMessage) + return + } + handleMessage(data) + } if (worker.on) worker.on('message', (data) => { worker.onmessage({ data }) }) this.workers.push(worker) } @@ -215,6 +222,7 @@ export abstract class WorldRendererCommon } addColumn (x: number, z: number, chunk: any, isLightUpdate: boolean) { + if (!this.active) return if (this.workers.length === 0) throw new Error('workers not initialized yet') this.initialChunksLoad = false this.loadedChunks[`${x},${z}`] = true @@ -256,6 +264,9 @@ export abstract class WorldRendererCommon if ((pos.z & 15) === 15) this.setSectionDirty(pos.offset(0, 0, 16)) } + queueAwaited = false + messagesQueue = {} as { [workerIndex: string]: any[] } + setSectionDirty (pos: Vec3, value = true) { if (this.viewDistance === -1) throw new Error('viewDistance not set') this.allChunksFinished = false @@ -269,7 +280,9 @@ export abstract class WorldRendererCommon // is always dispatched to the same worker const hash = mod(Math.floor(pos.x / 16) + Math.floor(pos.y / 16) + Math.floor(pos.z / 16), this.workers.length) this.sectionsOutstanding.set(key, (this.sectionsOutstanding.get(key) ?? 0) + 1) - this.workers[hash].postMessage({ + this.messagesQueue[hash] ??= [] + this.messagesQueue[hash].push({ + // this.workers[hash].postMessage({ type: 'dirty', x: pos.x, y: pos.y, @@ -277,6 +290,21 @@ export abstract class WorldRendererCommon value, config: this.mesherConfig, }) + this.dispatchMessages() + } + + dispatchMessages () { + if (this.queueAwaited) return + this.queueAwaited = true + setTimeout(() => { + // group messages and send as one + for (const workerIndex in this.messagesQueue) { + const worker = this.workers[Number(workerIndex)] + worker.postMessage(this.messagesQueue[workerIndex]) + } + this.messagesQueue = {} + this.queueAwaited = false + }) } // Listen for chunk rendering updates emitted if a worker finished a render and resolve if the number diff --git a/prismarine-viewer/viewer/lib/worldrendererThree.ts b/prismarine-viewer/viewer/lib/worldrendererThree.ts index 60156a50..4d28519a 100644 --- a/prismarine-viewer/viewer/lib/worldrendererThree.ts +++ b/prismarine-viewer/viewer/lib/worldrendererThree.ts @@ -16,6 +16,7 @@ export class WorldRendererThree extends WorldRendererCommon { chunkTextures = new Map() signsCache = new Map() starField: StarField + cameraSectionPos: Vec3 = new Vec3(0, 0, 0) get tilesRendered () { return Object.values(this.sectionObjects).reduce((acc, obj) => acc + (obj as any).tilesCount, 0) @@ -42,16 +43,18 @@ export class WorldRendererThree extends WorldRendererCommon { */ updatePosDataChunk (key: string) { const [x, y, z] = key.split(',').map(x => Math.floor(+x / 16)) - const [xPlayer, yPlayer, zPlayer] = this.camera.position.toArray().map(x => Math.floor(x / 16)) // sum of distances: x + y + z - const chunkDistance = Math.abs(x - xPlayer) + Math.abs(y - yPlayer) + Math.abs(z - zPlayer) + const chunkDistance = Math.abs(x - this.cameraSectionPos.x) + Math.abs(y - this.cameraSectionPos.y) + Math.abs(z - this.cameraSectionPos.z) const section = this.sectionObjects[key].children.find(child => child.name === 'mesh')! section.renderOrder = 500 - chunkDistance } updateViewerPosition (pos: Vec3): void { this.viewerPosition = pos - for (const [key, value] of Object.entries(this.sectionObjects)) { + const cameraPos = this.camera.position.toArray().map(x => Math.floor(x / 16)) as [number, number, number] + this.cameraSectionPos = new Vec3(...cameraPos) + for (const key in this.sectionObjects) { + const value = this.sectionObjects[key] if (!value) continue this.updatePosDataChunk(key) } @@ -95,7 +98,10 @@ export class WorldRendererThree extends WorldRendererCommon { mesh.name = 'mesh' object = new THREE.Group() object.add(mesh) - const boxHelper = new THREE.BoxHelper(mesh, 0xffff00) + // mesh with static dimensions: 16x16x16 + const staticChunkMesh = new THREE.Mesh(new THREE.BoxGeometry(16, 16, 16), new THREE.MeshBasicMaterial({ color: 0x000000, transparent: true, opacity: 0 })) + staticChunkMesh.position.set(data.geometry.sx, data.geometry.sy, data.geometry.sz) + const boxHelper = new THREE.BoxHelper(staticChunkMesh, 0xffff00) boxHelper.name = 'helper' object.add(boxHelper) object.name = 'chunk' @@ -117,6 +123,11 @@ export class WorldRendererThree extends WorldRendererCommon { } this.sectionObjects[data.key] = object this.updatePosDataChunk(data.key) + object.matrixAutoUpdate = false + mesh.onAfterRender = (renderer, scene, camera, geometry, material, group) => { + // mesh.matrixAutoUpdate = false + } + this.scene.add(object) } @@ -253,6 +264,24 @@ export class WorldRendererThree extends WorldRendererCommon { } } + readdChunks () { + for (const key of Object.keys(this.sectionObjects)) { + this.scene.remove(this.sectionObjects[key]) + } + setTimeout(() => { + for (const key of Object.keys(this.sectionObjects)) { + this.scene.add(this.sectionObjects[key]) + } + }, 500) + } + + disableUpdates (children = this.scene.children) { + for (const child of children) { + child.matrixWorldNeedsUpdate = false + this.disableUpdates(child.children ?? []) + } + } + removeColumn (x, z) { super.removeColumn(x, z) @@ -332,7 +361,7 @@ class StarField { this.points = new THREE.Points(geometry, material) this.scene.add(this.points) - const clock = new THREE.Clock(); + const clock = new THREE.Clock() this.points.onBeforeRender = (renderer, scene, camera) => { this.points?.position.copy?.(camera.position) material.uniforms.time.value = clock.getElapsedTime() * speed @@ -342,10 +371,10 @@ class StarField { remove () { if (this.points) { this.points.geometry.dispose(); - (this.points.material as THREE.Material).dispose(); + (this.points.material as THREE.Material).dispose() this.scene.remove(this.points) - this.points = undefined; + this.points = undefined } } } diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index 88e6115f..9be844d3 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -69,7 +69,8 @@ export const guiOptionsScheme: { enableWarning: 'Enabling it will make chunks load ~4x slower', disabledDuringGame: true }, - starfieldRendering: {} + starfieldRendering: {}, + renderEntities: {}, }, ], main: [ diff --git a/src/react/DebugOverlay.tsx b/src/react/DebugOverlay.tsx index 4b3c19b1..dd288b49 100644 --- a/src/react/DebugOverlay.tsx +++ b/src/react/DebugOverlay.tsx @@ -83,6 +83,16 @@ export default () => { packetsCountByNamePerSec.current.sent = {} }, 1000) + const freqUpdateInterval = setInterval(() => { + setPos(prev => { return { ...bot.entity.position } }) + setSkyL(prev => bot.world.getSkyLight(bot.entity.position)) + setBlockL(prev => bot.world.getBlockLight(bot.entity.position)) + setBiomeId(prev => bot.world.getBiome(bot.entity.position)) + setDimension(bot.game.dimension) + setDay(bot.time.day) + setCursorBlock(worldInteractions.cursorBlock) + }, 100) + // @ts-expect-error bot._client.on('packet', readPacket) // @ts-expect-error @@ -91,25 +101,12 @@ export default () => { sent.current.count++ managePackets('sent', name, data) }) - bot.on('move', () => { - setPos(prev => { return { ...bot.entity.position }}) - setSkyL(prev => bot.world.getSkyLight(bot.entity.position)) - setBlockL(prev => bot.world.getBlockLight(bot.entity.position)) - setBiomeId(prev => bot.world.getBiome(bot.entity.position)) - setDimension(bot.game.dimension) - }) - bot.on('time', () => { - setDay(bot.time.day) - }) bot.on('entitySpawn', () => { setEntitiesCount(Object.values(bot.entities).length) }) bot.on('entityGone', () => { setEntitiesCount(Object.values(bot.entities).length) }) - bot.on('physicsTick', () => { - setCursorBlock(worldInteractions.cursorBlock) - }) try { const gl = window.renderer.getContext() @@ -121,6 +118,7 @@ export default () => { return () => { document.removeEventListener('keydown', handleF3) clearInterval(packetsUpdateInterval) + clearInterval(freqUpdateInterval) } }, []) @@ -169,7 +167,7 @@ export default () => { ) } ) - : '' } + : ''} {cursorBlock ? (

Looking at: {cursorBlock.position.x} {cursorBlock.position.y} {cursorBlock.position.z}

) : ''} diff --git a/src/watchOptions.ts b/src/watchOptions.ts index 4ff34be4..e379cb50 100644 --- a/src/watchOptions.ts +++ b/src/watchOptions.ts @@ -41,7 +41,7 @@ export const watchOptionsAfterViewerInit = () => { }) watchValue(options, o => { - viewer.entities.setVisible(o.renderEntities) + viewer.entities.setRendering(o.renderEntities) }) // viewer.world.mesherConfig.smoothLighting = options.smoothLighting diff --git a/src/worldInteractions.ts b/src/worldInteractions.ts index 239c02c2..330dabd7 100644 --- a/src/worldInteractions.ts +++ b/src/worldInteractions.ts @@ -73,6 +73,7 @@ class WorldInteraction { this.blockBreakMesh = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), breakMaterial) this.blockBreakMesh.visible = false this.blockBreakMesh.renderOrder = 999 + this.blockBreakMesh.name = 'blockBreakMesh' viewer.scene.add(this.blockBreakMesh) // Setup events From 95b80d93ba95cc887ccdf964484c396ab2cb06ee Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 4 Jun 2024 01:45:33 +0300 Subject: [PATCH 0221/1195] fix: waterlogged z-fighting fix --- prismarine-viewer/viewer/lib/mesher/models.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/prismarine-viewer/viewer/lib/mesher/models.ts b/prismarine-viewer/viewer/lib/mesher/models.ts index 40b82ea2..39148aaa 100644 --- a/prismarine-viewer/viewer/lib/mesher/models.ts +++ b/prismarine-viewer/viewer/lib/mesher/models.ts @@ -35,7 +35,7 @@ function prepareTints (tints) { }) } -const calculatedBlocksEntries = Object.entries(legacyJson.clientCalculatedBlocks); +const calculatedBlocksEntries = Object.entries(legacyJson.clientCalculatedBlocks) export function preflatBlockCalculation (block: Block, world: World, position: Vec3) { const type = calculatedBlocksEntries.find(([name, blocks]) => blocks.includes(block.name))?.[0] if (!type) return @@ -239,9 +239,9 @@ function renderLiquid (world, cursor, texture, type, biome, water, attr) { for (const pos of corners) { const height = cornerHeights[pos[2] * 2 + pos[0]] attr.t_positions.push( - (pos[0] ? 1 : 0) + (cursor.x & 15) - 8, - (pos[1] ? height : 0) + (cursor.y & 15) - 8, - (pos[2] ? 1 : 0) + (cursor.z & 15) - 8) + (pos[0] ? 0.999 : 0.001) + (cursor.x & 15) - 8, + (pos[1] ? height - 0.001 : 0.001) + (cursor.y & 15) - 8, + (pos[2] ? 0.999 : 0.001) + (cursor.z & 15) - 8) attr.t_normals.push(...dir) attr.t_uvs.push(pos[3] * su + u, pos[4] * sv * (pos[1] ? 1 : height) + v) attr.t_colors.push(tint[0], tint[1], tint[2]) From 28e24a7a870a8b217f4d1d3b85f2b39473765c4f Mon Sep 17 00:00:00 2001 From: Wolf2323 Date: Tue, 4 Jun 2024 01:34:29 +0200 Subject: [PATCH 0222/1195] fix: fix rendering of Decorated Pot (#134) --- .../viewer/lib/mesher/test/tests.test.ts | 1 - prismarine-viewer/viewer/prepare/atlas.ts | 42 ++++++++++++--- .../blockModels/1.20/decorated_pot.json | 47 +++++++++++++++++ .../blockStates/1.20/decorated_pot.json | 19 +++++++ .../data/1.20/blockModels/decorated_pot.json | 47 +++++++++++++++++ .../data/1.20/blockStates/decorated_pot.json | 19 +++++++ .../viewer/prepare/moreGeneratedBlocks.ts | 51 +++++++++++++++++-- 7 files changed, 214 insertions(+), 12 deletions(-) create mode 100644 prismarine-viewer/viewer/prepare/blockModels/1.20/decorated_pot.json create mode 100644 prismarine-viewer/viewer/prepare/blockStates/1.20/decorated_pot.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/decorated_pot.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/decorated_pot.json diff --git a/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts b/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts index 75dd98fa..5a80fa49 100644 --- a/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts +++ b/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts @@ -77,7 +77,6 @@ test('Known blocks are not rendered', () => { "cyan_wall_banner": true, "dark_oak_hanging_sign": true, "dark_oak_wall_hanging_sign": true, - "decorated_pot": true, "dragon_head": true, "dragon_wall_head": true, "end_gateway": true, diff --git a/prismarine-viewer/viewer/prepare/atlas.ts b/prismarine-viewer/viewer/prepare/atlas.ts index cb30b727..fc3e4029 100644 --- a/prismarine-viewer/viewer/prepare/atlas.ts +++ b/prismarine-viewer/viewer/prepare/atlas.ts @@ -35,7 +35,7 @@ export type JsonAtlas = { } } -export const makeTextureAtlas = (input: string[], getInputData: (name) => { contents: string, tileWidthMult?: number }, tilesCount = input.length, suSvOptimize: 'remove' | null = null): { +export const makeTextureAtlas = (input: string[], getInputData: (name) => { contents: string, tileWidthMult?: number, origSizeTextures?}, tilesCount = input.length, suSvOptimize: 'remove' | null = null): { image: Buffer, canvas: Canvas, json: JsonAtlas @@ -49,6 +49,7 @@ export const makeTextureAtlas = (input: string[], getInputData: (name) => { cont const texturesIndex = {} + let skipXY = [] as [x: number, y: number][] let offset = 0 const suSv = tileSize / imgSize for (const i in input) { @@ -56,20 +57,44 @@ export const makeTextureAtlas = (input: string[], getInputData: (name) => { cont const x = (pos % texSize) * tileSize const y = Math.floor(pos / texSize) * tileSize + if (skipXY.some(([sx, sy]) => sx === x + 1 && sy === y)) { + // todo more offsets + offset++ + } + const img = new Image() - const keyValue = input[i]; - const inputData = getInputData(keyValue); + const keyValue = input[i] + const inputData = getInputData(keyValue) img.src = inputData.contents - const renderWidth = tileSize * (inputData.tileWidthMult ?? 1) - g.drawImage(img, 0, 0, renderWidth, tileSize, x, y, renderWidth, tileSize) + let su = suSv + let sv = suSv + let renderWidth = tileSize * (inputData.tileWidthMult ?? 1) + let renderHeight = tileSize + if (inputData.origSizeTextures?.[keyValue]) { + // todo check have enough space + renderWidth = Math.ceil(img.width / tileSize) * tileSize + renderHeight = Math.ceil(img.height / tileSize) * tileSize + su = renderWidth / imgSize + sv = renderHeight / imgSize + if (renderWidth > tileSize) { + offset += Math.ceil(renderWidth / tileSize) - 1 + } + if (renderHeight > tileSize) { + const skipYs = Math.ceil(renderHeight / tileSize) - 1 + for (let i = 1; i <= skipYs; i++) { + skipXY.push([x, y + i]) + } + } + } + g.drawImage(img, 0, 0, renderWidth, renderHeight, x, y, renderWidth, renderHeight) const cleanName = keyValue.split('.').slice(0, -1).join('.') || keyValue texturesIndex[cleanName] = { u: x / imgSize, v: y / imgSize, ...suSvOptimize === 'remove' ? {} : { - su: suSv, - sv: suSv + su: su, + sv: sv } } } @@ -91,7 +116,7 @@ export function makeBlockTextureAtlas (mcAssets: McAssets) { // const textureFiles = mostEncounteredBlocks.map(x => x + '.png') textureFiles.unshift(...localTextures) - const { generated: additionalTextures, twoTileTextures } = getAdditionalTextures() + const { generated: additionalTextures, twoTileTextures, origSizeTextures } = getAdditionalTextures() textureFiles.push(...Object.keys(additionalTextures)) const atlas = makeTextureAtlas(textureFiles, name => { @@ -105,6 +130,7 @@ export function makeBlockTextureAtlas (mcAssets: McAssets) { return { contents, tileWidthMult: twoTileTextures.includes(name) ? 2 : undefined, + origSizeTextures } }) return atlas diff --git a/prismarine-viewer/viewer/prepare/blockModels/1.20/decorated_pot.json b/prismarine-viewer/viewer/prepare/blockModels/1.20/decorated_pot.json new file mode 100644 index 00000000..364c72d4 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/blockModels/1.20/decorated_pot.json @@ -0,0 +1,47 @@ +{ + "texture_size": [32, 32], + "textures": { + "0": "entity/decorated_pot/decorated_pot_base" + }, + "elements": [ + { + "name": "Body", + "from": [1, 0, 1], + "to": [15, 16, 15], + "faces": { + "north": {"uv": [0, 6.5, 7, 13.5], "texture": "#0"}, + "east": {"uv": [0, 6.5, 7, 13.5], "texture": "#0"}, + "south": {"uv": [0, 6.5, 7, 13.5], "texture": "#0"}, + "west": {"uv": [0, 6.5, 7, 13.5], "texture": "#0"}, + "up": {"uv": [7, 6.5, 14, 13.5], "texture": "#0"}, + "down": {"uv": [7, 6.5, 14, 13.5], "texture": "#0"} + } + }, + { + "name": "Neck", + "from": [5, 16, 5], + "to": [11, 17, 11], + "faces": { + "north": {"uv": [6, 5.5, 9, 6], "texture": "#0"}, + "east": {"uv": [9, 5.5, 12, 6], "texture": "#0"}, + "south": {"uv": [2.5, 5.5, 5.5, 6], "texture": "#0"}, + "west": {"uv": [0, 5.5, 3, 6], "texture": "#0"}, + "up": {"uv": [0, 0, 3, 3], "texture": "#0"}, + "down": {"uv": [0, 0, 3, 3], "texture": "#0"} + } + }, + { + "name": "Head", + "from": [4, 17, 4], + "to": [12, 20, 12], + "faces": { + "north": {"uv": [0, 4, 4, 5.5], "texture": "#0"}, + "east": {"uv": [4, 4, 8, 5.5], "texture": "#0"}, + "south": {"uv": [8, 4, 12, 5.5], "texture": "#0"}, + "west": {"uv": [12, 4, 16, 5.5], "texture": "#0"}, + "up": {"uv": [4, 0, 8, 4], "texture": "#0"}, + "down": {"uv": [8, 0, 12, 4], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/blockStates/1.20/decorated_pot.json b/prismarine-viewer/viewer/prepare/blockStates/1.20/decorated_pot.json new file mode 100644 index 00000000..5b46a220 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/blockStates/1.20/decorated_pot.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "decorated_pot", + "y": 90 + }, + "facing=south": { + "model": "decorated_pot", + "y": 180 + }, + "facing=west": { + "model": "decorated_pot", + "y": 270 + }, + "facing=north": { + "model": "decorated_pot" + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/decorated_pot.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/decorated_pot.json new file mode 100644 index 00000000..364c72d4 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/decorated_pot.json @@ -0,0 +1,47 @@ +{ + "texture_size": [32, 32], + "textures": { + "0": "entity/decorated_pot/decorated_pot_base" + }, + "elements": [ + { + "name": "Body", + "from": [1, 0, 1], + "to": [15, 16, 15], + "faces": { + "north": {"uv": [0, 6.5, 7, 13.5], "texture": "#0"}, + "east": {"uv": [0, 6.5, 7, 13.5], "texture": "#0"}, + "south": {"uv": [0, 6.5, 7, 13.5], "texture": "#0"}, + "west": {"uv": [0, 6.5, 7, 13.5], "texture": "#0"}, + "up": {"uv": [7, 6.5, 14, 13.5], "texture": "#0"}, + "down": {"uv": [7, 6.5, 14, 13.5], "texture": "#0"} + } + }, + { + "name": "Neck", + "from": [5, 16, 5], + "to": [11, 17, 11], + "faces": { + "north": {"uv": [6, 5.5, 9, 6], "texture": "#0"}, + "east": {"uv": [9, 5.5, 12, 6], "texture": "#0"}, + "south": {"uv": [2.5, 5.5, 5.5, 6], "texture": "#0"}, + "west": {"uv": [0, 5.5, 3, 6], "texture": "#0"}, + "up": {"uv": [0, 0, 3, 3], "texture": "#0"}, + "down": {"uv": [0, 0, 3, 3], "texture": "#0"} + } + }, + { + "name": "Head", + "from": [4, 17, 4], + "to": [12, 20, 12], + "faces": { + "north": {"uv": [0, 4, 4, 5.5], "texture": "#0"}, + "east": {"uv": [4, 4, 8, 5.5], "texture": "#0"}, + "south": {"uv": [8, 4, 12, 5.5], "texture": "#0"}, + "west": {"uv": [12, 4, 16, 5.5], "texture": "#0"}, + "up": {"uv": [4, 0, 8, 4], "texture": "#0"}, + "down": {"uv": [8, 0, 12, 4], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/decorated_pot.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/decorated_pot.json new file mode 100644 index 00000000..5b46a220 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/decorated_pot.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "decorated_pot", + "y": 90 + }, + "facing=south": { + "model": "decorated_pot", + "y": 180 + }, + "facing=west": { + "model": "decorated_pot", + "y": 270 + }, + "facing=north": { + "model": "decorated_pot" + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts b/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts index ffb1a705..695464ea 100644 --- a/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts +++ b/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts @@ -7,6 +7,7 @@ import { fileURLToPath } from 'url' // todo refactor const twoTileTextures: string[] = [] +const origSizeTextures: string[] = [] let currentImage: Jimp let currentBlockName: string let currentMcAssets: McAssets @@ -82,7 +83,7 @@ const getBlockTexturesFromJimp = async > (sides: for (const [side, jimp] of Object.entries(sides)) { const textureName = `${textureNameBase}_${side}` const sideTexture = withUv ? { uv: [0, 0, jimp.getWidth(), jimp.getHeight()], texture: textureName } : textureName - const base64 = await jimp.getBase64Async(jimp.getMIME()) + const base64Url = await jimp.getBase64Async(jimp.getMIME()) if (side === 'side') { sidesTextures['north'] = sideTexture sidesTextures['east'] = sideTexture @@ -91,7 +92,7 @@ const getBlockTexturesFromJimp = async > (sides: } else { sidesTextures[side] = sideTexture } - generatedImageTextures[textureName] = base64 + generatedImageTextures[textureName] = base64Url } return sidesTextures @@ -229,6 +230,7 @@ const handleSign = async (dataBase: string, match: RegExpExecArray) => { twoTileTextures.push(blockTextures.up.texture) } +// TODO! should not be there! move to data with signs! const chestModels = { chest: { "parent": "block/block", @@ -401,6 +403,32 @@ const handleChest = async (dataBase: string, match: RegExpExecArray) => { currentMcAssets.blocksStates[currentBlockName] = blockStates } +function getParsedJSON (block: string, type: string) { + const versionParts = currentMcAssets.version.split(".") + const version = versionParts[0] + "." + versionParts[1] + return JSON.parse(fs.readFileSync(path.join(__dirname, `${type}/${version}/${block}.json`), 'utf-8')) +} + +function getBlockState (match: string) { + return getParsedJSON(match, 'blockStates') +} + +async function loadBlockModelTextures (dataBase: string, blockModel: any) { + for (const key in Object.entries(blockModel.textures)) { + const texture: string = blockModel.textures[key] + currentImage = await Jimp.read(dataBase + texture + '.png') + blockModel.textures.particle = texture + generatedImageTextures[texture] = `data:image/png;base64,${fs.readFileSync(path.join(dataBase, texture + '.png'), 'base64')}` + origSizeTextures[texture] = true + } +} + +async function getBlockModel (dataBase: string, block: string) { + const blockModel = getParsedJSON(block, 'blockModels') + await loadBlockModelTextures(dataBase, blockModel) + return blockModel +} + const handlers = [ [/(.+)_shulker_box$/, handleShulkerBox], [/^shulker_box$/, handleShulkerBox], @@ -427,6 +455,21 @@ export const tryHandleBlockEntity = async (dataBase, blockName) => { } } +const handleExternalData = async (dataBase: string, version: string) => { + const [major, minor] = version.split(".") + const dataVer = `${major}.${minor}` + if (!fs.existsSync(path.join(__dirname, 'data', dataVer))) return + const allModels = fs.readdirSync(path.join(__dirname, 'data', dataVer, 'blockModels')).map(x => x.replace('.json', '')) + for (const model of allModels) { + currentMcAssets.blocksModels[model] = await getBlockModel(dataBase, model) + } + + const allBlockStates = fs.readdirSync(path.join(__dirname, 'data', dataVer, 'blockStates')).map(x => x.replace('.json', '')) + for (const blockState of allBlockStates) { + currentMcAssets.blocksStates[blockState] = await getBlockState(blockState) + } +} + export const prepareMoreGeneratedBlocks = async (mcAssets: McAssets) => { const mcData = minecraftData(mcAssets.version) const allTheBlocks = mcData.blocksArray.map(x => x.name) @@ -447,6 +490,8 @@ export const prepareMoreGeneratedBlocks = async (mcAssets: McAssets) => { } } + await handleExternalData(mcAssets.directory, mcAssets.version) + const warnings: string[] = [] for (const [name, model] of Object.entries(mcAssets.blocksModels)) { if (Object.keys(model).length === 1 && model.textures) { @@ -462,5 +507,5 @@ export const prepareMoreGeneratedBlocks = async (mcAssets: McAssets) => { } export const getAdditionalTextures = () => { - return { generated: generatedImageTextures, twoTileTextures } + return { generated: generatedImageTextures, twoTileTextures, origSizeTextures } } From 228039c2450dcdee4a858b77ad740b99278e0ada Mon Sep 17 00:00:00 2001 From: Wolf2323 Date: Tue, 4 Jun 2024 12:41:53 +0200 Subject: [PATCH 0223/1195] cleanup external data handling in more generated blocks (#141) Co-authored-by: Vitaly Turovsky --- .../blockModels/1.20/decorated_pot.json | 47 ------------------- .../blockStates/1.20/decorated_pot.json | 19 -------- .../viewer/prepare/moreGeneratedBlocks.ts | 37 ++++++--------- 3 files changed, 14 insertions(+), 89 deletions(-) delete mode 100644 prismarine-viewer/viewer/prepare/blockModels/1.20/decorated_pot.json delete mode 100644 prismarine-viewer/viewer/prepare/blockStates/1.20/decorated_pot.json diff --git a/prismarine-viewer/viewer/prepare/blockModels/1.20/decorated_pot.json b/prismarine-viewer/viewer/prepare/blockModels/1.20/decorated_pot.json deleted file mode 100644 index 364c72d4..00000000 --- a/prismarine-viewer/viewer/prepare/blockModels/1.20/decorated_pot.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "texture_size": [32, 32], - "textures": { - "0": "entity/decorated_pot/decorated_pot_base" - }, - "elements": [ - { - "name": "Body", - "from": [1, 0, 1], - "to": [15, 16, 15], - "faces": { - "north": {"uv": [0, 6.5, 7, 13.5], "texture": "#0"}, - "east": {"uv": [0, 6.5, 7, 13.5], "texture": "#0"}, - "south": {"uv": [0, 6.5, 7, 13.5], "texture": "#0"}, - "west": {"uv": [0, 6.5, 7, 13.5], "texture": "#0"}, - "up": {"uv": [7, 6.5, 14, 13.5], "texture": "#0"}, - "down": {"uv": [7, 6.5, 14, 13.5], "texture": "#0"} - } - }, - { - "name": "Neck", - "from": [5, 16, 5], - "to": [11, 17, 11], - "faces": { - "north": {"uv": [6, 5.5, 9, 6], "texture": "#0"}, - "east": {"uv": [9, 5.5, 12, 6], "texture": "#0"}, - "south": {"uv": [2.5, 5.5, 5.5, 6], "texture": "#0"}, - "west": {"uv": [0, 5.5, 3, 6], "texture": "#0"}, - "up": {"uv": [0, 0, 3, 3], "texture": "#0"}, - "down": {"uv": [0, 0, 3, 3], "texture": "#0"} - } - }, - { - "name": "Head", - "from": [4, 17, 4], - "to": [12, 20, 12], - "faces": { - "north": {"uv": [0, 4, 4, 5.5], "texture": "#0"}, - "east": {"uv": [4, 4, 8, 5.5], "texture": "#0"}, - "south": {"uv": [8, 4, 12, 5.5], "texture": "#0"}, - "west": {"uv": [12, 4, 16, 5.5], "texture": "#0"}, - "up": {"uv": [4, 0, 8, 4], "texture": "#0"}, - "down": {"uv": [8, 0, 12, 4], "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/blockStates/1.20/decorated_pot.json b/prismarine-viewer/viewer/prepare/blockStates/1.20/decorated_pot.json deleted file mode 100644 index 5b46a220..00000000 --- a/prismarine-viewer/viewer/prepare/blockStates/1.20/decorated_pot.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "variants": { - "facing=east": { - "model": "decorated_pot", - "y": 90 - }, - "facing=south": { - "model": "decorated_pot", - "y": 180 - }, - "facing=west": { - "model": "decorated_pot", - "y": 270 - }, - "facing=north": { - "model": "decorated_pot" - } - } -} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts b/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts index 695464ea..b343e595 100644 --- a/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts +++ b/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts @@ -403,18 +403,8 @@ const handleChest = async (dataBase: string, match: RegExpExecArray) => { currentMcAssets.blocksStates[currentBlockName] = blockStates } -function getParsedJSON (block: string, type: string) { - const versionParts = currentMcAssets.version.split(".") - const version = versionParts[0] + "." + versionParts[1] - return JSON.parse(fs.readFileSync(path.join(__dirname, `${type}/${version}/${block}.json`), 'utf-8')) -} - -function getBlockState (match: string) { - return getParsedJSON(match, 'blockStates') -} - async function loadBlockModelTextures (dataBase: string, blockModel: any) { - for (const key in Object.entries(blockModel.textures)) { + for (const key in blockModel.textures) { const texture: string = blockModel.textures[key] currentImage = await Jimp.read(dataBase + texture + '.png') blockModel.textures.particle = texture @@ -423,12 +413,6 @@ async function loadBlockModelTextures (dataBase: string, blockModel: any) { } } -async function getBlockModel (dataBase: string, block: string) { - const blockModel = getParsedJSON(block, 'blockModels') - await loadBlockModelTextures(dataBase, blockModel) - return blockModel -} - const handlers = [ [/(.+)_shulker_box$/, handleShulkerBox], [/^shulker_box$/, handleShulkerBox], @@ -458,15 +442,22 @@ export const tryHandleBlockEntity = async (dataBase, blockName) => { const handleExternalData = async (dataBase: string, version: string) => { const [major, minor] = version.split(".") const dataVer = `${major}.${minor}` - if (!fs.existsSync(path.join(__dirname, 'data', dataVer))) return - const allModels = fs.readdirSync(path.join(__dirname, 'data', dataVer, 'blockModels')).map(x => x.replace('.json', '')) - for (const model of allModels) { - currentMcAssets.blocksModels[model] = await getBlockModel(dataBase, model) + const baseDir = path.join(__dirname, 'data', dataVer) + if (!fs.existsSync(baseDir)) return + + const blockModelsDir = path.join(baseDir, 'blockModels') + const allBlockModels = fs.readdirSync(blockModelsDir).map(x => x.replace('.json', '')) + for (const blockModel of allBlockModels) { + const model = JSON.parse(fs.readFileSync(path.join(blockModelsDir, blockModel + '.json'), 'utf-8')) + currentMcAssets.blocksModels[blockModel] = model + await loadBlockModelTextures(dataBase, model) } - const allBlockStates = fs.readdirSync(path.join(__dirname, 'data', dataVer, 'blockStates')).map(x => x.replace('.json', '')) + const blockStatesDir = path.join(baseDir, 'blockStates') + const allBlockStates = fs.readdirSync(blockStatesDir).map(x => x.replace('.json', '')) for (const blockState of allBlockStates) { - currentMcAssets.blocksStates[blockState] = await getBlockState(blockState) + const state = JSON.parse(fs.readFileSync(path.join(blockStatesDir, blockState + '.json'), 'utf-8')) + currentMcAssets.blocksStates[blockState] = state } } From 32de8ebacda4e63ea93d73219e978ffd9c09123a Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 4 Jun 2024 18:00:42 +0300 Subject: [PATCH 0224/1195] fix: fix all known minecraft-protocol issues. Fixed auto-version. Fixed: kick messages are now always displayed! --- cypress/minecraft-server.mjs | 1 + pnpm-lock.yaml | 8 ++++---- src/index.ts | 27 +++++++++++++++++---------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/cypress/minecraft-server.mjs b/cypress/minecraft-server.mjs index 18f4e3db..32be0c9d 100644 --- a/cypress/minecraft-server.mjs +++ b/cypress/minecraft-server.mjs @@ -2,6 +2,7 @@ import mcServer from 'flying-squid' import defaultOptions from 'flying-squid/config/default-settings.json' assert { type: 'json' } +/** @type {Options} */ const serverOptions = { ...defaultOptions, 'online-mode': false, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6fdf4afa..8bf3f7d0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -138,7 +138,7 @@ importers: version: 2.0.4 net-browserify: specifier: github:zardoy/prismarinejs-net-browserify - version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d827dba61bd2f9ac9a6086fe2079a0fccadd070 + version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/e7c50bf824ae5b4d987967fd921d8634dad03434 node-gzip: specifier: ^1.1.2 version: 1.1.2 @@ -6224,8 +6224,8 @@ packages: nested-error-stacks@2.1.1: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} - net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d827dba61bd2f9ac9a6086fe2079a0fccadd070: - resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d827dba61bd2f9ac9a6086fe2079a0fccadd070} + net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/e7c50bf824ae5b4d987967fd921d8634dad03434: + resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/e7c50bf824ae5b4d987967fd921d8634dad03434} version: 0.2.4 nice-try@1.0.5: @@ -15990,7 +15990,7 @@ snapshots: nested-error-stacks@2.1.1: {} - net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d827dba61bd2f9ac9a6086fe2079a0fccadd070: + net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/e7c50bf824ae5b4d987967fd921d8634dad03434: dependencies: body-parser: 1.20.2 express: 4.18.2 diff --git a/src/index.ts b/src/index.ts index d02f7b92..e89bc186 100644 --- a/src/index.ts +++ b/src/index.ts @@ -186,7 +186,7 @@ let lastMouseMove: number const updateCursor = () => { worldInteractions.update() } -function onCameraMove (e) { +function onCameraMove(e) { if (e.type !== 'touchmove' && !pointerLock.hasPointerLock) return e.stopPropagation?.() const now = performance.now() @@ -212,7 +212,7 @@ contro.on('stickMovement', ({ stick, vector }) => { miscUiState.usingGamepadInput = true }) -function hideCurrentScreens () { +function hideCurrentScreens() { activeModalStacks['main-menu'] = [...activeModalStack] insertActiveModalStack('', []) } @@ -220,7 +220,7 @@ function hideCurrentScreens () { const loadSingleplayer = (serverOverrides = {}, flattenedServerOverrides = {}) => { void connect({ singleplayer: true, username: options.localUsername, password: '', serverOverrides, serverOverridesFlat: flattenedServerOverrides }) } -function listenGlobalEvents () { +function listenGlobalEvents() { window.addEventListener('connect', e => { const options = (e as CustomEvent).detail void connect(options) @@ -261,7 +261,7 @@ const cleanConnectIp = (host: string | undefined, defaultPort: string | undefine } } -async function connect (connectOptions: ConnectOptions) { +async function connect(connectOptions: ConnectOptions) { if (miscUiState.gameLoaded) return miscUiState.hasErrors = false lastConnectOptions.value = connectOptions @@ -444,18 +444,18 @@ async function connect (connectOptions: ConnectOptions) { } : {}, ...singleplayer ? { version: serverOptions.version, - connect () { }, + connect() { }, Client: CustomChannelClient as any, } : {}, username, password, viewDistance: renderDistance, checkTimeoutInterval: 240 * 1000, - noPongTimeout: 240 * 1000, + // noPongTimeout: 240 * 1000, closeTimeout: 240 * 1000, respawn: options.autoRespawn, maxCatchupTicks: 0, - async versionSelectedHook (client) { + async versionSelectedHook(client) { await downloadMcData(client.version) setLoadingScreenStatus(initialLoadingText) }, @@ -484,6 +484,13 @@ async function connect (connectOptions: ConnectOptions) { //@ts-expect-error bot._client.socket._ws.addEventListener('close', () => { console.log('WebSocket connection closed') + setTimeout(() => { + if (bot) { + bot.emit('end', 'WebSocket connection closed with unknown reason') + } + }, 1000) + }) + bot._client.socket.on('close', () => { setTimeout(() => { if (bot) { bot.emit('end', 'WebSocket connection closed with unknown reason') @@ -606,7 +613,7 @@ async function connect (connectOptions: ConnectOptions) { dayCycle() // Bot position callback - function botPosition () { + function botPosition() { viewer.world.lastCamUpdate = Date.now() // this might cause lag, but not sure viewer.setFirstPersonCamera(bot.entity.position, bot.entity.yaw, bot.entity.pitch) @@ -626,7 +633,7 @@ async function connect (connectOptions: ConnectOptions) { bot.entity.yaw -= x } - function changeCallback () { + function changeCallback() { if (notificationProxy.id === 'pointerlockchange') { hideNotification() } @@ -895,7 +902,7 @@ downloadAndOpenFile().then((downloadAction) => { const unsubscribe = subscribe(miscUiState, checkCanDisplay) checkCanDisplay() // eslint-disable-next-line no-inner-declarations - function checkCanDisplay () { + function checkCanDisplay() { if (miscUiState.appConfig) { unsubscribe() openServerEditor() From 423aa6a49c75022e48e636b3eaa21509810bfef4 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 4 Jun 2024 18:04:34 +0300 Subject: [PATCH 0225/1195] fix eslint --- src/index.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/index.ts b/src/index.ts index e89bc186..07781028 100644 --- a/src/index.ts +++ b/src/index.ts @@ -186,7 +186,7 @@ let lastMouseMove: number const updateCursor = () => { worldInteractions.update() } -function onCameraMove(e) { +function onCameraMove (e) { if (e.type !== 'touchmove' && !pointerLock.hasPointerLock) return e.stopPropagation?.() const now = performance.now() @@ -212,7 +212,7 @@ contro.on('stickMovement', ({ stick, vector }) => { miscUiState.usingGamepadInput = true }) -function hideCurrentScreens() { +function hideCurrentScreens () { activeModalStacks['main-menu'] = [...activeModalStack] insertActiveModalStack('', []) } @@ -220,7 +220,7 @@ function hideCurrentScreens() { const loadSingleplayer = (serverOverrides = {}, flattenedServerOverrides = {}) => { void connect({ singleplayer: true, username: options.localUsername, password: '', serverOverrides, serverOverridesFlat: flattenedServerOverrides }) } -function listenGlobalEvents() { +function listenGlobalEvents () { window.addEventListener('connect', e => { const options = (e as CustomEvent).detail void connect(options) @@ -261,7 +261,7 @@ const cleanConnectIp = (host: string | undefined, defaultPort: string | undefine } } -async function connect(connectOptions: ConnectOptions) { +async function connect (connectOptions: ConnectOptions) { if (miscUiState.gameLoaded) return miscUiState.hasErrors = false lastConnectOptions.value = connectOptions @@ -444,7 +444,7 @@ async function connect(connectOptions: ConnectOptions) { } : {}, ...singleplayer ? { version: serverOptions.version, - connect() { }, + connect () { }, Client: CustomChannelClient as any, } : {}, username, @@ -455,7 +455,7 @@ async function connect(connectOptions: ConnectOptions) { closeTimeout: 240 * 1000, respawn: options.autoRespawn, maxCatchupTicks: 0, - async versionSelectedHook(client) { + async versionSelectedHook (client) { await downloadMcData(client.version) setLoadingScreenStatus(initialLoadingText) }, @@ -613,7 +613,7 @@ async function connect(connectOptions: ConnectOptions) { dayCycle() // Bot position callback - function botPosition() { + function botPosition () { viewer.world.lastCamUpdate = Date.now() // this might cause lag, but not sure viewer.setFirstPersonCamera(bot.entity.position, bot.entity.yaw, bot.entity.pitch) @@ -633,7 +633,7 @@ async function connect(connectOptions: ConnectOptions) { bot.entity.yaw -= x } - function changeCallback() { + function changeCallback () { if (notificationProxy.id === 'pointerlockchange') { hideNotification() } @@ -902,7 +902,7 @@ downloadAndOpenFile().then((downloadAction) => { const unsubscribe = subscribe(miscUiState, checkCanDisplay) checkCanDisplay() // eslint-disable-next-line no-inner-declarations - function checkCanDisplay() { + function checkCanDisplay () { if (miscUiState.appConfig) { unsubscribe() openServerEditor() From 98da719e08495d75dfac919477ab0d71bf676a9e Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 5 Jun 2024 11:58:26 +0300 Subject: [PATCH 0226/1195] fix show ui when has modals --- src/reactUi.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/reactUi.tsx b/src/reactUi.tsx index 2f57e6f0..449d7883 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -4,7 +4,7 @@ import { useSnapshot } from 'valtio' import { QRCodeSVG } from 'qrcode.react' import { createPortal } from 'react-dom' import { useEffect, useMemo, useState } from 'react' -import { miscUiState } from './globalState' +import { activeModalStack, miscUiState } from './globalState' import DeathScreenProvider from './react/DeathScreenProvider' import OptionsRenderApp from './react/OptionsRenderApp' import MainMenuRenderApp from './react/MainMenuRenderApp' @@ -95,7 +95,9 @@ const InGameComponent = ({ children }) => { } const InGameUi = () => { - const { gameLoaded, showUI } = useSnapshot(miscUiState) + const { gameLoaded, showUI: showUIRaw } = useSnapshot(miscUiState) + const hasModals = useSnapshot(activeModalStack).length > 0 + const showUI = showUIRaw || hasModals if (!gameLoaded) return return <> From 9a41214674458eea922298a2ae66d263b74705fa Mon Sep 17 00:00:00 2001 From: Vitaly Date: Thu, 6 Jun 2024 16:52:05 +0300 Subject: [PATCH 0227/1195] fix: fix breaking mesh was highlighted --- src/worldInteractions.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/worldInteractions.ts b/src/worldInteractions.ts index 330dabd7..0245d418 100644 --- a/src/worldInteractions.ts +++ b/src/worldInteractions.ts @@ -68,7 +68,8 @@ class WorldInteraction { } const breakMaterial = new THREE.MeshBasicMaterial({ transparent: true, - blending: THREE.MultiplyBlending + blending: THREE.MultiplyBlending, + alphaTest: 0.5, }) this.blockBreakMesh = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), breakMaterial) this.blockBreakMesh.visible = false From d04a66738ef5c713379f155ac1f2bfaf1d610e33 Mon Sep 17 00:00:00 2001 From: arhellist <92224498+arhellist@users.noreply.github.com> Date: Thu, 6 Jun 2024 18:23:43 +0400 Subject: [PATCH 0228/1195] fix game crash (#144) --- src/react/DebugOverlay.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/react/DebugOverlay.tsx b/src/react/DebugOverlay.tsx index dd288b49..c83418f5 100644 --- a/src/react/DebugOverlay.tsx +++ b/src/react/DebugOverlay.tsx @@ -73,7 +73,7 @@ export default () => { } } - useMemo(() => { + useEffect(() => { document.addEventListener('keydown', handleF3) const packetsUpdateInterval = setInterval(() => { setPacketsString(prev => `↓ ${received.current.count} (${(received.current.size / 1024).toFixed(2)} KB/s, ${getFixedFilesize(receivedTotal.current)}) ↑ ${sent.current.count}`) From fec59aac03c5d04c15f9e1932c154fb26b694582 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 6 Jun 2024 17:30:11 +0300 Subject: [PATCH 0229/1195] up mineflayer --- package.json | 2 +- pnpm-lock.yaml | 49 ++++++++++--------------------------------------- src/index.ts | 9 --------- 3 files changed, 11 insertions(+), 49 deletions(-) diff --git a/package.json b/package.json index 9451b266..fa28ae5d 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,7 @@ "http-server": "^14.1.1", "https-browserify": "^1.0.0", "minecraft-inventory-gui": "github:zardoy/minecraft-inventory-gui#next", - "mineflayer": "github:PrismarineJS/mineflayer", + "mineflayer": "github:zardoy/mineflayer", "mineflayer-pathfinder": "^2.4.4", "npm-run-all": "^4.1.5", "os-browserify": "^0.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8bf3f7d0..f9928dc6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -301,8 +301,8 @@ importers: specifier: github:zardoy/minecraft-inventory-gui#next version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/200902aca941475e7feb610070e662b172a000b5(@types/react@18.2.20)(react@18.2.0) mineflayer: - specifier: github:PrismarineJS/mineflayer - version: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/5a544cf2547a6e0f1f17786962d77a33c661c02f(encoding@0.1.13) + specifier: github:zardoy/mineflayer + version: https://codeload.github.com/zardoy/mineflayer/tar.gz/06061e07fe6b9716cb1801d4c1bf232581977192(encoding@0.1.13) mineflayer-pathfinder: specifier: ^2.4.4 version: 2.4.4 @@ -6039,10 +6039,6 @@ packages: resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/200902aca941475e7feb610070e662b172a000b5} version: 1.0.1 - minecraft-protocol@1.47.0: - resolution: {integrity: sha512-IHL8faXLLIWv1O+2v2NgyKlooilu/OiSL9orI8Kqed/rZvVOrFPzs2PwMAYjpQX9gxLPhiSU19KqZ8CjfNuqhg==} - engines: {node: '>=14'} - minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/495eed56ab230b2615596590064671356d86a2dc: resolution: {tarball: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/495eed56ab230b2615596590064671356d86a2dc} version: 1.47.0 @@ -6071,8 +6067,8 @@ packages: resolution: {integrity: sha512-QMMNPx4IyZE7ydAzjvGLQLCnQNUOfkk1qVZKxTTS9q3qPTAewz4GhsVUBtbQ8LSbHthe5RcQ1Sgxs4wlIma/Qw==} engines: {node: '>=18'} - mineflayer@https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/5a544cf2547a6e0f1f17786962d77a33c661c02f: - resolution: {tarball: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/5a544cf2547a6e0f1f17786962d77a33c661c02f} + mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/06061e07fe6b9716cb1801d4c1bf232581977192: + resolution: {tarball: https://codeload.github.com/zardoy/mineflayer/tar.gz/06061e07fe6b9716cb1801d4c1bf232581977192} version: 4.20.1 engines: {node: '>=18'} @@ -15685,31 +15681,6 @@ snapshots: - '@types/react' - react - minecraft-protocol@1.47.0(patch_hash=2uxevyasyasdavsxuehfavgkjq)(encoding@0.1.13): - dependencies: - '@types/readable-stream': 4.0.12 - aes-js: 3.1.2 - buffer-equal: 1.0.1 - debug: 4.3.4(supports-color@8.1.1) - endian-toggle: 0.0.0 - lodash.get: 4.4.2 - lodash.merge: 4.6.2 - minecraft-data: 3.65.0 - minecraft-folder-path: 1.2.0 - node-fetch: 2.7.0(encoding@0.1.13) - node-rsa: 0.4.2 - prismarine-auth: 2.4.2(encoding@0.1.13) - prismarine-chat: 1.10.1 - prismarine-nbt: 2.5.0 - prismarine-realms: 1.3.2(encoding@0.1.13) - protodef: 1.15.0 - readable-stream: 4.5.2 - uuid-1345: 1.0.2 - yggdrasil: 1.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - supports-color - minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/495eed56ab230b2615596590064671356d86a2dc(patch_hash=2uxevyasyasdavsxuehfavgkjq)(encoding@0.1.13): dependencies: '@types/readable-stream': 4.0.12 @@ -15804,11 +15775,11 @@ snapshots: mineflayer@4.20.1(encoding@0.1.13): dependencies: minecraft-data: 3.65.0 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/ccab9fb39681f3ebe0d264e2a3f833aa3c5a1ac7(patch_hash=2uxevyasyasdavsxuehfavgkjq)(encoding@0.1.13) + minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/495eed56ab230b2615596590064671356d86a2dc(patch_hash=2uxevyasyasdavsxuehfavgkjq)(encoding@0.1.13) prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chat: 1.10.1 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.65.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/eb39a905761a36f733a456110e6b49d655bf5c16(minecraft-data@3.65.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 @@ -15824,14 +15795,14 @@ snapshots: - encoding - supports-color - mineflayer@https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/5a544cf2547a6e0f1f17786962d77a33c661c02f(encoding@0.1.13): + mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/06061e07fe6b9716cb1801d4c1bf232581977192(encoding@0.1.13): dependencies: minecraft-data: 3.65.0 - minecraft-protocol: 1.47.0(patch_hash=2uxevyasyasdavsxuehfavgkjq)(encoding@0.1.13) + minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/495eed56ab230b2615596590064671356d86a2dc(patch_hash=2uxevyasyasdavsxuehfavgkjq)(encoding@0.1.13) prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 - prismarine-chat: 1.9.1 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.65.0) + prismarine-chat: 1.10.1 + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/eb39a905761a36f733a456110e6b49d655bf5c16(minecraft-data@3.65.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 diff --git a/src/index.ts b/src/index.ts index 07781028..3b48a492 100644 --- a/src/index.ts +++ b/src/index.ts @@ -568,15 +568,6 @@ async function connect (connectOptions: ConnectOptions) { window.Vec3 = Vec3 window.pathfinder = pathfinder - // patch mineflayer - // todo move to mineflayer - bot.inventory.on('updateSlot', (index) => { - if ((index as unknown as number) === bot.quickBarSlot + bot.inventory.hotbarStart) { - //@ts-expect-error - bot.emit('heldItemChanged') - } - }) - miscUiState.gameLoaded = true miscUiState.loadedServerIndex = connectOptions.serverIndex ?? '' customEvents.emit('gameLoaded') From bd54b5bd807534bb30deb7e0314f089bcee8d715 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 6 Jun 2024 19:09:07 +0300 Subject: [PATCH 0230/1195] fix: username override of servers was never used --- src/react/ServersList.tsx | 18 ++++++++++-------- src/react/ServersListProvider.tsx | 17 +++++++++-------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/react/ServersList.tsx b/src/react/ServersList.tsx index f6b89452..f3759bce 100644 --- a/src/react/ServersList.tsx +++ b/src/react/ServersList.tsx @@ -5,14 +5,12 @@ import Singleplayer from './Singleplayer' import Input from './Input' import Button from './Button' import PixelartIcon from './PixelartIcon' +import { BaseServerInfo } from './AddServerOrConnect' interface Props extends React.ComponentProps { - joinServer: (ip: string, overrides: { - username?: string - password?: string - proxy?: string - versionOverride?: string + joinServer: (info: BaseServerInfo, additional: { shouldSave?: boolean + index?: number }) => void initialProxies: SavedProxiesLocalStorage updateProxies: (proxies: SavedProxiesLocalStorage) => void @@ -67,9 +65,11 @@ export default ({ initialProxies, updateProxies: updateProxiesProp, joinServer, version = parts.at(-1)! ip = parts.slice(0, -1).join(':') } - joinServer(ip, { - shouldSave: save, + joinServer({ + ip, versionOverride: version, + }, { + shouldSave: save, }) }} > @@ -116,7 +116,9 @@ export default ({ initialProxies, updateProxies: updateProxiesProp, joinServer, serversLayout onWorldAction={(action, serverName) => { if (action === 'load') { - joinServer(serverName, {}) + joinServer({ + ip: serverName, + }, {}) } props.onWorldAction?.(action, serverName) }} diff --git a/src/react/ServersListProvider.tsx b/src/react/ServersListProvider.tsx index bb23004f..9772c9b4 100644 --- a/src/react/ServersListProvider.tsx +++ b/src/react/ServersListProvider.tsx @@ -231,10 +231,11 @@ const Inner = () => { } return { + joinServer={(overrides, { shouldSave }) => { + const indexOrIp = overrides.ip let ip = indexOrIp let server: StoreServerItem | undefined - if (overrides.shouldSave === undefined) { + if (shouldSave === undefined) { // hack: inner component doesn't know of overrides for existing servers server = serversListSorted.find(s => s.index.toString() === indexOrIp)! ip = server.ip @@ -242,7 +243,7 @@ const Inner = () => { } const lastJoinedUsername = serversListSorted.find(s => s.usernameOverride)?.usernameOverride - let username = overrides.username || defaultUsername + let username = overrides.usernameOverride || defaultUsername if (!username) { username = prompt('Username', lastJoinedUsername || '') if (!username) return @@ -251,13 +252,13 @@ const Inner = () => { const options = { username, server: normalizeIp(ip), - proxy: overrides.proxy || selectedProxy, + proxy: overrides.proxyOverride || selectedProxy, botVersion: overrides.versionOverride ?? /* legacy */ overrides['version'], - password: overrides.password, + password: overrides.passwordOverride, ignoreQs: true, autoLoginPassword: server?.autoLogin?.[username], onSuccessfulPlay () { - if (overrides.shouldSave && !serversList.some(s => s.ip === ip)) { + if (shouldSave && !serversList.some(s => s.ip === ip)) { const newServersList: StoreServerItem[] = [...serversList, { ip, lastJoined: Date.now(), @@ -267,7 +268,7 @@ const Inner = () => { setNewServersList(newServersList) // component is not mounted } - if (overrides.shouldSave === undefined) { // loading saved + if (shouldSave === undefined) { // loading saved // find and update const server = serversList.find(s => s.ip === ip) if (server) { @@ -286,7 +287,7 @@ const Inner = () => { localStorage.setItem('selectedProxy', selectedProxy) } }, - serverIndex: overrides.shouldSave ? serversList.length.toString() : indexOrIp // assume last + serverIndex: shouldSave ? serversList.length.toString() : indexOrIp // assume last } satisfies ConnectOptions dispatchEvent(new CustomEvent('connect', { detail: options })) // qsOptions From aa18c3cbbdd1dd770f75f6695dd6bfff15b61a51 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 6 Jun 2024 19:52:12 +0300 Subject: [PATCH 0231/1195] add ping proxy implementation --- src/index.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/index.ts b/src/index.ts index 3b48a492..fe584b4d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -498,6 +498,22 @@ async function connect (connectOptions: ConnectOptions) { }) }) }) + let i = 0 + //@ts-expect-error + bot.pingProxy = async () => { + const curI = ++i + return new Promise(resolve => { + //@ts-expect-error + bot._client.socket._ws.send(`ping:${curI}`) + const date = Date.now() + const onPong = (received) => { + if (received !== curI.toString()) return + bot._client.socket.off('pong' as any, onPong) + resolve(Date.now() - date) + } + bot._client.socket.on('pong' as any, onPong) + }) + } } // socket setup actually can be delayed because of dns lookup if (bot._client.socket) { From 1e741c7c7a44fd783c2f76875b2d20cc618f8683 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 6 Jun 2024 19:53:08 +0300 Subject: [PATCH 0232/1195] up net-browserify --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9928dc6..7ced3b41 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -138,7 +138,7 @@ importers: version: 2.0.4 net-browserify: specifier: github:zardoy/prismarinejs-net-browserify - version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/e7c50bf824ae5b4d987967fd921d8634dad03434 + version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d4650ff39943d1358a05d7197c3caa12fa8fb99 node-gzip: specifier: ^1.1.2 version: 1.1.2 @@ -6220,8 +6220,8 @@ packages: nested-error-stacks@2.1.1: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} - net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/e7c50bf824ae5b4d987967fd921d8634dad03434: - resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/e7c50bf824ae5b4d987967fd921d8634dad03434} + net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d4650ff39943d1358a05d7197c3caa12fa8fb99: + resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d4650ff39943d1358a05d7197c3caa12fa8fb99} version: 0.2.4 nice-try@1.0.5: @@ -15961,7 +15961,7 @@ snapshots: nested-error-stacks@2.1.1: {} - net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/e7c50bf824ae5b4d987967fd921d8634dad03434: + net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d4650ff39943d1358a05d7197c3caa12fa8fb99: dependencies: body-parser: 1.20.2 express: 4.18.2 From 4c03d68b03f4748d41fe238a4aa81a8f14ed0089 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 7 Jun 2024 00:22:41 +0300 Subject: [PATCH 0233/1195] up browserify --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ced3b41..10add82d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -138,7 +138,7 @@ importers: version: 2.0.4 net-browserify: specifier: github:zardoy/prismarinejs-net-browserify - version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d4650ff39943d1358a05d7197c3caa12fa8fb99 + version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/2ed580ba422781addd1166ab31eede5914cd5f61 node-gzip: specifier: ^1.1.2 version: 1.1.2 @@ -6220,8 +6220,8 @@ packages: nested-error-stacks@2.1.1: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} - net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d4650ff39943d1358a05d7197c3caa12fa8fb99: - resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d4650ff39943d1358a05d7197c3caa12fa8fb99} + net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/2ed580ba422781addd1166ab31eede5914cd5f61: + resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/2ed580ba422781addd1166ab31eede5914cd5f61} version: 0.2.4 nice-try@1.0.5: @@ -15961,7 +15961,7 @@ snapshots: nested-error-stacks@2.1.1: {} - net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/7d4650ff39943d1358a05d7197c3caa12fa8fb99: + net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/2ed580ba422781addd1166ab31eede5914cd5f61: dependencies: body-parser: 1.20.2 express: 4.18.2 From bbf8fbf4a5fed3387b2329f39d3037cde595dbff Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 7 Jun 2024 01:30:00 +0300 Subject: [PATCH 0234/1195] fix o.text.includes is not a function crash --- src/botUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/botUtils.ts b/src/botUtils.ts index 30e13834..79b10118 100644 --- a/src/botUtils.ts +++ b/src/botUtils.ts @@ -101,7 +101,7 @@ export const formatMessage = (message: MessageInput, mcData: IndexedData = globa msglist = msglist.map(msg => { // normalize § - if (!msg.text.includes('§')) return msg + if (!msg.text.includes?.('§')) return msg const newMsg = fromFormattedString(msg.text) return flat(newMsg) }).flat(Infinity) From 94c665d851f8366b31ca4aa8873526dd53840af8 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 8 Jun 2024 23:13:44 +0300 Subject: [PATCH 0235/1195] move everything to frequent update interval --- src/react/DebugOverlay.tsx | 7 +------ src/reactUi.tsx | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/react/DebugOverlay.tsx b/src/react/DebugOverlay.tsx index c83418f5..bb38672e 100644 --- a/src/react/DebugOverlay.tsx +++ b/src/react/DebugOverlay.tsx @@ -91,6 +91,7 @@ export default () => { setDimension(bot.game.dimension) setDay(bot.time.day) setCursorBlock(worldInteractions.cursorBlock) + setEntitiesCount(Object.values(bot.entities).length) }, 100) // @ts-expect-error @@ -101,12 +102,6 @@ export default () => { sent.current.count++ managePackets('sent', name, data) }) - bot.on('entitySpawn', () => { - setEntitiesCount(Object.values(bot.entities).length) - }) - bot.on('entityGone', () => { - setEntitiesCount(Object.values(bot.entities).length) - }) try { const gl = window.renderer.getContext() diff --git a/src/reactUi.tsx b/src/reactUi.tsx index 449d7883..8a9cc32c 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -98,7 +98,7 @@ const InGameUi = () => { const { gameLoaded, showUI: showUIRaw } = useSnapshot(miscUiState) const hasModals = useSnapshot(activeModalStack).length > 0 const showUI = showUIRaw || hasModals - if (!gameLoaded) return + if (!gameLoaded || !bot) return return <> From 6be0bc8c9a93d79f0524d0e8bdb7041941e5c27d Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 8 Jun 2024 23:20:07 +0300 Subject: [PATCH 0236/1195] fix: elytra equipped crashed hud bars fix sentry 5457375830 --- src/react/HudBarsProvider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/react/HudBarsProvider.tsx b/src/react/HudBarsProvider.tsx index 746d4819..ea78ae08 100644 --- a/src/react/HudBarsProvider.tsx +++ b/src/react/HudBarsProvider.tsx @@ -82,7 +82,7 @@ export default () => { const item = bot.inventory.slots[slotIndex] ?? null if (!item) continue const armorName = item.name.split('_') - points += armor[armorName[0]][armorName[1]] + points += armor[armorName[0]]?.[armorName[1]] ?? 0 } setArmorValue(points) } From 409577d8e0b272ec155e9cbfc96e94a0295b49de Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 9 Jun 2024 00:19:08 +0300 Subject: [PATCH 0237/1195] up net --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10add82d..38a9ebb6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -138,7 +138,7 @@ importers: version: 2.0.4 net-browserify: specifier: github:zardoy/prismarinejs-net-browserify - version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/2ed580ba422781addd1166ab31eede5914cd5f61 + version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/99434199f25d3c6bbe15833bb78ec40b07c2df6f node-gzip: specifier: ^1.1.2 version: 1.1.2 @@ -6220,8 +6220,8 @@ packages: nested-error-stacks@2.1.1: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} - net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/2ed580ba422781addd1166ab31eede5914cd5f61: - resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/2ed580ba422781addd1166ab31eede5914cd5f61} + net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/99434199f25d3c6bbe15833bb78ec40b07c2df6f: + resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/99434199f25d3c6bbe15833bb78ec40b07c2df6f} version: 0.2.4 nice-try@1.0.5: @@ -15961,7 +15961,7 @@ snapshots: nested-error-stacks@2.1.1: {} - net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/2ed580ba422781addd1166ab31eede5914cd5f61: + net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/99434199f25d3c6bbe15833bb78ec40b07c2df6f: dependencies: body-parser: 1.20.2 express: 4.18.2 From 6268561e4148dbaec0de0c6965e3423ccb709849 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 9 Jun 2024 01:09:02 +0300 Subject: [PATCH 0238/1195] make inputs in server editor a bit smaller, fix proxy select --- src/react/AddServerOrConnect.tsx | 60 +++++++++++++++++++------------- src/react/ServersList.tsx | 4 +-- 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/react/AddServerOrConnect.tsx b/src/react/AddServerOrConnect.tsx index 500c1e61..d74ff8fe 100644 --- a/src/react/AddServerOrConnect.tsx +++ b/src/react/AddServerOrConnect.tsx @@ -23,6 +23,8 @@ interface Props { defaults?: Pick } +const ELEMENTS_WIDTH = 190 + export default ({ onBack, onConfirm, title = 'Add a Server', initialData, parseQs, onQsConnect, defaults }: Props) => { const qsParams = parseQs ? new URLSearchParams(window.location.search) : undefined @@ -41,24 +43,25 @@ export default ({ onBack, onConfirm, title = 'Add a Server', initialData, parseQ const lockConnect = qsParams?.get('lockConnect') === 'true' return - { - e.preventDefault() - let ip = serverIp.includes(':') ? serverIp : `${serverIp}:${serverPort}` - ip = ip.replace(/:$/, '') - onConfirm({ - name: serverName, - ip, - versionOverride, - proxyOverride, - usernameOverride, - passwordOverride - }) - }} + { + e.preventDefault() + let ip = serverIp.includes(':') ? serverIp : `${serverIp}:${serverPort}` + ip = ip.replace(/:$/, '') + onConfirm({ + name: serverName, + ip, + versionOverride, + proxyOverride, + usernameOverride, + passwordOverride + }) + }} >
setProxyOverride(value)} placeholder={defaults?.proxyOverride} /> setUsernameOverride(value)} placeholder={defaults?.usernameOverride} /> setPasswordOverride(value)} /* placeholder='For advanced usage only' */ /> - {!lockConnect && <>} + {!lockConnect && <> + { + onBack() + }}>Cancel + Save + } {qsParams?.get('ip') &&
- + >Connect
}
} +const ButtonWrapper = ({ ...props }: React.ComponentProps) => { + props.style ??= {} + props.style.width = ELEMENTS_WIDTH + return
From 05a0d3a184ae4478470f11046b89d7f45160b4a1 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 9 Jun 2024 02:02:26 +0300 Subject: [PATCH 0239/1195] fix: attack entities on left click not on right click --- src/worldInteractions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/worldInteractions.ts b/src/worldInteractions.ts index 0245d418..49c21c2e 100644 --- a/src/worldInteractions.ts +++ b/src/worldInteractions.ts @@ -90,7 +90,7 @@ class WorldInteraction { const entity = getEntityCursor() - if (entity && e.button === 2) { + if (entity && e.button === 0) { bot.attack(entity) } else { // bot From 353bec4c6b718ab3a2b54f147a35d04fa274c058 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sun, 9 Jun 2024 18:12:34 +0300 Subject: [PATCH 0240/1195] fix: fix entity label display for older versions of minecraft --- prismarine-viewer/viewer/lib/entities.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/prismarine-viewer/viewer/lib/entities.js b/prismarine-viewer/viewer/lib/entities.js index 28fc6d89..94f06e0c 100644 --- a/prismarine-viewer/viewer/lib/entities.js +++ b/prismarine-viewer/viewer/lib/entities.js @@ -267,11 +267,15 @@ export class Entities extends EventEmitter { } - displaySimpleText(jsonLike) { + parseEntityLabel(jsonLike) { if (!jsonLike) return - const parsed = typeof jsonLike === 'string' ? mojangson.simplify(mojangson.parse(jsonLike)) : nbt.simplify(jsonLike) - const text = flat(parsed).map(x => x.text) - return text.join('') + try { + const parsed = typeof jsonLike === 'string' ? mojangson.simplify(mojangson.parse(jsonLike)) : nbt.simplify(jsonLike) + const text = flat(parsed).map(x => x.text) + return text.join('') + } catch (err) { + return jsonLike + } } update(/** @type {import('prismarine-entity').Entity & {delete?, pos}} */entity, overrides) { @@ -410,7 +414,7 @@ export class Entities extends EventEmitter { } } // not player - const displayText = entity.metadata?.[3] && this.displaySimpleText(entity.metadata[2]) + const displayText = entity.metadata?.[3] && this.parseEntityLabel(entity.metadata[2]) if (entity.name !== 'player' && displayText) { addNametag({ ...entity, username: displayText }, this.entitiesOptions, this.entities[entity.id].children.find(c => c.name === 'mesh')) } From 7f3d5ca1f0ead78528f065c55ba3724f951b875b Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 10 Jun 2024 03:27:34 +0300 Subject: [PATCH 0241/1195] rename project to minecraft-web-client fixes issue146 --- README.NPM.MD | 2 +- package.json | 2 +- package.npm.json | 2 +- scripts/downloadSoundsMap.mjs | 2 +- scripts/prepareSounds.mjs | 8 ++++---- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.NPM.MD b/README.NPM.MD index 24c90bc9..c036adba 100644 --- a/README.NPM.MD +++ b/README.NPM.MD @@ -24,7 +24,7 @@ const App = () => { } ``` -See [Storybook](https://mcraft.fun/storybook/) or [Storybook (Mirror link)](https://mcon.vercel.app/storybook/) for more examples and full components list. Also take a look at the full [standalone example](https://github.com/zardoy/prismarine-web-client/tree/experiments/UiStandaloneExample.tsx). +See [Storybook](https://mcraft.fun/storybook/) or [Storybook (Mirror link)](https://mcon.vercel.app/storybook/) for more examples and full components list. Also take a look at the full [standalone example](https://github.com/zardoy/minecraft-web-client/tree/experiments/UiStandaloneExample.tsx). There are two types of components: diff --git a/package.json b/package.json index fa28ae5d..7bbde636 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "prismarine-web-client", + "name": "minecraft-web-client", "version": "0.0.0-dev", "description": "A minecraft client running in a browser", "scripts": { diff --git a/package.npm.json b/package.npm.json index bae8b60f..7e13d67b 100644 --- a/package.npm.json +++ b/package.npm.json @@ -26,7 +26,7 @@ }, "module": "./dist/react/npmReactComponents.js", "types": "./dist/react/npmReactComponents.d.ts", - "repository": "zardoy/prismarine-web-client", + "repository": "zardoy/minecraft-web-client", "version": "0.0.0-dev", "dependencies": {}, "peerDependencies": { diff --git a/scripts/downloadSoundsMap.mjs b/scripts/downloadSoundsMap.mjs index 066a3df7..3c335f8f 100644 --- a/scripts/downloadSoundsMap.mjs +++ b/scripts/downloadSoundsMap.mjs @@ -1,6 +1,6 @@ import fs from 'fs' -const url = 'https://github.com/zardoy/prismarine-web-client/raw/sounds-generated/sounds.js' +const url = 'https://github.com/zardoy/minecraft-web-client/raw/sounds-generated/sounds.js' const savePath = 'dist/sounds.js' fetch(url).then(res => res.text()).then(data => { fs.writeFileSync(savePath, data, 'utf8') diff --git a/scripts/prepareSounds.mjs b/scripts/prepareSounds.mjs index 4ed119cb..8f3e5bef 100644 --- a/scripts/prepareSounds.mjs +++ b/scripts/prepareSounds.mjs @@ -61,7 +61,7 @@ const downloadAllSounds = async () => { } prevSounds = soundAssets } - async function downloadSound ({ name, hash, size }, namePath, log) { + async function downloadSound({ name, hash, size }, namePath, log) { const savePath = path.resolve(`generated/sounds/${namePath}`) if (fs.existsSync(savePath)) { // console.log('skipped', name) @@ -86,7 +86,7 @@ const downloadAllSounds = async () => { } writer.close() } - async function downloadSounds (assets, addPath = '') { + async function downloadSounds(assets, addPath = '') { for (let i = 0; i < assets.length; i += 5) { await Promise.all(assets.slice(i, i + 5).map((asset, j) => downloadSound(asset, `${addPath}${asset.name}`, () => { console.log('downloading', addPath, asset.name, i + j, '/', assets.length) @@ -135,7 +135,7 @@ const convertSounds = async () => { } const CONCURRENCY = 5 - for(let i = 0; i < toConvert.length; i += CONCURRENCY) { + for (let i = 0; i < toConvert.length; i += CONCURRENCY) { await Promise.all(toConvert.slice(i, i + CONCURRENCY).map((oggPath, j) => convertSound(i + j))) } } @@ -221,7 +221,7 @@ const makeSoundsBundle = async () => { const allSoundsMeta = { format: 'mp3', - baseUrl: 'https://raw.githubusercontent.com/zardoy/prismarine-web-client/sounds-generated/sounds/' + baseUrl: 'https://raw.githubusercontent.com/zardoy/minecraft-web-client/sounds-generated/sounds/' } await build({ From 7f4edbedba20b22bd9b903c780a2c268679d6463 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 11 Jun 2024 03:26:24 +0300 Subject: [PATCH 0242/1195] rm manimali, replace with a better server --- config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.json b/config.json index 1bbbfd47..e4f86060 100644 --- a/config.json +++ b/config.json @@ -15,9 +15,9 @@ "description": "One of the best servers here. Join now!" }, { - "ip": "play.minemalia.com", + "ip": "sus.shhnowisnottheti.me", "version": "1.18.2", - "description": "Only login with existing accounts." + "description": "Creative, your own 'boxes' (islands)" } ] } From 38e4efc79b4054bfc354ccaaf6fe5c5f572a3978 Mon Sep 17 00:00:00 2001 From: Wolf2323 Date: Tue, 11 Jun 2024 20:14:58 +0200 Subject: [PATCH 0243/1195] fix: improve signs models & text, added all missing sign types (#143) Co-authored-by: Vitaly Turovsky --- prismarine-viewer/viewer/lib/mesher/models.ts | 4 +- .../viewer/lib/mesher/test/tests.test.ts | 22 -- .../viewer/lib/worldrendererThree.ts | 27 +- prismarine-viewer/viewer/prepare/atlas.ts | 49 +-- .../data/1.13/blockModels/sign/oak.json | 6 + .../data/1.13/blockModels/sign/oak_wall.json | 6 + .../data/1.13/blockModels/sign/sign.json | 140 +++++++ .../data/1.13/blockModels/sign/sign_wall.json | 72 ++++ .../data/1.13/blockStates/sign/sign.json | 67 ++++ .../data/1.13/blockStates/sign/wall_sign.json | 19 + .../data/1.14/blockModels/sign/acacia.json | 6 + .../1.14/blockModels/sign/acacia_wall.json | 6 + .../data/1.14/blockModels/sign/birch.json | 6 + .../1.14/blockModels/sign/birch_wall.json | 6 + .../data/1.14/blockModels/sign/dark_oak.json | 6 + .../1.14/blockModels/sign/dark_oak_wall.json | 6 + .../data/1.14/blockModels/sign/jungle.json | 6 + .../1.14/blockModels/sign/jungle_wall.json | 7 + .../data/1.14/blockModels/sign/spruce.json | 6 + .../1.14/blockModels/sign/spruce_wall.json | 6 + .../1.14/blockStates/sign/acacia_sign.json | 67 ++++ .../blockStates/sign/acacia_wall_sign.json | 19 + .../1.14/blockStates/sign/birch_sign.json | 67 ++++ .../blockStates/sign/birch_wall_sign.json | 19 + .../1.14/blockStates/sign/dark_oak_sign.json | 67 ++++ .../blockStates/sign/dark_oak_wall_sign.json | 19 + .../1.14/blockStates/sign/jungle_sign.json | 67 ++++ .../blockStates/sign/jungle_wall_sign.json | 19 + .../data/1.14/blockStates/sign/oak_sign.json | 67 ++++ .../1.14/blockStates/sign/oak_wall_sign.json | 19 + .../1.14/blockStates/sign/spruce_sign.json | 67 ++++ .../blockStates/sign/spruce_wall_sign.json | 19 + .../data/1.16/blockModels/sign/crimson.json | 6 + .../1.16/blockModels/sign/crimson_wall.json | 6 + .../data/1.16/blockModels/sign/warped.json | 6 + .../1.16/blockModels/sign/warped_wall.json | 6 + .../1.16/blockStates/sign/crimson_sign.json | 67 ++++ .../blockStates/sign/crimson_wall_sign.json | 19 + .../1.16/blockStates/sign/warped_sign.json | 67 ++++ .../blockStates/sign/warped_wall_sign.json | 19 + .../data/1.19/blockModels/sign/mangrove.json | 6 + .../1.19/blockModels/sign/mangrove_wall.json | 6 + .../1.19/blockStates/sign/mangrove_sign.json | 67 ++++ .../blockStates/sign/mangrove_wall_sign.json | 19 + .../1.20/blockModels/sign/acacia_hanging.json | 7 + .../blockModels/sign/acacia_wall_hanging.json | 7 + .../data/1.20/blockModels/sign/bamboo.json | 6 + .../1.20/blockModels/sign/bamboo_hanging.json | 7 + .../1.20/blockModels/sign/bamboo_wall.json | 6 + .../blockModels/sign/bamboo_wall_hanging.json | 7 + .../1.20/blockModels/sign/birch_hanging.json | 7 + .../blockModels/sign/birch_wall_hanging.json | 7 + .../data/1.20/blockModels/sign/cherry.json | 6 + .../1.20/blockModels/sign/cherry_hanging.json | 7 + .../1.20/blockModels/sign/cherry_wall.json | 6 + .../blockModels/sign/cherry_wall_hanging.json | 7 + .../blockModels/sign/crimson_hanging.json | 7 + .../sign/crimson_wall_hanging.json | 7 + .../blockModels/sign/dark_oak_hanging.json | 7 + .../sign/dark_oak_wall_hanging.json | 7 + .../data/1.20/blockModels/sign/hanging.json | 115 ++++++ .../1.20/blockModels/sign/jungle_hanging.json | 7 + .../blockModels/sign/jungle_wall_hanging.json | 7 + .../blockModels/sign/mangrove_hanging.json | 7 + .../sign/mangrove_wall_hanging.json | 7 + .../1.20/blockModels/sign/oak_hanging.json | 7 + .../blockModels/sign/oak_wall_hanging.json | 7 + .../1.20/blockModels/sign/spruce_hanging.json | 7 + .../blockModels/sign/spruce_wall_hanging.json | 7 + .../1.20/blockModels/sign/wall_hanging.json | 347 ++++++++++++++++++ .../1.20/blockModels/sign/warped_hanging.json | 7 + .../blockModels/sign/warped_wall_hanging.json | 7 + .../blockStates/sign/acacia_hanging_sign.json | 67 ++++ .../sign/acacia_wall_hanging_sign.json | 19 + .../blockStates/sign/bamboo_hanging_sign.json | 67 ++++ .../1.20/blockStates/sign/bamboo_sign.json | 67 ++++ .../sign/bamboo_wall_hanging_sign.json | 19 + .../blockStates/sign/bamboo_wall_sign.json | 19 + .../blockStates/sign/birch_hanging_sign.json | 67 ++++ .../sign/birch_wall_hanging_sign.json | 19 + .../blockStates/sign/cherry_hanging_sign.json | 67 ++++ .../1.20/blockStates/sign/cherry_sign.json | 67 ++++ .../sign/cherry_wall_hanging_sign.json | 19 + .../blockStates/sign/cherry_wall_sign.json | 19 + .../sign/crimson_hanging_sign.json | 67 ++++ .../sign/crimson_wall_hanging_sign.json | 19 + .../sign/dark_oak_hanging_sign.json | 67 ++++ .../sign/dark_oak_wall_hanging_sign.json | 19 + .../blockStates/sign/jungle_hanging_sign.json | 67 ++++ .../sign/jungle_wall_hanging_sign.json | 19 + .../sign/mangrove_hanging_sign.json | 67 ++++ .../sign/mangrove_wall_hanging_sign.json | 19 + .../blockStates/sign/oak_hanging_sign.json | 67 ++++ .../sign/oak_wall_hanging_sign.json | 19 + .../blockStates/sign/spruce_hanging_sign.json | 67 ++++ .../sign/spruce_wall_hanging_sign.json | 19 + .../blockStates/sign/warped_hanging_sign.json | 67 ++++ .../sign/warped_wall_hanging_sign.json | 19 + .../viewer/prepare/modelsBuilder.ts | 10 +- .../viewer/prepare/moreGeneratedBlocks.ts | 193 +++------- 100 files changed, 3048 insertions(+), 196 deletions(-) create mode 100644 prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/oak.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/oak_wall.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/sign_wall.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.13/blockStates/sign/sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.13/blockStates/sign/wall_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/acacia.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/acacia_wall.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/birch.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/birch_wall.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/dark_oak.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/dark_oak_wall.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/jungle.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/jungle_wall.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/spruce.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/spruce_wall.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/acacia_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/acacia_wall_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/birch_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/birch_wall_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/dark_oak_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/dark_oak_wall_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/jungle_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/jungle_wall_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/oak_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/oak_wall_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/spruce_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/spruce_wall_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/crimson.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/crimson_wall.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/warped.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/warped_wall.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/crimson_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/crimson_wall_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/warped_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/warped_wall_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.19/blockModels/sign/mangrove.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.19/blockModels/sign/mangrove_wall.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.19/blockStates/sign/mangrove_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.19/blockStates/sign/mangrove_wall_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/acacia_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/acacia_wall_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo_wall.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo_wall_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/birch_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/birch_wall_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry_wall.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry_wall_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/crimson_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/crimson_wall_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/dark_oak_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/dark_oak_wall_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/jungle_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/jungle_wall_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/mangrove_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/mangrove_wall_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/oak_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/oak_wall_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/spruce_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/spruce_wall_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/wall_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/warped_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/warped_wall_hanging.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/acacia_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/acacia_wall_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_wall_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_wall_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/birch_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/birch_wall_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_wall_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_wall_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/crimson_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/crimson_wall_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/dark_oak_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/dark_oak_wall_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/jungle_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/jungle_wall_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/mangrove_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/mangrove_wall_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/oak_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/oak_wall_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/spruce_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/spruce_wall_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/warped_hanging_sign.json create mode 100644 prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/warped_wall_hanging_sign.json diff --git a/prismarine-viewer/viewer/lib/mesher/models.ts b/prismarine-viewer/viewer/lib/mesher/models.ts index 39148aaa..c978c240 100644 --- a/prismarine-viewer/viewer/lib/mesher/models.ts +++ b/prismarine-viewer/viewer/lib/mesher/models.ts @@ -520,9 +520,11 @@ export function getSectionGeometry (sx, sy, sz, world: World) { "west": 1, "east": 3 } - const isWall = block.name.endsWith('wall_sign') || block.name.endsWith('hanging_sign') + const isWall = block.name.endsWith('wall_sign') || block.name.endsWith('wall_hanging_sign') + const isHanging = block.name.endsWith('hanging_sign') attr.signs[key] = { isWall, + isHanging, rotation: isWall ? facingRotationMap[props.facing] : +props.rotation } } diff --git a/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts b/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts index 5a80fa49..de5db815 100644 --- a/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts +++ b/prismarine-viewer/viewer/lib/mesher/test/tests.test.ts @@ -45,12 +45,6 @@ test('Known blocks are not rendered', () => { // should be fixed, but to avoid regressions & for visibility expect(invalidBlocks).toMatchInlineSnapshot(` { - "acacia_hanging_sign": true, - "acacia_wall_hanging_sign": true, - "bamboo_hanging_sign": true, - "bamboo_wall_hanging_sign": true, - "birch_hanging_sign": true, - "birch_wall_hanging_sign": true, "black_banner": true, "black_bed": true, "black_candle": true, @@ -65,18 +59,12 @@ test('Known blocks are not rendered', () => { "brown_wall_banner": true, "bubble_column": true, "candle": true, - "cherry_hanging_sign": true, - "cherry_wall_hanging_sign": true, "creeper_head": true, "creeper_wall_head": true, - "crimson_hanging_sign": true, - "crimson_wall_hanging_sign": true, "cyan_banner": true, "cyan_bed": true, "cyan_candle": true, "cyan_wall_banner": true, - "dark_oak_hanging_sign": true, - "dark_oak_wall_hanging_sign": true, "dragon_head": true, "dragon_wall_head": true, "end_gateway": true, @@ -89,8 +77,6 @@ test('Known blocks are not rendered', () => { "green_bed": true, "green_candle": true, "green_wall_banner": true, - "jungle_hanging_sign": true, - "jungle_wall_hanging_sign": true, "light_blue_banner": true, "light_blue_bed": true, "light_blue_candle": true, @@ -107,10 +93,6 @@ test('Known blocks are not rendered', () => { "magenta_bed": true, "magenta_candle": true, "magenta_wall_banner": true, - "mangrove_hanging_sign": true, - "mangrove_wall_hanging_sign": true, - "oak_hanging_sign": true, - "oak_wall_hanging_sign": true, "orange_banner": true, "orange_bed": true, "orange_candle": true, @@ -138,12 +120,8 @@ test('Known blocks are not rendered', () => { "skeleton_skull": true, "skeleton_wall_skull": true, "snow": true, - "spruce_hanging_sign": true, - "spruce_wall_hanging_sign": true, "structure_void": true, "turtle_egg": true, - "warped_hanging_sign": true, - "warped_wall_hanging_sign": true, "water_cauldron": true, "white_banner": true, "white_bed": true, diff --git a/prismarine-viewer/viewer/lib/worldrendererThree.ts b/prismarine-viewer/viewer/lib/worldrendererThree.ts index 4d28519a..095e5a94 100644 --- a/prismarine-viewer/viewer/lib/worldrendererThree.ts +++ b/prismarine-viewer/viewer/lib/worldrendererThree.ts @@ -112,11 +112,11 @@ export class WorldRendererThree extends WorldRendererCommon { } // should not compute it once if (Object.keys(data.geometry.signs).length) { - for (const [posKey, { isWall, rotation }] of Object.entries(data.geometry.signs)) { + for (const [posKey, { isWall, isHanging, rotation }] of Object.entries(data.geometry.signs)) { const [x, y, z] = posKey.split(',') const signBlockEntity = this.blockEntities[posKey] if (!signBlockEntity) continue - const sign = this.renderSign(new Vec3(+x, +y, +z), rotation, isWall, nbt.simplify(signBlockEntity)) + const sign = this.renderSign(new Vec3(+x, +y, +z), rotation, isWall, isHanging, nbt.simplify(signBlockEntity)) if (!sign) continue object.add(sign) } @@ -165,7 +165,7 @@ export class WorldRendererThree extends WorldRendererCommon { this.renderer.render(this.scene, this.camera) } - renderSign (position: Vec3, rotation: number, isWall: boolean, blockEntity) { + renderSign (position: Vec3, rotation: number, isWall: boolean, isHanging: boolean, blockEntity) { const tex = this.getSignTexture(position, blockEntity) if (!tex) return @@ -182,13 +182,16 @@ export class WorldRendererThree extends WorldRendererCommon { mesh.renderOrder = 999 // todo @sa2urami shouldnt all this be done in worker? - mesh.scale.set(1, 7 / 16, 1) - if (isWall) { - mesh.position.set(0, 0, -(8 - 1.5) / 16 + 0.001) + const lineHeight = 7 / 16; + const scaleFactor = isHanging ? 1.3 : 1 + mesh.scale.set(1 * scaleFactor, lineHeight * scaleFactor, 1 * scaleFactor) + + const thickness = (isHanging ? 2 : 1.5) / 16 + const wallSpacing = 0.25 / 16; + if (isWall && !isHanging) { + mesh.position.set(0, 0, -0.5 + thickness + wallSpacing + 0.0001) } else { - // standing - const faceEnd = 8.75 - mesh.position.set(0, 0, (faceEnd - 16 / 2) / 16 + 0.001) + mesh.position.set(0, 0, thickness / 2 + 0.0001) } const group = new THREE.Group() @@ -196,8 +199,10 @@ export class WorldRendererThree extends WorldRendererCommon { rotation * (isWall ? 90 : 45 / 2) ), 0) group.add(mesh) - const y = isWall ? 4.5 / 16 + mesh.scale.y / 2 : (1 - (mesh.scale.y / 2)) - group.position.set(position.x + 0.5, position.y + y, position.z + 0.5) + const height = (isHanging ? 10 : 8)/16 + const heightOffset = (isHanging ? 0 : isWall ? 4.333 : 9.333) / 16 + const textPosition = height/2 + heightOffset + group.position.set(position.x + 0.5, position.y + textPosition, position.z + 0.5) return group } diff --git a/prismarine-viewer/viewer/prepare/atlas.ts b/prismarine-viewer/viewer/prepare/atlas.ts index fc3e4029..cf73fdc4 100644 --- a/prismarine-viewer/viewer/prepare/atlas.ts +++ b/prismarine-viewer/viewer/prepare/atlas.ts @@ -49,19 +49,18 @@ export const makeTextureAtlas = (input: string[], getInputData: (name) => { cont const texturesIndex = {} - let skipXY = [] as [x: number, y: number][] - let offset = 0 + let nextX = 0 + let nextY = 0 + let rowMaxY = 0 + + const goToNextRow = () => { + nextX = 0 + nextY += rowMaxY + rowMaxY = 0 + } + const suSv = tileSize / imgSize for (const i in input) { - const pos = +i + offset - const x = (pos % texSize) * tileSize - const y = Math.floor(pos / texSize) * tileSize - - if (skipXY.some(([sx, sy]) => sx === x + 1 && sy === y)) { - // todo more offsets - offset++ - } - const img = new Image() const keyValue = input[i] const inputData = getInputData(keyValue) @@ -76,16 +75,24 @@ export const makeTextureAtlas = (input: string[], getInputData: (name) => { cont renderHeight = Math.ceil(img.height / tileSize) * tileSize su = renderWidth / imgSize sv = renderHeight / imgSize - if (renderWidth > tileSize) { - offset += Math.ceil(renderWidth / tileSize) - 1 - } - if (renderHeight > tileSize) { - const skipYs = Math.ceil(renderHeight / tileSize) - 1 - for (let i = 1; i <= skipYs; i++) { - skipXY.push([x, y + i]) - } + if (renderHeight > imgSize || renderWidth > imgSize) { + throw new Error('Texture ' + keyValue + ' is too big') } } + + if (nextX + renderWidth > imgSize) { + goToNextRow() + } + + const x = nextX + const y = nextY + + nextX += renderWidth + rowMaxY = Math.max(rowMaxY, renderHeight) + if (nextX >= imgSize) { + goToNextRow() + } + g.drawImage(img, 0, 0, renderWidth, renderHeight, x, y, renderWidth, renderHeight) const cleanName = keyValue.split('.').slice(0, -1).join('.') || keyValue @@ -116,7 +123,7 @@ export function makeBlockTextureAtlas (mcAssets: McAssets) { // const textureFiles = mostEncounteredBlocks.map(x => x + '.png') textureFiles.unshift(...localTextures) - const { generated: additionalTextures, twoTileTextures, origSizeTextures } = getAdditionalTextures() + const { generated: additionalTextures, origSizeTextures } = getAdditionalTextures() textureFiles.push(...Object.keys(additionalTextures)) const atlas = makeTextureAtlas(textureFiles, name => { @@ -129,7 +136,7 @@ export function makeBlockTextureAtlas (mcAssets: McAssets) { return { contents, - tileWidthMult: twoTileTextures.includes(name) ? 2 : undefined, + // tileWidthMult: twoTileTextures.includes(name) ? 2 : undefined, origSizeTextures } }) diff --git a/prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/oak.json b/prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/oak.json new file mode 100644 index 00000000..2f16a429 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/oak.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign", + "textures": { + "sign": "entity/sign" + } +} diff --git a/prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/oak_wall.json b/prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/oak_wall.json new file mode 100644 index 00000000..dfdb230f --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/oak_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign_wall", + "textures": { + "sign": "entity/sign" + } +} diff --git a/prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/sign.json b/prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/sign.json new file mode 100644 index 00000000..4562cfae --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/sign.json @@ -0,0 +1,140 @@ +{ + "elements": [ + { + "from": [ + 7.25, + 0, + 7.25 + ], + "to": [ + 8.75, + 9.333, + 8.75 + ], + "faces": { + "north": { + "uv": [ + 1.5, + 8, + 2, + 15 + ], + "texture": "#sign" + }, + "east": { + "uv": [ + 1, + 8, + 1.5, + 15 + ], + "texture": "#sign" + }, + "south": { + "uv": [ + 0.5, + 8, + 1, + 15 + ], + "texture": "#sign" + }, + "west": { + "uv": [ + 0, + 8, + 0.5, + 15 + ], + "texture": "#sign" + }, + "up": { + "uv": [ + 0.5, + 7, + 1, + 8 + ], + "texture": "#sign" + }, + "down": { + "uv": [ + 1, + 7, + 1.5, + 8 + ], + "texture": "#sign" + } + } + }, + { + "from": [ + 0, + 9.333, + 7.25 + ], + "to": [ + 16, + 17.333, + 8.75 + ], + "faces": { + "north": { + "uv": [ + 7, + 1, + 13, + 7 + ], + "texture": "#sign" + }, + "east": { + "uv": [ + 6.5, + 1, + 7, + 7 + ], + "texture": "#sign" + }, + "south": { + "uv": [ + 0.5, + 1, + 6.5, + 7 + ], + "texture": "#sign" + }, + "west": { + "uv": [ + 0, + 1, + 0.5, + 7 + ], + "texture": "#sign" + }, + "up": { + "uv": [ + 0.5, + 0, + 6.5, + 1 + ], + "texture": "#sign" + }, + "down": { + "uv": [ + 6.5, + 1, + 12.5, + 0 + ], + "texture": "#sign" + } + } + } + ] +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/sign_wall.json b/prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/sign_wall.json new file mode 100644 index 00000000..b743c983 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.13/blockModels/sign/sign_wall.json @@ -0,0 +1,72 @@ +{ + "elements": [ + { + "from": [ + 0, + 4.333, + 0.25 + ], + "to": [ + 16, + 12.333, + 1.75 + ], + "faces": { + "north": { + "uv": [ + 7, + 1, + 13, + 7 + ], + "texture": "#sign" + }, + "east": { + "uv": [ + 6.5, + 1, + 7, + 7 + ], + "texture": "#sign" + }, + "south": { + "uv": [ + 0.5, + 1, + 6.5, + 7 + ], + "texture": "#sign" + }, + "west": { + "uv": [ + 0, + 1, + 0.5, + 7 + ], + "texture": "#sign" + }, + "up": { + "uv": [ + 0.5, + 0, + 6.5, + 1 + ], + "texture": "#sign" + }, + "down": { + "uv": [ + 6.5, + 1, + 12.5, + 0 + ], + "texture": "#sign" + } + } + } + ] +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.13/blockStates/sign/sign.json b/prismarine-viewer/viewer/prepare/data/1.13/blockStates/sign/sign.json new file mode 100644 index 00000000..4ebcedcd --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.13/blockStates/sign/sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/oak" + }, + "rotation=1": { + "model": "sign/oak", + "y": 22.5 + }, + "rotation=2": { + "model": "sign/oak", + "y": 45 + }, + "rotation=3": { + "model": "sign/oak", + "y": 67.5 + }, + "rotation=4": { + "model": "sign/oak", + "y": 90 + }, + "rotation=5": { + "model": "sign/oak", + "y": 112.5 + }, + "rotation=6": { + "model": "sign/oak", + "y": 135 + }, + "rotation=7": { + "model": "sign/oak", + "y": 157.5 + }, + "rotation=8": { + "model": "sign/oak", + "y": 180 + }, + "rotation=9": { + "model": "sign/oak", + "y": 202.5 + }, + "rotation=10": { + "model": "sign/oak", + "y": 225 + }, + "rotation=11": { + "model": "sign/oak", + "y": 247.5 + }, + "rotation=12": { + "model": "sign/oak", + "y": 270 + }, + "rotation=13": { + "model": "sign/oak", + "y": 292.5 + }, + "rotation=14": { + "model": "sign/oak", + "y": 315 + }, + "rotation=15": { + "model": "sign/oak", + "y": 337.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.13/blockStates/sign/wall_sign.json b/prismarine-viewer/viewer/prepare/data/1.13/blockStates/sign/wall_sign.json new file mode 100644 index 00000000..26453d53 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.13/blockStates/sign/wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=south": { + "model": "sign/oak_wall" + }, + "facing=west": { + "model": "sign/oak_wall", + "y": 90 + }, + "facing=north": { + "model": "sign/oak_wall", + "y": 180 + }, + "facing=east": { + "model": "sign/oak_wall", + "y": 270 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/acacia.json b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/acacia.json new file mode 100644 index 00000000..7057ded0 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/acacia.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign", + "textures": { + "sign": "entity/signs/acacia" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/acacia_wall.json b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/acacia_wall.json new file mode 100644 index 00000000..70b755bf --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/acacia_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign_wall", + "textures": { + "sign": "entity/signs/acacia" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/birch.json b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/birch.json new file mode 100644 index 00000000..d20d1438 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/birch.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign", + "textures": { + "sign": "entity/signs/birch" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/birch_wall.json b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/birch_wall.json new file mode 100644 index 00000000..c7983bee --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/birch_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign_wall", + "textures": { + "sign": "entity/signs/birch" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/dark_oak.json b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/dark_oak.json new file mode 100644 index 00000000..803add52 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/dark_oak.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign", + "textures": { + "sign": "entity/signs/dark_oak" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/dark_oak_wall.json b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/dark_oak_wall.json new file mode 100644 index 00000000..b410acfe --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/dark_oak_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign_wall", + "textures": { + "sign": "entity/signs/dark_oak" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/jungle.json b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/jungle.json new file mode 100644 index 00000000..17d52250 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/jungle.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign", + "textures": { + "sign": "entity/signs/jungle" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/jungle_wall.json b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/jungle_wall.json new file mode 100644 index 00000000..bfe6c8f8 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/jungle_wall.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/sign_wall", + "textures": { + "sign": "entity/signs/jungle" + } +} diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/spruce.json b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/spruce.json new file mode 100644 index 00000000..8f2b2179 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/spruce.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign", + "textures": { + "sign": "entity/signs/spruce" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/spruce_wall.json b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/spruce_wall.json new file mode 100644 index 00000000..1509eb3c --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockModels/sign/spruce_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign_wall", + "textures": { + "sign": "entity/signs/spruce" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/acacia_sign.json b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/acacia_sign.json new file mode 100644 index 00000000..370c2c84 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/acacia_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/acacia" + }, + "rotation=1": { + "model": "sign/acacia", + "y": 22.5 + }, + "rotation=2": { + "model": "sign/acacia", + "y": 45 + }, + "rotation=3": { + "model": "sign/acacia", + "y": 67.5 + }, + "rotation=4": { + "model": "sign/acacia", + "y": 90 + }, + "rotation=5": { + "model": "sign/acacia", + "y": 112.5 + }, + "rotation=6": { + "model": "sign/acacia", + "y": 135 + }, + "rotation=7": { + "model": "sign/acacia", + "y": 157.5 + }, + "rotation=8": { + "model": "sign/acacia", + "y": 180 + }, + "rotation=9": { + "model": "sign/acacia", + "y": 202.5 + }, + "rotation=10": { + "model": "sign/acacia", + "y": 225 + }, + "rotation=11": { + "model": "sign/acacia", + "y": 247.5 + }, + "rotation=12": { + "model": "sign/acacia", + "y": 270 + }, + "rotation=13": { + "model": "sign/acacia", + "y": 292.5 + }, + "rotation=14": { + "model": "sign/acacia", + "y": 315 + }, + "rotation=15": { + "model": "sign/acacia", + "y": 337.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/acacia_wall_sign.json b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/acacia_wall_sign.json new file mode 100644 index 00000000..b524b126 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/acacia_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=south": { + "model": "sign/acacia_wall" + }, + "facing=west": { + "model": "sign/acacia_wall", + "y": 90 + }, + "facing=north": { + "model": "sign/acacia_wall", + "y": 180 + }, + "facing=east": { + "model": "sign/acacia_wall", + "y": 270 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/birch_sign.json b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/birch_sign.json new file mode 100644 index 00000000..2ffe5fd5 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/birch_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/birch" + }, + "rotation=1": { + "model": "sign/birch", + "y": 22.5 + }, + "rotation=2": { + "model": "sign/birch", + "y": 45 + }, + "rotation=3": { + "model": "sign/birch", + "y": 67.5 + }, + "rotation=4": { + "model": "sign/birch", + "y": 90 + }, + "rotation=5": { + "model": "sign/birch", + "y": 112.5 + }, + "rotation=6": { + "model": "sign/birch", + "y": 135 + }, + "rotation=7": { + "model": "sign/birch", + "y": 157.5 + }, + "rotation=8": { + "model": "sign/birch", + "y": 180 + }, + "rotation=9": { + "model": "sign/birch", + "y": 202.5 + }, + "rotation=10": { + "model": "sign/birch", + "y": 225 + }, + "rotation=11": { + "model": "sign/birch", + "y": 247.5 + }, + "rotation=12": { + "model": "sign/birch", + "y": 270 + }, + "rotation=13": { + "model": "sign/birch", + "y": 292.5 + }, + "rotation=14": { + "model": "sign/birch", + "y": 315 + }, + "rotation=15": { + "model": "sign/birch", + "y": 337.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/birch_wall_sign.json b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/birch_wall_sign.json new file mode 100644 index 00000000..622924b5 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/birch_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=south": { + "model": "sign/birch_wall" + }, + "facing=west": { + "model": "sign/birch_wall", + "y": 90 + }, + "facing=north": { + "model": "sign/birch_wall", + "y": 180 + }, + "facing=east": { + "model": "sign/birch_wall", + "y": 270 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/dark_oak_sign.json b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/dark_oak_sign.json new file mode 100644 index 00000000..6001019b --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/dark_oak_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/dark_oak" + }, + "rotation=1": { + "model": "sign/dark_oak", + "y": 22.5 + }, + "rotation=2": { + "model": "sign/dark_oak", + "y": 45 + }, + "rotation=3": { + "model": "sign/dark_oak", + "y": 67.5 + }, + "rotation=4": { + "model": "sign/dark_oak", + "y": 90 + }, + "rotation=5": { + "model": "sign/dark_oak", + "y": 112.5 + }, + "rotation=6": { + "model": "sign/dark_oak", + "y": 135 + }, + "rotation=7": { + "model": "sign/dark_oak", + "y": 157.5 + }, + "rotation=8": { + "model": "sign/dark_oak", + "y": 180 + }, + "rotation=9": { + "model": "sign/dark_oak", + "y": 202.5 + }, + "rotation=10": { + "model": "sign/dark_oak", + "y": 225 + }, + "rotation=11": { + "model": "sign/dark_oak", + "y": 247.5 + }, + "rotation=12": { + "model": "sign/dark_oak", + "y": 270 + }, + "rotation=13": { + "model": "sign/dark_oak", + "y": 292.5 + }, + "rotation=14": { + "model": "sign/dark_oak", + "y": 315 + }, + "rotation=15": { + "model": "sign/dark_oak", + "y": 337.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/dark_oak_wall_sign.json b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/dark_oak_wall_sign.json new file mode 100644 index 00000000..4b5cc921 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/dark_oak_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=south": { + "model": "sign/dark_oak_wall" + }, + "facing=west": { + "model": "sign/dark_oak_wall", + "y": 90 + }, + "facing=north": { + "model": "sign/dark_oak_wall", + "y": 180 + }, + "facing=east": { + "model": "sign/dark_oak_wall", + "y": 270 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/jungle_sign.json b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/jungle_sign.json new file mode 100644 index 00000000..983c2d68 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/jungle_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/jungle" + }, + "rotation=1": { + "model": "sign/jungle", + "y": 22.5 + }, + "rotation=2": { + "model": "sign/jungle", + "y": 45 + }, + "rotation=3": { + "model": "sign/jungle", + "y": 67.5 + }, + "rotation=4": { + "model": "sign/jungle", + "y": 90 + }, + "rotation=5": { + "model": "sign/jungle", + "y": 112.5 + }, + "rotation=6": { + "model": "sign/jungle", + "y": 135 + }, + "rotation=7": { + "model": "sign/jungle", + "y": 157.5 + }, + "rotation=8": { + "model": "sign/jungle", + "y": 180 + }, + "rotation=9": { + "model": "sign/jungle", + "y": 202.5 + }, + "rotation=10": { + "model": "sign/jungle", + "y": 225 + }, + "rotation=11": { + "model": "sign/jungle", + "y": 247.5 + }, + "rotation=12": { + "model": "sign/jungle", + "y": 270 + }, + "rotation=13": { + "model": "sign/jungle", + "y": 292.5 + }, + "rotation=14": { + "model": "sign/jungle", + "y": 315 + }, + "rotation=15": { + "model": "sign/jungle", + "y": 337.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/jungle_wall_sign.json b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/jungle_wall_sign.json new file mode 100644 index 00000000..898f7323 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/jungle_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=south": { + "model": "sign/jungle_wall" + }, + "facing=west": { + "model": "sign/jungle_wall", + "y": 90 + }, + "facing=north": { + "model": "sign/jungle_wall", + "y": 180 + }, + "facing=east": { + "model": "sign/jungle_wall", + "y": 270 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/oak_sign.json b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/oak_sign.json new file mode 100644 index 00000000..4ebcedcd --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/oak_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/oak" + }, + "rotation=1": { + "model": "sign/oak", + "y": 22.5 + }, + "rotation=2": { + "model": "sign/oak", + "y": 45 + }, + "rotation=3": { + "model": "sign/oak", + "y": 67.5 + }, + "rotation=4": { + "model": "sign/oak", + "y": 90 + }, + "rotation=5": { + "model": "sign/oak", + "y": 112.5 + }, + "rotation=6": { + "model": "sign/oak", + "y": 135 + }, + "rotation=7": { + "model": "sign/oak", + "y": 157.5 + }, + "rotation=8": { + "model": "sign/oak", + "y": 180 + }, + "rotation=9": { + "model": "sign/oak", + "y": 202.5 + }, + "rotation=10": { + "model": "sign/oak", + "y": 225 + }, + "rotation=11": { + "model": "sign/oak", + "y": 247.5 + }, + "rotation=12": { + "model": "sign/oak", + "y": 270 + }, + "rotation=13": { + "model": "sign/oak", + "y": 292.5 + }, + "rotation=14": { + "model": "sign/oak", + "y": 315 + }, + "rotation=15": { + "model": "sign/oak", + "y": 337.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/oak_wall_sign.json b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/oak_wall_sign.json new file mode 100644 index 00000000..26453d53 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/oak_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=south": { + "model": "sign/oak_wall" + }, + "facing=west": { + "model": "sign/oak_wall", + "y": 90 + }, + "facing=north": { + "model": "sign/oak_wall", + "y": 180 + }, + "facing=east": { + "model": "sign/oak_wall", + "y": 270 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/spruce_sign.json b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/spruce_sign.json new file mode 100644 index 00000000..78722223 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/spruce_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/spruce" + }, + "rotation=1": { + "model": "sign/spruce", + "y": 22.5 + }, + "rotation=2": { + "model": "sign/spruce", + "y": 45 + }, + "rotation=3": { + "model": "sign/spruce", + "y": 67.5 + }, + "rotation=4": { + "model": "sign/spruce", + "y": 90 + }, + "rotation=5": { + "model": "sign/spruce", + "y": 112.5 + }, + "rotation=6": { + "model": "sign/spruce", + "y": 135 + }, + "rotation=7": { + "model": "sign/spruce", + "y": 157.5 + }, + "rotation=8": { + "model": "sign/spruce", + "y": 180 + }, + "rotation=9": { + "model": "sign/spruce", + "y": 202.5 + }, + "rotation=10": { + "model": "sign/spruce", + "y": 225 + }, + "rotation=11": { + "model": "sign/spruce", + "y": 247.5 + }, + "rotation=12": { + "model": "sign/spruce", + "y": 270 + }, + "rotation=13": { + "model": "sign/spruce", + "y": 292.5 + }, + "rotation=14": { + "model": "sign/spruce", + "y": 315 + }, + "rotation=15": { + "model": "sign/spruce", + "y": 337.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/spruce_wall_sign.json b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/spruce_wall_sign.json new file mode 100644 index 00000000..8366709a --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.14/blockStates/sign/spruce_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=south": { + "model": "sign/spruce_wall" + }, + "facing=west": { + "model": "sign/spruce_wall", + "y": 90 + }, + "facing=north": { + "model": "sign/spruce_wall", + "y": 180 + }, + "facing=east": { + "model": "sign/spruce_wall", + "y": 270 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/crimson.json b/prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/crimson.json new file mode 100644 index 00000000..201e42ad --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/crimson.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign", + "textures": { + "sign": "entity/signs/crimson" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/crimson_wall.json b/prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/crimson_wall.json new file mode 100644 index 00000000..3faf8661 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/crimson_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign_wall", + "textures": { + "sign": "entity/signs/crimson" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/warped.json b/prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/warped.json new file mode 100644 index 00000000..6dd3269e --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/warped.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign", + "textures": { + "sign": "entity/signs/warped" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/warped_wall.json b/prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/warped_wall.json new file mode 100644 index 00000000..a046ec14 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.16/blockModels/sign/warped_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign_wall", + "textures": { + "sign": "entity/signs/warped" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/crimson_sign.json b/prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/crimson_sign.json new file mode 100644 index 00000000..5df00a29 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/crimson_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/crimson" + }, + "rotation=1": { + "model": "sign/crimson", + "y": 22.5 + }, + "rotation=2": { + "model": "sign/crimson", + "y": 45 + }, + "rotation=3": { + "model": "sign/crimson", + "y": 67.5 + }, + "rotation=4": { + "model": "sign/crimson", + "y": 90 + }, + "rotation=5": { + "model": "sign/crimson", + "y": 112.5 + }, + "rotation=6": { + "model": "sign/crimson", + "y": 135 + }, + "rotation=7": { + "model": "sign/crimson", + "y": 157.5 + }, + "rotation=8": { + "model": "sign/crimson", + "y": 180 + }, + "rotation=9": { + "model": "sign/crimson", + "y": 202.5 + }, + "rotation=10": { + "model": "sign/crimson", + "y": 225 + }, + "rotation=11": { + "model": "sign/crimson", + "y": 247.5 + }, + "rotation=12": { + "model": "sign/crimson", + "y": 270 + }, + "rotation=13": { + "model": "sign/crimson", + "y": 292.5 + }, + "rotation=14": { + "model": "sign/crimson", + "y": 315 + }, + "rotation=15": { + "model": "sign/crimson", + "y": 337.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/crimson_wall_sign.json b/prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/crimson_wall_sign.json new file mode 100644 index 00000000..149227b2 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/crimson_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=south": { + "model": "sign/crimson_wall" + }, + "facing=west": { + "model": "sign/crimson_wall", + "y": 90 + }, + "facing=north": { + "model": "sign/crimson_wall", + "y": 180 + }, + "facing=east": { + "model": "sign/crimson_wall", + "y": 270 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/warped_sign.json b/prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/warped_sign.json new file mode 100644 index 00000000..4af216ca --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/warped_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/warped" + }, + "rotation=1": { + "model": "sign/warped", + "y": 22.5 + }, + "rotation=2": { + "model": "sign/warped", + "y": 45 + }, + "rotation=3": { + "model": "sign/warped", + "y": 67.5 + }, + "rotation=4": { + "model": "sign/warped", + "y": 90 + }, + "rotation=5": { + "model": "sign/warped", + "y": 112.5 + }, + "rotation=6": { + "model": "sign/warped", + "y": 135 + }, + "rotation=7": { + "model": "sign/warped", + "y": 157.5 + }, + "rotation=8": { + "model": "sign/warped", + "y": 180 + }, + "rotation=9": { + "model": "sign/warped", + "y": 202.5 + }, + "rotation=10": { + "model": "sign/warped", + "y": 225 + }, + "rotation=11": { + "model": "sign/warped", + "y": 247.5 + }, + "rotation=12": { + "model": "sign/warped", + "y": 270 + }, + "rotation=13": { + "model": "sign/warped", + "y": 292.5 + }, + "rotation=14": { + "model": "sign/warped", + "y": 315 + }, + "rotation=15": { + "model": "sign/warped", + "y": 337.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/warped_wall_sign.json b/prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/warped_wall_sign.json new file mode 100644 index 00000000..b1d7f5e0 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.16/blockStates/sign/warped_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=south": { + "model": "sign/warped_wall" + }, + "facing=west": { + "model": "sign/warped_wall", + "y": 90 + }, + "facing=north": { + "model": "sign/warped_wall", + "y": 180 + }, + "facing=east": { + "model": "sign/warped_wall", + "y": 270 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.19/blockModels/sign/mangrove.json b/prismarine-viewer/viewer/prepare/data/1.19/blockModels/sign/mangrove.json new file mode 100644 index 00000000..bb82e85a --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.19/blockModels/sign/mangrove.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign", + "textures": { + "sign": "entity/signs/mangrove" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.19/blockModels/sign/mangrove_wall.json b/prismarine-viewer/viewer/prepare/data/1.19/blockModels/sign/mangrove_wall.json new file mode 100644 index 00000000..30e9bd55 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.19/blockModels/sign/mangrove_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign_wall", + "textures": { + "sign": "entity/signs/mangrove" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.19/blockStates/sign/mangrove_sign.json b/prismarine-viewer/viewer/prepare/data/1.19/blockStates/sign/mangrove_sign.json new file mode 100644 index 00000000..54a92e7e --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.19/blockStates/sign/mangrove_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/mangrove" + }, + "rotation=1": { + "model": "sign/mangrove", + "y": 22.5 + }, + "rotation=2": { + "model": "sign/mangrove", + "y": 45 + }, + "rotation=3": { + "model": "sign/mangrove", + "y": 67.5 + }, + "rotation=4": { + "model": "sign/mangrove", + "y": 90 + }, + "rotation=5": { + "model": "sign/mangrove", + "y": 112.5 + }, + "rotation=6": { + "model": "sign/mangrove", + "y": 135 + }, + "rotation=7": { + "model": "sign/mangrove", + "y": 157.5 + }, + "rotation=8": { + "model": "sign/mangrove", + "y": 180 + }, + "rotation=9": { + "model": "sign/mangrove", + "y": 202.5 + }, + "rotation=10": { + "model": "sign/mangrove", + "y": 225 + }, + "rotation=11": { + "model": "sign/mangrove", + "y": 247.5 + }, + "rotation=12": { + "model": "sign/mangrove", + "y": 270 + }, + "rotation=13": { + "model": "sign/mangrove", + "y": 292.5 + }, + "rotation=14": { + "model": "sign/mangrove", + "y": 315 + }, + "rotation=15": { + "model": "sign/mangrove", + "y": 337.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.19/blockStates/sign/mangrove_wall_sign.json b/prismarine-viewer/viewer/prepare/data/1.19/blockStates/sign/mangrove_wall_sign.json new file mode 100644 index 00000000..d00760e7 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.19/blockStates/sign/mangrove_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=south": { + "model": "sign/mangrove_wall" + }, + "facing=west": { + "model": "sign/mangrove_wall", + "y": 90 + }, + "facing=north": { + "model": "sign/mangrove_wall", + "y": 180 + }, + "facing=east": { + "model": "sign/mangrove_wall", + "y": 270 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/acacia_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/acacia_hanging.json new file mode 100644 index 00000000..13702388 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/acacia_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/hanging", + "textures": { + "wood": "entity/signs/hanging/acacia" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/acacia_wall_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/acacia_wall_hanging.json new file mode 100644 index 00000000..1e2a9d85 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/acacia_wall_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/wall_hanging", + "textures": { + "wood": "entity/signs/hanging/acacia" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo.json new file mode 100644 index 00000000..6c9fd930 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign", + "textures": { + "sign": "entity/signs/bamboo" + } +} diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo_hanging.json new file mode 100644 index 00000000..c5302b1b --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/hanging", + "textures": { + "wood": "entity/signs/hanging/bamboo" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo_wall.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo_wall.json new file mode 100644 index 00000000..bf726f10 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign_wall", + "textures": { + "sign": "entity/signs/bamboo" + } +} diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo_wall_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo_wall_hanging.json new file mode 100644 index 00000000..d3a46453 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/bamboo_wall_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/wall_hanging", + "textures": { + "wood": "entity/signs/hanging/bamboo" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/birch_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/birch_hanging.json new file mode 100644 index 00000000..71a4b708 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/birch_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/hanging", + "textures": { + "wood": "entity/signs/hanging/birch" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/birch_wall_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/birch_wall_hanging.json new file mode 100644 index 00000000..13b215a5 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/birch_wall_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/wall_hanging", + "textures": { + "wood": "entity/signs/hanging/birch" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry.json new file mode 100644 index 00000000..406c6318 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign", + "textures": { + "sign": "entity/signs/cherry" + } +} diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry_hanging.json new file mode 100644 index 00000000..6ff4c5b7 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/hanging", + "textures": { + "wood": "entity/signs/hanging/cherry" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry_wall.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry_wall.json new file mode 100644 index 00000000..b3b07061 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "sign/sign_wall", + "textures": { + "sign": "entity/signs/cherry" + } +} diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry_wall_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry_wall_hanging.json new file mode 100644 index 00000000..aeef94bd --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/cherry_wall_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/wall_hanging", + "textures": { + "wood": "entity/signs/hanging/cherry" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/crimson_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/crimson_hanging.json new file mode 100644 index 00000000..a6c9286a --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/crimson_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/hanging", + "textures": { + "wood": "entity/signs/hanging/crimson" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/crimson_wall_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/crimson_wall_hanging.json new file mode 100644 index 00000000..20889940 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/crimson_wall_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/wall_hanging", + "textures": { + "wood": "entity/signs/hanging/crimson" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/dark_oak_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/dark_oak_hanging.json new file mode 100644 index 00000000..506c4440 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/dark_oak_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/hanging", + "textures": { + "wood": "entity/signs/hanging/dark_oak" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/dark_oak_wall_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/dark_oak_wall_hanging.json new file mode 100644 index 00000000..21c1ebd5 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/dark_oak_wall_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/wall_hanging", + "textures": { + "wood": "entity/signs/hanging/dark_oak" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/hanging.json new file mode 100644 index 00000000..52d90ee3 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/hanging.json @@ -0,0 +1,115 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "ambientocclusion": false, + "texture_size": [ + 64, + 32 + ], + "textures": { + "wood": "entity/signs/hanging/oak" + }, + "elements": [ + { + "name": "Sign", + "from": [ + 1, + 0, + 7 + ], + "to": [ + 15, + 10, + 9 + ], + "faces": { + "north": { + "uv": [ + 4.5, + 7, + 8, + 12 + ], + "texture": "#wood" + }, + "east": { + "uv": [ + 4, + 7, + 4.5, + 12 + ], + "texture": "#wood" + }, + "south": { + "uv": [ + 0.5, + 7, + 4, + 12 + ], + "texture": "#wood" + }, + "west": { + "uv": [ + 0, + 7, + 0.5, + 12 + ], + "texture": "#wood" + }, + "up": { + "uv": [ + 4, + 6, + 0.5, + 7 + ], + "rotation": 180, + "texture": "#wood" + }, + "down": { + "uv": [ + 4, + 7, + 7.5, + 6 + ], + "texture": "#wood" + } + } + }, + { + "from": [ + 2, + 10, + 8 + ], + "to": [ + 14, + 16, + 8 + ], + "faces": { + "north": { + "uv": [ + 3.5, + 3, + 6.5, + 6 + ], + "texture": "#wood" + }, + "south": { + "uv": [ + 3.5, + 3, + 6.5, + 6 + ], + "texture": "#wood" + } + } + } + ] +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/jungle_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/jungle_hanging.json new file mode 100644 index 00000000..db141f6d --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/jungle_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/hanging", + "textures": { + "wood": "entity/signs/hanging/jungle" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/jungle_wall_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/jungle_wall_hanging.json new file mode 100644 index 00000000..aefe92f3 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/jungle_wall_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/wall_hanging", + "textures": { + "wood": "entity/signs/hanging/jungle" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/mangrove_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/mangrove_hanging.json new file mode 100644 index 00000000..e84c41f2 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/mangrove_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/hanging", + "textures": { + "wood": "entity/signs/hanging/mangrove" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/mangrove_wall_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/mangrove_wall_hanging.json new file mode 100644 index 00000000..e5feb72e --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/mangrove_wall_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/wall_hanging", + "textures": { + "wood": "entity/signs/hanging/mangrove" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/oak_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/oak_hanging.json new file mode 100644 index 00000000..7437c82f --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/oak_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/hanging", + "textures": { + "wood": "entity/signs/hanging/oak" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/oak_wall_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/oak_wall_hanging.json new file mode 100644 index 00000000..3c8d9e5e --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/oak_wall_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/wall_hanging", + "textures": { + "wood": "entity/signs/hanging/oak" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/spruce_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/spruce_hanging.json new file mode 100644 index 00000000..3dee635d --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/spruce_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/hanging", + "textures": { + "wood": "entity/signs/hanging/spruce" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/spruce_wall_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/spruce_wall_hanging.json new file mode 100644 index 00000000..71e66b9c --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/spruce_wall_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/wall_hanging", + "textures": { + "wood": "entity/signs/hanging/spruce" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/wall_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/wall_hanging.json new file mode 100644 index 00000000..424ffe37 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/wall_hanging.json @@ -0,0 +1,347 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "ambientocclusion": false, + "texture_size": [ + 64, + 32 + ], + "textures": { + "wood": "entity/signs/hanging/oak" + }, + "elements": [ + { + "name": "Sign", + "from": [ + 1, + 0, + 7 + ], + "to": [ + 15, + 10, + 9 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 4.5, + 7, + 8, + 12 + ], + "texture": "#wood" + }, + "east": { + "uv": [ + 4, + 7, + 4.5, + 12 + ], + "texture": "#wood" + }, + "south": { + "uv": [ + 0.5, + 7, + 4, + 12 + ], + "texture": "#wood" + }, + "west": { + "uv": [ + 0, + 7, + 0.5, + 12 + ], + "texture": "#wood" + }, + "up": { + "uv": [ + 4, + 6, + 0.5, + 7 + ], + "rotation": 180, + "texture": "#wood" + }, + "down": { + "uv": [ + 4, + 7, + 7.5, + 6 + ], + "texture": "#wood" + } + } + }, + { + "name": "Hanger", + "from": [ + 0, + 14, + 6 + ], + "to": [ + 16, + 16, + 10 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 6, + 2, + 10, + 3 + ], + "texture": "#wood" + }, + "east": { + "uv": [ + 0, + 2, + 1, + 3 + ], + "texture": "#wood" + }, + "south": { + "uv": [ + 1, + 2, + 5, + 3 + ], + "texture": "#wood" + }, + "west": { + "uv": [ + 0, + 2, + 1, + 3 + ], + "texture": "#wood" + }, + "up": { + "uv": [ + 1, + 0, + 5, + 2 + ], + "rotation": 180, + "texture": "#wood" + }, + "down": { + "uv": [ + 5, + 0, + 9, + 2 + ], + "texture": "#wood" + } + } + }, + { + "name": "ChainA1", + "from": [ + 4.8, + 10, + 10.5 + ], + "to": [ + 6.2, + 14, + 10.5 + ], + "shade": false, + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "faces": { + "north": { + "uv": [ + 1.5, + 3, + 2.25, + 6 + ], + "texture": "#wood" + }, + "south": { + "uv": [ + 1.5, + 3, + 2.25, + 6 + ], + "texture": "#wood" + } + } + }, + { + "name": "ChainB2", + "from": [ + 10.5, + 10, + 4.8 + ], + "to": [ + 10.5, + 14, + 6.2 + ], + "shade": false, + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "faces": { + "east": { + "uv": [ + 0, + 3, + 0.75, + 6 + ], + "texture": "#wood" + }, + "west": { + "uv": [ + 0, + 3, + 0.75, + 6 + ], + "texture": "#wood" + } + } + }, + { + "name": "ChainB1", + "from": [ + 9.8, + 10, + 5.5 + ], + "to": [ + 11.2, + 14, + 5.5 + ], + "shade": false, + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "faces": { + "north": { + "uv": [ + 1.5, + 3, + 2.25, + 6 + ], + "texture": "#wood" + }, + "south": { + "uv": [ + 1.5, + 3, + 2.25, + 6 + ], + "texture": "#wood" + } + } + }, + { + "name": "ChainA2", + "from": [ + 5.5, + 10, + 9.8 + ], + "to": [ + 5.5, + 14, + 11.2 + ], + "shade": false, + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "faces": { + "east": { + "uv": [ + 0, + 3, + 0.75, + 6 + ], + "texture": "#wood" + }, + "west": { + "uv": [ + 0, + 3, + 0.75, + 6 + ], + "texture": "#wood" + } + } + } + ] +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/warped_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/warped_hanging.json new file mode 100644 index 00000000..015ba2c0 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/warped_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/hanging", + "textures": { + "wood": "entity/signs/hanging/warped" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/warped_wall_hanging.json b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/warped_wall_hanging.json new file mode 100644 index 00000000..8870c317 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockModels/sign/warped_wall_hanging.json @@ -0,0 +1,7 @@ +{ + "credit": "Made with Blockbench by TyBraniff for Bluemaps support.", + "parent": "sign/wall_hanging", + "textures": { + "wood": "entity/signs/hanging/warped" + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/acacia_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/acacia_hanging_sign.json new file mode 100644 index 00000000..18a25013 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/acacia_hanging_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/acacia_hanging", + "y": 180 + }, + "rotation=1": { + "model": "sign/acacia_hanging", + "y": 202.5 + }, + "rotation=2": { + "model": "sign/acacia_hanging", + "y": 225 + }, + "rotation=3": { + "model": "sign/acacia_hanging", + "y": 247.5 + }, + "rotation=4": { + "model": "sign/acacia_hanging", + "y": 270 + }, + "rotation=5": { + "model": "sign/acacia_hanging", + "y": 292.5 + }, + "rotation=6": { + "model": "sign/acacia_hanging", + "y": 315 + }, + "rotation=7": { + "model": "sign/acacia_hanging", + "y": 337.5 + }, + "rotation=8": { + "model": "sign/acacia_hanging" + }, + "rotation=9": { + "model": "sign/acacia_hanging", + "y": 22.5 + }, + "rotation=10": { + "model": "sign/acacia_hanging", + "y": 45 + }, + "rotation=11": { + "model": "sign/acacia_hanging", + "y": 67.5 + }, + "rotation=12": { + "model": "sign/acacia_hanging", + "y": 90 + }, + "rotation=13": { + "model": "sign/acacia_hanging", + "y": 112.5 + }, + "rotation=14": { + "model": "sign/acacia_hanging", + "y": 135 + }, + "rotation=15": { + "model": "sign/acacia_hanging", + "y": 157.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/acacia_wall_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/acacia_wall_hanging_sign.json new file mode 100644 index 00000000..edbae40d --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/acacia_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "sign/acacia_wall_hanging", + "y": 90 + }, + "facing=south": { + "model": "sign/acacia_wall_hanging", + "y": 180 + }, + "facing=west": { + "model": "sign/acacia_wall_hanging", + "y": 270 + }, + "facing=north": { + "model": "sign/acacia_wall_hanging" + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_hanging_sign.json new file mode 100644 index 00000000..5ff1854b --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_hanging_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/bamboo_hanging", + "y": 180 + }, + "rotation=1": { + "model": "sign/bamboo_hanging", + "y": 202.5 + }, + "rotation=2": { + "model": "sign/bamboo_hanging", + "y": 225 + }, + "rotation=3": { + "model": "sign/bamboo_hanging", + "y": 247.5 + }, + "rotation=4": { + "model": "sign/bamboo_hanging", + "y": 270 + }, + "rotation=5": { + "model": "sign/bamboo_hanging", + "y": 292.5 + }, + "rotation=6": { + "model": "sign/bamboo_hanging", + "y": 315 + }, + "rotation=7": { + "model": "sign/bamboo_hanging", + "y": 337.5 + }, + "rotation=8": { + "model": "sign/bamboo_hanging" + }, + "rotation=9": { + "model": "sign/bamboo_hanging", + "y": 22.5 + }, + "rotation=10": { + "model": "sign/bamboo_hanging", + "y": 45 + }, + "rotation=11": { + "model": "sign/bamboo_hanging", + "y": 67.5 + }, + "rotation=12": { + "model": "sign/bamboo_hanging", + "y": 90 + }, + "rotation=13": { + "model": "sign/bamboo_hanging", + "y": 112.5 + }, + "rotation=14": { + "model": "sign/bamboo_hanging", + "y": 135 + }, + "rotation=15": { + "model": "sign/bamboo_hanging", + "y": 157.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_sign.json new file mode 100644 index 00000000..1041460a --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/bamboo" + }, + "rotation=1": { + "model": "sign/bamboo", + "y": 22.5 + }, + "rotation=2": { + "model": "sign/bamboo", + "y": 45 + }, + "rotation=3": { + "model": "sign/bamboo", + "y": 67.5 + }, + "rotation=4": { + "model": "sign/bamboo", + "y": 90 + }, + "rotation=5": { + "model": "sign/bamboo", + "y": 112.5 + }, + "rotation=6": { + "model": "sign/bamboo", + "y": 135 + }, + "rotation=7": { + "model": "sign/bamboo", + "y": 157.5 + }, + "rotation=8": { + "model": "sign/bamboo", + "y": 180 + }, + "rotation=9": { + "model": "sign/bamboo", + "y": 202.5 + }, + "rotation=10": { + "model": "sign/bamboo", + "y": 225 + }, + "rotation=11": { + "model": "sign/bamboo", + "y": 247.5 + }, + "rotation=12": { + "model": "sign/bamboo", + "y": 270 + }, + "rotation=13": { + "model": "sign/bamboo", + "y": 292.5 + }, + "rotation=14": { + "model": "sign/bamboo", + "y": 315 + }, + "rotation=15": { + "model": "sign/bamboo", + "y": 337.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_wall_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_wall_hanging_sign.json new file mode 100644 index 00000000..3bd24804 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "sign/bamboo_wall_hanging", + "y": 90 + }, + "facing=south": { + "model": "sign/bamboo_wall_hanging", + "y": 180 + }, + "facing=west": { + "model": "sign/bamboo_wall_hanging", + "y": 270 + }, + "facing=north": { + "model": "sign/bamboo_wall_hanging" + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_wall_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_wall_sign.json new file mode 100644 index 00000000..8b5ce481 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/bamboo_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=south": { + "model": "sign/bamboo_wall" + }, + "facing=west": { + "model": "sign/bamboo_wall", + "y": 90 + }, + "facing=north": { + "model": "sign/bamboo_wall", + "y": 180 + }, + "facing=east": { + "model": "sign/bamboo_wall", + "y": 270 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/birch_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/birch_hanging_sign.json new file mode 100644 index 00000000..6052d4f7 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/birch_hanging_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/birch_hanging", + "y": 180 + }, + "rotation=1": { + "model": "sign/birch_hanging", + "y": 202.5 + }, + "rotation=2": { + "model": "sign/birch_hanging", + "y": 225 + }, + "rotation=3": { + "model": "sign/birch_hanging", + "y": 247.5 + }, + "rotation=4": { + "model": "sign/birch_hanging", + "y": 270 + }, + "rotation=5": { + "model": "sign/birch_hanging", + "y": 292.5 + }, + "rotation=6": { + "model": "sign/birch_hanging", + "y": 315 + }, + "rotation=7": { + "model": "sign/birch_hanging", + "y": 337.5 + }, + "rotation=8": { + "model": "sign/birch_hanging" + }, + "rotation=9": { + "model": "sign/birch_hanging", + "y": 22.5 + }, + "rotation=10": { + "model": "sign/birch_hanging", + "y": 45 + }, + "rotation=11": { + "model": "sign/birch_hanging", + "y": 67.5 + }, + "rotation=12": { + "model": "sign/birch_hanging", + "y": 90 + }, + "rotation=13": { + "model": "sign/birch_hanging", + "y": 112.5 + }, + "rotation=14": { + "model": "sign/birch_hanging", + "y": 135 + }, + "rotation=15": { + "model": "sign/birch_hanging", + "y": 157.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/birch_wall_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/birch_wall_hanging_sign.json new file mode 100644 index 00000000..656e8093 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/birch_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "sign/birch_wall_hanging", + "y": 90 + }, + "facing=south": { + "model": "sign/birch_wall_hanging", + "y": 180 + }, + "facing=west": { + "model": "sign/birch_wall_hanging", + "y": 270 + }, + "facing=north": { + "model": "sign/birch_wall_hanging" + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_hanging_sign.json new file mode 100644 index 00000000..32ce33dc --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_hanging_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/cherry_hanging", + "y": 180 + }, + "rotation=1": { + "model": "sign/cherry_hanging", + "y": 202.5 + }, + "rotation=2": { + "model": "sign/cherry_hanging", + "y": 225 + }, + "rotation=3": { + "model": "sign/cherry_hanging", + "y": 247.5 + }, + "rotation=4": { + "model": "sign/cherry_hanging", + "y": 270 + }, + "rotation=5": { + "model": "sign/cherry_hanging", + "y": 292.5 + }, + "rotation=6": { + "model": "sign/cherry_hanging", + "y": 315 + }, + "rotation=7": { + "model": "sign/cherry_hanging", + "y": 337.5 + }, + "rotation=8": { + "model": "sign/cherry_hanging" + }, + "rotation=9": { + "model": "sign/cherry_hanging", + "y": 22.5 + }, + "rotation=10": { + "model": "sign/cherry_hanging", + "y": 45 + }, + "rotation=11": { + "model": "sign/cherry_hanging", + "y": 67.5 + }, + "rotation=12": { + "model": "sign/cherry_hanging", + "y": 90 + }, + "rotation=13": { + "model": "sign/cherry_hanging", + "y": 112.5 + }, + "rotation=14": { + "model": "sign/cherry_hanging", + "y": 135 + }, + "rotation=15": { + "model": "sign/cherry_hanging", + "y": 157.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_sign.json new file mode 100644 index 00000000..4e562a26 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/cherry" + }, + "rotation=1": { + "model": "sign/cherry", + "y": 22.5 + }, + "rotation=2": { + "model": "sign/cherry", + "y": 45 + }, + "rotation=3": { + "model": "sign/cherry", + "y": 67.5 + }, + "rotation=4": { + "model": "sign/cherry", + "y": 90 + }, + "rotation=5": { + "model": "sign/cherry", + "y": 112.5 + }, + "rotation=6": { + "model": "sign/cherry", + "y": 135 + }, + "rotation=7": { + "model": "sign/cherry", + "y": 157.5 + }, + "rotation=8": { + "model": "sign/cherry", + "y": 180 + }, + "rotation=9": { + "model": "sign/cherry", + "y": 202.5 + }, + "rotation=10": { + "model": "sign/cherry", + "y": 225 + }, + "rotation=11": { + "model": "sign/cherry", + "y": 247.5 + }, + "rotation=12": { + "model": "sign/cherry", + "y": 270 + }, + "rotation=13": { + "model": "sign/cherry", + "y": 292.5 + }, + "rotation=14": { + "model": "sign/cherry", + "y": 315 + }, + "rotation=15": { + "model": "sign/cherry", + "y": 337.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_wall_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_wall_hanging_sign.json new file mode 100644 index 00000000..3e0a2d04 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "sign/cherry_wall_hanging", + "y": 90 + }, + "facing=south": { + "model": "sign/cherry_wall_hanging", + "y": 180 + }, + "facing=west": { + "model": "sign/cherry_wall_hanging", + "y": 270 + }, + "facing=north": { + "model": "sign/cherry_wall_hanging" + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_wall_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_wall_sign.json new file mode 100644 index 00000000..1b13342c --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/cherry_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=south": { + "model": "sign/cherry_wall" + }, + "facing=west": { + "model": "sign/cherry_wall", + "y": 90 + }, + "facing=north": { + "model": "sign/cherry_wall", + "y": 180 + }, + "facing=east": { + "model": "sign/cherry_wall", + "y": 270 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/crimson_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/crimson_hanging_sign.json new file mode 100644 index 00000000..6e4131f2 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/crimson_hanging_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/crimson_hanging", + "y": 180 + }, + "rotation=1": { + "model": "sign/crimson_hanging", + "y": 202.5 + }, + "rotation=2": { + "model": "sign/crimson_hanging", + "y": 225 + }, + "rotation=3": { + "model": "sign/crimson_hanging", + "y": 247.5 + }, + "rotation=4": { + "model": "sign/crimson_hanging", + "y": 270 + }, + "rotation=5": { + "model": "sign/crimson_hanging", + "y": 292.5 + }, + "rotation=6": { + "model": "sign/crimson_hanging", + "y": 315 + }, + "rotation=7": { + "model": "sign/crimson_hanging", + "y": 337.5 + }, + "rotation=8": { + "model": "sign/crimson_hanging" + }, + "rotation=9": { + "model": "sign/crimson_hanging", + "y": 22.5 + }, + "rotation=10": { + "model": "sign/crimson_hanging", + "y": 45 + }, + "rotation=11": { + "model": "sign/crimson_hanging", + "y": 67.5 + }, + "rotation=12": { + "model": "sign/crimson_hanging", + "y": 90 + }, + "rotation=13": { + "model": "sign/crimson_hanging", + "y": 112.5 + }, + "rotation=14": { + "model": "sign/crimson_hanging", + "y": 135 + }, + "rotation=15": { + "model": "sign/crimson_hanging", + "y": 157.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/crimson_wall_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/crimson_wall_hanging_sign.json new file mode 100644 index 00000000..63c560ae --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/crimson_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "sign/crimson_wall_hanging", + "y": 90 + }, + "facing=south": { + "model": "sign/crimson_wall_hanging", + "y": 180 + }, + "facing=west": { + "model": "sign/crimson_wall_hanging", + "y": 270 + }, + "facing=north": { + "model": "sign/crimson_wall_hanging" + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/dark_oak_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/dark_oak_hanging_sign.json new file mode 100644 index 00000000..a2bc0458 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/dark_oak_hanging_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/dark_oak_hanging", + "y": 180 + }, + "rotation=1": { + "model": "sign/dark_oak_hanging", + "y": 202.5 + }, + "rotation=2": { + "model": "sign/dark_oak_hanging", + "y": 225 + }, + "rotation=3": { + "model": "sign/dark_oak_hanging", + "y": 247.5 + }, + "rotation=4": { + "model": "sign/dark_oak_hanging", + "y": 270 + }, + "rotation=5": { + "model": "sign/dark_oak_hanging", + "y": 292.5 + }, + "rotation=6": { + "model": "sign/dark_oak_hanging", + "y": 315 + }, + "rotation=7": { + "model": "sign/dark_oak_hanging", + "y": 337.5 + }, + "rotation=8": { + "model": "sign/dark_oak_hanging" + }, + "rotation=9": { + "model": "sign/dark_oak_hanging", + "y": 22.5 + }, + "rotation=10": { + "model": "sign/dark_oak_hanging", + "y": 45 + }, + "rotation=11": { + "model": "sign/dark_oak_hanging", + "y": 67.5 + }, + "rotation=12": { + "model": "sign/dark_oak_hanging", + "y": 90 + }, + "rotation=13": { + "model": "sign/dark_oak_hanging", + "y": 112.5 + }, + "rotation=14": { + "model": "sign/dark_oak_hanging", + "y": 135 + }, + "rotation=15": { + "model": "sign/dark_oak_hanging", + "y": 157.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/dark_oak_wall_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/dark_oak_wall_hanging_sign.json new file mode 100644 index 00000000..138154f9 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/dark_oak_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "sign/dark_oak_wall_hanging", + "y": 90 + }, + "facing=south": { + "model": "sign/dark_oak_wall_hanging", + "y": 180 + }, + "facing=west": { + "model": "sign/dark_oak_wall_hanging", + "y": 270 + }, + "facing=north": { + "model": "sign/dark_oak_wall_hanging" + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/jungle_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/jungle_hanging_sign.json new file mode 100644 index 00000000..9f1f9eeb --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/jungle_hanging_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/jungle_hanging", + "y": 180 + }, + "rotation=1": { + "model": "sign/jungle_hanging", + "y": 202.5 + }, + "rotation=2": { + "model": "sign/jungle_hanging", + "y": 225 + }, + "rotation=3": { + "model": "sign/jungle_hanging", + "y": 247.5 + }, + "rotation=4": { + "model": "sign/jungle_hanging", + "y": 270 + }, + "rotation=5": { + "model": "sign/jungle_hanging", + "y": 292.5 + }, + "rotation=6": { + "model": "sign/jungle_hanging", + "y": 315 + }, + "rotation=7": { + "model": "sign/jungle_hanging", + "y": 337.5 + }, + "rotation=8": { + "model": "sign/jungle_hanging" + }, + "rotation=9": { + "model": "sign/jungle_hanging", + "y": 22.5 + }, + "rotation=10": { + "model": "sign/jungle_hanging", + "y": 45 + }, + "rotation=11": { + "model": "sign/jungle_hanging", + "y": 67.5 + }, + "rotation=12": { + "model": "sign/jungle_hanging", + "y": 90 + }, + "rotation=13": { + "model": "sign/jungle_hanging", + "y": 112.5 + }, + "rotation=14": { + "model": "sign/jungle_hanging", + "y": 135 + }, + "rotation=15": { + "model": "sign/jungle_hanging", + "y": 157.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/jungle_wall_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/jungle_wall_hanging_sign.json new file mode 100644 index 00000000..3bdb8191 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/jungle_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "sign/jungle_wall_hanging", + "y": 90 + }, + "facing=south": { + "model": "sign/jungle_wall_hanging", + "y": 180 + }, + "facing=west": { + "model": "sign/jungle_wall_hanging", + "y": 270 + }, + "facing=north": { + "model": "sign/jungle_wall_hanging" + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/mangrove_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/mangrove_hanging_sign.json new file mode 100644 index 00000000..ff977160 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/mangrove_hanging_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/mangrove_hanging", + "y": 180 + }, + "rotation=1": { + "model": "sign/mangrove_hanging", + "y": 202.5 + }, + "rotation=2": { + "model": "sign/mangrove_hanging", + "y": 225 + }, + "rotation=3": { + "model": "sign/mangrove_hanging", + "y": 247.5 + }, + "rotation=4": { + "model": "sign/mangrove_hanging", + "y": 270 + }, + "rotation=5": { + "model": "sign/mangrove_hanging", + "y": 292.5 + }, + "rotation=6": { + "model": "sign/mangrove_hanging", + "y": 315 + }, + "rotation=7": { + "model": "sign/mangrove_hanging", + "y": 337.5 + }, + "rotation=8": { + "model": "sign/mangrove_hanging" + }, + "rotation=9": { + "model": "sign/mangrove_hanging", + "y": 22.5 + }, + "rotation=10": { + "model": "sign/mangrove_hanging", + "y": 45 + }, + "rotation=11": { + "model": "sign/mangrove_hanging", + "y": 67.5 + }, + "rotation=12": { + "model": "sign/mangrove_hanging", + "y": 90 + }, + "rotation=13": { + "model": "sign/mangrove_hanging", + "y": 112.5 + }, + "rotation=14": { + "model": "sign/mangrove_hanging", + "y": 135 + }, + "rotation=15": { + "model": "sign/mangrove_hanging", + "y": 157.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/mangrove_wall_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/mangrove_wall_hanging_sign.json new file mode 100644 index 00000000..9d1d019a --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/mangrove_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "sign/mangrove_wall_hanging", + "y": 90 + }, + "facing=south": { + "model": "sign/mangrove_wall_hanging", + "y": 180 + }, + "facing=west": { + "model": "sign/mangrove_wall_hanging", + "y": 270 + }, + "facing=north": { + "model": "sign/mangrove_wall_hanging" + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/oak_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/oak_hanging_sign.json new file mode 100644 index 00000000..01e66da8 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/oak_hanging_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/oak_hanging", + "y": 180 + }, + "rotation=1": { + "model": "sign/oak_hanging", + "y": 202.5 + }, + "rotation=2": { + "model": "sign/oak_hanging", + "y": 225 + }, + "rotation=3": { + "model": "sign/oak_hanging", + "y": 247.5 + }, + "rotation=4": { + "model": "sign/oak_hanging", + "y": 270 + }, + "rotation=5": { + "model": "sign/oak_hanging", + "y": 292.5 + }, + "rotation=6": { + "model": "sign/oak_hanging", + "y": 315 + }, + "rotation=7": { + "model": "sign/oak_hanging", + "y": 337.5 + }, + "rotation=8": { + "model": "sign/oak_hanging" + }, + "rotation=9": { + "model": "sign/oak_hanging", + "y": 22.5 + }, + "rotation=10": { + "model": "sign/oak_hanging", + "y": 45 + }, + "rotation=11": { + "model": "sign/oak_hanging", + "y": 67.5 + }, + "rotation=12": { + "model": "sign/oak_hanging", + "y": 90 + }, + "rotation=13": { + "model": "sign/oak_hanging", + "y": 112.5 + }, + "rotation=14": { + "model": "sign/oak_hanging", + "y": 135 + }, + "rotation=15": { + "model": "sign/oak_hanging", + "y": 157.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/oak_wall_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/oak_wall_hanging_sign.json new file mode 100644 index 00000000..9af80947 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/oak_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "sign/oak_wall_hanging", + "y": 90 + }, + "facing=south": { + "model": "sign/oak_wall_hanging", + "y": 180 + }, + "facing=west": { + "model": "sign/oak_wall_hanging", + "y": 270 + }, + "facing=north": { + "model": "sign/oak_wall_hanging" + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/spruce_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/spruce_hanging_sign.json new file mode 100644 index 00000000..ee9509f6 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/spruce_hanging_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/spruce_hanging", + "y": 180 + }, + "rotation=1": { + "model": "sign/spruce_hanging", + "y": 202.5 + }, + "rotation=2": { + "model": "sign/spruce_hanging", + "y": 225 + }, + "rotation=3": { + "model": "sign/spruce_hanging", + "y": 247.5 + }, + "rotation=4": { + "model": "sign/spruce_hanging", + "y": 270 + }, + "rotation=5": { + "model": "sign/spruce_hanging", + "y": 292.5 + }, + "rotation=6": { + "model": "sign/spruce_hanging", + "y": 315 + }, + "rotation=7": { + "model": "sign/spruce_hanging", + "y": 337.5 + }, + "rotation=8": { + "model": "sign/spruce_hanging" + }, + "rotation=9": { + "model": "sign/spruce_hanging", + "y": 22.5 + }, + "rotation=10": { + "model": "sign/spruce_hanging", + "y": 45 + }, + "rotation=11": { + "model": "sign/spruce_hanging", + "y": 67.5 + }, + "rotation=12": { + "model": "sign/spruce_hanging", + "y": 90 + }, + "rotation=13": { + "model": "sign/spruce_hanging", + "y": 112.5 + }, + "rotation=14": { + "model": "sign/spruce_hanging", + "y": 135 + }, + "rotation=15": { + "model": "sign/spruce_hanging", + "y": 157.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/spruce_wall_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/spruce_wall_hanging_sign.json new file mode 100644 index 00000000..0b9ec25a --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/spruce_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "sign/spruce_wall_hanging", + "y": 90 + }, + "facing=south": { + "model": "sign/spruce_wall_hanging", + "y": 180 + }, + "facing=west": { + "model": "sign/spruce_wall_hanging", + "y": 270 + }, + "facing=north": { + "model": "sign/spruce_wall_hanging" + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/warped_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/warped_hanging_sign.json new file mode 100644 index 00000000..93764856 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/warped_hanging_sign.json @@ -0,0 +1,67 @@ +{ + "variants": { + "rotation=0": { + "model": "sign/warped_hanging", + "y": 180 + }, + "rotation=1": { + "model": "sign/warped_hanging", + "y": 202.5 + }, + "rotation=2": { + "model": "sign/warped_hanging", + "y": 225 + }, + "rotation=3": { + "model": "sign/warped_hanging", + "y": 247.5 + }, + "rotation=4": { + "model": "sign/warped_hanging", + "y": 270 + }, + "rotation=5": { + "model": "sign/warped_hanging", + "y": 292.5 + }, + "rotation=6": { + "model": "sign/warped_hanging", + "y": 315 + }, + "rotation=7": { + "model": "sign/warped_hanging", + "y": 337.5 + }, + "rotation=8": { + "model": "sign/warped_hanging" + }, + "rotation=9": { + "model": "sign/warped_hanging", + "y": 22.5 + }, + "rotation=10": { + "model": "sign/warped_hanging", + "y": 45 + }, + "rotation=11": { + "model": "sign/warped_hanging", + "y": 67.5 + }, + "rotation=12": { + "model": "sign/warped_hanging", + "y": 90 + }, + "rotation=13": { + "model": "sign/warped_hanging", + "y": 112.5 + }, + "rotation=14": { + "model": "sign/warped_hanging", + "y": 135 + }, + "rotation=15": { + "model": "sign/warped_hanging", + "y": 157.5 + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/warped_wall_hanging_sign.json b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/warped_wall_hanging_sign.json new file mode 100644 index 00000000..378e80f8 --- /dev/null +++ b/prismarine-viewer/viewer/prepare/data/1.20/blockStates/sign/warped_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "sign/warped_wall_hanging", + "y": 90 + }, + "facing=south": { + "model": "sign/warped_wall_hanging", + "y": 180 + }, + "facing=west": { + "model": "sign/warped_wall_hanging", + "y": 270 + }, + "facing=north": { + "model": "sign/warped_wall_hanging" + } + } +} \ No newline at end of file diff --git a/prismarine-viewer/viewer/prepare/modelsBuilder.ts b/prismarine-viewer/viewer/prepare/modelsBuilder.ts index 2a0cac57..b6e5268f 100644 --- a/prismarine-viewer/viewer/prepare/modelsBuilder.ts +++ b/prismarine-viewer/viewer/prepare/modelsBuilder.ts @@ -161,7 +161,7 @@ function prepareModel (model: BlockModel, texturesJson) { const getFinalTexture = (originalBlockName) => { // texture name e.g. blocks/anvil_base - const cleanBlockName = cleanupBlockName(originalBlockName); + const cleanBlockName = cleanupBlockName(originalBlockName) return { ...texturesJson[cleanBlockName], /* __debugName: cleanBlockName */ } } @@ -187,10 +187,12 @@ function prepareModel (model: BlockModel, texturesJson) { for (const sideName of Object.keys(elem.faces)) { const face = elem.faces[sideName] + const textureRaw = face.texture.charAt(0) === '#' + ? finalTextures![face.texture.slice(1)] + : getFinalTexture(face.texture) + if (!textureRaw) throw new Error(`Texture ${face.texture} in ${JSON.stringify(model.textures)} not found`) const finalTexture = deepCopy( - face.texture.charAt(0) === '#' - ? finalTextures![face.texture.slice(1)] - : getFinalTexture(face.texture) + textureRaw ) const _from = elem.from diff --git a/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts b/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts index b343e595..e64b7cff 100644 --- a/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts +++ b/prismarine-viewer/viewer/prepare/moreGeneratedBlocks.ts @@ -4,9 +4,10 @@ import { McAssets } from './modelsBuilder' import path from 'path' import fs from 'fs' import { fileURLToPath } from 'url' +import { versionToNumber } from './utils' // todo refactor -const twoTileTextures: string[] = [] +const handledBlocks = ['water', 'lava', 'barrier'] const origSizeTextures: string[] = [] let currentImage: Jimp let currentBlockName: string @@ -121,115 +122,6 @@ const handleShulkerBox = async (dataBase: string, match: RegExpExecArray) => { await addSimpleCubeWithSides(shulkerBoxTextures) } -const handleSign = async (dataBase: string, match: RegExpExecArray) => { - const states = getBlockStates(currentBlockName) - if (!states) return - - const [, signMaterial = ''] = match - currentImage = await Jimp.read(`${dataBase}entity/${signMaterial ? `signs/${signMaterial}` : 'sign'}.png`) - // todo cache - const signTextures = { - // todo correct mapping - // todo alg to fit to the side - signboard_side: justCrop(0, 2, 2, 12), - face: justCrop(2, 2, 24, 12), - up: justCrop(2, 0, 24, 2), - support: justCrop(0, 16, 2, 14) - } - const blockTextures = await getBlockTexturesFromJimp(signTextures, true) - - const isWall = currentBlockName.includes('wall_') - const isHanging = currentBlockName.includes('hanging_') - const rotationState = states.find(state => state.name === 'rotation') - const faceTexture = { texture: blockTextures.face.texture, uv: blockTextures.face.uv } - if (isWall || isHanging) { - // todo isHanging - if (!isHanging) { - const facingState = states.find(state => state.name === 'facing')! - const facingMap = { - south: 0, - west: 90, - north: 180, - east: 270 - } - - currentMcAssets.blocksStates[currentBlockName] = { - "variants": Object.fromEntries( - facingState.values!.map((_val, i) => { - const val = _val as string - return [`facing=${val}`, { - "model": currentBlockName, - y: facingMap[val], - }] - }) - ) - } - currentMcAssets.blocksModels[currentBlockName] = { - elements: [ - { - // signboard - "from": [0, 4.5, 0], - "to": [16, 11.5, 1.5], - faces: { - south: faceTexture, - east: blockTextures.signboard_side, - west: blockTextures.signboard_side, - up: blockTextures.up, - down: blockTextures.up, - }, - } - ], - } - } - } else if (rotationState) { - currentMcAssets.blocksStates[currentBlockName] = { - "variants": Object.fromEntries( - Array.from({ length: 16 }).map((_val, i) => { - return [`rotation=${i}`, { - "model": currentBlockName, - y: i * (45 / 2), - }] - }) - ) - } - - const supportTexture = blockTextures.support - // TODO fix models.ts, apply textures for signs correctly! - // const supportTexture = { texture: supportTextureImg, uv: [0, 0, 16, 16] } - currentMcAssets.blocksModels[currentBlockName] = { - elements: [ - { - // support post - "from": [7.5, 0, 7.5], - "to": [8.5, 9, 8.5], - faces: { - // todo 14 - north: supportTexture, - east: supportTexture, - south: supportTexture, - west: supportTexture, - } - }, - { - // signboard - "from": [0, 9, 7.25], - "to": [16, 16, 8.75], - faces: { - north: faceTexture, - south: faceTexture, - east: blockTextures.signboard_side, - west: blockTextures.signboard_side, - up: blockTextures.up, - down: blockTextures.up, - }, - } - ], - } - } - twoTileTextures.push(blockTextures.face.texture) - twoTileTextures.push(blockTextures.up.texture) -} - // TODO! should not be there! move to data with signs! const chestModels = { chest: { @@ -405,10 +297,10 @@ const handleChest = async (dataBase: string, match: RegExpExecArray) => { async function loadBlockModelTextures (dataBase: string, blockModel: any) { for (const key in blockModel.textures) { - const texture: string = blockModel.textures[key] - currentImage = await Jimp.read(dataBase + texture + '.png') + let texture: string = blockModel.textures[key] + const useAssetsPath = !!texture.match(/^[0-9.]+\//) blockModel.textures.particle = texture - generatedImageTextures[texture] = `data:image/png;base64,${fs.readFileSync(path.join(dataBase, texture + '.png'), 'base64')}` + generatedImageTextures[texture] = `data:image/png;base64,${fs.readFileSync(path.join(dataBase, useAssetsPath ? '..' : '', texture + '.png'), 'base64')}` origSizeTextures[texture] = true } } @@ -416,11 +308,6 @@ async function loadBlockModelTextures (dataBase: string, blockModel: any) { const handlers = [ [/(.+)_shulker_box$/, handleShulkerBox], [/^shulker_box$/, handleShulkerBox], - [/^sign$/, handleSign], - [/^standing_sign$/, handleSign], - [/^wall_sign$/, handleSign], - [/(.+)_wall_sign$/, handleSign], - [/(.+)_sign$/, handleSign], [/^(?:(ender|trapped)_)?chest$/, handleChest], // [/(^|(.+)_)bed$/, handleBed], // no-op just suppress warning @@ -439,25 +326,58 @@ export const tryHandleBlockEntity = async (dataBase, blockName) => { } } -const handleExternalData = async (dataBase: string, version: string) => { - const [major, minor] = version.split(".") - const dataVer = `${major}.${minor}` - const baseDir = path.join(__dirname, 'data', dataVer) - if (!fs.existsSync(baseDir)) return +async function readAllBlockStates (blockStatesDir: string) { + const files = fs.readdirSync(blockStatesDir) + for (const file of files) { + if (file.endsWith('.json')) { + const state = JSON.parse(fs.readFileSync(path.join(blockStatesDir, file), 'utf-8')) + const name = file.replace('.json', '') + currentMcAssets.blocksStates[name] = state + handledBlocks.push(name) + } else { + await readAllBlockStates(path.join(blockStatesDir, file)) + } + } +} - const blockModelsDir = path.join(baseDir, 'blockModels') - const allBlockModels = fs.readdirSync(blockModelsDir).map(x => x.replace('.json', '')) - for (const blockModel of allBlockModels) { - const model = JSON.parse(fs.readFileSync(path.join(blockModelsDir, blockModel + '.json'), 'utf-8')) - currentMcAssets.blocksModels[blockModel] = model - await loadBlockModelTextures(dataBase, model) +async function readAllBlockModels (dataBase: string, blockModelsDir: string, completePath: string) { + const actualPath = completePath.length ? completePath + "/" : "" + const files = fs.readdirSync(blockModelsDir) + for (const file of files) { + if (file.endsWith('.json')) { + const model = JSON.parse(fs.readFileSync(path.join(blockModelsDir, file), 'utf-8')) + const name = actualPath + file.replace('.json', '') + currentMcAssets.blocksModels[name] = model + await loadBlockModelTextures(dataBase, model) + } else { + await readAllBlockModels(dataBase, path.join(blockModelsDir, file), actualPath + file) + } + } +} + +const handleExternalData = async (assetsPathRoot: string, version: string) => { + const currentVersionNumber = versionToNumber(version) + const versions = fs.readdirSync(path.join(__dirname, 'data'), { withFileTypes: true }) + .filter(x => x.isDirectory()) + .map(x => x.name) + .sort((a, b) => versionToNumber(b) - versionToNumber(a)) + + const allAssetsVersions = fs.readdirSync(assetsPathRoot, { withFileTypes: true }) + .filter(x => x.isDirectory()) + .map(x => x.name) + .sort((a, b) => versionToNumber(b) - versionToNumber(a)) + + const getAssetsVersion = (version: string) => { + return allAssetsVersions[version] ?? allAssetsVersions.find(x => x.startsWith(version)) } - const blockStatesDir = path.join(baseDir, 'blockStates') - const allBlockStates = fs.readdirSync(blockStatesDir).map(x => x.replace('.json', '')) - for (const blockState of allBlockStates) { - const state = JSON.parse(fs.readFileSync(path.join(blockStatesDir, blockState + '.json'), 'utf-8')) - currentMcAssets.blocksStates[blockState] = state + for (const curVer of versions) { + const baseDir = path.join(__dirname, 'data', curVer) + if (versionToNumber(curVer) > currentVersionNumber) continue + + const assetsVersion = getAssetsVersion(curVer) + await readAllBlockStates(path.join(baseDir, 'blockStates')) + await readAllBlockModels(path.join(assetsPathRoot, assetsVersion), path.join(baseDir, 'blockModels'), "") } } @@ -466,7 +386,6 @@ export const prepareMoreGeneratedBlocks = async (mcAssets: McAssets) => { const allTheBlocks = mcData.blocksArray.map(x => x.name) currentMcAssets = mcAssets - const handledBlocks = ['water', 'lava', 'barrier'] // todo const ignoredBlocks = ['skull', 'structure_void', 'banner', 'bed', 'end_portal'] @@ -481,7 +400,7 @@ export const prepareMoreGeneratedBlocks = async (mcAssets: McAssets) => { } } - await handleExternalData(mcAssets.directory, mcAssets.version) + await handleExternalData(path.join(mcAssets.directory, '..'), mcAssets.version) const warnings: string[] = [] for (const [name, model] of Object.entries(mcAssets.blocksModels)) { @@ -498,5 +417,5 @@ export const prepareMoreGeneratedBlocks = async (mcAssets: McAssets) => { } export const getAdditionalTextures = () => { - return { generated: generatedImageTextures, twoTileTextures, origSizeTextures } + return { generated: generatedImageTextures, origSizeTextures } } From 2d4b89651cdd8ff4ad9268d51aeb1c90f01b8968 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 11 Jun 2024 21:17:07 +0300 Subject: [PATCH 0244/1195] format, remove useless comment --- .../viewer/lib/worldrendererThree.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/prismarine-viewer/viewer/lib/worldrendererThree.ts b/prismarine-viewer/viewer/lib/worldrendererThree.ts index 095e5a94..9a76474b 100644 --- a/prismarine-viewer/viewer/lib/worldrendererThree.ts +++ b/prismarine-viewer/viewer/lib/worldrendererThree.ts @@ -22,7 +22,7 @@ export class WorldRendererThree extends WorldRendererCommon { return Object.values(this.sectionObjects).reduce((acc, obj) => acc + (obj as any).tilesCount, 0) } - constructor(public scene: THREE.Scene, public renderer: THREE.WebGLRenderer, public config: WorldRendererConfig) { + constructor (public scene: THREE.Scene, public renderer: THREE.WebGLRenderer, public config: WorldRendererConfig) { super(config) this.starField = new StarField(scene) } @@ -181,13 +181,12 @@ export class WorldRendererThree extends WorldRendererCommon { const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), new THREE.MeshBasicMaterial({ map: tex, transparent: true, })) mesh.renderOrder = 999 - // todo @sa2urami shouldnt all this be done in worker? - const lineHeight = 7 / 16; + const lineHeight = 7 / 16 const scaleFactor = isHanging ? 1.3 : 1 mesh.scale.set(1 * scaleFactor, lineHeight * scaleFactor, 1 * scaleFactor) const thickness = (isHanging ? 2 : 1.5) / 16 - const wallSpacing = 0.25 / 16; + const wallSpacing = 0.25 / 16 if (isWall && !isHanging) { mesh.position.set(0, 0, -0.5 + thickness + wallSpacing + 0.0001) } else { @@ -199,9 +198,9 @@ export class WorldRendererThree extends WorldRendererCommon { rotation * (isWall ? 90 : 45 / 2) ), 0) group.add(mesh) - const height = (isHanging ? 10 : 8)/16 + const height = (isHanging ? 10 : 8) / 16 const heightOffset = (isHanging ? 0 : isWall ? 4.333 : 9.333) / 16 - const textPosition = height/2 + heightOffset + const textPosition = height / 2 + heightOffset group.position.set(position.x + 0.5, position.y + textPosition, position.z + 0.5) return group } @@ -322,7 +321,7 @@ class StarField { } } - constructor(private scene: THREE.Scene) { + constructor (private scene: THREE.Scene) { } addToScene () { @@ -386,7 +385,7 @@ class StarField { const version = parseInt(THREE.REVISION.replace(/\D+/g, '')) class StarfieldMaterial extends THREE.ShaderMaterial { - constructor() { + constructor () { super({ uniforms: { time: { value: 0.0 }, fade: { value: 1.0 } }, vertexShader: /* glsl */ ` From 4f20e2481947d813317b3888e75e77b0b85f39dc Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 12 Jun 2024 21:14:48 +0300 Subject: [PATCH 0245/1195] up flying squid --- package.json | 2 +- pnpm-lock.yaml | 79 ++++++++++++++++++++++++-------------------------- 2 files changed, 39 insertions(+), 42 deletions(-) diff --git a/package.json b/package.json index 7bbde636..f5f55c7f 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "esbuild-plugin-polyfill-node": "^0.3.0", "express": "^4.18.2", "filesize": "^10.0.12", - "flying-squid": "npm:@zardoy/flying-squid@^0.0.24", + "flying-squid": "npm:@zardoy/flying-squid@^0.0.26", "fs-extra": "^11.1.1", "google-drive-browserfs": "github:zardoy/browserfs#google-drive", "iconify-icon": "^1.0.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 38a9ebb6..3cbab433 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -104,8 +104,8 @@ importers: specifier: ^10.0.12 version: 10.0.12 flying-squid: - specifier: npm:@zardoy/flying-squid@^0.0.24 - version: '@zardoy/flying-squid@0.0.24(encoding@0.1.13)' + specifier: npm:@zardoy/flying-squid@^0.0.26 + version: '@zardoy/flying-squid@0.0.26(encoding@0.1.13)' fs-extra: specifier: ^11.1.1 version: 11.1.1 @@ -386,7 +386,7 @@ importers: version: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chunk: specifier: github:zardoy/prismarine-chunk - version: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.65.0) + version: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0) prismarine-schematic: specifier: ^1.2.0 version: 1.2.3 @@ -3054,8 +3054,8 @@ packages: resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - '@zardoy/flying-squid@0.0.24': - resolution: {integrity: sha512-C+VNHyh9yYB7aG9OL6r9NR5bF73fyRQ0rHhkvvz901hLBZI3+5nOPdcA6XwJm9XX9BYStXbLTHp6shmo20JRHQ==} + '@zardoy/flying-squid@0.0.26': + resolution: {integrity: sha512-JUGrr+9I4vgXrgjop5iRpulRhWUgRbPC1j+xPapgICtJPEGuekpXIOOBjAL+X7yu7I5IcrmtG4XCjvTKcC0lIQ==} engines: {node: '>=8'} hasBin: true @@ -6718,13 +6718,8 @@ packages: prismarine-chat@1.9.1: resolution: {integrity: sha512-x7WWa5MNhiLZSO6tw+YyKpzquFZ+DNISVgiV6K3SU0GsishMXe+nto02WhF/4AuFerKdugm9u1d/r4C4zSkJOg==} - prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/eb39a905761a36f733a456110e6b49d655bf5c16: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/eb39a905761a36f733a456110e6b49d655bf5c16} - version: 1.35.0 - engines: {node: '>=14'} - - prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f} + prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a} version: 1.35.0 engines: {node: '>=14'} @@ -6747,6 +6742,10 @@ packages: resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29} version: 2.7.0 + prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/422aed5db94f341c3807f1a918c7b83c9ebcfe20: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/422aed5db94f341c3807f1a918c7b83c9ebcfe20} + version: 2.8.0 + prismarine-realms@1.3.2: resolution: {integrity: sha512-5apl9Ru8veTj5q2OozRc4GZOuSIcs3yY4UEtALiLKHstBe8bRw8vNlaz4Zla3jsQ8yP/ul1b1IJINTRbocuA6g==} @@ -6764,9 +6763,9 @@ packages: prismarine-windows@2.9.0: resolution: {integrity: sha512-fm4kOLjGFPov7TEJRmXHoiPabxIQrG36r2mDjlNxfkcLfMHFb3/1ML6mp4iRQa7wL0GK4DIAyiBqCWoeWDxARg==} - prismarine-world@https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465} - version: 3.6.2 + prismarine-world@https://codeload.github.com/zardoy/prismarine-world/tar.gz/187a87f6d71cba12881a7bbaa510ed9085bf6da7: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-world/tar.gz/187a87f6d71cba12881a7bbaa510ed9085bf6da7} + version: 3.6.3 engines: {node: '>=8.0.0'} process-nextick-args@2.0.1: @@ -11931,7 +11930,7 @@ snapshots: '@types/emscripten': 1.39.8 tslib: 1.14.1 - '@zardoy/flying-squid@0.0.24(encoding@0.1.13)': + '@zardoy/flying-squid@0.0.26(encoding@0.1.13)': dependencies: '@tootallnate/once': 2.0.0 change-case: 4.1.2 @@ -11946,13 +11945,13 @@ snapshots: mkdirp: 2.1.6 node-gzip: 1.1.2 node-rsa: 1.1.1 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/eb39a905761a36f733a456110e6b49d655bf5c16(minecraft-data@3.65.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 - prismarine-provider-anvil: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29(minecraft-data@3.65.0) + prismarine-provider-anvil: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/422aed5db94f341c3807f1a918c7b83c9ebcfe20(minecraft-data@3.65.0) prismarine-windows: 2.9.0 - prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465 + prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/187a87f6d71cba12881a7bbaa510ed9085bf6da7 rambda: 9.2.0 random-seed: 0.3.0 range: 0.0.3 @@ -13212,7 +13211,7 @@ snapshots: diamond-square@https://codeload.github.com/zardoy/diamond-square/tar.gz/915fce8e27fe8eb45464d89b9563956afa4f7687: dependencies: minecraft-data: 3.65.0 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/eb39a905761a36f733a456110e6b49d655bf5c16(minecraft-data@3.65.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0) random-seed: 0.3.0 vec3: 0.1.8 @@ -15779,7 +15778,7 @@ snapshots: prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chat: 1.10.1 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/eb39a905761a36f733a456110e6b49d655bf5c16(minecraft-data@3.65.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 @@ -15787,7 +15786,7 @@ snapshots: prismarine-recipe: 1.3.1(prismarine-registry@1.7.0) prismarine-registry: 1.7.0 prismarine-windows: 2.9.0 - prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465 + prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/187a87f6d71cba12881a7bbaa510ed9085bf6da7 protodef: 1.15.0 typed-emitter: 1.4.0 vec3: 0.1.8 @@ -15802,7 +15801,7 @@ snapshots: prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chat: 1.10.1 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/eb39a905761a36f733a456110e6b49d655bf5c16(minecraft-data@3.65.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 @@ -15810,7 +15809,7 @@ snapshots: prismarine-recipe: 1.3.1(prismarine-registry@1.7.0) prismarine-registry: 1.7.0 prismarine-windows: 2.9.0 - prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465 + prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/187a87f6d71cba12881a7bbaa510ed9085bf6da7 protodef: 1.15.0 typed-emitter: 1.4.0 vec3: 0.1.8 @@ -16526,20 +16525,7 @@ snapshots: prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 - prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/eb39a905761a36f733a456110e6b49d655bf5c16(minecraft-data@3.65.0): - dependencies: - prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 - prismarine-nbt: 2.5.0 - prismarine-registry: 1.7.0 - smart-buffer: 4.2.0 - uint4: 0.1.2 - vec3: 0.1.8 - xxhash-wasm: 0.4.2 - transitivePeerDependencies: - - minecraft-data - - prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.65.0): + prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0): dependencies: prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 @@ -16580,13 +16566,24 @@ snapshots: prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29(minecraft-data@3.65.0): dependencies: - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/f32234a724a5c2482ffbaf85edc5e91c7ab9b38f(minecraft-data@3.65.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0) prismarine-nbt: 2.5.0 uint4: 0.1.2 vec3: 0.1.8 transitivePeerDependencies: - minecraft-data + prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/422aed5db94f341c3807f1a918c7b83c9ebcfe20(minecraft-data@3.65.0): + dependencies: + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0) + prismarine-nbt: 2.5.0 + prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/187a87f6d71cba12881a7bbaa510ed9085bf6da7 + uint4: 0.1.2 + vec3: 0.1.8 + transitivePeerDependencies: + - minecraft-data + prismarine-realms@1.3.2(encoding@0.1.13): dependencies: debug: 4.3.4(supports-color@8.1.1) @@ -16609,7 +16606,7 @@ snapshots: minecraft-data: 3.65.0 prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-nbt: 2.2.1 - prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465 + prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/187a87f6d71cba12881a7bbaa510ed9085bf6da7 vec3: 0.1.8 prismarine-windows@2.9.0: @@ -16618,7 +16615,7 @@ snapshots: prismarine-registry: 1.7.0 typed-emitter: 2.1.0 - prismarine-world@https://codeload.github.com/zardoy/prismarine-world/tar.gz/6ae6f009d38460de284f8c226c665f04cbad9465: + prismarine-world@https://codeload.github.com/zardoy/prismarine-world/tar.gz/187a87f6d71cba12881a7bbaa510ed9085bf6da7: dependencies: vec3: 0.1.8 From 5be093a25f88dae99d216416b6f4cd64bc06ecd2 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 13 Jun 2024 03:46:59 +0300 Subject: [PATCH 0246/1195] feat: support world saves for all versions of Minecraft Java! --- package.json | 2 +- pnpm-lock.yaml | 100 +++++++----------- .../viewer/lib/worldDataEmitter.ts | 2 +- src/createLocalServer.ts | 2 +- src/getCollisionShapes.ts | 6 +- src/globals.d.ts | 4 +- src/loadSave.ts | 10 +- src/react/MainMenu.tsx | 2 +- src/soundSystem.ts | 10 +- src/water.ts | 2 +- 10 files changed, 61 insertions(+), 79 deletions(-) diff --git a/package.json b/package.json index f5f55c7f..37e24dbb 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "esbuild-plugin-polyfill-node": "^0.3.0", "express": "^4.18.2", "filesize": "^10.0.12", - "flying-squid": "npm:@zardoy/flying-squid@^0.0.26", + "flying-squid": "npm:@zardoy/flying-squid@^0.0.27", "fs-extra": "^11.1.1", "google-drive-browserfs": "github:zardoy/browserfs#google-drive", "iconify-icon": "^1.0.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3cbab433..052069c8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -104,8 +104,8 @@ importers: specifier: ^10.0.12 version: 10.0.12 flying-squid: - specifier: npm:@zardoy/flying-squid@^0.0.26 - version: '@zardoy/flying-squid@0.0.26(encoding@0.1.13)' + specifier: npm:@zardoy/flying-squid@^0.0.27 + version: '@zardoy/flying-squid@0.0.27(encoding@0.1.13)' fs-extra: specifier: ^11.1.1 version: 11.1.1 @@ -150,7 +150,7 @@ importers: version: 6.1.1 prismarine-provider-anvil: specifier: github:zardoy/prismarine-provider-anvil#everything - version: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29(minecraft-data@3.65.0) + version: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/2663cad29c8f231c299f63e31c5040b6c1872bcc(minecraft-data@3.65.0) prosemirror-example-setup: specifier: ^1.2.2 version: 1.2.2 @@ -302,7 +302,7 @@ importers: version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/200902aca941475e7feb610070e662b172a000b5(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:zardoy/mineflayer - version: https://codeload.github.com/zardoy/mineflayer/tar.gz/06061e07fe6b9716cb1801d4c1bf232581977192(encoding@0.1.13) + version: https://codeload.github.com/zardoy/mineflayer/tar.gz/f80ba0f8ebbcc15d6c44ade84007f8b4a0ee08ec(encoding@0.1.13) mineflayer-pathfinder: specifier: ^2.4.4 version: 2.4.4 @@ -383,10 +383,10 @@ importers: version: 1.3.6 prismarine-block: specifier: github:zardoy/prismarine-block#next-era - version: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + version: https://codeload.github.com/zardoy/prismarine-block/tar.gz/dd4954fff3b334f8ce063d18e39b2e9414ece5b8 prismarine-chunk: specifier: github:zardoy/prismarine-chunk - version: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0) + version: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/9662306deea57d8d0ba0a2a3f3f7adb95f0131e3(minecraft-data@3.65.0) prismarine-schematic: specifier: ^1.2.0 version: 1.2.3 @@ -3054,8 +3054,8 @@ packages: resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - '@zardoy/flying-squid@0.0.26': - resolution: {integrity: sha512-JUGrr+9I4vgXrgjop5iRpulRhWUgRbPC1j+xPapgICtJPEGuekpXIOOBjAL+X7yu7I5IcrmtG4XCjvTKcC0lIQ==} + '@zardoy/flying-squid@0.0.27': + resolution: {integrity: sha512-8QlPCyLqNQYxsGBMBNNGbfc1HdRPO/t3nBr5NzINEridj772DEbgGHxl252rjZWWELt/3t/k3m6e4k9qS7/ZdA==} engines: {node: '>=8'} hasBin: true @@ -4097,8 +4097,8 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diamond-square@https://codeload.github.com/zardoy/diamond-square/tar.gz/915fce8e27fe8eb45464d89b9563956afa4f7687: - resolution: {tarball: https://codeload.github.com/zardoy/diamond-square/tar.gz/915fce8e27fe8eb45464d89b9563956afa4f7687} + diamond-square@https://codeload.github.com/zardoy/diamond-square/tar.gz/4bbe28dcad35403abaa925055e91f601a61b9015: + resolution: {tarball: https://codeload.github.com/zardoy/diamond-square/tar.gz/4bbe28dcad35403abaa925055e91f601a61b9015} version: 1.3.0 diff-sequences@29.6.3: @@ -6067,8 +6067,8 @@ packages: resolution: {integrity: sha512-QMMNPx4IyZE7ydAzjvGLQLCnQNUOfkk1qVZKxTTS9q3qPTAewz4GhsVUBtbQ8LSbHthe5RcQ1Sgxs4wlIma/Qw==} engines: {node: '>=18'} - mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/06061e07fe6b9716cb1801d4c1bf232581977192: - resolution: {tarball: https://codeload.github.com/zardoy/mineflayer/tar.gz/06061e07fe6b9716cb1801d4c1bf232581977192} + mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/f80ba0f8ebbcc15d6c44ade84007f8b4a0ee08ec: + resolution: {tarball: https://codeload.github.com/zardoy/mineflayer/tar.gz/f80ba0f8ebbcc15d6c44ade84007f8b4a0ee08ec} version: 4.20.1 engines: {node: '>=18'} @@ -6708,18 +6708,15 @@ packages: minecraft-data: 3.65.0 prismarine-registry: ^1.1.0 - prismarine-block@https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0} + prismarine-block@https://codeload.github.com/zardoy/prismarine-block/tar.gz/dd4954fff3b334f8ce063d18e39b2e9414ece5b8: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-block/tar.gz/dd4954fff3b334f8ce063d18e39b2e9414ece5b8} version: 1.17.1 prismarine-chat@1.10.1: resolution: {integrity: sha512-XukYcuueuhDxzEXG7r8BZyt6jOObrPPB4JESCgb+/XenB9nExoSHF8eTQWWj8faKPLqm1dRQaYwFJlNBlJZJUw==} - prismarine-chat@1.9.1: - resolution: {integrity: sha512-x7WWa5MNhiLZSO6tw+YyKpzquFZ+DNISVgiV6K3SU0GsishMXe+nto02WhF/4AuFerKdugm9u1d/r4C4zSkJOg==} - - prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a} + prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/9662306deea57d8d0ba0a2a3f3f7adb95f0131e3: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/9662306deea57d8d0ba0a2a3f3f7adb95f0131e3} version: 1.35.0 engines: {node: '>=14'} @@ -6738,12 +6735,8 @@ packages: prismarine-physics@1.8.0: resolution: {integrity: sha512-gbM+S+bmVtOKVv+Z0WGaHMeEeBHISIDsRDRlv8sr0dex3ZJRhuq8djA02CBreguXtI18ZKh6q3TSj2qDr45NHA==} - prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29} - version: 2.7.0 - - prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/422aed5db94f341c3807f1a918c7b83c9ebcfe20: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/422aed5db94f341c3807f1a918c7b83c9ebcfe20} + prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/2663cad29c8f231c299f63e31c5040b6c1872bcc: + resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/2663cad29c8f231c299f63e31c5040b6c1872bcc} version: 2.8.0 prismarine-realms@1.3.2: @@ -11930,12 +11923,12 @@ snapshots: '@types/emscripten': 1.39.8 tslib: 1.14.1 - '@zardoy/flying-squid@0.0.26(encoding@0.1.13)': + '@zardoy/flying-squid@0.0.27(encoding@0.1.13)': dependencies: '@tootallnate/once': 2.0.0 change-case: 4.1.2 colors: 1.4.0 - diamond-square: https://codeload.github.com/zardoy/diamond-square/tar.gz/915fce8e27fe8eb45464d89b9563956afa4f7687 + diamond-square: https://codeload.github.com/zardoy/diamond-square/tar.gz/4bbe28dcad35403abaa925055e91f601a61b9015 emit-then: 2.0.0 exit-hook: 2.2.1 flatmap: 0.0.3 @@ -11945,11 +11938,11 @@ snapshots: mkdirp: 2.1.6 node-gzip: 1.1.2 node-rsa: 1.1.1 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/9662306deea57d8d0ba0a2a3f3f7adb95f0131e3(minecraft-data@3.65.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 - prismarine-provider-anvil: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/422aed5db94f341c3807f1a918c7b83c9ebcfe20(minecraft-data@3.65.0) + prismarine-provider-anvil: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/2663cad29c8f231c299f63e31c5040b6c1872bcc(minecraft-data@3.65.0) prismarine-windows: 2.9.0 prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/187a87f6d71cba12881a7bbaa510ed9085bf6da7 rambda: 9.2.0 @@ -13208,10 +13201,11 @@ snapshots: dependencies: dequal: 2.0.3 - diamond-square@https://codeload.github.com/zardoy/diamond-square/tar.gz/915fce8e27fe8eb45464d89b9563956afa4f7687: + diamond-square@https://codeload.github.com/zardoy/diamond-square/tar.gz/4bbe28dcad35403abaa925055e91f601a61b9015: dependencies: minecraft-data: 3.65.0 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/9662306deea57d8d0ba0a2a3f3f7adb95f0131e3(minecraft-data@3.65.0) + prismarine-registry: 1.7.0 random-seed: 0.3.0 vec3: 0.1.8 @@ -15764,7 +15758,7 @@ snapshots: mineflayer-pathfinder@2.4.4: dependencies: minecraft-data: 3.65.0 - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/dd4954fff3b334f8ce063d18e39b2e9414ece5b8 prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.2.1 @@ -15776,9 +15770,9 @@ snapshots: minecraft-data: 3.65.0 minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/495eed56ab230b2615596590064671356d86a2dc(patch_hash=2uxevyasyasdavsxuehfavgkjq)(encoding@0.1.13) prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/dd4954fff3b334f8ce063d18e39b2e9414ece5b8 prismarine-chat: 1.10.1 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/9662306deea57d8d0ba0a2a3f3f7adb95f0131e3(minecraft-data@3.65.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 @@ -15794,14 +15788,14 @@ snapshots: - encoding - supports-color - mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/06061e07fe6b9716cb1801d4c1bf232581977192(encoding@0.1.13): + mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/f80ba0f8ebbcc15d6c44ade84007f8b4a0ee08ec(encoding@0.1.13): dependencies: minecraft-data: 3.65.0 minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/495eed56ab230b2615596590064671356d86a2dc(patch_hash=2uxevyasyasdavsxuehfavgkjq)(encoding@0.1.13) prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/dd4954fff3b334f8ce063d18e39b2e9414ece5b8 prismarine-chat: 1.10.1 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0) + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/9662306deea57d8d0ba0a2a3f3f7adb95f0131e3(minecraft-data@3.65.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 @@ -16503,11 +16497,11 @@ snapshots: minecraft-data: 3.65.0 prismarine-registry: 1.7.0 - prismarine-block@https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0: + prismarine-block@https://codeload.github.com/zardoy/prismarine-block/tar.gz/dd4954fff3b334f8ce063d18e39b2e9414ece5b8: dependencies: minecraft-data: 3.65.0 prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) - prismarine-chat: 1.9.1 + prismarine-chat: 1.10.1 prismarine-item: 1.14.0 prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 @@ -16518,17 +16512,10 @@ snapshots: prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 - prismarine-chat@1.9.1: - dependencies: - mojangson: 2.0.4 - prismarine-item: 1.14.0 - prismarine-nbt: 2.5.0 - prismarine-registry: 1.7.0 - - prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0): + prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/9662306deea57d8d0ba0a2a3f3f7adb95f0131e3(minecraft-data@3.65.0): dependencies: prismarine-biome: 1.3.0(minecraft-data@3.65.0)(prismarine-registry@1.7.0) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/dd4954fff3b334f8ce063d18e39b2e9414ece5b8 prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 smart-buffer: 4.2.0 @@ -16564,19 +16551,10 @@ snapshots: prismarine-nbt: 2.5.0 vec3: 0.1.8 - prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/02d81b0eba6ab1c362862970954f9a3c150c9a29(minecraft-data@3.65.0): + prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/2663cad29c8f231c299f63e31c5040b6c1872bcc(minecraft-data@3.65.0): dependencies: - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0) - prismarine-nbt: 2.5.0 - uint4: 0.1.2 - vec3: 0.1.8 - transitivePeerDependencies: - - minecraft-data - - prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/422aed5db94f341c3807f1a918c7b83c9ebcfe20(minecraft-data@3.65.0): - dependencies: - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/45f0da31a6ab7107204f2b0a5d56dccb6059025a(minecraft-data@3.65.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/dd4954fff3b334f8ce063d18e39b2e9414ece5b8 + prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/9662306deea57d8d0ba0a2a3f3f7adb95f0131e3(minecraft-data@3.65.0) prismarine-nbt: 2.5.0 prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/187a87f6d71cba12881a7bbaa510ed9085bf6da7 uint4: 0.1.2 @@ -16604,7 +16582,7 @@ snapshots: prismarine-schematic@1.2.3: dependencies: minecraft-data: 3.65.0 - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/dd4954fff3b334f8ce063d18e39b2e9414ece5b8 prismarine-nbt: 2.2.1 prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/187a87f6d71cba12881a7bbaa510ed9085bf6da7 vec3: 0.1.8 diff --git a/prismarine-viewer/viewer/lib/worldDataEmitter.ts b/prismarine-viewer/viewer/lib/worldDataEmitter.ts index 3a8fbd40..ed578040 100644 --- a/prismarine-viewer/viewer/lib/worldDataEmitter.ts +++ b/prismarine-viewer/viewer/lib/worldDataEmitter.ts @@ -83,7 +83,7 @@ export class WorldDataEmitter extends EventEmitter { get (_target, posKey, receiver) { if (typeof posKey !== 'string') return const [x, y, z] = posKey.split(',').map(Number) - return bot.world.getBlock(new Vec3(x, y, z)).entity + return bot.world.getBlock(new Vec3(x, y, z))?.entity }, })) this.emitter.emit('renderDistance', this.viewDistance) diff --git a/src/createLocalServer.ts b/src/createLocalServer.ts index 44bc2187..d0beac9a 100644 --- a/src/createLocalServer.ts +++ b/src/createLocalServer.ts @@ -14,4 +14,4 @@ export const startLocalServer = (serverOptions) => { // features that flying-squid doesn't support at all // todo move & generate in flying-squid -export const unsupportedLocalServerFeatures = ['transactionPacketExists', 'teleportUsesOwnPacket', 'dimensionDataIsAvailable'] +export const unsupportedLocalServerFeatures = ['transactionPacketExists', 'teleportUsesOwnPacket'] diff --git a/src/getCollisionShapes.ts b/src/getCollisionShapes.ts index 0faf5b6a..4ee0e802 100644 --- a/src/getCollisionShapes.ts +++ b/src/getCollisionShapes.ts @@ -1,4 +1,4 @@ -import { adoptBlockOrItemNamesFromLatest } from 'flying-squid/dist/blockRenames' +import { getRenamedData } from 'flying-squid/dist/blockRenames' import collisionShapesInit from '../generated/latestBlockCollisionsShapes.json' import outputInteractionShapesJson from './interactionShapesGenerated.json' @@ -6,7 +6,7 @@ import outputInteractionShapesJson from './interactionShapesGenerated.json' window.globalGetCollisionShapes = (version) => { // todo use the same in resourcepack const versionFrom = collisionShapesInit.version - const renamedBlocks = adoptBlockOrItemNamesFromLatest('blocks', Object.keys(collisionShapesInit.blocks), versionFrom, version) + const renamedBlocks = getRenamedData('blocks', Object.keys(collisionShapesInit.blocks), versionFrom, version) const collisionShapes = { ...collisionShapesInit, blocks: Object.fromEntries(Object.entries(collisionShapesInit.blocks).map(([, shape], i) => [renamedBlocks[i], shape])) @@ -17,7 +17,7 @@ window.globalGetCollisionShapes = (version) => { export default () => { customEvents.on('gameLoaded', () => { // todo also remap block states (e.g. redstone)! - const renamedBlocksInteraction = adoptBlockOrItemNamesFromLatest('blocks', Object.keys(outputInteractionShapesJson), '1.20.2', bot.version) + const renamedBlocksInteraction = getRenamedData('blocks', Object.keys(outputInteractionShapesJson), '1.20.2', bot.version) const interactionShapes = { ...outputInteractionShapesJson, ...Object.fromEntries(Object.entries(outputInteractionShapesJson).map(([block, shape], i) => [renamedBlocksInteraction[i], shape])) diff --git a/src/globals.d.ts b/src/globals.d.ts index 6a38a21d..05b29a14 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -3,7 +3,9 @@ declare const THREE: typeof import('three') // todo make optional declare const bot: Omit & { - world: import('prismarine-world').world.WorldSync + world: Omit & { + getBlock: (pos: import('vec3').Vec3) => import('prismarine-block').Block | null + } _client: Omit & { write: typeof import('./generatedClientPackets').clientWrite on: typeof import('./generatedServerPackets').clientOn diff --git a/src/loadSave.ts b/src/loadSave.ts index af9d078c..7ca454ff 100644 --- a/src/loadSave.ts +++ b/src/loadSave.ts @@ -1,15 +1,16 @@ import fs from 'fs' import path from 'path' -import { supportedVersions } from 'flying-squid/dist/lib/version' import * as nbt from 'prismarine-nbt' import { proxy } from 'valtio' import { gzip } from 'node-gzip' +import { versionToNumber } from 'prismarine-viewer/viewer/prepare/utils' import { options } from './optionsStorage' import { nameToMcOfflineUUID, disconnect } from './flyingSquidUtils' import { existsViaStats, forceCachedDataPaths, forceRedirectPaths, mkdirRecursive } from './browserfs' import { isMajorVersionGreater } from './utils' import { activeModalStacks, insertActiveModalStack, miscUiState } from './globalState' +import supportedVersions from './supportedVersions.mjs' // todo include name of opened handle (zip)! // additional fs metadata @@ -91,13 +92,12 @@ export const loadSave = async (root = '/world') => { const newVersion = '1.8.8' version = newVersion } - // const lastSupportedVersion = supportedVersions.at(-1)! - const lastTestedVersion = '1.18.2' + const lastSupportedVersion = supportedVersions.at(-1)! const firstSupportedVersion = supportedVersions[0] const lowerBound = isMajorVersionGreater(firstSupportedVersion, version) - const upperBound = isMajorVersionGreater(version, lastTestedVersion) + const upperBound = versionToNumber(version) > versionToNumber(lastSupportedVersion) if (lowerBound || upperBound) { - version = prompt(`Version ${version} is not supported, supported versions are ${supportedVersions.join(', ')}, what try to use instead?`, lowerBound ? firstSupportedVersion : lastTestedVersion) + version = prompt(`Version ${version} is not supported, supported versions are ${supportedVersions.join(', ')}, what try to use instead?`, lowerBound ? firstSupportedVersion : lastSupportedVersion) if (!version) return } if (levelDat.WorldGenSettings) { diff --git a/src/react/MainMenu.tsx b/src/react/MainMenu.tsx index 3e3170f4..43908645 100644 --- a/src/react/MainMenu.tsx +++ b/src/react/MainMenu.tsx @@ -103,7 +103,7 @@ export default ({ connectToServerAction, mapsProvider, singleplayerAction, optio icon='pixelarticons:folder' onClick={openFileAction} initialTooltip={{ - content: 'Load any 1.8-1.16 Java world' + (haveDirectoryPicker() ? '' : ' (zip)'), + content: 'Load any Java world save' + (haveDirectoryPicker() ? '' : ' (zip)!'), placement: 'bottom-start', }} /> diff --git a/src/soundSystem.ts b/src/soundSystem.ts index a2cc1f70..e7fdaee7 100644 --- a/src/soundSystem.ts +++ b/src/soundSystem.ts @@ -144,10 +144,12 @@ subscribeKey(miscUiState, 'gameLoaded', async () => { // movement happening if (Date.now() - lastStepSound > 300) { const blockUnder = bot.world.getBlock(bot.entity.position.offset(0, -1, 0)) - const stepSound = getStepSound(blockUnder) - if (stepSound) { - await playHardcodedSound(stepSound, undefined, 0.6)// todo not sure why 0.6 - lastStepSound = Date.now() + if (blockUnder) { + const stepSound = getStepSound(blockUnder) + if (stepSound) { + await playHardcodedSound(stepSound, undefined, 0.6)// todo not sure why 0.6 + lastStepSound = Date.now() + } } } } diff --git a/src/water.ts b/src/water.ts index 9f8ec557..d8b4b41c 100644 --- a/src/water.ts +++ b/src/water.ts @@ -19,7 +19,7 @@ customEvents.on('gameLoaded', () => { } bot.on('physicsTick', () => { // todo - const _inWater = bot.world.getBlock(bot.entity.position.offset(0, 1, 0)).name === 'water' + const _inWater = bot.world.getBlock(bot.entity.position.offset(0, 1, 0))?.name === 'water' if (_inWater !== inWater) { inWater = _inWater updateInWater() From 216b1712c2dd418636d9fcc9c6e632137555e2d9 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 13 Jun 2024 19:47:48 +0300 Subject: [PATCH 0247/1195] more basic tests. test joining to a local java vanilla server, movement! --- .eslintrc.json | 17 +++++++++ .gitignore | 1 + cypress/e2e/index.spec.ts | 57 ++++++++++++++++++++++++++++- cypress/e2e/shared.ts | 3 ++ cypress/plugins/index.js | 9 ++++- cypress/plugins/server.properties | 61 +++++++++++++++++++++++++++++++ cypress/plugins/startServer.ts | 45 +++++++++++++++++++++++ index.html | 2 +- src/index.ts | 7 +++- src/react/Chat.tsx | 3 +- src/worldInteractions.ts | 3 +- 11 files changed, 200 insertions(+), 8 deletions(-) create mode 100644 cypress/plugins/server.properties create mode 100644 cypress/plugins/startServer.ts diff --git a/.eslintrc.json b/.eslintrc.json index 98388260..a91015d2 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -96,5 +96,22 @@ "unicorn/filename-case": "off", "max-depth": "off" }, + "overrides": [ + { + "files": [ + "*.js" + ], + "rules": { + "space-before-function-paren": [ + "error", + { + "anonymous": "always", + "named": "never", + "asyncArrow": "always" + } + ] + } + } + ], "root": true } diff --git a/.gitignore b/.gitignore index 240b751a..3a188862 100644 --- a/.gitignore +++ b/.gitignore @@ -17,5 +17,6 @@ out .vercel generated storybook-static +server-jar src/react/npmReactComponents.ts diff --git a/cypress/e2e/index.spec.ts b/cypress/e2e/index.spec.ts index 05b50211..ec7d84e7 100644 --- a/cypress/e2e/index.spec.ts +++ b/cypress/e2e/index.spec.ts @@ -1,4 +1,6 @@ +/* eslint-disable max-nested-callbacks */ /// +import supportedVersions from '../../src/supportedVersions.mjs' import { setOptions, cleanVisit, visit } from './shared' // todo use ssl @@ -12,7 +14,7 @@ const compareRenderedFlatWorld = () => { } const testWorldLoad = () => { - cy.document().then({ timeout: 20_000 }, doc => { + return cy.document().then({ timeout: 20_000 }, doc => { return new Cypress.Promise(resolve => { doc.addEventListener('cypress-world-ready', resolve) }) @@ -36,7 +38,7 @@ it('Loads & renders singleplayer', () => { testWorldLoad() }) -it('Joins to server', () => { +it('Joins to local flying-squid server', () => { visit('/?ip=localhost&version=1.16.1') window.localStorage.version = '' // todo replace with data-test @@ -47,9 +49,60 @@ it('Joins to server', () => { testWorldLoad() }) +it('Joins to local latest Java vanilla server', () => { + const version = supportedVersions.at(-1)! + cy.task('startServer', [version, 25_590]).then(() => { + visit('/?ip=localhost:25590&username=bot') + cy.get('[data-test-id="connect-qs"]').click() + testWorldLoad().then(() => { + let x = 0 + let z = 0 + cy.window().then((win) => { + x = win.bot.entity.position.x + z = win.bot.entity.position.z + }) + cy.document().trigger('keydown', { code: 'KeyW' }) + cy.wait(1500).then(() => { + cy.document().trigger('keyup', { code: 'KeyW' }) + cy.window().then(async (win) => { + // eslint-disable-next-line prefer-destructuring + const bot: typeof __type_bot = win.bot + // todo use f3 stats instead + if (bot.entity.position.x === x && bot.entity.position.z === z) { + throw new Error('Player not moved') + } + + bot.chat('Hello') // todo assert + bot.chat('/gamemode creative') + // bot.on('message', () => { + void bot.creative.setInventorySlot(bot.inventory.hotbarStart, new win.PrismarineItem(1, 1, 0)) + // }) + await bot.lookAt(bot.entity.position.offset(1, 0, 1)) + }).then(() => { + cy.document().trigger('mousedown', { button: 2, isTrusted: true, force: true }) // right click + cy.document().trigger('mouseup', { button: 2, isTrusted: true, force: true }) + cy.wait(1000) + }) + }) + }) + }) +}) + it('Loads & renders zip world', () => { cleanVisit() cy.get('[data-test-id="select-file-folder"]').click({ shiftKey: true }) cy.get('input[type="file"]').selectFile('cypress/superflat.zip', { force: true }) testWorldLoad() }) + + +it.skip('Loads & renders world from folder', () => { + cleanVisit() + // dragndrop folder + cy.get('[data-test-id="select-file-folder"]').click() + cy.get('input[type="file"]').selectFile('server-jar/world', { + force: true, + // action: 'drag-drop', + }) + testWorldLoad() +}) diff --git a/cypress/e2e/shared.ts b/cypress/e2e/shared.ts index 9292a8d5..47518f1b 100644 --- a/cypress/e2e/shared.ts +++ b/cypress/e2e/shared.ts @@ -3,6 +3,9 @@ import { AppOptions } from '../../src/optionsStorage' export const cleanVisit = (url?) => { cy.clearLocalStorage() visit(url) + window.localStorage.options = { + chatOpacity: 0 + } } export const visit = (url = '/') => { window.localStorage.cypress = 'true' diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js index 35dc2989..e55f5d26 100644 --- a/cypress/plugins/index.js +++ b/cypress/plugins/index.js @@ -2,11 +2,13 @@ const { cypressEsbuildPreprocessor } = require('cypress-esbuild-preprocessor') const { initPlugin } = require('cypress-plugin-snapshots/plugin') const polyfill = require('esbuild-plugin-polyfill-node') +const { startMinecraftServer } = require('./startServer') module.exports = (on, config) => { initPlugin(on, config) on('file:preprocessor', cypressEsbuildPreprocessor({ esbuildOptions: { + sourcemap: true, plugins: [ polyfill.polyfillNode({ polyfills: { @@ -17,10 +19,15 @@ module.exports = (on, config) => { }, })) on('task', { - log (message) { + log(message) { console.log(message) return null }, }) + on('task', { + async startServer([version, port]) { + return startMinecraftServer(version, port) + } + }) return config } diff --git a/cypress/plugins/server.properties b/cypress/plugins/server.properties new file mode 100644 index 00000000..5873a1aa --- /dev/null +++ b/cypress/plugins/server.properties @@ -0,0 +1,61 @@ +#Minecraft server properties +allow-flight=false +allow-nether=true +broadcast-console-to-ops=true +broadcast-rcon-to-ops=true +difficulty=peaceful +enable-command-block=false +enable-jmx-monitoring=false +enable-query=false +enable-rcon=false +enable-status=true +enforce-secure-profile=true +enforce-whitelist=false +entity-broadcast-range-percentage=100 +force-gamemode=false +function-permission-level=2 +gamemode=survival +generate-structures=true +generator-settings={} +hardcore=false +hide-online-players=false +initial-disabled-packs= +initial-enabled-packs=vanilla +level-name=world +level-seed= +level-type=flat +log-ips=true +max-build-height=256 +max-chained-neighbor-updates=1000000 +max-players=20 +max-tick-time=60000 +max-world-size=29999984 +motd=A Minecraft Server +network-compression-threshold=256 +online-mode=false +op-permission-level=4 +player-idle-timeout=0 +prevent-proxy-connections=false +pvp=true +query.port=25565 +rate-limit=0 +rcon.password= +rcon.port=25575 +require-resource-pack=false +resource-pack= +resource-pack-id= +resource-pack-prompt= +resource-pack-sha1= +server-ip= +server-port=25565 +simulation-distance=10 +snooper-enabled=true +spawn-animals=true +spawn-monsters=true +spawn-npcs=true +spawn-protection=16 +sync-chunk-writes=true +text-filtering-config= +use-native-transport=true +view-distance=10 +white-list=false diff --git a/cypress/plugins/startServer.ts b/cypress/plugins/startServer.ts new file mode 100644 index 00000000..ecf0d210 --- /dev/null +++ b/cypress/plugins/startServer.ts @@ -0,0 +1,45 @@ +import { ChildProcess, spawn } from 'child_process' +import * as fs from 'fs' +import * as path from 'path' +import { promisify } from 'util' +import { downloadServer } from 'minecraft-wrap' +import * as waitOn from 'wait-on' + +let prevProcess: ChildProcess | null = null +export const startMinecraftServer = async (version: string, port: number) => { + if (prevProcess) return null + const jar = `./server-jar/${version}.jar` + + const start = () => { + // if (prevProcess) { + // prevProcess.kill() + // } + + prevProcess = spawn('java', ['-jar', path.basename(jar), 'nogui', '--port', `${port}`], { + stdio: 'inherit', + cwd: path.dirname(jar), + }) + } + + let coldStart = false + if (fs.existsSync(jar)) { + start() + } else { + coldStart = true + promisify(downloadServer)(version, jar).then(() => { + // add eula.txt + fs.writeFileSync(path.join(path.dirname(jar), 'eula.txt'), 'eula=true') + // copy cypress/plugins/server.properties + fs.copyFileSync(path.join(__dirname, 'server.properties'), path.join(path.dirname(jar), 'server.properties')) + // copy ops.json + fs.copyFileSync(path.join(__dirname, 'ops.json'), path.join(path.dirname(jar), 'ops.json')) + start() + }) + } + + return new Promise((res) => { + waitOn({ resources: [`tcp:localhost:${port}`] }, () => { + setTimeout(() => res(null), coldStart ? 6500 : 2000) // todo retry instead of timeout + }) + }) +} diff --git a/index.html b/index.html index 6d3b326b..62e109cd 100644 --- a/index.html +++ b/index.html @@ -14,7 +14,7 @@
Loading...
-
A true Minecraft client in your browser!
+
A true Minecraft client in your browser!
` diff --git a/src/index.ts b/src/index.ts index fe584b4d..72f270d4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,6 +17,7 @@ import './scaleInterface' import itemsPng from 'prismarine-viewer/public/textures/items.png' import { initWithRenderer } from './topRightStats' import PrismarineBlock from 'prismarine-block' +import PrismarineItem from 'prismarine-item' import { options, watchValue } from './optionsStorage' import './reactUi.jsx' @@ -580,6 +581,7 @@ async function connect (connectOptions: ConnectOptions) { errorAbortController.abort() const mcData = MinecraftData(bot.version) window.PrismarineBlock = PrismarineBlock(mcData.version.minecraftVersion!) + window.PrismarineItem = PrismarineItem(mcData.version.minecraftVersion!) window.loadedData = mcData window.Vec3 = Vec3 window.pathfinder = pathfinder @@ -825,9 +827,12 @@ listenGlobalEvents() watchValue(miscUiState, async s => { if (s.appLoaded) { // fs ready const qs = new URLSearchParams(window.location.search) + const moreServerOptions = {} as Record + if (qs.has('version')) moreServerOptions.version = qs.get('version') if (qs.get('singleplayer') === '1') { loadSingleplayer({}, { - worldFolder: undefined + worldFolder: undefined, + ...moreServerOptions }) } if (qs.get('loadSave')) { diff --git a/src/react/Chat.tsx b/src/react/Chat.tsx index b05f9930..981878c8 100644 --- a/src/react/Chat.tsx +++ b/src/react/Chat.tsx @@ -1,6 +1,5 @@ import { proxy, subscribe } from 'valtio' import { useEffect, useMemo, useRef, useState } from 'react' -import { isCypress } from '../standaloneUtils' import { MessageFormatPart } from '../botUtils' import { MessagePart } from './MessageFormatted' import './Chat.css' @@ -200,7 +199,7 @@ export default ({ messages, opacity = 1, fetchCompletionItems, opened, sendMessa return ( <> -
diff --git a/src/react/ServersListProvider.tsx b/src/react/ServersListProvider.tsx index 9772c9b4..ca749560 100644 --- a/src/react/ServersListProvider.tsx +++ b/src/react/ServersListProvider.tsx @@ -7,6 +7,7 @@ import ServersList from './ServersList' import AddServerOrConnect, { BaseServerInfo } from './AddServerOrConnect' import { useDidUpdateEffect } from './utils' import { useIsModalActive } from './utilsApp' +import { showOptionsModal } from './SelectOption' interface StoreServerItem extends BaseServerInfo { lastJoined?: number @@ -46,6 +47,15 @@ type AdditionalDisplayData = { icon?: string } +export interface AuthenticatedAccount { + // type: 'microsoft' + username: string + cachedTokens?: { + data: any + expiresOn: number + } +} + const getInitialServersList = () => { if (localStorage['serversList']) return JSON.parse(localStorage['serversList']) as StoreServerItem[] @@ -62,7 +72,6 @@ const getInitialServersList = () => { if (localStorage['server']) { const legacyLastJoinedServer: StoreServerItem = { ip: localStorage['server'], - passwordOverride: localStorage['password'], versionOverride: localStorage['version'], lastJoined: Date.now() } @@ -104,16 +113,21 @@ const getInitialProxies = () => { return proxies } -export const updateLoadedServerData = (callback: (data: StoreServerItem) => StoreServerItem) => { +export const updateLoadedServerData = (callback: (data: StoreServerItem) => StoreServerItem, index = miscUiState.loadedServerIndex) => { + if (!index) return // function assumes component is not mounted to avoid sync issues after save - const { loadedServerIndex } = miscUiState - if (!loadedServerIndex) return const servers = getInitialServersList() - const server = servers[loadedServerIndex] - servers[loadedServerIndex] = callback(server) + const server = servers[index] + servers[index] = callback(server) setNewServersList(servers) } +export const updateAuthenticatedAccountData = (callback: (data: AuthenticatedAccount[]) => AuthenticatedAccount[]) => { + const accounts = JSON.parse(localStorage['authenticatedAccounts'] || '[]') as AuthenticatedAccount[] + const newAccounts = callback(accounts) + localStorage['authenticatedAccounts'] = JSON.stringify(newAccounts) +} + // todo move to base const normalizeIp = (ip: string) => ip.replace(/https?:\/\//, '').replace(/\/(:|$)/, '') @@ -122,6 +136,11 @@ const Inner = () => { const [selectedProxy, setSelectedProxy] = useState(localStorage.getItem('selectedProxy') ?? proxies?.[0] ?? '') const [serverEditScreen, setServerEditScreen] = useState(null) // true for add const [defaultUsername, setDefaultUsername] = useState(localStorage['username'] ?? (`mcrafter${Math.floor(Math.random() * 1000)}`)) + const [authenticatedAccounts, setAuthenticatedAccounts] = useState(JSON.parse(localStorage['authenticatedAccounts'] || '[]')) + + useEffect(() => { + localStorage.setItem('authenticatedAccounts', JSON.stringify(authenticatedAccounts)) + }, [authenticatedAccounts]) useEffect(() => { localStorage.setItem('username', defaultUsername) @@ -215,6 +234,7 @@ const Inner = () => { } setServerEditScreen(null) }} + accounts={authenticatedAccounts.map(a => a.username)} initialData={!serverEditScreen || serverEditScreen === true ? undefined : serverEditScreen} onQsConnect={(info) => { const connectOptions: ConnectOptions = { @@ -222,7 +242,6 @@ const Inner = () => { server: normalizeIp(info.ip), proxy: info.proxyOverride || selectedProxy, botVersion: info.versionOverride, - password: info.passwordOverride, ignoreQs: true, } dispatchEvent(new CustomEvent('connect', { detail: connectOptions })) @@ -249,14 +268,22 @@ const Inner = () => { if (!username) return setDefaultUsername(username) } + let authenticatedAccount: AuthenticatedAccount | true | undefined + if (overrides.authenticatedAccountOverride) { + if (overrides.authenticatedAccountOverride === true) { + authenticatedAccount = true + } else { + authenticatedAccount = authenticatedAccounts.find(a => a.username === overrides.authenticatedAccountOverride) ?? true + } + } const options = { username, server: normalizeIp(ip), proxy: overrides.proxyOverride || selectedProxy, botVersion: overrides.versionOverride ?? /* legacy */ overrides['version'], - password: overrides.passwordOverride, ignoreQs: true, autoLoginPassword: server?.autoLogin?.[username], + authenticatedAccount, onSuccessfulPlay () { if (shouldSave && !serversList.some(s => s.ip === ip)) { const newServersList: StoreServerItem[] = [...serversList, { @@ -294,6 +321,11 @@ const Inner = () => { }} username={defaultUsername} setUsername={setDefaultUsername} + onProfileClick={async () => { + const username = await showOptionsModal('Select authenticated account to remove', authenticatedAccounts.map(a => a.username)) + if (!username) return + setAuthenticatedAccounts(old => old.filter(a => a.username !== username)) + }} onWorldAction={(action, index) => { const server = serversList[index] if (!server) return diff --git a/src/react/SignInMessage.stories.tsx b/src/react/SignInMessage.stories.tsx new file mode 100644 index 00000000..16528700 --- /dev/null +++ b/src/react/SignInMessage.stories.tsx @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/react' +import SignInMessage from './SignInMessage' + +const meta: Meta<{ open }> = { + component: SignInMessage as any, + render ({ open }) { + return + }, +} + +export default meta +type Story = StoryObj<{ open }> + +export const Primary: Story = { + args: { + }, +} diff --git a/src/react/SignInMessage.tsx b/src/react/SignInMessage.tsx new file mode 100644 index 00000000..2ec38816 --- /dev/null +++ b/src/react/SignInMessage.tsx @@ -0,0 +1,107 @@ +import { useState } from 'react' +import { useUtilsEffect } from '@zardoy/react-util' +import PixelartIcon from './PixelartIcon' +import Screen from './Screen' +import Button from './Button' + +export default ({ + code = 'ABCD-EFGH-IJKL-MNOP', + loginLink = 'https://aka.ms/devicelogin', + connectingServer = 'mc.example.comsdlfjsklfjsfjdskfjsj', + warningText = true, + expiresEnd = Date.now() + 1000 * 60 * 5, + setSaveToken = (() => { }) as ((state: boolean) => void) | undefined, + defaultSaveToken = true, + onCancel = () => { }, + directLink = 'https://aka.ms/devicelogin' +}) => { + if (connectingServer.length > 30) connectingServer = connectingServer.slice(0, 30) + '...' + const [timeLeft, setTimeLeft] = useState(``) + + useUtilsEffect(({ interval }) => { + interval(1000, () => { + const timeLeft = Math.max(0, Math.ceil((expiresEnd - Date.now()) / 1000)) + const minutes = Math.floor(timeLeft / 60) + const seconds = timeLeft % 60 + setTimeLeft(`${minutes}:${seconds.toString().padStart(2, '0')}`) + if (timeLeft <= 0) setTimeLeft('Code expired!') + }) + }, []) + + return + + + +} diff --git a/src/react/SignInMessageProvider.tsx b/src/react/SignInMessageProvider.tsx new file mode 100644 index 00000000..68ea83aa --- /dev/null +++ b/src/react/SignInMessageProvider.tsx @@ -0,0 +1,32 @@ +import { proxy, ref, useSnapshot } from 'valtio' +import SignInMessage from './SignInMessage' +import { lastConnectOptions } from './AppStatusProvider' + +export const signInMessageState = proxy({ + code: '', + link: '', + expiresOn: 0, + shouldSaveToken: true, + abortController: ref(new AbortController()), +}) + +export default () => { + const { code, expiresOn, link, shouldSaveToken } = useSnapshot(signInMessageState) + + if (!code) return null + + return { + signInMessageState.shouldSaveToken = state + }} + connectingServer={lastConnectOptions.value?.server ?? ''} + onCancel={() => { + signInMessageState.abortController.abort() + }} + directLink={`http://microsoft.com/link?otc=${code}`} + /> +} diff --git a/src/react/globals.d.ts b/src/react/globals.d.ts index 108fae54..7b0f64bb 100644 --- a/src/react/globals.d.ts +++ b/src/react/globals.d.ts @@ -32,9 +32,9 @@ declare module '*.svg' { interface PromiseConstructor { withResolvers (): { - resolve: (value: T) => void; - reject: (reason: any) => void; - promise: Promise; + resolve: (value: T) => void + reject: (reason: any) => void + promise: Promise } } @@ -44,6 +44,7 @@ declare namespace JSX { icon: string style?: React.CSSProperties class?: string + onClick?: (e) => void } } } diff --git a/src/reactUi.tsx b/src/reactUi.tsx index f140326e..34a567cd 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -40,6 +40,7 @@ import KeybindingsScreenProvider from './react/KeybindingsScreenProvider' import HeldMapUi from './react/HeldMapUi' import BedTime from './react/BedTime' import NoModalFoundProvider from './react/NoModalFoundProvider' +import SignInMessageProvider from './react/SignInMessageProvider' const RobustPortal = ({ children, to }) => { return createPortal({children}, to) @@ -173,6 +174,7 @@ const App = () => { + {/* */} @@ -191,7 +193,7 @@ const App = () => { const PerComponentErrorBoundary = ({ children }) => { return children.map((child, i) => { const componentNameClean = (child.type.name || child.type.displayName || 'Unknown').replaceAll(/__|_COMPONENT/g, '') - showNotification(`UI component ${componentNameClean} crashed!`, 'Please report this. Use console to see more info.', true, undefined) + showNotification(`UI component ${componentNameClean} crashed!`, 'Please report this. Use console for more.', true, undefined) return null }}>{child}) } diff --git a/src/yggdrasilReplacement.ts b/src/yggdrasilReplacement.ts new file mode 100644 index 00000000..e0cab6f0 --- /dev/null +++ b/src/yggdrasilReplacement.ts @@ -0,0 +1,27 @@ +export const server = ({ host: sessionServer }) => { + return { + async join (accessToken, sessionSelectedProfileId, serverId, sharedSecret, publicKey, cb) { + try { + const result = await fetch(`${sessionServer}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + accessToken, + selectedProfile: sessionSelectedProfileId, + serverId, + sharedSecret, + publicKey, + }), + }) + if (!result.ok) { + throw new Error(`Request failed ${await result.text()}`) + } + cb(null) + } catch (err) { + cb(err) + } + } + } +} From 324c08ef436ec66672d544109eacc08d27dd2dcc Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 7 Jul 2024 00:32:04 +0300 Subject: [PATCH 0283/1195] finally update dockerfile to a working one! uses 6gb of ram to build btw. image size: 2.4gb, ~200mb when running --- .dockerignore | 2 -- Dockerfile | 19 ++++++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/.dockerignore b/.dockerignore index 285d1303..38ca0016 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,3 @@ -# we dont want default config to be loaded in the dockerfile, but rather using a volume -config.json # build stuff node_modules public \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index aa9eb3dc..086240b5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,22 @@ -FROM node:14-alpine +FROM node:18-alpine # Without git installing the npm packages fails RUN apk add git RUN mkdir /app WORKDIR /app COPY . /app -RUN npm install -RUN npm run build +# install python and other dependencies +RUN apk add python3 make g++ cairo-dev pango-dev jpeg-dev giflib-dev librsvg-dev +# install pnpm +RUN npm i -g pnpm@9.0.4 +RUN pnpm install +# only for prod +RUN pnpm run build +# --- +EXPOSE 8080 +# uncomment for development +# EXPOSE 9090 +# VOLUME /app/src +# VOLUME /app/prismarine-viewer +# ENTRYPOINT ["pnpm", "run", "run-all"] +# only for prod ENTRYPOINT ["npm", "run", "prod-start"] From d80b71ede74a110debac25c1ea5b45f802b5d41d Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 6 Jul 2024 23:20:40 +0300 Subject: [PATCH 0284/1195] add demo to npm readme file --- README.NPM.MD | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.NPM.MD b/README.NPM.MD index c036adba..c44492c6 100644 --- a/README.NPM.MD +++ b/README.NPM.MD @@ -1,9 +1,13 @@ # Minecraft React +Minecraft UI components for React. + ```bash -yarn add minecraft-react +pnpm i minecraft-react ``` +![demo](https://github-production-user-asset-6210df.s3.amazonaws.com/46503702/346295584-80f3ed4a-cab6-45d2-8896-5e20233cc9b1.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVCODYLSA53PQK4ZA%2F20240706%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240706T195400Z&X-Amz-Expires=300&X-Amz-Signature=5b063823a57057c4042c15edd1db3edd107e00940fd0e66a2ba1df4e564a2809&X-Amz-SignedHeaders=host&actor_id=46503702&key_id=0&repo_id=432411890) + ## Usage ```jsx From d1d0959cb40af0e7872f12996db1ce6ce1f364e1 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 7 Jul 2024 01:12:25 +0300 Subject: [PATCH 0285/1195] feat: add Sonar bypass making possible to join to projects like ruhypixel.net wip: packets replay feature! --- pnpm-lock.yaml | 8 ++++---- src/index.ts | 14 ++++++++++++-- src/inventoryWindows.ts | 4 ++-- src/optionsGuiScheme.tsx | 22 ++++++++++++++++++++++ src/react/AppStatusProvider.tsx | 7 ++++++- src/react/ServersListProvider.tsx | 2 ++ src/react/SignInMessage.tsx | 2 ++ 7 files changed, 50 insertions(+), 9 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 98618ba5..cf890476 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -311,7 +311,7 @@ importers: version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/c50afc54e39817f7e4d313ce0f6fdaad71e7e4f4(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:zardoy/mineflayer - version: https://codeload.github.com/zardoy/mineflayer/tar.gz/a4b1b4ba7f8c972cee9c0a16eb1191ff4d21fe23(encoding@0.1.13) + version: https://codeload.github.com/zardoy/mineflayer/tar.gz/dddc683544317f117172077a9245a07be1b12479(encoding@0.1.13) mineflayer-pathfinder: specifier: ^2.4.4 version: 2.4.4 @@ -6089,8 +6089,8 @@ packages: resolution: {integrity: sha512-QMMNPx4IyZE7ydAzjvGLQLCnQNUOfkk1qVZKxTTS9q3qPTAewz4GhsVUBtbQ8LSbHthe5RcQ1Sgxs4wlIma/Qw==} engines: {node: '>=18'} - mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/a4b1b4ba7f8c972cee9c0a16eb1191ff4d21fe23: - resolution: {tarball: https://codeload.github.com/zardoy/mineflayer/tar.gz/a4b1b4ba7f8c972cee9c0a16eb1191ff4d21fe23} + mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/dddc683544317f117172077a9245a07be1b12479: + resolution: {tarball: https://codeload.github.com/zardoy/mineflayer/tar.gz/dddc683544317f117172077a9245a07be1b12479} version: 4.20.1 engines: {node: '>=18'} @@ -15831,7 +15831,7 @@ snapshots: - encoding - supports-color - mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/a4b1b4ba7f8c972cee9c0a16eb1191ff4d21fe23(encoding@0.1.13): + mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/dddc683544317f117172077a9245a07be1b12479(encoding@0.1.13): dependencies: minecraft-data: 3.65.0 minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/495eed56ab230b2615596590064671356d86a2dc(patch_hash=7otpchsbv7hxsuis4rrrwdtbve)(encoding@0.1.13) diff --git a/src/index.ts b/src/index.ts index 5fd50ce3..e73e8240 100644 --- a/src/index.ts +++ b/src/index.ts @@ -42,6 +42,7 @@ import * as THREE from 'three' import MinecraftData, { versionsByMinecraftVersion } from 'minecraft-data' import debug from 'debug' import { defaultsDeep } from 'lodash-es' +import initializePacketsReplay from './packetsReplay' import { initVR } from './vr' import { @@ -97,6 +98,7 @@ import { ref, subscribe } from 'valtio' import { signInMessageState } from './react/SignInMessageProvider' import { updateAuthenticatedAccountData, updateLoadedServerData } from './react/ServersListProvider' import { versionToNumber } from 'prismarine-viewer/viewer/prepare/utils' +import packetsPatcher from './packetsPatcher' window.debug = debug window.THREE = THREE @@ -108,6 +110,8 @@ window.beforeRenderFrame = [] void registerServiceWorker() watchFov() initCollisionShapes() +initializePacketsReplay() +packetsPatcher() // Create three.js context, add to page let renderer: THREE.WebGLRenderer @@ -361,6 +365,7 @@ async function connect (connectOptions: ConnectOptions) { } const renderDistance = singleplayer ? renderDistanceSingleplayer : multiplayerRenderDistance + let updateDataAfterJoin = () => { } let localServer try { const serverOptions = defaultsDeep({}, connectOptions.serverOverrides ?? {}, options.localServerOptions, defaultServerOptions) @@ -506,9 +511,13 @@ async function connect (connectOptions: ConnectOptions) { } return accounts }) - updateLoadedServerData(s => ({ ...s, authenticatedAccountOverride: client.username }), connectOptions.serverIndex) + updateDataAfterJoin = () => { + updateLoadedServerData(s => ({ ...s, authenticatedAccountOverride: client.username }), connectOptions.serverIndex) + } } else { - updateLoadedServerData(s => ({ ...s, authenticatedAccountOverride: undefined }), connectOptions.serverIndex) + updateDataAfterJoin = () => { + updateLoadedServerData(s => ({ ...s, authenticatedAccountOverride: undefined }), connectOptions.serverIndex) + } } setLoadingScreenStatus('Authentication successful. Logging in to server') } finally { @@ -660,6 +669,7 @@ async function connect (connectOptions: ConnectOptions) { setLoadingScreenStatus('Placing blocks (starting viewer)') localStorage.lastConnectOptions = JSON.stringify(connectOptions) connectOptions.onSuccessfulPlay?.() + updateDataAfterJoin() if (connectOptions.autoLoginPassword) { bot.chat(`/login ${connectOptions.autoLoginPassword}`) } diff --git a/src/inventoryWindows.ts b/src/inventoryWindows.ts index 5f7fc0a5..fd213509 100644 --- a/src/inventoryWindows.ts +++ b/src/inventoryWindows.ts @@ -328,9 +328,9 @@ export const getItemNameRaw = (item: Pick return parsed as MessageFormatPart } } catch (err) { - return [{ + return { text: customName - }] + } } } diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index d7636392..76799a60 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -9,6 +9,7 @@ import Slider from './react/Slider' import { getScreenRefreshRate, setLoadingScreenStatus } from './utils' import { openFilePicker, resetLocalStorageWithoutWorld } from './browserfs' import { getResourcePackName, resourcePackState, uninstallTexturePack } from './texturePack' +import { downloadPacketsReplay, packetsReplaceSessionState } from './packetsReplay' export const guiOptionsScheme: { @@ -309,6 +310,27 @@ export const guiOptionsScheme: { if (confirm('Are you sure you want to reset all settings?')) resetLocalStorageWithoutWorld() }}>Reset all settings }, + }, + { + custom () { + return Developer + }, + }, + { + custom () { + const { active } = useSnapshot(packetsReplaceSessionState) + return + }, + }, + { + custom () { + const { active } = useSnapshot(packetsReplaceSessionState) + return + }, } ], } diff --git a/src/react/AppStatusProvider.tsx b/src/react/AppStatusProvider.tsx index 0b12390c..c905be12 100644 --- a/src/react/AppStatusProvider.tsx +++ b/src/react/AppStatusProvider.tsx @@ -5,6 +5,7 @@ import { resetLocalStorageWorld } from '../browserfs' import { fsState } from '../loadSave' import { guessProblem } from '../errorLoadingScreenHelpers' import { ConnectOptions } from '../connect' +import { downloadPacketsReplay, packetsReplaceSessionState } from '../packetsReplay' import AppStatus from './AppStatus' import DiveTransition from './DiveTransition' import { useDidUpdateEffect } from './utils' @@ -32,6 +33,7 @@ export const lastConnectOptions = { export default () => { const { isError, lastStatus, maybeRecoverable, status, hideDots, descriptionHint } = useSnapshot(appStatusState) + const { active: replayActive } = useSnapshot(packetsReplaceSessionState) const isOpen = useIsModalActive('app-status') @@ -103,7 +105,10 @@ export default () => { } } : undefined} actionsSlot={ - displayAuthButton &&
+
{code}
+
+ Waiting... {timeLeft} +
+
+ {warningText &&
+ Join only vanilla servers! This client is detectable and may result in a ban by anti-cheat plugins. +
} + {setSaveToken && } +
}, ], parameters: { @@ -23,6 +23,6 @@ const preview: Preview = { }, }, }, -}; +} -export default preview; +export default preview diff --git a/README.MD b/README.MD index ad120dbf..9a4ba24a 100644 --- a/README.MD +++ b/README.MD @@ -4,14 +4,14 @@ A true Minecraft client running in your browser! A port of the original game to the web, written in JavaScript using modern web technologies. -If you encounter any bugs or usability issues, please report them! +If you encounter any bugs or usability issues, please report them! For development, see [development](#development--debugging). You can try this out at [mcraft.fun](https://mcraft.fun/), [pcm.gg](https://pcm.gg) (short link) [mcon.vercel.app](https://mcon.vercel.app/) or the GitHub pages deploy. Every commit from the `develop` (default) branch is deployed to [s.mcraft.fun](https://s.mcraft.fun/) - so it's usually newer, but might be less stable. ### Big Features - Open any zip world file or even folder in read-write mode! -- Connect to cracked servers* (it's possible because of proxy servers, see below) +- Connect to Java servers running in both offline (cracked) and online mode* (it's possible because of proxy servers, see below) - Singleplayer mode with simple world generations! - Works offline - Play with friends over internet! (P2P is powered by Peer.js discovery servers) @@ -39,9 +39,9 @@ Whatever offline mode you used (zip, folder, just single player), you can always ### Servers -You can play almost on any server, supporting offline connections. +You can play almost on any Java server, vanilla servers are fully supported. See the [Mineflayer](https://github.com/PrismarineJS/mineflayer) repo for the list of supported versions (should support majority of versions). -There is a builtin proxy, but you can also host a your one! Just clone the repo, run `pnpm i` (following CONTRIBUTING.MD) and run `pnpm prod-start`, then you can specify `http://localhost:8080` in the proxy field. +There is a builtin proxy, but you can also host your one! Just clone the repo, run `pnpm i` (following CONTRIBUTING.MD) and run `pnpm prod-start`, then you can specify `http://localhost:8080` in the proxy field. MS account authentication will be supported soon. ### Rendering @@ -67,9 +67,9 @@ There are many many settings, that are not exposed in the UI yet. You can find o To open the console, press `F12`, or if you are on mobile, you can type `#debug` in the URL (browser address bar), it wont't reload the page, but you will see a button to open the console. This way you can change advanced settings and see all errors or warnings. Also this way you can access global variables (described below). -### Debugging +### Development & Debugging -It should be easy to build/start the project locally. See [CONTRIBUTING.MD](./CONTRIBUTING.md) for more info. +It should be easy to build/start the project locally. See [CONTRIBUTING.MD](./CONTRIBUTING.md) for more info. Also you can look at Dockerfile for reference. There is world renderer playground ([link](https://mcon.vercel.app/playground.html)). diff --git a/esbuild.mjs b/esbuild.mjs index 28b233bf..1f075a62 100644 --- a/esbuild.mjs +++ b/esbuild.mjs @@ -85,6 +85,9 @@ const buildOptions = { '.vert': 'text', '.frag': 'text', '.obj': 'text', + '.woff': 'dataurl', + '.woff2': 'dataurl', + '.ttf': 'dataurl', }, write: false, // todo would be better to enable? diff --git a/package.json b/package.json index 5bf32a69..07e9ff0b 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,6 @@ "flying-squid": "npm:@zardoy/flying-squid@^0.0.33", "fs-extra": "^11.1.1", "google-drive-browserfs": "github:zardoy/browserfs#google-drive", - "iconify-icon": "^1.0.8", "jszip": "^3.10.1", "lodash-es": "^4.17.21", "minecraft-assets": "^1.12.2", @@ -77,6 +76,7 @@ "net-browserify": "github:zardoy/prismarinejs-net-browserify", "node-gzip": "^1.1.2", "peerjs": "^1.5.0", + "pixelarticons": "^1.8.1", "pretty-bytes": "^6.1.1", "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", "prosemirror-example-setup": "^1.2.2", @@ -169,7 +169,8 @@ }, "patchedDependencies": { "minecraft-protocol@1.47.0": "patches/minecraft-protocol@1.47.0.patch", - "three@0.154.0": "patches/three@0.154.0.patch" + "three@0.154.0": "patches/three@0.154.0.patch", + "pixelarticons@1.8.1": "patches/pixelarticons@1.8.1.patch" } }, "packageManager": "pnpm@9.0.4" diff --git a/patches/pixelarticons@1.8.1.patch b/patches/pixelarticons@1.8.1.patch new file mode 100644 index 00000000..10044536 --- /dev/null +++ b/patches/pixelarticons@1.8.1.patch @@ -0,0 +1,27 @@ +diff --git a/fonts/pixelart-icons-font.css b/fonts/pixelart-icons-font.css +index 3b2ebe839370d96bf93ef5ca94a827f07e49378d..103ab4d6b9f3b5c9f41d1407e3cbf4ac392fbf41 100644 +--- a/fonts/pixelart-icons-font.css ++++ b/fonts/pixelart-icons-font.css +@@ -1,16 +1,13 @@ + @font-face { + font-family: "pixelart-icons-font"; +- src: url('pixelart-icons-font.eot?t=1711815892278'); /* IE9*/ +- src: url('pixelart-icons-font.eot?t=1711815892278#iefix') format('embedded-opentype'), /* IE6-IE8 */ ++ src: + url("pixelart-icons-font.woff2?t=1711815892278") format("woff2"), + url("pixelart-icons-font.woff?t=1711815892278") format("woff"), + url('pixelart-icons-font.ttf?t=1711815892278') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ +- url('pixelart-icons-font.svg?t=1711815892278#pixelart-icons-font') format('svg'); /* iOS 4.1- */ + } + + [class^="pixelart-icons-font-"], [class*=" pixelart-icons-font-"] { + font-family: 'pixelart-icons-font' !important; +- font-size:24px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +@@ -503,4 +500,3 @@ + .pixelart-icons-font-zap:before { content: "\ebe4"; } + .pixelart-icons-font-zoom-in:before { content: "\ebe5"; } + .pixelart-icons-font-zoom-out:before { content: "\ebe6"; } +- diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cf890476..2208e681 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ patchedDependencies: minecraft-protocol@1.47.0: hash: 7otpchsbv7hxsuis4rrrwdtbve path: patches/minecraft-protocol@1.47.0.patch + pixelarticons@1.8.1: + hash: cclg2qo6d4yjs4evj64nr2mbwa + path: patches/pixelarticons@1.8.1.patch three@0.154.0: hash: sj7ocb4p23jym6bkfgueanti2e path: patches/three@0.154.0.patch @@ -115,9 +118,6 @@ importers: google-drive-browserfs: specifier: github:zardoy/browserfs#google-drive version: browserfs@https://codeload.github.com/zardoy/browserfs/tar.gz/ab58ae8ef00e3a31db01909e365e6cb5188436e0 - iconify-icon: - specifier: ^1.0.8 - version: 1.0.8 jszip: specifier: ^3.10.1 version: 3.10.1 @@ -148,6 +148,9 @@ importers: peerjs: specifier: ^1.5.0 version: 1.5.0 + pixelarticons: + specifier: ^1.8.1 + version: 1.8.1(patch_hash=cclg2qo6d4yjs4evj64nr2mbwa) pretty-bytes: specifier: ^6.1.1 version: 6.1.1 @@ -1723,9 +1726,6 @@ packages: '@humanwhocodes/object-schema@1.2.1': resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - '@iconify/types@2.0.0': - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -5158,9 +5158,6 @@ packages: hyphenate-style-name@1.0.4: resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} - iconify-icon@1.0.8: - resolution: {integrity: sha512-jvbUKHXf8EnGGArmhlP2IG8VqQLFFyTvTqb9LVL2TKTh7/eCCD1o2HHE9thpbJJb6B8hzhcFb6rOKhvo7reNKA==} - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -6633,6 +6630,9 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pixelarticons@1.8.1: + resolution: {integrity: sha512-4taoDCleft9RtzVHLA73VDnRBwJNqlwbW8ShO6S0G9b+bM5ArGe1MVFW9xpromuPvQgVUYCSjRxNAQuNtADqyA==} + pixelmatch@4.0.2: resolution: {integrity: sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==} hasBin: true @@ -9985,8 +9985,6 @@ snapshots: '@humanwhocodes/object-schema@1.2.1': {} - '@iconify/types@2.0.0': {} - '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -14722,10 +14720,6 @@ snapshots: hyphenate-style-name@1.0.4: {} - iconify-icon@1.0.8: - dependencies: - '@iconify/types': 2.0.0 - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -16433,6 +16427,8 @@ snapshots: pirates@4.0.6: {} + pixelarticons@1.8.1(patch_hash=cclg2qo6d4yjs4evj64nr2mbwa): {} + pixelmatch@4.0.2: dependencies: pngjs: 3.4.0 diff --git a/scripts/genPixelartTypes.ts b/scripts/genPixelartTypes.ts new file mode 100644 index 00000000..e7c9649a --- /dev/null +++ b/scripts/genPixelartTypes.ts @@ -0,0 +1,16 @@ +import fs from 'fs' + +const icons = fs.readdirSync('node_modules/pixelarticons/svg') + +const addIconPath = '../../node_modules/pixelarticons/svg/' + +let str = 'export type PixelartIconsGenerated = {\n' +for (const icon of icons) { + const name = icon.replace('.svg', '') + // jsdoc + const jsdocImage = '![image](' + addIconPath + icon + ')' + str += ` /** ${jsdocImage} */\n` + str += ` '${name}': string;\n` +} +str += '}\n' +fs.writeFileSync('./src/react/pixelartIcons.generated.ts', str, 'utf8') diff --git a/src/index.ts b/src/index.ts index e73e8240..e34e81ab 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,7 +2,6 @@ import './importsWorkaround' import './styles.css' import './globals' -import 'iconify-icon' import './devtools' import './entities' import './globalDomListeners' diff --git a/src/packetsPatcher.ts b/src/packetsPatcher.ts index f877d6ed..587c41c9 100644 --- a/src/packetsPatcher.ts +++ b/src/packetsPatcher.ts @@ -2,13 +2,13 @@ // todo these fixes should be ported to mineflayer export default () => { - customEvents.on('mineflayerBotCreated', () => { - bot._client.on('packet', (data, meta) => { - if (meta.name === 'map_chunk') { - if (data.groundUp && data.bitMap === 1 && data.chunkData.every(x => x === 0)) { - data.chunkData = Buffer.from(Array.from({ length: 12_544 }).fill(0) as any) - } - } - }) + customEvents.on('mineflayerBotCreated', () => { + bot._client.on('packet', (data, meta) => { + if (meta.name === 'map_chunk') { + if (data.groundUp && data.bitMap === 1 && data.chunkData.every(x => x === 0)) { + data.chunkData = Buffer.from(Array.from({ length: 12_544 }).fill(0) as any) + } + } }) + }) } diff --git a/src/react/Button.tsx b/src/react/Button.tsx index 20dc0801..10ff2fb0 100644 --- a/src/react/Button.tsx +++ b/src/react/Button.tsx @@ -2,6 +2,7 @@ import classNames from 'classnames' import { createContext, FC, Ref, useContext } from 'react' import buttonCss from './button.module.css' import SharedHudVars from './SharedHudVars' +import PixelartIcon from './PixelartIcon' // testing in storybook from deathscreen @@ -17,7 +18,7 @@ const ButtonContext = createContext({ onClick () { }, }) -export const ButtonProvider: FC<{children, onClick}> = ({ children, onClick }) => { +export const ButtonProvider: FC<{ children, onClick }> = ({ children, onClick }) => { return {children} } @@ -39,7 +40,7 @@ export default (({ label, icon, children, inScreen, rootRef, type = 'button', .. return diff --git a/src/react/ConceptCommandsGui.stories.tsx b/src/react/ConceptCommandsGui.stories.tsx index 89cb6eff..4f3586d4 100644 --- a/src/react/ConceptCommandsGui.stories.tsx +++ b/src/react/ConceptCommandsGui.stories.tsx @@ -11,7 +11,6 @@ const Button2 = ({ title, icon }) => {
{title}
- {/* { // const sessionEndpoint = 'http://localhost:3000/session' let authEndpoint = '' let sessionEndpoint = '' + if (!proxyBaseUrl.startsWith('http')) proxyBaseUrl = `${isPageSecure() ? 'https' : 'http'}://${proxyBaseUrl}` + const url = proxyBaseUrl + '/api/vm/net/connect' + let result: Response + try { + result = await fetch(url) + } catch (err) { + throw new Error(`Selected proxy server ${proxyBaseUrl} most likely is down`) + } try { - if (!proxyBaseUrl.startsWith('http')) proxyBaseUrl = `${isPageSecure() ? 'https' : 'http'}://${proxyBaseUrl}` - const url = proxyBaseUrl + '/api/vm/net/connect' - const result = await fetch(url) const json = await result.json() authEndpoint = urlWithBase(json.capabilities.authEndpoint, proxyBaseUrl) sessionEndpoint = urlWithBase(json.capabilities.sessionEndpoint, proxyBaseUrl) diff --git a/src/react/AppStatus.tsx b/src/react/AppStatus.tsx index 10cc5793..9ebecf93 100644 --- a/src/react/AppStatus.tsx +++ b/src/react/AppStatus.tsx @@ -28,6 +28,7 @@ export default ({ status, isError, hideDots = false, lastStatus = '', backAction return ( diff --git a/src/react/Chat.css b/src/react/Chat.css index 41917783..cba0a1aa 100644 --- a/src/react/Chat.css +++ b/src/react/Chat.css @@ -24,6 +24,13 @@ div.chat-wrapper { left: 1px; box-sizing: border-box; background-color: rgba(0, 0, 0, 0); + display: flex; + align-items: center; + gap: 1px; +} + +.chat-input-wrapper form { + display: flex; } .chat-input { @@ -103,7 +110,8 @@ div.chat-wrapper { } .input-mobile #chatinput { - height: 20px; + height: 24px; + font-size: 13px; } .display-mobile { diff --git a/src/react/Chat.tsx b/src/react/Chat.tsx index 89b2aa8b..60467171 100644 --- a/src/react/Chat.tsx +++ b/src/react/Chat.tsx @@ -4,6 +4,8 @@ import { MessageFormatPart } from '../botUtils' import { MessagePart } from './MessageFormatted' import './Chat.css' import { isIos, reactKeyForMessage } from './utils' +import Button from './Button' +import { pixelartIcons } from './PixelartIcon' export type Message = { parts: MessageFormatPart[], @@ -221,6 +223,8 @@ export default ({
diff --git a/src/react/EnterFullscreenButton.tsx b/src/react/EnterFullscreenButton.tsx index ad78ddad..3901b9ae 100644 --- a/src/react/EnterFullscreenButton.tsx +++ b/src/react/EnterFullscreenButton.tsx @@ -1,6 +1,11 @@ import { useEffect, useState } from 'react' +import { useSnapshot } from 'valtio' +import { activeModalStack, miscUiState } from '../globalState' import Button from './Button' import { useUsingTouch } from './utilsApp' +import { pixelartIcons } from './PixelartIcon' + +const hideOnModals = new Set(['chat']) export default () => { const [fullScreen, setFullScreen] = useState(false) @@ -9,16 +14,23 @@ export default () => { setFullScreen(!!document.fullscreenElement) }) }, []) + const { gameLoaded } = useSnapshot(miscUiState) + + const activeStack = useSnapshot(activeModalStack) + + const inMainMenu = activeStack.length === 0 && !gameLoaded const usingTouch = useUsingTouch() - if (!usingTouch || !document.documentElement.requestFullscreen || fullScreen) return null + const hideButton = activeStack.some(x => hideOnModals.has(x.reactType)) + + if (hideButton || !usingTouch || !document.documentElement.requestFullscreen || fullScreen) return null return + {!lockConnect && <> + + }
} From d02008c2ef4bfff93fad0edbeaffca3d60399bcc Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 11 Jul 2024 18:33:16 +0300 Subject: [PATCH 0297/1195] fix(regression): signs lighting was compltely broken --- prismarine-viewer/viewer/lib/mesher/models.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prismarine-viewer/viewer/lib/mesher/models.ts b/prismarine-viewer/viewer/lib/mesher/models.ts index ab77d516..c978c240 100644 --- a/prismarine-viewer/viewer/lib/mesher/models.ts +++ b/prismarine-viewer/viewer/lib/mesher/models.ts @@ -624,7 +624,7 @@ export function getSectionGeometry (sx, sy, sz, world: World) { delete attr.t_uvs attr.positions = new Float32Array(attr.positions) as any - attr.normals = new Int8Array(attr.normals) as any + attr.normals = new Float32Array(attr.normals) as any attr.colors = new Float32Array(attr.colors) as any attr.uvs = new Float32Array(attr.uvs) as any From d0205a970b823ed49e4a01dea237e175a096d777 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 11 Jul 2024 20:08:10 +0300 Subject: [PATCH 0298/1195] up mineflayer for better vehicle move --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 45ebdda4..9d370f17 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -314,7 +314,7 @@ importers: version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/c50afc54e39817f7e4d313ce0f6fdaad71e7e4f4(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:zardoy/mineflayer - version: https://codeload.github.com/zardoy/mineflayer/tar.gz/dddc683544317f117172077a9245a07be1b12479(encoding@0.1.13) + version: https://codeload.github.com/zardoy/mineflayer/tar.gz/c03c76ef2acfc747bfe8cd1e290106c81f399848(encoding@0.1.13) mineflayer-pathfinder: specifier: ^2.4.4 version: 2.4.4 @@ -6086,8 +6086,8 @@ packages: resolution: {integrity: sha512-QMMNPx4IyZE7ydAzjvGLQLCnQNUOfkk1qVZKxTTS9q3qPTAewz4GhsVUBtbQ8LSbHthe5RcQ1Sgxs4wlIma/Qw==} engines: {node: '>=18'} - mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/dddc683544317f117172077a9245a07be1b12479: - resolution: {tarball: https://codeload.github.com/zardoy/mineflayer/tar.gz/dddc683544317f117172077a9245a07be1b12479} + mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/c03c76ef2acfc747bfe8cd1e290106c81f399848: + resolution: {tarball: https://codeload.github.com/zardoy/mineflayer/tar.gz/c03c76ef2acfc747bfe8cd1e290106c81f399848} version: 4.20.1 engines: {node: '>=18'} @@ -15825,7 +15825,7 @@ snapshots: - encoding - supports-color - mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/dddc683544317f117172077a9245a07be1b12479(encoding@0.1.13): + mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/c03c76ef2acfc747bfe8cd1e290106c81f399848(encoding@0.1.13): dependencies: minecraft-data: 3.65.0 minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/495eed56ab230b2615596590064671356d86a2dc(patch_hash=7otpchsbv7hxsuis4rrrwdtbve)(encoding@0.1.13) From 07002a743748899f58767011c3bf99da2658c63b Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 13 Jul 2024 05:49:38 +0300 Subject: [PATCH 0299/1195] fix: remove entities from the scene on login packet (usually on the world switch) --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d370f17..9deb9a7e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -314,7 +314,7 @@ importers: version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/c50afc54e39817f7e4d313ce0f6fdaad71e7e4f4(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:zardoy/mineflayer - version: https://codeload.github.com/zardoy/mineflayer/tar.gz/c03c76ef2acfc747bfe8cd1e290106c81f399848(encoding@0.1.13) + version: https://codeload.github.com/zardoy/mineflayer/tar.gz/7f65e46a048f1bc2b57775d84b32400dce707321(encoding@0.1.13) mineflayer-pathfinder: specifier: ^2.4.4 version: 2.4.4 @@ -6086,8 +6086,8 @@ packages: resolution: {integrity: sha512-QMMNPx4IyZE7ydAzjvGLQLCnQNUOfkk1qVZKxTTS9q3qPTAewz4GhsVUBtbQ8LSbHthe5RcQ1Sgxs4wlIma/Qw==} engines: {node: '>=18'} - mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/c03c76ef2acfc747bfe8cd1e290106c81f399848: - resolution: {tarball: https://codeload.github.com/zardoy/mineflayer/tar.gz/c03c76ef2acfc747bfe8cd1e290106c81f399848} + mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/7f65e46a048f1bc2b57775d84b32400dce707321: + resolution: {tarball: https://codeload.github.com/zardoy/mineflayer/tar.gz/7f65e46a048f1bc2b57775d84b32400dce707321} version: 4.20.1 engines: {node: '>=18'} @@ -15825,7 +15825,7 @@ snapshots: - encoding - supports-color - mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/c03c76ef2acfc747bfe8cd1e290106c81f399848(encoding@0.1.13): + mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/7f65e46a048f1bc2b57775d84b32400dce707321(encoding@0.1.13): dependencies: minecraft-data: 3.65.0 minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/495eed56ab230b2615596590064671356d86a2dc(patch_hash=7otpchsbv7hxsuis4rrrwdtbve)(encoding@0.1.13) From 04b5d1ac3f03e5053df6a6142ede7d0c4539d480 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 13 Jul 2024 06:17:47 +0300 Subject: [PATCH 0300/1195] add handled packets stats TODO make auto-updated --- docs-assets/handled-packets.md | 169 +++++++++++++++++++++++++++++++ scripts/updateHandledPackets.mjs | 60 +++++++++++ 2 files changed, 229 insertions(+) create mode 100644 docs-assets/handled-packets.md create mode 100644 scripts/updateHandledPackets.mjs diff --git a/docs-assets/handled-packets.md b/docs-assets/handled-packets.md new file mode 100644 index 00000000..0671987c --- /dev/null +++ b/docs-assets/handled-packets.md @@ -0,0 +1,169 @@ +# Handled Packets + +## Server -> Client + +❌ statistics +❌ advancements +❌ face_player +❌ nbt_query_response +❌ chat_suggestions +❌ trade_list +❌ vehicle_move +❌ open_book +❌ craft_recipe_response +❌ end_combat_event +❌ enter_combat_event +❌ unlock_recipes +❌ camera +❌ update_view_position +❌ update_view_distance +❌ entity_sound_effect +❌ stop_sound +❌ feature_flags +❌ select_advancement_tab +❌ declare_recipes +❌ tags +❌ acknowledge_player_digging +❌ initialize_world_border +❌ world_border_center +❌ world_border_lerp_size +❌ world_border_size +❌ world_border_warning_delay +❌ world_border_warning_reach +❌ simulation_distance +❌ chunk_biomes +❌ damage_event +❌ hurt_animation +✅ spawn_entity +✅ spawn_entity_experience_orb +✅ named_entity_spawn +✅ animation +✅ block_break_animation +✅ tile_entity_data +✅ block_action +✅ block_change +✅ boss_bar +✅ difficulty +✅ tab_complete +✅ declare_commands +✅ multi_block_change +✅ close_window +✅ open_window +✅ window_items +✅ craft_progress_bar +✅ set_slot +✅ set_cooldown +✅ custom_payload +✅ hide_message +✅ kick_disconnect +✅ profileless_chat +✅ entity_status +✅ explosion +✅ unload_chunk +✅ game_state_change +✅ open_horse_window +✅ keep_alive +✅ map_chunk +✅ world_event +✅ world_particles +✅ update_light +✅ login +✅ map +✅ rel_entity_move +✅ entity_move_look +✅ entity_look +✅ open_sign_entity +✅ abilities +✅ player_chat +✅ death_combat_event +✅ player_remove +✅ player_info +✅ position +✅ entity_destroy +✅ remove_entity_effect +✅ resource_pack_send +✅ respawn +✅ entity_head_rotation +✅ held_item_slot +✅ scoreboard_display_objective +✅ entity_metadata +✅ attach_entity +✅ entity_velocity +✅ entity_equipment +✅ experience +✅ update_health +✅ scoreboard_objective +✅ set_passengers +✅ teams +✅ scoreboard_score +✅ spawn_position +✅ update_time +✅ sound_effect +✅ system_chat +✅ playerlist_header +✅ collect +✅ entity_teleport +✅ entity_update_attributes +✅ entity_effect +✅ server_data +✅ clear_titles +✅ action_bar +✅ ping +✅ set_title_subtitle +✅ set_title_text +✅ set_title_time +✅ packet + +## Client -> Server + +❌ query_block_nbt +❌ set_difficulty +❌ query_entity_nbt +❌ pick_item +❌ set_beacon_effect +❌ update_command_block_minecart +❌ update_structure_block +❌ generate_structure +❌ lock_difficulty +❌ craft_recipe_request +❌ displayed_recipe +❌ recipe_book +❌ update_jigsaw_block +❌ spectate +❌ advancement_tab +✅ teleport_confirm +✅ chat_command +✅ chat_message +✅ message_acknowledgement +✅ edit_book +✅ name_item +✅ select_trade +✅ update_command_block +✅ tab_complete +✅ client_command +✅ settings +✅ enchant_item +✅ window_click +✅ close_window +✅ custom_payload +✅ use_entity +✅ keep_alive +✅ position +✅ position_look +✅ look +✅ flying +✅ vehicle_move +✅ steer_boat +✅ abilities +✅ block_dig +✅ entity_action +✅ steer_vehicle +✅ resource_pack_receive +✅ held_item_slot +✅ set_creative_slot +✅ update_sign +✅ arm_animation +✅ block_place +✅ use_item +✅ pong +✅ chat_session_update diff --git a/scripts/updateHandledPackets.mjs b/scripts/updateHandledPackets.mjs new file mode 100644 index 00000000..080eaf44 --- /dev/null +++ b/scripts/updateHandledPackets.mjs @@ -0,0 +1,60 @@ +import fs from 'fs' +import path from 'path' +import minecraftData from 'minecraft-data' + +const lastVersion = minecraftData.versions.pc[0] +// console.log('last proto ver', lastVersion.minecraftVersion) +const allPackets = minecraftData(lastVersion.minecraftVersion).protocol +const getPackets = ({ types }) => { + return Object.keys(types).map(type => type.replace('packet_', '')) +} +// todo test against all versions +const allFromServerPackets = getPackets(allPackets.play.toClient) +const allToServerPackets = getPackets(allPackets.play.toServer).filter(x => !['packet'].includes(x)) + +const buildFile = './dist/index.js' + +const file = fs.readFileSync(buildFile, 'utf8') + +const packetsReceiveRegex = /client\.on\("(\w+)"/g +const packetsReceiveSend = /client\.write\("(\w+)"/g + +let allSupportedReceive = [...new Set([...file.matchAll(packetsReceiveRegex)].map(x => x[1]))] +let allSupportedSend = [...new Set([...file.matchAll(packetsReceiveSend)].map(x => x[1]))] + +let md = '# Handled Packets\n' + +md += '\n## Server -> Client\n\n' +let notSupportedRows = [] +let supportedRows = [] +for (const packet of allFromServerPackets) { + const includes = allSupportedReceive.includes(packet); + (includes ? supportedRows : notSupportedRows).push(packet) +} + +for (const row of notSupportedRows) { + md += `❌ ${row}\n` +} +for (const row of supportedRows) { + md += `✅ ${row}\n` +} + +md += '\n' + +notSupportedRows = [] +supportedRows = [] + +md += '## Client -> Server\n\n' +for (const packet of allToServerPackets) { + const includes = allSupportedSend.includes(packet); + (includes ? supportedRows : notSupportedRows).push(packet) +} + +for (const row of notSupportedRows) { + md += `❌ ${row}\n` +} +for (const row of supportedRows) { + md += `✅ ${row}\n` +} + +fs.writeFileSync('./docs-assets/handled-packets.md', md) From 6c5f72e1f286f2b73f8b940d117b9cec4b197ae1 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 13 Jul 2024 20:31:27 +0300 Subject: [PATCH 0301/1195] feat: implement pitch which was required for note blocks to work properly --- prismarine-viewer/viewer/lib/viewer.ts | 5 +++-- src/soundSystem.ts | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/prismarine-viewer/viewer/lib/viewer.ts b/prismarine-viewer/viewer/lib/viewer.ts index c95127f2..504c4637 100644 --- a/prismarine-viewer/viewer/lib/viewer.ts +++ b/prismarine-viewer/viewer/lib/viewer.ts @@ -32,7 +32,7 @@ export class Viewer { this.world.camera = camera } - constructor(public renderer: THREE.WebGLRenderer, worldConfig = defaultWorldRendererConfig) { + constructor (public renderer: THREE.WebGLRenderer, worldConfig = defaultWorldRendererConfig) { // https://discourse.threejs.org/t/updates-to-color-management-in-three-js-r152/50791 THREE.ColorManagement.enabled = false renderer.outputColorSpace = THREE.LinearSRGBColorSpace @@ -118,7 +118,7 @@ export class Viewer { this.world.updateCamera(pos?.offset(0, yOffset, 0) ?? null, yaw, pitch) } - playSound (position: Vec3, path: string, volume = 1) { + playSound (position: Vec3, path: string, volume = 1, pitch = 1) { if (!this.audioListener) { this.audioListener = new THREE.AudioListener() this.camera.add(this.audioListener) @@ -134,6 +134,7 @@ export class Viewer { sound.setBuffer(buffer) sound.setRefDistance(20) sound.setVolume(volume) + sound.setPlaybackRate(pitch) // set the pitch this.scene.add(sound) // set sound position sound.position.set(position.x, position.y, position.z) diff --git a/src/soundSystem.ts b/src/soundSystem.ts index e7fdaee7..d49b6a8c 100644 --- a/src/soundSystem.ts +++ b/src/soundSystem.ts @@ -50,7 +50,7 @@ subscribeKey(miscUiState, 'gameLoaded', async () => { const isMuted = options.mutedSounds.includes(soundKey) || options.volume === 0 if (position) { if (!isMuted) { - viewer.playSound(position, url, soundVolume * Math.max(Math.min(volume, 1), 0) * (options.volume / 100)) + viewer.playSound(position, url, soundVolume * Math.max(Math.min(volume, 1), 0) * (options.volume / 100), Math.max(Math.min(pitch ?? 1, 2), 0.5)) } if (getDistance(bot.entity.position, position) < 4 * 16) { lastPlayedSounds.lastServerPlayed[soundKey] ??= { count: 0, last: 0 } From b13ef443bb84d4f2f84a4d11bc0f25ffc8d4840c Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 13 Jul 2024 21:30:44 +0300 Subject: [PATCH 0302/1195] feat: rework sound system. Now sounds are 100% implemented for all current & future supported versions --- prismarine-viewer/viewer/prepare/utils.ts | 14 ++++++ src/globals.d.ts | 2 +- src/soundSystem.ts | 53 ++++++++++++----------- 3 files changed, 42 insertions(+), 27 deletions(-) diff --git a/prismarine-viewer/viewer/prepare/utils.ts b/prismarine-viewer/viewer/prepare/utils.ts index a33909a9..958273f3 100644 --- a/prismarine-viewer/viewer/prepare/utils.ts +++ b/prismarine-viewer/viewer/prepare/utils.ts @@ -2,3 +2,17 @@ export const versionToNumber = (ver: string) => { const [x, y = '0', z = '0'] = ver.split('.') return +`${x.padStart(2, '0')}${y.padStart(2, '0')}${z.padStart(2, '0')}` } + +export const versionToMajor = (version: string) => { + const [x, y = '0'] = version.split('.') + return `${x.padStart(2, '0')}.${y.padStart(2, '0')}` +} + +export const versionsMapToMajor = (versionsMap: Record) => { + const majorVersions = {} as Record + for (const [ver, data] of Object.entries(versionsMap)) { + const major = versionToMajor(ver) + majorVersions[major] = data + } + return majorVersions +} diff --git a/src/globals.d.ts b/src/globals.d.ts index 05b29a14..f8699f21 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -17,7 +17,7 @@ declare const worldView: import('prismarine-viewer/viewer/lib/worldDataEmitter') declare const localServer: import('flying-squid/dist/index').FullServer & { options } | undefined /** all currently loaded mc data */ declare const mcData: Record -declare const loadedData: import('minecraft-data').IndexedData +declare const loadedData: import('minecraft-data').IndexedData & { sounds: Record } declare const customEvents: import('typed-emitter').default<{ /** Singleplayer load requested */ singleplayer (): void diff --git a/src/soundSystem.ts b/src/soundSystem.ts index d49b6a8c..0187a9b0 100644 --- a/src/soundSystem.ts +++ b/src/soundSystem.ts @@ -1,6 +1,6 @@ import { subscribeKey } from 'valtio/utils' import { Vec3 } from 'vec3' -import { versionToNumber } from 'prismarine-viewer/viewer/prepare/utils' +import { versionToMajor, versionToNumber, versionsMapToMajor } from 'prismarine-viewer/viewer/prepare/utils' import { loadScript } from 'prismarine-viewer/viewer/lib/utils' import type { Block } from 'prismarine-block' import { miscUiState } from './globalState' @@ -22,32 +22,26 @@ subscribeKey(miscUiState, 'gameLoaded', async () => { return } - // todo also use major versioned hardcoded sounds - const soundsMap = allSoundsMap[bot.version] + const allSoundsMajor = versionsMapToMajor(allSoundsMap) + const soundsMap = allSoundsMajor[versionToMajor(bot.version)] ?? Object.values(allSoundsMajor)[0] - if (!soundsMap || !miscUiState.gameLoaded || !soundsMap) { + if (!soundsMap || !miscUiState.gameLoaded || !loadedData.sounds) { return } - const soundsPerId = Object.fromEntries(Object.entries(soundsMap).map(([id, sound]) => [+id.split(';')[0], sound])) + // const soundsPerId = Object.fromEntries(Object.entries(soundsMap).map(([id, sound]) => [+id.split(';')[0], sound])) const soundsPerName = Object.fromEntries(Object.entries(soundsMap).map(([id, sound]) => [id.split(';')[1], sound])) - const soundIdToName = Object.fromEntries(Object.entries(soundsMap).map(([id, sound]) => [+id.split(';')[0], id.split(';')[1]])) - const playGeneralSound = async (soundId: string, soundString: string | undefined, position?: Vec3, volume = 1, pitch?: number) => { - if (!soundString) { - console.warn('Unknown sound received from server to play', soundId) - return - } + const playGeneralSound = async (soundKey: string, position?: Vec3, volume = 1, pitch?: number) => { if (!options.volume) return - const parts = soundString.split(';') - const soundVolume = +parts[0]! - const soundName = parts[1]! - // console.log('pitch', pitch) - const versionedSound = getVersionedSound(bot.version, soundName, Object.entries(soundsLegacyMap)) + const soundStaticData = soundsPerName[soundKey]?.split(';') + if (!soundStaticData) return + const soundVolume = +soundStaticData[0]! + const soundPath = soundStaticData[1]! + const versionedSound = getVersionedSound(bot.version, soundPath, Object.entries(soundsLegacyMap)) // todo test versionedSound - const url = allSoundsMeta.baseUrl.replace(/\/$/, '') + (versionedSound ? `/${versionedSound}` : '') + '/minecraft/sounds/' + soundName + '.' + allSoundsMeta.format - const soundKey = soundIdToName[+soundId] ?? soundId - const isMuted = options.mutedSounds.includes(soundKey) || options.volume === 0 + const url = allSoundsMeta.baseUrl.replace(/\/$/, '') + (versionedSound ? `/${versionedSound}` : '') + '/minecraft/sounds/' + soundPath + '.' + allSoundsMeta.format + const isMuted = options.mutedSounds.includes(soundKey) || options.mutedSounds.includes(soundPath) || options.volume === 0 if (position) { if (!isMuted) { viewer.playSound(position, url, soundVolume * Math.max(Math.min(volume, 1), 0) * (options.volume / 100), Math.max(Math.min(pitch ?? 1, 2), 0.5)) @@ -67,17 +61,24 @@ subscribeKey(miscUiState, 'gameLoaded', async () => { } } } - const playHardcodedSound = async (soundId: string, position?: Vec3, volume = 1, pitch?: number) => { - const sound = soundsPerName[soundId] - await playGeneralSound(soundId, sound, position, volume, pitch) + const playHardcodedSound = async (soundKey: string, position?: Vec3, volume = 1, pitch?: number) => { + await playGeneralSound(soundKey, position, volume, pitch) } bot.on('soundEffectHeard', async (soundId, position, volume, pitch) => { - console.debug('soundEffectHeard', soundId, volume) await playHardcodedSound(soundId, position, volume, pitch) }) - bot.on('hardcodedSoundEffectHeard', async (soundId, soundCategory, position, volume, pitch) => { - const sound = soundsPerId[soundId] - await playGeneralSound(soundId.toString(), sound, position, volume, pitch) + bot.on('hardcodedSoundEffectHeard', async (soundIdNum, soundCategory, position, volume, pitch) => { + const fixOffset = versionToNumber('1.20.4') === versionToNumber(bot.version) ? -1 : 0 + const soundKey = loadedData.sounds[soundIdNum + fixOffset]?.name + if (soundKey === undefined) return + await playGeneralSound(soundKey, position, volume, pitch) + }) + // workaround as mineflayer doesn't support soundEvent + bot._client.on('sound_effect', async (packet) => { + const soundResource = packet['soundEvent']?.resource as string | undefined + if (packet.soundId !== 0 || !soundResource) return + const pos = new Vec3(packet.x / 8, packet.y / 8, packet.z / 8) + await playHardcodedSound(soundResource.replace('minecraft:', ''), pos, packet.volume, packet.pitch) }) bot.on('entityHurt', async (entity) => { if (entity.id === bot.entity.id) { From 698779f6b5302165dd3dff731de0b223ac837513 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 13 Jul 2024 21:31:29 +0300 Subject: [PATCH 0303/1195] fix: toggle entity visiiblity even after it's creation --- prismarine-viewer/viewer/lib/entities.js | 10 +++++----- prismarine-viewer/viewer/lib/worldDataEmitter.ts | 9 ++++++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/prismarine-viewer/viewer/lib/entities.js b/prismarine-viewer/viewer/lib/entities.js index 94f06e0c..d36b6936 100644 --- a/prismarine-viewer/viewer/lib/entities.js +++ b/prismarine-viewer/viewer/lib/entities.js @@ -405,14 +405,14 @@ export class Entities extends EventEmitter { } //@ts-ignore + // set visibility const isInvisible = entity.metadata?.[0] & 0x20 - if (isInvisible) { - for (const child of this.entities[entity.id].children.find(c => c.name === 'mesh').children) { - if (child.name !== 'nametag') { - child.visible = false - } + for (const child of this.entities[entity.id].children.find(c => c.name === 'mesh').children) { + if (child.name !== 'nametag') { + child.visible = !isInvisible } } + // --- // not player const displayText = entity.metadata?.[3] && this.parseEntityLabel(entity.metadata[2]) if (entity.name !== 'player' && displayText) { diff --git a/prismarine-viewer/viewer/lib/worldDataEmitter.ts b/prismarine-viewer/viewer/lib/worldDataEmitter.ts index 5df5cc73..761509c2 100644 --- a/prismarine-viewer/viewer/lib/worldDataEmitter.ts +++ b/prismarine-viewer/viewer/lib/worldDataEmitter.ts @@ -44,7 +44,14 @@ export class WorldDataEmitter extends EventEmitter { listenToBot (bot: typeof __type_bot) { const emitEntity = (e) => { if (!e || e === bot.entity) return - this.emitter.emit('entity', { ...e, pos: e.position, username: e.username }) + this.emitter.emit('entity', { + ...e, + pos: e.position, + username: e.username, + // set debugTree (obj) { + // e.debugTree = obj + // } + }) } this.eventListeners[bot.username] = { From 512bc09477aa96352f4d19a165a7e110d5c76f81 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sun, 14 Jul 2024 01:55:41 +0300 Subject: [PATCH 0304/1195] make main docker build 5x smaller, add only proxy dockerfile --- Dockerfile | 32 +++++++++++++++++++++----------- Dockerfile.proxy | 11 +++++++++++ README.MD | 15 +++++++++++---- 3 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 Dockerfile.proxy diff --git a/Dockerfile b/Dockerfile index 086240b5..0ae1c6e0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,32 @@ -FROM node:18-alpine +# ---- Build Stage ---- +FROM node:18-alpine AS build # Without git installing the npm packages fails -RUN apk add git -RUN mkdir /app +RUN apk add --no-cache git python3 make g++ cairo-dev pango-dev jpeg-dev giflib-dev librsvg-dev WORKDIR /app COPY . /app -# install python and other dependencies -RUN apk add python3 make g++ cairo-dev pango-dev jpeg-dev giflib-dev librsvg-dev # install pnpm RUN npm i -g pnpm@9.0.4 RUN pnpm install -# only for prod -RUN pnpm run build -# --- -EXPOSE 8080 -# uncomment for development + +# TODO for development # EXPOSE 9090 # VOLUME /app/src # VOLUME /app/prismarine-viewer # ENTRYPOINT ["pnpm", "run", "run-all"] + # only for prod -ENTRYPOINT ["npm", "run", "prod-start"] +RUN pnpm run build + +# ---- Run Stage ---- +FROM node:18-alpine +RUN apk add git +WORKDIR /app +# Copy build artifacts from the build stage +COPY --from=build /app/dist /app/dist +COPY server.js /app/server.js +# Install express +RUN npm i -g pnpm@9.0.4 +RUN npm init -yp +RUN pnpm i express github:zardoy/prismarinejs-net-browserify compression cors +EXPOSE 8080 +ENTRYPOINT ["node", "server.js"] diff --git a/Dockerfile.proxy b/Dockerfile.proxy new file mode 100644 index 00000000..746eef72 --- /dev/null +++ b/Dockerfile.proxy @@ -0,0 +1,11 @@ +# ---- Run Stage ---- +FROM node:18-alpine +RUN apk add git +WORKDIR /app +COPY server.js /app/server.js +# Install server dependencies +RUN npm i -g pnpm@9.0.4 +RUN npm init -yp +RUN pnpm i express github:zardoy/prismarinejs-net-browserify compression cors +EXPOSE 8080 +ENTRYPOINT ["node", "server.js"] diff --git a/README.MD b/README.MD index 9a4ba24a..7576f6ba 100644 --- a/README.MD +++ b/README.MD @@ -44,6 +44,13 @@ See the [Mineflayer](https://github.com/PrismarineJS/mineflayer) repo for the li There is a builtin proxy, but you can also host your one! Just clone the repo, run `pnpm i` (following CONTRIBUTING.MD) and run `pnpm prod-start`, then you can specify `http://localhost:8080` in the proxy field. MS account authentication will be supported soon. +### Docker Files + +- [Main Dockerfile](./Dockerfile) - for production build & offline/private usage. Includes full web-app + proxy server for connecting to Minecraft servers. +- [Proxy Dockerfile](./Dockerfile.proxy) - for proxy server only - that one you would be able to specify in the proxy field on the client (`docker build . -f Dockerfile.proxy -t minecraft-web-proxy`) + +In case of using docker, you don't have to follow preparation steps from CONTRIBUTING.MD, like installing Node.js, pnpm, etc. + ### Rendering #### Three.js Renderer @@ -55,10 +62,6 @@ MS account authentication will be supported soon. -### Things that are not planned yet - -- Mods, plugins (basically JARs) support, shaders - since they all are related to specific game pipelines - ### Advanced Settings There are many many settings, that are not exposed in the UI yet. You can find or change them by opening the browser console and typing `options`. You can also change them by typing `options. = `. @@ -131,6 +134,10 @@ Press `Y` to set query parameters to url of your current game state. - [Peer.js](https://peerjs.com/) - P2P networking (when you open to wan) - [Three.js](https://threejs.org/) - Helping in 3D rendering +### Things that are not planned yet + +- Mods, plugins (basically JARs) support, shaders - since they all are related to specific game pipelines + ### Alternatives - [https://github.com/ClassiCube/ClassiCube](ClassiCube - Better C# Rewrite) [DEMO](https://www.classicube.net/server/play/?warned=true) From b49e9880906f269b1be6456abcdb24f78e45f21e Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 16 Jul 2024 10:35:01 +0300 Subject: [PATCH 0305/1195] fix: inventory didn't update after dropping an item --- src/controls.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/controls.ts b/src/controls.ts index a3a22029..98cc6afb 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -353,7 +353,7 @@ contro.on('trigger', ({ command }) => { document.exitPointerLock?.() openPlayerInventory() break - case 'general.drop': + case 'general.drop': { // if (bot.heldItem/* && ctrl */) bot.tossStack(bot.heldItem) bot._client.write('block_dig', { 'status': 4, @@ -365,7 +365,14 @@ contro.on('trigger', ({ command }) => { 'face': 0, sequence: 0 }) + const slot = bot.inventory.hotbarStart + bot.quickBarSlot + const item = bot.inventory.slots[slot] + if (item) { + item.count-- + bot.inventory.updateSlot(slot, item.count > 0 ? item : null!) + } break + } case 'general.chat': showModal({ reactType: 'chat' }) break From 9ee67cc8270e79e5b2d9025a30148bb083e8c36d Mon Sep 17 00:00:00 2001 From: Wolf2323 Date: Tue, 16 Jul 2024 10:37:01 +0200 Subject: [PATCH 0306/1195] fix: ignoring exception ResizeObserver loop exceptions (#161) --- src/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/index.ts b/src/index.ts index e34e81ab..2a190785 100644 --- a/src/index.ts +++ b/src/index.ts @@ -330,6 +330,9 @@ async function connect (connectOptions: ConnectOptions) { } const handleError = (err) => { console.error(err) + if (err === 'ResizeObserver loop completed with undelivered notifications.') { + return + } errorAbortController.abort() if (isCypress()) throw err miscUiState.hasErrors = true From cda1d59d3bd59580d91f4107a8b4a8bfae57c976 Mon Sep 17 00:00:00 2001 From: Wolf2323 Date: Tue, 16 Jul 2024 11:05:57 +0200 Subject: [PATCH 0307/1195] improved query parameters handling (#162) Co-authored-by: Vitaly --- README.MD | 25 ++++++++++------- src/react/AddServerOrConnect.tsx | 46 +++++++++++++++++++------------- 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/README.MD b/README.MD index 7576f6ba..cafa3ac9 100644 --- a/README.MD +++ b/README.MD @@ -110,19 +110,26 @@ world chunks have a *yellow* border, hostile mobs have a *red* outline, passive Press `Y` to set query parameters to url of your current game state. -- `?ip=` - Display connect screen to the server on load -- `?username=` - Set the username for server -- `?proxy=` - Set the proxy server address to use for server -- `?version=` - Set the version for server -- `?lockConnect=true` - Disable cancel / save buttons, useful for integrates iframes +There are some parameters you can set in the url to archive some specific behaviors: + +Server specific: +- `?ip=` - Display connect screen to the server on load with predefined server ip. `:` is optional and can be added to the ip. +- `?name=` - Set the server name for saving to the server list +- `?version=` - Set the version for the server +- `?proxy=` - Set the proxy server address to use for the server +- `?username=` - Set the username for the server +- `?lockConnect=true` - Only works then `ip` parameter is set. Disables cancel/save buttons and all inputs in the connect screen already set as parameters. Useful for integrates iframes. - `?reconnect=true` - Reconnect to the server on page reloads. Available in **dev mode only** and very useful on server testing. + +Single player specific: - `?loadSave=` - Load the save on load with the specified folder name (not title) - `?singleplayer=1` - Create empty world on load. Nothing will be saved -- `?noSave=true` - Disable auto save on unload / disconnect / export. Only manual save with `/save` command will work - - +- `?version=` - Set the version for the singleplayer world (when used with `?singleplayer=1`) +- `?noSave=true` - Disable auto save on unload / disconnect / export whenever a world is loaded. Only manual save with `/save` command will work. - `?map=` - Load the map from ZIP. You can use any url, but it must be CORS enabled. -- `?setting=:` - Set the and lock the setting on load. You can set multiple settings by separating them with `&` e.g. `?setting=autoParkour:true&setting=renderDistance:4` + +General: +- `?setting=:` - Set and lock the setting on load. You can set multiple settings by separating them with `&` e.g. `?setting=autoParkour:true&setting=renderDistance:4` ### Notable Things that Power this Project diff --git a/src/react/AddServerOrConnect.tsx b/src/react/AddServerOrConnect.tsx index 729f1ec2..535e3ee9 100644 --- a/src/react/AddServerOrConnect.tsx +++ b/src/react/AddServerOrConnect.tsx @@ -30,19 +30,25 @@ const ELEMENTS_WIDTH = 190 export default ({ onBack, onConfirm, title = 'Add a Server', initialData, parseQs, onQsConnect, defaults, accounts, authenticatedAccounts }: Props) => { const qsParams = parseQs ? new URLSearchParams(window.location.search) : undefined + const qsParamName = qsParams?.get('name') + const qsParamIp = qsParams?.get('ip') + const qsParamVersion = qsParams?.get('version') + const qsParamProxy = qsParams?.get('proxy') + const qsParamUsername = qsParams?.get('username') + const qsParamLockConnect = qsParams?.get('lockConnect') - const [serverName, setServerName] = React.useState(initialData?.name ?? qsParams?.get('name') ?? '') + const qsIpParts = qsParamIp?.split(':') + const ipParts = initialData?.ip.split(':') - const ipWithoutPort = initialData?.ip.split(':')[0] - const port = initialData?.ip.split(':')[1] + const [serverName, setServerName] = React.useState(initialData?.name ?? qsParamName ?? '') + const [serverIp, setServerIp] = React.useState(ipParts?.[0] ?? qsIpParts?.[0] ?? '') + const [serverPort, setServerPort] = React.useState(ipParts?.[1] ?? qsIpParts?.[1] ?? '') + const [versionOverride, setVersionOverride] = React.useState(initialData?.versionOverride ?? /* legacy */ initialData?.['version'] ?? qsParamVersion ?? '') + const [proxyOverride, setProxyOverride] = React.useState(initialData?.proxyOverride ?? qsParamProxy ?? '') + const [usernameOverride, setUsernameOverride] = React.useState(initialData?.usernameOverride ?? qsParamUsername ?? '') + const lockConnect = qsParamLockConnect === 'true' - const [serverIp, setServerIp] = React.useState(ipWithoutPort ?? qsParams?.get('ip') ?? '') - const [serverPort, setServerPort] = React.useState(port ?? '') - const [versionOverride, setVersionOverride] = React.useState(initialData?.versionOverride ?? /* legacy */ initialData?.['version'] ?? qsParams?.get('version') ?? '') - const [proxyOverride, setProxyOverride] = React.useState(initialData?.proxyOverride ?? qsParams?.get('proxy') ?? '') - const [usernameOverride, setUsernameOverride] = React.useState(initialData?.usernameOverride ?? qsParams?.get('username') ?? '') const smallWidth = useIsSmallWidth() - const lockConnect = qsParams?.get('lockConnect') === 'true' const initialAccount = initialData?.authenticatedAccountOverride const [accountIndex, setAccountIndex] = React.useState(initialAccount === true ? -2 : initialAccount ? (accounts?.includes(initialAccount) ? accounts.indexOf(initialAccount) : -2) : -1) @@ -61,7 +67,7 @@ export default ({ onBack, onConfirm, title = 'Add a Server', initialData, parseQ authenticatedAccountOverride, } - return + return
-
- setServerName(value)} placeholder='Defaults to IP' /> -
- setServerIp(value)} /> - setServerPort(value)} placeholder='25565' /> + {!lockConnect && <> +
+ setServerName(value)} placeholder='Defaults to IP' /> +
+ } + setServerIp(value)} /> + setServerPort(value)} placeholder='25565' />
Overrides:
- setVersionOverride(value)} placeholder='Optional, but recommended to specify' /> - setProxyOverride(value)} placeholder={defaults?.proxyOverride} /> - setUsernameOverride(value)} placeholder={defaults?.usernameOverride} disabled={!noAccountSelected} /> + setVersionOverride(value)} placeholder='Optional, but recommended to specify' /> + setProxyOverride(value)} placeholder={defaults?.proxyOverride} /> + setUsernameOverride(value)} placeholder={defaults?.usernameOverride} />