docx4js-fork
Version:
javascript docx parser
295 lines (260 loc) • 28.6 kB
JavaScript
;
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 _part = require("../part");
var _part2 = _interopRequireDefault(_part);
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; }
exports.default = function (od) {
return _extends({
__filter: ":not(a\\:extLst)",
id: function id() {
return undefined;
}
}, same("latin,ea,cs".split(","), function (_ref) {
var _ref$attribs$typeface = _ref.attribs.typeface,
typeface = _ref$attribs$typeface === undefined ? "" : _ref$attribs$typeface;
return od.theme.font(typeface);
}), same("lumMod,lumOff,tint,shade".split(","), function (_ref2) {
var val = _ref2.attribs.val;
return parseInt(val) / 100000;
}), {
tidy_schemeClr: function tidy_schemeClr(_ref3) {
var val = _ref3.val,
effect = _objectWithoutProperties(_ref3, ["val"]);
return od.doc.asColor(od.theme.color(val), effect);
},
tidy_srgbClr: function tidy_srgbClr(_ref4) {
var val = _ref4.val,
effect = _objectWithoutProperties(_ref4, ["val"]);
return od.doc.asColor(val, effect);
},
tidy_prstClr: function tidy_prstClr(_ref5) {
var val = _ref5.val,
effect = _objectWithoutProperties(_ref5, ["val"]);
return od.doc.asColor(val, effect);
},
sysClr: function sysClr(_ref6) {
var val = _ref6.attribs.val;
return val;
},
tidy_solidFill: function tidy_solidFill(_ref7) {
var color = _ref7.color;
return color;
},
rot: function rot(v) {
return parseInt(v) / 60000;
},
blip: function blip(n) {
var _n$attribs = n.attribs,
embed = _n$attribs["r:embed"],
url = _n$attribs["r:link"];
if (url) return { url: url };
var part = od.$(n).part();
return new _part2.default(part, od.doc).getRel(embed);
},
prstGeom: function prstGeom(x) {
return x.attribs.prst;
},
pathLst: function pathLst(_ref8) {
var children = _ref8.children;
var px = function px(x) {
return od.doc.emu2Px(x);
};
return children.filter(function (a) {
return a.name == "a:path";
}).reduce(function (d, path) {
path.children.filter(function (a) {
return a.name;
}).forEach(function (a) {
switch (a.name.split(":").pop()) {
case 'moveTo':
d.push('M ' + px(a.children[0].attribs.x) + ' ' + px(a.children[0].attribs.y));
break;
case 'lnTo':
d.push('L ' + px(a.children[0].attribs.x) + ' ' + px(a.children[0].attribs.y));
break;
break;
case 'cubicBezTo':
d.push('L ' + px(a.children[0].attribs.x) + ' ' + px(a.children[0].attribs.y));
d.push('Q ' + px(a.children[1].attribs.x) + ' ' + px(a.children[1].attribs.y) + ' ' + px(a.children[2].attribs.x) + ' ' + px(a.children[2].attribs.y));
break;
case 'arcTo':
d.push("A");
break;
case 'close':
d.push('Z');
break;
}
});
return d;
}, []).join(" ");
},
tidy_custGeom: function tidy_custGeom(_ref9) {
var pathLst = _ref9.pathLst;
return pathLst;
},
lvl: function lvl(v) {
return parseInt(v);
},
spcPts: function spcPts(_ref10) {
var val = _ref10.attribs.val;
return od.doc.pt2Px(parseInt(val) / 100);
},
tidy_spcAft: function tidy_spcAft(_ref11) {
var a = _ref11.spcPts;
return a;
},
tidy_spcBef: function tidy_spcBef(_ref12) {
var a = _ref12.spcPts;
return a;
},
buFont: function buFont(_ref13) {
var typeface = _ref13.attribs.typeface;
return od.theme.font(typeface);
},
buChar: function buChar(_ref14) {
var char = _ref14.attribs.char;
return char;
},
buSzPts: function buSzPts(_ref15) {
var val = _ref15.attribs.val;
return od.doc.pt2Px(parseInt(val) / 100);
},
buSzPct: function buSzPct(_ref16) {
var val = _ref16.attribs.val;
return parseInt(val) / 1000 / 100;
},
buAutoNum: function buAutoNum(_ref17) {
var attribs = _ref17.attribs;
return _extends({}, attribs);
},
tidy_buClr: function tidy_buClr(_ref18) {
var color = _ref18.color;
return color;
},
indent: function indent(v) {
return od.doc.emu2Px(v);
},
marL: function marL(v) {
return od.doc.emu2Px(v);
},
lIns: function lIns(v) {
return od.doc.emu2Px(v);
},
rIns: function rIns(v) {
return od.doc.emu2Px(v);
},
bIns: function bIns(v) {
return od.doc.emu2Px(v);
},
tIns: function tIns(v) {
return od.doc.emu2Px(v);
},
ext: function ext(_ref19) {
var _ref19$attribs = _ref19.attribs,
cx = _ref19$attribs.cx,
cy = _ref19$attribs.cy;
return { width: od.doc.emu2Px(cx), height: od.doc.emu2Px(cy) };
},
off: function off(_ref20) {
var _ref20$attribs = _ref20.attribs,
x = _ref20$attribs.x,
y = _ref20$attribs.y;
return { x: od.doc.emu2Px(x), y: od.doc.emu2Px(y) };
},
tidy_xfrm: function tidy_xfrm(_ref21) {
var _ref21$ext = _ref21.ext,
ext = _ref21$ext === undefined ? {} : _ref21$ext,
_ref21$off = _ref21.off,
off = _ref21$off === undefined ? {} : _ref21$off,
transform = _objectWithoutProperties(_ref21, ["ext", "off"]);
return _extends({}, ext, off, transform);
}
}, same("ln,lnB,lnR,lnL,lnT,lnTlToBr,lnBlToTr".split(",").map(function (a) {
return 'tidy_' + a;
}), function (_ref22) {
var w = _ref22.w,
props = _objectWithoutProperties(_ref22, ["w"]);
return _extends({}, props, { w: w ? od.doc.emu2Px(w) : undefined });
}), same("left,right,top,bottom".split(",").map(function (a) {
return 'tidy_' + a;
}), function (_ref23) {
var ln = _ref23.ln;
return ln;
}), {
tidy_tcTxStyle: function tidy_tcTxStyle(_ref24) {
var color = _ref24.color,
props = _objectWithoutProperties(_ref24, ["color"]);
return _extends({}, props, { solidFill: color });
},
tidy_lnRef: function tidy_lnRef(_ref25) {
var idx = _ref25.idx,
ph = _objectWithoutProperties(_ref25, ["idx"]);
return od.theme.lnRef(idx, ph);
},
tidy_fillRef: function tidy_fillRef(_ref26) {
var idx = _ref26.idx,
ph = _objectWithoutProperties(_ref26, ["idx"]);
return od.theme.fillRef(idx, ph);
},
tidy_EffectRef: function tidy_EffectRef(_ref27) {
var idx = _ref27.idx,
ph = _objectWithoutProperties(_ref27, ["idx"]);
return od.theme.effectRef(idx, ph);
},
tidy_fontRef: function tidy_fontRef(_ref28) {
var idx = _ref28.idx,
ph = _objectWithoutProperties(_ref28, ["idx"]);
return od.theme.fontRef(idx, ph);
},
tidy_noAutoFit: function tidy_noAutoFit() {
return undefined;
},
tidy_normAutoFit: function tidy_normAutoFit(props) {
return _extends({ type: "font" }, props);
},
tidy_spAutoFit: function tidy_spAutoFit(props) {
return _extends({ type: "block" }, props);
},
names: {
schemeClr: "color", srgbClr: "color", sysClr: "color", prstClr: "color",
prstGeom: "geometry", custGeom: "geometry",
lnB: "bottom", lnR: "right", lnL: "left", lnT: "top",
rot: "rotate",
spAutoFit: "autofit", normAutoFit: "autofit", noAutoFit: "autofit"
},
inherit: function inherit() {
for (var _len = arguments.length, additions = Array(_len), _key = 0; _key < _len; _key++) {
additions[_key] = arguments[_key];
}
return additions.reduce(function (_ref29, _ref30) {
var _ref30$__filter = _ref30.__filter,
_filter = _ref30$__filter === undefined ? "" : _ref30$__filter,
_ref30$names = _ref30.names,
_names = _ref30$names === undefined ? {} : _ref30$names,
_others = _objectWithoutProperties(_ref30, ["__filter", "names"]);
var _ref29$__filter = _ref29.__filter,
__filter = _ref29$__filter === undefined ? "" : _ref29$__filter,
_ref29$names = _ref29.names,
names = _ref29$names === undefined ? {} : _ref29$names,
others = _objectWithoutProperties(_ref29, ["__filter", "names"]);
return _extends({}, others, _others, {
__filter: [__filter, _filter].filter(function (a) {
return !!a;
}).join(","),
names: _extends({}, names, _names)
});
}, this);
}
});
};
var same = function same(keys, fx) {
return keys.reduce(function (fs, k) {
return fs[k] = fx, fs;
}, {});
};
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vcGVueG1sL2RyYXdtbC9pbmRleC5qcyJdLCJuYW1lcyI6WyJfX2ZpbHRlciIsImlkIiwidW5kZWZpbmVkIiwic2FtZSIsInNwbGl0IiwiYXR0cmlicyIsInR5cGVmYWNlIiwib2QiLCJ0aGVtZSIsImZvbnQiLCJ2YWwiLCJwYXJzZUludCIsInRpZHlfc2NoZW1lQ2xyIiwiZWZmZWN0IiwiZG9jIiwiYXNDb2xvciIsImNvbG9yIiwidGlkeV9zcmdiQ2xyIiwidGlkeV9wcnN0Q2xyIiwic3lzQ2xyIiwidGlkeV9zb2xpZEZpbGwiLCJyb3QiLCJ2IiwiYmxpcCIsIm4iLCJlbWJlZCIsInVybCIsInBhcnQiLCIkIiwiZ2V0UmVsIiwicHJzdEdlb20iLCJ4IiwicHJzdCIsInBhdGhMc3QiLCJjaGlsZHJlbiIsInB4IiwiZW11MlB4IiwiZmlsdGVyIiwiYSIsIm5hbWUiLCJyZWR1Y2UiLCJkIiwicGF0aCIsImZvckVhY2giLCJwb3AiLCJwdXNoIiwieSIsImpvaW4iLCJ0aWR5X2N1c3RHZW9tIiwibHZsIiwic3BjUHRzIiwicHQyUHgiLCJ0aWR5X3NwY0FmdCIsInRpZHlfc3BjQmVmIiwiYnVGb250IiwiYnVDaGFyIiwiY2hhciIsImJ1U3pQdHMiLCJidVN6UGN0IiwiYnVBdXRvTnVtIiwidGlkeV9idUNsciIsImluZGVudCIsIm1hckwiLCJsSW5zIiwicklucyIsImJJbnMiLCJ0SW5zIiwiZXh0IiwiY3giLCJjeSIsIndpZHRoIiwiaGVpZ2h0Iiwib2ZmIiwidGlkeV94ZnJtIiwidHJhbnNmb3JtIiwibWFwIiwidyIsInByb3BzIiwibG4iLCJ0aWR5X3RjVHhTdHlsZSIsInNvbGlkRmlsbCIsInRpZHlfbG5SZWYiLCJpZHgiLCJwaCIsImxuUmVmIiwidGlkeV9maWxsUmVmIiwiZmlsbFJlZiIsInRpZHlfRWZmZWN0UmVmIiwiZWZmZWN0UmVmIiwidGlkeV9mb250UmVmIiwiZm9udFJlZiIsInRpZHlfbm9BdXRvRml0IiwidGlkeV9ub3JtQXV0b0ZpdCIsInR5cGUiLCJ0aWR5X3NwQXV0b0ZpdCIsIm5hbWVzIiwic2NoZW1lQ2xyIiwic3JnYkNsciIsInByc3RDbHIiLCJjdXN0R2VvbSIsImxuQiIsImxuUiIsImxuTCIsImxuVCIsInNwQXV0b0ZpdCIsIm5vcm1BdXRvRml0Iiwibm9BdXRvRml0IiwiaW5oZXJpdCIsImFkZGl0aW9ucyIsIl9maWx0ZXIiLCJfbmFtZXMiLCJfb3RoZXJzIiwib3RoZXJzIiwia2V5cyIsImZ4IiwiZnMiLCJrIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOzs7Ozs7OztrQkFFZTtBQUFBO0FBQ1hBLGtCQUFTLGtCQURFO0FBRVhDLFlBQUc7QUFBQSxtQkFBSUMsU0FBSjtBQUFBO0FBRlEsT0FHUkMsS0FBSyxjQUFjQyxLQUFkLENBQW9CLEdBQXBCLENBQUwsRUFBOEI7QUFBQSx5Q0FBRUMsT0FBRixDQUFXQyxRQUFYO0FBQUEsWUFBV0EsUUFBWCx5Q0FBb0IsRUFBcEI7QUFBQSxlQUEyQkMsR0FBR0MsS0FBSCxDQUFTQyxJQUFULENBQWNILFFBQWQsQ0FBM0I7QUFBQSxLQUE5QixDQUhRLEVBS1JILEtBQUssMkJBQTJCQyxLQUEzQixDQUFpQyxHQUFqQyxDQUFMLEVBQTJDO0FBQUEsWUFBV00sR0FBWCxTQUFFTCxPQUFGLENBQVdLLEdBQVg7QUFBQSxlQUFtQkMsU0FBU0QsR0FBVCxJQUFjLE1BQWpDO0FBQUEsS0FBM0MsQ0FMUTtBQU1YRSx3QkFBZTtBQUFBLGdCQUFFRixHQUFGLFNBQUVBLEdBQUY7QUFBQSxnQkFBU0csTUFBVDs7QUFBQSxtQkFBbUJOLEdBQUdPLEdBQUgsQ0FBT0MsT0FBUCxDQUFlUixHQUFHQyxLQUFILENBQVNRLEtBQVQsQ0FBZU4sR0FBZixDQUFmLEVBQW1DRyxNQUFuQyxDQUFuQjtBQUFBLFNBTko7QUFPWEksc0JBQWE7QUFBQSxnQkFBRVAsR0FBRixTQUFFQSxHQUFGO0FBQUEsZ0JBQVNHLE1BQVQ7O0FBQUEsbUJBQW1CTixHQUFHTyxHQUFILENBQU9DLE9BQVAsQ0FBZUwsR0FB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QWxDLENBQXVDLEdBQXZDLENBSGI7QUFJSWdELHdDQUFVQSxLQUFWLEVBQW9CZSxNQUFwQjtBQUpKO0FBTUgsYUFQTSxFQU9MLElBUEssQ0FBUDtBQVFIO0FBN0dVO0FBQUEsQzs7QUFnSGYsSUFBTTNHLE9BQUssU0FBTEEsSUFBSyxDQUFDOEcsSUFBRCxFQUFNQyxFQUFOO0FBQUEsV0FBV0QsS0FBS3pFLE1BQUwsQ0FBWSxVQUFDMkUsRUFBRCxFQUFLQyxDQUFMO0FBQUEsZUFBVUQsR0FBR0MsQ0FBSCxJQUFNRixFQUFOLEVBQVVDLEVBQXBCO0FBQUEsS0FBWixFQUFvQyxFQUFwQyxDQUFYO0FBQUEsQ0FBWCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQYXJ0IGZyb20gXCIuLi9wYXJ0XCJcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG9kPT4oe1xyXG4gICAgX19maWx0ZXI6XCI6bm90KGFcXFxcOmV4dExzdClcIixcclxuICAgIGlkOigpPT51bmRlZmluZWQsXHJcbiAgICAuLi5zYW1lKFwibGF0aW4sZWEsY3NcIi5zcGxpdChcIixcIiksKHthdHRyaWJzOnt0eXBlZmFjZT1cIlwifX0pPT5vZC50aGVtZS5mb250KHR5cGVmYWNlKSksXHJcbiAgICAvL3N6OnY9Pm9kLmRvYy5wdDJQeChwYXJzZUludCh2KS8xMDApLFxyXG4gICAgLi4uc2FtZShcImx1bU1vZCxsdW1PZmYsdGludCxzaGFkZVwiLnNwbGl0KFwiLFwiKSwoe2F0dHJpYnM6e3ZhbH19KT0+cGFyc2VJbnQodmFsKS8xMDAwMDApLFxyXG4gICAgdGlkeV9zY2hlbWVDbHI6KHt2YWwsLi4uZWZmZWN0fSk9Pm9kLmRvYy5hc0NvbG9yKG9kLnRoZW1lLmNvbG9yKHZhbCksZWZmZWN0KSxcclxuICAgIHRpZHlfc3JnYkNscjooe3ZhbCwuLi5lZmZlY3R9KT0+b2QuZG9jLmFzQ29sb3IodmFsLGVmZmVjdCksXHJcbiAgICB0aWR5X3Byc3RDbHI6KHt2YWwsLi4uZWZmZWN0fSk9Pm9kLmRvYy5hc0NvbG9yKHZhbCxlZmZlY3QpLFxyXG4gICAgc3lzQ2xyOih7YXR0cmliczp7dmFsfX0pPT52YWwsXHJcbiAgICB0aWR5X3NvbGlkRmlsbDooe2NvbG9yfSk9PmNvbG9yLFxyXG4gICAgcm90OnY9PnBhcnNlSW50KHYpLzYwMDAwLFxyXG5cclxuICAgIGJsaXA6bj0+e1xyXG4gICAgICAgIGNvbnN0IHthdHRyaWJzOntcInI6ZW1iZWRcIjplbWJlZCwgXCJyOmxpbmtcIjp1cmx9fT1uXHJcbiAgICAgICAgaWYodXJsKVxyXG4gICAgICAgICAgICByZXR1cm4ge3VybH1cclxuICAgICAgICBjb25zdCBwYXJ0PW9kLiQobikucGFydCgpXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJ0KHBhcnQsb2QuZG9jKS5nZXRSZWwoZW1iZWQpXHJcbiAgICB9LFxyXG5cclxuICAgIHByc3RHZW9tKHgpe1xyXG5cdFx0cmV0dXJuIHguYXR0cmlicy5wcnN0XHJcblx0fSxcclxuXHRwYXRoTHN0KHtjaGlsZHJlbn0pe1xyXG5cdFx0Y29uc3QgcHg9eD0+b2QuZG9jLmVtdTJQeCh4KVxyXG4gICAgICAgIHJldHVybiBjaGlsZHJlbi5maWx0ZXIoYT0+YS5uYW1lPT1cImE6cGF0aFwiKVxyXG4gICAgICAgICAgICAucmVkdWNlKChkLHBhdGgpPT57XHJcbiAgICAgICAgICAgICAgICBwYXRoLmNoaWxkcmVuLmZpbHRlcihhPT5hLm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goYT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goYS5uYW1lLnNwbGl0KFwiOlwiKS5wb3AoKSl7XHJcbiAgICAgICAgICAgIFx0XHRcdGNhc2UgJ21vdmVUbyc6XHJcbiAgICAgICAgICAgIFx0XHRcdFx0ZC5wdXNoKCdNICcrcHgoYS5jaGlsZHJlblswXS5hdHRyaWJzLngpKycgJytweChhLmNoaWxkcmVuWzBdLmF0dHJpYnMueSkpXHJcbiAgICAgICAgICAgIFx0XHRcdFx0YnJlYWtcclxuICAgICAgICAgICAgXHRcdFx0Y2FzZSAnbG5Ubyc6XHJcbiAgICAgICAgICAgIFx0XHRcdFx0ZC5wdXNoKCdMICcrcHgoYS5jaGlsZHJlblswXS5hdHRyaWJzLngpKycgJytweChhLmNoaWxkcmVuWzBdLmF0dHJpYnMueSkpXHJcbiAgICAgICAgICAgIFx0XHRcdFx0YnJlYWtcclxuICAgICAgICAgICAgXHRcdFx0YnJlYWtcclxuICAgICAgICAgICAgXHRcdFx0Y2FzZSAnY3ViaWNCZXpUbyc6XHJcbiAgICAgICAgICAgIFx0XHRcdFx0ZC5wdXNoKCdMICcrcHgoYS5jaGlsZHJlblswXS5hdHRyaWJzLngpKycgJytweChhLmNoaWxkcmVuWzBdLmF0dHJpYnMueSkpXHJcbiAgICAgICAgICAgIFx0XHRcdFx0ZC5wdXNoKCdRICcrcHgoYS5jaGlsZHJlblsxXS5hdHRyaWJzLngpKycgJytweChhLmNoaWxkcmVuWzFdLmF0dHJpYnMueSlcclxuICAgICAgICAgICAgXHRcdFx0XHRcdCsnICcrcHgoYS5jaGlsZHJlblsyXS5hdHRyaWJzLngpKycgJytweChhLmNoaWxkcmVuWzJdLmF0dHJpYnMueSkpXHJcbiAgICAgICAgICAgIFx0XHRcdGJyZWFrXHJcbiAgICAgICAgICAgIFx0XHRcdGNhc2UgJ2FyY1RvJzpcclxuICAgICAgICAgICAgXHRcdFx0XHRkLnB1c2goYEFgKVxyXG4gICAgICAgICAgICBcdFx0XHRicmVha1xyXG4gICAgICAgICAgICBcdFx0XHRjYXNlICdjbG9zZSc6XHJcbiAgICAgICAgICAgIFx0XHRcdFx0ZC5wdXNoKCdaJylcclxuICAgICAgICAgICAgXHRcdFx0YnJlYWtcclxuICAgICAgICAgICAgXHRcdFx0fVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZFxyXG4gICAgICAgICAgICB9LFtdKS5qb2luKFwiIFwiKVxyXG5cdH0sXHJcbiAgICB0aWR5X2N1c3RHZW9tOih7cGF0aExzdH0pPT5wYXRoTHN0LFxyXG5cclxuICAgIGx2bDp2PT5wYXJzZUludCh2KSxcclxuICAgIHNwY1B0czooe2F0dHJpYnM6e3ZhbH19KT0+b2QuZG9jLnB0MlB4KHBhcnNlSW50KHZhbCkvMTAwKSxcclxuICAgIHRpZHlfc3BjQWZ0Oih7c3BjUHRzOmF9KT0+YSxcclxuICAgIHRpZHlfc3BjQmVmOih7c3BjUHRzOmF9KT0+YSxcclxuXHJcbiAgICBidUZvbnQ6KHthdHRyaWJzOnt0eXBlZmFjZX19KT0+b2QudGhlbWUuZm9udCh0eXBlZmFjZSksXHJcbiAgICBidUNoYXI6KHthdHRyaWJzOntjaGFyfX0pPT5jaGFyLFxyXG4gICAgYnVTelB0czooe2F0dHJpYnM6e3ZhbH19KT0+b2QuZG9jLnB0MlB4KHBhcnNlSW50KHZhbCkvMTAwKSxcclxuICAgIGJ1U3pQY3Q6KHthdHRyaWJzOnt2YWx9fSk9PnBhcnNlSW50KHZhbCkvMTAwMC8xMDAsXHJcbiAgICBidUF1dG9OdW06KHthdHRyaWJzfSk9Pih7Li4uYXR0cmlic30pLFxyXG4gICAgdGlkeV9idUNscjooe2NvbG9yfSk9PmNvbG9yLFxyXG5cclxuICAgIGluZGVudDp2PT5vZC5kb2MuZW11MlB4KHYpLFxyXG4gICAgbWFyTDp2PT5vZC5kb2MuZW11MlB4KHYpLFxyXG4gICAgbEluczp2PT5vZC5kb2MuZW11MlB4KHYpLFxyXG4gICAgckluczp2PT5vZC5kb2MuZW11MlB4KHYpLFxyXG4gICAgYkluczp2PT5vZC5kb2MuZW11MlB4KHYpLFxyXG4gICAgdEluczp2PT5vZC5kb2MuZW11MlB4KHYpLFxyXG5cclxuICAgIGV4dDooe2F0dHJpYnM6e2N4LGN5fX0pPT4oe3dpZHRoOm9kLmRvYy5lbXUyUHgoY3gpLGhlaWdodDpvZC5kb2MuZW11MlB4KGN5KX0pLFxyXG4gICAgb2ZmOih7YXR0cmliczp7eCx5fX0pPT4oe3g6b2QuZG9jLmVtdTJQeCh4KSx5Om9kLmRvYy5lbXUyUHgoeSl9KSxcclxuICAgIHRpZHlfeGZybTooe2V4dD17fSxvZmY9e30sIC4uLnRyYW5zZm9ybX0pPT4oey4uLmV4dCwgLi4ub2ZmLCAuLi50cmFuc2Zvcm19KSxcclxuXHJcbiAgICAuLi5zYW1lKFwibG4sbG5CLGxuUixsbkwsbG5ULGxuVGxUb0JyLGxuQmxUb1RyXCIuc3BsaXQoXCIsXCIpLm1hcChhPT4ndGlkeV8nK2EpLCh7dywuLi5wcm9wc30pPT4oey4uLnByb3BzLCB3OncgPyBvZC5kb2MuZW11MlB4KHcpIDogdW5kZWZpbmVkfSkpLFxyXG4gICAgLi4uc2FtZShcImxlZnQscmlnaHQsdG9wLGJvdHRvbVwiLnNwbGl0KFwiLFwiKS5tYXAoYT0+J3RpZHlfJythKSwoe2xufSk9PmxuKSxcclxuICAgIHRpZHlfdGNUeFN0eWxlOih7Y29sb3IsLi4ucHJvcHN9KT0+KHsuLi5wcm9wcywgc29saWRGaWxsOmNvbG9yfSksXHJcblxyXG4gICAgdGlkeV9sblJlZjooe2lkeCwuLi5waH0pPT5vZC50aGVtZS5sblJlZihpZHgscGgpLFxyXG4gICAgdGlkeV9maWxsUmVmOih7aWR4LC4uLnBofSk9Pm9kLnRoZW1lLmZpbGxSZWYoaWR4LHBoKSxcclxuICAgIHRpZHlfRWZmZWN0UmVmOih7aWR4LC4uLnBofSk9Pm9kLnRoZW1lLmVmZmVjdFJlZihpZHgscGgpLFxyXG4gICAgdGlkeV9mb250UmVmOih7aWR4LC4uLnBofSk9Pm9kLnRoZW1lLmZvbnRSZWYoaWR4LHBoKSxcclxuXHJcbiAgICB0aWR5X25vQXV0b0ZpdDooKT0+dW5kZWZpbmVkLFxyXG4gICAgdGlkeV9ub3JtQXV0b0ZpdDpwcm9wcz0+KHt0eXBlOlwiZm9udFwiLC4uLnByb3BzfSksXHJcbiAgICB0aWR5X3NwQXV0b0ZpdDpwcm9wcz0+KHt0eXBlOlwiYmxvY2tcIiwuLi5wcm9wc30pLFxyXG5cclxuICAgIG5hbWVzOntcclxuICAgICAgICBzY2hlbWVDbHI6XCJjb2xvclwiLCBzcmdiQ2xyOlwiY29sb3JcIiwgc3lzQ2xyOlwiY29sb3JcIixwcnN0Q2xyOlwiY29sb3JcIixcclxuICAgICAgICBwcnN0R2VvbTpcImdlb21ldHJ5XCIsIGN1c3RHZW9tOlwiZ2VvbWV0cnlcIixcclxuICAgICAgICBsbkI6XCJib3R0b21cIiwgbG5SOlwicmlnaHRcIiwgbG5MOlwibGVmdFwiLCBsblQ6XCJ0b3BcIixcclxuICAgICAgICByb3Q6XCJyb3RhdGVcIixcclxuICAgICAgICBzcEF1dG9GaXQ6XCJhdXRvZml0XCIsbm9ybUF1dG9GaXQ6XCJhdXRvZml0XCIsbm9BdXRvRml0OlwiYXV0b2ZpdFwiLFxyXG4gICAgfSxcclxuXHJcbiAgICBpbmhlcml0KC4uLmFkZGl0aW9ucyl7XHJcbiAgICAgICAgcmV0dXJuIGFkZGl0aW9ucy5yZWR1Y2UoKHtfX2ZpbHRlcj1cIlwiLG5hbWVzPXt9LCAuLi5vdGhlcnN9LCB7X19maWx0ZXI6X2ZpbHRlcj1cIlwiLG5hbWVzOl9uYW1lcz17fSwgLi4uX290aGVyc30pPT57XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5vdGhlcnMsXHJcbiAgICAgICAgICAgICAgICAuLi5fb3RoZXJzLFxyXG4gICAgICAgICAgICAgICAgX19maWx0ZXI6W19fZmlsdGVyLF9maWx0ZXJdLmZpbHRlcihhPT4hIWEpLmpvaW4oXCIsXCIpLFxyXG4gICAgICAgICAgICAgICAgbmFtZXM6ey4uLm5hbWVzLCAuLi5fbmFtZXN9LFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSx0aGlzKVxyXG4gICAgfVxyXG59KVxyXG5cclxuY29uc3Qgc2FtZT0oa2V5cyxmeCk9PmtleXMucmVkdWNlKChmcywgayk9Pihmc1trXT1meCwgZnMpLHt9KVxyXG4iXX0=