forked from lix-project/lix-website
448 lines
42 KiB
JavaScript
448 lines
42 KiB
JavaScript
'use strict';
|
|
|
|
exports.__esModule = true;
|
|
|
|
var _declaration = require('postcss/lib/declaration');
|
|
|
|
var _declaration2 = _interopRequireDefault(_declaration);
|
|
|
|
var _comment = require('postcss/lib/comment');
|
|
|
|
var _comment2 = _interopRequireDefault(_comment);
|
|
|
|
var _atRule = require('postcss/lib/at-rule');
|
|
|
|
var _atRule2 = _interopRequireDefault(_atRule);
|
|
|
|
var _rule = require('postcss/lib/rule');
|
|
|
|
var _rule2 = _interopRequireDefault(_rule);
|
|
|
|
var _root = require('postcss/lib/root');
|
|
|
|
var _root2 = _interopRequireDefault(_root);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
var Parser = function () {
|
|
function Parser(input) {
|
|
_classCallCheck(this, Parser);
|
|
|
|
this.input = input;
|
|
|
|
this.pos = 0;
|
|
this.root = new _root2.default();
|
|
this.current = this.root;
|
|
this.spaces = '';
|
|
|
|
this.extraIndent = false;
|
|
this.prevIndent = undefined;
|
|
this.step = undefined;
|
|
|
|
this.root.source = { input: input, start: { line: 1, column: 1 } };
|
|
}
|
|
|
|
Parser.prototype.loop = function loop() {
|
|
var part = void 0;
|
|
while (this.pos < this.parts.length) {
|
|
part = this.parts[this.pos];
|
|
|
|
if (part.comment) {
|
|
this.comment(part);
|
|
} else if (part.atrule) {
|
|
this.atrule(part);
|
|
} else if (part.colon) {
|
|
var next = this.nextNonComment(this.pos);
|
|
|
|
if (next.end || next.atrule) {
|
|
this.decl(part);
|
|
} else {
|
|
var moreIndent = next.indent.length > part.indent.length;
|
|
if (!moreIndent) {
|
|
this.decl(part);
|
|
} else if (moreIndent && next.colon) {
|
|
this.rule(part);
|
|
} else if (moreIndent && !next.colon) {
|
|
this.decl(part);
|
|
}
|
|
}
|
|
} else if (part.end) {
|
|
this.root.raws.after = part.before;
|
|
} else {
|
|
this.rule(part);
|
|
}
|
|
|
|
this.pos += 1;
|
|
}
|
|
|
|
for (var i = this.tokens.length - 1; i >= 0; i--) {
|
|
if (this.tokens[i].length > 3) {
|
|
var last = this.tokens[i];
|
|
this.root.source.end = {
|
|
line: last[4] || last[2],
|
|
column: last[5] || last[3]
|
|
};
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
|
|
Parser.prototype.comment = function comment(part) {
|
|
var token = part.tokens[0];
|
|
var node = new _comment2.default();
|
|
this.init(node, part);
|
|
node.source.end = { line: token[4], column: token[5] };
|
|
this.commentText(node, token);
|
|
};
|
|
|
|
Parser.prototype.atrule = function atrule(part) {
|
|
var atword = part.tokens[0];
|
|
var params = part.tokens.slice(1);
|
|
|
|
var node = new _atRule2.default();
|
|
node.name = atword[1].slice(1);
|
|
this.init(node, part);
|
|
|
|
if (node.name === '') this.unnamedAtrule(atword);
|
|
|
|
while (!part.end && part.lastComma) {
|
|
this.pos += 1;
|
|
part = this.parts[this.pos];
|
|
params.push(['space', part.before + part.indent]);
|
|
params = params.concat(part.tokens);
|
|
}
|
|
|
|
node.raws.afterName = this.firstSpaces(params);
|
|
this.keepTrailingSpace(node, params);
|
|
this.checkSemicolon(params);
|
|
this.checkCurly(params);
|
|
this.raw(node, 'params', params, atword);
|
|
};
|
|
|
|
Parser.prototype.decl = function decl(part) {
|
|
var node = new _declaration2.default();
|
|
this.init(node, part);
|
|
|
|
var between = '';
|
|
var colon = 0;
|
|
var value = [];
|
|
var prop = '';
|
|
for (var i = 0; i < part.tokens.length; i++) {
|
|
var token = part.tokens[i];
|
|
if (token[0] === ':') {
|
|
between += token[1];
|
|
colon = token;
|
|
value = part.tokens.slice(i + 1);
|
|
break;
|
|
} else if (token[0] === 'comment' || token[0] === 'space') {
|
|
between += token[1];
|
|
} else if (between !== '') {
|
|
this.badProp(token);
|
|
} else {
|
|
prop += token[1];
|
|
}
|
|
}
|
|
|
|
if (prop === '') this.unnamedDecl(part.tokens[0]);
|
|
node.prop = prop;
|
|
|
|
var next = this.parts[this.pos + 1];
|
|
|
|
while (!next.end && !next.atrule && !next.colon && next.indent.length > part.indent.length) {
|
|
value.push(['space', next.before + next.indent]);
|
|
value = value.concat(next.tokens);
|
|
this.pos += 1;
|
|
next = this.parts[this.pos + 1];
|
|
}
|
|
|
|
var last = value[value.length - 1];
|
|
if (last && last[0] === 'comment') {
|
|
value.pop();
|
|
var comment = new _comment2.default();
|
|
this.current.push(comment);
|
|
comment.source = {
|
|
input: this.input,
|
|
start: { line: last[2], column: last[3] },
|
|
end: { line: last[4], column: last[5] }
|
|
};
|
|
var prev = value[value.length - 1];
|
|
if (prev && prev[0] === 'space') {
|
|
value.pop();
|
|
comment.raws.before = prev[1];
|
|
}
|
|
this.commentText(comment, last);
|
|
}
|
|
|
|
for (var _i = value.length - 1; _i > 0; _i--) {
|
|
var t = value[_i][0];
|
|
if (t === 'word' && value[_i][1] === '!important') {
|
|
node.important = true;
|
|
if (_i > 0 && value[_i - 1][0] === 'space') {
|
|
node.raws.important = value[_i - 1][1] + '!important';
|
|
value.splice(_i - 1, 2);
|
|
} else {
|
|
node.raws.important = '!important';
|
|
value.splice(_i, 1);
|
|
}
|
|
break;
|
|
} else if (t !== 'space' && t !== 'newline' && t !== 'comment') {
|
|
break;
|
|
}
|
|
}
|
|
|
|
node.raws.between = between + this.firstSpaces(value);
|
|
this.checkSemicolon(value);
|
|
this.raw(node, 'value', value, colon);
|
|
};
|
|
|
|
Parser.prototype.rule = function rule(part) {
|
|
var node = new _rule2.default();
|
|
this.init(node, part);
|
|
|
|
var selector = part.tokens;
|
|
var next = this.parts[this.pos + 1];
|
|
|
|
while (!next.end && next.indent.length === part.indent.length) {
|
|
selector.push(['space', next.before + next.indent]);
|
|
selector = selector.concat(next.tokens);
|
|
this.pos += 1;
|
|
next = this.parts[this.pos + 1];
|
|
}
|
|
|
|
this.keepTrailingSpace(node, selector);
|
|
this.checkCurly(selector);
|
|
this.raw(node, 'selector', selector);
|
|
};
|
|
|
|
/* Helpers */
|
|
|
|
Parser.prototype.indent = function indent(part) {
|
|
var indent = part.indent.length;
|
|
var isPrev = typeof this.prevIndent !== 'undefined';
|
|
|
|
if (!isPrev && indent) this.indentedFirstLine(part);
|
|
|
|
if (!this.step && indent) {
|
|
this.step = indent;
|
|
this.root.raws.indent = part.indent;
|
|
}
|
|
|
|
if (isPrev && this.prevIndent !== indent) {
|
|
var diff = indent - this.prevIndent;
|
|
if (diff > 0) {
|
|
if (diff !== this.step) {
|
|
this.wrongIndent(this.prevIndent + this.step, indent, part);
|
|
} else if (this.current.last.push) {
|
|
this.current = this.current.last;
|
|
} else {
|
|
this.extraIndent = '';
|
|
for (var i = 0; i < diff; i++) {
|
|
this.extraIndent += ' ';
|
|
}
|
|
}
|
|
} else if (diff % this.step !== 0) {
|
|
var m = indent + diff % this.step;
|
|
this.wrongIndent(m + ' or ' + (m + this.step), indent, part);
|
|
} else {
|
|
for (var _i2 = 0; _i2 < -diff / this.step; _i2++) {
|
|
this.current = this.current.parent;
|
|
}
|
|
}
|
|
}
|
|
|
|
this.prevIndent = indent;
|
|
};
|
|
|
|
Parser.prototype.init = function init(node, part) {
|
|
this.indent(part);
|
|
|
|
if (!this.current.nodes) this.current.nodes = [];
|
|
this.current.push(node);
|
|
|
|
node.raws.before = part.before + part.indent;
|
|
if (this.extraIndent) {
|
|
node.raws.extraIndent = this.extraIndent;
|
|
this.extraIndent = false;
|
|
}
|
|
node.source = {
|
|
start: { line: part.tokens[0][2], column: part.tokens[0][3] },
|
|
input: this.input
|
|
};
|
|
};
|
|
|
|
Parser.prototype.checkCurly = function checkCurly(tokens) {
|
|
for (var _iterator = tokens, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
|
|
var _ref;
|
|
|
|
if (_isArray) {
|
|
if (_i3 >= _iterator.length) break;
|
|
_ref = _iterator[_i3++];
|
|
} else {
|
|
_i3 = _iterator.next();
|
|
if (_i3.done) break;
|
|
_ref = _i3.value;
|
|
}
|
|
|
|
var token = _ref;
|
|
|
|
if (token[0] === '{') {
|
|
this.error('Unnecessary curly bracket', token[2], token[3]);
|
|
}
|
|
}
|
|
};
|
|
|
|
Parser.prototype.checkSemicolon = function checkSemicolon(tokens) {
|
|
for (var _iterator2 = tokens, _isArray2 = Array.isArray(_iterator2), _i4 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
|
|
var _ref2;
|
|
|
|
if (_isArray2) {
|
|
if (_i4 >= _iterator2.length) break;
|
|
_ref2 = _iterator2[_i4++];
|
|
} else {
|
|
_i4 = _iterator2.next();
|
|
if (_i4.done) break;
|
|
_ref2 = _i4.value;
|
|
}
|
|
|
|
var token = _ref2;
|
|
|
|
if (token[0] === ';') {
|
|
this.error('Unnecessary semicolon', token[2], token[3]);
|
|
}
|
|
}
|
|
};
|
|
|
|
Parser.prototype.keepTrailingSpace = function keepTrailingSpace(node, tokens) {
|
|
var lastSpace = tokens[tokens.length - 1];
|
|
if (lastSpace && lastSpace[0] === 'space') {
|
|
tokens.pop();
|
|
node.raws.sssBetween = lastSpace[1];
|
|
}
|
|
};
|
|
|
|
Parser.prototype.firstSpaces = function firstSpaces(tokens) {
|
|
var result = '';
|
|
for (var i = 0; i < tokens.length; i++) {
|
|
if (tokens[i][0] === 'space' || tokens[i][0] === 'newline') {
|
|
result += tokens.shift()[1];
|
|
i -= 1;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
|
|
Parser.prototype.raw = function raw(node, prop, tokens, altLast) {
|
|
var token = void 0,
|
|
type = void 0;
|
|
var length = tokens.length;
|
|
var value = '';
|
|
var clean = true;
|
|
for (var i = 0; i < length; i += 1) {
|
|
token = tokens[i];
|
|
type = token[0];
|
|
if (type === 'comment' || type === 'space' && i === length - 1) {
|
|
clean = false;
|
|
} else {
|
|
value += token[1];
|
|
}
|
|
}
|
|
if (!clean) {
|
|
var sss = tokens.reduce(function (all, i) {
|
|
return all + i[1];
|
|
}, '');
|
|
var raw = tokens.reduce(function (all, i) {
|
|
if (i[0] === 'comment' && i[6] === 'inline') {
|
|
return all + '/* ' + i[1].slice(2).trim() + ' */';
|
|
} else {
|
|
return all + i[1];
|
|
}
|
|
}, '');
|
|
node.raws[prop] = { value: value, raw: raw };
|
|
if (sss !== raw) node.raws[prop].sss = sss;
|
|
}
|
|
node[prop] = value;
|
|
|
|
var last = void 0;
|
|
for (var _i5 = tokens.length - 1; _i5 >= 0; _i5--) {
|
|
if (tokens[_i5].length > 2) {
|
|
last = tokens[_i5];
|
|
break;
|
|
}
|
|
}
|
|
if (!last) last = altLast;
|
|
|
|
node.source.end = {
|
|
line: last[4] || last[2],
|
|
column: last[5] || last[3]
|
|
};
|
|
};
|
|
|
|
Parser.prototype.nextNonComment = function nextNonComment(pos) {
|
|
var next = pos;
|
|
var part = void 0;
|
|
while (next < this.parts.length) {
|
|
next += 1;
|
|
part = this.parts[next];
|
|
if (part.end || !part.comment) break;
|
|
}
|
|
return part;
|
|
};
|
|
|
|
Parser.prototype.commentText = function commentText(node, token) {
|
|
var text = token[1];
|
|
if (token[6] === 'inline') {
|
|
node.raws.inline = true;
|
|
text = text.slice(2);
|
|
} else {
|
|
text = text.slice(2, -2);
|
|
}
|
|
|
|
var match = text.match(/^(\s*)([^]*[^\s])(\s*)\n?$/);
|
|
if (match) {
|
|
node.text = match[2];
|
|
node.raws.left = match[1];
|
|
node.raws.inlineRight = match[3];
|
|
} else {
|
|
node.text = '';
|
|
node.raws.left = '';
|
|
node.raws.inlineRight = '';
|
|
}
|
|
};
|
|
|
|
// Errors
|
|
|
|
Parser.prototype.error = function error(msg, line, column) {
|
|
throw this.input.error(msg, line, column);
|
|
};
|
|
|
|
Parser.prototype.unnamedAtrule = function unnamedAtrule(token) {
|
|
this.error('At-rule without name', token[2], token[3]);
|
|
};
|
|
|
|
Parser.prototype.unnamedDecl = function unnamedDecl(token) {
|
|
this.error('Declaration without name', token[2], token[3]);
|
|
};
|
|
|
|
Parser.prototype.indentedFirstLine = function indentedFirstLine(part) {
|
|
this.error('First line should not have indent', part.number, 1);
|
|
};
|
|
|
|
Parser.prototype.wrongIndent = function wrongIndent(expected, real, part) {
|
|
var msg = 'Expected ' + expected + ' indent, but get ' + real;
|
|
this.error(msg, part.number, 1);
|
|
};
|
|
|
|
Parser.prototype.badProp = function badProp(token) {
|
|
this.error('Unexpected separator in property', token[2], token[3]);
|
|
};
|
|
|
|
return Parser;
|
|
}();
|
|
|
|
exports.default = Parser;
|
|
module.exports = exports['default'];
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhcnNlci5lczYiXSwibmFtZXMiOlsiUGFyc2VyIiwiaW5wdXQiLCJwb3MiLCJyb290IiwiUm9vdCIsImN1cnJlbnQiLCJzcGFjZXMiLCJleHRyYUluZGVudCIsInByZXZJbmRlbnQiLCJ1bmRlZmluZWQiLCJzdGVwIiwic291cmNlIiwic3RhcnQiLCJsaW5lIiwiY29sdW1uIiwibG9vcCIsInBhcnQiLCJwYXJ0cyIsImxlbmd0aCIsImNvbW1lbnQiLCJhdHJ1bGUiLCJjb2xvbiIsIm5leHQiLCJuZXh0Tm9uQ29tbWVudCIsImVuZCIsImRlY2wiLCJtb3JlSW5kZW50IiwiaW5kZW50IiwicnVsZSIsInJhd3MiLCJhZnRlciIsImJlZm9yZSIsImkiLCJ0b2tlbnMiLCJsYXN0IiwidG9rZW4iLCJub2RlIiwiQ29tbWVudCIsImluaXQiLCJjb21tZW50VGV4dCIsImF0d29yZCIsInBhcmFtcyIsInNsaWNlIiwiQXRSdWxlIiwibmFtZSIsInVubmFtZWRBdHJ1bGUiLCJsYXN0Q29tbWEiLCJwdXNoIiwiY29uY2F0IiwiYWZ0ZXJOYW1lIiwiZmlyc3RTcGFjZXMiLCJrZWVwVHJhaWxpbmdTcGFjZSIsImNoZWNrU2VtaWNvbG9uIiwiY2hlY2tDdXJseSIsInJhdyIsIkRlY2xhcmF0aW9uIiwiYmV0d2VlbiIsInZhbHVlIiwicHJvcCIsImJhZFByb3AiLCJ1bm5hbWVkRGVjbCIsInBvcCIsInByZXYiLCJ0IiwiaW1wb3J0YW50Iiwic3BsaWNlIiwiUnVsZSIsInNlbGVjdG9yIiwiaXNQcmV2IiwiaW5kZW50ZWRGaXJzdExpbmUiLCJkaWZmIiwid3JvbmdJbmRlbnQiLCJtIiwicGFyZW50Iiwibm9kZXMiLCJlcnJvciIsImxhc3RTcGFjZSIsInNzc0JldHdlZW4iLCJyZXN1bHQiLCJzaGlmdCIsImFsdExhc3QiLCJ0eXBlIiwiY2xlYW4iLCJzc3MiLCJyZWR1Y2UiLCJhbGwiLCJ0cmltIiwidGV4dCIsImlubGluZSIsIm1hdGNoIiwibGVmdCIsImlubGluZVJpZ2h0IiwibXNnIiwibnVtYmVyIiwiZXhwZWN0ZWQiLCJyZWFsIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7SUFFcUJBLE07QUFDbkIsa0JBQWFDLEtBQWIsRUFBb0I7QUFBQTs7QUFDbEIsU0FBS0EsS0FBTCxHQUFhQSxLQUFiOztBQUVBLFNBQUtDLEdBQUwsR0FBVyxDQUFYO0FBQ0EsU0FBS0MsSUFBTCxHQUFZLElBQUlDLGNBQUosRUFBWjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxLQUFLRixJQUFwQjtBQUNBLFNBQUtHLE1BQUwsR0FBYyxFQUFkOztBQUVBLFNBQUtDLFdBQUwsR0FBbUIsS0FBbkI7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQyxTQUFsQjtBQUNBLFNBQUtDLElBQUwsR0FBWUQsU0FBWjs7QUFFQSxTQUFLTixJQUFMLENBQVVRLE1BQVYsR0FBbUIsRUFBRVYsWUFBRixFQUFTVyxPQUFPLEVBQUVDLE1BQU0sQ0FBUixFQUFXQyxRQUFRLENBQW5CLEVBQWhCLEVBQW5CO0FBQ0Q7O21CQUVEQyxJLG1CQUFRO0FBQ04sUUFBSUMsYUFBSjtBQUNBLFdBQU8sS0FBS2QsR0FBTCxHQUFXLEtBQUtlLEtBQUwsQ0FBV0MsTUFBN0IsRUFBcUM7QUFDbkNGLGFBQU8sS0FBS0MsS0FBTCxDQUFXLEtBQUtmLEdBQWhCLENBQVA7O0FBRUEsVUFBSWMsS0FBS0csT0FBVCxFQUFrQjtBQUNoQixhQUFLQSxPQUFMLENBQWFILElBQWI7QUFDRCxPQUZELE1BRU8sSUFBSUEsS0FBS0ksTUFBVCxFQUFpQjtBQUN0QixhQUFLQSxNQUFMLENBQVlKLElBQVo7QUFDRCxPQUZNLE1BRUEsSUFBSUEsS0FBS0ssS0FBVCxFQUFnQjtBQUNyQixZQUFJQyxPQUFPLEtBQUtDLGNBQUwsQ0FBb0IsS0FBS3JCLEdBQXpCLENBQVg7O0FBRUEsWUFBSW9CLEtBQUtFLEdBQUwsSUFBWUYsS0FBS0YsTUFBckIsRUFBNkI7QUFDM0IsZUFBS0ssSUFBTCxDQUFVVCxJQUFWO0FBQ0QsU0FGRCxNQUVPO0FBQ0wsY0FBSVUsYUFBYUosS0FBS0ssTUFBTCxDQUFZVCxNQUFaLEdBQXFCRixLQUFLVyxNQUFMLENBQVlULE1BQWxEO0FBQ0EsY0FBSSxDQUFDUSxVQUFMLEVBQWlCO0FBQ2YsaUJBQUtELElBQUwsQ0FBVVQsSUFBVjtBQUNELFdBRkQsTUFFTyxJQUFJVSxjQUFjSixLQUFLRCxLQUF2QixFQUE4QjtBQUNuQyxpQkFBS08sSUFBTCxDQUFVWixJQUFWO0FBQ0QsV0FGTSxNQUVBLElBQUlVLGNBQWMsQ0FBQ0osS0FBS0QsS0FBeEIsRUFBK0I7QUFDcEMsaUJBQUtJLElBQUwsQ0FBVVQsSUFBVjtBQUNEO0FBQ0Y7QUFDRixPQWZNLE1BZUEsSUFBSUEsS0FBS1EsR0FBVCxFQUFjO0FBQ25CLGFBQUtyQixJQUFMLENBQVUwQixJQUFWLENBQWVDLEtBQWYsR0FBdUJkLEtBQUtlLE1BQTVCO0FBQ0QsT0FGTSxNQUVBO0FBQ0wsYUFBS0gsSUFBTCxDQUFVWixJQUFWO0FBQ0Q7O0FBRUQsV0FBS2QsR0FBTCxJQUFZLENBQVo7QUFDRDs7QUFFRCxTQUFLLElBQUk4QixJQUFJLEtBQUtDLE1BQUwsQ0FBWWYsTUFBWixHQUFxQixDQUFsQyxFQUFxQ2MsS0FBSyxDQUExQyxFQUE2Q0EsR0FBN0MsRUFBa0Q7QUFDaEQsVUFBSSxLQUFLQyxNQUFMLENBQVlELENBQVosRUFBZWQsTUFBZixHQUF3QixDQUE1QixFQUErQjtBQUM3QixZQUFJZ0IsT0FBTyxLQUFLRCxNQUFMLENBQVlELENBQVosQ0FBWDtBQUNBLGFBQUs3QixJQUFMLENBQVVRLE1BQVYsQ0FBaUJhLEdBQWpCLEdBQXVCO0FBQ3JCWCxnQkFBTXFCLEtBQUssQ0FBTCxLQUFXQSxLQUFLLENBQUwsQ0FESTtBQUVyQnBCLGtCQUFRb0IsS0FBSyxDQUFMLEtBQVdBLEtBQUssQ0FBTDtBQUZFLFNBQXZCO0FBSUE7QUFDRDtBQUNGO0FBQ0YsRzs7bUJBRURmLE8sb0JBQVNILEksRUFBTTtBQUNiLFFBQUltQixRQUFRbkIsS0FBS2lCLE1BQUwsQ0FBWSxDQUFaLENBQVo7QUFDQSxRQUFJRyxPQUFPLElBQUlDLGlCQUFKLEVBQVg7QUFDQSxTQUFLQyxJQUFMLENBQVVGLElBQVYsRUFBZ0JwQixJQUFoQjtBQUNBb0IsU0FBS3pCLE1BQUwsQ0FBWWEsR0FBWixHQUFrQixFQUFFWCxNQUFNc0IsTUFBTSxDQUFOLENBQVIsRUFBa0JyQixRQUFRcUIsTUFBTSxDQUFOLENBQTFCLEVBQWxCO0FBQ0EsU0FBS0ksV0FBTCxDQUFpQkgsSUFBakIsRUFBdUJELEtBQXZCO0FBQ0QsRzs7bUJBRURmLE0sbUJBQVFKLEksRUFBTTtBQUNaLFFBQUl3QixTQUFTeEIsS0FBS2lCLE1BQUwsQ0FBWSxDQUFaLENBQWI7QUFDQSxRQUFJUSxTQUFTekIsS0FBS2lCLE1BQUwsQ0FBWVMsS0FBWixDQUFrQixDQUFsQixDQUFiOztBQUVBLFFBQUlOLE9BQU8sSUFBSU8sZ0JBQUosRUFBWDtBQUNBUCxTQUFLUSxJQUFMLEdBQVlKLE9BQU8sQ0FBUCxFQUFVRSxLQUFWLENBQWdCLENBQWhCLENBQVo7QUFDQSxTQUFLSixJQUFMLENBQVVGLElBQVYsRUFBZ0JwQixJQUFoQjs7QUFFQSxRQUFJb0IsS0FBS1EsSUFBTCxLQUFjLEVBQWxCLEVBQXNCLEtBQUtDLGFBQUwsQ0FBbUJMLE1BQW5COztBQUV0QixXQUFPLENBQUN4QixLQUFLUSxHQUFOLElBQWFSLEtBQUs4QixTQUF6QixFQUFvQztBQUNsQyxXQUFLNUMsR0FBTCxJQUFZLENBQVo7QUFDQWMsYUFBTyxLQUFLQyxLQUFMLENBQVcsS0FBS2YsR0FBaEIsQ0FBUDtBQUNBdUMsYUFBT00sSUFBUCxDQUFZLENBQUMsT0FBRCxFQUFVL0IsS0FBS2UsTUFBTCxHQUFjZixLQUFLVyxNQUE3QixDQUFaO0FBQ0FjLGVBQVNBLE9BQU9PLE1BQVAsQ0FBY2hDLEtBQUtpQixNQUFuQixDQUFUO0FBQ0Q7O0FBRURHLFNBQUtQLElBQUwsQ0FBVW9CLFNBQVYsR0FBc0IsS0FBS0MsV0FBTCxDQUFpQlQsTUFBakIsQ0FBdEI7QUFDQSxTQUFLVSxpQkFBTCxDQUF1QmYsSUFBdkIsRUFBNkJLLE1BQTdCO0FBQ0EsU0FBS1csY0FBTCxDQUFvQlgsTUFBcEI7QUFDQSxTQUFLWSxVQUFMLENBQWdCWixNQUFoQjtBQUNBLFNBQUthLEdBQUwsQ0FBU2xCLElBQVQsRUFBZSxRQUFmLEVBQXlCSyxNQUF6QixFQUFpQ0QsTUFBakM7QUFDRCxHOzttQkFFRGYsSSxpQkFBTVQsSSxFQUFNO0FBQ1YsUUFBSW9CLE9BQU8sSUFBSW1CLHFCQUFKLEVBQVg7QUFDQSxTQUFLakIsSUFBTCxDQUFVRixJQUFWLEVBQWdCcEIsSUFBaEI7O0FBRUEsUUFBSXdDLFVBQVUsRUFBZDtBQUNBLFFBQUluQyxRQUFRLENBQVo7QUFDQSxRQUFJb0MsUUFBUSxFQUFaO0FBQ0EsUUFBSUMsT0FBTyxFQUFYO0FBQ0EsU0FBSyxJQUFJMUIsSUFBSSxDQUFiLEVBQWdCQSxJQUFJaEIsS0FBS2lCLE1BQUwsQ0FBWWYsTUFBaEMsRUFBd0NjLEdBQXhDLEVBQTZDO0FBQzNDLFVBQUlHLFFBQVFuQixLQUFLaUIsTUFBTCxDQUFZRCxDQUFaLENBQVo7QUFDQSxVQUFJRyxNQUFNLENBQU4sTUFBYSxHQUFqQixFQUFzQjtBQUNwQnFCLG1CQUFXckIsTUFBTSxDQUFOLENBQVg7QUFDQWQsZ0JBQVFjLEtBQVI7QUFDQXNCLGdCQUFRekMsS0FBS2lCLE1BQUwsQ0FBWVMsS0FBWixDQUFrQlYsSUFBSSxDQUF0QixDQUFSO0FBQ0E7QUFDRCxPQUxELE1BS08sSUFBSUcsTUFBTSxDQUFOLE1BQWEsU0FBYixJQUEwQkEsTUFBTSxDQUFOLE1BQWEsT0FBM0MsRUFBb0Q7QUFDekRxQixtQkFBV3JCLE1BQU0sQ0FBTixDQUFYO0FBQ0QsT0FGTSxNQUVBLElBQUlxQixZQUFZLEVBQWhCLEVBQW9CO0FBQ3pCLGFBQUtHLE9BQUwsQ0FBYXhCLEtBQWI7QUFDRCxPQUZNLE1BRUE7QUFDTHVCLGdCQUFRdkIsTUFBTSxDQUFOLENBQVI7QUFDRDtBQUNGOztBQUVELFFBQUl1QixTQUFTLEVBQWIsRUFBaUIsS0FBS0UsV0FBTCxDQUFpQjVDLEtBQUtpQixNQUFMLENBQVksQ0FBWixDQUFqQjtBQUNqQkcsU0FBS3NCLElBQUwsR0FBWUEsSUFBWjs7QUFFQSxRQUFJcEMsT0FBTyxLQUFLTCxLQUFMLENBQVcsS0FBS2YsR0FBTCxHQUFXLENBQXRCLENBQVg7O0FBRUEsV0FBTyxDQUFDb0IsS0FBS0UsR0FBTixJQUFhLENBQUNGLEtBQUtGLE1BQW5CLElBQTZCLENBQUNFLEtBQUtELEtBQW5DLElBQ0tDLEtBQUtLLE1BQUwsQ0FBWVQsTUFBWixHQUFxQkYsS0FBS1csTUFBTCxDQUFZVCxNQUQ3QyxFQUNxRDtBQUNuRHVDLFlBQU1WLElBQU4sQ0FBVyxDQUFDLE9BQUQsRUFBVXpCLEtBQUtTLE1BQUwsR0FBY1QsS0FBS0ssTUFBN0IsQ0FBWDtBQUNBOEIsY0FBUUEsTUFBTVQsTUFBTixDQUFhMUIsS0FBS1csTUFBbEIsQ0FBUjtBQUNBLFdBQUsvQixHQUFMLElBQVksQ0FBWjtBQUNBb0IsYUFBTyxLQUFLTCxLQUFMLENBQVcsS0FBS2YsR0FBTCxHQUFXLENBQXRCLENBQVA7QUFDRDs7QUFFRCxRQUFJZ0MsT0FBT3VCLE1BQU1BLE1BQU12QyxNQUFOLEdBQWUsQ0FBckIsQ0FBWDtBQUNBLFFBQUlnQixRQUFRQSxLQUFLLENBQUwsTUFBWSxTQUF4QixFQUFtQztBQUNqQ3VCLFlBQU1JLEdBQU47QUFDQSxVQUFJMUMsVUFBVSxJQUFJa0IsaUJBQUosRUFBZDtBQUNBLFdBQUtoQyxPQUFMLENBQWEwQyxJQUFiLENBQWtCNUIsT0FBbEI7QUFDQUEsY0FBUVIsTUFBUixHQUFpQjtBQUNmVixlQUFPLEtBQUtBLEtBREc7QUFFZlcsZUFBTyxFQUFFQyxNQUFNcUIsS0FBSyxDQUFMLENBQVIsRUFBaUJwQixRQUFRb0IsS0FBSyxDQUFMLENBQXpCLEVBRlE7QUFHZlYsYUFBSyxFQUFFWCxNQUFNcUIsS0FBSyxDQUFMLENBQVIsRUFBaUJwQixRQUFRb0IsS0FBSyxDQUFMLENBQXpCO0FBSFUsT0FBakI7QUFLQSxVQUFJNEIsT0FBT0wsTUFBTUEsTUFBTXZDLE1BQU4sR0FBZSxDQUFyQixDQUFYO0FBQ0EsVUFBSTRDLFFBQVFBLEtBQUssQ0FBTCxNQUFZLE9BQXhCLEVBQWlDO0FBQy9CTCxjQUFNSSxHQUFOO0FBQ0ExQyxnQkFBUVUsSUFBUixDQUFhRSxNQUFiLEdBQXNCK0IsS0FBSyxDQUFMLENBQXRCO0FBQ0Q7QUFDRCxXQUFLdkIsV0FBTCxDQUFpQnBCLE9BQWpCLEVBQTBCZSxJQUExQjtBQUNEOztBQUVELFNBQUssSUFBSUYsS0FBSXlCLE1BQU12QyxNQUFOLEdBQWUsQ0FBNUIsRUFBK0JjLEtBQUksQ0FBbkMsRUFBc0NBLElBQXRDLEVBQTJDO0FBQ3pDLFVBQUkrQixJQUFJTixNQUFNekIsRUFBTixFQUFTLENBQVQsQ0FBUjtBQUNBLFVBQUkrQixNQUFNLE1BQU4sSUFBZ0JOLE1BQU16QixFQUFOLEVBQVMsQ0FBVCxNQUFnQixZQUFwQyxFQUFrRDtBQUNoREksYUFBSzRCLFNBQUwsR0FBaUIsSUFBakI7QUFDQSxZQUFJaEMsS0FBSSxDQUFKLElBQVN5QixNQUFNekIsS0FBSSxDQUFWLEVBQWEsQ0FBYixNQUFvQixPQUFqQyxFQUEwQztBQUN4Q0ksZUFBS1AsSUFBTCxDQUFVbUMsU0FBVixHQUFzQlAsTUFBTXpCLEtBQUksQ0FBVixFQUFhLENBQWIsSUFBa0IsWUFBeEM7QUFDQXlCLGdCQUFNUSxNQUFOLENBQWFqQyxLQUFJLENBQWpCLEVBQW9CLENBQXBCO0FBQ0QsU0FIRCxNQUdPO0FBQ0xJLGVBQUtQLElBQUwsQ0FBVW1DLFNBQVYsR0FBc0IsWUFBdEI7QUFDQVAsZ0JBQU1RLE1BQU4sQ0FBYWpDLEVBQWIsRUFBZ0IsQ0FBaEI7QUFDRDtBQUNEO0FBQ0QsT0FWRCxNQVVPLElBQUkrQixNQUFNLE9BQU4sSUFBaUJBLE1BQU0sU0FBdkIsSUFBb0NBLE1BQU0sU0FBOUMsRUFBeUQ7QUFDOUQ7QUFDRDtBQUNGOztBQUVEM0IsU0FBS1AsSUFBTCxDQUFVMkIsT0FBVixHQUFvQkEsVUFBVSxLQUFLTixXQUFMLENBQWlCTyxLQUFqQixDQUE5QjtBQUNBLFNBQUtMLGNBQUwsQ0FBb0JLLEtBQXBCO0FBQ0EsU0FBS0gsR0FBTCxDQUFTbEIsSUFBVCxFQUFlLE9BQWYsRUFBd0JxQixLQUF4QixFQUErQnBDLEtBQS9CO0FBQ0QsRzs7bUJBRURPLEksaUJBQU1aLEksRUFBTTtBQUNWLFFBQUlvQixPQUFPLElBQUk4QixjQUFKLEVBQVg7QUFDQSxTQUFLNUIsSUFBTCxDQUFVRixJQUFWLEVBQWdCcEIsSUFBaEI7O0FBRUEsUUFBSW1ELFdBQVduRCxLQUFLaUIsTUFBcEI7QUFDQSxRQUFJWCxPQUFPLEtBQUtMLEtBQUwsQ0FBVyxLQUFLZixHQUFMLEdBQVcsQ0FBdEIsQ0FBWDs7QUFFQSxXQUFPLENBQUNvQixLQUFLRSxHQUFOLElBQWFGLEtBQUtLLE1BQUwsQ0FBWVQsTUFBWixLQUF1QkYsS0FBS1csTUFBTCxDQUFZVCxNQUF2RCxFQUErRDtBQUM3RGlELGVBQVNwQixJQUFULENBQWMsQ0FBQyxPQUFELEVBQVV6QixLQUFLUyxNQUFMLEdBQWNULEtBQUtLLE1BQTdCLENBQWQ7QUFDQXdDLGlCQUFXQSxTQUFTbkIsTUFBVCxDQUFnQjFCLEtBQUtXLE1BQXJCLENBQVg7QUFDQSxXQUFLL0IsR0FBTCxJQUFZLENBQVo7QUFDQW9CLGFBQU8sS0FBS0wsS0FBTCxDQUFXLEtBQUtmLEdBQUwsR0FBVyxDQUF0QixDQUFQO0FBQ0Q7O0FBRUQsU0FBS2lELGlCQUFMLENBQXVCZixJQUF2QixFQUE2QitCLFFBQTdCO0FBQ0EsU0FBS2QsVUFBTCxDQUFnQmMsUUFBaEI7QUFDQSxTQUFLYixHQUFMLENBQVNsQixJQUFULEVBQWUsVUFBZixFQUEyQitCLFFBQTNCO0FBQ0QsRzs7QUFFRDs7bUJBRUF4QyxNLG1CQUFRWCxJLEVBQU07QUFDWixRQUFJVyxTQUFTWCxLQUFLVyxNQUFMLENBQVlULE1BQXpCO0FBQ0EsUUFBSWtELFNBQVMsT0FBTyxLQUFLNUQsVUFBWixLQUEyQixXQUF4Qzs7QUFFQSxRQUFJLENBQUM0RCxNQUFELElBQVd6QyxNQUFmLEVBQXVCLEtBQUswQyxpQkFBTCxDQUF1QnJELElBQXZCOztBQUV2QixRQUFJLENBQUMsS0FBS04sSUFBTixJQUFjaUIsTUFBbEIsRUFBMEI7QUFDeEIsV0FBS2pCLElBQUwsR0FBWWlCLE1BQVo7QUFDQSxXQUFLeEIsSUFBTCxDQUFVMEIsSUFBVixDQUFlRixNQUFmLEdBQXdCWCxLQUFLVyxNQUE3QjtBQUNEOztBQUVELFFBQUl5QyxVQUFVLEtBQUs1RCxVQUFMLEtBQW9CbUIsTUFBbEMsRUFBMEM7QUFDeEMsVUFBSTJDLE9BQU8zQyxTQUFTLEtBQUtuQixVQUF6QjtBQUNBLFVBQUk4RCxPQUFPLENBQVgsRUFBYztBQUNaLFlBQUlBLFNBQVMsS0FBSzVELElBQWxCLEVBQXdCO0FBQ3RCLGVBQUs2RCxXQUFMLENBQWlCLEtBQUsvRCxVQUFMLEdBQWtCLEtBQUtFLElBQXhDLEVBQThDaUIsTUFBOUMsRUFBc0RYLElBQXREO0FBQ0QsU0FGRCxNQUVPLElBQUksS0FBS1gsT0FBTCxDQUFhNkIsSUFBYixDQUFrQmEsSUFBdEIsRUFBNEI7QUFDakMsZUFBSzFDLE9BQUwsR0FBZSxLQUFLQSxPQUFMLENBQWE2QixJQUE1QjtBQUNELFNBRk0sTUFFQTtBQUNMLGVBQUszQixXQUFMLEdBQW1CLEVBQW5CO0FBQ0EsZUFBSyxJQUFJeUIsSUFBSSxDQUFiLEVBQWdCQSxJQUFJc0MsSUFBcEIsRUFBMEJ0QyxHQUExQixFQUErQjtBQUM3QixpQkFBS3pCLFdBQUwsSUFBb0IsR0FBcEI7QUFDRDtBQUNGO0FBQ0YsT0FYRCxNQVdPLElBQUkrRCxPQUFPLEtBQUs1RCxJQUFaLEtBQXFCLENBQXpCLEVBQTRCO0FBQ2pDLFlBQUk4RCxJQUFJN0MsU0FBUzJDLE9BQU8sS0FBSzVELElBQTdCO0FBQ0EsYUFBSzZELFdBQUwsQ0FBcUJDLENBQXJCLGFBQStCQSxJQUFJLEtBQUs5RCxJQUF4QyxHQUFpRGlCLE1BQWpELEVBQXlEWCxJQUF6RDtBQUNELE9BSE0sTUFHQTtBQUNMLGFBQUssSUFBSWdCLE1BQUksQ0FBYixFQUFnQkEsTUFBSSxDQUFDc0MsSUFBRCxHQUFRLEtBQUs1RCxJQUFqQyxFQUF1Q3NCLEtBQXZDLEVBQTRDO0FBQzFDLGVBQUszQixPQUFMLEdBQWUsS0FBS0EsT0FBTCxDQUFhb0UsTUFBNUI7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQsU0FBS2pFLFVBQUwsR0FBa0JtQixNQUFsQjtBQUNELEc7O21CQUVEVyxJLGlCQUFNRixJLEVBQU1wQixJLEVBQU07QUFDaEIsU0FBS1csTUFBTCxDQUFZWCxJQUFaOztBQUVBLFFBQUksQ0FBQyxLQUFLWCxPQUFMLENBQWFxRSxLQUFsQixFQUF5QixLQUFLckUsT0FBTCxDQUFhcUUsS0FBYixHQUFxQixFQUFyQjtBQUN6QixTQUFLckUsT0FBTCxDQUFhMEMsSUFBYixDQUFrQlgsSUFBbEI7O0FBRUFBLFNBQUtQLElBQUwsQ0FBVUUsTUFBVixHQUFtQmYsS0FBS2UsTUFBTCxHQUFjZixLQUFLVyxNQUF0QztBQUNBLFFBQUksS0FBS3BCLFdBQVQsRUFBc0I7QUFDcEI2QixXQUFLUCxJQUFMLENBQVV0QixXQUFWLEdBQXdCLEtBQUtBLFdBQTdCO0FBQ0EsV0FBS0EsV0FBTCxHQUFtQixLQUFuQjtBQUNEO0FBQ0Q2QixTQUFLekIsTUFBTCxHQUFjO0FBQ1pDLGFBQU8sRUFBRUMsTUFBTUcsS0FBS2lCLE1BQUwsQ0FBWSxDQUFaLEVBQWUsQ0FBZixDQUFSLEVBQTJCbkIsUUFBUUUsS0FBS2lCLE1BQUwsQ0FBWSxDQUFaLEVBQWUsQ0FBZixDQUFuQyxFQURLO0FBRVpoQyxhQUFPLEtBQUtBO0FBRkEsS0FBZDtBQUlELEc7O21CQUVEb0QsVSx1QkFBWXBCLE0sRUFBUTtBQUNsQix5QkFBa0JBLE1BQWxCLG1IQUEwQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsVUFBakJFLEtBQWlCOztBQUN4QixVQUFJQSxNQUFNLENBQU4sTUFBYSxHQUFqQixFQUFzQjtBQUNwQixhQUFLd0MsS0FBTCxDQUFXLDJCQUFYLEVBQXdDeEMsTUFBTSxDQUFOLENBQXhDLEVBQWtEQSxNQUFNLENBQU4sQ0FBbEQ7QUFDRDtBQUNGO0FBQ0YsRzs7bUJBRURpQixjLDJCQUFnQm5CLE0sRUFBUTtBQUN0QiwwQkFBa0JBLE1BQWxCLHlIQUEwQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsVUFBakJFLEtBQWlCOztBQUN4QixVQUFJQSxNQUFNLENBQU4sTUFBYSxHQUFqQixFQUFzQjtBQUNwQixhQUFLd0MsS0FBTCxDQUFXLHVCQUFYLEVBQW9DeEMsTUFBTSxDQUFOLENBQXBDLEVBQThDQSxNQUFNLENBQU4sQ0FBOUM7QUFDRDtBQUNGO0FBQ0YsRzs7bUJBRURnQixpQiw4QkFBbUJmLEksRUFBTUgsTSxFQUFRO0FBQy9CLFFBQUkyQyxZQUFZM0MsT0FBT0EsT0FBT2YsTUFBUCxHQUFnQixDQUF2QixDQUFoQjtBQUNBLFFBQUkwRCxhQUFhQSxVQUFVLENBQVYsTUFBaUIsT0FBbEMsRUFBMkM7QUFDekMzQyxhQUFPNEIsR0FBUDtBQUNBekIsV0FBS1AsSUFBTCxDQUFVZ0QsVUFBVixHQUF1QkQsVUFBVSxDQUFWLENBQXZCO0FBQ0Q7QUFDRixHOzttQkFFRDFCLFcsd0JBQWFqQixNLEVBQVE7QUFDbkIsUUFBSTZDLFNBQVMsRUFBYjtBQUNBLFNBQUssSUFBSTlDLElBQUksQ0FBYixFQUFnQkEsSUFBSUMsT0FBT2YsTUFBM0IsRUFBbUNjLEdBQW5DLEVBQXdDO0FBQ3RDLFVBQUlDLE9BQU9ELENBQVAsRUFBVSxDQUFWLE1BQWlCLE9BQWpCLElBQTRCQyxPQUFPRCxDQUFQLEVBQVUsQ0FBVixNQUFpQixTQUFqRCxFQUE0RDtBQUMxRDhDLGtCQUFVN0MsT0FBTzhDLEtBQVAsR0FBZSxDQUFmLENBQVY7QUFDQS9DLGFBQUssQ0FBTDtBQUNELE9BSEQsTUFHTztBQUNMO0FBQ0Q7QUFDRjtBQUNELFdBQU84QyxNQUFQO0FBQ0QsRzs7bUJBRUR4QixHLGdCQUFLbEIsSSxFQUFNc0IsSSxFQUFNekIsTSxFQUFRK0MsTyxFQUFTO0FBQ2hDLFFBQUk3QyxjQUFKO0FBQUEsUUFBVzhDLGFBQVg7QUFDQSxRQUFJL0QsU0FBU2UsT0FBT2YsTUFBcEI7QUFDQSxRQUFJdUMsUUFBUSxFQUFaO0FBQ0EsUUFBSXlCLFFBQVEsSUFBWjtBQUNBLFNBQUssSUFBSWxELElBQUksQ0FBYixFQUFnQkEsSUFBSWQsTUFBcEIsRUFBNEJjLEtBQUssQ0FBakMsRUFBb0M7QUFDbENHLGNBQVFGLE9BQU9ELENBQVAsQ0FBUjtBQUNBaUQsYUFBTzlDLE1BQU0sQ0FBTixDQUFQO0FBQ0EsVUFBSThDLFNBQVMsU0FBVCxJQUF1QkEsU0FBUyxPQUFULElBQW9CakQsTUFBTWQsU0FBUyxDQUE5RCxFQUFrRTtBQUNoRWdFLGdCQUFRLEtBQVI7QUFDRCxPQUZELE1BRU87QUFDTHpCLGlCQUFTdEIsTUFBTSxDQUFOLENBQVQ7QUFDRDtBQUNGO0FBQ0QsUUFBSSxDQUFDK0MsS0FBTCxFQUFZO0FBQ1YsVUFBSUMsTUFBTWxELE9BQU9tRCxNQUFQLENBQWMsVUFBQ0MsR0FBRCxFQUFNckQsQ0FBTjtBQUFBLGVBQVlxRCxNQUFNckQsRUFBRSxDQUFGLENBQWxCO0FBQUEsT0FBZCxFQUFzQyxFQUF0QyxDQUFWO0FBQ0EsVUFBSXNCLE1BQU1yQixPQUFPbUQsTUFBUCxDQUFjLFVBQUNDLEdBQUQsRUFBTXJELENBQU4sRUFBWTtBQUNsQyxZQUFJQSxFQUFFLENBQUYsTUFBUyxTQUFULElBQXNCQSxFQUFFLENBQUYsTUFBUyxRQUFuQyxFQUE2QztBQUMzQyxpQkFBT3FELE1BQU0sS0FBTixHQUFjckQsRUFBRSxDQUFGLEVBQUtVLEtBQUwsQ0FBVyxDQUFYLEVBQWM0QyxJQUFkLEVBQWQsR0FBcUMsS0FBNUM7QUFDRCxTQUZELE1BRU87QUFDTCxpQkFBT0QsTUFBTXJELEVBQUUsQ0FBRixDQUFiO0FBQ0Q7QUFDRixPQU5TLEVBTVAsRUFOTyxDQUFWO0FBT0FJLFdBQUtQLElBQUwsQ0FBVTZCLElBQVYsSUFBa0IsRUFBRUQsWUFBRixFQUFTSCxRQUFULEVBQWxCO0FBQ0EsVUFBSTZCLFFBQVE3QixHQUFaLEVBQWlCbEIsS0FBS1AsSUFBTCxDQUFVNkIsSUFBVixFQUFnQnlCLEdBQWhCLEdBQXNCQSxHQUF0QjtBQUNsQjtBQUNEL0MsU0FBS3NCLElBQUwsSUFBYUQsS0FBYjs7QUFFQSxRQUFJdkIsYUFBSjtBQUNBLFNBQUssSUFBSUYsTUFBSUMsT0FBT2YsTUFBUCxHQUFnQixDQUE3QixFQUFnQ2MsT0FBSyxDQUFyQyxFQUF3Q0EsS0FBeEMsRUFBNkM7QUFDM0MsVUFBSUMsT0FBT0QsR0FBUCxFQUFVZCxNQUFWLEdBQW1CLENBQXZCLEVBQTBCO0FBQ3hCZ0IsZUFBT0QsT0FBT0QsR0FBUCxDQUFQO0FBQ0E7QUFDRDtBQUNGO0FBQ0QsUUFBSSxDQUFDRSxJQUFMLEVBQVdBLE9BQU84QyxPQUFQOztBQUVYNUMsU0FBS3pCLE1BQUwsQ0FBWWEsR0FBWixHQUFrQjtBQUNoQlgsWUFBTXFCLEtBQUssQ0FBTCxLQUFXQSxLQUFLLENBQUwsQ0FERDtBQUVoQnBCLGNBQVFvQixLQUFLLENBQUwsS0FBV0EsS0FBSyxDQUFMO0FBRkgsS0FBbEI7QUFJRCxHOzttQkFFRFgsYywyQkFBZ0JyQixHLEVBQUs7QUFDbkIsUUFBSW9CLE9BQU9wQixHQUFYO0FBQ0EsUUFBSWMsYUFBSjtBQUNBLFdBQU9NLE9BQU8sS0FBS0wsS0FBTCxDQUFXQyxNQUF6QixFQUFpQztBQUMvQkksY0FBUSxDQUFSO0FBQ0FOLGFBQU8sS0FBS0MsS0FBTCxDQUFXSyxJQUFYLENBQVA7QUFDQSxVQUFJTixLQUFLUSxHQUFMLElBQVksQ0FBQ1IsS0FBS0csT0FBdEIsRUFBK0I7QUFDaEM7QUFDRCxXQUFPSCxJQUFQO0FBQ0QsRzs7bUJBRUR1QixXLHdCQUFhSCxJLEVBQU1ELEssRUFBTztBQUN4QixRQUFJb0QsT0FBT3BELE1BQU0sQ0FBTixDQUFYO0FBQ0EsUUFBSUEsTUFBTSxDQUFOLE1BQWEsUUFBakIsRUFBMkI7QUFDekJDLFdBQUtQLElBQUwsQ0FBVTJELE1BQVYsR0FBbUIsSUFBbkI7QUFDQUQsYUFBT0EsS0FBSzdDLEtBQUwsQ0FBVyxDQUFYLENBQVA7QUFDRCxLQUhELE1BR087QUFDTDZDLGFBQU9BLEtBQUs3QyxLQUFMLENBQVcsQ0FBWCxFQUFjLENBQUMsQ0FBZixDQUFQO0FBQ0Q7O0FBRUQsUUFBSStDLFFBQVFGLEtBQUtFLEtBQUwsQ0FBVyw0QkFBWCxDQUFaO0FBQ0EsUUFBSUEsS0FBSixFQUFXO0FBQ1RyRCxXQUFLbUQsSUFBTCxHQUFZRSxNQUFNLENBQU4sQ0FBWjtBQUNBckQsV0FBS1AsSUFBTCxDQUFVNkQsSUFBVixHQUFpQkQsTUFBTSxDQUFOLENBQWpCO0FBQ0FyRCxXQUFLUCxJQUFMLENBQVU4RCxXQUFWLEdBQXdCRixNQUFNLENBQU4sQ0FBeEI7QUFDRCxLQUpELE1BSU87QUFDTHJELFdBQUttRCxJQUFMLEdBQVksRUFBWjtBQUNBbkQsV0FBS1AsSUFBTCxDQUFVNkQsSUFBVixHQUFpQixFQUFqQjtBQUNBdEQsV0FBS1AsSUFBTCxDQUFVOEQsV0FBVixHQUF3QixFQUF4QjtBQUNEO0FBQ0YsRzs7QUFFRDs7bUJBRUFoQixLLGtCQUFPaUIsRyxFQUFLL0UsSSxFQUFNQyxNLEVBQVE7QUFDeEIsVUFBTSxLQUFLYixLQUFMLENBQVcwRSxLQUFYLENBQWlCaUIsR0FBakIsRUFBc0IvRSxJQUF0QixFQUE0QkMsTUFBNUIsQ0FBTjtBQUNELEc7O21CQUVEK0IsYSwwQkFBZVYsSyxFQUFPO0FBQ3BCLFNBQUt3QyxLQUFMLENBQVcsc0JBQVgsRUFBbUN4QyxNQUFNLENBQU4sQ0FBbkMsRUFBNkNBLE1BQU0sQ0FBTixDQUE3QztBQUNELEc7O21CQUVEeUIsVyx3QkFBYXpCLEssRUFBTztBQUNsQixTQUFLd0MsS0FBTCxDQUFXLDBCQUFYLEVBQXVDeEMsTUFBTSxDQUFOLENBQXZDLEVBQWlEQSxNQUFNLENBQU4sQ0FBakQ7QUFDRCxHOzttQkFFRGtDLGlCLDhCQUFtQnJELEksRUFBTTtBQUN2QixTQUFLMkQsS0FBTCxDQUFXLG1DQUFYLEVBQWdEM0QsS0FBSzZFLE1BQXJELEVBQTZELENBQTdEO0FBQ0QsRzs7bUJBRUR0QixXLHdCQUFhdUIsUSxFQUFVQyxJLEVBQU0vRSxJLEVBQU07QUFDakMsUUFBSTRFLG9CQUFtQkUsUUFBbkIseUJBQWlEQyxJQUFyRDtBQUNBLFNBQUtwQixLQUFMLENBQVdpQixHQUFYLEVBQWdCNUUsS0FBSzZFLE1BQXJCLEVBQTZCLENBQTdCO0FBQ0QsRzs7bUJBRURsQyxPLG9CQUFTeEIsSyxFQUFPO0FBQ2QsU0FBS3dDLEtBQUwsQ0FBVyxrQ0FBWCxFQUErQ3hDLE1BQU0sQ0FBTixDQUEvQyxFQUF5REEsTUFBTSxDQUFOLENBQXpEO0FBQ0QsRzs7Ozs7a0JBOVhrQm5DLE0iLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERlY2xhcmF0aW9uIGZyb20gJ3Bvc3Rjc3MvbGliL2RlY2xhcmF0aW9uJ1xuaW1wb3J0IENvbW1lbnQgZnJvbSAncG9zdGNzcy9saWIvY29tbWVudCdcbmltcG9ydCBBdFJ1bGUgZnJvbSAncG9zdGNzcy9saWIvYXQtcnVsZSdcbmltcG9ydCBSdWxlIGZyb20gJ3Bvc3Rjc3MvbGliL3J1bGUnXG5pbXBvcnQgUm9vdCBmcm9tICdwb3N0Y3NzL2xpYi9yb290J1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzZXIge1xuICBjb25zdHJ1Y3RvciAoaW5wdXQpIHtcbiAgICB0aGlzLmlucHV0ID0gaW5wdXRcblxuICAgIHRoaXMucG9zID0gMFxuICAgIHRoaXMucm9vdCA9IG5ldyBSb290KClcbiAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnJvb3RcbiAgICB0aGlzLnNwYWNlcyA9ICcnXG5cbiAgICB0aGlzLmV4dHJhSW5kZW50ID0gZmFsc2VcbiAgICB0aGlzLnByZXZJbmRlbnQgPSB1bmRlZmluZWRcbiAgICB0aGlzLnN0ZXAgPSB1bmRlZmluZWRcblxuICAgIHRoaXMucm9vdC5zb3VyY2UgPSB7IGlucHV0LCBzdGFydDogeyBsaW5lOiAxLCBjb2x1bW46IDEgfSB9XG4gIH1cblxuICBsb29wICgpIHtcbiAgICBsZXQgcGFydFxuICAgIHdoaWxlICh0aGlzLnBvcyA8IHRoaXMucGFydHMubGVuZ3RoKSB7XG4gICAgICBwYXJ0ID0gdGhpcy5wYXJ0c1t0aGlzLnBvc11cblxuICAgICAgaWYgKHBhcnQuY29tbWVudCkge1xuICAgICAgICB0aGlzLmNvbW1lbnQocGFydClcbiAgICAgIH0gZWxzZSBpZiAocGFydC5hdHJ1bGUpIHtcbiAgICAgICAgdGhpcy5hdHJ1bGUocGFydClcbiAgICAgIH0gZWxzZSBpZiAocGFydC5jb2xvbikge1xuICAgICAgICBsZXQgbmV4dCA9IHRoaXMubmV4dE5vbkNvbW1lbnQodGhpcy5wb3MpXG5cbiAgICAgICAgaWYgKG5leHQuZW5kIHx8IG5leHQuYXRydWxlKSB7XG4gICAgICAgICAgdGhpcy5kZWNsKHBhcnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IG1vcmVJbmRlbnQgPSBuZXh0LmluZGVudC5sZW5ndGggPiBwYXJ0LmluZGVudC5sZW5ndGhcbiAgICAgICAgICBpZiAoIW1vcmVJbmRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjbChwYXJ0KVxuICAgICAgICAgIH0gZWxzZSBpZiAobW9yZUluZGVudCAmJiBuZXh0LmNvbG9uKSB7XG4gICAgICAgICAgICB0aGlzLnJ1bGUocGFydClcbiAgICAgICAgICB9IGVsc2UgaWYgKG1vcmVJbmRlbnQgJiYgIW5leHQuY29sb24pIHtcbiAgICAgICAgICAgIHRoaXMuZGVjbChwYXJ0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYXJ0LmVuZCkge1xuICAgICAgICB0aGlzLnJvb3QucmF3cy5hZnRlciA9IHBhcnQuYmVmb3JlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJ1bGUocGFydClcbiAgICAgIH1cblxuICAgICAgdGhpcy5wb3MgKz0gMVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSB0aGlzLnRva2Vucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKHRoaXMudG9rZW5zW2ldLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLnRva2Vuc1tpXVxuICAgICAgICB0aGlzLnJvb3Quc291cmNlLmVuZCA9IHtcbiAgICAgICAgICBsaW5lOiBsYXN0WzRdIHx8IGxhc3RbMl0sXG4gICAgICAgICAgY29sdW1uOiBsYXN0WzVdIHx8IGxhc3RbM11cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbW1lbnQgKHBhcnQpIHtcbiAgICBsZXQgdG9rZW4gPSBwYXJ0LnRva2Vuc1swXVxuICAgIGxldCBub2RlID0gbmV3IENvbW1lbnQoKVxuICAgIHRoaXMuaW5pdChub2RlLCBwYXJ0KVxuICAgIG5vZGUuc291cmNlLmVuZCA9IHsgbGluZTogdG9rZW5bNF0sIGNvbHVtbjogdG9rZW5bNV0gfVxuICAgIHRoaXMuY29tbWVudFRleHQobm9kZSwgdG9rZW4pXG4gIH1cblxuICBhdHJ1bGUgKHBhcnQpIHtcbiAgICBsZXQgYXR3b3JkID0gcGFydC50b2tlbnNbMF1cbiAgICBsZXQgcGFyYW1zID0gcGFydC50b2tlbnMuc2xpY2UoMSlcblxuICAgIGxldCBub2RlID0gbmV3IEF0UnVsZSgpXG4gICAgbm9kZS5uYW1lID0gYXR3b3JkWzFdLnNsaWNlKDEpXG4gICAgdGhpcy5pbml0KG5vZGUsIHBhcnQpXG5cbiAgICBpZiAobm9kZS5uYW1lID09PSAnJykgdGhpcy51bm5hbWVkQXRydWxlKGF0d29yZClcblxuICAgIHdoaWxlICghcGFydC5lbmQgJiYgcGFydC5sYXN0Q29tbWEpIHtcbiAgICAgIHRoaXMucG9zICs9IDFcbiAgICAgIHBhcnQgPSB0aGlzLnBhcnRzW3RoaXMucG9zXVxuICAgICAgcGFyYW1zLnB1c2goWydzcGFjZScsIHBhcnQuYmVmb3JlICsgcGFydC5pbmRlbnRdKVxuICAgICAgcGFyYW1zID0gcGFyYW1zLmNvbmNhdChwYXJ0LnRva2VucylcbiAgICB9XG5cbiAgICBub2RlLnJhd3MuYWZ0ZXJOYW1lID0gdGhpcy5maXJzdFNwYWNlcyhwYXJhbXMpXG4gICAgdGhpcy5rZWVwVHJhaWxpbmdTcGFjZShub2RlLCBwYXJhbXMpXG4gICAgdGhpcy5jaGVja1NlbWljb2xvbihwYXJhbXMpXG4gICAgdGhpcy5jaGVja0N1cmx5KHBhcmFtcylcbiAgICB0aGlzLnJhdyhub2RlLCAncGFyYW1zJywgcGFyYW1zLCBhdHdvcmQpXG4gIH1cblxuICBkZWNsIChwYXJ0KSB7XG4gICAgbGV0IG5vZGUgPSBuZXcgRGVjbGFyYXRpb24oKVxuICAgIHRoaXMuaW5pdChub2RlLCBwYXJ0KVxuXG4gICAgbGV0IGJldHdlZW4gPSAnJ1xuICAgIGxldCBjb2xvbiA9IDBcbiAgICBsZXQgdmFsdWUgPSBbXVxuICAgIGxldCBwcm9wID0gJydcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnQudG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgdG9rZW4gPSBwYXJ0LnRva2Vuc1tpXVxuICAgICAgaWYgKHRva2VuWzBdID09PSAnOicpIHtcbiAgICAgICAgYmV0d2VlbiArPSB0b2tlblsxXVxuICAgICAgICBjb2xvbiA9IHRva2VuXG4gICAgICAgIHZhbHVlID0gcGFydC50b2tlbnMuc2xpY2UoaSArIDEpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGVsc2UgaWYgKHRva2VuWzBdID09PSAnY29tbWVudCcgfHwgdG9rZW5bMF0gPT09ICdzcGFjZScpIHtcbiAgICAgICAgYmV0d2VlbiArPSB0b2tlblsxXVxuICAgICAgfSBlbHNlIGlmIChiZXR3ZWVuICE9PSAnJykge1xuICAgICAgICB0aGlzLmJhZFByb3AodG9rZW4pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wICs9IHRva2VuWzFdXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICcnKSB0aGlzLnVubmFtZWREZWNsKHBhcnQudG9rZW5zWzBdKVxuICAgIG5vZGUucHJvcCA9IHByb3BcblxuICAgIGxldCBuZXh0ID0gdGhpcy5wYXJ0c1t0aGlzLnBvcyArIDFdXG5cbiAgICB3aGlsZSAoIW5leHQuZW5kICYmICFuZXh0LmF0cnVsZSAmJiAhbmV4dC5jb2xvbiAmJlxuICAgICAgICAgICAgICAgIG5leHQuaW5kZW50Lmxlbmd0aCA+IHBhcnQuaW5kZW50Lmxlbmd0aCkge1xuICAgICAgdmFsdWUucHVzaChbJ3NwYWNlJywgbmV4dC5iZWZvcmUgKyBuZXh0LmluZGVudF0pXG4gICAgICB2YWx1ZSA9IHZhbHVlLmNvbmNhdChuZXh0LnRva2VucylcbiAgICAgIHRoaXMucG9zICs9IDFcbiAgICAgIG5leHQgPSB0aGlzLnBhcnRzW3RoaXMucG9zICsgMV1cbiAgICB9XG5cbiAgICBsZXQgbGFzdCA9IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdXG4gICAgaWYgKGxhc3QgJiYgbGFzdFswXSA9PT0gJ2NvbW1lbnQnKSB7XG4gICAgICB2YWx1ZS5wb3AoKVxuICAgICAgbGV0IGNvbW1lbnQgPSBuZXcgQ29tbWVudCgpXG4gICAgICB0aGlzLmN1cnJlbnQucHVzaChjb21tZW50KVxuICAgICAgY29tbWVudC5zb3VyY2UgPSB7XG4gICAgICAgIGlucHV0OiB0aGlzLmlucHV0LFxuICAgICAgICBzdGFydDogeyBsaW5lOiBsYXN0WzJdLCBjb2x1bW46IGxhc3RbM10gfSxcbiAgICAgICAgZW5kOiB7IGxpbmU6IGxhc3RbNF0sIGNvbHVtbjogbGFzdFs1XSB9XG4gICAgICB9XG4gICAgICBsZXQgcHJldiA9IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdXG4gICAgICBpZiAocHJldiAmJiBwcmV2WzBdID09PSAnc3BhY2UnKSB7XG4gICAgICAgIHZhbHVlLnBvcCgpXG4gICAgICAgIGNvbW1lbnQucmF3cy5iZWZvcmUgPSBwcmV2WzFdXG4gICAgICB9XG4gICAgICB0aGlzLmNvbW1lbnRUZXh0KGNvbW1lbnQsIGxhc3QpXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IHZhbHVlLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgIGxldCB0ID0gdmFsdWVbaV1bMF1cbiAgICAgIGlmICh0ID09PSAnd29yZCcgJiYgdmFsdWVbaV1bMV0gPT09ICchaW1wb3J0YW50Jykge1xuICAgICAgICBub2RlLmltcG9ydGFudCA9IHRydWVcbiAgICAgICAgaWYgKGkgPiAwICYmIHZhbHVlW2kgLSAxXVswXSA9PT0gJ3NwYWNlJykge1xuICAgICAgICAgIG5vZGUucmF3cy5pbXBvcnRhbnQgPSB2YWx1ZVtpIC0gMV1bMV0gKyAnIWltcG9ydGFudCdcbiAgICAgICAgICB2YWx1ZS5zcGxpY2UoaSAtIDEsIDIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZS5yYXdzLmltcG9ydGFudCA9ICchaW1wb3J0YW50J1xuICAgICAgICAgIHZhbHVlLnNwbGljZShpLCAxKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9IGVsc2UgaWYgKHQgIT09ICdzcGFjZScgJiYgdCAhPT0gJ25ld2xpbmUnICYmIHQgIT09ICdjb21tZW50Jykge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUucmF3cy5iZXR3ZWVuID0gYmV0d2VlbiArIHRoaXMuZmlyc3RTcGFjZXModmFsdWUpXG4gICAgdGhpcy5jaGVja1NlbWljb2xvbih2YWx1ZSlcbiAgICB0aGlzLnJhdyhub2RlLCAndmFsdWUnLCB2YWx1ZSwgY29sb24pXG4gIH1cblxuICBydWxlIChwYXJ0KSB7XG4gICAgbGV0IG5vZGUgPSBuZXcgUnVsZSgpXG4gICAgdGhpcy5pbml0KG5vZGUsIHBhcnQpXG5cbiAgICBsZXQgc2VsZWN0b3IgPSBwYXJ0LnRva2Vuc1xuICAgIGxldCBuZXh0ID0gdGhpcy5wYXJ0c1t0aGlzLnBvcyArIDFdXG5cbiAgICB3aGlsZSAoIW5leHQuZW5kICYmIG5leHQuaW5kZW50Lmxlbmd0aCA9PT0gcGFydC5pbmRlbnQubGVuZ3RoKSB7XG4gICAgICBzZWxlY3Rvci5wdXNoKFsnc3BhY2UnLCBuZXh0LmJlZm9yZSArIG5leHQuaW5kZW50XSlcbiAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IuY29uY2F0KG5leHQudG9rZW5zKVxuICAgICAgdGhpcy5wb3MgKz0gMVxuICAgICAgbmV4dCA9IHRoaXMucGFydHNbdGhpcy5wb3MgKyAxXVxuICAgIH1cblxuICAgIHRoaXMua2VlcFRyYWlsaW5nU3BhY2Uobm9kZSwgc2VsZWN0b3IpXG4gICAgdGhpcy5jaGVja0N1cmx5KHNlbGVjdG9yKVxuICAgIHRoaXMucmF3KG5vZGUsICdzZWxlY3RvcicsIHNlbGVjdG9yKVxuICB9XG5cbiAgLyogSGVscGVycyAqL1xuXG4gIGluZGVudCAocGFydCkge1xuICAgIGxldCBpbmRlbnQgPSBwYXJ0LmluZGVudC5sZW5ndGhcbiAgICBsZXQgaXNQcmV2ID0gdHlwZW9mIHRoaXMucHJldkluZGVudCAhPT0gJ3VuZGVmaW5lZCdcblxuICAgIGlmICghaXNQcmV2ICYmIGluZGVudCkgdGhpcy5pbmRlbnRlZEZpcnN0TGluZShwYXJ0KVxuXG4gICAgaWYgKCF0aGlzLnN0ZXAgJiYgaW5kZW50KSB7XG4gICAgICB0aGlzLnN0ZXAgPSBpbmRlbnRcbiAgICAgIHRoaXMucm9vdC5yYXdzLmluZGVudCA9IHBhcnQuaW5kZW50XG4gICAgfVxuXG4gICAgaWYgKGlzUHJldiAmJiB0aGlzLnByZXZJbmRlbnQgIT09IGluZGVudCkge1xuICAgICAgbGV0IGRpZmYgPSBpbmRlbnQgLSB0aGlzLnByZXZJbmRlbnRcbiAgICAgIGlmIChkaWZmID4gMCkge1xuICAgICAgICBpZiAoZGlmZiAhPT0gdGhpcy5zdGVwKSB7XG4gICAgICAgICAgdGhpcy53cm9uZ0luZGVudCh0aGlzLnByZXZJbmRlbnQgKyB0aGlzLnN0ZXAsIGluZGVudCwgcGFydClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnQubGFzdC5wdXNoKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5jdXJyZW50Lmxhc3RcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmV4dHJhSW5kZW50ID0gJydcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZmY7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5leHRyYUluZGVudCArPSAnICdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlmZiAlIHRoaXMuc3RlcCAhPT0gMCkge1xuICAgICAgICBsZXQgbSA9IGluZGVudCArIGRpZmYgJSB0aGlzLnN0ZXBcbiAgICAgICAgdGhpcy53cm9uZ0luZGVudChgJHsgbSB9IG9yICR7IG0gKyB0aGlzLnN0ZXAgfWAsIGluZGVudCwgcGFydClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgLWRpZmYgLyB0aGlzLnN0ZXA7IGkrKykge1xuICAgICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuY3VycmVudC5wYXJlbnRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucHJldkluZGVudCA9IGluZGVudFxuICB9XG5cbiAgaW5pdCAobm9kZSwgcGFydCkge1xuICAgIHRoaXMuaW5kZW50KHBhcnQpXG5cbiAgICBpZiAoIXRoaXMuY3VycmVudC5ub2RlcykgdGhpcy5jdXJyZW50Lm5vZGVzID0gW11cbiAgICB0aGlzLmN1cnJlbnQucHVzaChub2RlKVxuXG4gICAgbm9kZS5yYXdzLmJlZm9yZSA9IHBhcnQuYmVmb3JlICsgcGFydC5pbmRlbnRcbiAgICBpZiAodGhpcy5leHRyYUluZGVudCkge1xuICAgICAgbm9kZS5yYXdzLmV4dHJhSW5kZW50ID0gdGhpcy5leHRyYUluZGVudFxuICAgICAgdGhpcy5leHRyYUluZGVudCA9IGZhbHNlXG4gICAgfVxuICAgIG5vZGUuc291cmNlID0ge1xuICAgICAgc3RhcnQ6IHsgbGluZTogcGFydC50b2tlbnNbMF1bMl0sIGNvbHVtbjogcGFydC50b2tlbnNbMF1bM10gfSxcbiAgICAgIGlucHV0OiB0aGlzLmlucHV0XG4gICAgfVxuICB9XG5cbiAgY2hlY2tDdXJseSAodG9rZW5zKSB7XG4gICAgZm9yIChsZXQgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICBpZiAodG9rZW5bMF0gPT09ICd7Jykge1xuICAgICAgICB0aGlzLmVycm9yKCdVbm5lY2Vzc2FyeSBjdXJseSBicmFja2V0JywgdG9rZW5bMl0sIHRva2VuWzNdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoZWNrU2VtaWNvbG9uICh0b2tlbnMpIHtcbiAgICBmb3IgKGxldCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgIGlmICh0b2tlblswXSA9PT0gJzsnKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoJ1VubmVjZXNzYXJ5IHNlbWljb2xvbicsIHRva2VuWzJdLCB0b2tlblszXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBrZWVwVHJhaWxpbmdTcGFjZSAobm9kZSwgdG9rZW5zKSB7XG4gICAgbGV0IGxhc3RTcGFjZSA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV1cbiAgICBpZiAobGFzdFNwYWNlICYmIGxhc3RTcGFjZVswXSA9PT0gJ3NwYWNlJykge1xuICAgICAgdG9rZW5zLnBvcCgpXG4gICAgICBub2RlLnJhd3Muc3NzQmV0d2VlbiA9IGxhc3RTcGFjZVsxXVxuICAgIH1cbiAgfVxuXG4gIGZpcnN0U3BhY2VzICh0b2tlbnMpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRva2Vuc1tpXVswXSA9PT0gJ3NwYWNlJyB8fCB0b2tlbnNbaV1bMF0gPT09ICduZXdsaW5lJykge1xuICAgICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClbMV1cbiAgICAgICAgaSAtPSAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByYXcgKG5vZGUsIHByb3AsIHRva2VucywgYWx0TGFzdCkge1xuICAgIGxldCB0b2tlbiwgdHlwZVxuICAgIGxldCBsZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgbGV0IHZhbHVlID0gJydcbiAgICBsZXQgY2xlYW4gPSB0cnVlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdG9rZW4gPSB0b2tlbnNbaV1cbiAgICAgIHR5cGUgPSB0b2tlblswXVxuICAgICAgaWYgKHR5cGUgPT09ICdjb21tZW50JyB8fCAodHlwZSA9PT0gJ3NwYWNlJyAmJiBpID09PSBsZW5ndGggLSAxKSkge1xuICAgICAgICBjbGVhbiA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSArPSB0b2tlblsxXVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWNsZWFuKSB7XG4gICAgICBsZXQgc3NzID0gdG9rZW5zLnJlZHVjZSgoYWxsLCBpKSA9PiBhbGwgKyBpWzFdLCAnJylcbiAgICAgIGxldCByYXcgPSB0b2tlbnMucmVkdWNlKChhbGwsIGkpID0+IHtcbiAgICAgICAgaWYgKGlbMF0gPT09ICdjb21tZW50JyAmJiBpWzZdID09PSAnaW5saW5lJykge1xuICAgICAgICAgIHJldHVybiBhbGwgKyAnLyogJyArIGlbMV0uc2xpY2UoMikudHJpbSgpICsgJyAqLydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gYWxsICsgaVsxXVxuICAgICAgICB9XG4gICAgICB9LCAnJylcbiAgICAgIG5vZGUucmF3c1twcm9wXSA9IHsgdmFsdWUsIHJhdyB9XG4gICAgICBpZiAoc3NzICE9PSByYXcpIG5vZGUucmF3c1twcm9wXS5zc3MgPSBzc3NcbiAgICB9XG4gICAgbm9kZVtwcm9wXSA9IHZhbHVlXG5cbiAgICBsZXQgbGFzdFxuICAgIGZvciAobGV0IGkgPSB0b2tlbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICh0b2tlbnNbaV0ubGVuZ3RoID4gMikge1xuICAgICAgICBsYXN0ID0gdG9rZW5zW2ldXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghbGFzdCkgbGFzdCA9IGFsdExhc3RcblxuICAgIG5vZGUuc291cmNlLmVuZCA9IHtcbiAgICAgIGxpbmU6IGxhc3RbNF0gfHwgbGFzdFsyXSxcbiAgICAgIGNvbHVtbjogbGFzdFs1XSB8fCBsYXN0WzNdXG4gICAgfVxuICB9XG5cbiAgbmV4dE5vbkNvbW1lbnQgKHBvcykge1xuICAgIGxldCBuZXh0ID0gcG9zXG4gICAgbGV0IHBhcnRcbiAgICB3aGlsZSAobmV4dCA8IHRoaXMucGFydHMubGVuZ3RoKSB7XG4gICAgICBuZXh0ICs9IDFcbiAgICAgIHBhcnQgPSB0aGlzLnBhcnRzW25leHRdXG4gICAgICBpZiAocGFydC5lbmQgfHwgIXBhcnQuY29tbWVudCkgYnJlYWtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRcbiAgfVxuXG4gIGNvbW1lbnRUZXh0IChub2RlLCB0b2tlbikge1xuICAgIGxldCB0ZXh0ID0gdG9rZW5bMV1cbiAgICBpZiAodG9rZW5bNl0gPT09ICdpbmxpbmUnKSB7XG4gICAgICBub2RlLnJhd3MuaW5saW5lID0gdHJ1ZVxuICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMilcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMiwgLTIpXG4gICAgfVxuXG4gICAgbGV0IG1hdGNoID0gdGV4dC5tYXRjaCgvXihcXHMqKShbXl0qW15cXHNdKShcXHMqKVxcbj8kLylcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIG5vZGUudGV4dCA9IG1hdGNoWzJdXG4gICAgICBub2RlLnJhd3MubGVmdCA9IG1hdGNoWzFdXG4gICAgICBub2RlLnJhd3MuaW5saW5lUmlnaHQgPSBtYXRjaFszXVxuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnRleHQgPSAnJ1xuICAgICAgbm9kZS5yYXdzLmxlZnQgPSAnJ1xuICAgICAgbm9kZS5yYXdzLmlubGluZVJpZ2h0ID0gJydcbiAgICB9XG4gIH1cblxuICAvLyBFcnJvcnNcblxuICBlcnJvciAobXNnLCBsaW5lLCBjb2x1bW4pIHtcbiAgICB0aHJvdyB0aGlzLmlucHV0LmVycm9yKG1zZywgbGluZSwgY29sdW1uKVxuICB9XG5cbiAgdW5uYW1lZEF0cnVsZSAodG9rZW4pIHtcbiAgICB0aGlzLmVycm9yKCdBdC1ydWxlIHdpdGhvdXQgbmFtZScsIHRva2VuWzJdLCB0b2tlblszXSlcbiAgfVxuXG4gIHVubmFtZWREZWNsICh0b2tlbikge1xuICAgIHRoaXMuZXJyb3IoJ0RlY2xhcmF0aW9uIHdpdGhvdXQgbmFtZScsIHRva2VuWzJdLCB0b2tlblszXSlcbiAgfVxuXG4gIGluZGVudGVkRmlyc3RMaW5lIChwYXJ0KSB7XG4gICAgdGhpcy5lcnJvcignRmlyc3QgbGluZSBzaG91bGQgbm90IGhhdmUgaW5kZW50JywgcGFydC5udW1iZXIsIDEpXG4gIH1cblxuICB3cm9uZ0luZGVudCAoZXhwZWN0ZWQsIHJlYWwsIHBhcnQpIHtcbiAgICBsZXQgbXNnID0gYEV4cGVjdGVkICR7IGV4cGVjdGVkIH0gaW5kZW50LCBidXQgZ2V0ICR7IHJlYWwgfWBcbiAgICB0aGlzLmVycm9yKG1zZywgcGFydC5udW1iZXIsIDEpXG4gIH1cblxuICBiYWRQcm9wICh0b2tlbikge1xuICAgIHRoaXMuZXJyb3IoJ1VuZXhwZWN0ZWQgc2VwYXJhdG9yIGluIHByb3BlcnR5JywgdG9rZW5bMl0sIHRva2VuWzNdKVxuICB9XG59XG4iXX0=
|