react-image-markup
Version:
Markup Image with ReactJS (customizable)
370 lines (310 loc) • 46.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.uploadImage = exports.saveImage = exports.clear = exports.setBackgroundImage = exports.toDataUrl = exports.undo = exports.redo = exports.applyCropping = exports.set = exports.drag = exports.changeColor = exports.canvasInit = exports.getCurrentColor = void 0;
var _fabric = require("fabric");
var _canvasHistory = _interopRequireDefault(require("../../assets/js/canvasHistory"));
var _shape = _interopRequireDefault(require("../../assets/js/shape"));
var _text = _interopRequireDefault(require("../../assets/js/text"));
var _arrow = _interopRequireDefault(require("../../assets/js/arrow"));
var _crop = _interopRequireDefault(require("../../assets/js/crop"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
var history = [];
var objects = [];
var customParams = {};
var state = {
color: "#000",
fontSize: 32,
strokeWidth: 7,
currentTool: null
};
var canvas;
var getCurrentColor = function getCurrentColor() {
return state.color;
};
exports.getCurrentColor = getCurrentColor;
var canvasInit = function canvasInit(c) {
canvas = new _fabric.fabric.Canvas(c);
canvas.backgroundColor = '#fff';
new _canvasHistory["default"](canvas);
return canvas;
};
exports.canvasInit = canvasInit;
var changeColor = function changeColor(colorProperty) {
state.color = colorProperty;
set(state.currentTool);
};
exports.changeColor = changeColor;
var drag = function drag() {
canvas.isDrawingMode = false;
canvas.forEachObject(function (object) {
object.selectable = true;
object.evented = true;
});
new _arrow["default"](canvas, false);
new _shape["default"](canvas, false);
new _text["default"](canvas, false);
new _crop["default"](canvas, false, false, true);
};
exports.drag = drag;
var set = function set(type, params) {
drag();
state.currentTool = type;
switch (type) {
case "text":
customParams = {
fill: params && params.fill ? params.fill : state.color,
fontFamily: params && params.fontFamily ? params.fontFamily : 'Arial',
fontSize: params && params.fontSize ? params.fontSize : state.fontSize,
placeholder: params && params.placeholder ? params.placeholder : 'Add Text'
};
new _text["default"](canvas, true, customParams);
break;
case "circle":
customParams = {
fill: params && params.fill ? params.fill : 'transparent',
stroke: params && params.stroke ? params.stroke : state.color,
strokeWidth: params && params.strokeWidth ? params.strokeWidth : state.strokeWidth,
disableCircleEditing: params && params.disableCircleEditing ? params.disableCircleEditing : false,
top: params && params.top ? params.top : 0,
left: params && params.left ? params.left : 0,
radius: params && params.radius ? params.radius : 20,
strokeUniform: params && params.strokeUniform ? params.strokeUniform : true,
noScaleCache: params && params.noScaleCache ? params.noScaleCache : false
};
new _shape["default"](canvas, true, type, customParams);
break;
case "rect":
customParams = {
fill: params && params.fill ? params.fill : 'transparent',
stroke: params && params.stroke ? params.stroke : state.color,
strokeWidth: params && params.strokeWidth ? params.strokeWidth : state.strokeWidth,
angle: params && params.angle ? params.angle : 0,
width: params && params.width ? params.width : null,
height: params && params.height ? params.height : null,
top: params && params.top ? params.top : 0,
left: params && params.left ? params.left : 0,
opacity: params && params.opacity ? params.opacity : 1,
strokeUniform: params && params.strokeUniform ? params.strokeUniform : true,
noScaleCache: params && params.noScaleCache ? params.noScaleCache : false
};
new _shape["default"](canvas, true, type, customParams);
break;
case 'selectMode':
drag();
break;
case 'arrow':
customParams = {
fill: params && params.fill ? params.fill : 'transparent',
stroke: params && params.stroke ? params.stroke : state.color,
strokeWidth: params && params.strokeWidth ? params.strokeWidth : state.strokeWidth,
strokeUniform: params && params.strokeUniform ? params.strokeUniform : true,
noScaleCache: params && params.noScaleCache ? params.noScaleCache : false
};
new _arrow["default"](canvas, true, customParams);
break;
case 'freeDrawing':
customParams = {
stroke: params && params.stroke ? params.stroke : state.color,
strokeWidth: params && params.strokeWidth ? params.strokeWidth : state.strokeWidth,
drawingMode: params && params.drawingMode ? params.drawingMode : true
};
canvas.isDrawingMode = customParams.drawingMode;
canvas.freeDrawingBrush.color = customParams.stroke;
canvas.freeDrawingBrush.width = customParams.strokeWidth;
canvas.freeDrawingBrush.shadow = new _fabric.fabric.Shadow({
blur: 0,
affectStroke: true,
color: customParams.stroke
});
canvas.on("object:added", function () {
if (canvas.isDrawingMode) {
new _canvasHistory["default"](canvas);
}
});
canvas.renderAll();
break;
case 'crop':
customParams = {
width: params && params.width ? params.width : 200,
height: params && params.height ? params.height : 200,
overlayColor: params && params.overlayColor ? params.overlayColor : "#000",
overlayOpacity: params && params.overlayOpacity ? params.overlayOpacity : 0.7,
transparentCorner: params && params.transparentCorner ? params.transparentCorner : false,
hasRotatingPoint: params && params.hasRotatingPoint ? params.hasRotatingPoint : false,
hasControls: params && params.hasControls ? params.hasControls : true,
cornerSize: params && params.cornerSize ? params.cornerSize : 10,
borderColor: params && params.borderColor ? params.borderColor : "#000",
cornerColor: params && params.cornerColor ? params.cornerColor : "#000",
cornerStyle: params && params.cornerStyle ? params.cornerStyle : "circle"
};
state.currentTool = 'selectMode';
new _crop["default"](canvas, true, false, false, customParams);
break;
default:
}
};
exports.set = set;
var applyCropping = function applyCropping() {
new _crop["default"](canvas, true, true);
drag();
};
exports.applyCropping = applyCropping;
var redo = function redo() {
drag();
if (objects.length > 0) {
if (objects[objects.length - 1] && objects[objects.length - 1].croppedImage) {
JSON.parse(JSON.stringify(objects[objects.length - 1]));
canvas.loadFromJSON(objects[objects.length - 1].json);
setBackgroundImage(objects[objects.length - 1].croppedImage);
new _canvasHistory["default"](false, false, objects.pop());
} else {
canvas.loadFromJSON(objects[objects.length - 1]);
new _canvasHistory["default"](false, false, objects.pop());
}
}
};
exports.redo = redo;
var undo = function undo() {
if (canvas.getActiveObject()) {
canvas.discardActiveObject().renderAll();
}
drag();
history = new _canvasHistory["default"]();
if (history.length) {
objects.push(history.pop());
if (history[history.length - 1] && history[history.length - 1].croppedImage) {
JSON.parse(JSON.stringify(history[history.length - 1]));
canvas.loadFromJSON(history[history.length - 1].json);
setBackgroundImage(history[history.length - 1].croppedImage);
} else {
canvas.loadFromJSON(history[history.length - 1]);
canvas.renderAll();
}
}
};
exports.undo = undo;
var toDataUrl = function toDataUrl(url, callback) {
var xhr = new XMLHttpRequest();
xhr.onload = function () {
var reader = new FileReader();
reader.onloadend = function () {
callback(reader.result);
};
reader.readAsDataURL(xhr.response);
};
xhr.open('GET', url);
xhr.responseType = 'blob';
xhr.send();
};
exports.toDataUrl = toDataUrl;
var setBackgroundImage = function setBackgroundImage(imageUrl) {
var img = new Image();
toDataUrl(imageUrl, function (dataUri) {
img.src = dataUri;
if (canvas.width <= img.width || canvas.height <= img.height) {
var canvasAspect = canvas.width / canvas.height;
var imgAspect = img.width / img.height;
var updatedLeft, updatedTop, scaleFactor;
if (canvasAspect >= imgAspect) {
scaleFactor = canvas.width / img.width;
updatedLeft = 0;
updatedTop = -(img.height * scaleFactor - canvas.height) / 2;
} else {
scaleFactor = canvas.height / img.height;
updatedTop = 0;
updatedLeft = -(img.width * scaleFactor - canvas.width) / 2;
}
img.width = canvas.width;
img.height = canvas.height;
canvas.setBackgroundImage(dataUri, canvas.renderAll.bind(canvas), {
top: updatedTop,
left: updatedLeft,
originX: 'left',
originY: 'top',
scaleX: scaleFactor,
scaleY: scaleFactor
});
canvas.renderAll();
} else {
var center = canvas.getCenter();
canvas.setBackgroundImage(dataUri, canvas.renderAll.bind(canvas), {
top: center.top,
left: center.left,
originX: 'center',
originY: 'center'
});
canvas.renderAll();
}
});
};
exports.setBackgroundImage = setBackgroundImage;
var clear = function clear() {
drag();
canvas.clear();
};
exports.clear = clear;
var saveImage = function saveImage() {
drag();
return canvas.toDataURL('image/jpeg', 1);
};
exports.saveImage = saveImage;
var uploadImage = function uploadImage(e) {
drag();
var reader = new FileReader();
reader.onload = function (event) {
var imgObj = new Image();
imgObj.src = event.target.result;
imgObj.onload = function () {
var image = new _fabric.fabric.Image(imgObj);
if (canvas.width <= image.width || canvas.height <= image.height) {
var canvasAspect = canvas.width / canvas.height;
var imgAspect = image.width / image.height;
var top, left, scaleFactor;
if (canvasAspect >= imgAspect) {
scaleFactor = canvas.height / image.height;
top = 0;
left = -(image.width * scaleFactor - canvas.width) / 2;
} else {
scaleFactor = canvas.width / image.width;
left = 0;
top = -(image.height * scaleFactor - canvas.height) / 2;
}
canvas.clear();
canvas.setBackgroundImage(image, canvas.renderAll.bind(canvas), {
top: top,
left: left,
scaleX: scaleFactor,
scaleY: scaleFactor
});
var croppedImage = {
json: canvas.toJSON(),
croppedImage: canvas.toDataURL()
};
new _canvasHistory["default"](canvas, croppedImage);
canvas.renderAll();
} else {
var center = canvas.getCenter();
canvas.clear();
canvas.setBackgroundImage(image, canvas.renderAll.bind(canvas), {
top: center.top,
left: center.left,
originX: 'center',
originY: 'center'
});
var _croppedImage = {
json: canvas.toJSON(),
croppedImage: canvas.toDataURL()
};
new _canvasHistory["default"](canvas, _croppedImage);
canvas.renderAll();
}
};
};
if (e.target && e.target.files && e.target.files[0]) {
reader.readAsDataURL(e.target.files[0]);
}
};
exports.uploadImage = uploadImage;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hc3NldHMvanMvbWV0aG9kcy5qcyJdLCJuYW1lcyI6WyJoaXN0b3J5Iiwib2JqZWN0cyIsImN1c3RvbVBhcmFtcyIsInN0YXRlIiwiY29sb3IiLCJmb250U2l6ZSIsInN0cm9rZVdpZHRoIiwiY3VycmVudFRvb2wiLCJjYW52YXMiLCJnZXRDdXJyZW50Q29sb3IiLCJjYW52YXNJbml0IiwiYyIsImZhYnJpYyIsIkNhbnZhcyIsImJhY2tncm91bmRDb2xvciIsIkNhbnZhc0hpc3RvcnkiLCJjaGFuZ2VDb2xvciIsImNvbG9yUHJvcGVydHkiLCJzZXQiLCJkcmFnIiwiaXNEcmF3aW5nTW9kZSIsImZvckVhY2hPYmplY3QiLCJvYmplY3QiLCJzZWxlY3RhYmxlIiwiZXZlbnRlZCIsIkFycm93IiwiU2hhcGUiLCJUZXh0IiwiQ3JvcEltYWdlIiwidHlwZSIsInBhcmFtcyIsImZpbGwiLCJmb250RmFtaWx5IiwicGxhY2Vob2xkZXIiLCJzdHJva2UiLCJkaXNhYmxlQ2lyY2xlRWRpdGluZyIsInRvcCIsImxlZnQiLCJyYWRpdXMiLCJzdHJva2VVbmlmb3JtIiwibm9TY2FsZUNhY2hlIiwiYW5nbGUiLCJ3aWR0aCIsImhlaWdodCIsIm9wYWNpdHkiLCJkcmF3aW5nTW9kZSIsImZyZWVEcmF3aW5nQnJ1c2giLCJzaGFkb3ciLCJTaGFkb3ciLCJibHVyIiwiYWZmZWN0U3Ryb2tlIiwib24iLCJyZW5kZXJBbGwiLCJvdmVybGF5Q29sb3IiLCJvdmVybGF5T3BhY2l0eSIsInRyYW5zcGFyZW50Q29ybmVyIiwiaGFzUm90YXRpbmdQb2ludCIsImhhc0NvbnRyb2xzIiwiY29ybmVyU2l6ZSIsImJvcmRlckNvbG9yIiwiY29ybmVyQ29sb3IiLCJjb3JuZXJTdHlsZSIsImFwcGx5Q3JvcHBpbmciLCJyZWRvIiwibGVuZ3RoIiwiY3JvcHBlZEltYWdlIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwibG9hZEZyb21KU09OIiwianNvbiIsInNldEJhY2tncm91bmRJbWFnZSIsInBvcCIsInVuZG8iLCJnZXRBY3RpdmVPYmplY3QiLCJkaXNjYXJkQWN0aXZlT2JqZWN0IiwicHVzaCIsInRvRGF0YVVybCIsInVybCIsImNhbGxiYWNrIiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvbmxvYWQiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwib25sb2FkZW5kIiwicmVzdWx0IiwicmVhZEFzRGF0YVVSTCIsInJlc3BvbnNlIiwib3BlbiIsInJlc3BvbnNlVHlwZSIsInNlbmQiLCJpbWFnZVVybCIsImltZyIsIkltYWdlIiwiZGF0YVVyaSIsInNyYyIsImNhbnZhc0FzcGVjdCIsImltZ0FzcGVjdCIsInVwZGF0ZWRMZWZ0IiwidXBkYXRlZFRvcCIsInNjYWxlRmFjdG9yIiwiYmluZCIsIm9yaWdpblgiLCJvcmlnaW5ZIiwic2NhbGVYIiwic2NhbGVZIiwiY2VudGVyIiwiZ2V0Q2VudGVyIiwiY2xlYXIiLCJzYXZlSW1hZ2UiLCJ0b0RhdGFVUkwiLCJ1cGxvYWRJbWFnZSIsImUiLCJldmVudCIsImltZ09iaiIsInRhcmdldCIsImltYWdlIiwidG9KU09OIiwiZmlsZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUNBLElBQUlBLE9BQU8sR0FBRyxFQUFkO0FBQ0EsSUFBSUMsT0FBTyxHQUFHLEVBQWQ7QUFDQSxJQUFJQyxZQUFZLEdBQUcsRUFBbkI7QUFDQSxJQUFJQyxLQUFLLEdBQUc7QUFDVkMsRUFBQUEsS0FBSyxFQUFFLE1BREc7QUFFVkMsRUFBQUEsUUFBUSxFQUFFLEVBRkE7QUFHVkMsRUFBQUEsV0FBVyxFQUFFLENBSEg7QUFJVkMsRUFBQUEsV0FBVyxFQUFFO0FBSkgsQ0FBWjtBQU1BLElBQUlDLE1BQUo7O0FBQ08sSUFBTUMsZUFBZSxHQUFHLFNBQWxCQSxlQUFrQixHQUFNO0FBQ25DLFNBQU9OLEtBQUssQ0FBQ0MsS0FBYjtBQUNELENBRk07Ozs7QUFHQSxJQUFNTSxVQUFVLEdBQUcs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UCxDQUFxQjBCLENBQUMsQ0FBQ0csTUFBRixDQUFTRyxLQUFULENBQWUsQ0FBZixDQUFyQjtBQUNEO0FBR0YsQ0F0RE0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmYWJyaWMgfSBmcm9tICdmYWJyaWMnO1xyXG5pbXBvcnQgQ2FudmFzSGlzdG9yeSBmcm9tICcuLi8uLi9hc3NldHMvanMvY2FudmFzSGlzdG9yeSdcclxuaW1wb3J0IFNoYXBlIGZyb20gJy4uLy4uL2Fzc2V0cy9qcy9zaGFwZSc7XHJcbmltcG9ydCBUZXh0IGZyb20gJy4uLy4uL2Fzc2V0cy9qcy90ZXh0JztcclxuaW1wb3J0IEFycm93IGZyb20gJy4uLy4uL2Fzc2V0cy9qcy9hcnJvdyc7XHJcbmltcG9ydCBDcm9wSW1hZ2UgZnJvbSAnLi4vLi4vYXNzZXRzL2pzL2Nyb3AnO1xyXG5sZXQgaGlzdG9yeSA9IFtdO1xyXG5sZXQgb2JqZWN0cyA9IFtdO1xyXG5sZXQgY3VzdG9tUGFyYW1zID0ge307XHJcbmxldCBzdGF0ZSA9IHtcclxuICBjb2xvcjogXCIjMDAwXCIsXHJcbiAgZm9udFNpemU6IDMyLFxyXG4gIHN0cm9rZVdpZHRoOiA3LFxyXG4gIGN1cnJlbnRUb29sOiBudWxsXHJcbn07XHJcbmxldCBjYW52YXM7XHJcbmV4cG9ydCBjb25zdCBnZXRDdXJyZW50Q29sb3IgPSAoKSA9PiB7XHJcbiAgcmV0dXJuIHN0YXRlLmNvbG9yO1xyXG59XHJcbmV4cG9ydCBjb25zdCBjYW52YXNJbml0ID0gKGMpID0+IHtcclxuICBjYW52YXMgPSBuZXcgZmFicmljLkNhbnZhcyhjKTtcclxuICBjYW52YXMuYmFja2dyb3VuZENvbG9yID0gJyNmZmYnO1xyXG4gIG5ldyBDYW52YXNIaXN0b3J5KGNhbnZhcyk7XHJcbiAgcmV0dXJuIGNhbnZhcztcclxufVxyXG5leHBvcnQgY29uc3QgY2hhbmdlQ29sb3IgPSAoY29sb3JQcm9wZXJ0eSkgPT4ge1xyXG4gIHN0YXRlLmNvbG9yID0gY29sb3JQcm9wZXJ0eTtcclxuICBzZXQoc3RhdGUuY3VycmVudFRvb2wpXHJcbn1cclxuZXhwb3J0IGNvbnN0IGRyYWcgPSAoKSA9PiB7XHJcbiAgY2FudmFzLmlzRHJhd2luZ01vZGUgPSBmYWxzZTtcclxuICBjYW52YXMuZm9yRWFjaE9iamVjdChvYmplY3QgPT4ge1xyXG4gICAgb2JqZWN0LnNlbGVjdGFibGUgPSB0cnVlO1xyXG4gICAgb2JqZWN0LmV2ZW50ZWQgPSB0cnVlO1xyXG4gIH0pO1xyXG4gIG5ldyBBcnJvdyhjYW52YXMsIGZhbHNlKTtcclxuICBuZXcgU2hhcGUoY2FudmFzLCBmYWxzZSk7XHJcbiAgbmV3IFRleHQoY2FudmFzLCBmYWxzZSk7XHJcbiAgbmV3IENyb3BJbWFnZShjYW52YXMsIGZhbHNlLCBmYWxzZSwgdHJ1ZSlcclxufVxyXG5leHBvcnQgY29uc3Qgc2V0ID0gKHR5cGUsIHBhcmFtcykgPT4ge1xyXG4gIGRyYWcoKTtcclxuICBzdGF0ZS5jdXJyZW50VG9vbCA9IHR5cGU7XHJcbiAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICBjYXNlIFwidGV4dFwiOlxyXG4gICAgICBjdXN0b21QYXJhbXMgPSB7XHJcbiAgICAgICAgZmlsbDogKHBhcmFtcyAmJiBwYXJhbXMuZmlsbCkgPyBwYXJhbXMuZmlsbCA6IHN0YXRlLmNvbG9yLFxyXG4gICAgICAgIGZvbnRGYW1pbHk6IChwYXJhbXMgJiYgcGFyYW1zLmZvbnRGYW1pbHkpID8gcGFyYW1zLmZvbnRGYW1pbHkgOiAnQXJpYWwnLFxyXG4gICAgICAgIGZvbnRTaXplOiAocGFyYW1zICYmIHBhcmFtcy5mb250U2l6ZSkgPyBwYXJhbXMuZm9udFNpemUgOiBzdGF0ZS5mb250U2l6ZSxcclxuICAgICAgICBwbGFjZWhvbGRlcjogKHBhcmFtcyAmJiBwYXJhbXMucGxhY2Vob2xkZXIpID8gcGFyYW1zLnBsYWNlaG9sZGVyIDogJ0FkZCBUZXh0JyxcclxuICAgICAgfTtcclxuICAgICAgbmV3IFRleHQoY2FudmFzLCB0cnVlLCBjdXN0b21QYXJhbXMpO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgXCJjaXJjbGVcIjpcclxuICAgICAgY3VzdG9tUGFyYW1zID0ge1xyXG4gICAgICAgIGZpbGw6IChwYXJhbXMgJiYgcGFyYW1zLmZpbGwpID8gcGFyYW1zLmZpbGwgOiAndHJhbnNwYXJlbnQnLFxyXG4gICAgICAgIHN0cm9rZTogKHBhcmFtcyAmJiBwYXJhbXMuc3Ryb2tlKSA/IHBhcmFtcy5zdHJva2UgOiBzdGF0ZS5jb2xvcixcclxuICAgICAgICBzdHJva2VXaWR0aDogKHBhcmFtcyAmJiBwYXJhbXMuc3Ryb2tlV2lkdGgpID8gcGFyYW1zLnN0cm9rZVdpZHRoIDogc3RhdGUuc3Ryb2tlV2lkdGgsXHJcbiAgICAgICAgZGlzYWJsZUNpcmNsZUVkaXRpbmc6IChwYXJhbXMgJiYgcGFyYW1zLmRpc2FibGVDaXJjbGVFZGl0aW5nKSA/IHBhcmFtcy5kaXNhYmxlQ2lyY2xlRWRpdGluZyA6IGZhbHNlLFxyXG4gICAgICAgIHRvcDogKHBhcmFtcyAmJiBwYXJhbXMudG9wKSA/IHBhcmFtcy50b3AgOiAwLFxyXG4gICAgICAgIGxlZnQ6IChwYXJhbXMgJiYgcGFyYW1zLmxlZnQpID8gcGFyYW1zLmxlZnQgOiAwLFxyXG4gICAgICAgIHJhZGl1czogKHBhcmFtcyAmJiBwYXJhbXMucmFkaXVzKSA/IHBhcmFtcy5yYWRpdXMgOiAyMCxcclxuICAgICAgICBzdHJva2VVbmlmb3JtOiAocGFyYW1zICYmIHBhcmFtcy5zdHJva2VVbmlmb3JtKSA/IHBhcmFtcy5zdHJva2VVbmlmb3JtIDogdHJ1ZSxcclxuICAgICAgICBub1NjYWxlQ2FjaGU6IChwYXJhbXMgJiYgcGFyYW1zLm5vU2NhbGVDYWNoZSkgPyBwYXJhbXMubm9TY2FsZUNhY2hlIDogZmFsc2UsXHJcbiAgICAgIH07XHJcbiAgICAgIG5ldyBTaGFwZShjYW52YXMsIHRydWUsIHR5cGUsIGN1c3RvbVBhcmFtcyk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSBcInJlY3RcIjpcclxuICAgICAgY3VzdG9tUGFyYW1zID0ge1xyXG4gICAgICAgIGZpbGw6IChwYXJhbXMgJiYgcGFyYW1zLmZpbGwpID8gcGFyYW1zLmZpbGwgOiAndHJhbnNwYXJlbnQnLFxyXG4gICAgICAgIHN0cm9rZTogKHBhcmFtcyAmJiBwYXJhbXMuc3Ryb2tlKSA/IHBhcmFtcy5zdHJva2UgOiBzdGF0ZS5jb2xvcixcclxuICAgICAgICBzdHJva2VXaWR0aDogKHBhcmFtcyAmJiBwYXJhbXMuc3Ryb2tlV2lkdGgpID8gcGFyYW1zLnN0cm9rZVdpZHRoIDogc3RhdGUuc3Ryb2tlV2lkdGgsXHJcbiAgICAgICAgYW5nbGU6IChwYXJhbXMgJiYgcGFyYW1zLmFuZ2xlKSA/IHBhcmFtcy5hbmdsZSA6IDAsXHJcbiAgICAgICAgd2lkdGg6IChwYXJhbXMgJiYgcGFyYW1zLndpZHRoKSA/IHBhcmFtcy53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgaGVpZ2h0OiAocGFyYW1zICYmIHBhcmFtcy5oZWlnaHQpID8gcGFyYW1zLmhlaWdodCA6IG51bGwsXHJcbiAgICAgICAgdG9wOiAocGFyYW1zICYmIHBhcmFtcy50b3ApID8gcGFyYW1zLnRvcCA6IDAsXHJcbiAgICAgICAgbGVmdDogKHBhcmFtcyAmJiBwYXJhbXMubGVmdCkgPyBwYXJhbXMubGVmdCA6IDAsXHJcbiAgICAgICAgb3BhY2l0eTogKHBhcmFtcyAmJiBwYXJhbXMub3BhY2l0eSkgPyBwYXJhbXMub3BhY2l0eSA6IDEsXHJcbiAgICAgICAgc3Ryb2tlVW5pZm9ybTogKHBhcmFtcyAmJiBwYXJhbXMuc3Ryb2tlVW5pZm9ybSkgPyBwYXJhbXMuc3Ryb2tlVW5pZm9ybSA6IHRydWUsXHJcbiAgICAgICAgbm9TY2FsZUNhY2hlOiAocGFyYW1zICYmIHBhcmFtcy5ub1NjYWxlQ2FjaGUpID8gcGFyYW1zLm5vU2NhbGVDYWNoZSA6IGZhbHNlLFxyXG4gICAgICB9O1xyXG4gICAgICBuZXcgU2hhcGUoY2FudmFzLCB0cnVlLCB0eXBlLCBjdXN0b21QYXJhbXMpO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgJ3NlbGVjdE1vZGUnOlxyXG4gICAgICBkcmFnKCk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnYXJyb3cnOlxyXG4gICAgICBjdXN0b21QYXJhbXMgPSB7XHJcbiAgICAgICAgZmlsbDogKHBhcmFtcyAmJiBwYXJhbXMuZmlsbCkgPyBwYXJhbXMuZmlsbCA6ICd0cmFuc3BhcmVudCcsXHJcbiAgICAgICAgc3Ryb2tlOiAocGFyYW1zICYmIHBhcmFtcy5zdHJva2UpID8gcGFyYW1zLnN0cm9rZSA6IHN0YXRlLmNvbG9yLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAocGFyYW1zICYmIHBhcmFtcy5zdHJva2VXaWR0aCkgPyBwYXJhbXMuc3Ryb2tlV2lkdGggOiBzdGF0ZS5zdHJva2VXaWR0aCxcclxuICAgICAgICBzdHJva2VVbmlmb3JtOiAocGFyYW1zICYmIHBhcmFtcy5zdHJva2VVbmlmb3JtKSA/IHBhcmFtcy5zdHJva2VVbmlmb3JtIDogdHJ1ZSxcclxuICAgICAgICBub1NjYWxlQ2FjaGU6IChwYXJhbXMgJiYgcGFyYW1zLm5vU2NhbGVDYWNoZSkgPyBwYXJhbXMubm9TY2FsZUNhY2hlIDogZmFsc2UsXHJcbiAgICAgIH07XHJcbiAgICAgIG5ldyBBcnJvdyhjYW52YXMsIHRydWUsIGN1c3RvbVBhcmFtcyk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnZnJlZURyYXdpbmcnOlxyXG4gICAgICBjdXN0b21QYXJhbXMgPSB7XHJcbiAgICAgICAgc3Ryb2tlOiAocGFyYW1zICYmIHBhcmFtcy5zdHJva2UpID8gcGFyYW1zLnN0cm9rZSA6IHN0YXRlLmNvbG9yLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAocGFyYW1zICYmIHBhcmFtcy5zdHJva2VXaWR0aCkgPyBwYXJhbXMuc3Ryb2tlV2lkdGggOiBzdGF0ZS5zdHJva2VXaWR0aCxcclxuICAgICAgICBkcmF3aW5nTW9kZTogKHBhcmFtcyAmJiBwYXJhbXMuZHJhd2luZ01vZGUpID8gcGFyYW1zLmRyYXdpbmdNb2RlIDogdHJ1ZSxcclxuICAgICAgfTtcclxuICAgICAgY2FudmFzLmlzRHJhd2luZ01vZGUgPSBjdXN0b21QYXJhbXMuZHJhd2luZ01vZGU7XHJcbiAgICAgIGNhbnZhcy5mcmVlRHJhd2luZ0JydXNoLmNvbG9yID0gY3VzdG9tUGFyYW1zLnN0cm9rZTtcclxuICAgICAgY2FudmFzLmZyZWVEcmF3aW5nQnJ1c2gud2lkdGggPSBjdXN0b21QYXJhbXMuc3Ryb2tlV2lkdGg7XHJcbiAgICAgIGNhbnZhcy5mcmVlRHJhd2luZ0JydXNoLnNoYWRvdyA9IG5ldyBmYWJyaWMuU2hhZG93KHtcclxuICAgICAgICBibHVyOiAwLFxyXG4gICAgICAgIGFmZmVjdFN0cm9rZTogdHJ1ZSxcclxuICAgICAgICBjb2xvcjogY3VzdG9tUGFyYW1zLnN0cm9rZSxcclxuICAgICAgfSk7XHJcbiAgICAgIGNhbnZhcy5vbihcIm9iamVjdDphZGRlZFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKGNhbnZhcy5pc0RyYXdpbmdNb2RlKSB7XHJcbiAgICAgICAgICBuZXcgQ2FudmFzSGlzdG9yeShjYW52YXMpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBjYW52YXMucmVuZGVyQWxsKCk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnY3JvcCc6XHJcbiAgICAgIGN1c3RvbVBhcmFtcyA9IHtcclxuICAgICAgICB3aWR0aDogKHBhcmFtcyAmJiBwYXJhbXMud2lkdGgpID8gcGFyYW1zLndpZHRoIDogMjAwLFxyXG4gICAgICAgIGhlaWdodDogKHBhcmFtcyAmJiBwYXJhbXMuaGVpZ2h0KSA/IHBhcmFtcy5oZWlnaHQgOiAyMDAsXHJcbiAgICAgICAgb3ZlcmxheUNvbG9yOiAocGFyYW1zICYmIHBhcmFtcy5vdmVybGF5Q29sb3IpID8gcGFyYW1zLm92ZXJsYXlDb2xvciA6IFwiIzAwMFwiLFxyXG4gICAgICAgIG92ZXJsYXlPcGFjaXR5OiAocGFyYW1zICYmIHBhcmFtcy5vdmVybGF5T3BhY2l0eSkgPyBwYXJhbXMub3ZlcmxheU9wYWNpdHkgOiAwLjcsXHJcbiAgICAgICAgdHJhbnNwYXJlbnRDb3JuZXI6IChwYXJhbXMgJiYgcGFyYW1zLnRyYW5zcGFyZW50Q29ybmVyKSA/IHBhcmFtcy50cmFuc3BhcmVudENvcm5lciA6IGZhbHNlLFxyXG4gICAgICAgIGhhc1JvdGF0aW5nUG9pbnQ6IChwYXJhbXMgJiYgcGFyYW1zLmhhc1JvdGF0aW5nUG9pbnQpID8gcGFyYW1zLmhhc1JvdGF0aW5nUG9pbnQgOiBmYWxzZSxcclxuICAgICAgICBoYXNDb250cm9sczogKHBhcmFtcyAmJiBwYXJhbXMuaGFzQ29udHJvbHMpID8gcGFyYW1zLmhhc0NvbnRyb2xzIDogdHJ1ZSxcclxuICAgICAgICBjb3JuZXJTaXplOiAocGFyYW1zICYmIHBhcmFtcy5jb3JuZXJTaXplKSA/IHBhcmFtcy5jb3JuZXJTaXplIDogMTAsXHJcbiAgICAgICAgYm9yZGVyQ29sb3I6IChwYXJhbXMgJiYgcGFyYW1zLmJvcmRlckNvbG9yKSA/IHBhcmFtcy5ib3JkZXJDb2xvciA6IFwiIzAwMFwiLFxyXG4gICAgICAgIGNvcm5lckNvbG9yOiAocGFyYW1zICYmIHBhcmFtcy5jb3JuZXJDb2xvcikgPyBwYXJhbXMuY29ybmVyQ29sb3IgOiBcIiMwMDBcIixcclxuICAgICAgICBjb3JuZXJTdHlsZTogKHBhcmFtcyAmJiBwYXJhbXMuY29ybmVyU3R5bGUpID8gcGFyYW1zLmNvcm5lclN0eWxlIDogXCJjaXJjbGVcIixcclxuICAgICAgfTtcclxuICAgICAgc3RhdGUuY3VycmVudFRvb2wgPSAnc2VsZWN0TW9kZSc7XHJcbiAgICAgIG5ldyBDcm9wSW1hZ2UoY2FudmFzLHRydWUsZmFsc2UsZmFsc2UsY3VzdG9tUGFyYW1zKTtcclxuICBcclxuICAgICAgYnJlYWs7XHJcbiAgICBkZWZhdWx0OlxyXG4gIH1cclxufVxyXG5leHBvcnQgY29uc3QgYXBwbHlDcm9wcGluZyA9ICgpID0+IHtcclxuICBcclxuICBuZXcgQ3JvcEltYWdlKGNhbnZhcywgdHJ1ZSwgdHJ1ZSk7XHJcbiAgZHJhZygpXHJcbn1cclxuZXhwb3J0IGNvbnN0IHJlZG8gPSAoKSA9PiB7XHJcbiAgZHJhZygpO1xyXG4gIGlmIChvYmplY3RzLmxlbmd0aCA+IDApIHtcclxuICAgIGlmIChvYmplY3RzW29iamVjdHMubGVuZ3RoIC0gMV0gJiYgb2JqZWN0c1tvYmplY3RzLmxlbmd0aCAtIDFdLmNyb3BwZWRJbWFnZSkge1xyXG4gICAgICBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iamVjdHNbb2JqZWN0cy5sZW5ndGggLSAxXSkpXHJcbiAgICAgIGNhbnZhcy5sb2FkRnJvbUpTT04ob2JqZWN0c1tvYmplY3RzLmxlbmd0aCAtIDFdLmpzb24pXHJcbiAgICAgIHNldEJhY2tncm91bmRJbWFnZShvYmplY3RzW29iamVjdHMubGVuZ3RoIC0gMV0uY3JvcHBlZEltYWdlKTtcclxuICAgICAgbmV3IENhbnZhc0hpc3RvcnkoZmFsc2UsIGZhbHNlLCBvYmplY3RzLnBvcCgpKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2FudmFzLmxvYWRGcm9tSlNPTihvYmplY3RzW29iamVjdHMubGVuZ3RoIC0gMV0pXHJcbiAgICAgIG5ldyBDYW52YXNIaXN0b3J5KGZhbHNlLCBmYWxzZSwgb2JqZWN0cy5wb3AoKSlcclxuICAgIH1cclxuICB9XHJcbn1cclxuZXhwb3J0IGNvbnN0IHVuZG8gPSAoKSA9PiB7XHJcbiAgaWYgKGNhbnZhcy5nZXRBY3RpdmVPYmplY3QoKSkge1xyXG4gICAgY2FudmFzLmRpc2NhcmRBY3RpdmVPYmplY3QoKS5yZW5kZXJBbGwoKVxyXG4gIH1cclxuICBkcmFnKCk7XHJcbiAgaGlzdG9yeSA9IG5ldyBDYW52YXNIaXN0b3J5KCk7XHJcbiAgaWYgKGhpc3RvcnkubGVuZ3RoKSB7XHJcbiAgICBvYmplY3RzLnB1c2goaGlzdG9yeS5wb3AoKSlcclxuICAgIGlmIChoaXN0b3J5W2hpc3RvcnkubGVuZ3RoIC0gMV0gJiYgaGlzdG9yeVtoaXN0b3J5Lmxlbmd0aCAtIDFdLmNyb3BwZWRJbWFnZSkge1xyXG5cclxuICAgICAgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShoaXN0b3J5W2hpc3RvcnkubGVuZ3RoIC0gMV0pKVxyXG4gICAgICBjYW52YXMubG9hZEZyb21KU09OKGhpc3RvcnlbaGlzdG9yeS5sZW5ndGggLSAxXS5qc29uKVxyXG4gICAgICBzZXRCYWNrZ3JvdW5kSW1hZ2UoaGlzdG9yeVtoaXN0b3J5Lmxlbmd0aCAtIDFdLmNyb3BwZWRJbWFnZSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjYW52YXMubG9hZEZyb21KU09OKGhpc3RvcnlbaGlzdG9yeS5sZW5ndGggLSAxXSlcclxuICAgICAgY2FudmFzLnJlbmRlckFsbCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5leHBvcnQgY29uc3QgdG9EYXRhVXJsID0gKHVybCwgY2FsbGJhY2spID0+IHtcclxuICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgY2FsbGJhY2socmVhZGVyLnJlc3VsdCk7XHJcbiAgICB9XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTCh4aHIucmVzcG9uc2UpO1xyXG4gIH07XHJcbiAgeGhyLm9wZW4oJ0dFVCcsIHVybCk7XHJcbiAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJztcclxuICB4aHIuc2VuZCgpO1xyXG59XHJcbmV4cG9ydCBjb25zdCBzZXRCYWNrZ3JvdW5kSW1hZ2UgPSAoaW1hZ2VVcmwpID0+IHtcclxuICBsZXQgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgdG9EYXRhVXJsKGltYWdlVXJsLCAoZGF0YVVyaSkgPT4ge1xyXG4gICAgaW1nLnNyYyA9IGRhdGFVcmk7XHJcbiAgICBpZiAoY2FudmFzLndpZHRoIDw9IGltZy53aWR0aCB8fCBjYW52YXMuaGVpZ2h0IDw9IGltZy5oZWlnaHQpIHtcclxuICAgICAgbGV0IGNhbnZhc0FzcGVjdCA9IGNhbnZhcy53aWR0aCAvIGNhbnZhcy5oZWlnaHQ7XHJcbiAgICAgIGxldCBpbWdBc3BlY3QgPSBpbWcud2lkdGggLyBpbWcuaGVpZ2h0O1xyXG4gICAgICBsZXQgdXBkYXRlZExlZnQsIHVwZGF0ZWRUb3AsIHNjYWxlRmFjdG9yO1xyXG4gICAgICBpZiAoY2FudmFzQXNwZWN0ID49IGltZ0FzcGVjdCkge1xyXG4gICAgICAgIHNjYWxlRmFjdG9yID0gY2FudmFzLndpZHRoIC8gaW1nLndpZHRoO1xyXG4gICAgICAgIHVwZGF0ZWRMZWZ0ID0gMDtcclxuICAgICAgICB1cGRhdGVkVG9wID0gLSgoaW1nLmhlaWdodCAqIHNjYWxlRmFjdG9yKSAtIGNhbnZhcy5oZWlnaHQpIC8gMjtcclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2NhbGVGYWN0b3IgPSBjYW52YXMuaGVpZ2h0IC8gaW1nLmhlaWdodDtcclxuICAgICAgICB1cGRhdGVkVG9wID0gMDtcclxuICAgICAgICB1cGRhdGVkTGVmdCA9IC0oKGltZy53aWR0aCAqIHNjYWxlRmFjdG9yKSAtIGNhbnZhcy53aWR0aCkgLyAyO1xyXG4gICAgICB9XHJcbiAgICAgIGltZy53aWR0aCA9IGNhbnZhcy53aWR0aDtcclxuICAgICAgaW1nLmhlaWdodCA9IGNhbnZhcy5oZWlnaHQ7XHJcblxyXG4gICAgICBjYW52YXMuc2V0QmFja2dyb3VuZEltYWdlKGRhdGFVcmksIGNhbnZhcy5yZW5kZXJBbGwuYmluZChjYW52YXMpLCB7XHJcbiAgICAgICAgdG9wOiB1cGRhdGVkVG9wLFxyXG4gICAgICAgIGxlZnQ6IHVwZGF0ZWRMZWZ0LFxyXG4gICAgICAgIG9yaWdpblg6ICdsZWZ0JyxcclxuICAgICAgICBvcmlnaW5ZOiAndG9wJyxcclxuICAgICAgICBzY2FsZVg6IHNjYWxlRmFjdG9yLFxyXG4gICAgICAgIHNjYWxlWTogc2NhbGVGYWN0b3JcclxuICAgICAgfSk7XHJcbiAgICAgIGNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBjZW50ZXIgPSBjYW52YXMuZ2V0Q2VudGVyKCk7XHJcbiAgICAgIGNhbnZhcy5zZXRCYWNrZ3JvdW5kSW1hZ2UoZGF0YVVyaSwgY2FudmFzLnJlbmRlckFsbC5iaW5kKGNhbnZhcyksIHtcclxuICAgICAgICB0b3A6IGNlbnRlci50b3AsXHJcbiAgICAgICAgbGVmdDogY2VudGVyLmxlZnQsXHJcbiAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXHJcbiAgICAgICAgb3JpZ2luWTogJ2NlbnRlcidcclxuICAgICAgfSk7XHJcbiAgICAgIGNhbnZhcy5yZW5kZXJBbGwoKVxyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcbmV4cG9ydCBjb25zdCBjbGVhciA9ICgpID0+IHtcclxuICBkcmFnKCk7XHJcbiAgY2FudmFzLmNsZWFyKCk7XHJcbn1cclxuZXhwb3J0IGNvbnN0IHNhdmVJbWFnZSA9ICgpID0+IHtcclxuICBkcmFnKCk7XHJcbiAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCAxKTtcclxufVxyXG5leHBvcnQgY29uc3QgdXBsb2FkSW1hZ2UgPSAoZSkgPT4ge1xyXG4gIGRyYWcoKTtcclxuXHJcbiAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgbGV0IGltZ09iaiA9IG5ldyBJbWFnZSgpO1xyXG4gICAgaW1nT2JqLnNyYyA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XHJcbiAgICBpbWdPYmoub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICBsZXQgaW1hZ2UgPSBuZXcgZmFicmljLkltYWdlKGltZ09iaik7XHJcbiAgICAgIGlmIChjYW52YXMud2lkdGggPD0gaW1hZ2Uud2lkdGggfHwgY2FudmFzLmhlaWdodCA8PSBpbWFnZS5oZWlnaHQpIHtcclxuICAgICAgICBsZXQgY2FudmFzQXNwZWN0ID0gY2FudmFzLndpZHRoIC8gY2FudmFzLmhlaWdodDtcclxuICAgICAgICBsZXQgaW1nQXNwZWN0ID0gaW1hZ2Uud2lkdGggLyBpbWFnZS5oZWlnaHQ7XHJcbiAgICAgICAgbGV0IHRvcCwgbGVmdCwgc2NhbGVGYWN0b3I7XHJcbiAgICAgICAgaWYgKGNhbnZhc0FzcGVjdCA+PSBpbWdBc3BlY3QpIHtcclxuICAgICAgICAgIHNjYWxlRmFjdG9yID0gY2FudmFzLmhlaWdodCAvIGltYWdlLmhlaWdodFxyXG4gICAgICAgICAgdG9wID0gMDtcclxuICAgICAgICAgIGxlZnQgPSAtKChpbWFnZS53aWR0aCAqIHNjYWxlRmFjdG9yKSAtIGNhbnZhcy53aWR0aCkgLyAyO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzY2FsZUZhY3RvciA9IGNhbnZhcy53aWR0aCAvIGltYWdlLndpZHRoO1xyXG4gICAgICAgICAgbGVmdCA9IDA7XHJcbiAgICAgICAgICB0b3AgPSAtKChpbWFnZS5oZWlnaHQgKiBzY2FsZUZhY3RvcikgLSBjYW52YXMuaGVpZ2h0KSAvIDI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhbnZhcy5jbGVhcigpXHJcbiAgICAgICAgY2FudmFzLnNldEJhY2tncm91bmRJbWFnZShpbWFnZSwgY2FudmFzLnJlbmRlckFsbC5iaW5kKGNhbnZhcyksIHtcclxuICAgICAgICAgIHRvcDogdG9wLFxyXG4gICAgICAgICAgbGVmdDogbGVmdCxcclxuICAgICAgICAgIHNjYWxlWDogc2NhbGVGYWN0b3IsXHJcbiAgICAgICAgICBzY2FsZVk6IHNjYWxlRmFjdG9yXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbGV0IGNyb3BwZWRJbWFnZSA9IHsganNvbjogY2FudmFzLnRvSlNPTigpLCBjcm9wcGVkSW1hZ2U6IGNhbnZhcy50b0RhdGFVUkwoKSB9O1xyXG4gICAgICAgIG5ldyBDYW52YXNIaXN0b3J5KGNhbnZhcywgY3JvcHBlZEltYWdlKVxyXG4gICAgICAgIGNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgY2VudGVyID0gY2FudmFzLmdldENlbnRlcigpO1xyXG4gICAgICAgIGNhbnZhcy5jbGVhcigpXHJcbiAgICAgICAgY2FudmFzLnNldEJhY2tncm91bmRJbWFnZShpbWFnZSwgY2FudmFzLnJlbmRlckFsbC5iaW5kKGNhbnZhcyksIHtcclxuICAgICAgICAgIHRvcDogY2VudGVyLnRvcCxcclxuICAgICAgICAgIGxlZnQ6IGNlbnRlci5sZWZ0LFxyXG4gICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXHJcbiAgICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCBjcm9wcGVkSW1hZ2UgPSB7IGpzb246IGNhbnZhcy50b0pTT04oKSwgY3JvcHBlZEltYWdlOiBjYW52YXMudG9EYXRhVVJMKCkgfTtcclxuICAgICAgICBuZXcgQ2FudmFzSGlzdG9yeShjYW52YXMsIGNyb3BwZWRJbWFnZSlcclxuICAgICAgICBjYW52YXMucmVuZGVyQWxsKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gIH1cclxuICBpZiAoZS50YXJnZXQgJiYgZS50YXJnZXQuZmlsZXMgJiYgZS50YXJnZXQuZmlsZXNbMF0pIHtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGUudGFyZ2V0LmZpbGVzWzBdKTtcclxuICB9XHJcblxyXG5cclxufSJdfQ==