docx4js
Version:
javascript docx parser
443 lines (399 loc) • 52.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _officeDocument = require("../officeDocument");
var _officeDocument2 = _interopRequireDefault(_officeDocument);
var _drawml = require("../drawml");
var _drawml2 = _interopRequireDefault(_drawml);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _class = function (_Base) {
_inherits(_class, _Base);
function _class() {
_classCallCheck(this, _class);
return _possibleConstructorReturn(this, (_class.__proto__ || Object.getPrototypeOf(_class)).apply(this, arguments));
}
_createClass(_class, [{
key: "_init",
value: function _init() {
var _this2 = this;
_get(_class.prototype.__proto__ || Object.getPrototypeOf(_class.prototype), "_init", this).call(this);
this._assignRel("styles,numbering,settings".split(","));
if (this.styles) {
(function () {
var $ = _this2.styles;
_this2.styles.prototype.basest = function (selector) {
var current = this;
while (current.length > 0) {
if (current.is(selector)) {
return $(current);
}
current = $.root().find("w\\:style[w\\:styleId=\"" + current.children("w\\:basedOn").attr("w:val") + "\"]");
}
return this.not(this);
};
})();
}
}
}, {
key: "render",
value: function render(createElement) {
var identify = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.constructor.identify.bind(this.constructor);
var styles = void 0,
numbering = void 0;
if (this.styles) styles = this.renderNode(this.styles("w\\:styles").get(0), createElement, identify);
if (this.numbering) numbering = this.renderNode(this.numbering("w\\:numbering").get(0), createElement, identify);
return this.renderNode(this.content("w\\:document").get(0), createElement, identify, { styles: styles, numbering: numbering });
}
}, {
key: "parse",
value: function parse(domHandler) {
var identify = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.constructor.identify.bind(this.constructor);
var doc = {};
var createElement = domHandler.createElement.bind(domHandler);
function _identify() {
var model = identify.apply(undefined, arguments);
if (model && (typeof model === "undefined" ? "undefined" : _typeof(model)) == "object") {
domHandler.emit.apply(domHandler, ["*", model].concat(Array.prototype.slice.call(arguments)));
domHandler.emit.apply(domHandler, [model.type, model].concat(Array.prototype.slice.call(arguments)));
if (domHandler["on" + model.type]) domHandler["on" + model.type].apply(domHandler, [model].concat(Array.prototype.slice.call(arguments)));
}
return model;
}
if (this.styles) doc.styles = this.renderNode(this.styles("w\\:styles").get(0), createElement, _identify);
if (this.numbering) doc.numbering = this.renderNode(this.numbering("w\\:numbering").get(0), createElement, _identify);
doc.document = this.renderNode(this.content("w\\:document").get(0), createElement, _identify);
return doc;
}
}]);
return _class;
}(_officeDocument2.default);
_class.identities = {
document: function document(wXml, officeDocument) {
var $ = officeDocument.content;
var current = null;
var children = $("w\\:sectPr").each(function (i, sect) {
var end = $(sect).closest('w\\:body>*');
sect.content = end.prevUntil(current).toArray().reverse();
if (!end.is(sect)) sect.content.push(end.get(0));
current = end;
}).toArray();
return { type: "document", children: children };
},
sectPr: function sectPr(wXml, officeDocument) {
var hf = function hf(type) {
return wXml.children.filter(function (a) {
return a.name == "w:" + type + "Reference";
}).reduce(function (headers, a) {
headers.set(a.attribs["w:type"], officeDocument.getRel(a.attribs["r:id"]));
return headers;
}, new Map());
};
return {
type: "section",
children: wXml.content,
headers: hf("header"),
footers: hf("footer"),
hasTitlePage: !!wXml.children.find(function (a) {
return a.name == "w:titlePg";
})
};
},
p: function p(wXml, officeDocument) {
var $ = officeDocument.content(wXml);
var type = "p";
var identity = { type: type, pr: wXml.children.find(function (_ref) {
var name = _ref.name;
return name == "w:pPr";
}), children: wXml.children.filter(function (_ref2) {
var name = _ref2.name;
return name != "w:pPr";
}) };
var pPr = $.find("w\\:pPr");
if (pPr.length) {
var styleId = pPr.find("w\\:pStyle").attr("w:val");
var numPr = pPr.children("w\\:numPr");
if (!numPr.length && styleId) {
numPr = officeDocument.styles("w\\:style[w\\:styleId=\"" + styleId + "\"]").basest(":has(w\\:numPr)").find("w\\:numPr");
}
if (numPr.length) {
identity.type = "list";
identity.numId = numPr.find("w\\:numId").attr("w:val");
identity.level = parseInt(numPr.find("w\\:ilvl").attr("w:val") || 0);
}
if (styleId && styleId.startsWith("Heading")) {
var outlineLvl = officeDocument.styles("w\\:style[w\\:styleId=\"" + styleId + "\"]").basest(":has(w\\:outlineLvl)").find("w\\:outlineLvl").attr("w:val");
if (outlineLvl) {
identity.type = "heading";
identity.outline = parseInt(outlineLvl) + 1;
}
}
}
return identity;
},
r: function r(wXml) {
return { type: "r", pr: wXml.children.find(function (_ref3) {
var name = _ref3.name;
return name == "w:rPr";
}), children: wXml.children.filter(function (_ref4) {
var name = _ref4.name;
return name != "w:rPr";
}) };
},
fldChar: function fldChar(wXml) {
return wXml.attribs["w:fldCharType"];
},
inline: function inline(wXml, officeDocument) {
var $ = officeDocument.content(wXml);
var props = $.props(_extends({}, (0, _drawml2.default)(officeDocument), {
__filter: "wp\\:extent,wp\\:effectExtent"
}));
return _extends({
type: "drawing.inline"
}, props, {
children: $.find('a\\:graphic>a\\:graphicData').children().toArray()
});
},
anchor: function anchor(wXml, officeDocument) {
var $ = officeDocument.content(wXml);
var graphicData = $.find('>a\\:graphic>a\\:graphicData');
var type = graphicData.attr("uri").split("/").pop();
var children = graphicData.children().toArray();
if (type == "wordprocessingGroup") children = children[0].children.filter(function (a) {
return a.name.split(":")[0] != "wpg";
});
return { type: "drawing.anchor", children: children };
},
pic: function pic(wXml, officeDocument) {
var $ = officeDocument.$(wXml);
var props = $.props(_extends({}, (0, _drawml2.default)(officeDocument), {
tidy: function tidy(_ref5) {
var spPr = _ref5.spPr,
_ref5$nvPicPr = _ref5.nvPicPr,
_ref5$nvPicPr$cNvPr = _ref5$nvPicPr.cNvPr,
cNvPr = _ref5$nvPicPr$cNvPr === undefined ? {} : _ref5$nvPicPr$cNvPr,
_ref5$nvPicPr$cNvSpPr = _ref5$nvPicPr.cNvSpPr,
cNvSpPr = _ref5$nvPicPr$cNvSpPr === undefined ? {} : _ref5$nvPicPr$cNvSpPr,
_ref5$nvPicPr$nvPr = _ref5$nvPicPr.nvPr,
nvPr = _ref5$nvPicPr$nvPr === undefined ? {} : _ref5$nvPicPr$nvPr,
_ref5$style = _ref5.style;
_ref5$style = _ref5$style === undefined ? {} : _ref5$style;
var _ref5$style$lnRef = _ref5$style.lnRef,
lnRef = _ref5$style$lnRef === undefined ? {} : _ref5$style$lnRef,
_ref5$style$fillRef = _ref5$style.fillRef,
fillRef = _ref5$style$fillRef === undefined ? {} : _ref5$style$fillRef,
_ref5$style$effectRef = _ref5$style.effectRef,
effectRef = _ref5$style$effectRef === undefined ? {} : _ref5$style$effectRef,
others = _objectWithoutProperties(_ref5, ["spPr", "nvPicPr", "style"]);
return _extends({}, lnRef, fillRef, effectRef, spPr, cNvPr, cNvSpPr, nvPr, others);
}
}));
return _extends({}, props, { type: "picture" });
},
wsp: function wsp(wXml, officeDocument) {
var content = "wps\\:txbx";
var $ = officeDocument.$(wXml);
var children = $.children(content).toArray();
var same = function same(keys, fx) {
return keys.reduce(function (fs, k) {
return fs[k] = fx, fs;
}, {});
};
var props = $.props(_extends({}, (0, _drawml2.default)(officeDocument), same("r,t,l,b".split(",").map(function (a) {
return a + "Ins";
}), function (v) {
return officeDocument.doc.emu2Px(v);
}), {
__filter: ":not(" + content + ")",
tidy: function tidy(_ref6) {
var _ref6$cNvSpPr = _ref6.cNvSpPr,
cNvSpPr = _ref6$cNvSpPr === undefined ? {} : _ref6$cNvSpPr,
_ref6$spPr = _ref6.spPr,
spPr = _ref6$spPr === undefined ? {} : _ref6$spPr,
_ref6$style = _ref6.style;
_ref6$style = _ref6$style === undefined ? {} : _ref6$style;
var _ref6$style$lnRef = _ref6$style.lnRef,
lnRef = _ref6$style$lnRef === undefined ? {} : _ref6$style$lnRef,
_ref6$style$fillRef = _ref6$style.fillRef,
fillRef = _ref6$style$fillRef === undefined ? {} : _ref6$style$fillRef,
_ref6$style$effectRef = _ref6$style.effectRef,
effectRef = _ref6$style$effectRef === undefined ? {} : _ref6$style$effectRef,
_ref6$style$fontRef = _ref6$style.fontRef,
fontRef = _ref6$style$fontRef === undefined ? {} : _ref6$style$fontRef,
others = _objectWithoutProperties(_ref6, ["cNvSpPr", "spPr", "style"]);
return _extends({}, cNvSpPr, lnRef, fillRef, effectRef, spPr, { textStyle: fontRef }, others);
}
}));
return _extends({}, props, { type: "shape", children: children });
},
Fallback: function Fallback() {
return null;
},
sdt: function sdt(wXml, officeDocument) {
var $ = officeDocument.content(wXml);
var pr = $.find('>w\\:sdtPr');
var content = $.find('>w\\:sdtContent');
var children = content.children().toArray();
var elBinding = pr.find('w\\:dataBinding').get(0);
if (elBinding) {
//properties
var path = elBinding.attribs['w:xpath'],
d = path.split(/[\/\:\[]/),
name = (d.pop(), d.pop());
var value = content.text();
return { type: "property", name: name, value: value, children: children };
} else {
var _ret2 = function () {
//controls
var prChildren = pr.get(0).children;
var elType = prChildren[prChildren.length - 1];
var name = elType.name.split(":").pop();
var type = "text,picture,docPartList,docPartObj,comboBox,dropDownList,date,checkbox,repeatingSection,repeatingSectionItem".split(",").find(function (a) {
return a == name;
});
var model = { children: children };
if (type) {
model.type = "control." + type;
} else {
//container
if (content.find("w\\:p,w\\:tbl,w\\:tr,w\\:tc").length) {
model.type = "block";
} else {
model.type = "inline";
}
}
$ = officeDocument.content;
switch (model.type) {
case "control.dropDownList":
case "control.comboBox":
{
var _ret3 = function () {
var selected = $(content).text();
model.options = $(elType).find("w\\:listItem").map(function (i, li) {
return {
displayText: li.attribs["w:displayText"],
value: li.attribs["w:value"]
};
}).get();
model.value = (model.options.find(function (a) {
return a.displayText == selected;
}) || {}).value;
return "break";
}();
if (_ret3 === "break") break;
}
case "control.checkbox":
{
var ns = elType.name.split(":")[0];
model.checked = $(elType).find(ns + "\\:checked").attr(ns + ":val") == "1";
break;
}
case "control.text":
if (content.find('w\\:r [w\\:val~=Placeholder]').length == 0) model.value = content.text();
break;
case "control.date":
model.value = new Date($(elType).attr("w:fullDate"));
model.format = $(elType).find("w\\:dateFormat").attr("w:val");
model.locale = $(elType).find("w\\:lid").attr("w:val");
break;
}
return {
v: model
};
}();
if ((typeof _ret2 === "undefined" ? "undefined" : _typeof(_ret2)) === "object") return _ret2.v;
}
},
hyperlink: function hyperlink(wXml, officeDocument) {
if (wXml.attribs["r:id"]) {
var url = officeDocument.getRel(wXml.attribs["r:id"]);
return { type: "hyperlink", url: url };
} else if (wXml.attribs["w:anchor"]) {
return { type: "hyperlink", url: "#" + wXml.attribs["w:anchor"] };
}
},
tbl: function tbl(wXml) {
return wXml.children.reduce(function (state, node) {
switch (node.name) {
case "w:tblPr":
state.pr = node;
break;
case "w:tblGrid":
state.cols = node.children;
break;
default:
state.children.push(node);
}
return state;
}, { type: "tbl", children: [], pr: null, cols: [] });
},
tr: function tr(wXml) {
return wXml.children.reduce(function (state, node) {
switch (node.name) {
case "w:trPr":
state.pr = node;
state.isHeader = !!node.children.find(function (a) {
return a.name == "w:tblHeader";
});
break;
default:
state.children.push(node);
}
return state;
}, { type: "tr", children: [], pr: null });
},
tc: function tc(wXml) {
return wXml.children.reduce(function (state, node) {
switch (node.name) {
case "w:tcPr":
state.pr = node;
break;
default:
state.children.push(node);
}
return state;
}, { type: "tc", children: [], pr: null });
},
altChunk: function altChunk(wXml, officeDocument) {
var rId = wXml.attribs['r:id'];
var data = officeDocument.getRel(rId);
var partName = officeDocument.folder + officeDocument.rels("[Id=" + rId + "]").attr("Target");
var contentType = officeDocument.doc.contentTypes("Override[PartName='" + partName + "']").attr("ContentType");
return { type: "chunk", data: data, contentType: contentType };
},
docDefaults: function docDefaults(wXml) {
return { type: "style" };
},
style: function style(wXml) {
return { type: "style", id: wXml.attribs['w:styleId'] };
},
abstractNum: function abstractNum(wXml) {
return { type: "abstractNum", id: wXml.attribs["w:abstractNumId"] };
},
num: function num(wXml) {
return { type: "num", id: wXml.attribs["w:numId"], abstractNum: wXml.children.find(function (a) {
return a.name == "w:abstractNumId";
}).attribs["w:val"] };
},
latentStyles: function latentStyles() {
return null;
},
object: function object(wXml, officeDocument) {
var ole = officeDocument.content(wXml).find("o\\:OLEObject");
var type = ole.attr("ProgID");
var embed = ole.attr("Type") === "Embed";
var rId = ole.attr("r:id");
return { type: "object", embed: embed, prog: type, data: officeDocument.getRelOleObject(rId) };
}
};
exports.default = _class;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vcGVueG1sL2RvY3gvb2ZmaWNlRG9jdW1lbnQuanMiXSwibmFtZXMiOlsiX2Fzc2lnblJlbCIsInNwbGl0Iiwic3R5bGVzIiwiJCIsInByb3RvdHlwZSIsImJhc2VzdCIsInNlbGVjdG9yIiwiY3VycmVudCIsImxlbmd0aCIsImlzIiwicm9vdCIsImZpbmQiLCJjaGlsZHJlbiIsImF0dHIiLCJub3QiLCJjcmVhdGVFbGVtZW50IiwiaWRlbnRpZnkiLCJjb25zdHJ1Y3RvciIsImJpbmQiLCJudW1iZXJpbmciLCJyZW5kZXJOb2RlIiwiZ2V0IiwiY29udGVudCIsImRvbUhhbmRsZXIiLCJkb2MiLCJfaWRlbnRpZnkiLCJtb2RlbCIsImFyZ3VtZW50cyIsImVtaXQiLCJ0eXBlIiwiZG9jdW1lbnQiLCJpZGVudGl0aWVzIiwid1htbCIsIm9mZmljZURvY3VtZW50IiwiZWFjaCIsImkiLCJzZWN0IiwiZW5kIiwiY2xvc2VzdCIsInByZXZVbnRpbCIsInRvQXJyYXkiLCJyZXZlcnNlIiwicHVzaCIsInNlY3RQciIsImhmIiwiZmlsdGVyIiwiYSIsIm5hbWUiLCJyZWR1Y2UiLCJoZWFkZXJzIiwic2V0IiwiYXR0cmlicyIsImdldFJlbCIsIk1hcCIsImZvb3RlcnMiLCJoYXNUaXRsZVBhZ2UiLCJwIiwiaWRlbnRpdHkiLCJwciIsInBQciIsInN0eWxlSWQiLCJudW1QciIsIm51bUlkIiwibGV2ZWwiLCJwYXJzZUludCIsInN0YXJ0c1dpdGgiLCJvdXRsaW5lTHZsIiwib3V0bGluZSIsInIiLCJmbGRDaGFyIiwiaW5saW5lIiwicHJvcHMiLCJfX2ZpbHRlciIsImFuY2hvciIsImdyYXBoaWNEYXRhIiwicG9wIiwicGljIiwidGlkeSIsInNwUHIiLCJudlBpY1ByIiwiY052UHIiLCJjTnZTcFByIiwibnZQciIsInN0eWxlIiwibG5SZWYiLCJmaWxsUmVmIiwiZWZmZWN0UmVmIiwib3RoZXJzIiwid3NwIiwic2FtZSIsImtleXMiLCJmeCIsImZzIiwiayIsIm1hcCIsImVtdTJQeCIsInYiLCJmb250UmVmIiwidGV4dFN0eWxlIiwiRmFsbGJhY2siLCJzZHQiLCJlbEJpbmRpbmciLCJwYXRoIiwiZCIsInZhbHVlIiwidGV4dCIsInByQ2hpbGRyZW4iLCJlbFR5cGUiLCJzZWxlY3RlZCIsIm9wdGlvbnMiLCJsaSIsImRpc3BsYXlUZXh0IiwibnMiLCJjaGVja2VkIiwiRGF0ZSIsImZvcm1hdCIsImxvY2FsZSIsImh5cGVybGluayIsInVybCIsInRibCIsInN0YXRlIiwibm9kZSIsImNvbHMiLCJ0ciIsImlzSGVhZGVyIiwidGMiLCJhbHRDaHVuayIsInJJZCIsImRhdGEiLCJwYXJ0TmFtZSIsImZvbGRlciIsInJlbHMiLCJjb250ZW50VHlwZSIsImNvbnRlbnRUeXBlcyIsImRvY0RlZmF1bHRzIiwiaWQiLCJhYnN0cmFjdE51bSIsIm51bSIsImxhdGVudFN0eWxlcyIsIm9iamVjdCIsIm9sZSIsImVtYmVkIiwicHJvZyIsImdldFJlbE9sZU9iamVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQUdRO0FBQUE7O0FBQ047QUFDQSxRQUFLQSxVQUFMLENBQWdCLDRCQUE0QkMsS0FBNUIsQ0FBa0MsR0FBbEMsQ0FBaEI7O0FBRUEsT0FBRyxLQUFLQyxNQUFSLEVBQWU7QUFBQTtBQUNkLFNBQUlDLElBQUUsT0FBS0QsTUFBWDtBQUNBLFlBQUtBLE1BQUwsQ0FBWUUsU0FBWixDQUFzQkMsTUFBdEIsR0FBNkIsVUFBU0MsUUFBVCxFQUFrQjtBQUM5QyxVQUFJQyxVQUFRLElBQVo7QUFDQSxhQUFNQSxRQUFRQyxNQUFSLEdBQWUsQ0FBckIsRUFBdUI7QUFDdEIsV0FBR0QsUUFBUUUsRUFBUixDQUFXSCxRQUFYLENBQUgsRUFBd0I7QUFDdkIsZUFBT0gsRUFBRUksT0FBRixDQUFQO0FBQ0E7QUFDREEsaUJBQVFKLEVBQUVPLElBQUYsR0FBU0MsSUFBVCw4QkFBd0NKLFFBQVFLLFFB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MVBLLEVBMFBBO0FBQ2hCLFNBQU8sRUFBQ0gsTUFBSyxhQUFOLEVBQW9CMEcsSUFBR3ZHLEtBQUttQixPQUFMLENBQWEsaUJBQWIsQ0FBdkIsRUFBUDtBQUNBLEVBNVBnQjtBQTZQakJzRixJQTdQaUIsZUE2UGJ6RyxJQTdQYSxFQTZQUjtBQUNSLFNBQU8sRUFBQ0gsTUFBSyxLQUFOLEVBQVkwRyxJQUFHdkcsS0FBS21CLE9BQUwsQ0FBYSxTQUFiLENBQWYsRUFBdUNxRixhQUFZeEcsS0FBS3BCLFFBQUwsQ0FBY0QsSUFBZCxDQUFtQjtBQUFBLFdBQUdtQyxFQUFFQyxJQUFGLElBQVEsaUJBQVg7QUFBQSxJQUFuQixFQUFpREksT0FBakQsQ0FBeUQsT0FBekQsQ0FBbkQsRUFBUDtBQUNBLEVBL1BnQjtBQWdRakJ1RixhQWhRaUIsMEJBZ1FIO0FBQ2IsU0FBTyxJQUFQO0FBQ0EsRUFsUWdCO0FBbVFqQkMsT0FuUWlCLGtCQW1RVjNHLElBblFVLEVBbVFMQyxjQW5RSyxFQW1RVTtBQUMxQixNQUFJMkcsTUFBSTNHLGVBQWVYLE9BQWYsQ0FBdUJVLElBQXZCLEVBQTZCckIsSUFBN0IsQ0FBa0MsZUFBbEMsQ0FBUjtBQUNBLE1BQUlrQixPQUFLK0csSUFBSS9ILElBQUosQ0FBUyxRQUFULENBQVQ7QUFDQSxNQUFJZ0ksUUFBTUQsSUFBSS9ILElBQUosQ0FBUyxNQUFULE1BQW1CLE9BQTdCO0FBQ0EsTUFBSWtILE1BQUlhLElBQUkvSCxJQUFKLENBQVMsTUFBVCxDQUFSO0FBQ0EsU0FBTyxFQUFDZ0IsTUFBSyxRQUFOLEVBQWVnSCxZQUFmLEVBQXNCQyxNQUFNakgsSUFBNUIsRUFBa0NtRyxNQUFLL0YsZUFBZThHLGVBQWYsQ0FBK0JoQixHQUEvQixDQUF2QyxFQUFQO0FBQ0E7QUF6UWdCLEMiLCJmaWxlIjoib2ZmaWNlRG9jdW1lbnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZSBmcm9tIFwiLi4vb2ZmaWNlRG9jdW1lbnRcIlxyXG5pbXBvcnQgZHJhd21sIGZyb20gXCIuLi9kcmF3bWxcIlxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBCYXNle1xyXG5cdF9pbml0KCl7XHJcblx0XHRzdXBlci5faW5pdCgpXHJcblx0XHR0aGlzLl9hc3NpZ25SZWwoXCJzdHlsZXMsbnVtYmVyaW5nLHNldHRpbmdzXCIuc3BsaXQoXCIsXCIpKVxyXG5cclxuXHRcdGlmKHRoaXMuc3R5bGVzKXtcclxuXHRcdFx0bGV0ICQ9dGhpcy5zdHlsZXNcclxuXHRcdFx0dGhpcy5zdHlsZXMucHJvdG90eXBlLmJhc2VzdD1mdW5jdGlvbihzZWxlY3Rvcil7XHJcblx0XHRcdFx0bGV0IGN1cnJlbnQ9dGhpc1xyXG5cdFx0XHRcdHdoaWxlKGN1cnJlbnQubGVuZ3RoPjApe1xyXG5cdFx0XHRcdFx0aWYoY3VycmVudC5pcyhzZWxlY3Rvcikpe1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gJChjdXJyZW50KVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Y3VycmVudD0kLnJvb3QoKS5maW5kKGB3XFxcXDpzdHlsZVt3XFxcXDpzdHlsZUlkPVwiJHtjdXJyZW50LmNoaWxkcmVuKFwid1xcXFw6YmFzZWRPblwiKS5hdHRyKFwidzp2YWxcIil9XCJdYClcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIHRoaXMubm90KHRoaXMpXHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJlbmRlcihjcmVhdGVFbGVtZW50LCBpZGVudGlmeT10aGlzLmNvbnN0cnVjdG9yLmlkZW50aWZ5LmJpbmQodGhpcy5jb25zdHJ1Y3Rvcikpe1xyXG5cdFx0bGV0IHN0eWxlcywgbnVtYmVyaW5nXHJcblx0XHRpZih0aGlzLnN0eWxlcylcclxuXHRcdFx0c3R5bGVzPXRoaXMucmVuZGVyTm9kZSh0aGlzLnN0eWxlcyhcIndcXFxcOnN0eWxlc1wiKS5nZXQoMCksY3JlYXRlRWxlbWVudCxpZGVudGlmeSlcclxuXHRcdGlmKHRoaXMubnVtYmVyaW5nKVxyXG5cdFx0XHRudW1iZXJpbmc9dGhpcy5yZW5kZXJOb2RlKHRoaXMubnVtYmVyaW5nKFwid1xcXFw6bnVtYmVyaW5nXCIpLmdldCgwKSxjcmVhdGVFbGVtZW50LGlkZW50aWZ5KVxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyTm9kZSh0aGlzLmNvbnRlbnQoXCJ3XFxcXDpkb2N1bWVudFwiKS5nZXQoMCksY3JlYXRlRWxlbWVudCwgaWRlbnRpZnksIHtzdHlsZXMsbnVtYmVyaW5nfSlcclxuXHR9XHJcblxyXG5cdHBhcnNlKGRvbUhhbmRsZXIsaWRlbnRpZnk9dGhpcy5jb25zdHJ1Y3Rvci5pZGVudGlmeS5iaW5kKHRoaXMuY29uc3RydWN0b3IpKXtcclxuXHRcdGNvbnN0IGRvYz17fVxyXG5cdFx0Y29uc3QgY3JlYXRlRWxlbWVudD1kb21IYW5kbGVyLmNyZWF0ZUVsZW1lbnQuYmluZChkb21IYW5kbGVyKVxyXG5cdFx0ZnVuY3Rpb24gX2lkZW50aWZ5KCl7XHJcblx0XHRcdGxldCBtb2RlbD1pZGVudGlmeSguLi5hcmd1bWVudHMpXHJcblx0XHRcdGlmKG1vZGVsICYmIHR5cGVvZihtb2RlbCk9PVwib2JqZWN0XCIpe1xyXG5cdFx0XHRcdGRvbUhhbmRsZXIuZW1pdChcIipcIixtb2RlbCwuLi5hcmd1bWVudHMpXHJcblx0XHRcdFx0ZG9tSGFuZGxlci5lbWl0KG1vZGVsLnR5cGUsIG1vZGVsLC4uLmFyZ3VtZW50cylcclxuXHRcdFx0XHRpZihkb21IYW5kbGVyW2BvbiR7bW9kZWwudHlwZX1gXSlcclxuXHRcdFx0XHRcdGRvbUhhbmRsZXJbYG9uJHttb2RlbC50eXBlfWBdKG1vZGVsLC4uLmFyZ3VtZW50cylcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gbW9kZWxcclxuXHRcdH1cclxuXHJcblx0XHRpZih0aGlzLnN0eWxlcylcclxuXHRcdFx0ZG9jLnN0eWxlcz10aGlzLnJlbmRlck5vZGUodGhpcy5zdHlsZXMoXCJ3XFxcXDpzdHlsZXNcIikuZ2V0KDApLGNyZWF0ZUVsZW1lbnQsX2lkZW50aWZ5KVxyXG5cdFx0aWYodGhpcy5udW1iZXJpbmcpXHJcblx0XHRcdGRvYy5udW1iZXJpbmc9dGhpcy5yZW5kZXJOb2RlKHRoaXMubnVtYmVyaW5nKFwid1xcXFw6bnVtYmVyaW5nXCIpLmdldCgwKSxjcmVhdGVFbGVtZW50LF9pZGVudGlmeSlcclxuXHRcdGRvYy5kb2N1bWVudD10aGlzLnJlbmRlck5vZGUodGhpcy5jb250ZW50KFwid1xcXFw6ZG9jdW1lbnRcIikuZ2V0KDApLGNyZWF0ZUVsZW1lbnQsX2lkZW50aWZ5KVxyXG5cdFx0cmV0dXJuIGRvY1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGlkZW50aXRpZXM9e1xyXG5cdFx0ZG9jdW1lbnQod1htbCxvZmZpY2VEb2N1bWVudCl7XHJcblx0XHRcdGxldCAkPW9mZmljZURvY3VtZW50LmNvbnRlbnRcclxuXHRcdFx0bGV0IGN1cnJlbnQ9bnVsbFxyXG5cdFx0XHRsZXQgY2hpbGRyZW49JChcIndcXFxcOnNlY3RQclwiKS5lYWNoKChpLHNlY3QpPT57XHJcblx0XHRcdFx0bGV0IGVuZD0kKHNlY3QpLmNsb3Nlc3QoJ3dcXFxcOmJvZHk+KicpXHJcblx0XHRcdFx0c2VjdC5jb250ZW50PWVuZC5wcmV2VW50aWwoY3VycmVudCkudG9BcnJheSgpLnJldmVyc2UoKVxyXG5cdFx0XHRcdGlmKCFlbmQuaXMoc2VjdCkpXHJcblx0XHRcdFx0XHRzZWN0LmNvbnRlbnQucHVzaChlbmQuZ2V0KDApKVxyXG5cdFx0XHRcdGN1cnJlbnQ9ZW5kXHJcblx0XHRcdH0pLnRvQXJyYXkoKVxyXG5cdFx0XHRyZXR1cm4ge3R5cGU6XCJkb2N1bWVudFwiLCBjaGlsZHJlbn1cclxuXHRcdH0sXHJcblx0XHRzZWN0UHIod1htbCxvZmZpY2VEb2N1bWVudCl7XHJcblx0XHRcdGNvbnN0IGhmPXR5cGU9PndYbWwuY2hpbGRyZW4uZmlsdGVyKGE9PmEubmFtZT09YHc6JHt0eXBlfVJlZmVyZW5jZWApLnJlZHVjZSgoaGVhZGVycyxhKT0+e1xyXG5cdFx0XHRcdFx0aGVhZGVycy5zZXQoYS5hdHRyaWJzW1widzp0eXBlXCJdLG9mZmljZURvY3VtZW50LmdldFJlbChhLmF0dHJpYnNbXCJyOmlkXCJdKSlcclxuXHRcdFx0XHRcdHJldHVybiBoZWFkZXJzXHJcblx0XHRcdFx0fSxuZXcgTWFwKCkpXHJcblxyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdHR5cGU6XCJzZWN0aW9uXCIsXHJcblx0XHRcdFx0Y2hpbGRyZW46d1htbC5jb250ZW50LFxyXG5cdFx0XHRcdGhlYWRlcnM6aGYoXCJoZWFkZXJcIiksXHJcblx0XHRcdFx0Zm9vdGVyczpoZihcImZvb3RlclwiKSxcclxuXHRcdFx0XHRoYXNUaXRsZVBhZ2U6ICEhd1htbC5jaGlsZHJlbi5maW5kKGE9PmEubmFtZT09XCJ3OnRpdGxlUGdcIilcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdHAod1htbCxvZmZpY2VEb2N1bWVudCl7XHJcblx0XHRcdGxldCAkPW9mZmljZURvY3VtZW50LmNvbnRlbnQod1htbClcclxuXHRcdFx0bGV0IHR5cGU9XCJwXCJcclxuXHJcblx0XHRcdGxldCBpZGVudGl0eT17dHlwZSxwcjp3WG1sLmNoaWxkcmVuLmZpbmQoKHtuYW1lfSk9Pm5hbWU9PVwidzpwUHJcIiksY2hpbGRyZW46d1htbC5jaGlsZHJlbi5maWx0ZXIoKHtuYW1lfSk9Pm5hbWUhPVwidzpwUHJcIil9XHJcblxyXG5cdFx0XHRsZXQgcFByPSQuZmluZChcIndcXFxcOnBQclwiKVxyXG5cdFx0XHRpZihwUHIubGVuZ3RoKXtcclxuXHRcdFx0XHRsZXQgc3R5bGVJZD1wUHIuZmluZChcIndcXFxcOnBTdHlsZVwiKS5hdHRyKFwidzp2YWxcIilcclxuXHJcblx0XHRcdFx0bGV0IG51bVByPXBQci5jaGlsZHJlbihcIndcXFxcOm51bVByXCIpXHJcblx0XHRcdFx0aWYoIW51bVByLmxlbmd0aCAmJiBzdHlsZUlkKXtcclxuXHRcdFx0XHRcdG51bVByPW9mZmljZURvY3VtZW50XHJcblx0XHRcdFx0XHRcdC5zdHlsZXMoYHdcXFxcOnN0eWxlW3dcXFxcOnN0eWxlSWQ9XCIke3N0eWxlSWR9XCJdYClcclxuXHRcdFx0XHRcdFx0LmJhc2VzdChgOmhhcyh3XFxcXDpudW1QcilgKVxyXG5cdFx0XHRcdFx0XHQuZmluZChcIndcXFxcOm51bVByXCIpXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZihudW1Qci5sZW5ndGgpe1xyXG5cdFx0XHRcdFx0aWRlbnRpdHkudHlwZT1cImxpc3RcIlxyXG5cdFx0XHRcdFx0aWRlbnRpdHkubnVtSWQ9bnVtUHIuZmluZChcIndcXFxcOm51bUlkXCIpLmF0dHIoXCJ3OnZhbFwiKVxyXG5cdFx0XHRcdFx0aWRlbnRpdHkubGV2ZWw9cGFyc2VJbnQobnVtUHIuZmluZChcIndcXFxcOmlsdmxcIikuYXR0cihcInc6dmFsXCIpfHwwKVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYoc3R5bGVJZCAmJiBzdHlsZUlkLnN0YXJ0c1dpdGgoXCJIZWFkaW5nXCIpKXtcclxuXHRcdFx0XHRcdGxldCBvdXRsaW5lTHZsPW9mZmljZURvY3VtZW50XHJcblx0XHRcdFx0XHRcdC5zdHlsZXMoYHdcXFxcOnN0eWxlW3dcXFxcOnN0eWxlSWQ9XCIke3N0eWxlSWR9XCJdYClcclxuXHRcdFx0XHRcdFx0LmJhc2VzdChcIjpoYXMod1xcXFw6b3V0bGluZUx2bClcIilcclxuXHRcdFx0XHRcdFx0LmZpbmQoXCJ3XFxcXDpvdXRsaW5lTHZsXCIpXHJcblx0XHRcdFx0XHRcdC5hdHRyKFwidzp2YWxcIilcclxuXHRcdFx0XHRcdGlmKG91dGxpbmVMdmwpe1xyXG5cdFx0XHRcdFx0XHRpZGVudGl0eS50eXBlPVwiaGVhZGluZ1wiXHJcblx0XHRcdFx0XHRcdGlkZW50aXR5Lm91dGxpbmU9cGFyc2VJbnQob3V0bGluZUx2bCkrMVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGlkZW50aXR5XHJcblx0XHR9LFxyXG5cdFx0cih3WG1sKXtcclxuXHRcdFx0cmV0dXJuIHt0eXBlOlwiclwiLCBwcjogd1htbC5jaGlsZHJlbi5maW5kKCh7bmFtZX0pPT5uYW1lPT1cInc6clByXCIpLCBjaGlsZHJlbjogd1htbC5jaGlsZHJlbi5maWx0ZXIoKHtuYW1lfSk9Pm5hbWUhPVwidzpyUHJcIil9XHJcblx0XHR9LFxyXG5cdFx0ZmxkQ2hhcih3WG1sKXtcclxuXHRcdFx0cmV0dXJuIHdYbWwuYXR0cmlic1tcInc6ZmxkQ2hhclR5cGVcIl1cclxuXHRcdH0sXHJcblxyXG5cdFx0aW5saW5lKHdYbWwsb2ZmaWNlRG9jdW1lbnQpe1xyXG5cdFx0XHRsZXQgJD1vZmZpY2VEb2N1bWVudC5jb250ZW50KHdYbWwpXHJcblx0XHRcdGNvbnN0IHByb3BzPSQucHJvcHMoe1xyXG5cdFx0XHRcdC4uLmRyYXdtbChvZmZpY2VEb2N1bWVudCksXHJcblx0XHRcdFx0X19maWx0ZXI6XCJ3cFxcXFw6ZXh0ZW50LHdwXFxcXDplZmZlY3RFeHRlbnRcIixcclxuXHRcdFx0fSlcclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHR0eXBlOmBkcmF3aW5nLmlubGluZWAsIFxyXG5cdFx0XHRcdC4uLnByb3BzLFxyXG5cdFx0XHRcdGNoaWxkcmVuOiQuZmluZCgnYVxcXFw6Z3JhcGhpYz5hXFxcXDpncmFwaGljRGF0YScpLmNoaWxkcmVuKCkudG9BcnJheSgpXHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHRhbmNob3Iod1htbCwgb2ZmaWNlRG9jdW1lbnQpe1xyXG5cdFx0XHRsZXQgJD1vZmZpY2VEb2N1bWVudC5jb250ZW50KHdYbWwpXHJcblx0XHRcdGxldCBncmFwaGljRGF0YT0kLmZpbmQoJz5hXFxcXDpncmFwaGljPmFcXFxcOmdyYXBoaWNEYXRhJylcclxuXHRcdFx0bGV0IHR5cGU9Z3JhcGhpY0RhdGEuYXR0cihcInVyaVwiKS5zcGxpdChcIi9cIikucG9wKClcclxuXHRcdFx0bGV0IGNoaWxkcmVuPWdyYXBoaWNEYXRhLmNoaWxkcmVuKCkudG9BcnJheSgpXHJcblx0XHRcdGlmKHR5cGU9PVwid29yZHByb2Nlc3NpbmdHcm91cFwiKVxyXG5cdFx0XHRcdGNoaWxkcmVuPWNoaWxkcmVuWzBdLmNoaWxkcmVuLmZpbHRlcihhPT5hLm5hbWUuc3BsaXQoXCI6XCIpWzBdIT1cIndwZ1wiKVxyXG5cclxuXHRcdFx0cmV0dXJuIHt0eXBlOlwiZHJhd2luZy5hbmNob3JcIixjaGlsZHJlbn1cclxuXHRcdH0sXHJcblxyXG5cdFx0cGljKHdYbWwsIG9mZmljZURvY3VtZW50KXtcclxuXHRcdFx0Y29uc3QgJD1vZmZpY2VEb2N1bWVudC4kKHdYbWwpXHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BzPSQucHJvcHMoe1xyXG4gICAgICAgICAgICAgICAgLi4uZHJhd21sKG9mZmljZURvY3VtZW50KSxcclxuICAgICAgICAgICAgICAgIHRpZHk6KHtzcFByLCBudlBpY1ByOntjTnZQcj17fSxjTnZTcFByPXt9LG52UHI9e319LCBzdHlsZTp7bG5SZWY9e30sZmlsbFJlZj17fSxlZmZlY3RSZWY9e319PXt9LC4uLm90aGVyc30pPT4oey4uLmxuUmVmLC4uLmZpbGxSZWYsIC4uLmVmZmVjdFJlZiwuLi5zcFByLCAuLi5jTnZQciwuLi5jTnZTcFByLC4uLm52UHIsLi4ub3RoZXJzfSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgcmV0dXJuIHsuLi5wcm9wcyx0eXBlOlwicGljdHVyZVwifVxyXG4gICAgICAgIH0sXHJcblxyXG5cdFx0d3NwKHdYbWwsIG9mZmljZURvY3VtZW50KXtcclxuXHRcdFx0Y29uc3QgY29udGVudD1cIndwc1xcXFw6dHhieFwiXHJcblx0XHRcdGNvbnN0ICQ9b2ZmaWNlRG9jdW1lbnQuJCh3WG1sKVxyXG5cdFx0XHRjb25zdCBjaGlsZHJlbj0kLmNoaWxkcmVuKGNvbnRlbnQpLnRvQXJyYXkoKVxyXG5cdFx0XHRjb25zdCBzYW1lPShrZXlzLGZ4KT0+a2V5cy5yZWR1Y2UoKGZzLCBrKT0+KGZzW2tdPWZ4LCBmcykse30pXHJcblxyXG5cdFx0XHRjb25zdCBwcm9wcz0kLnByb3BzKHtcclxuXHRcdFx0XHQuLi5kcmF3bWwob2ZmaWNlRG9jdW1lbnQpLFxyXG5cdFx0XHRcdC4uLnNhbWUoXCJyLHQsbCxiXCIuc3BsaXQoXCIsXCIpLm1hcChhPT5gJHthfUluc2ApLCB2PT5vZmZpY2VEb2N1bWVudC5kb2MuZW11MlB4KHYpKSxcclxuXHRcdFx0XHRfX2ZpbHRlcjpgOm5vdCgke2NvbnRlbnR9KWAsXHJcblx0XHRcdFx0dGlkeTooe2NOdlNwUHI9e30sIHNwUHI9e30sIHN0eWxlOntsblJlZj17fSxmaWxsUmVmPXt9LGVmZmVjdFJlZj17fSxmb250UmVmPXt9fT17fSwuLi5vdGhlcnN9KT0+KHsuLi5jTnZTcFByLCAuLi5sblJlZiwuLi5maWxsUmVmLCAuLi5lZmZlY3RSZWYsIC4uLnNwUHIsIHRleHRTdHlsZTogZm9udFJlZiwgLi4ub3RoZXJzfSlcclxuXHRcdFx0fSlcclxuXHRcdFx0cmV0dXJuIHsuLi5wcm9wcywgdHlwZTpcInNoYXBlXCIsIGNoaWxkcmVufVxyXG5cdFx0fSxcclxuXHRcdEZhbGxiYWNrKCl7XHJcblx0XHRcdHJldHVybiBudWxsXHJcblx0XHR9LFxyXG5cdFx0c2R0KHdYbWwsb2ZmaWNlRG9jdW1lbnQpe1xyXG5cdFx0XHRsZXQgJD1vZmZpY2VEb2N1bWVudC5jb250ZW50KHdYbWwpXHJcblx0XHRcdGxldCBwcj0kLmZpbmQoJz53XFxcXDpzZHRQcicpXHJcblx0XHRcdGxldCBjb250ZW50PSQuZmluZCgnPndcXFxcOnNkdENvbnRlbnQnKVxyXG5cdFx0XHRsZXQgY2hpbGRyZW49Y29udGVudC5jaGlsZHJlbigpLnRvQXJyYXkoKVxyXG5cclxuXHRcdFx0bGV0IGVsQmluZGluZz1wci5maW5kKCd3XFxcXDpkYXRhQmluZGluZycpLmdldCgwKVxyXG5cdFx0XHRpZihlbEJpbmRpbmcpey8vcHJvcGVydGllc1xyXG5cdFx0XHRcdGxldCBwYXRoPWVsQmluZGluZy5hdHRyaWJzWyd3OnhwYXRoJ10sXHJcblx0XHRcdFx0XHRkPXBhdGguc3BsaXQoL1tcXC9cXDpcXFtdLyksXHJcblx0XHRcdFx0XHRuYW1lPShkLnBvcCgpLGQucG9wKCkpO1xyXG5cdFx0XHRcdGxldCB2YWx1ZT1jb250ZW50LnRleHQoKVxyXG5cclxuXHRcdFx0XHRyZXR1cm4ge3R5cGU6XCJwcm9wZXJ0eVwiLCBuYW1lLCB2YWx1ZSwgY2hpbGRyZW59XHJcblx0XHRcdH1lbHNley8vY29udHJvbHNcclxuXHRcdFx0XHRsZXQgcHJDaGlsZHJlbj1wci5nZXQoMCkuY2hpbGRyZW5cclxuXHRcdFx0XHRsZXQgZWxUeXBlPXByQ2hpbGRyZW5bcHJDaGlsZHJlbi5sZW5ndGgtMV1cclxuXHRcdFx0XHRsZXQgbmFtZT1lbFR5cGUubmFtZS5zcGxpdChcIjpcIikucG9wKClcclxuXHRcdFx0XHRsZXQgdHlwZT1cInRleHQscGljdHVyZSxkb2NQYXJ0TGlzdCxkb2NQYXJ0T2JqLGNvbWJvQm94LGRyb3BEb3duTGlzdCxkYXRlLGNoZWNrYm94LHJlcGVhdGluZ1NlY3Rpb24scmVwZWF0aW5nU2VjdGlvbkl0ZW1cIi5zcGxpdChcIixcIilcclxuXHRcdFx0XHRcdC5maW5kKGE9PmE9PW5hbWUpXHJcblx0XHRcdFx0bGV0IG1vZGVsPXtjaGlsZHJlbn1cclxuXHRcdFx0XHRpZih0eXBlKXtcclxuXHRcdFx0XHRcdG1vZGVsLnR5cGU9YGNvbnRyb2wuJHt0eXBlfWBcclxuXHRcdFx0XHR9ZWxzZXsvL2NvbnRhaW5lclxyXG5cdFx0XHRcdFx0aWYoY29udGVudC5maW5kKFwid1xcXFw6cCx3XFxcXDp0Ymwsd1xcXFw6dHIsd1xcXFw6dGNcIikubGVuZ3RoKXtcclxuXHRcdFx0XHRcdFx0bW9kZWwudHlwZT1cImJsb2NrXCJcclxuXHRcdFx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdFx0XHRtb2RlbC50eXBlPVwiaW5saW5lXCJcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdCQ9b2ZmaWNlRG9jdW1lbnQuY29udGVudFxyXG5cdFx0XHRcdHN3aXRjaChtb2RlbC50eXBlKXtcclxuXHRcdFx0XHRcdGNhc2UgXCJjb250cm9sLmRyb3BEb3duTGlzdFwiOlxyXG5cdFx0XHRcdFx0Y2FzZSBcImNvbnRyb2wuY29tYm9Cb3hcIjp7XHJcblx0XHRcdFx0XHRcdGxldCBzZWxlY3RlZD0kKGNvbnRlbnQpLnRleHQoKVxyXG5cdFx0XHRcdFx0XHRtb2RlbC5vcHRpb25zPSQoZWxUeXBlKVxyXG5cdFx0XHRcdFx0XHRcdC5maW5kKFwid1xcXFw6bGlzdEl0ZW1cIilcclxuXHRcdFx0XHRcdFx0XHQubWFwKChpLGxpKT0+e1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZGlzcGxheVRleHQ6IGxpLmF0dHJpYnNbXCJ3OmRpc3BsYXlUZXh0XCJdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogbGkuYXR0cmlic1tcInc6dmFsdWVcIl1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0XHRcdC5nZXQoKVxyXG5cdFx0XHRcdFx0XHRtb2RlbC52YWx1ZT0obW9kZWwub3B0aW9ucy5maW5kKGE9PmEuZGlzcGxheVRleHQ9PXNlbGVjdGVkKXx8e30pLnZhbHVlXHJcblx0XHRcdFx0XHRcdGJyZWFrXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjYXNlIFwiY29udHJvbC5jaGVja2JveFwiOntcclxuXHRcdFx0XHRcdFx0bGV0IG5zPWVsVHlwZS5uYW1lLnNwbGl0KFwiOlwiKVswXVxyXG5cdFx0XHRcdFx0XHRtb2RlbC5jaGVja2VkPSQoZWxUeXBlKS5maW5kKGAke25zfVxcXFw6Y2hlY2tlZGApLmF0dHIoYCR7bnN9OnZhbGApPT1cIjFcIlxyXG5cdFx0XHRcdFx0XHRicmVha1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Y2FzZSBcImNvbnRyb2wudGV4dFwiOlxyXG5cdFx0XHRcdFx0XHRpZihjb250ZW50LmZpbmQoJ3dcXFxcOnIgW3dcXFxcOnZhbH49UGxhY2Vob2xkZXJdJykubGVuZ3RoPT0wKVxyXG5cdFx0XHRcdFx0XHRcdG1vZGVsLnZhbHVlPWNvbnRlbnQudGV4dCgpXHJcblx0XHRcdFx0XHRcdGJyZWFrXHJcblx0XHRcdFx0XHRjYXNlIFwiY29udHJvbC5kYXRlXCI6XHJcblx0XHRcdFx0XHRcdG1vZGVsLnZhbHVlPW5ldyBEYXRlKCQoZWxUeXBlKS5hdHRyKFwidzpmdWxsRGF0ZVwiKSlcclxuXHRcdFx0XHRcdFx0bW9kZWwuZm9ybWF0PSQoZWxUeXBlKS5maW5kKFwid1xcXFw6ZGF0ZUZvcm1hdFwiKS5hdHRyKFwidzp2YWxcIilcclxuXHRcdFx0XHRcdFx0bW9kZWwubG9jYWxlPSQoZWxUeXBlKS5maW5kKFwid1xcXFw6bGlkXCIpLmF0dHIoXCJ3OnZhbFwiKVxyXG5cdFx0XHRcdFx0XHRicmVha1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gbW9kZWxcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdGh5cGVybGluayh3WG1sLG9mZmljZURvY3VtZW50KXtcclxuXHRcdFx0aWYod1htbC5hdHRyaWJzW1wicjppZFwiXSl7XHJcblx0XHRcdFx0bGV0IHVybD1vZmZpY2VEb2N1bWVudC5nZXRSZWwod1htbC5hdHRyaWJzW1wicjppZFwiXSlcclxuXHRcdFx0XHRyZXR1cm4ge3R5cGU6XCJoeXBlcmxpbmtcIiwgdXJsfVxyXG5cdFx0XHR9ZWxzZSBpZih3WG1sLmF0dHJpYnNbXCJ3OmFuY2hvclwiXSl7XHJcblx0XHRcdFx0cmV0dXJuIHt0eXBlOlwiaHlwZXJsaW5rXCIsIHVybDpgIyR7d1htbC5hdHRyaWJzW1widzphbmNob3JcIl19YH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdHRibCh3WG1sKXtcclxuXHRcdFx0cmV0dXJuIHdYbWwuY2hpbGRyZW4ucmVkdWNlKChzdGF0ZSxub2RlKT0+e1xyXG5cdFx0XHRcdHN3aXRjaChub2RlLm5hbWUpe1xyXG5cdFx0XHRcdGNhc2UgXCJ3OnRibFByXCI6XHJcblx0XHRcdFx0XHRzdGF0ZS5wcj1ub2RlXHJcblx0XHRcdFx0YnJlYWtcclxuXHRcdFx0XHRjYXNlIFwidzp0YmxHcmlkXCI6XHJcblx0XHRcdFx0XHRzdGF0ZS5jb2xzPW5vZGUuY2hpbGRyZW5cclxuXHRcdFx0XH