@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
198 lines (193 loc) • 27.8 kB
JavaScript
'use strict';
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
const network_NetworkUtil = require('../../network/NetworkUtil.cjs.cjs');
const utils_skin_SkinAnimation = require('./SkinAnimation.cjs.cjs');
const utils_skin_SkinCape = require('./SkinCape.cjs.cjs');
const utils_skin_SkinImage = require('./SkinImage.cjs.cjs');
const utils_skin_skinPersona_SkinPersona = require('./skin-persona/SkinPersona.cjs.cjs');
const utils_skin_skinPersona_SkinPersonaPiece = require('./skin-persona/SkinPersonaPiece.cjs.cjs');
const utils_skin_skinPersona_SkinPersonaPieceTintColor = require('./skin-persona/SkinPersonaPieceTintColor.cjs.cjs');
class Skin {
id;
playFabId;
resourcePatch;
image;
animations = /* @__PURE__ */ new Set();
cape;
geometry;
animationData;
premium;
persona;
capeOnClassicSkin;
color = "#0";
armSize = "wide";
personaData;
/**
* Full skin ID, computed because
* not sent on JWT.
*/
fullId;
isTrusted = true;
/**
* Loads a skin from a JSON file containing skin data
* using minecraft bedrock login fields.
*
* (loads the skin persona)
*/
static fromJWT(jwt) {
const skin = new Skin();
skin.id = jwt.SkinId;
skin.resourcePatch = Buffer.from(jwt.SkinResourcePatch, "base64").toString();
skin.image = new utils_skin_SkinImage.default({
width: jwt.SkinImageWidth,
height: jwt.SkinImageHeight,
data: Buffer.from(jwt.SkinData, "base64")
});
skin.playFabId = jwt.PlayFabId;
skin.color = jwt.SkinColor;
skin.armSize = jwt.ArmSize;
for (const animation of jwt.AnimatedImageData) {
skin.animations.add(
new utils_skin_SkinAnimation.default({
image: new utils_skin_SkinImage.default({
width: animation.ImageWidth,
height: animation.ImageHeight,
data: Buffer.from(animation.Image, "base64")
}),
frames: animation.Frames,
type: animation.Type,
expression: animation.AnimationExpression
})
);
}
skin.cape = new utils_skin_SkinCape.default({
id: jwt.CapeId,
image: new utils_skin_SkinImage.default({
width: jwt.CapeImageWidth,
height: jwt.CapeImageHeight,
data: Buffer.from(jwt.CapeData, "base64")
})
});
skin.geometry = Buffer.from(jwt.SkinGeometryData, "base64").toString();
skin.animationData = Buffer.from(jwt.SkinAnimationData, "base64").toString();
skin.premium = jwt.PremiumSkin;
skin.persona = jwt.PersonaSkin;
skin.capeOnClassicSkin = jwt.CapeOnClassicSkin;
if (skin.persona) {
skin.personaData = new utils_skin_skinPersona_SkinPersona.default();
for (const personaPiece of jwt.PersonaPieces) {
skin.personaData.getPieces().add(
new utils_skin_skinPersona_SkinPersonaPiece.default({
def: personaPiece.IsDefault,
packId: personaPiece.PackId,
pieceId: personaPiece.PieceId,
pieceType: personaPiece.PieceType,
productId: personaPiece.ProductId
})
);
}
for (const pieceTintColor of jwt.PieceTintColors) {
const tintColor = new utils_skin_skinPersona_SkinPersonaPieceTintColor.default();
tintColor.getColors().push(...pieceTintColor.Colors);
tintColor.setPieceType(pieceTintColor.PieceType);
skin.personaData.getTintColors().add(tintColor);
}
}
skin.fullId = skin.id + skin.getCape().getId();
return skin;
}
networkSerialize(stream) {
network_NetworkUtil.NetworkUtil.writeString(stream, this.getId());
network_NetworkUtil.NetworkUtil.writeString(stream, this.getPlayFabId());
network_NetworkUtil.NetworkUtil.writeString(stream, this.getResourcePatch());
this.getImage().networkSerialize(stream);
stream.writeUnsignedIntLE(this.getAnimations().size);
for (const animation of this.getAnimations()) {
animation.getImage().networkSerialize(stream);
stream.writeUnsignedIntLE(animation.getType());
stream.writeFloatLE(animation.getFrames());
stream.writeUnsignedIntLE(animation.getExpression());
}
this.getCape().getImage().networkSerialize(stream);
network_NetworkUtil.NetworkUtil.writeString(stream, this.getGeometry());
network_NetworkUtil.NetworkUtil.writeString(stream, "0.0.0");
network_NetworkUtil.NetworkUtil.writeString(stream, this.getAnimationData());
network_NetworkUtil.NetworkUtil.writeString(stream, this.getCape().getId());
network_NetworkUtil.NetworkUtil.writeString(stream, this.getFullId());
network_NetworkUtil.NetworkUtil.writeString(stream, this.getArmSize());
network_NetworkUtil.NetworkUtil.writeString(stream, this.getColor());
if (this.isPersona()) {
stream.writeUnsignedIntLE(this.getPersonaData().getPieces().size);
for (const personaPiece of this.getPersonaData().getPieces()) {
network_NetworkUtil.NetworkUtil.writeString(stream, personaPiece.getPieceId());
network_NetworkUtil.NetworkUtil.writeString(stream, personaPiece.getPieceType());
network_NetworkUtil.NetworkUtil.writeString(stream, personaPiece.getPackId());
stream.writeBoolean(personaPiece.isDefault());
network_NetworkUtil.NetworkUtil.writeString(stream, personaPiece.getProductId());
}
stream.writeUnsignedIntLE(this.getPersonaData().getTintColors().size);
for (const tint of this.getPersonaData().getTintColors()) {
network_NetworkUtil.NetworkUtil.writeString(stream, tint.getPieceType());
stream.writeUnsignedIntLE(tint.getColors().length);
for (const color of tint.getColors()) {
network_NetworkUtil.NetworkUtil.writeString(stream, color);
}
}
} else {
stream.writeUnsignedIntLE(0);
stream.writeUnsignedIntLE(0);
}
stream.writeBoolean(this.isPremium());
stream.writeBoolean(this.isPersona());
stream.writeBoolean(this.isCapeOnClassicSkin());
stream.writeBoolean(false);
stream.writeBoolean(true);
}
getId() {
return this.id;
}
getFullId() {
return this.fullId || this.getId() + this.getCape().getId();
}
getPlayFabId() {
return this.playFabId;
}
getResourcePatch() {
return this.resourcePatch;
}
getImage() {
return this.image;
}
getAnimations() {
return this.animations;
}
getAnimationData() {
return this.animationData;
}
isPersona() {
return this.persona;
}
isPremium() {
return this.premium;
}
isCapeOnClassicSkin() {
return this.capeOnClassicSkin;
}
getColor() {
return this.color;
}
getArmSize() {
return this.armSize;
}
getPersonaData() {
return this.personaData;
}
getGeometry() {
return this.geometry;
}
getCape() {
return this.cape;
}
}
exports.default = Skin;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tpbi5janMuY2pzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvc2tpbi9Ta2luLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHsgTmV0d29ya1V0aWwgfSBmcm9tICcuLi8uLi9uZXR3b3JrL05ldHdvcmtVdGlsJztcbmltcG9ydCBTa2luQW5pbWF0aW9uIGZyb20gJy4vU2tpbkFuaW1hdGlvbic7XG5pbXBvcnQgU2tpbkNhcGUgZnJvbSAnLi9Ta2luQ2FwZSc7XG5pbXBvcnQgU2tpbkltYWdlIGZyb20gJy4vU2tpbkltYWdlJztcbmltcG9ydCBTa2luUGVyc29uYSBmcm9tICcuL3NraW4tcGVyc29uYS9Ta2luUGVyc29uYSc7XG5pbXBvcnQgU2tpblBlcnNvbmFQaWVjZSBmcm9tICcuL3NraW4tcGVyc29uYS9Ta2luUGVyc29uYVBpZWNlJztcbmltcG9ydCBTa2luUGVyc29uYVBpZWNlVGludENvbG9yIGZyb20gJy4vc2tpbi1wZXJzb25hL1NraW5QZXJzb25hUGllY2VUaW50Q29sb3InO1xuXG5pbnRlcmZhY2UgSW1hZ2Uge1xuICAgIEltYWdlV2lkdGg6IG51bWJlcjtcbiAgICBJbWFnZUhlaWdodDogbnVtYmVyO1xuICAgIEltYWdlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBBbmltYXRlZEltYWdlRGF0YSBleHRlbmRzIEltYWdlIHtcbiAgICBGcmFtZXM6IG51bWJlcjtcbiAgICBUeXBlOiBudW1iZXI7XG4gICAgQW5pbWF0aW9uRXhwcmVzc2lvbjogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUGVyc29uYVBpZWNlIHtcbiAgICBJc0RlZmF1bHQ6IGJvb2xlYW47XG4gICAgUGFja0lkOiBzdHJpbmc7XG4gICAgUGllY2VJZDogc3RyaW5nO1xuICAgIFBpZWNlVHlwZTogc3RyaW5nO1xuICAgIFByb2R1Y3RJZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUGllY2VUaW50Q29sb3Ige1xuICAgIENvbG9yczogc3RyaW5nW107XG4gICAgUGllY2VUeXBlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBKV1Qge1xuICAgIFNraW5JZDogc3RyaW5nO1xuICAgIENhcGVJZDogc3RyaW5nO1xuICAgIFNraW5SZXNvdXJjZVBhdGNoOiBzdHJpbmc7XG4gICAgUGxheUZhYklkOiBzdHJpbmc7XG4gICAgU2tpbkltYWdlSGVpZ2h0OiBudW1iZXI7XG4gICAgU2tpbkltYWdlV2lkdGg6IG51bWJlcjtcbiAgICBTa2luR2VvbWV0cnlEYXRhOiBzdHJpbmc7XG4gICAgU2tpbkFuaW1hdGlvbkRhdGE6IHN0cmluZztcbiAgICBDYXBlSW1hZ2VIZWlnaHQ6IG51bWJlcjtcbiAgICBDYXBlSW1hZ2VXaWR0aDogbnVtYmVyO1xuICAgIENhcGVPbkNsYXNzaWNTa2luOiBib29sZWFuO1xuICAgIFNraW5EYXRhOiBzdHJpbmc7XG4gICAgQ2FwZURhdGE6IHN0cmluZztcbiAgICBQcmVtaXVtU2tpbjogYm9vbGVhbjtcbiAgICBQZXJzb25hU2tpbjogYm9vbGVhbjtcbiAgICBTa2luQ29sb3I6IHN0cmluZztcbiAgICBBcm1TaXplOiBzdHJpbmc7XG4gICAgQW5pbWF0ZWRJbWFnZURhdGE6IEFuaW1hdGVkSW1hZ2VEYXRhW107XG4gICAgUGVyc29uYVBpZWNlczogUGVyc29uYVBpZWNlW107XG4gICAgUGllY2VUaW50Q29sb3JzOiBQaWVjZVRpbnRDb2xvcltdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTa2luIHtcbiAgICBwcml2YXRlIGlkITogc3RyaW5nO1xuICAgIHByaXZhdGUgcGxheUZhYklkITogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVzb3VyY2VQYXRjaCE6IHN0cmluZztcbiAgICBwcml2YXRlIGltYWdlITogU2tpbkltYWdlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYW5pbWF0aW9uczogU2V0PFNraW5BbmltYXRpb24+ID0gbmV3IFNldCgpO1xuICAgIHByaXZhdGUgY2FwZSE6IFNraW5DYXBlO1xuICAgIHByaXZhdGUgZ2VvbWV0cnkhOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBhbmltYXRpb25EYXRhITogc3RyaW5nO1xuICAgIHByaXZhdGUgcHJlbWl1bSE6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBwZXJzb25hITogYm9vbGVhbjtcbiAgICBwcml2YXRlIGNhcGVPbkNsYXNzaWNTa2luITogYm9vbGVhbjtcbiAgICBwcml2YXRlIGNvbG9yID0gJyMwJztcbiAgICBwcml2YXRlIGFybVNpemUgPSAnd2lkZSc7XG4gICAgcHJpdmF0ZSBwZXJzb25hRGF0YSE6IFNraW5QZXJzb25hO1xuXG4gICAgLyoqXG4gICAgICogRnVsbCBza2luIElELCBjb21wdXRlZCBiZWNhdXNlXG4gICAgICogbm90IHNlbnQgb24gSldULlxuICAgICAqL1xuICAgIHB1YmxpYyBmdWxsSWQhOiBzdHJpbmc7XG4gICAgcHVibGljIGlzVHJ1c3RlZCA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBhIHNraW4gZnJvbSBhIEpTT04gZmlsZSBjb250YWluaW5nIHNraW4gZGF0YVxuICAgICAqIHVzaW5nIG1pbmVjcmFmdCBiZWRyb2NrIGxvZ2luIGZpZWxkcy5cbiAgICAgKlxuICAgICAqIChsb2FkcyB0aGUgc2tpbiBwZXJzb25hKVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUpXVChqd3Q6IEpXVCk6IFNraW4ge1xuICAgICAgICBjb25zdCBza2luID0gbmV3IFNraW4oKTtcblxuICAgICAgICAvLyBSZWFkIHNraW5cbiAgICAgICAgc2tpbi5pZCA9IGp3dC5Ta2luSWQ7XG4gICAgICAgIHNraW4ucmVzb3VyY2VQYXRjaCA9IEJ1ZmZlci5mcm9tKGp3dC5Ta2luUmVzb3VyY2VQYXRjaCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCk7XG4gICAgICAgIHNraW4uaW1hZ2UgPSBuZXcgU2tpbkltYWdlKHtcbiAgICAgICAgICAgIHdpZHRoOiBqd3QuU2tpbkltYWdlV2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGp3dC5Ta2luSW1hZ2VIZWlnaHQsXG4gICAgICAgICAgICBkYXRhOiBCdWZmZXIuZnJvbShqd3QuU2tpbkRhdGEsICdiYXNlNjQnKVxuICAgICAgICB9KTtcbiAgICAgICAgc2tpbi5wbGF5RmFiSWQgPSBqd3QuUGxheUZhYklkO1xuICAgICAgICBza2luLmNvbG9yID0gand0LlNraW5Db2xvcjtcbiAgICAgICAgc2tpbi5hcm1TaXplID0gand0LkFybVNpemU7XG5cbiAgICAgICAgLy8gUmVhZCBhbmltYXRpb25zXG4gICAgICAgIGZvciAoY29uc3QgYW5pbWF0aW9uIG9mIGp3dC5BbmltYXRlZEltYWdlRGF0YSkge1xuICAgICAgICAgICAgc2tpbi5hbmltYXRpb25zLmFkZChcbiAgICAgICAgICAgICAgICBuZXcgU2tpbkFuaW1hdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlOiBuZXcgU2tpbkltYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBhbmltYXRpb24uSW1hZ2VXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogYW5pbWF0aW9uLkltYWdlSGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogQnVmZmVyLmZyb20oYW5pbWF0aW9uLkltYWdlLCAnYmFzZTY0JylcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lczogYW5pbWF0aW9uLkZyYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogYW5pbWF0aW9uLlR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGFuaW1hdGlvbi5BbmltYXRpb25FeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWFkIGNhcGVcbiAgICAgICAgc2tpbi5jYXBlID0gbmV3IFNraW5DYXBlKHtcbiAgICAgICAgICAgIGlkOiBqd3QuQ2FwZUlkLFxuICAgICAgICAgICAgaW1hZ2U6IG5ldyBTa2luSW1hZ2Uoe1xuICAgICAgICAgICAgICAgIHdpZHRoOiBqd3QuQ2FwZUltYWdlV2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBqd3QuQ2FwZUltYWdlSGVpZ2h0LFxuICAgICAgICAgICAgICAgIGRhdGE6IEJ1ZmZlci5mcm9tKGp3dC5DYXBlRGF0YSwgJ2Jhc2U2NCcpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUT0RPOiBtYWtlIGEgY2xhc3MgdG8gbWFuYWdlIGdlb21ldHJ5XG4gICAgICAgIHNraW4uZ2VvbWV0cnkgPSBCdWZmZXIuZnJvbShqd3QuU2tpbkdlb21ldHJ5RGF0YSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy8gVE9ETzogTW9zdCBvZiB0aGUgdGltZXMgaXMgZW1wdHksIGZpZ3VyZSBvdXQgd2hhdCBpcyBpdFxuICAgICAgICBza2luLmFuaW1hdGlvbkRhdGEgPSBCdWZmZXIuZnJvbShqd3QuU2tpbkFuaW1hdGlvbkRhdGEsICdiYXNlNjQnKS50b1N0cmluZygpO1xuXG4gICAgICAgIC8vIFJlYWQgc2tpbiBib29sZWFuIHByb3BlcnRpZXNcbiAgICAgICAgc2tpbi5wcmVtaXVtID0gand0LlByZW1pdW1Ta2luO1xuICAgICAgICBza2luLnBlcnNvbmEgPSBqd3QuUGVyc29uYVNraW47XG4gICAgICAgIHNraW4uY2FwZU9uQ2xhc3NpY1NraW4gPSBqd3QuQ2FwZU9uQ2xhc3NpY1NraW47XG5cbiAgICAgICAgLy8gQXZvaWQgcmVhZGluZyB3aGVuIHNraW4gaXMgbm90IHBlcnNvbmEgdHlwZVxuICAgICAgICBpZiAoc2tpbi5wZXJzb25hKSB7XG4gICAgICAgICAgICBza2luLnBlcnNvbmFEYXRhID0gbmV3IFNraW5QZXJzb25hKCk7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgcGVyc29uYSBwaWVjZXNcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGVyc29uYVBpZWNlIG9mIGp3dC5QZXJzb25hUGllY2VzKSB7XG4gICAgICAgICAgICAgICAgc2tpbi5wZXJzb25hRGF0YS5nZXRQaWVjZXMoKS5hZGQoXG4gICAgICAgICAgICAgICAgICAgIG5ldyBTa2luUGVyc29uYVBpZWNlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZjogcGVyc29uYVBpZWNlLklzRGVmYXVsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tJZDogcGVyc29uYVBpZWNlLlBhY2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpZWNlSWQ6IHBlcnNvbmFQaWVjZS5QaWVjZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGllY2VUeXBlOiBwZXJzb25hUGllY2UuUGllY2VUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdElkOiBwZXJzb25hUGllY2UuUHJvZHVjdElkXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVhZCBwaWVjZSB0aW50IGNvbG9yc1xuICAgICAgICAgICAgZm9yIChjb25zdCBwaWVjZVRpbnRDb2xvciBvZiBqd3QuUGllY2VUaW50Q29sb3JzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGludENvbG9yID0gbmV3IFNraW5QZXJzb25hUGllY2VUaW50Q29sb3IoKTtcbiAgICAgICAgICAgICAgICB0aW50Q29sb3IuZ2V0Q29sb3JzKCkucHVzaCguLi5waWVjZVRpbnRDb2xvci5Db2xvcnMpO1xuICAgICAgICAgICAgICAgIHRpbnRDb2xvci5zZXRQaWVjZVR5cGUocGllY2VUaW50Q29sb3IuUGllY2VUeXBlKTtcbiAgICAgICAgICAgICAgICBza2luLnBlcnNvbmFEYXRhLmdldFRpbnRDb2xvcnMoKS5hZGQodGludENvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXB1dGUgYSBmdWxsIGlkXG4gICAgICAgIHNraW4uZnVsbElkID0gc2tpbi5pZCArIHNraW4uZ2V0Q2FwZSgpLmdldElkKCk7XG4gICAgICAgIHJldHVybiBza2luO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXR3b3JrU2VyaWFsaXplKHN0cmVhbTogQmluYXJ5U3RyZWFtKTogdm9pZCB7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgdGhpcy5nZXRJZCgpKTtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCB0aGlzLmdldFBsYXlGYWJJZCgpKTtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCB0aGlzLmdldFJlc291cmNlUGF0Y2goKSk7XG5cbiAgICAgICAgLy8gU2tpbiBpbWFnZVxuICAgICAgICB0aGlzLmdldEltYWdlKCkubmV0d29ya1NlcmlhbGl6ZShzdHJlYW0pO1xuXG4gICAgICAgIC8vIEFuaW1hdGlvbnNcbiAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRJbnRMRSh0aGlzLmdldEFuaW1hdGlvbnMoKS5zaXplKTtcbiAgICAgICAgZm9yIChjb25zdCBhbmltYXRpb24gb2YgdGhpcy5nZXRBbmltYXRpb25zKCkpIHtcbiAgICAgICAgICAgIGFuaW1hdGlvbi5nZXRJbWFnZSgpLm5ldHdvcmtTZXJpYWxpemUoc3RyZWFtKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkSW50TEUoYW5pbWF0aW9uLmdldFR5cGUoKSk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVGbG9hdExFKGFuaW1hdGlvbi5nZXRGcmFtZXMoKSk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZEludExFKGFuaW1hdGlvbi5nZXRFeHByZXNzaW9uKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FwZSBpbWFnZVxuICAgICAgICB0aGlzLmdldENhcGUoKS5nZXRJbWFnZSgpLm5ldHdvcmtTZXJpYWxpemUoc3RyZWFtKTtcblxuICAgICAgICAvLyBNaXNjZWxsYW5lb3VzXG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgdGhpcy5nZXRHZW9tZXRyeSgpKTtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCAnMC4wLjAnKTsgLy8gZ2VvbWV0cnkgZGF0YSBlbmdpbmUgdmVyc2lvblxuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHRoaXMuZ2V0QW5pbWF0aW9uRGF0YSgpKTtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCB0aGlzLmdldENhcGUoKS5nZXRJZCgpKTtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCB0aGlzLmdldEZ1bGxJZCgpKTtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCB0aGlzLmdldEFybVNpemUoKSk7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgdGhpcy5nZXRDb2xvcigpKTtcblxuICAgICAgICAvLyBIYWNrIHRvIGtlZXAgbGVzcyB1c2VsZXNzIGRhdGEgaW4gc29mdHdhcmVcbiAgICAgICAgaWYgKHRoaXMuaXNQZXJzb25hKCkpIHtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkSW50TEUodGhpcy5nZXRQZXJzb25hRGF0YSgpLmdldFBpZWNlcygpLnNpemUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwZXJzb25hUGllY2Ugb2YgdGhpcy5nZXRQZXJzb25hRGF0YSgpLmdldFBpZWNlcygpKSB7XG4gICAgICAgICAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCBwZXJzb25hUGllY2UuZ2V0UGllY2VJZCgpKTtcbiAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHBlcnNvbmFQaWVjZS5nZXRQaWVjZVR5cGUoKSk7XG4gICAgICAgICAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCBwZXJzb25hUGllY2UuZ2V0UGFja0lkKCkpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZUJvb2xlYW4ocGVyc29uYVBpZWNlLmlzRGVmYXVsdCgpKTtcbiAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIHBlcnNvbmFQaWVjZS5nZXRQcm9kdWN0SWQoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkSW50TEUodGhpcy5nZXRQZXJzb25hRGF0YSgpLmdldFRpbnRDb2xvcnMoKS5zaXplKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGludCBvZiB0aGlzLmdldFBlcnNvbmFEYXRhKCkuZ2V0VGludENvbG9ycygpKSB7XG4gICAgICAgICAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCB0aW50LmdldFBpZWNlVHlwZSgpKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZEludExFKHRpbnQuZ2V0Q29sb3JzKCkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbG9yIG9mIHRpbnQuZ2V0Q29sb3JzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCBjb2xvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRJbnRMRSgwKTsgLy8gUGVyc29uYSBwaWVjZXNcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkSW50TEUoMCk7IC8vIFRpbnQgY29sb3JzXG4gICAgICAgIH1cblxuICAgICAgICBzdHJlYW0ud3JpdGVCb29sZWFuKHRoaXMuaXNQcmVtaXVtKCkpO1xuICAgICAgICBzdHJlYW0ud3JpdGVCb29sZWFuKHRoaXMuaXNQZXJzb25hKCkpO1xuICAgICAgICBzdHJlYW0ud3JpdGVCb29sZWFuKHRoaXMuaXNDYXBlT25DbGFzc2ljU2tpbigpKTtcbiAgICAgICAgc3RyZWFtLndyaXRlQm9vbGVhbihmYWxzZSk7IC8vIElzIHByaW1hcnkgdXNlclxuICAgICAgICBzdHJlYW0ud3JpdGVCb29sZWFuKHRydWUpOyAvLyBJcyBvdmVycmlkZVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RnVsbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bGxJZCB8fCB0aGlzLmdldElkKCkgKyB0aGlzLmdldENhcGUoKS5nZXRJZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQbGF5RmFiSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheUZhYklkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZXNvdXJjZVBhdGNoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlUGF0Y2g7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEltYWdlKCk6IFNraW5JbWFnZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbmltYXRpb25zKCk6IFNldDxTa2luQW5pbWF0aW9uPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuaW1hdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFuaW1hdGlvbkRhdGEoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0aW9uRGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQZXJzb25hKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wZXJzb25hO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1ByZW1pdW0oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZW1pdW07XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ2FwZU9uQ2xhc3NpY1NraW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcGVPbkNsYXNzaWNTa2luO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb2xvcigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QXJtU2l6ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5hcm1TaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQZXJzb25hRGF0YSgpOiBTa2luUGVyc29uYSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBlcnNvbmFEYXRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHZW9tZXRyeSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW9tZXRyeTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2FwZSgpOiBTa2luQ2FwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcGU7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIlNraW5JbWFnZSIsIlNraW5BbmltYXRpb24iLCJTa2luQ2FwZSIsIlNraW5QZXJzb25hIiwiU2tpblBlcnNvbmFQaWVjZSIsIlNraW5QZXJzb25hUGllY2VUaW50Q29sb3IiLCJOZXR3b3JrVXRpbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBeURBLE1BQXFCLElBQUssQ0FBQTtBQUFBLEVBQ2QsRUFBQTtBQUFBLEVBQ0EsU0FBQTtBQUFBLEVBQ0EsYUFBQTtBQUFBLEVBQ0EsS0FBQTtBQUFBLEVBQ1MsVUFBQSx1QkFBcUMsR0FBSSxFQUFBO0FBQUEsRUFDbEQsSUFBQTtBQUFBLEVBQ0EsUUFBQTtBQUFBLEVBQ0EsYUFBQTtBQUFBLEVBQ0EsT0FBQTtBQUFBLEVBQ0EsT0FBQTtBQUFBLEVBQ0EsaUJB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