UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

108 lines (105 loc) 20.9 kB
import { Chat, ChatType } from '../../chat/Chat.es.js'; import RespawnPacket, { RespawnState } from '../packet/RespawnPacket.es.js'; import SetSpawnPositionPacket, { SpawnType } from '../packet/SetSpawnPositionPacket.es.js'; import { getGametypeId } from '@jsprismarine/minecraft'; import ChatEvent from '../../events/chat/ChatEvent.es.js'; import PlayerSpawnEvent from '../../events/player/PlayerSpawnEvent.es.js'; import Identifiers from '../Identifiers.es.js'; import AvailableActorIdentifiersPacket from '../packet/AvailableActorIdentifiersPacket.es.js'; import BiomeDefinitionListPacket from '../packet/BiomeDefinitionListPacket.es.js'; import ItemComponentPacket from '../packet/ItemComponentPacket.es.js'; import ResourcePackStackPacket from '../packet/ResourcePackStackPacket.es.js'; import StartGamePacket from '../packet/StartGamePacket.es.js'; import PlayStatusType from '../type/PlayStatusType.es.js'; import ResourcePackStatusType from '../type/ResourcePackStatusType.es.js'; class ResourcePackResponseHandler { static NetID = Identifiers.ResourcePackResponsePacket; async handle(packet, server, session) { if (packet.status === ResourcePackStatusType.HaveAllPacks) { const resourcePackStack = new ResourcePackStackPacket(); resourcePackStack.texturePackRequired = false; resourcePackStack.experimentsAlreadyEnabled = false; await session.getConnection().sendDataPacket(resourcePackStack); } else if (packet.status === ResourcePackStatusType.Completed) { const player = session.getPlayer(); server.getLogger().info( `§b${player.getName()}§f is attempting to join with id §b${player.getUUID()}§f (§b${player.getRuntimeId()}§f) from ${player.getAddress().getAddress()}:${player.getAddress().getPort()}` ); const spawnEvent = new PlayerSpawnEvent(player); server.post(["playerSpawn", spawnEvent]); if (spawnEvent.isCancelled()) return; const world = player.getWorld(); await session.addToPlayerList(); await session.sendTime(world.getTicks()); const startGame = new StartGamePacket(); startGame.entityId = player.getRuntimeId(); startGame.runtimeEntityId = player.getRuntimeId(); startGame.gamemode = player.gamemode; startGame.defaultGamemode = getGametypeId(server.getConfig().getGamemode()); const worldSpawnPos = await world.getSpawnPosition(); startGame.worldSpawnPos = worldSpawnPos; startGame.playerPos = player.getPosition(); startGame.pitch = player.pitch; startGame.yaw = player.yaw; startGame.serverIdentifier = "JSPrismarine"; startGame.worldIdentifier = world.getName(); startGame.scenarioIdentifier = "JSPrismarine"; startGame.levelId = world.getUUID(); startGame.ticks = server.getTick(); startGame.time = world.getTicks(); startGame.worldName = world.getName(); startGame.seed = world.getSeed(); startGame.gamerules = world.getGameruleManager(); await session.getConnection().sendDataPacket(startGame); const itemComponent = new ItemComponentPacket(); await session.getConnection().sendDataPacket(itemComponent); const setSpawnPos = new SetSpawnPositionPacket(); setSpawnPos.dimension = 0; setSpawnPos.position = await world.getSpawnPosition(); setSpawnPos.blockPosition = setSpawnPos.position; setSpawnPos.type = SpawnType.PLAYER_SPAWN; await session.getConnection().sendDataPacket(setSpawnPos); await session.sendTime(world.getTicks()); await session.sendSettings(); await session.sendAvailableCommands(); await session.sendPlayerList(); await session.getConnection().sendDataPacket(new BiomeDefinitionListPacket()); await session.getConnection().sendDataPacket(new AvailableActorIdentifiersPacket()); await session.sendAttributes(); await session.sendMetadata(); await session.sendAbilities(); await session.sendCreativeContents(); const respawnPacket = new RespawnPacket(); respawnPacket.state = RespawnState.SERVER_SEARCHING_FOR_SPAWN; respawnPacket.position = player.getPosition(); respawnPacket.runtimeEntityId = player.getRuntimeId(); await session.getConnection().sendDataPacket(respawnPacket); respawnPacket.state = RespawnState.SERVER_READY_TO_SPAWN; await session.getConnection().sendDataPacket(respawnPacket); respawnPacket.state = RespawnState.CLIENT_READY_TO_SPAWN; await session.getConnection().sendDataPacket(respawnPacket); await session.getPlayer().sendSpawn(); await session.getPlayer().sendInitialSpawnChunks(); await session.sendPlayStatus(PlayStatusType.PlayerSpawn); await Promise.all([ server.getSessionManager().getAllPlayers().filter((p) => p !== player).map(async (p) => { await p.getNetworkSession().sendSpawn(player); await session.sendSpawn(p); }), player.getWorld().getEntities().filter((e) => !e.isPlayer()).map(async (entity) => entity.sendSpawn(player)) ]); const chatSpawnEvent = new ChatEvent( new Chat({ sender: server.getConsole(), message: `§e%multiplayer.player.joined`, parameters: [player.getName()], needsTranslation: true, type: ChatType.TRANSLATION }) ); await server.emit("chat", chatSpawnEvent); } } } export { ResourcePackResponseHandler as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzb3VyY2VQYWNrUmVzcG9uc2VIYW5kbGVyLmVzLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbmV0d29yay9oYW5kbGVyL1Jlc291cmNlUGFja1Jlc3BvbnNlSGFuZGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGF0LCBDaGF0VHlwZSB9IGZyb20gJy4uLy4uL2NoYXQvQ2hhdCc7XG5pbXBvcnQgUmVzcGF3blBhY2tldCwgeyBSZXNwYXduU3RhdGUgfSBmcm9tICcuLi9wYWNrZXQvUmVzcGF3blBhY2tldCc7XG5pbXBvcnQgU2V0U3Bhd25Qb3NpdGlvblBhY2tldCwgeyBTcGF3blR5cGUgfSBmcm9tICcuLi9wYWNrZXQvU2V0U3Bhd25Qb3NpdGlvblBhY2tldCc7XG5cbmltcG9ydCB7IGdldEdhbWV0eXBlSWQgfSBmcm9tICdAanNwcmlzbWFyaW5lL21pbmVjcmFmdCc7XG5pbXBvcnQgdHlwZSB7IFBsYXllclNlc3Npb24gfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4uLy4uL1NlcnZlcic7XG5pbXBvcnQgQ2hhdEV2ZW50IGZyb20gJy4uLy4uL2V2ZW50cy9jaGF0L0NoYXRFdmVudCc7XG5pbXBvcnQgUGxheWVyU3Bhd25FdmVudCBmcm9tICcuLi8uLi9ldmVudHMvcGxheWVyL1BsYXllclNwYXduRXZlbnQnO1xuaW1wb3J0IElkZW50aWZpZXJzIGZyb20gJy4uL0lkZW50aWZpZXJzJztcbmltcG9ydCBBdmFpbGFibGVBY3RvcklkZW50aWZpZXJzUGFja2V0IGZyb20gJy4uL3BhY2tldC9BdmFpbGFibGVBY3RvcklkZW50aWZpZXJzUGFja2V0JztcbmltcG9ydCBCaW9tZURlZmluaXRpb25MaXN0UGFja2V0IGZyb20gJy4uL3BhY2tldC9CaW9tZURlZmluaXRpb25MaXN0UGFja2V0JztcbmltcG9ydCBJdGVtQ29tcG9uZW50UGFja2V0IGZyb20gJy4uL3BhY2tldC9JdGVtQ29tcG9uZW50UGFja2V0JztcbmltcG9ydCB0eXBlIFJlc291cmNlUGFja1Jlc3BvbnNlUGFja2V0IGZyb20gJy4uL3BhY2tldC9SZXNvdXJjZVBhY2tSZXNwb25zZVBhY2tldCc7XG5pbXBvcnQgUmVzb3VyY2VQYWNrU3RhY2tQYWNrZXQgZnJvbSAnLi4vcGFja2V0L1Jlc291cmNlUGFja1N0YWNrUGFja2V0JztcbmltcG9ydCBTdGFydEdhbWVQYWNrZXQgZnJvbSAnLi4vcGFja2V0L1N0YXJ0R2FtZVBhY2tldCc7XG5pbXBvcnQgUGxheVN0YXR1c1R5cGUgZnJvbSAnLi4vdHlwZS9QbGF5U3RhdHVzVHlwZSc7XG5pbXBvcnQgUmVzb3VyY2VQYWNrU3RhdHVzVHlwZSBmcm9tICcuLi90eXBlL1Jlc291cmNlUGFja1N0YXR1c1R5cGUnO1xuaW1wb3J0IHR5cGUgUGFja2V0SGFuZGxlciBmcm9tICcuL1BhY2tldEhhbmRsZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNvdXJjZVBhY2tSZXNwb25zZUhhbmRsZXIgaW1wbGVtZW50cyBQYWNrZXRIYW5kbGVyPFJlc291cmNlUGFja1Jlc3BvbnNlUGFja2V0PiB7XG4gICAgcHVibGljIHN0YXRpYyBOZXRJRCA9IElkZW50aWZpZXJzLlJlc291cmNlUGFja1Jlc3BvbnNlUGFja2V0O1xuXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZShwYWNrZXQ6IFJlc291cmNlUGFja1Jlc3BvbnNlUGFja2V0LCBzZXJ2ZXI6IFNlcnZlciwgc2Vzc2lvbjogUGxheWVyU2Vzc2lvbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAocGFja2V0LnN0YXR1cyA9PT0gUmVzb3VyY2VQYWNrU3RhdHVzVHlwZS5IYXZlQWxsUGFja3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc291cmNlUGFja1N0YWNrID0gbmV3IFJlc291cmNlUGFja1N0YWNrUGFja2V0KCk7XG4gICAgICAgICAgICByZXNvdXJjZVBhY2tTdGFjay50ZXh0dXJlUGFja1JlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXNvdXJjZVBhY2tTdGFjay5leHBlcmltZW50c0FscmVhZHlFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChyZXNvdXJjZVBhY2tTdGFjayk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFja2V0LnN0YXR1cyA9PT0gUmVzb3VyY2VQYWNrU3RhdHVzVHlwZS5Db21wbGV0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IHNlc3Npb24uZ2V0UGxheWVyKCk7XG4gICAgICAgICAgICBzZXJ2ZXJcbiAgICAgICAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAgICAgICAuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYMKnYiR7cGxheWVyLmdldE5hbWUoKX3Cp2YgaXMgYXR0ZW1wdGluZyB0byBqb2luIHdpdGggaWQgwqdiJHtwbGF5ZXIuZ2V0VVVJRCgpfcKnZiAowqdiJHtwbGF5ZXIuZ2V0UnVudGltZUlkKCl9wqdmKSBmcm9tICR7cGxheWVyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWRkcmVzcygpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWRkcmVzcygpfToke3BsYXllci5nZXRBZGRyZXNzKCkuZ2V0UG9ydCgpfWBcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBFbWl0IHBsYXllclNwYXduIGV2ZW50XG4gICAgICAgICAgICBjb25zdCBzcGF3bkV2ZW50ID0gbmV3IFBsYXllclNwYXduRXZlbnQocGxheWVyKTtcbiAgICAgICAgICAgIHNlcnZlci5wb3N0KFsncGxheWVyU3Bhd24nLCBzcGF3bkV2ZW50XSk7XG4gICAgICAgICAgICBpZiAoc3Bhd25FdmVudC5pc0NhbmNlbGxlZCgpKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIFRPRE86IHNlbmQgaW52ZW50b3J5IHNsb3RzXG4gICAgICAgICAgICBjb25zdCB3b3JsZCA9IHBsYXllci5nZXRXb3JsZCgpO1xuXG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLmFkZFRvUGxheWVyTGlzdCgpO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kVGltZSh3b3JsZC5nZXRUaWNrcygpKTtcblxuICAgICAgICAgICAgY29uc3Qgc3RhcnRHYW1lID0gbmV3IFN0YXJ0R2FtZVBhY2tldCgpO1xuICAgICAgICAgICAgc3RhcnRHYW1lLmVudGl0eUlkID0gcGxheWVyLmdldFJ1bnRpbWVJZCgpO1xuICAgICAgICAgICAgc3RhcnRHYW1lLnJ1bnRpbWVFbnRpdHlJZCA9IHBsYXllci5nZXRSdW50aW1lSWQoKTtcbiAgICAgICAgICAgIHN0YXJ0R2FtZS5nYW1lbW9kZSA9IHBsYXllci5nYW1lbW9kZTtcbiAgICAgICAgICAgIHN0YXJ0R2FtZS5kZWZhdWx0R2FtZW1vZGUgPSBnZXRHYW1ldHlwZUlkKHNlcnZlci5nZXRDb25maWcoKS5nZXRHYW1lbW9kZSgpKTtcblxuICAgICAgICAgICAgY29uc3Qgd29ybGRTcGF3blBvcyA9IGF3YWl0IHdvcmxkLmdldFNwYXduUG9zaXRpb24oKTtcbiAgICAgICAgICAgIHN0YXJ0R2FtZS53b3JsZFNwYXduUG9zID0gd29ybGRTcGF3blBvcztcblxuICAgICAgICAgICAgc3RhcnRHYW1lLnBsYXllclBvcyA9IHBsYXllci5nZXRQb3NpdGlvbigpO1xuICAgICAgICAgICAgc3RhcnRHYW1lLnBpdGNoID0gcGxheWVyLnBpdGNoO1xuICAgICAgICAgICAgc3RhcnRHYW1lLnlhdyA9IHBsYXllci55YXc7XG5cbiAgICAgICAgICAgIHN0YXJ0R2FtZS5zZXJ2ZXJJZGVudGlmaWVyID0gJ0pTUHJpc21hcmluZSc7XG4gICAgICAgICAgICBzdGFydEdhbWUud29ybGRJZGVudGlmaWVyID0gd29ybGQuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgc3RhcnRHYW1lLnNjZW5hcmlvSWRlbnRpZmllciA9ICdKU1ByaXNtYXJpbmUnO1xuICAgICAgICAgICAgc3RhcnRHYW1lLmxldmVsSWQgPSB3b3JsZC5nZXRVVUlEKCk7XG4gICAgICAgICAgICBzdGFydEdhbWUudGlja3MgPSBzZXJ2ZXIuZ2V0VGljaygpO1xuICAgICAgICAgICAgc3RhcnRHYW1lLnRpbWUgPSB3b3JsZC5nZXRUaWNrcygpO1xuICAgICAgICAgICAgc3RhcnRHYW1lLndvcmxkTmFtZSA9IHdvcmxkLmdldE5hbWUoKTtcbiAgICAgICAgICAgIHN0YXJ0R2FtZS5zZWVkID0gd29ybGQuZ2V0U2VlZCgpO1xuICAgICAgICAgICAgc3RhcnRHYW1lLmdhbWVydWxlcyA9IHdvcmxkLmdldEdhbWVydWxlTWFuYWdlcigpO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQoc3RhcnRHYW1lKTtcblxuICAgICAgICAgICAgY29uc3QgaXRlbUNvbXBvbmVudCA9IG5ldyBJdGVtQ29tcG9uZW50UGFja2V0KCk7XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChpdGVtQ29tcG9uZW50KTtcblxuICAgICAgICAgICAgY29uc3Qgc2V0U3Bhd25Qb3MgPSBuZXcgU2V0U3Bhd25Qb3NpdGlvblBhY2tldCgpO1xuICAgICAgICAgICAgc2V0U3Bhd25Qb3MuZGltZW5zaW9uID0gMDsgLy8gVE9ETzogZW51bVxuICAgICAgICAgICAgc2V0U3Bhd25Qb3MucG9zaXRpb24gPSBhd2FpdCB3b3JsZC5nZXRTcGF3blBvc2l0aW9uKCk7XG4gICAgICAgICAgICBzZXRTcGF3blBvcy5ibG9ja1Bvc2l0aW9uID0gc2V0U3Bhd25Qb3MucG9zaXRpb247XG4gICAgICAgICAgICBzZXRTcGF3blBvcy50eXBlID0gU3Bhd25UeXBlLlBMQVlFUl9TUEFXTjtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KHNldFNwYXduUG9zKTtcblxuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kVGltZSh3b3JsZC5nZXRUaWNrcygpKTtcblxuICAgICAgICAgICAgLy8gVE9ETzogc2V0IGRpZmZpY3VsdHkgcGFja2V0XG4gICAgICAgICAgICAvLyBUT0RPOiBzZXQgY29tbWFuZHMgZW5hYmxlZCBwYWNrZXRcblxuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kU2V0dGluZ3MoKTtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uc2VuZEF2YWlsYWJsZUNvbW1hbmRzKCk7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IGdhbWUgcnVsZXMgY2hhbmdlZCBwYWNrZXRcblxuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kUGxheWVyTGlzdCgpO1xuXG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChuZXcgQmlvbWVEZWZpbml0aW9uTGlzdFBhY2tldCgpKTtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KG5ldyBBdmFpbGFibGVBY3RvcklkZW50aWZpZXJzUGFja2V0KCkpO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBwbGF5ZXIgZm9nIHBhY2tldFxuXG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmRBdHRyaWJ1dGVzKCk7XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmRNZXRhZGF0YSgpO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kQWJpbGl0aWVzKCk7XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmRDcmVhdGl2ZUNvbnRlbnRzKCk7XG5cbiAgICAgICAgICAgIC8vIFNvbWUgcGFja2V0cy4uLlxuXG4gICAgICAgICAgICAvLyBUT0RPOiBpbnZlbnRvcnkgY3JhZnRpbmcgZGF0YVxuXG4gICAgICAgICAgICAvLyBUT0RPOiBhdmFpbGFibGUgY29tbWFuZHNcblxuICAgICAgICAgICAgY29uc3QgcmVzcGF3blBhY2tldCA9IG5ldyBSZXNwYXduUGFja2V0KCk7XG4gICAgICAgICAgICByZXNwYXduUGFja2V0LnN0YXRlID0gUmVzcGF3blN0YXRlLlNFUlZFUl9TRUFSQ0hJTkdfRk9SX1NQQVdOO1xuICAgICAgICAgICAgcmVzcGF3blBhY2tldC5wb3NpdGlvbiA9IHBsYXllci5nZXRQb3NpdGlvbigpO1xuICAgICAgICAgICAgcmVzcGF3blBhY2tldC5ydW50aW1lRW50aXR5SWQgPSBwbGF5ZXIuZ2V0UnVudGltZUlkKCk7XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChyZXNwYXduUGFja2V0KTtcblxuICAgICAgICAgICAgcmVzcGF3blBhY2tldC5zdGF0ZSA9IFJlc3Bhd25TdGF0ZS5TRVJWRVJfUkVBRFlfVE9fU1BBV047XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChyZXNwYXduUGFja2V0KTtcbiAgICAgICAgICAgIHJlc3Bhd25QYWNrZXQuc3RhdGUgPSBSZXNwYXduU3RhdGUuQ0xJRU5UX1JFQURZX1RPX1NQQVdOO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQocmVzcGF3blBhY2tldCk7XG5cbiAgICAgICAgICAgIC8vIFNlbnQgdG8gbGV0IGtub3cgdGhlIGNsaWVudCBzYXZlZCBjaHVua3NcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uZ2V0UGxheWVyKCkuc2VuZFNwYXduKCk7XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLmdldFBsYXllcigpLnNlbmRJbml0aWFsU3Bhd25DaHVua3MoKTtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uc2VuZFBsYXlTdGF0dXMoUGxheVN0YXR1c1R5cGUuUGxheWVyU3Bhd24pO1xuXG4gICAgICAgICAgICAvLyBTdW1tb24gcGxheWVyKHMpICYgZW50aXRpZXNcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICBzZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgLmdldFNlc3Npb25NYW5hZ2VyKClcbiAgICAgICAgICAgICAgICAgICAgLmdldEFsbFBsYXllcnMoKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBwbGF5ZXIpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoYXN5bmMgKHApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHAuZ2V0TmV0d29ya1Nlc3Npb24oKS5zZW5kU3Bhd24ocGxheWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uc2VuZFNwYXduKHApO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBwbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgLmdldFdvcmxkKClcbiAgICAgICAgICAgICAgICAgICAgLmdldEVudGl0aWVzKClcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gIWUuaXNQbGF5ZXIoKSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2VuZFNwYXduKHBsYXllcikpXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgLy8gQW5ub3VuY2UgY29ubmVjdGlvblxuICAgICAgICAgICAgY29uc3QgY2hhdFNwYXduRXZlbnQgPSBuZXcgQ2hhdEV2ZW50KFxuICAgICAgICAgICAgICAgIG5ldyBDaGF0KHtcbiAgICAgICAgICAgICAgICAgICAgc2VuZGVyOiBzZXJ2ZXIuZ2V0Q29uc29sZSgpISxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYMKnZSVtdWx0aXBsYXllci5wbGF5ZXIuam9pbmVkYCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogW3BsYXllci5nZXROYW1lKCldLFxuICAgICAgICAgICAgICAgICAgICBuZWVkc1RyYW5zbGF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBDaGF0VHlwZS5UUkFOU0xBVElPTlxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgc2VydmVyLmVtaXQoJ2NoYXQnLCBjaGF0U3Bhd25FdmVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBLE1BQXFCLDJCQUFpRixDQUFBO0FBQUEsRUFDbEcsT0FBYyxRQUFRLFdBQVksQ0FBQSwwQkFBQTtBQUFBLEVBRWxDLE1BQWEsTUFBQSxDQUFPLE1BQW9DLEVBQUEsTUFBQSxFQUFnQixPQUF1QyxFQUFBO0FBQzNHLElBQUksSUFBQSxNQUFBLENBQU8sTUFBVyxLQUFBLHNCQUFBLENBQXVCLFlBQWMsRUFBQTtBQUN2RCxNQUFNLE1BQUEsaUJBQUEsR0FBb0IsSUFBSSx1QkFBd0IsRUFBQTtBQUN0RCxNQUFBLGlCQUFBLENBQWtCLG1CQUFzQixHQUFBLEtBQUE7QUFDeEMsTUFBQSxpQkFBQSxDQUFrQix5QkFBNEIsR0FBQSxLQUFBO0FBQzlDLE1BQUEsTUFBTSxPQUFRLENBQUEsYUFBQSxFQUFnQixDQUFBLGNBQUEsQ0FBZSxpQkFBaUIsQ0FBQTtBQUFBLEtBQ3ZELE1BQUEsSUFBQSxNQUFBLENBQU8sTUFBVyxLQUFBLHNCQUFBLENBQXVCLFNBQVcsRUFBQTtBQUMzRCxNQUFNLE1BQUEsTUFBQSxHQUFTLFFBQVEsU0FBVSxFQUFBO0FBQ2pDLE1BQUEsTUFBQSxDQUNLLFdBQ0EsQ0FBQSxJQUFBO0FBQUEsUUFDRyxDQUFBLEVBQUEsRUFBSyxPQUFPLE9BQVEsRUFBQyxzQ0FBc0MsTUFBTyxDQUFBLE9BQUEsRUFBUyxDQUFBLE1BQUEsRUFBUyxNQUFPLENBQUEsWUFBQSxFQUFjLENBQVksU0FBQSxFQUFBLE1BQUEsQ0FDaEgsVUFBVyxFQUFBLENBQ1gsVUFBVyxFQUFDLElBQUksTUFB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