UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

294 lines (293 loc) • 27.2 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const require_network_NetworkUtil = require("../network/NetworkUtil.cjs.cjs"); //#region src/entity/Metadata.ts var MetadataFlag = /* @__PURE__ */ function(MetadataFlag) { MetadataFlag[MetadataFlag["INDEX"] = 0] = "INDEX"; MetadataFlag[MetadataFlag["HEALTH"] = 1] = "HEALTH"; MetadataFlag[MetadataFlag["VARIANT"] = 2] = "VARIANT"; MetadataFlag[MetadataFlag["COLOR"] = 3] = "COLOR"; MetadataFlag[MetadataFlag["NAMETAG"] = 4] = "NAMETAG"; MetadataFlag[MetadataFlag["OWNER_ENTITY_ID"] = 5] = "OWNER_ENTITY_ID"; MetadataFlag[MetadataFlag["TARGET_ENTITY_ID"] = 6] = "TARGET_ENTITY_ID"; MetadataFlag[MetadataFlag["AIR"] = 7] = "AIR"; MetadataFlag[MetadataFlag["POTION_COLOR"] = 8] = "POTION_COLOR"; MetadataFlag[MetadataFlag["AMBIENT"] = 9] = "AMBIENT"; MetadataFlag[MetadataFlag["HURT_TIME"] = 10] = "HURT_TIME"; MetadataFlag[MetadataFlag["HURT_DIRECTION"] = 11] = "HURT_DIRECTION"; MetadataFlag[MetadataFlag["PADDLE_TIME_LEFT"] = 12] = "PADDLE_TIME_LEFT"; MetadataFlag[MetadataFlag["PADDLE_TIME_RIGHT"] = 13] = "PADDLE_TIME_RIGHT"; MetadataFlag[MetadataFlag["EXPERIENCE_VALUE"] = 14] = "EXPERIENCE_VALUE"; MetadataFlag[MetadataFlag["PLAYER_INDEX"] = 27] = "PLAYER_INDEX"; MetadataFlag[MetadataFlag["ENTITY_LEAD_HOLDER_ID"] = 37] = "ENTITY_LEAD_HOLDER_ID"; MetadataFlag[MetadataFlag["SCALE"] = 38] = "SCALE"; MetadataFlag[MetadataFlag["MAX_AIR"] = 42] = "MAX_AIR"; MetadataFlag[MetadataFlag["SPRINTING"] = 3] = "SPRINTING"; MetadataFlag[MetadataFlag["CAN_CLIMB"] = 19] = "CAN_CLIMB"; MetadataFlag[MetadataFlag["CAN_FLY"] = 21] = "CAN_FLY"; MetadataFlag[MetadataFlag["HAS_COLLISION"] = 48] = "HAS_COLLISION"; MetadataFlag[MetadataFlag["AFFECTED_BY_GRAVITY"] = 49] = "AFFECTED_BY_GRAVITY"; MetadataFlag[MetadataFlag["BOUNDINGBOX_WIDTH"] = 53] = "BOUNDINGBOX_WIDTH"; MetadataFlag[MetadataFlag["BOUNDINGBOX_HEIGHT"] = 54] = "BOUNDINGBOX_HEIGHT"; return MetadataFlag; }({}); var FlagType = /* @__PURE__ */ function(FlagType) { FlagType[FlagType["BYTE"] = 0] = "BYTE"; FlagType[FlagType["SHORT"] = 1] = "SHORT"; FlagType[FlagType["INT"] = 2] = "INT"; FlagType[FlagType["FLOAT"] = 3] = "FLOAT"; FlagType[FlagType["STRING"] = 4] = "STRING"; FlagType[FlagType["ITEM"] = 5] = "ITEM"; FlagType[FlagType["POSITION"] = 6] = "POSITION"; FlagType[FlagType["LONG"] = 7] = "LONG"; FlagType[FlagType["VECTOR"] = 8] = "VECTOR"; return FlagType; }({}); var MetadataWriter = class { metadata = /* @__PURE__ */ new Map(); getPropertyValue(key) { return this.metadata.has(key) ? this.metadata.get(key)[1] : null; } setPropertyValue(key, type, value) { this.metadata.set(key, [type, value]); } setLong(key, value) { this.setPropertyValue(key, 7, value); } setShort(key, value) { this.setPropertyValue(key, 1, value); } /** * Set the property value as a string. * @param {number} key - The property id. * @param {string} value - The property value. */ setString(key, value) { this.setPropertyValue(key, 4, value); } /** * Get the property value as a string. * @param {number} key - The property id. * @returns {string} The property value. */ getString(key) { return this.metadata.get(key); } /** * Set the property value as a float. * @param {number} key - The property id. * @param {number} value - The property value. */ setFloat(key, value) { this.setPropertyValue(key, 3, value); } /** * Get the property value as a float. * @param {number} key - The property id. * @returns {number} */ getFloat(key) { return this.metadata.get(key); } /** * Set a flag value. * @param {number} propertyId - The property id. * @param {number} flagId - The flag id. * @param {boolean} [value=true] - The flag value. * @param {FlagType} [propertyType=FlagType.LONG] - The property type. */ setDataFlag(propertyId, flagId, value = true, propertyType = 7) { const flagId64 = BigInt(flagId); if (this.getDataFlag(propertyId, flagId64) !== value) { const flags = this.getPropertyValue(propertyId); this.setPropertyValue(propertyId, propertyType, flags ^ 1n << flagId64); } } /** * Get the property value as a boolean. * @param {number} propertyId - The property id. * @param {bigint} flagId - The flag id. * @returns {boolean} The flag value. */ getDataFlag(propertyId, flagId) { return (this.getPropertyValue(propertyId) & 1n << flagId) > 0; } /** * @param {number} flagId - The flag id. * @param {boolean} [value=true] - The flag value. */ setGenericFlag(flagId, value = true) { this.setDataFlag(flagId >= 64 ? 94 : 0, flagId % 64, value, 7); } /** * Get the property value as a boolean. * @returns {typeof metadata} The metadata object. */ getData() { return this.metadata; } networkSerialize(stream) { stream.writeUnsignedVarInt(this.getData().size); for (const [index, value] of this.getData()) { stream.writeUnsignedVarInt(index); stream.writeSignedByte(value[0]); switch (value[0]) { case 0: stream.writeByte(Number(value[1])); break; case 3: stream.writeFloatLE(value[1]); break; case 7: stream.writeVarLong(value[1]); break; case 4: require_network_NetworkUtil.NetworkUtil.writeString(stream, value[1]); break; case 1: stream.writeUnsignedShortLE(value[1]); break; default: throw new Error(`Metadata type ${value[0]} not supported`); } } } }; /** * Represents the metadata of an entity. */ var Metadata = class extends MetadataWriter { /** * Create a new metadata object. * @param {boolean} [setDefaults=true] * @returns {Metadata} the metadata object. */ constructor(setDefaults = true) { super(); if (!setDefaults) return; this.setDefaults(); } /** * Set the default metadata values. * @remarks This method is called when the metadata object is created. * @TODO: Add missing functions. */ setDefaults() { this.setLong(0, 0n); this.setShort(42, 300); this.setLong(37, -1n); this.setFloat(53, .6); this.setFloat(54, 1.8); this.setShort(7, 0); this.setScale(); this.setAffectedByGravity(); this.setCollidable(); } /** * Set the entity's name tag. * @param {string} name - The name tag. * @example * ```typescript * entity.setNameTag('Steve'); * ``` */ setNameTag(name) { this.setString(4, name); } /** * Get the entity's name tag. * @returns {string} The entity's name tag. */ get nameTag() { return this.getString(4); } /** * Set the entity's scale. * @param {number} [scale=1] - The entity's scale. */ setScale(scale = 1) { this.setFloat(38, scale); } /** * Get the entity's scale. * @returns {number} The entity's scale. */ getScale() { return this.getPropertyValue(38); } /** * Set if the entity should be affected by gravity. * @param {boolean} [affected=true] - if the entity should be affected by gravity. */ setAffectedByGravity(affected = true) { this.setGenericFlag(49, affected); } /** * Get if the entity is affected by gravity. * @returns {boolean} if the entity is affected by gravity. */ get affectedByGravity() { return this.getDataFlag(0, BigInt(49)); } /** * Set if the entity should be collidable. * @param {boolean} [collidable=true] - if the entity should be collidable. */ setCollidable(collidable = true) { this.setGenericFlag(48, collidable); } /** * Get entity's collidable state. * @returns {boolean} if the entity is collidable. */ get collidable() { return this.getDataFlag(0, BigInt(48)); } /** * Set the entity's sprinting state. * @param {boolean} [sprinting=true] - if the entity is sprinting. */ setSprinting(sprinting = true) { this.setDataFlag(0, 3, sprinting, 0); } /** * Get entity's sprinting state. * @returns {boolean} if the entity is sprinting. */ get sprinting() { return this.getDataFlag(0, BigInt(3)); } /** * Set the entity's can fly state. * @param {boolean} [canFly=true] - if the entity can fly. */ setCanFly(canFly = true) { this.setDataFlag(0, 21, canFly, 0); } /** * Get entity's can fly state. * @returns {boolean} if the entity can fly. */ get canFly() { return this.getDataFlag(0, BigInt(21)); } /** * Set the entity's can climb state. * @param {boolean} [canClimb=true] - if the entity can climb. */ setCanClimb(canClimb = true) { this.setDataFlag(0, 19, canClimb, 0); } /** * Get entity's can climb state. * @returns {boolean} if the entity can climb. */ get canClimb() { return this.getDataFlag(0, BigInt(19)); } }; //#endregion exports.FlagType = FlagType; exports.Metadata = Metadata; exports.MetadataFlag = MetadataFlag; exports.MetadataWriter = MetadataWriter; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWV0YWRhdGEuY2pzLmNqcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZW50aXR5L01ldGFkYXRhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHsgTmV0d29ya1V0aWwgfSBmcm9tICcuLi9uZXR3b3JrL05ldHdvcmtVdGlsJztcblxuLy8gVE9ETzogU3RpbGwgbWlzc2luZyBmbGFnc1xuZXhwb3J0IGVudW0gTWV0YWRhdGFGbGFnIHtcbiAgICBJTkRFWCxcbiAgICBIRUFMVEgsXG4gICAgVkFSSUFOVCxcbiAgICBDT0xPUixcbiAgICBOQU1FVEFHLFxuICAgIE9XTkVSX0VOVElUWV9JRCxcbiAgICBUQVJHRVRfRU5USVRZX0lELFxuICAgIEFJUixcbiAgICBQT1RJT05fQ09MT1IsXG4gICAgQU1CSUVOVCxcbiAgICBIVVJUX1RJTUUsXG4gICAgSFVSVF9ESVJFQ1RJT04sXG4gICAgUEFERExFX1RJTUVfTEVGVCxcbiAgICBQQURETEVfVElNRV9SSUdIVCxcbiAgICBFWFBFUklFTkNFX1ZBTFVFLFxuICAgIFBMQVlFUl9JTkRFWCA9IDI3LFxuICAgIEVOVElUWV9MRUFEX0hPTERFUl9JRCA9IDM3LFxuICAgIFNDQUxFLFxuICAgIE1BWF9BSVIgPSA0MixcblxuICAgIC8vIGZsYWdzXG4gICAgU1BSSU5USU5HID0gMyxcbiAgICBDQU5fQ0xJTUIgPSAxOSxcbiAgICBDQU5fRkxZID0gMjEsXG4gICAgSEFTX0NPTExJU0lPTiA9IDQ4LFxuICAgIEFGRkVDVEVEX0JZX0dSQVZJVFkgPSA0OSxcbiAgICBCT1VORElOR0JPWF9XSURUSCA9IDUzLFxuICAgIEJPVU5ESU5HQk9YX0hFSUdIVFxufVxuXG5leHBvcnQgZW51bSBGbGFnVHlwZSB7XG4gICAgQllURSxcbiAgICBTSE9SVCxcbiAgICBJTlQsXG4gICAgRkxPQVQsXG4gICAgU1RSSU5HLFxuICAgIElURU0sXG4gICAgUE9TSVRJT04sXG4gICAgTE9ORyxcbiAgICBWRUNUT1Jcbn1cblxuZXhwb3J0IHR5cGUgTWV0YWRhdGFDb250YWluZXIgPSBNYXA8bnVtYmVyLCBbbnVtYmVyLCBiaWdpbnQgfCBudW1iZXIgfCBib29sZWFuIHwgc3RyaW5nXT47XG5leHBvcnQgY2xhc3MgTWV0YWRhdGFXcml0ZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWV0YWRhdGE6IE1ldGFkYXRhQ29udGFpbmVyID0gbmV3IE1hcCgpO1xuXG4gICAgcHVibGljIGdldFByb3BlcnR5VmFsdWUoa2V5OiBudW1iZXIpOiBiaWdpbnQgfCBudW1iZXIgfCBib29sZWFuIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLmhhcyhrZXkpID8gdGhpcy5tZXRhZGF0YS5nZXQoa2V5KSFbMV0gOiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRQcm9wZXJ0eVZhbHVlKGtleTogbnVtYmVyLCB0eXBlOiBudW1iZXIsIHZhbHVlOiBiaWdpbnQgfCBudW1iZXIgfCBib29sZWFuIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWV0YWRhdGEuc2V0KGtleSwgW3R5cGUsIHZhbHVlXSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldExvbmcoa2V5OiBudW1iZXIsIHZhbHVlOiBiaWdpbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKGtleSwgRmxhZ1R5cGUuTE9ORywgdmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTaG9ydChrZXk6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoa2V5LCBGbGFnVHlwZS5TSE9SVCwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgcHJvcGVydHkgdmFsdWUgYXMgYSBzdHJpbmcuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtleSAtIFRoZSBwcm9wZXJ0eSBpZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBUaGUgcHJvcGVydHkgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIHNldFN0cmluZyhrZXk6IG51bWJlciwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoa2V5LCBGbGFnVHlwZS5TVFJJTkcsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBhcyBhIHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga2V5IC0gVGhlIHByb3BlcnR5IGlkLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U3RyaW5nKGtleTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGEuZ2V0KGtleSkhIGFzIGFueTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHByb3BlcnR5IHZhbHVlIGFzIGEgZmxvYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtleSAtIFRoZSBwcm9wZXJ0eSBpZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgcHJvcGVydHkgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIHNldEZsb2F0KGtleTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShrZXksIEZsYWdUeXBlLkZMT0FULCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcHJvcGVydHkgdmFsdWUgYXMgYSBmbG9hdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga2V5IC0gVGhlIHByb3BlcnR5IGlkLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHVibGljIGdldEZsb2F0KGtleTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGEuZ2V0KGtleSkhIGFzIGFueTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYSBmbGFnIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwcm9wZXJ0eUlkIC0gVGhlIHByb3BlcnR5IGlkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmbGFnSWQgLSBUaGUgZmxhZyBpZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZT10cnVlXSAtIFRoZSBmbGFnIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7RmxhZ1R5cGV9IFtwcm9wZXJ0eVR5cGU9RmxhZ1R5cGUuTE9OR10gLSBUaGUgcHJvcGVydHkgdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGF0YUZsYWcocHJvcGVydHlJZDogbnVtYmVyLCBmbGFnSWQ6IG51bWJlciwgdmFsdWUgPSB0cnVlLCBwcm9wZXJ0eVR5cGUgPSBGbGFnVHlwZS5MT05HKTogdm9pZCB7XG4gICAgICAgIC8vIEFsbCBnZW5lcmljIGZsYWdzIGFyZSB3cml0dGVuIGFzIExvbmdzIChiaWdpbnRzKSA2NGJpdFxuICAgICAgICBjb25zdCBmbGFnSWQ2NCA9IEJpZ0ludChmbGFnSWQpO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2FtZSB2YWx1ZSBpcyBhbHJlYWR5IHNldFxuICAgICAgICBpZiAodGhpcy5nZXREYXRhRmxhZyhwcm9wZXJ0eUlkLCBmbGFnSWQ2NCkgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBmbGFncyA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eUlkKSBhcyBiaWdpbnQ7XG4gICAgICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUocHJvcGVydHlJZCwgcHJvcGVydHlUeXBlLCBmbGFncyBeICgxbiA8PCBmbGFnSWQ2NCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcHJvcGVydHkgdmFsdWUgYXMgYSBib29sZWFuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwcm9wZXJ0eUlkIC0gVGhlIHByb3BlcnR5IGlkLlxuICAgICAqIEBwYXJhbSB7YmlnaW50fSBmbGFnSWQgLSBUaGUgZmxhZyBpZC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVGhlIGZsYWcgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldERhdGFGbGFnKHByb3BlcnR5SWQ6IG51bWJlciwgZmxhZ0lkOiBiaWdpbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICgodGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5SWQpIGFzIGJpZ2ludCkgJiAoMW4gPDwgZmxhZ0lkKSkgPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmbGFnSWQgLSBUaGUgZmxhZyBpZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZT10cnVlXSAtIFRoZSBmbGFnIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRHZW5lcmljRmxhZyhmbGFnSWQ6IG51bWJlciwgdmFsdWUgPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0RGF0YUZsYWcoZmxhZ0lkID49IDY0ID8gOTQgOiBNZXRhZGF0YUZsYWcuSU5ERVgsIGZsYWdJZCAlIDY0LCB2YWx1ZSwgRmxhZ1R5cGUuTE9ORyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBhcyBhIGJvb2xlYW4uXG4gICAgICogQHJldHVybnMge3R5cGVvZiBtZXRhZGF0YX0gVGhlIG1ldGFkYXRhIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIG5ldHdvcmtTZXJpYWxpemUoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiB2b2lkIHtcbiAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRWYXJJbnQodGhpcy5nZXREYXRhKCkuc2l6ZSk7XG4gICAgICAgIGZvciAoY29uc3QgW2luZGV4LCB2YWx1ZV0gb2YgdGhpcy5nZXREYXRhKCkgYXMgYW55KSB7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFZhckludChpbmRleCk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVTaWduZWRCeXRlKHZhbHVlWzBdKTtcbiAgICAgICAgICAgIHN3aXRjaCAodmFsdWVbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIEZsYWdUeXBlLkJZVEU6XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZUJ5dGUoTnVtYmVyKHZhbHVlWzFdKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRmxhZ1R5cGUuRkxPQVQ6XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZUZsb2F0TEUodmFsdWVbMV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEZsYWdUeXBlLkxPTkc6XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZVZhckxvbmcodmFsdWVbMV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEZsYWdUeXBlLlNUUklORzpcbiAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCB2YWx1ZVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRmxhZ1R5cGUuU0hPUlQ6XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkU2hvcnRMRSh2YWx1ZVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWV0YWRhdGEgdHlwZSAke3ZhbHVlWzBdfSBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgbWV0YWRhdGEgb2YgYW4gZW50aXR5LlxuICovXG5leHBvcnQgY2xhc3MgTWV0YWRhdGEgZXh0ZW5kcyBNZXRhZGF0YVdyaXRlciB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IG1ldGFkYXRhIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzZXREZWZhdWx0cz10cnVlXVxuICAgICAqIEByZXR1cm5zIHtNZXRhZGF0YX0gdGhlIG1ldGFkYXRhIG9iamVjdC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzZXREZWZhdWx0cyA9IHRydWUpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBpZiAoIXNldERlZmF1bHRzKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdHMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgbWV0YWRhdGEgdmFsdWVzLlxuICAgICAqIEByZW1hcmtzIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvYmplY3QgaXMgY3JlYXRlZC5cbiAgICAgKiBAVE9ETzogQWRkIG1pc3NpbmcgZnVuY3Rpb25zLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzZXREZWZhdWx0cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRMb25nKE1ldGFkYXRhRmxhZy5JTkRFWCwgMG4pO1xuXG4gICAgICAgIHRoaXMuc2V0U2hvcnQoTWV0YWRhdGFGbGFnLk1BWF9BSVIsIDMwMCk7XG4gICAgICAgIHRoaXMuc2V0TG9uZyhNZXRhZGF0YUZsYWcuRU5USVRZX0xFQURfSE9MREVSX0lELCAtMW4pO1xuICAgICAgICB0aGlzLnNldEZsb2F0KE1ldGFkYXRhRmxhZy5CT1VORElOR0JPWF9XSURUSCwgMC42KTtcbiAgICAgICAgdGhpcy5zZXRGbG9hdChNZXRhZGF0YUZsYWcuQk9VTkRJTkdCT1hfSEVJR0hULCAxLjgpO1xuICAgICAgICB0aGlzLnNldFNob3J0KE1ldGFkYXRhRmxhZy5BSVIsIDApO1xuXG4gICAgICAgIHRoaXMuc2V0U2NhbGUoKTtcbiAgICAgICAgdGhpcy5zZXRBZmZlY3RlZEJ5R3Jhdml0eSgpO1xuICAgICAgICB0aGlzLnNldENvbGxpZGFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGVudGl0eSdzIG5hbWUgdGFnLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgdGFnLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGVudGl0eS5zZXROYW1lVGFnKCdTdGV2ZScpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXROYW1lVGFnKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFN0cmluZyhNZXRhZGF0YUZsYWcuTkFNRVRBRywgbmFtZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZW50aXR5J3MgbmFtZSB0YWcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGVudGl0eSdzIG5hbWUgdGFnLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmFtZVRhZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmcoTWV0YWRhdGFGbGFnLk5BTUVUQUcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZW50aXR5J3Mgc2NhbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xXSAtIFRoZSBlbnRpdHkncyBzY2FsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U2NhbGUoc2NhbGU6IG51bWJlciA9IDEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRGbG9hdChNZXRhZGF0YUZsYWcuU0NBTEUsIHNjYWxlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBlbnRpdHkncyBzY2FsZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgZW50aXR5J3Mgc2NhbGUuXG4gICAgICovXG4gICAgcHVibGljIGdldFNjYWxlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoTWV0YWRhdGFGbGFnLlNDQUxFKSBhcyBudW1iZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGlmIHRoZSBlbnRpdHkgc2hvdWxkIGJlIGFmZmVjdGVkIGJ5IGdyYXZpdHkuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbYWZmZWN0ZWQ9dHJ1ZV0gLSBpZiB0aGUgZW50aXR5IHNob3VsZCBiZSBhZmZlY3RlZCBieSBncmF2aXR5LlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRBZmZlY3RlZEJ5R3Jhdml0eShhZmZlY3RlZDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRHZW5lcmljRmxhZyhNZXRhZGF0YUZsYWcuQUZGRUNURURfQllfR1JBVklUWSwgYWZmZWN0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgaWYgdGhlIGVudGl0eSBpcyBhZmZlY3RlZCBieSBncmF2aXR5LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBpZiB0aGUgZW50aXR5IGlzIGFmZmVjdGVkIGJ5IGdyYXZpdHkuXG4gICAgICovXG4gICAgcHVibGljIGdldCBhZmZlY3RlZEJ5R3Jhdml0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YUZsYWcoTWV0YWRhdGFGbGFnLklOREVYLCBCaWdJbnQoTWV0YWRhdGFGbGFnLkFGRkVDVEVEX0JZX0dSQVZJVFkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgaWYgdGhlIGVudGl0eSBzaG91bGQgYmUgY29sbGlkYWJsZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb2xsaWRhYmxlPXRydWVdIC0gaWYgdGhlIGVudGl0eSBzaG91bGQgYmUgY29sbGlkYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Q29sbGlkYWJsZShjb2xsaWRhYmxlOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldEdlbmVyaWNGbGFnKE1ldGFkYXRhRmxhZy5IQVNfQ09MTElTSU9OLCBjb2xsaWRhYmxlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGVudGl0eSdzIGNvbGxpZGFibGUgc3RhdGUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGlmIHRoZSBlbnRpdHkgaXMgY29sbGlkYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbGxpZGFibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldERhdGFGbGFnKE1ldGFkYXRhRmxhZy5JTkRFWCwgQmlnSW50KE1ldGFkYXRhRmxhZy5IQVNfQ09MTElTSU9OKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBlbnRpdHkncyBzcHJpbnRpbmcgc3RhdGUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc3ByaW50aW5nPXRydWVdIC0gaWYgdGhlIGVudGl0eSBpcyBzcHJpbnRpbmcuXG4gICAgICovXG4gICAgcHVibGljIHNldFNwcmludGluZyhzcHJpbnRpbmc6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0RGF0YUZsYWcoTWV0YWRhdGFGbGFnLklOREVYLCBNZXRhZGF0YUZsYWcuU1BSSU5USU5HLCBzcHJpbnRpbmcsIEZsYWdUeXBlLkJZVEUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgZW50aXR5J3Mgc3ByaW50aW5nIHN0YXRlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBpZiB0aGUgZW50aXR5IGlzIHNwcmludGluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNwcmludGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YUZsYWcoTWV0YWRhdGFGbGFnLklOREVYLCBCaWdJbnQoTWV0YWRhdGFGbGFnLlNQUklOVElORykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZW50aXR5J3MgY2FuIGZseSBzdGF0ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjYW5GbHk9dHJ1ZV0gLSBpZiB0aGUgZW50aXR5IGNhbiBmbHkuXG4gICAgICovXG4gICAgcHVibGljIHNldENhbkZseShjYW5GbHk6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0RGF0YUZsYWcoTWV0YWRhdGFGbGFnLklOREVYLCBNZXRhZGF0YUZsYWcuQ0FOX0ZMWSwgY2FuRmx5LCBGbGFnVHlwZS5CWVRFKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGVudGl0eSdzIGNhbiBmbHkgc3RhdGUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGlmIHRoZSBlbnRpdHkgY2FuIGZseS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNhbkZseSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YUZsYWcoTWV0YWRhdGFGbGFnLklOREVYLCBCaWdJbnQoTWV0YWRhdGFGbGFnLkNBTl9GTFkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGVudGl0eSdzIGNhbiBjbGltYiBzdGF0ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjYW5DbGltYj10cnVlXSAtIGlmIHRoZSBlbnRpdHkgY2FuIGNsaW1iLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRDYW5DbGltYihjYW5DbGltYjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXREYXRhRmxhZyhNZXRhZGF0YUZsYWcuSU5ERVgsIE1ldGFkYXRhRmxhZy5DQU5fQ0xJTUIsIGNhbkNsaW1iLCBGbGFnVHlwZS5CWVRFKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGVudGl0eSdzIGNhbiBjbGltYiBzdGF0ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gaWYgdGhlIGVudGl0eSBjYW4gY2xpbWIuXG4gICAgICovXG4gICAgcHVibGljIGdldCBjYW5DbGltYigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YUZsYWcoTWV0YWRhdGFGbGFnLklOREVYLCBCaWdJbnQoTWV0YWRhdGFGbGFnLkNBTl9DTElNQikpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUlBLElBQVksZUFBTCx5QkFBQSxjQUFBO0NBQ0gsYUFBQSxhQUFBLFdBQUEsS0FBQTtDQUNBLGFBQUEsYUFBQSxZQUFBLEtBQUE7Q0FDQSxhQUFBLGFBQUEsYUFBQSxLQUFBO0NBQ0EsYUFBQSxhQUFBLFdBQUEsS0FBQTtDQUNBLGFBQUEsYUFBQSxhQUFBLEtBQUE7Q0FDQSxhQUFBLGFBQUEscUJBQUEsS0FBQTtDQUNBLGFBQUEsYUFBQSxzQkFBQSxLQUFBO0NBQ0EsYUFBQSxhQUFBLFNBQUEsS0FBQTtDQUNBLGFBQUEsYUFBQSxrQkFBQSxLQUFBO0NBQ0EsYUFBQSxhQUFBLGFBQUEsS0FBQTtDQUNBLGFBQUEsYUFBQSxlQUFBLE1BQUE7Q0FDQSxhQUFBLGFBQUEsb0JBQUEsTUFBQTtDQUNBLGFBQUEsYUFBQSxzQkFBQSxNQUFBO0NBQ0EsYUFBQSxhQUFBLHVCQUFBLE1BQUE7Q0FDQSxhQUFBLGFBQUEsc0JBQUEsTUFBQTtDQUNBLGFBQUEsYUFBQSxrQkFBQSxNQUFBO0NBQ0EsYUFBQSxhQUFBLDJCQUFBLE1BQUE7Q0FDQSxhQUFBLGFBQUEsV0FBQSxNQUFBO0NBQ0EsYUFBQSxhQUFBLGFBQUEsTUFBQTtDQUdBLGFBQUEsYUFBQSxlQUFBLEtBQUE7Q0FDQSxhQUFBLGFBQUEsZUFBQSxNQUFBO0NBQ0EsYUFBQSxhQUFBLGFBQUEsTUFBQTtDQUNBLGFBQUEsYUFBQSxtQkFBQSxNQUFBO0NBQ0EsYUFB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