UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

106 lines (105 loc) 19.7 kB
"use strict"; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } }); require("../../_virtual/_rolldown/runtime.cjs.cjs"); const require_events_chat_ChatEvent = require("../../events/chat/ChatEvent.cjs.cjs"); const require_network_Identifiers = require("../Identifiers.cjs.cjs"); const require_network_packet_AvailableActorIdentifiersPacket = require("../packet/AvailableActorIdentifiersPacket.cjs.cjs"); const require_network_packet_BiomeDefinitionListPacket = require("../packet/BiomeDefinitionListPacket.cjs.cjs"); const require_network_packet_ItemComponentPacket = require("../packet/ItemComponentPacket.cjs.cjs"); const require_network_packet_ResourcePackStackPacket = require("../packet/ResourcePackStackPacket.cjs.cjs"); const require_network_packet_StartGamePacket = require("../packet/StartGamePacket.cjs.cjs"); const require_chat_Chat = require("../../chat/Chat.cjs.cjs"); const require_events_player_PlayerSpawnEvent = require("../../events/player/PlayerSpawnEvent.cjs.cjs"); const require_network_type_PlayStatusType = require("../type/PlayStatusType.cjs.cjs"); const require_network_packet_RespawnPacket = require("../packet/RespawnPacket.cjs.cjs"); const require_network_packet_SetSpawnPositionPacket = require("../packet/SetSpawnPositionPacket.cjs.cjs"); const require_network_type_ResourcePackStatusType = require("../type/ResourcePackStatusType.cjs.cjs"); let _jsprismarine_minecraft = require("@jsprismarine/minecraft"); //#region src/network/handler/ResourcePackResponseHandler.ts var ResourcePackResponseHandler = class { static NetID = require_network_Identifiers.default.ResourcePackResponsePacket; async handle(packet, server, session) { if (packet.status === require_network_type_ResourcePackStatusType.default.HaveAllPacks) { const resourcePackStack = new require_network_packet_ResourcePackStackPacket.default(); resourcePackStack.texturePackRequired = false; resourcePackStack.experimentsAlreadyEnabled = false; await session.getConnection().sendDataPacket(resourcePackStack); } else if (packet.status === require_network_type_ResourcePackStatusType.default.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 require_events_player_PlayerSpawnEvent.default(player); server.post(["playerSpawn", spawnEvent]); if (spawnEvent.isCancelled()) return; const world = player.getWorld(); await session.addToPlayerList(); await session.sendTime(world.getTicks()); const startGame = new require_network_packet_StartGamePacket.default(); startGame.entityId = player.getRuntimeId(); startGame.runtimeEntityId = player.getRuntimeId(); startGame.gamemode = player.gamemode; startGame.defaultGamemode = (0, _jsprismarine_minecraft.getGametypeId)(server.getConfig().getGamemode()); startGame.worldSpawnPos = await world.getSpawnPosition(); 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 require_network_packet_ItemComponentPacket.default(); await session.getConnection().sendDataPacket(itemComponent); const setSpawnPos = new require_network_packet_SetSpawnPositionPacket.default(); setSpawnPos.dimension = 0; setSpawnPos.position = await world.getSpawnPosition(); setSpawnPos.blockPosition = setSpawnPos.position; setSpawnPos.type = require_network_packet_SetSpawnPositionPacket.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 require_network_packet_BiomeDefinitionListPacket.default()); await session.getConnection().sendDataPacket(new require_network_packet_AvailableActorIdentifiersPacket.default()); await session.sendAttributes(); await session.sendMetadata(); await session.sendAbilities(); await session.sendCreativeContents(); const respawnPacket = new require_network_packet_RespawnPacket.default(); respawnPacket.state = require_network_packet_RespawnPacket.RespawnState.SERVER_SEARCHING_FOR_SPAWN; respawnPacket.position = player.getPosition(); respawnPacket.runtimeEntityId = player.getRuntimeId(); await session.getConnection().sendDataPacket(respawnPacket); respawnPacket.state = require_network_packet_RespawnPacket.RespawnState.SERVER_READY_TO_SPAWN; await session.getConnection().sendDataPacket(respawnPacket); respawnPacket.state = require_network_packet_RespawnPacket.RespawnState.CLIENT_READY_TO_SPAWN; await session.getConnection().sendDataPacket(respawnPacket); await session.getPlayer().sendSpawn(); await session.getPlayer().sendInitialSpawnChunks(); await session.sendPlayStatus(require_network_type_PlayStatusType.default.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 require_events_chat_ChatEvent.default(new require_chat_Chat.Chat({ sender: server.getConsole(), message: `§e%multiplayer.player.joined`, parameters: [player.getName()], needsTranslation: true, type: require_chat_Chat.ChatType.TRANSLATION })); await server.emit("chat", chatSpawnEvent); } } }; //#endregion exports.default = ResourcePackResponseHandler; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzb3VyY2VQYWNrUmVzcG9uc2VIYW5kbGVyLmNqcy5janMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25ldHdvcmsvaGFuZGxlci9SZXNvdXJjZVBhY2tSZXNwb25zZUhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhdCwgQ2hhdFR5cGUgfSBmcm9tICcuLi8uLi9jaGF0L0NoYXQnO1xuaW1wb3J0IFJlc3Bhd25QYWNrZXQsIHsgUmVzcGF3blN0YXRlIH0gZnJvbSAnLi4vcGFja2V0L1Jlc3Bhd25QYWNrZXQnO1xuaW1wb3J0IFNldFNwYXduUG9zaXRpb25QYWNrZXQsIHsgU3Bhd25UeXBlIH0gZnJvbSAnLi4vcGFja2V0L1NldFNwYXduUG9zaXRpb25QYWNrZXQnO1xuXG5pbXBvcnQgeyBnZXRHYW1ldHlwZUlkIH0gZnJvbSAnQGpzcHJpc21hcmluZS9taW5lY3JhZnQnO1xuaW1wb3J0IHR5cGUgeyBQbGF5ZXJTZXNzaW9uIH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuLi8uLi9TZXJ2ZXInO1xuaW1wb3J0IENoYXRFdmVudCBmcm9tICcuLi8uLi9ldmVudHMvY2hhdC9DaGF0RXZlbnQnO1xuaW1wb3J0IFBsYXllclNwYXduRXZlbnQgZnJvbSAnLi4vLi4vZXZlbnRzL3BsYXllci9QbGF5ZXJTcGF3bkV2ZW50JztcbmltcG9ydCBJZGVudGlmaWVycyBmcm9tICcuLi9JZGVudGlmaWVycyc7XG5pbXBvcnQgQXZhaWxhYmxlQWN0b3JJZGVudGlmaWVyc1BhY2tldCBmcm9tICcuLi9wYWNrZXQvQXZhaWxhYmxlQWN0b3JJZGVudGlmaWVyc1BhY2tldCc7XG5pbXBvcnQgQmlvbWVEZWZpbml0aW9uTGlzdFBhY2tldCBmcm9tICcuLi9wYWNrZXQvQmlvbWVEZWZpbml0aW9uTGlzdFBhY2tldCc7XG5pbXBvcnQgSXRlbUNvbXBvbmVudFBhY2tldCBmcm9tICcuLi9wYWNrZXQvSXRlbUNvbXBvbmVudFBhY2tldCc7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZVBhY2tSZXNwb25zZVBhY2tldCBmcm9tICcuLi9wYWNrZXQvUmVzb3VyY2VQYWNrUmVzcG9uc2VQYWNrZXQnO1xuaW1wb3J0IFJlc291cmNlUGFja1N0YWNrUGFja2V0IGZyb20gJy4uL3BhY2tldC9SZXNvdXJjZVBhY2tTdGFja1BhY2tldCc7XG5pbXBvcnQgU3RhcnRHYW1lUGFja2V0IGZyb20gJy4uL3BhY2tldC9TdGFydEdhbWVQYWNrZXQnO1xuaW1wb3J0IFBsYXlTdGF0dXNUeXBlIGZyb20gJy4uL3R5cGUvUGxheVN0YXR1c1R5cGUnO1xuaW1wb3J0IFJlc291cmNlUGFja1N0YXR1c1R5cGUgZnJvbSAnLi4vdHlwZS9SZXNvdXJjZVBhY2tTdGF0dXNUeXBlJztcbmltcG9ydCB0eXBlIFBhY2tldEhhbmRsZXIgZnJvbSAnLi9QYWNrZXRIYW5kbGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVzb3VyY2VQYWNrUmVzcG9uc2VIYW5kbGVyIGltcGxlbWVudHMgUGFja2V0SGFuZGxlcjxSZXNvdXJjZVBhY2tSZXNwb25zZVBhY2tldD4ge1xuICAgIHB1YmxpYyBzdGF0aWMgTmV0SUQgPSBJZGVudGlmaWVycy5SZXNvdXJjZVBhY2tSZXNwb25zZVBhY2tldDtcblxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGUocGFja2V0OiBSZXNvdXJjZVBhY2tSZXNwb25zZVBhY2tldCwgc2VydmVyOiBTZXJ2ZXIsIHNlc3Npb246IFBsYXllclNlc3Npb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHBhY2tldC5zdGF0dXMgPT09IFJlc291cmNlUGFja1N0YXR1c1R5cGUuSGF2ZUFsbFBhY2tzKSB7XG4gICAgICAgICAgICBjb25zdCByZXNvdXJjZVBhY2tTdGFjayA9IG5ldyBSZXNvdXJjZVBhY2tTdGFja1BhY2tldCgpO1xuICAgICAgICAgICAgcmVzb3VyY2VQYWNrU3RhY2sudGV4dHVyZVBhY2tSZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzb3VyY2VQYWNrU3RhY2suZXhwZXJpbWVudHNBbHJlYWR5RW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQocmVzb3VyY2VQYWNrU3RhY2spO1xuICAgICAgICB9IGVsc2UgaWYgKHBhY2tldC5zdGF0dXMgPT09IFJlc291cmNlUGFja1N0YXR1c1R5cGUuQ29tcGxldGVkKSB7XG4gICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSBzZXNzaW9uLmdldFBsYXllcigpO1xuICAgICAgICAgICAgc2VydmVyXG4gICAgICAgICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgICAgICAgLmluZm8oXG4gICAgICAgICAgICAgICAgICAgIGDCp2Ike3BsYXllci5nZXROYW1lKCl9wqdmIGlzIGF0dGVtcHRpbmcgdG8gam9pbiB3aXRoIGlkIMKnYiR7cGxheWVyLmdldFVVSUQoKX3Cp2YgKMKnYiR7cGxheWVyLmdldFJ1bnRpbWVJZCgpfcKnZikgZnJvbSAke3BsYXllclxuICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFkZHJlc3MoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFkZHJlc3MoKX06JHtwbGF5ZXIuZ2V0QWRkcmVzcygpLmdldFBvcnQoKX1gXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gRW1pdCBwbGF5ZXJTcGF3biBldmVudFxuICAgICAgICAgICAgY29uc3Qgc3Bhd25FdmVudCA9IG5ldyBQbGF5ZXJTcGF3bkV2ZW50KHBsYXllcik7XG4gICAgICAgICAgICBzZXJ2ZXIucG9zdChbJ3BsYXllclNwYXduJywgc3Bhd25FdmVudF0pO1xuICAgICAgICAgICAgaWYgKHNwYXduRXZlbnQuaXNDYW5jZWxsZWQoKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBzZW5kIGludmVudG9yeSBzbG90c1xuICAgICAgICAgICAgY29uc3Qgd29ybGQgPSBwbGF5ZXIuZ2V0V29ybGQoKTtcblxuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5hZGRUb1BsYXllckxpc3QoKTtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uc2VuZFRpbWUod29ybGQuZ2V0VGlja3MoKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0R2FtZSA9IG5ldyBTdGFydEdhbWVQYWNrZXQoKTtcbiAgICAgICAgICAgIHN0YXJ0R2FtZS5lbnRpdHlJZCA9IHBsYXllci5nZXRSdW50aW1lSWQoKTtcbiAgICAgICAgICAgIHN0YXJ0R2FtZS5ydW50aW1lRW50aXR5SWQgPSBwbGF5ZXIuZ2V0UnVudGltZUlkKCk7XG4gICAgICAgICAgICBzdGFydEdhbWUuZ2FtZW1vZGUgPSBwbGF5ZXIuZ2FtZW1vZGU7XG4gICAgICAgICAgICBzdGFydEdhbWUuZGVmYXVsdEdhbWVtb2RlID0gZ2V0R2FtZXR5cGVJZChzZXJ2ZXIuZ2V0Q29uZmlnKCkuZ2V0R2FtZW1vZGUoKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHdvcmxkU3Bhd25Qb3MgPSBhd2FpdCB3b3JsZC5nZXRTcGF3blBvc2l0aW9uKCk7XG4gICAgICAgICAgICBzdGFydEdhbWUud29ybGRTcGF3blBvcyA9IHdvcmxkU3Bhd25Qb3M7XG5cbiAgICAgICAgICAgIHN0YXJ0R2FtZS5wbGF5ZXJQb3MgPSBwbGF5ZXIuZ2V0UG9zaXRpb24oKTtcbiAgICAgICAgICAgIHN0YXJ0R2FtZS5waXRjaCA9IHBsYXllci5waXRjaDtcbiAgICAgICAgICAgIHN0YXJ0R2FtZS55YXcgPSBwbGF5ZXIueWF3O1xuXG4gICAgICAgICAgICBzdGFydEdhbWUuc2VydmVySWRlbnRpZmllciA9ICdKU1ByaXNtYXJpbmUnO1xuICAgICAgICAgICAgc3RhcnRHYW1lLndvcmxkSWRlbnRpZmllciA9IHdvcmxkLmdldE5hbWUoKTtcbiAgICAgICAgICAgIHN0YXJ0R2FtZS5zY2VuYXJpb0lkZW50aWZpZXIgPSAnSlNQcmlzbWFyaW5lJztcbiAgICAgICAgICAgIHN0YXJ0R2FtZS5sZXZlbElkID0gd29ybGQuZ2V0VVVJRCgpO1xuICAgICAgICAgICAgc3RhcnRHYW1lLnRpY2tzID0gc2VydmVyLmdldFRpY2soKTtcbiAgICAgICAgICAgIHN0YXJ0R2FtZS50aW1lID0gd29ybGQuZ2V0VGlja3MoKTtcbiAgICAgICAgICAgIHN0YXJ0R2FtZS53b3JsZE5hbWUgPSB3b3JsZC5nZXROYW1lKCk7XG4gICAgICAgICAgICBzdGFydEdhbWUuc2VlZCA9IHdvcmxkLmdldFNlZWQoKTtcbiAgICAgICAgICAgIHN0YXJ0R2FtZS5nYW1lcnVsZXMgPSB3b3JsZC5nZXRHYW1lcnVsZU1hbmFnZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KHN0YXJ0R2FtZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db21wb25lbnQgPSBuZXcgSXRlbUNvbXBvbmVudFBhY2tldCgpO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQoaXRlbUNvbXBvbmVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNldFNwYXduUG9zID0gbmV3IFNldFNwYXduUG9zaXRpb25QYWNrZXQoKTtcbiAgICAgICAgICAgIHNldFNwYXduUG9zLmRpbWVuc2lvbiA9IDA7IC8vIFRPRE86IGVudW1cbiAgICAgICAgICAgIHNldFNwYXduUG9zLnBvc2l0aW9uID0gYXdhaXQgd29ybGQuZ2V0U3Bhd25Qb3NpdGlvbigpO1xuICAgICAgICAgICAgc2V0U3Bhd25Qb3MuYmxvY2tQb3NpdGlvbiA9IHNldFNwYXduUG9zLnBvc2l0aW9uO1xuICAgICAgICAgICAgc2V0U3Bhd25Qb3MudHlwZSA9IFNwYXduVHlwZS5QTEFZRVJfU1BBV047XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChzZXRTcGF3blBvcyk7XG5cbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uc2VuZFRpbWUod29ybGQuZ2V0VGlja3MoKSk7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IHNldCBkaWZmaWN1bHR5IHBhY2tldFxuICAgICAgICAgICAgLy8gVE9ETzogc2V0IGNvbW1hbmRzIGVuYWJsZWQgcGFja2V0XG5cbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uc2VuZFNldHRpbmdzKCk7XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmRBdmFpbGFibGVDb21tYW5kcygpO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBnYW1lIHJ1bGVzIGNoYW5nZWQgcGFja2V0XG5cbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uc2VuZFBsYXllckxpc3QoKTtcblxuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQobmV3IEJpb21lRGVmaW5pdGlvbkxpc3RQYWNrZXQoKSk7XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLmdldENvbm5lY3Rpb24oKS5zZW5kRGF0YVBhY2tldChuZXcgQXZhaWxhYmxlQWN0b3JJZGVudGlmaWVyc1BhY2tldCgpKTtcblxuICAgICAgICAgICAgLy8gVE9ETzogcGxheWVyIGZvZyBwYWNrZXRcblxuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kQXR0cmlidXRlcygpO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kTWV0YWRhdGEoKTtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uc2VuZEFiaWxpdGllcygpO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kQ3JlYXRpdmVDb250ZW50cygpO1xuXG4gICAgICAgICAgICAvLyBTb21lIHBhY2tldHMuLi5cblxuICAgICAgICAgICAgLy8gVE9ETzogaW52ZW50b3J5IGNyYWZ0aW5nIGRhdGFcblxuICAgICAgICAgICAgLy8gVE9ETzogYXZhaWxhYmxlIGNvbW1hbmRzXG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3Bhd25QYWNrZXQgPSBuZXcgUmVzcGF3blBhY2tldCgpO1xuICAgICAgICAgICAgcmVzcGF3blBhY2tldC5zdGF0ZSA9IFJlc3Bhd25TdGF0ZS5TRVJWRVJfU0VBUkNISU5HX0ZPUl9TUEFXTjtcbiAgICAgICAgICAgIHJlc3Bhd25QYWNrZXQucG9zaXRpb24gPSBwbGF5ZXIuZ2V0UG9zaXRpb24oKTtcbiAgICAgICAgICAgIHJlc3Bhd25QYWNrZXQucnVudGltZUVudGl0eUlkID0gcGxheWVyLmdldFJ1bnRpbWVJZCgpO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQocmVzcGF3blBhY2tldCk7XG5cbiAgICAgICAgICAgIHJlc3Bhd25QYWNrZXQuc3RhdGUgPSBSZXNwYXduU3RhdGUuU0VSVkVSX1JFQURZX1RPX1NQQVdOO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQocmVzcGF3blBhY2tldCk7XG4gICAgICAgICAgICByZXNwYXduUGFja2V0LnN0YXRlID0gUmVzcGF3blN0YXRlLkNMSUVOVF9SRUFEWV9UT19TUEFXTjtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uZ2V0Q29ubmVjdGlvbigpLnNlbmREYXRhUGFja2V0KHJlc3Bhd25QYWNrZXQpO1xuXG4gICAgICAgICAgICAvLyBTZW50IHRvIGxldCBrbm93IHRoZSBjbGllbnQgc2F2ZWQgY2h1bmtzXG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLmdldFBsYXllcigpLnNlbmRTcGF3bigpO1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5nZXRQbGF5ZXIoKS5zZW5kSW5pdGlhbFNwYXduQ2h1bmtzKCk7XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmRQbGF5U3RhdHVzKFBsYXlTdGF0dXNUeXBlLlBsYXllclNwYXduKTtcblxuICAgICAgICAgICAgLy8gU3VtbW9uIHBsYXllcihzKSAmIGVudGl0aWVzXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgc2VydmVyXG4gICAgICAgICAgICAgICAgICAgIC5nZXRTZXNzaW9uTWFuYWdlcigpXG4gICAgICAgICAgICAgICAgICAgIC5nZXRBbGxQbGF5ZXJzKClcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gcGxheWVyKVxuICAgICAgICAgICAgICAgICAgICAubWFwKGFzeW5jIChwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwLmdldE5ldHdvcmtTZXNzaW9uKCkuc2VuZFNwYXduKHBsYXllcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmRTcGF3bihwKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgcGxheWVyXG4gICAgICAgICAgICAgICAgICAgIC5nZXRXb3JsZCgpXG4gICAgICAgICAgICAgICAgICAgIC5nZXRFbnRpdGllcygpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+ICFlLmlzUGxheWVyKCkpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoYXN5bmMgKGVudGl0eSkgPT4gZW50aXR5LnNlbmRTcGF3bihwbGF5ZXIpKVxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIC8vIEFubm91bmNlIGNvbm5lY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGNoYXRTcGF3bkV2ZW50ID0gbmV3IENoYXRFdmVudChcbiAgICAgICAgICAgICAgICBuZXcgQ2hhdCh7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRlcjogc2VydmVyLmdldENvbnNvbGUoKSEsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2UlbXVsdGlwbGF5ZXIucGxheWVyLmpvaW5lZGAsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtwbGF5ZXIuZ2V0TmFtZSgpXSxcbiAgICAgICAgICAgICAgICAgICAgbmVlZHNUcmFuc2xhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogQ2hhdFR5cGUuVFJBTlNMQVRJT05cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHNlcnZlci5lbWl0KCdjaGF0JywgY2hhdFNwYXduRXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsSUFBcUIsOEJBQXJCLE1BQXNHO0NBQ2xHLE9BQWMsUUFBUSw0QkFBQSxRQUFZO0NBRWxDLE1BQWEsT0FBTyxRQUFvQyxRQUFnQixTQUF1QztFQUMzRyxJQUFJLE9BQU8sV0FBVyw0Q0FBQSxRQUF1QixjQUFjO0dBQ3ZELE1BQU0sb0JBQW9CLElBQUksK0NBQUEsUUFBd0I7R0FDdEQsa0JBQWtCLHNCQUFzQjtHQUN4QyxrQkFBa0IsNEJBQTRCO0dBQzlDLE1BQU0sUUFBUSxjQUFjLEVBQUUsZUFBZSxpQkFBaUI7RUFDbEUsT0FBTyxJQUFJLE9BQU8sV0FBVyw0Q0FBQSxRQUF1QixXQUFXO0dBQzNELE1BQU0sU0FBUyxRQUFRLFVBQVU7R0FDakMsT0FDSyxVQUFVLEVBQ1YsS0FDRyxLQUFLLE9BQU8sUUFBUSxFQUFFLHFDQUFxQyxPQUFPLFFBQVEsRUFBRSxRQUFRLE9BQU8sYUFBYSxFQUFFLFdBQVcsT0FDaEgsV0FBVyxFQUNYLFdBQVcsRUFBRSxHQUFHLE9BQU8sV0FBVyxFQUFFLFFBQVEsR0FDckQ7R0FHSixNQUFNLGFBQWEsSUFBSSx1Q0FBQSxRQUFpQixNQUFNO0dBQzlDLE9BQU8sS0FBSyxDQUFDLGVBQWUsVUFBVSxDQUFDO0dBQ3ZDLElBQUksV0FBVyxZQUFZLEdBQUc7R0FHOUIsTUFBTSxRQUFRLE9BQU8sU0FBUztHQUU5QixNQUFNLFFBQVEsZ0JBQWdCO0dBQzlCLE1BQU0sUUFBUSxTQUFTLE1BQU0sU0FBUyxDQUFDO0dBRXZDLE1BQU0sWUFBWSxJQUFJ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