UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

154 lines (149 loc) • 22.2 kB
'use strict'; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } }); const minecraft = require('@jsprismarine/minecraft'); const block_BlockMappings = require('../../block/BlockMappings.cjs.cjs'); const network_Identifiers = require('../Identifiers.cjs.cjs'); require('../packet/ActorFallPacket.cjs.cjs'); require('../packet/AddActorPacket.cjs.cjs'); require('../packet/AddItemActorPacket.cjs.cjs'); require('../packet/AddPlayerPacket.cjs.cjs'); require('../packet/AnimatePacket.cjs.cjs'); require('../packet/AvailableActorIdentifiersPacket.cjs.cjs'); require('../packet/AvailableCommandsPacket.cjs.cjs'); require('@jsprismarine/jsbinaryutils'); require('zlib'); require('../CompressionProvider.cjs.cjs'); require('../packet/NetworkSettingsPacket.cjs.cjs'); require('../packet/BiomeDefinitionListPacket.cjs.cjs'); require('../packet/ChangeDimensionPacket.cjs.cjs'); require('../packet/ChunkRadiusUpdatedPacket.cjs.cjs'); require('../packet/CommandRequestPacket.cjs.cjs'); require('../packet/ContainerClosePacket.cjs.cjs'); require('../packet/ContainerOpenPacket.cjs.cjs'); require('../packet/CreativeContentPacket.cjs.cjs'); require('../packet/DisconnectPacket.cjs.cjs'); require('../packet/EmoteListPacket.cjs.cjs'); require('../packet/InteractPacket.cjs.cjs'); require('../packet/InventoryContentPacket.cjs.cjs'); const network_packet_InventoryTransactionPacket = require('../packet/InventoryTransactionPacket.cjs.cjs'); require('../packet/ItemComponentPacket.cjs.cjs'); require('../packet/ItemStackRequestPacket.cjs.cjs'); require('../packet/ItemStackResponsePacket.cjs.cjs'); require('../packet/LevelChunkPacket.cjs.cjs'); const network_packet_LevelSoundEventPacket = require('../packet/LevelSoundEventPacket.cjs.cjs'); require('../packet/LoginPacket.cjs.cjs'); require('../packet/MobEquipmentPacket.cjs.cjs'); require('../packet/MoveActorAbsolutePacket.cjs.cjs'); require('../packet/MovePlayerPacket.cjs.cjs'); require('../packet/NetworkChunkPublisherUpdatePacket.cjs.cjs'); require('../packet/OnScreenTextureAnimationPacket.cjs.cjs'); require('../packet/PacketViolationWarningPacket.cjs.cjs'); require('../packet/PlaySoundPacket.cjs.cjs'); require('../packet/PlayStatusPacket.cjs.cjs'); require('../packet/PlayerActionPacket.cjs.cjs'); require('../packet/PlayerListPacket.cjs.cjs'); require('../packet/PlayerSkinPacket.cjs.cjs'); require('../packet/RemoveActorPacket.cjs.cjs'); require('../packet/RequestChunkRadiusPacket.cjs.cjs'); require('../packet/RequestNetworkSettingsPacket.cjs.cjs'); require('../packet/ResourcePackResponsePacket.cjs.cjs'); require('../packet/ResourcePackStackPacket.cjs.cjs'); require('../packet/ResourcePacksInfoPacket.cjs.cjs'); require('../packet/ServerSettingsRequestPacket.cjs.cjs'); require('../packet/SetActorDataPacket.cjs.cjs'); require('../packet/SetDefaultGametypePacket.cjs.cjs'); require('../packet/SetHealthPacket.cjs.cjs'); require('../packet/SetLocalPlayerAsInitializedPacket.cjs.cjs'); require('../packet/SetPlayerGametypePacket.cjs.cjs'); require('../packet/SetTimePacket.cjs.cjs'); require('../packet/ShowProfilePacket.cjs.cjs'); require('../packet/StartGamePacket.cjs.cjs'); require('../packet/TextPacket.cjs.cjs'); require('../packet/TickSyncPacket.cjs.cjs'); require('../packet/TransferPacket.cjs.cjs'); require('../packet/UpdateAdventureSettingsPacket.cjs.cjs'); require('../packet/UpdateAttributesPacket.cjs.cjs'); const network_packet_UpdateBlockPacket = require('../packet/UpdateBlockPacket.cjs.cjs'); require('../packet/WorldEventPacket.cjs.cjs'); class InventoryTransactionHandler { static NetID = network_Identifiers.default.InventoryTransactionPacket; async handle(packet, server, connection) { const player = connection.getPlayer(); if (!player.isOnline()) return; if (player.gamemode === minecraft.Gametype.SPECTATOR) return; switch (packet.transactionType) { case network_packet_InventoryTransactionPacket.TransactionType.NORMAL: { packet.inventoryActions.forEach(async (action) => { switch (action.sourceType) { case 0: { break; } default: server.getLogger().debug(`Unknown source type: ${action.sourceType}`); } }); break; } case network_packet_InventoryTransactionPacket.TransactionType.USE_ITEM: { const useItemData = packet.transactionData; switch (useItemData.actionType) { case network_packet_InventoryTransactionPacket.UseItemAction.CLICK_BLOCK: await player.getWorld().useItemOn( server.getBlockManager().getBlockByIdAndMeta(useItemData.itemInHand.getId(), useItemData.itemInHand.meta), useItemData.blockPosition, useItemData.blockFace, useItemData.clickPosition, player ); break; case network_packet_InventoryTransactionPacket.UseItemAction.CLICK_AIR: break; case network_packet_InventoryTransactionPacket.UseItemAction.BREAK_BLOCK: { const chunk = await player.getWorld().getChunkAt(useItemData.blockPosition); const blockId = chunk.getBlock(useItemData.blockPosition); const block = server.getBlockManager().getBlockByIdAndMeta(blockId.id, blockId.meta); if (!block) return; const pk = new network_packet_UpdateBlockPacket.default(); pk.x = useItemData.blockPosition.getX(); pk.y = useItemData.blockPosition.getY(); pk.z = useItemData.blockPosition.getZ(); pk.blockRuntimeId = block_BlockMappings.BlockMappings.getRuntimeId("minecraft:air"); await Promise.all( server.getSessionManager().getAllPlayers().filter((p) => p.getWorld().getUUID() === player.getWorld().getUUID()).map(async (player2) => player2.getNetworkSession().getConnection().sendDataPacket(pk)) ); const chunkPos = useItemData.blockPosition; chunk.setBlock( chunkPos.getX(), chunkPos.getY(), chunkPos.getZ(), server.getBlockManager().getBlock("minecraft:air") ); const soundPk = new network_packet_LevelSoundEventPacket.default(); soundPk.sound = 5; soundPk.positionX = player.getX(); soundPk.positionY = player.getY(); soundPk.positionZ = player.getZ(); soundPk.extraData = block_BlockMappings.BlockMappings.getRuntimeId(block.getName()); soundPk.entityType = ":"; soundPk.isBabyMob = false; soundPk.disableRelativeVolume = false; await Promise.all( player.getWorld().getPlayers().map((target) => target.getNetworkSession().send(soundPk)) ); break; } default: { server.getLogger().debug(`Unknown action type: ${useItemData.actionType}`); } } break; } default: { server.getLogger().verbose(`Unknown type: ${packet.transactionType}`); throw new Error("Invalid InventoryTransactionType"); } } } } exports.default = InventoryTransactionHandler; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW52ZW50b3J5VHJhbnNhY3Rpb25IYW5kbGVyLmNqcy5janMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9uZXR3b3JrL2hhbmRsZXIvSW52ZW50b3J5VHJhbnNhY3Rpb25IYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdhbWV0eXBlIH0gZnJvbSAnQGpzcHJpc21hcmluZS9taW5lY3JhZnQnO1xuaW1wb3J0IHR5cGUgeyBQbGF5ZXJTZXNzaW9uIH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuLi8uLi9TZXJ2ZXInO1xuaW1wb3J0IHsgQmxvY2tNYXBwaW5ncyB9IGZyb20gJy4uLy4uL2Jsb2NrL0Jsb2NrTWFwcGluZ3MnO1xuaW1wb3J0IElkZW50aWZpZXJzIGZyb20gJy4uL0lkZW50aWZpZXJzJztcbmltcG9ydCB0eXBlIHsgSW52ZW50b3J5VHJhbnNhY3Rpb25QYWNrZXQgfSBmcm9tICcuLi9QYWNrZXRzJztcbmltcG9ydCB7IExldmVsU291bmRFdmVudFBhY2tldCwgVXBkYXRlQmxvY2tQYWNrZXQgfSBmcm9tICcuLi9QYWNrZXRzJztcbmltcG9ydCB0eXBlIHsgVXNlSXRlbURhdGEgfSBmcm9tICcuLi9wYWNrZXQvSW52ZW50b3J5VHJhbnNhY3Rpb25QYWNrZXQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlLCBVc2VJdGVtQWN0aW9uIH0gZnJvbSAnLi4vcGFja2V0L0ludmVudG9yeVRyYW5zYWN0aW9uUGFja2V0JztcbmltcG9ydCB0eXBlIFBhY2tldEhhbmRsZXIgZnJvbSAnLi9QYWNrZXRIYW5kbGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW52ZW50b3J5VHJhbnNhY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgUGFja2V0SGFuZGxlcjxJbnZlbnRvcnlUcmFuc2FjdGlvblBhY2tldD4ge1xuICAgIHB1YmxpYyBzdGF0aWMgTmV0SUQgPSBJZGVudGlmaWVycy5JbnZlbnRvcnlUcmFuc2FjdGlvblBhY2tldDtcblxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGUocGFja2V0OiBJbnZlbnRvcnlUcmFuc2FjdGlvblBhY2tldCwgc2VydmVyOiBTZXJ2ZXIsIGNvbm5lY3Rpb246IFBsYXllclNlc3Npb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcGxheWVyID0gY29ubmVjdGlvbi5nZXRQbGF5ZXIoKTtcbiAgICAgICAgaWYgKCFwbGF5ZXIuaXNPbmxpbmUoKSkgcmV0dXJuO1xuICAgICAgICBpZiAocGxheWVyLmdhbWVtb2RlID09PSBHYW1ldHlwZS5TUEVDVEFUT1IpIHJldHVybjsgLy8gU3BlY3RhdG9ycyBzaG91bGRuJ3QgYmUgYWJsZSB0byBpbnRlcmFjdCB3aXRoIHRoZSB3b3JsZC5cblxuICAgICAgICBzd2l0Y2ggKHBhY2tldC50cmFuc2FjdGlvblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLk5PUk1BTDoge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlZmFjdG9yIHRoaXMgY3JhcC5cbiAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSBiYXNlIGl0IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9wbW1wL1BvY2tldE1pbmUtTVAvYmxvYi9kMTlkYjVkMmU0NGQwOTI1Nzk4YzI4ODI0N2MzYmRkYjcxZDIzOTc1L3NyYy9wb2NrZXRtaW5lL1BsYXllci5waHAjTDIzOTkgb3Igc29tZXRoaW5nIHNpbWlsYXIuXG4gICAgICAgICAgICAgICAgLy8gbGV0IG1vdmVkSXRlbTogQ29udGFpbmVyRW50cnkgfCBudWxsO1xuICAgICAgICAgICAgICAgIHBhY2tldC5pbnZlbnRvcnlBY3Rpb25zLmZvckVhY2goYXN5bmMgKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbi5zb3VyY2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogSGFjayBmb3IgY3JlYXRpdmUgaW52ZW50b3J5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppZiAoYWN0aW9uLndpbmRvd0lkID09PSAxMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBjcmVhdGl2ZSBpbnZlbnRvcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllci5nYW1lbW9kZSAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKGBQbGF5ZXIgaXNuJ3QgaW4gY3JlYXRpdmUgbW9kZWApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGlkID0gYWN0aW9uLm9sZEl0ZW0uZ2V0SWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgbWV0YSA9IGFjdGlvbi5vbGRJdGVtLm1ldGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgaXRlbSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNlcnZlci5nZXRJdGVtTWFuYWdlcigpLmdldEl0ZW1CeUlkKGlkKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzZXJ2ZXIuZ2V0QmxvY2tNYW5hZ2VyKCkuZ2V0QmxvY2tCeUlkQW5kTWV0YShpZCwgbWV0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGNvdW50ID0gNjQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZWRJdGVtID0gbmV3IENvbnRhaW5lckVudHJ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLm5ld0l0ZW0uZ2V0SWQoKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlZEl0ZW0gPSBwbGF5ZXIuZ2V0SW52ZW50b3J5KCkuZ2V0SXRlbShhY3Rpb24udGFyZ2V0U2xvdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci5nZXRJbnZlbnRvcnkoKS5yZW1vdmVJdGVtKGFjdGlvbi50YXJnZXRTbG90KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW92ZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5nZXRMb2dnZXIoKS5kZWJ1ZyhgbW92ZWRJdGVtIGlzIHVuZGVmaW5lZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLmdldEludmVudG9yeSgpLnNldEl0ZW0oYWN0aW9uLnRhcmdldFNsb3QsIG1vdmVkSXRlbSk7Ki9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLmdldExvZ2dlcigpLmRlYnVnKGBVbmtub3duIHNvdXJjZSB0eXBlOiAke2FjdGlvbi5zb3VyY2VUeXBlfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5VU0VfSVRFTToge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZUl0ZW1EYXRhID0gPFVzZUl0ZW1EYXRhPnBhY2tldC50cmFuc2FjdGlvbkRhdGE7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh1c2VJdGVtRGF0YS5hY3Rpb25UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVXNlSXRlbUFjdGlvbi5DTElDS19CTE9DSzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHBsYXllclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRXb3JsZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVzZUl0ZW1PbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QmxvY2tNYW5hZ2VyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCbG9ja0J5SWRBbmRNZXRhKHVzZUl0ZW1EYXRhLml0ZW1JbkhhbmQuZ2V0SWQoKSwgdXNlSXRlbURhdGEuaXRlbUluSGFuZC5tZXRhKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSXRlbURhdGEuYmxvY2tQb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSXRlbURhdGEuYmxvY2tGYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VJdGVtRGF0YS5jbGlja1Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVXNlSXRlbUFjdGlvbi5DTElDS19BSVI6XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBVc2VJdGVtQWN0aW9uLkJSRUFLX0JMT0NLOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IGF3YWl0IHBsYXllci5nZXRXb3JsZCgpLmdldENodW5rQXQodXNlSXRlbURhdGEuYmxvY2tQb3NpdGlvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrSWQgPSBjaHVuay5nZXRCbG9jayh1c2VJdGVtRGF0YS5ibG9ja1Bvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gc2VydmVyLmdldEJsb2NrTWFuYWdlcigpLmdldEJsb2NrQnlJZEFuZE1ldGEoYmxvY2tJZC5pZCwgYmxvY2tJZC5tZXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmxvY2spIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGsgPSBuZXcgVXBkYXRlQmxvY2tQYWNrZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBrLnggPSB1c2VJdGVtRGF0YS5ibG9ja1Bvc2l0aW9uLmdldFgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBrLnkgPSB1c2VJdGVtRGF0YS5ibG9ja1Bvc2l0aW9uLmdldFkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBrLnogPSB1c2VJdGVtRGF0YS5ibG9ja1Bvc2l0aW9uLmdldFooKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHJ1biBhIGZ1bmN0aW9uIGZyb20gYmxvY2suZ2V0QnJlYWtDb25zZXF1ZW5jZXMoKSBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYnJva2VuIGJsb2NrIG1heSBwbGFjZSBtb3JlIGJsb2NrcyBvciBydW4gYmxvY2sgcmVsYXRlZCBjb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgaWNlIHNob3VsZCByZXBsYWNlIGl0c2VsZiB3aXRoIGEgd2F0ZXIgc291cmNlIGJsb2NrXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBzdXJ2aXZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgcGsuYmxvY2tSdW50aW1lSWQgPSBCbG9ja01hcHBpbmdzLmdldFJ1bnRpbWVJZCgnbWluZWNyYWZ0OmFpcicpOyAvLyBBaXJcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBibG9jay1icmVhayBwYWNrZXQgdG8gYWxsIHBsYXllcnMgaW4gdGhlIHNhbWUgd29ybGRcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2Vzc2lvbk1hbmFnZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWxsUGxheWVycygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHApID0+IHAuZ2V0V29ybGQoKS5nZXRVVUlEKCkgPT09IHBsYXllci5nZXRXb3JsZCgpLmdldFVVSUQoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChhc3luYyAocGxheWVyKSA9PiBwbGF5ZXIuZ2V0TmV0d29ya1Nlc3Npb24oKS5nZXRDb25uZWN0aW9uKCkuc2VuZERhdGFQYWNrZXQocGspKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmtQb3MgPSB1c2VJdGVtRGF0YS5ibG9ja1Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsuc2V0QmxvY2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtQb3MuZ2V0WCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rUG9zLmdldFkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua1Bvcy5nZXRaKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLmdldEJsb2NrTWFuYWdlcigpLmdldEJsb2NrKCdtaW5lY3JhZnQ6YWlyJykhXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VuZFBrID0gbmV3IExldmVsU291bmRFdmVudFBhY2tldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc291bmRQay5zb3VuZCA9IDU7IC8vIFRPRE86IGVudW1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc291bmRQay5wb3NpdGlvblggPSBwbGF5ZXIuZ2V0WCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc291bmRQay5wb3NpdGlvblkgPSBwbGF5ZXIuZ2V0WSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc291bmRQay5wb3NpdGlvblogPSBwbGF5ZXIuZ2V0WigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyA/IDAgb3IgaWQgJiAweGZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kUGsuZXh0cmFEYXRhID0gQmxvY2tNYXBwaW5ncy5nZXRSdW50aW1lSWQoYmxvY2suZ2V0TmFtZSgpKTsgLy8gSW4gdGhpcyBjYXNlIHJlZmVycyB0byBibG9jayBydW50aW1lIElkXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VuZFBrLmVudGl0eVR5cGUgPSAnOic7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VuZFBrLmlzQmFieU1vYiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc291bmRQay5kaXNhYmxlUmVsYXRpdmVWb2x1bWUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRXb3JsZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQbGF5ZXJzKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgodGFyZ2V0KSA9PiB0YXJnZXQuZ2V0TmV0d29ya1Nlc3Npb24oKS5zZW5kKHNvdW5kUGspKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5nZXRMb2dnZXIoKS5kZWJ1ZyhgVW5rbm93biBhY3Rpb24gdHlwZTogJHt1c2VJdGVtRGF0YS5hY3Rpb25UeXBlfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgc2VydmVyLmdldExvZ2dlcigpLnZlcmJvc2UoYFVua25vd24gdHlwZTogJHtwYWNrZXQudHJhbnNhY3Rpb25UeXBlfWApO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBJbnZlbnRvcnlUcmFuc2FjdGlvblR5cGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJJZGVudGlmaWVycyIsIkdhbWV0eXBlIiwiVHJhbnNhY3Rpb25UeXBlIiwiVXNlSXRlbUFjdGlvbiIsIlVwZGF0ZUJsb2NrUGFja2V0IiwiQmxvY2tNYXBwaW5ncyIs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