@glimmer/syntax
Version:
510 lines (442 loc) • 47.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _util = require("@glimmer/util");
var _location = require("../source/location");
var _source2 = require("../source/source");
var _span = require("../source/span");
var _legacyInterop = require("./legacy-interop");
var _SOURCE;
function SOURCE() {
if (!_SOURCE) {
_SOURCE = new _source2.Source('', '(synthetic)');
}
return _SOURCE;
}
function buildMustache(path, params, hash, raw, loc, strip) {
if (typeof path === 'string') {
path = buildPath(path);
}
return {
type: 'MustacheStatement',
path: path,
params: params || [],
hash: hash || buildHash([]),
escaped: !raw,
trusting: !!raw,
loc: buildLoc(loc || null),
strip: strip || {
open: false,
close: false
}
};
}
function buildBlock(path, params, hash, _defaultBlock, _elseBlock, loc, openStrip, inverseStrip, closeStrip) {
var defaultBlock;
var elseBlock;
if (_defaultBlock.type === 'Template') {
if (false
/* LOCAL_DEBUG */
) {
false && !false && (0, _util.deprecate)("b.program is deprecated. Use b.blockItself instead.");
}
defaultBlock = (0, _util.assign)({}, _defaultBlock, {
type: 'Block'
});
} else {
defaultBlock = _defaultBlock;
}
if (_elseBlock !== undefined && _elseBlock !== null && _elseBlock.type === 'Template') {
if (false
/* LOCAL_DEBUG */
) {
false && !false && (0, _util.deprecate)("b.program is deprecated. Use b.blockItself instead.");
}
elseBlock = (0, _util.assign)({}, _elseBlock, {
type: 'Block'
});
} else {
elseBlock = _elseBlock;
}
return {
type: 'BlockStatement',
path: buildPath(path),
params: params || [],
hash: hash || buildHash([]),
program: defaultBlock || null,
inverse: elseBlock || null,
loc: buildLoc(loc || null),
openStrip: openStrip || {
open: false,
close: false
},
inverseStrip: inverseStrip || {
open: false,
close: false
},
closeStrip: closeStrip || {
open: false,
close: false
}
};
}
function buildElementModifier(path, params, hash, loc) {
return {
type: 'ElementModifierStatement',
path: buildPath(path),
params: params || [],
hash: hash || buildHash([]),
loc: buildLoc(loc || null)
};
}
function buildPartial(name, params, hash, indent, loc) {
return {
type: 'PartialStatement',
name: name,
params: params || [],
hash: hash || buildHash([]),
indent: indent || '',
strip: {
open: false,
close: false
},
loc: buildLoc(loc || null)
};
}
function buildComment(value, loc) {
return {
type: 'CommentStatement',
value: value,
loc: buildLoc(loc || null)
};
}
function buildMustacheComment(value, loc) {
return {
type: 'MustacheCommentStatement',
value: value,
loc: buildLoc(loc || null)
};
}
function buildConcat(parts, loc) {
if (!(0, _util.isPresent)(parts)) {
throw new Error("b.concat requires at least one part");
}
return {
type: 'ConcatStatement',
parts: parts || [],
loc: buildLoc(loc || null)
};
}
function buildElement(tag, options) {
if (options === void 0) {
options = {};
}
var _options = options,
attrs = _options.attrs,
blockParams = _options.blockParams,
modifiers = _options.modifiers,
comments = _options.comments,
children = _options.children,
loc = _options.loc;
var tagName; // this is used for backwards compat, prior to `selfClosing` being part of the ElementNode AST
var selfClosing = false;
if (typeof tag === 'object') {
selfClosing = tag.selfClosing;
tagName = tag.name;
} else if (tag.slice(-1) === '/') {
tagName = tag.slice(0, -1);
selfClosing = true;
} else {
tagName = tag;
}
return {
type: 'ElementNode',
tag: tagName,
selfClosing: selfClosing,
attributes: attrs || [],
blockParams: blockParams || [],
modifiers: modifiers || [],
comments: comments || [],
children: children || [],
loc: buildLoc(loc || null)
};
}
function buildAttr(name, value, loc) {
return {
type: 'AttrNode',
name: name,
value: value,
loc: buildLoc(loc || null)
};
}
function buildText(chars, loc) {
return {
type: 'TextNode',
chars: chars || '',
loc: buildLoc(loc || null)
};
} // Expressions
function buildSexpr(path, params, hash, loc) {
return {
type: 'SubExpression',
path: buildPath(path),
params: params || [],
hash: hash || buildHash([]),
loc: buildLoc(loc || null)
};
}
function headToString(head) {
switch (head.type) {
case 'AtHead':
return {
original: head.name,
parts: [head.name]
};
case 'ThisHead':
return {
original: "this",
parts: []
};
case 'VarHead':
return {
original: head.name,
parts: [head.name]
};
}
}
function buildHead(original, loc) {
var _original$split = original.split('.'),
head = _original$split[0],
tail = _original$split.slice(1);
var headNode;
if (head === 'this') {
headNode = {
type: 'ThisHead',
loc: buildLoc(loc || null)
};
} else if (head[0] === '@') {
headNode = {
type: 'AtHead',
name: head,
loc: buildLoc(loc || null)
};
} else {
headNode = {
type: 'VarHead',
name: head,
loc: buildLoc(loc || null)
};
}
return {
head: headNode,
tail: tail
};
}
function buildThis(loc) {
return {
type: 'ThisHead',
loc: buildLoc(loc || null)
};
}
function buildAtName(name, loc) {
// the `@` should be included so we have a complete source range
false && (0, _util.assert)(name[0] === '@', "call builders.at() with a string that starts with '@'");
return {
type: 'AtHead',
name: name,
loc: buildLoc(loc || null)
};
}
function buildVar(name, loc) {
false && (0, _util.assert)(name !== 'this', "You called builders.var() with 'this'. Call builders.this instead");
false && (0, _util.assert)(name[0] !== '@', "You called builders.var() with '" + name + "'. Call builders.at('" + name + "') instead");
return {
type: 'VarHead',
name: name,
loc: buildLoc(loc || null)
};
}
function buildHeadFromString(head, loc) {
if (head[0] === '@') {
return buildAtName(head, loc);
} else if (head === 'this') {
return buildThis(loc);
} else {
return buildVar(head, loc);
}
}
function buildNamedBlockName(name, loc) {
return {
type: 'NamedBlockName',
name: name,
loc: buildLoc(loc || null)
};
}
function buildCleanPath(head, tail, loc) {
var _headToString = headToString(head),
originalHead = _headToString.original,
headParts = _headToString.parts;
var parts = [].concat(headParts, tail);
var original = [].concat(originalHead, parts).join('.');
return new _legacyInterop.PathExpressionImplV1(original, head, tail, buildLoc(loc || null));
}
function buildPath(path, loc) {
if (typeof path !== 'string') {
if ('type' in path) {
return path;
} else {
var _buildHead = buildHead(path.head, _span.SourceSpan.broken()),
_head = _buildHead.head,
_tail = _buildHead.tail;
false && (0, _util.assert)(_tail.length === 0, "builder.path({ head, tail }) should not be called with a head with dots in it");
var _headToString2 = headToString(_head),
originalHead = _headToString2.original;
return new _legacyInterop.PathExpressionImplV1([originalHead].concat(_tail).join('.'), _head, _tail, buildLoc(loc || null));
}
}
var _buildHead2 = buildHead(path, _span.SourceSpan.broken()),
head = _buildHead2.head,
tail = _buildHead2.tail;
return new _legacyInterop.PathExpressionImplV1(path, head, tail, buildLoc(loc || null));
}
function buildLiteral(type, value, loc) {
return {
type: type,
value: value,
original: value,
loc: buildLoc(loc || null)
};
} // Miscellaneous
function buildHash(pairs, loc) {
return {
type: 'Hash',
pairs: pairs || [],
loc: buildLoc(loc || null)
};
}
function buildPair(key, value, loc) {
return {
type: 'HashPair',
key: key,
value: value,
loc: buildLoc(loc || null)
};
}
function buildProgram(body, blockParams, loc) {
return {
type: 'Template',
body: body || [],
blockParams: blockParams || [],
loc: buildLoc(loc || null)
};
}
function buildBlockItself(body, blockParams, chained, loc) {
if (chained === void 0) {
chained = false;
}
return {
type: 'Block',
body: body || [],
blockParams: blockParams || [],
chained: chained,
loc: buildLoc(loc || null)
};
}
function buildTemplate(body, blockParams, loc) {
return {
type: 'Template',
body: body || [],
blockParams: blockParams || [],
loc: buildLoc(loc || null)
};
}
function buildPosition(line, column) {
return {
line: line,
column: column
};
}
function buildLoc() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
if (args.length === 1) {
var loc = args[0];
if (loc && typeof loc === 'object') {
return _span.SourceSpan.forHbsLoc(SOURCE(), loc);
} else {
return _span.SourceSpan.forHbsLoc(SOURCE(), _location.SYNTHETIC_LOCATION);
}
} else {
var startLine = args[0],
startColumn = args[1],
endLine = args[2],
endColumn = args[3],
_source = args[4];
var source = _source ? new _source2.Source('', _source) : SOURCE();
return _span.SourceSpan.forHbsLoc(source, {
start: {
line: startLine,
column: startColumn
},
end: {
line: endLine,
column: endColumn
}
});
}
}
var _default = {
mustache: buildMustache,
block: buildBlock,
partial: buildPartial,
comment: buildComment,
mustacheComment: buildMustacheComment,
element: buildElement,
elementModifier: buildElementModifier,
attr: buildAttr,
text: buildText,
sexpr: buildSexpr,
concat: buildConcat,
hash: buildHash,
pair: buildPair,
literal: buildLiteral,
program: buildProgram,
blockItself: buildBlockItself,
template: buildTemplate,
loc: buildLoc,
pos: buildPosition,
path: buildPath,
fullPath: buildCleanPath,
head: buildHeadFromString,
at: buildAtName,
"var": buildVar,
"this": buildThis,
blockName: buildNamedBlockName,
string: literal('StringLiteral'),
"boolean": literal('BooleanLiteral'),
number: literal('NumberLiteral'),
undefined: function (_undefined) {
function undefined() {
return _undefined.apply(this, arguments);
}
undefined.toString = function () {
return _undefined.toString();
};
return undefined;
}(function () {
return buildLiteral('UndefinedLiteral', undefined);
}),
"null": function _null() {
return buildLiteral('NullLiteral', null);
}
};
exports.default = _default;
function literal(type) {
return function (value, loc) {
return buildLiteral(type, value, loc);
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjEvcHVibGljLWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQSxJQUFBLE9BQUE7O0FBRUEsU0FBQSxNQUFBLEdBQWU7QUFDYixNQUFJLENBQUosT0FBQSxFQUFjO0FBQ1osSUFBQSxPQUFPLEdBQUcsSUFBQSxlQUFBLENBQUEsRUFBQSxFQUFWLGFBQVUsQ0FBVjtBQUNEOztBQUVELFNBQUEsT0FBQTtBQUNEOztBQVNELFNBQUEsYUFBQSxDQUFBLElBQUEsRUFBQSxNQUFBLEVBQUEsSUFBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEVBQUEsS0FBQSxFQU0wQjtBQUV4QixNQUFJLE9BQUEsSUFBQSxLQUFKLFFBQUEsRUFBOEI7QUFDNUIsSUFBQSxJQUFJLEdBQUcsU0FBUyxDQUFoQixJQUFnQixDQUFoQjtBQUNEOztBQUVELFNBQU87QUFDTCxJQUFBLElBQUksRUFEQyxtQkFBQTtBQUVMLElBQUEsSUFGSyxFQUFBLElBQUE7QUFHTCxJQUFBLE1BQU0sRUFBRSxNQUFNLElBSFQsRUFBQTtBQUlMLElBQUEsSUFBSSxFQUFFLElBQUksSUFBSSxTQUFTLENBSmxCLEVBSWtCLENBSmxCO0FBS0wsSUFBQSxPQUFPLEVBQUUsQ0FMSixHQUFBO0FBTUwsSUFBQSxRQUFRLEVBQUUsQ0FBQyxDQU5OLEdBQUE7QUFPTCxJQUFBLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxJQVBaLElBT1EsQ0FQUjtBQVFMLElBQUEsS0FBSyxFQUFFLEtBQUssSUFBSTtBQUFFLE1BQUEsSUFBSSxFQUFOLEtBQUE7QUFBZSxNQUFBLEtBQUssRUFBRTtBQUF0QjtBQVJYLEdBQVA7QUFVRDs7QUFFRCxTQUFBLFVBQUEsQ0FBQSxJQUFBLEVBQUEsTUFBQSxFQUFBLElBQUEsRUFBQSxhQUFBLEVBQUEsVUFBQSxFQUFBLEdBQUEs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RUFBRSxPQUFPLENBakNGLGVBaUNFLENBakNGO0FBa0NiLEVBQUEsU0FsQ2EsRUFBQSxVQUFBLFVBQUEsRUFBQTtBQUFBLGFBQUEsU0FBQSxHQUFBO0FBQUEsYUFBQSxVQUFBLENBQUEsS0FBQSxDQUFBLElBQUEsRUFBQSxTQUFBLENBQUE7QUFBQTs7QUFBQSxJQUFBLFNBQUEsQ0FBQSxRQUFBLEdBQUEsWUFBQTtBQUFBLGFBQUEsVUFBQSxDQUFBLFFBQUEsRUFBQTtBQUFBLEtBQUE7O0FBQUEsV0FBQSxTQUFBO0FBQUEsR0FBQSxDQUFBLFlBa0NKO0FBQ1AsV0FBTyxZQUFZLENBQUEsa0JBQUEsRUFBbkIsU0FBbUIsQ0FBbkI7QUFuQ1csR0FBQSxDQUFBO0FBQUEsVUFBQSxTQUFBLEtBQUEsR0FxQ1Q7QUFDRixXQUFPLFlBQVksQ0FBQSxhQUFBLEVBQW5CLElBQW1CLENBQW5CO0FBQ0Q7QUF2Q1ksQzs7O0FBNENmLFNBQUEsT0FBQSxDQUFBLElBQUEsRUFBeUQ7QUFDdkQsU0FBTyxVQUFBLEtBQUEsRUFBQSxHQUFBLEVBQWlEO0FBQ3RELFdBQU8sWUFBWSxDQUFBLElBQUEsRUFBQSxLQUFBLEVBQW5CLEdBQW1CLENBQW5CO0FBREYsR0FBQTtBQUdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGljdCwgT3B0aW9uIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMT0NBTF9ERUJVRyB9IGZyb20gJ0BnbGltbWVyL2xvY2FsLWRlYnVnLWZsYWdzJztcbmltcG9ydCB7IGFzc2VydCwgYXNzaWduLCBkZXByZWNhdGUsIGlzUHJlc2VudCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBTb3VyY2VMb2NhdGlvbiwgU291cmNlUG9zaXRpb24sIFNZTlRIRVRJQ19MT0NBVElPTiB9IGZyb20gJy4uL3NvdXJjZS9sb2NhdGlvbic7XG5pbXBvcnQgeyBTb3VyY2UgfSBmcm9tICcuLi9zb3VyY2Uvc291cmNlJztcbmltcG9ydCB7IFNvdXJjZVNwYW4gfSBmcm9tICcuLi9zb3VyY2Uvc3Bhbic7XG5pbXBvcnQgKiBhcyBBU1R2MSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBQYXRoRXhwcmVzc2lvbkltcGxWMSB9IGZyb20gJy4vbGVnYWN5LWludGVyb3AnO1xuXG5sZXQgX1NPVVJDRTogU291cmNlIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBTT1VSQ0UoKTogU291cmNlIHtcbiAgaWYgKCFfU09VUkNFKSB7XG4gICAgX1NPVVJDRSA9IG5ldyBTb3VyY2UoJycsICcoc3ludGhldGljKScpO1xuICB9XG5cbiAgcmV0dXJuIF9TT1VSQ0U7XG59XG5cbi8vIGNvbnN0IFNPVVJDRSA9IG5ldyBTb3VyY2UoJycsICcodGVzdHMpJyk7XG5cbi8vIFN0YXRlbWVudHNcblxuZXhwb3J0IHR5cGUgQnVpbGRlckhlYWQgPSBzdHJpbmcgfCBBU1R2MS5FeHByZXNzaW9uO1xuZXhwb3J0IHR5cGUgVGFnRGVzY3JpcHRvciA9IHN0cmluZyB8IHsgbmFtZTogc3RyaW5nOyBzZWxmQ2xvc2luZzogYm9vbGVhbiB9O1xuXG5mdW5jdGlvbiBidWlsZE11c3RhY2hlKFxuICBwYXRoOiBCdWlsZGVySGVhZCB8IEFTVHYxLkxpdGVyYWwsXG4gIHBhcmFtcz86IEFTVHYxLkV4cHJlc3Npb25bXSxcbiAgaGFzaD86IEFTVHYxLkhhc2gsXG4gIHJhdz86IGJvb2xlYW4sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uLFxuICBzdHJpcD86IEFTVHYxLlN0cmlwRmxhZ3Ncbik6IEFTVHYxLk11c3RhY2hlU3RhdGVtZW50IHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xuICAgIHBhdGggPSBidWlsZFBhdGgocGF0aCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdNdXN0YWNoZVN0YXRlbWVudCcsXG4gICAgcGF0aCxcbiAgICBwYXJhbXM6IHBhcmFtcyB8fCBbXSxcbiAgICBoYXNoOiBoYXNoIHx8IGJ1aWxkSGFzaChbXSksXG4gICAgZXNjYXBlZDogIXJhdyxcbiAgICB0cnVzdGluZzogISFyYXcsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gICAgc3RyaXA6IHN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEJsb2NrKFxuICBwYXRoOiBCdWlsZGVySGVhZCxcbiAgcGFyYW1zOiBPcHRpb248QVNUdjEuRXhwcmVzc2lvbltdPixcbiAgaGFzaDogT3B0aW9uPEFTVHYxLkhhc2g+LFxuICBfZGVmYXVsdEJsb2NrOiBBU1R2MS5Qb3NzaWJseURlcHJlY2F0ZWRCbG9jayxcbiAgX2Vsc2VCbG9jaz86IE9wdGlvbjxBU1R2MS5Qb3NzaWJseURlcHJlY2F0ZWRCbG9jaz4sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uLFxuICBvcGVuU3RyaXA/OiBBU1R2MS5TdHJpcEZsYWdzLFxuICBpbnZlcnNlU3RyaXA/OiBBU1R2MS5TdHJpcEZsYWdzLFxuICBjbG9zZVN0cmlwPzogQVNUdjEuU3RyaXBGbGFnc1xuKTogQVNUdjEuQmxvY2tTdGF0ZW1lbnQge1xuICBsZXQgZGVmYXVsdEJsb2NrOiBBU1R2MS5CbG9jaztcbiAgbGV0IGVsc2VCbG9jazogT3B0aW9uPEFTVHYxLkJsb2NrPiB8IHVuZGVmaW5lZDtcblxuICBpZiAoX2RlZmF1bHRCbG9jay50eXBlID09PSAnVGVtcGxhdGUnKSB7XG4gICAgaWYgKExPQ0FMX0RFQlVHKSB7XG4gICAgICBkZXByZWNhdGUoYGIucHJvZ3JhbSBpcyBkZXByZWNhdGVkLiBVc2UgYi5ibG9ja0l0c2VsZiBpbnN0ZWFkLmApO1xuICAgIH1cblxuICAgIGRlZmF1bHRCbG9jayA9IChhc3NpZ24oe30sIF9kZWZhdWx0QmxvY2ssIHsgdHlwZTogJ0Jsb2NrJyB9KSBhcyB1bmtub3duKSBhcyBBU1R2MS5CbG9jaztcbiAgfSBlbHNlIHtcbiAgICBkZWZhdWx0QmxvY2sgPSBfZGVmYXVsdEJsb2NrO1xuICB9XG5cbiAgaWYgKF9lbHNlQmxvY2sgIT09IHVuZGVmaW5lZCAmJiBfZWxzZUJsb2NrICE9PSBudWxsICYmIF9lbHNlQmxvY2sudHlwZSA9PT0gJ1RlbXBsYXRlJykge1xuICAgIGlmIChMT0NBTF9ERUJVRykge1xuICAgICAgZGVwcmVjYXRlKGBiLnByb2dyYW0gaXMgZGVwcmVjYXRlZC4gVXNlIGIuYmxvY2tJdHNlbGYgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICBlbHNlQmxvY2sgPSAoYXNzaWduKHt9LCBfZWxzZUJsb2NrLCB7IHR5cGU6ICdCbG9jaycgfSkgYXMgdW5rbm93bikgYXMgQVNUdjEuQmxvY2s7XG4gIH0gZWxzZSB7XG4gICAgZWxzZUJsb2NrID0gX2Vsc2VCbG9jaztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0Jsb2NrU3RhdGVtZW50JyxcbiAgICBwYXRoOiBidWlsZFBhdGgocGF0aCksXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIHByb2dyYW06IGRlZmF1bHRCbG9jayB8fCBudWxsLFxuICAgIGludmVyc2U6IGVsc2VCbG9jayB8fCBudWxsLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIG9wZW5TdHJpcDogb3BlblN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICAgIGludmVyc2VTdHJpcDogaW52ZXJzZVN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICAgIGNsb3NlU3RyaXA6IGNsb3NlU3RyaXAgfHwgeyBvcGVuOiBmYWxzZSwgY2xvc2U6IGZhbHNlIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRWxlbWVudE1vZGlmaWVyKFxuICBwYXRoOiBCdWlsZGVySGVhZCB8IEFTVHYxLkV4cHJlc3Npb24sXG4gIHBhcmFtcz86IEFTVHYxLkV4cHJlc3Npb25bXSxcbiAgaGFzaD86IEFTVHYxLkhhc2gsXG4gIGxvYz86IE9wdGlvbjxTb3VyY2VMb2NhdGlvbj5cbik6IEFTVHYxLkVsZW1lbnRNb2RpZmllclN0YXRlbWVudCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0VsZW1lbnRNb2RpZmllclN0YXRlbWVudCcsXG4gICAgcGF0aDogYnVpbGRQYXRoKHBhdGgpLFxuICAgIHBhcmFtczogcGFyYW1zIHx8IFtdLFxuICAgIGhhc2g6IGhhc2ggfHwgYnVpbGRIYXNoKFtdKSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQYXJ0aWFsKFxuICBuYW1lOiBBU1R2MS5QYXRoRXhwcmVzc2lvbixcbiAgcGFyYW1zPzogQVNUdjEuRXhwcmVzc2lvbltdLFxuICBoYXNoPzogQVNUdjEuSGFzaCxcbiAgaW5kZW50Pzogc3RyaW5nLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuUGFydGlhbFN0YXRlbWVudCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1BhcnRpYWxTdGF0ZW1lbnQnLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIGluZGVudDogaW5kZW50IHx8ICcnLFxuICAgIHN0cmlwOiB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDb21tZW50KHZhbHVlOiBzdHJpbmcsIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuQ29tbWVudFN0YXRlbWVudCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0NvbW1lbnRTdGF0ZW1lbnQnLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRNdXN0YWNoZUNvbW1lbnQodmFsdWU6IHN0cmluZywgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdNdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQnLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDb25jYXQoXG4gIHBhcnRzOiAoQVNUdjEuVGV4dE5vZGUgfCBBU1R2MS5NdXN0YWNoZVN0YXRlbWVudClbXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLkNvbmNhdFN0YXRlbWVudCB7XG4gIGlmICghaXNQcmVzZW50KHBhcnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgYi5jb25jYXQgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHBhcnRgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0NvbmNhdFN0YXRlbWVudCcsXG4gICAgcGFydHM6IHBhcnRzIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG4vLyBOb2Rlc1xuXG5leHBvcnQgdHlwZSBFbGVtZW50UGFydHMgPVxuICB8IFsnYXR0cnMnLCAuLi5BdHRyU2V4cFtdXVxuICB8IFsnbW9kaWZpZXJzJywgLi4uTW9kaWZpZXJTZXhwW11dXG4gIHwgWydib2R5JywgLi4uQVNUdjEuU3RhdGVtZW50W11dXG4gIHwgWydjb21tZW50cycsIC4uLkVsZW1lbnRDb21tZW50W11dXG4gIHwgWydhcycsIC4uLnN0cmluZ1tdXVxuICB8IFsnbG9jJywgU291cmNlTG9jYXRpb25dO1xuXG5leHBvcnQgdHlwZSBQYXRoU2V4cCA9IHN0cmluZyB8IFsncGF0aCcsIHN0cmluZywgTG9jU2V4cD9dO1xuXG5leHBvcnQgdHlwZSBNb2RpZmllclNleHAgPVxuICB8IHN0cmluZ1xuICB8IFtQYXRoU2V4cCwgTG9jU2V4cD9dXG4gIHwgW1BhdGhTZXhwLCBBU1R2MS5FeHByZXNzaW9uW10sIExvY1NleHA/XVxuICB8IFtQYXRoU2V4cCwgQVNUdjEuRXhwcmVzc2lvbltdLCBEaWN0PEFTVHYxLkV4cHJlc3Npb24+LCBMb2NTZXhwP107XG5cbmV4cG9ydCB0eXBlIEF0dHJTZXhwID0gW3N0cmluZywgQVNUdjEuQXR0ck5vZGVbJ3ZhbHVlJ10gfCBzdHJpbmcsIExvY1NleHA/XTtcblxuZXhwb3J0IHR5cGUgTG9jU2V4cCA9IFsnbG9jJywgU291cmNlTG9jYXRpb25dO1xuXG5leHBvcnQgdHlwZSBFbGVtZW50Q29tbWVudCA9IEFTVHYxLk11c3RhY2hlQ29tbWVudFN0YXRlbWVudCB8IFNvdXJjZUxvY2F0aW9uIHwgc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBTZXhwVmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IEFTVHYxLkV4cHJlc3Npb25bXVxuICB8IERpY3Q8QVNUdjEuRXhwcmVzc2lvbj5cbiAgfCBMb2NTZXhwXG4gIHwgUGF0aFNleHBcbiAgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRFbGVtZW50T3B0aW9ucyB7XG4gIGF0dHJzPzogQVNUdjEuQXR0ck5vZGVbXTtcbiAgbW9kaWZpZXJzPzogQVNUdjEuRWxlbWVudE1vZGlmaWVyU3RhdGVtZW50W107XG4gIGNoaWxkcmVuPzogQVNUdjEuU3RhdGVtZW50W107XG4gIGNvbW1lbnRzPzogRWxlbWVudENvbW1lbnRbXTtcbiAgYmxvY2tQYXJhbXM/OiBzdHJpbmdbXTtcbiAgbG9jPzogU291cmNlU3Bhbjtcbn1cblxuZnVuY3Rpb24gYnVpbGRFbGVtZW50KHRhZzogVGFnRGVzY3JpcHRvciwgb3B0aW9uczogQnVpbGRFbGVtZW50T3B0aW9ucyA9IHt9KTogQVNUdjEuRWxlbWVudE5vZGUge1xuICBsZXQgeyBhdHRycywgYmxvY2tQYXJhbXMsIG1vZGlmaWVycywgY29tbWVudHMsIGNoaWxkcmVuLCBsb2MgfSA9IG9wdGlvbnM7XG5cbiAgbGV0IHRhZ05hbWU6IHN0cmluZztcblxuICAvLyB0aGlzIGlzIHVzZWQgZm9yIGJhY2t3YXJkcyBjb21wYXQsIHByaW9yIHRvIGBzZWxmQ2xvc2luZ2AgYmVpbmcgcGFydCBvZiB0aGUgRWxlbWVudE5vZGUgQVNUXG4gIGxldCBzZWxmQ2xvc2luZyA9IGZhbHNlO1xuICBpZiAodHlwZW9mIHRhZyA9PT0gJ29iamVjdCcpIHtcbiAgICBzZWxmQ2xvc2luZyA9IHRhZy5zZWxmQ2xvc2luZztcbiAgICB0YWdOYW1lID0gdGFnLm5hbWU7XG4gIH0gZWxzZSBpZiAodGFnLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgdGFnTmFtZSA9IHRhZy5zbGljZSgwLCAtMSk7XG4gICAgc2VsZkNsb3NpbmcgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHRhZ05hbWUgPSB0YWc7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdFbGVtZW50Tm9kZScsXG4gICAgdGFnOiB0YWdOYW1lLFxuICAgIHNlbGZDbG9zaW5nOiBzZWxmQ2xvc2luZyxcbiAgICBhdHRyaWJ1dGVzOiBhdHRycyB8fCBbXSxcbiAgICBibG9ja1BhcmFtczogYmxvY2tQYXJhbXMgfHwgW10sXG4gICAgbW9kaWZpZXJzOiBtb2RpZmllcnMgfHwgW10sXG4gICAgY29tbWVudHM6IChjb21tZW50cyBhcyBBU1R2MS5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnRbXSkgfHwgW10sXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEF0dHIoXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IEFTVHYxLkF0dHJOb2RlWyd2YWx1ZSddLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuQXR0ck5vZGUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdBdHRyTm9kZScsXG4gICAgbmFtZTogbmFtZSxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVGV4dChjaGFycz86IHN0cmluZywgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5UZXh0Tm9kZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1RleHROb2RlJyxcbiAgICBjaGFyczogY2hhcnMgfHwgJycsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbi8vIEV4cHJlc3Npb25zXG5cbmZ1bmN0aW9uIGJ1aWxkU2V4cHIoXG4gIHBhdGg6IEJ1aWxkZXJIZWFkLFxuICBwYXJhbXM/OiBBU1R2MS5FeHByZXNzaW9uW10sXG4gIGhhc2g/OiBBU1R2MS5IYXNoLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuU3ViRXhwcmVzc2lvbiB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1N1YkV4cHJlc3Npb24nLFxuICAgIHBhdGg6IGJ1aWxkUGF0aChwYXRoKSxcbiAgICBwYXJhbXM6IHBhcmFtcyB8fCBbXSxcbiAgICBoYXNoOiBoYXNoIHx8IGJ1aWxkSGFzaChbXSksXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGhlYWRUb1N0cmluZyhoZWFkOiBBU1R2MS5QYXRoSGVhZCk6IHsgb3JpZ2luYWw6IHN0cmluZzsgcGFydHM6IHN0cmluZ1tdIH0ge1xuICBzd2l0Y2ggKGhlYWQudHlwZSkge1xuICAgIGNhc2UgJ0F0SGVhZCc6XG4gICAgICByZXR1cm4geyBvcmlnaW5hbDogaGVhZC5uYW1lLCBwYXJ0czogW2hlYWQubmFtZV0gfTtcbiAgICBjYXNlICdUaGlzSGVhZCc6XG4gICAgICByZXR1cm4geyBvcmlnaW5hbDogYHRoaXNgLCBwYXJ0czogW10gfTtcbiAgICBjYXNlICdWYXJIZWFkJzpcbiAgICAgIHJldHVybiB7IG9yaWdpbmFsOiBoZWFkLm5hbWUsIHBhcnRzOiBbaGVhZC5uYW1lXSB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSGVhZChcbiAgb3JpZ2luYWw6IHN0cmluZyxcbiAgbG9jOiBTb3VyY2VMb2NhdGlvblxuKTogeyBoZWFkOiBBU1R2MS5QYXRoSGVhZDsgdGFpbDogc3RyaW5nW10gfSB7XG4gIGxldCBbaGVhZCwgLi4udGFpbF0gPSBvcmlnaW5hbC5zcGxpdCgnLicpO1xuICBsZXQgaGVhZE5vZGU6IEFTVHYxLlBhdGhIZWFkO1xuXG4gIGlmIChoZWFkID09PSAndGhpcycpIHtcbiAgICBoZWFkTm9kZSA9IHtcbiAgICAgIHR5cGU6ICdUaGlzSGVhZCcsXG4gICAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKGhlYWRbMF0gPT09ICdAJykge1xuICAgIGhlYWROb2RlID0ge1xuICAgICAgdHlwZTogJ0F0SGVhZCcsXG4gICAgICBuYW1lOiBoZWFkLFxuICAgICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBoZWFkTm9kZSA9IHtcbiAgICAgIHR5cGU6ICdWYXJIZWFkJyxcbiAgICAgIG5hbWU6IGhlYWQsXG4gICAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBoZWFkOiBoZWFkTm9kZSxcbiAgICB0YWlsLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFRoaXMobG9jOiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLlBhdGhIZWFkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVGhpc0hlYWQnLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEF0TmFtZShuYW1lOiBzdHJpbmcsIGxvYzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5QYXRoSGVhZCB7XG4gIC8vIHRoZSBgQGAgc2hvdWxkIGJlIGluY2x1ZGVkIHNvIHdlIGhhdmUgYSBjb21wbGV0ZSBzb3VyY2UgcmFuZ2VcbiAgYXNzZXJ0KG5hbWVbMF0gPT09ICdAJywgYGNhbGwgYnVpbGRlcnMuYXQoKSB3aXRoIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggJ0AnYCk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQXRIZWFkJyxcbiAgICBuYW1lLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFZhcihuYW1lOiBzdHJpbmcsIGxvYzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5QYXRoSGVhZCB7XG4gIGFzc2VydChuYW1lICE9PSAndGhpcycsIGBZb3UgY2FsbGVkIGJ1aWxkZXJzLnZhcigpIHdpdGggJ3RoaXMnLiBDYWxsIGJ1aWxkZXJzLnRoaXMgaW5zdGVhZGApO1xuICBhc3NlcnQoXG4gICAgbmFtZVswXSAhPT0gJ0AnLFxuICAgIGBZb3UgY2FsbGVkIGJ1aWxkZXJzLnZhcigpIHdpdGggJyR7bmFtZX0nLiBDYWxsIGJ1aWxkZXJzLmF0KCcke25hbWV9JykgaW5zdGVhZGBcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdWYXJIZWFkJyxcbiAgICBuYW1lLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEhlYWRGcm9tU3RyaW5nKGhlYWQ6IHN0cmluZywgbG9jOiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLlBhdGhIZWFkIHtcbiAgaWYgKGhlYWRbMF0gPT09ICdAJykge1xuICAgIHJldHVybiBidWlsZEF0TmFtZShoZWFkLCBsb2MpO1xuICB9IGVsc2UgaWYgKGhlYWQgPT09ICd0aGlzJykge1xuICAgIHJldHVybiBidWlsZFRoaXMobG9jKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYnVpbGRWYXIoaGVhZCwgbG9jKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZE5hbWVkQmxvY2tOYW1lKG5hbWU6IHN0cmluZywgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5OYW1lZEJsb2NrTmFtZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ05hbWVkQmxvY2tOYW1lJyxcbiAgICBuYW1lLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZENsZWFuUGF0aChcbiAgaGVhZDogQVNUdjEuUGF0aEhlYWQsXG4gIHRhaWw6IHN0cmluZ1tdLFxuICBsb2M6IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5QYXRoRXhwcmVzc2lvbiB7XG4gIGxldCB7IG9yaWdpbmFsOiBvcmlnaW5hbEhlYWQsIHBhcnRzOiBoZWFkUGFydHMgfSA9IGhlYWRUb1N0cmluZyhoZWFkKTtcbiAgbGV0IHBhcnRzID0gWy4uLmhlYWRQYXJ0cywgLi4udGFpbF07XG4gIGxldCBvcmlnaW5hbCA9IFsuLi5vcmlnaW5hbEhlYWQsIC4uLnBhcnRzXS5qb2luKCcuJyk7XG5cbiAgcmV0dXJuIG5ldyBQYXRoRXhwcmVzc2lvbkltcGxWMShvcmlnaW5hbCwgaGVhZCwgdGFpbCwgYnVpbGRMb2MobG9jIHx8IG51bGwpKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQYXRoKFxuICBwYXRoOiBBU1R2MS5QYXRoRXhwcmVzc2lvbiB8IHN0cmluZyB8IHsgaGVhZDogc3RyaW5nOyB0YWlsOiBzdHJpbmdbXSB9LFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuUGF0aEV4cHJlc3Npb247XG5mdW5jdGlvbiBidWlsZFBhdGgocGF0aDogQVNUdjEuRXhwcmVzc2lvbiwgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5FeHByZXNzaW9uO1xuZnVuY3Rpb24gYnVpbGRQYXRoKHBhdGg6IEJ1aWxkZXJIZWFkIHwgQVNUdjEuRXhwcmVzc2lvbiwgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5FeHByZXNzaW9uO1xuZnVuY3Rpb24gYnVpbGRQYXRoKFxuICBwYXRoOiBCdWlsZGVySGVhZCB8IEFTVHYxLkV4cHJlc3Npb24gfCB7IGhlYWQ6IHN0cmluZzsgdGFpbDogc3RyaW5nW10gfSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLkV4cHJlc3Npb24ge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCd0eXBlJyBpbiBwYXRoKSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHsgaGVhZCwgdGFpbCB9ID0gYnVpbGRIZWFkKHBhdGguaGVhZCwgU291cmNlU3Bhbi5icm9rZW4oKSk7XG5cbiAgICAgIGFzc2VydChcbiAgICAgICAgdGFpbC5sZW5ndGggPT09IDAsXG4gICAgICAgIGBidWlsZGVyLnBhdGgoeyBoZWFkLCB0YWlsIH0pIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggYSBoZWFkIHdpdGggZG90cyBpbiBpdGBcbiAgICAgICk7XG5cbiAgICAgIGxldCB7IG9yaWdpbmFsOiBvcmlnaW5hbEhlYWQgfSA9IGhlYWRUb1N0cmluZyhoZWFkKTtcblxuICAgICAgcmV0dXJuIG5ldyBQYXRoRXhwcmVzc2lvbkltcGxWMShcbiAgICAgICAgW29yaWdpbmFsSGVhZCwgLi4udGFpbF0uam9pbignLicpLFxuICAgICAgICBoZWFkLFxuICAgICAgICB0YWlsLFxuICAgICAgICBidWlsZExvYyhsb2MgfHwgbnVsbClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbGV0IHsgaGVhZCwgdGFpbCB9ID0gYnVpbGRIZWFkKHBhdGgsIFNvdXJjZVNwYW4uYnJva2VuKCkpO1xuXG4gIHJldHVybiBuZXcgUGF0aEV4cHJlc3Npb25JbXBsVjEocGF0aCwgaGVhZCwgdGFpbCwgYnVpbGRMb2MobG9jIHx8IG51bGwpKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMaXRlcmFsPFQgZXh0ZW5kcyBBU1R2MS5MaXRlcmFsPihcbiAgdHlwZTogVFsndHlwZSddLFxuICB2YWx1ZTogVFsndmFsdWUnXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IFQge1xuICByZXR1cm4ge1xuICAgIHR5cGUsXG4gICAgdmFsdWUsXG4gICAgb3JpZ2luYWw6IHZhbHVlLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9IGFzIFQ7XG59XG5cbi8vIE1pc2NlbGxhbmVvdXNcblxuZnVuY3Rpb24gYnVpbGRIYXNoKHBhaXJzPzogQVNUdjEuSGFzaFBhaXJbXSwgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5IYXNoIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnSGFzaCcsXG4gICAgcGFpcnM6IHBhaXJzIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFBhaXIoa2V5OiBzdHJpbmcsIHZhbHVlOiBBU1R2MS5FeHByZXNzaW9uLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLkhhc2hQYWlyIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnSGFzaFBhaXInLFxuICAgIGtleToga2V5LFxuICAgIHZhbHVlLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFByb2dyYW0oXG4gIGJvZHk/OiBBU1R2MS5TdGF0ZW1lbnRbXSxcbiAgYmxvY2tQYXJhbXM/OiBzdHJpbmdbXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlRlbXBsYXRlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVGVtcGxhdGUnLFxuICAgIGJvZHk6IGJvZHkgfHwgW10sXG4gICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEJsb2NrSXRzZWxmKFxuICBib2R5PzogQVNUdjEuU3RhdGVtZW50W10sXG4gIGJsb2NrUGFyYW1zPzogc3RyaW5nW10sXG4gIGNoYWluZWQgPSBmYWxzZSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLkJsb2NrIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQmxvY2snLFxuICAgIGJvZHk6IGJvZHkgfHwgW10sXG4gICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zIHx8IFtdLFxuICAgIGNoYWluZWQsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVGVtcGxhdGUoXG4gIGJvZHk/OiBBU1R2MS5TdGF0ZW1lbnRbXSxcbiAgYmxvY2tQYXJhbXM/OiBzdHJpbmdbXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlRlbXBsYXRlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVGVtcGxhdGUnLFxuICAgIGJvZHk6IGJvZHkgfHwgW10sXG4gICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFBvc2l0aW9uKGxpbmU6IG51bWJlciwgY29sdW1uOiBudW1iZXIpOiBTb3VyY2VQb3NpdGlvbiB7XG4gIHJldHVybiB7XG4gICAgbGluZSxcbiAgICBjb2x1bW4sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTG9jKGxvYzogT3B0aW9uPFNvdXJjZUxvY2F0aW9uPik6IFNvdXJjZVNwYW47XG5mdW5jdGlvbiBidWlsZExvYyhcbiAgc3RhcnRMaW5lOiBudW1iZXIsXG4gIHN0YXJ0Q29sdW1uOiBudW1iZXIsXG4gIGVuZExpbmU/OiBudW1iZXIsXG4gIGVuZENvbHVtbj86IG51bWJlcixcbiAgc291cmNlPzogc3RyaW5nXG4pOiBTb3VyY2VTcGFuO1xuXG5mdW5jdGlvbiBidWlsZExvYyguLi5hcmdzOiBhbnlbXSk6IFNvdXJjZVNwYW4ge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICBsZXQgbG9jID0gYXJnc1swXTtcblxuICAgIGlmIChsb2MgJiYgdHlwZW9mIGxvYyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBTb3VyY2VTcGFuLmZvckhic0xvYyhTT1VSQ0UoKSwgbG9jKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFNvdXJjZVNwYW4uZm9ySGJzTG9jKFNPVVJDRSgpLCBTWU5USEVUSUNfTE9DQVRJT04pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgW3N0YXJ0TGluZSwgc3RhcnRDb2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbiwgX3NvdXJjZV0gPSBhcmdzO1xuICAgIGxldCBzb3VyY2UgPSBfc291cmNlID8gbmV3IFNvdXJjZSgnJywgX3NvdXJjZSkgOiBTT1VSQ0UoKTtcblxuICAgIHJldHVybiBTb3VyY2VTcGFuLmZvckhic0xvYyhzb3VyY2UsIHtcbiAgICAgIHN0YXJ0OiB7XG4gICAgICAgIGxpbmU6IHN0YXJ0TGluZSxcbiAgICAgICAgY29sdW1uOiBzdGFydENvbHVtbixcbiAgICAgIH0sXG4gICAgICBlbmQ6IHtcbiAgICAgICAgbGluZTogZW5kTGluZSxcbiAgICAgICAgY29sdW1uOiBlbmRDb2x1bW4sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbXVzdGFjaGU6IGJ1aWxkTXVzdGFjaGUsXG4gIGJsb2NrOiBidWlsZEJsb2NrLFxuICBwYXJ0aWFsOiBidWlsZFBhcnRpYWwsXG4gIGNvbW1lbnQ6IGJ1aWxkQ29tbWVudCxcbiAgbXVzdGFjaGVDb21tZW50OiBidWlsZE11c3RhY2hlQ29tbWVudCxcbiAgZWxlbWVudDogYnVpbGRFbGVtZW50LFxuICBlbGVtZW50TW9kaWZpZXI6IGJ1aWxkRWxlbWVudE1vZGlmaWVyLFxuICBhdHRyOiBidWlsZEF0dHIsXG4gIHRleHQ6IGJ1aWxkVGV4dCxcbiAgc2V4cHI6IGJ1aWxkU2V4cHIsXG5cbiAgY29uY2F0OiBidWlsZENvbmNhdCxcbiAgaGFzaDogYnVpbGRIYXNoLFxuICBwYWlyOiBidWlsZFBhaXIsXG4gIGxpdGVyYWw6IGJ1aWxkTGl0ZXJhbCxcbiAgcHJvZ3JhbTogYnVpbGRQcm9ncmFtLFxuICBibG9ja0l0c2VsZjogYnVpbGRCbG9ja0l0c2VsZixcbiAgdGVtcGxhdGU6IGJ1aWxkVGVtcGxhdGUsXG4gIGxvYzogYnVpbGRMb2MsXG4gIHBvczogYnVpbGRQb3NpdGlvbixcblxuICBwYXRoOiBidWlsZFBhdGgsXG5cbiAgZnVsbFBhdGg6IGJ1aWxkQ2xlYW5QYXRoLFxuICBoZWFkOiBidWlsZEhlYWRGcm9tU3RyaW5nLFxuICBhdDogYnVpbGRBdE5hbWUsXG4gIHZhcjogYnVpbGRWYXIsXG4gIHRoaXM6IGJ1aWxkVGhpcyxcbiAgYmxvY2tOYW1lOiBidWlsZE5hbWVkQmxvY2tOYW1lLFxuXG4gIHN0cmluZzogbGl0ZXJhbCgnU3RyaW5nTGl0ZXJhbCcpIGFzICh2YWx1ZTogc3RyaW5nKSA9PiBBU1R2MS5TdHJpbmdMaXRlcmFsLFxuICBib29sZWFuOiBsaXRlcmFsKCdCb29sZWFuTGl0ZXJhbCcpIGFzICh2YWx1ZTogYm9vbGVhbikgPT4gQVNUdjEuQm9vbGVhbkxpdGVyYWwsXG4gIG51bWJlcjogbGl0ZXJhbCgnTnVtYmVyTGl0ZXJhbCcpIGFzICh2YWx1ZTogbnVtYmVyKSA9PiBBU1R2MS5OdW1iZXJMaXRlcmFsLFxuICB1bmRlZmluZWQoKTogQVNUdjEuVW5kZWZpbmVkTGl0ZXJhbCB7XG4gICAgcmV0dXJuIGJ1aWxkTGl0ZXJhbCgnVW5kZWZpbmVkTGl0ZXJhbCcsIHVuZGVmaW5lZCk7XG4gIH0sXG4gIG51bGwoKTogQVNUdjEuTnVsbExpdGVyYWwge1xuICAgIHJldHVybiBidWlsZExpdGVyYWwoJ051bGxMaXRlcmFsJywgbnVsbCk7XG4gIH0sXG59O1xuXG50eXBlIEJ1aWxkTGl0ZXJhbDxUIGV4dGVuZHMgQVNUdjEuTGl0ZXJhbD4gPSAodmFsdWU6IFRbJ3ZhbHVlJ10pID0+IFQ7XG5cbmZ1bmN0aW9uIGxpdGVyYWw8VCBleHRlbmRzIEFTVHYxLkxpdGVyYWw+KHR5cGU6IFRbJ3R5cGUnXSk6IEJ1aWxkTGl0ZXJhbDxUPiB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWU6IFRbJ3ZhbHVlJ10sIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogVCB7XG4gICAgcmV0dXJuIGJ1aWxkTGl0ZXJhbCh0eXBlLCB2YWx1ZSwgbG9jKTtcbiAgfTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=