@jsprismarine/nbt
Version:
Minecraft: Bedrock Edition NBT parser/writer
186 lines (185 loc) • 23.5 kB
JavaScript
import { ByteOrder } from "./ByteOrder.es.js";
import { NBTDefinitions } from "./NBTDefinitions.es.js";
import ByteValue from "./types/ByteVal.es.js";
import DoubleValue from "./types/DoubleVal.es.js";
import FloatValue from "./types/FloatVal.es.js";
import LongValue from "./types/LongVal.es.js";
import NumberValue from "./types/NumberVal.es.js";
import ShortValue from "./types/ShortVal.es.js";
import StringValue from "./types/StringVal.es.js";
import NBTTagCompound from "./NBTTagCompound.es.js";
//#region src/NBTWriter.ts
var NBTWriter = class {
order;
buf;
useVarint = false;
constructor(out, byteOrder) {
this.buf = out;
this.order = byteOrder;
}
setUseVarint(useVarint) {
this.useVarint = useVarint;
}
writeList(list) {
this.writeTagHeader(NBTDefinitions.TAG_LIST, "");
this.writeListValue(list);
}
writeCompound(compound) {
this.writeTagHeader(NBTDefinitions.TAG_COMPOUND, compound.getName() ?? "");
this.writeCompoundValue(compound);
}
writeTagHeader(type, name) {
this.writeByteValue(type);
this.writeStringValue(name);
}
writeStringValue(value) {
if (value !== null) {
const bytes = Buffer.from(value, "utf8");
if (this.useVarint) this.buf.writeUnsignedVarInt(Buffer.byteLength(value));
else this.writeShortValue(Buffer.byteLength(value));
this.buf.write(bytes);
} else if (this.useVarint) this.writeByteValue(0);
else this.writeShortValue(0);
}
writeByteValue(value) {
this.buf.writeByte(value);
}
writeShortValue(value) {
if (this.order === ByteOrder.LITTLE_ENDIAN) this.buf.writeUnsignedShortLE(value);
else this.buf.writeUnsignedShort(value);
}
writeIntegerValue(value) {
if (this.useVarint) this.buf.writeVarInt(value);
else if (this.order === ByteOrder.LITTLE_ENDIAN) this.buf.writeUnsignedIntLE(value);
else this.buf.writeUnsignedInt(value);
}
writeLongValue(value) {
if (this.useVarint) this.buf.writeVarLong(value);
else if (this.order === ByteOrder.LITTLE_ENDIAN) this.buf.writeUnsignedLongLE(value);
else this.buf.writeUnsignedLong(value);
}
writeFloatValue(value) {
if (this.order === ByteOrder.LITTLE_ENDIAN) this.buf.writeFloatLE(value);
else this.buf.writeFloat(value);
}
writeDoubleValue(value) {
if (this.order === ByteOrder.LITTLE_ENDIAN) this.buf.writeDoubleLE(value);
else this.buf.writeDouble(value);
}
writeByteArrayValue(value) {
this.writeIntegerValue(value.length);
this.buf.write(value);
}
writeIntegerArrayValue(value) {
this.writeIntegerValue(value.length);
value.forEach((v) => {
this.writeIntegerValue(v);
});
}
writeListValue(value) {
if (value.size > 0) {
const listNbtType = this.getNBTTypeFromValue(value.entries().next().value);
this.writeByteValue(listNbtType);
this.writeIntegerValue(value.size);
for (const rawValue of value) switch (listNbtType) {
case NBTDefinitions.TAG_BYTE:
this.writeByteValue(rawValue.getValue());
break;
case NBTDefinitions.TAG_SHORT:
this.writeShortValue(rawValue.getValue());
break;
case NBTDefinitions.TAG_INT:
this.writeIntegerValue(rawValue.getValue());
break;
case NBTDefinitions.TAG_LONG:
this.writeLongValue(rawValue.getValue());
break;
case NBTDefinitions.TAG_FLOAT:
this.writeFloatValue(rawValue.getValue());
break;
case NBTDefinitions.TAG_DOUBLE:
this.writeDoubleValue(rawValue.getValue());
break;
case NBTDefinitions.TAG_BYTE_ARRAY:
this.writeDoubleValue(rawValue);
break;
case NBTDefinitions.TAG_STRING:
this.writeStringValue(rawValue.getValue());
break;
case NBTDefinitions.TAG_LIST:
this.writeListValue(rawValue);
break;
case NBTDefinitions.TAG_COMPOUND:
this.writeCompoundValue(rawValue);
break;
case NBTDefinitions.TAG_INT_ARRAY:
this.writeIntegerArrayValue(rawValue);
break;
default: throw new Error("Invalid NBTTagType");
}
} else {
this.writeByteValue(NBTDefinitions.TAG_BYTE);
this.writeIntegerValue(0);
}
}
writeCompoundValue(compound) {
for (const [key, value] of compound.entries()) {
const nbtType = this.getNBTTypeFromValue(value);
this.writeTagHeader(nbtType, key);
switch (nbtType) {
case NBTDefinitions.TAG_BYTE:
this.writeByteValue(value.getValue());
break;
case NBTDefinitions.TAG_SHORT:
this.writeShortValue(value.getValue());
break;
case NBTDefinitions.TAG_INT:
this.writeIntegerValue(value.getValue());
break;
case NBTDefinitions.TAG_LONG:
this.writeLongValue(value.getValue());
break;
case NBTDefinitions.TAG_FLOAT:
this.writeFloatValue(value.getValue());
break;
case NBTDefinitions.TAG_DOUBLE:
this.writeDoubleValue(value.getValue());
break;
case NBTDefinitions.TAG_BYTE_ARRAY:
this.writeByteArrayValue(value);
break;
case NBTDefinitions.TAG_STRING:
this.writeStringValue(value.getValue());
break;
case NBTDefinitions.TAG_LIST:
this.writeListValue(value);
break;
case NBTDefinitions.TAG_COMPOUND:
this.writeCompoundValue(value);
break;
case NBTDefinitions.TAG_INT_ARRAY:
this.writeIntegerValue(value);
break;
default: throw new Error("Invalid NBTTagType");
}
}
this.writeByteValue(NBTDefinitions.TAG_END);
}
getNBTTypeFromValue(value) {
if (value instanceof ByteValue) return NBTDefinitions.TAG_BYTE;
if (value instanceof ShortValue) return NBTDefinitions.TAG_SHORT;
if (value instanceof NumberValue) return NBTDefinitions.TAG_INT;
if (value instanceof LongValue) return NBTDefinitions.TAG_LONG;
if (value instanceof FloatValue) return NBTDefinitions.TAG_FLOAT;
if (value instanceof DoubleValue) return NBTDefinitions.TAG_DOUBLE;
if (value instanceof Buffer) return NBTDefinitions.TAG_BYTE_ARRAY;
if (value instanceof StringValue) return NBTDefinitions.TAG_STRING;
if (value instanceof Set) return NBTDefinitions.TAG_LIST;
if (value instanceof NBTTagCompound) return NBTDefinitions.TAG_COMPOUND;
if (Array.isArray(value)) return NBTDefinitions.TAG_INT_ARRAY;
throw new TypeError(`Invalid NBT Data: Cannot deduce NBT type of class ${value.constructor.name} (${value})`);
}
};
//#endregion
export { NBTWriter as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUV3JpdGVyLmVzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9OQlRXcml0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgeyBCeXRlT3JkZXIgfSBmcm9tICcuL0J5dGVPcmRlcic7XG5pbXBvcnQgQnl0ZVZhbCBmcm9tICcuL3R5cGVzL0J5dGVWYWwnO1xuaW1wb3J0IERvdWJsZVZhbCBmcm9tICcuL3R5cGVzL0RvdWJsZVZhbCc7XG5pbXBvcnQgRmxvYXRWYWwgZnJvbSAnLi90eXBlcy9GbG9hdFZhbCc7XG5pbXBvcnQgTG9uZ1ZhbCBmcm9tICcuL3R5cGVzL0xvbmdWYWwnO1xuaW1wb3J0IHsgTkJURGVmaW5pdGlvbnMgfSBmcm9tICcuL05CVERlZmluaXRpb25zJztcbmltcG9ydCBOQlRUYWdDb21wb3VuZCBmcm9tICcuL05CVFRhZ0NvbXBvdW5kJztcbmltcG9ydCBOdW1iZXJWYWwgZnJvbSAnLi90eXBlcy9OdW1iZXJWYWwnO1xuaW1wb3J0IFNob3J0VmFsIGZyb20gJy4vdHlwZXMvU2hvcnRWYWwnO1xuaW1wb3J0IFN0cmluZ1ZhbCBmcm9tICcuL3R5cGVzL1N0cmluZ1ZhbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5CVFdyaXRlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBvcmRlcjogQnl0ZU9yZGVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVmOiBCaW5hcnlTdHJlYW07XG5cbiAgICBwcml2YXRlIHVzZVZhcmludCA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG91dDogQmluYXJ5U3RyZWFtLCBieXRlT3JkZXI6IEJ5dGVPcmRlcikge1xuICAgICAgICB0aGlzLmJ1ZiA9IG91dDtcbiAgICAgICAgdGhpcy5vcmRlciA9IGJ5dGVPcmRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VXNlVmFyaW50KHVzZVZhcmludDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnVzZVZhcmludCA9IHVzZVZhcmludDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVMaXN0KGxpc3Q6IFNldDxhbnk+KTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVUYWdIZWFkZXIoTkJURGVmaW5pdGlvbnMuVEFHX0xJU1QsICcnKTtcbiAgICAgICAgdGhpcy53cml0ZUxpc3RWYWx1ZShsaXN0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVDb21wb3VuZChjb21wb3VuZDogTkJUVGFnQ29tcG91bmQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZ0hlYWRlcihOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQsIGNvbXBvdW5kLmdldE5hbWUoKSA/PyAnJyk7XG4gICAgICAgIHRoaXMud3JpdGVDb21wb3VuZFZhbHVlKGNvbXBvdW5kKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlVGFnSGVhZGVyKHR5cGU6IG51bWJlciwgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUodHlwZSk7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmdWYWx1ZShuYW1lKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlU3RyaW5nVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKHZhbHVlLCAndXRmOCcpO1xuICAgICAgICAgICAgaWYgKHRoaXMudXNlVmFyaW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZFZhckludChCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZShCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZShieXRlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy51c2VWYXJpbnQpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZSgwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUJ5dGVWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlQnl0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlU2hvcnRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZFNob3J0TEUodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZFNob3J0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVJbnRlZ2VyVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy51c2VWYXJpbnQpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVmFySW50KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZEludExFKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlVW5zaWduZWRJbnQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZUxvbmdWYWx1ZSh2YWx1ZTogYmlnaW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnVzZVZhcmludCkge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVWYXJMb25nKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVVbnNpZ25lZExvbmdMRSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZVVuc2lnbmVkTG9uZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlRmxvYXRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgdGhpcy5idWYud3JpdGVGbG9hdExFKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlRmxvYXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZURvdWJsZVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3JkZXIgPT09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi53cml0ZURvdWJsZUxFKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLndyaXRlRG91YmxlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVCeXRlQXJyYXlWYWx1ZSh2YWx1ZTogQnVmZmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyVmFsdWUodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGUodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgd3JpdGVJbnRlZ2VyQXJyYXlWYWx1ZSh2YWx1ZTogbnVtYmVyW10pIHtcbiAgICAgICAgdGhpcy53cml0ZUludGVnZXJWYWx1ZSh2YWx1ZS5sZW5ndGgpO1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlTGlzdFZhbHVlKHZhbHVlOiBTZXQ8YW55Pik6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3ROYnRUeXBlID0gdGhpcy5nZXROQlRUeXBlRnJvbVZhbHVlKHZhbHVlLmVudHJpZXMoKS5uZXh0KCkudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy53cml0ZUJ5dGVWYWx1ZShsaXN0TmJ0VHlwZSk7XG4gICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHZhbHVlLnNpemUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCByYXdWYWx1ZSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobGlzdE5idFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQllURTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUocmF3VmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZShyYXdWYWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xPTkc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlTG9uZ1ZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0ZMT0FUOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUZsb2F0VmFsdWUocmF3VmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRE9VQkxFOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZURvdWJsZVZhbHVlKHJhd1ZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEVfQVJSQVk6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlRG91YmxlVmFsdWUocmF3VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NUUklORzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVTdHJpbmdWYWx1ZShyYXdWYWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MSVNUOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUxpc3RWYWx1ZShyYXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfQ09NUE9VTkQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlQ29tcG91bmRWYWx1ZShyYXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UX0FSUkFZOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUludGVnZXJBcnJheVZhbHVlKHJhd1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE5CVFRhZ1R5cGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlQnl0ZVZhbHVlKE5CVERlZmluaXRpb25zLlRBR19CWVRFKTtcbiAgICAgICAgICAgIHRoaXMud3JpdGVJbnRlZ2VyVmFsdWUoMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlQ29tcG91bmRWYWx1ZShjb21wb3VuZDogTkJUVGFnQ29tcG91bmQpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgY29tcG91bmQuZW50cmllcygpKSB7XG4gICAgICAgICAgICBjb25zdCBuYnRUeXBlID0gdGhpcy5nZXROQlRUeXBlRnJvbVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMud3JpdGVUYWdIZWFkZXIobmJ0VHlwZSwga2V5KTtcbiAgICAgICAgICAgIHN3aXRjaCAobmJ0VHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0JZVEU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlVmFsdWUodmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NIT1JUOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2hvcnRWYWx1ZSh2YWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlSW50ZWdlclZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MT05HOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlTG9uZ1ZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19GTE9BVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUZsb2F0VmFsdWUodmFsdWUuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZURvdWJsZVZhbHVlKHZhbHVlLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFX0FSUkFZOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlQnl0ZUFycmF5VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TVFJJTkc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVTdHJpbmdWYWx1ZSh2YWx1ZS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfTElTVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUxpc3RWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlQ29tcG91bmRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVF9BUlJBWTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUludGVnZXJWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBOQlRUYWdUeXBlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndyaXRlQnl0ZVZhbHVlKE5CVERlZmluaXRpb25zLlRBR19FTkQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TkJUVHlwZUZyb21WYWx1ZSh2YWx1ZTogYW55KTogTkJURGVmaW5pdGlvbnMge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCeXRlVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0JZVEU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2hvcnRWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0lOVDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0xPTkc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmxvYXRWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfRkxPQVQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0RPVUJMRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfQllURV9BUlJBWTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmdWYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBOQlREZWZpbml0aW9ucy5UQUdfU1RSSU5HO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19MSVNUO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5CVFRhZ0NvbXBvdW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5CVERlZmluaXRpb25zLlRBR19JTlRfQVJSQVk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIE5CVCBEYXRhOiBDYW5ub3QgZGVkdWNlIE5CVCB0eXBlIG9mIGNsYXNzICR7dmFsdWUuY29uc3RydWN0b3IubmFtZX0gKCR7dmFsdWV9KWApO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFZQSxJQUFxQixZQUFyQixNQUErQjtDQUMzQjtDQUNBO0NBRUEsWUFBb0I7Q0FFcEIsWUFBbUIsS0FBbUIsV0FBc0I7RUFDeEQsS0FBSyxNQUFNO0VBQ1gsS0FBSyxRQUFRO0NBQ2pCO0NBRUEsYUFBb0IsV0FBMEI7RUFDMUMsS0FBSyxZQUFZO0NBQ3JCO0NBRUEsVUFBaUIsTUFBc0I7RUFDbkMsS0FBSyxlQUFlLGVBQWUsVUFBVSxFQUFFO0VBQy9DLEtBQUssZUFBZSxJQUFJO0NBQzVCO0NBRUEsY0FBcUIsVUFBZ0M7RUFDakQsS0FBSyxlQUFlLGVBQWUsY0FBYyxTQUFTLFFBQVEsS0FBSyxFQUFFO0VBQ3pFLEtBQUssbUJBQW1CLFFBQVE7Q0FDcEM7Q0FFQSxlQUF1QixNQUFjLE1BQW9CO0VBQ3JELEtBQUssZUFBZSxJQUFJO0VBQ3hCLEtBQUssaUJBQWlCLElBQUk7Q0FDOUI7Q0FFQSxpQkFBeUIsT0FBNEI7RUFDakQsSUFBSSxVQUFVLE1BQU07R0FDaEIsTUFBTSxRQUFRLE9BQU8sS0FBSyxPQUFPLE1BQU07R0FDdkMsSUFBSSxLQUFLLFdBQ0wsS0FBSyxJQUFJLG9CQUFvQixPQUFPLFdBQVcsS0FBSyxDQUFDO1FBRXJELEtBQUssZ0JBQWdCLE9BQU8sV0FBVyxLQUFLLENBQUM7R0FHakQsS0FBSyxJQUFJLE1BQU0sS0FB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