@glimmer/compiler
Version:
352 lines (322 loc) • 45.5 kB
JavaScript
import { generateSyntaxError } from '@glimmer/syntax';
import { Err, Ok, Result } from '../../../shared/result';
import * as mir from '../../2-encoding/mir';
import { VISIT_EXPRS } from '../visitors/expressions';
import { VISIT_STMTS } from '../visitors/statements';
import { keywords } from './impl';
import { assertCurryKeyword } from './utils/curry';
export var BLOCK_KEYWORDS = keywords('Block').kw('in-element', {
assert: function assert(node) {
var args = node.args;
var guid = args.get('guid');
if (guid) {
return Err(generateSyntaxError("Cannot pass `guid` to `{{#in-element}}`", guid.loc));
}
var insertBefore = args.get('insertBefore');
var destination = args.nth(0);
if (destination === null) {
return Err(generateSyntaxError("{{#in-element}} requires a target element as its first positional parameter", args.loc));
} // TODO Better syntax checks
return Ok({
insertBefore: insertBefore,
destination: destination
});
},
translate: function translate(_ref, _ref2) {
var node = _ref.node,
state = _ref.state;
var insertBefore = _ref2.insertBefore,
destination = _ref2.destination;
var named = node.blocks.get('default');
var body = VISIT_STMTS.NamedBlock(named, state);
var destinationResult = VISIT_EXPRS.visit(destination, state);
return Result.all(body, destinationResult).andThen(function (_ref3) {
var body = _ref3[0],
destination = _ref3[1];
if (insertBefore) {
return VISIT_EXPRS.visit(insertBefore, state).mapOk(function (insertBefore) {
return {
body: body,
destination: destination,
insertBefore: insertBefore
};
});
} else {
return Ok({
body: body,
destination: destination,
insertBefore: new mir.Missing({
loc: node.callee.loc.collapse('end')
})
});
}
}).mapOk(function (_ref4) {
var body = _ref4.body,
destination = _ref4.destination,
insertBefore = _ref4.insertBefore;
return new mir.InElement({
loc: node.loc,
block: body,
insertBefore: insertBefore,
guid: state.generateUniqueCursor(),
destination: destination
});
});
}
}).kw('if', {
assert: function assert(node) {
var args = node.args;
if (!args.named.isEmpty()) {
return Err(generateSyntaxError("{{#if}} cannot receive named parameters, received " + args.named.entries.map(function (e) {
return e.name.chars;
}).join(', '), node.loc));
}
if (args.positional.size > 1) {
return Err(generateSyntaxError("{{#if}} can only receive one positional parameter in block form, the conditional value. Received " + args.positional.size + " parameters", node.loc));
}
var condition = args.nth(0);
if (condition === null) {
return Err(generateSyntaxError("{{#if}} requires a condition as its first positional parameter, did not receive any parameters", node.loc));
}
return Ok({
condition: condition
});
},
translate: function translate(_ref5, _ref6) {
var node = _ref5.node,
state = _ref5.state;
var condition = _ref6.condition;
var block = node.blocks.get('default');
var inverse = node.blocks.get('else');
var conditionResult = VISIT_EXPRS.visit(condition, state);
var blockResult = VISIT_STMTS.NamedBlock(block, state);
var inverseResult = inverse ? VISIT_STMTS.NamedBlock(inverse, state) : Ok(null);
return Result.all(conditionResult, blockResult, inverseResult).mapOk(function (_ref7) {
var condition = _ref7[0],
block = _ref7[1],
inverse = _ref7[2];
return new mir.If({
loc: node.loc,
condition: condition,
block: block,
inverse: inverse
});
});
}
}).kw('unless', {
assert: function assert(node) {
var args = node.args;
if (!args.named.isEmpty()) {
return Err(generateSyntaxError("{{#unless}} cannot receive named parameters, received " + args.named.entries.map(function (e) {
return e.name.chars;
}).join(', '), node.loc));
}
if (args.positional.size > 1) {
return Err(generateSyntaxError("{{#unless}} can only receive one positional parameter in block form, the conditional value. Received " + args.positional.size + " parameters", node.loc));
}
var condition = args.nth(0);
if (condition === null) {
return Err(generateSyntaxError("{{#unless}} requires a condition as its first positional parameter, did not receive any parameters", node.loc));
}
return Ok({
condition: condition
});
},
translate: function translate(_ref8, _ref9) {
var node = _ref8.node,
state = _ref8.state;
var condition = _ref9.condition;
var block = node.blocks.get('default');
var inverse = node.blocks.get('else');
var conditionResult = VISIT_EXPRS.visit(condition, state);
var blockResult = VISIT_STMTS.NamedBlock(block, state);
var inverseResult = inverse ? VISIT_STMTS.NamedBlock(inverse, state) : Ok(null);
return Result.all(conditionResult, blockResult, inverseResult).mapOk(function (_ref10) {
var condition = _ref10[0],
block = _ref10[1],
inverse = _ref10[2];
return new mir.If({
loc: node.loc,
condition: new mir.Not({
value: condition,
loc: node.loc
}),
block: block,
inverse: inverse
});
});
}
}).kw('each', {
assert: function assert(node) {
var args = node.args;
if (!args.named.entries.every(function (e) {
return e.name.chars === 'key';
})) {
return Err(generateSyntaxError("{{#each}} can only receive the 'key' named parameter, received " + args.named.entries.filter(function (e) {
return e.name.chars !== 'key';
}).map(function (e) {
return e.name.chars;
}).join(', '), args.named.loc));
}
if (args.positional.size > 1) {
return Err(generateSyntaxError("{{#each}} can only receive one positional parameter, the collection being iterated. Received " + args.positional.size + " parameters", args.positional.loc));
}
var value = args.nth(0);
var key = args.get('key');
if (value === null) {
return Err(generateSyntaxError("{{#each}} requires an iterable value to be passed as its first positional parameter, did not receive any parameters", args.loc));
}
return Ok({
value: value,
key: key
});
},
translate: function translate(_ref11, _ref12) {
var node = _ref11.node,
state = _ref11.state;
var value = _ref12.value,
key = _ref12.key;
var block = node.blocks.get('default');
var inverse = node.blocks.get('else');
var valueResult = VISIT_EXPRS.visit(value, state);
var keyResult = key ? VISIT_EXPRS.visit(key, state) : Ok(null);
var blockResult = VISIT_STMTS.NamedBlock(block, state);
var inverseResult = inverse ? VISIT_STMTS.NamedBlock(inverse, state) : Ok(null);
return Result.all(valueResult, keyResult, blockResult, inverseResult).mapOk(function (_ref13) {
var value = _ref13[0],
key = _ref13[1],
block = _ref13[2],
inverse = _ref13[3];
return new mir.Each({
loc: node.loc,
value: value,
key: key,
block: block,
inverse: inverse
});
});
}
}).kw('with', {
assert: function assert(node) {
var args = node.args;
if (!args.named.isEmpty()) {
return Err(generateSyntaxError("{{#with}} cannot receive named parameters, received " + args.named.entries.map(function (e) {
return e.name.chars;
}).join(', '), args.named.loc));
}
if (args.positional.size > 1) {
return Err(generateSyntaxError("{{#with}} can only receive one positional parameter. Received " + args.positional.size + " parameters", args.positional.loc));
}
var value = args.nth(0);
if (value === null) {
return Err(generateSyntaxError("{{#with}} requires a value as its first positional parameter, did not receive any parameters", args.loc));
}
return Ok({
value: value
});
},
translate: function translate(_ref14, _ref15) {
var node = _ref14.node,
state = _ref14.state;
var value = _ref15.value;
var block = node.blocks.get('default');
var inverse = node.blocks.get('else');
var valueResult = VISIT_EXPRS.visit(value, state);
var blockResult = VISIT_STMTS.NamedBlock(block, state);
var inverseResult = inverse ? VISIT_STMTS.NamedBlock(inverse, state) : Ok(null);
return Result.all(valueResult, blockResult, inverseResult).mapOk(function (_ref16) {
var value = _ref16[0],
block = _ref16[1],
inverse = _ref16[2];
return new mir.With({
loc: node.loc,
value: value,
block: block,
inverse: inverse
});
});
}
}).kw('let', {
assert: function assert(node) {
var args = node.args;
if (!args.named.isEmpty()) {
return Err(generateSyntaxError("{{#let}} cannot receive named parameters, received " + args.named.entries.map(function (e) {
return e.name.chars;
}).join(', '), args.named.loc));
}
if (args.positional.size === 0) {
return Err(generateSyntaxError("{{#let}} requires at least one value as its first positional parameter, did not receive any parameters", args.positional.loc));
}
if (node.blocks.get('else')) {
return Err(generateSyntaxError("{{#let}} cannot receive an {{else}} block", args.positional.loc));
}
return Ok({
positional: args.positional
});
},
translate: function translate(_ref17, _ref18) {
var node = _ref17.node,
state = _ref17.state;
var positional = _ref18.positional;
var block = node.blocks.get('default');
var positionalResult = VISIT_EXPRS.Positional(positional, state);
var blockResult = VISIT_STMTS.NamedBlock(block, state);
return Result.all(positionalResult, blockResult).mapOk(function (_ref19) {
var positional = _ref19[0],
block = _ref19[1];
return new mir.Let({
loc: node.loc,
positional: positional,
block: block
});
});
}
}).kw('-with-dynamic-vars', {
assert: function assert(node) {
return Ok({
named: node.args.named
});
},
translate: function translate(_ref20, _ref21) {
var node = _ref20.node,
state = _ref20.state;
var named = _ref21.named;
var block = node.blocks.get('default');
var namedResult = VISIT_EXPRS.NamedArguments(named, state);
var blockResult = VISIT_STMTS.NamedBlock(block, state);
return Result.all(namedResult, blockResult).mapOk(function (_ref22) {
var named = _ref22[0],
block = _ref22[1];
return new mir.WithDynamicVars({
loc: node.loc,
named: named,
block: block
});
});
}
}).kw('component', {
assert: assertCurryKeyword(0
/* Component */
),
translate: function translate(_ref23, _ref24) {
var node = _ref23.node,
state = _ref23.state;
var definition = _ref24.definition,
args = _ref24.args;
var definitionResult = VISIT_EXPRS.visit(definition, state);
var argsResult = VISIT_EXPRS.Args(args, state);
var blocksResult = VISIT_STMTS.NamedBlocks(node.blocks, state);
return Result.all(definitionResult, argsResult, blocksResult).mapOk(function (_ref25) {
var definition = _ref25[0],
args = _ref25[1],
blocks = _ref25[2];
return new mir.InvokeComponent({
loc: node.loc,
definition: definition,
args: args,
blocks: blocks
});
});
}
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL2tleXdvcmRzL2Jsb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLFNBQUEsbUJBQUEsUUFBQSxpQkFBQTtBQUVBLFNBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxNQUFBLFFBQUEsd0JBQUE7QUFDQSxPQUFPLEtBQVAsR0FBQSxNQUFBLHNCQUFBO0FBRUEsU0FBQSxXQUFBLFFBQUEseUJBQUE7QUFDQSxTQUFBLFdBQUEsUUFBQSx3QkFBQTtBQUNBLFNBQUEsUUFBQSxRQUFBLFFBQUE7QUFDQSxTQUFBLGtCQUFBLFFBQUEsZUFBQTtBQUVBLE9BQU8sSUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFSLE9BQVEsQ0FBUixDQUFBLEVBQUEsQ0FBQSxZQUFBLEVBQ1Y7QUFDaEIsRUFBQSxNQURnQixrQkFDVixJQURVLEVBRVM7QUFBQSxRQUtqQixJQUxpQixHQUt2QixJQUx1QixDQUtqQixJQUxpQjtBQU92QixRQUFJLElBQUksR0FBRyxJQUFJLENBQUosR0FBQSxDQUFYLE1BQVcsQ0FBWDs7QUFFQSxRQUFBLElBQUEsRUFBVTtBQUNSLGFBQU8sR0FBRyxDQUFDLG1CQUFtQiw0Q0FBZ0QsSUFBSSxDQUFsRixHQUE4QixDQUFwQixDQUFWO0FBQ0Q7O0FBRUQsUUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFKLEdBQUEsQ0FBbkIsY0FBbUIsQ0FBbkI7QUFDQSxRQUFJLFdBQVcsR0FBRyxJQUFJLENBQUosR0FBQSxDQUFsQixDQUFrQixDQUFsQjs7QUFFQSxRQUFJLFdBQVcsS0FBZixJQUFBLEVBQTBCO0FBQ3hCLGFBQU8sR0FBRyxDQUNSLG1CQUFtQixnRkFFakIsSUFBSSxDQUhSLEdBQ3FCLENBRFgsQ0FBVjtBQWpCcUIsS0FBQSxDQXlCdkI7OztBQUVBLFdBQU8sRUFBRSxDQUFDO0FBQUUsTUFBQSxZQUFGLEVBQUUsWUFBRjtB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LFVBQTlELElBQThEO0FBRTVFLFFBQUksZ0JBQWdCLEdBQUcsV0FBVyxDQUFYLEtBQUEsQ0FBQSxVQUFBLEVBQXZCLEtBQXVCLENBQXZCO0FBQ0EsUUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFYLElBQUEsQ0FBQSxJQUFBLEVBQWpCLEtBQWlCLENBQWpCO0FBQ0EsUUFBSSxZQUFZLEdBQUcsV0FBVyxDQUFYLFdBQUEsQ0FBd0IsSUFBSSxDQUE1QixNQUFBLEVBQW5CLEtBQW1CLENBQW5CO0FBRUEsV0FBTyxNQUFNLENBQU4sR0FBQSxDQUFBLGdCQUFBLEVBQUEsVUFBQSxFQUFBLFlBQUEsRUFBQSxLQUFBLENBQ0w7QUFBQSxVQUFDLFVBQUQ7QUFBQSxVQUFDLElBQUQ7QUFBQSxVQUFBLE1BQUE7QUFBQSxhQUNFLElBQUksR0FBRyxDQUFQLGVBQUEsQ0FBd0I7QUFDdEIsUUFBQSxHQUFHLEVBQUUsSUFBSSxDQURhLEdBQUE7QUFFdEIsUUFBQSxVQUZzQixFQUV0QixVQUZzQjtBQUd0QixRQUFBLElBSHNCLEVBR3RCLElBSHNCO0FBSXRCLFFBQUEsTUFBQSxFQUFBO0FBSnNCLE9BQXhCLENBREY7QUFBQSxLQURLLENBQVA7QUFTRDtBQXBCYyxDQTFhVyxDQUF2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJpZWRUeXBlIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBU1R2MiwgZ2VuZXJhdGVTeW50YXhFcnJvciB9IGZyb20gJ0BnbGltbWVyL3N5bnRheCc7XG5cbmltcG9ydCB7IEVyciwgT2ssIFJlc3VsdCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9yZXN1bHQnO1xuaW1wb3J0ICogYXMgbWlyIGZyb20gJy4uLy4uLzItZW5jb2RpbmcvbWlyJztcbmltcG9ydCB7IE5vcm1hbGl6YXRpb25TdGF0ZSB9IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHsgVklTSVRfRVhQUlMgfSBmcm9tICcuLi92aXNpdG9ycy9leHByZXNzaW9ucyc7XG5pbXBvcnQgeyBWSVNJVF9TVE1UUyB9IGZyb20gJy4uL3Zpc2l0b3JzL3N0YXRlbWVudHMnO1xuaW1wb3J0IHsga2V5d29yZHMgfSBmcm9tICcuL2ltcGwnO1xuaW1wb3J0IHsgYXNzZXJ0Q3VycnlLZXl3b3JkIH0gZnJvbSAnLi91dGlscy9jdXJyeSc7XG5cbmV4cG9ydCBjb25zdCBCTE9DS19LRVlXT1JEUyA9IGtleXdvcmRzKCdCbG9jaycpXG4gIC5rdygnaW4tZWxlbWVudCcsIHtcbiAgICBhc3NlcnQoXG4gICAgICBub2RlOiBBU1R2Mi5JbnZva2VCbG9ja1xuICAgICk6IFJlc3VsdDx7XG4gICAgICBpbnNlcnRCZWZvcmU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlIHwgbnVsbDtcbiAgICAgIGRlc3RpbmF0aW9uOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTtcbiAgICB9PiB7XG4gICAgICBsZXQgeyBhcmdzIH0gPSBub2RlO1xuXG4gICAgICBsZXQgZ3VpZCA9IGFyZ3MuZ2V0KCdndWlkJyk7XG5cbiAgICAgIGlmIChndWlkKSB7XG4gICAgICAgIHJldHVybiBFcnIoZ2VuZXJhdGVTeW50YXhFcnJvcihgQ2Fubm90IHBhc3MgXFxgZ3VpZFxcYCB0byBcXGB7eyNpbi1lbGVtZW50fX1cXGBgLCBndWlkLmxvYykpO1xuICAgICAgfVxuXG4gICAgICBsZXQgaW5zZXJ0QmVmb3JlID0gYXJncy5nZXQoJ2luc2VydEJlZm9yZScpO1xuICAgICAgbGV0IGRlc3RpbmF0aW9uID0gYXJncy5udGgoMCk7XG5cbiAgICAgIGlmIChkZXN0aW5hdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjaW4tZWxlbWVudH19IHJlcXVpcmVzIGEgdGFyZ2V0IGVsZW1lbnQgYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyYCxcbiAgICAgICAgICAgIGFyZ3MubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBUT0RPIEJldHRlciBzeW50YXggY2hlY2tzXG5cbiAgICAgIHJldHVybiBPayh7IGluc2VydEJlZm9yZSwgZGVzdGluYXRpb24gfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAge1xuICAgICAgICBpbnNlcnRCZWZvcmUsXG4gICAgICAgIGRlc3RpbmF0aW9uLFxuICAgICAgfTogeyBpbnNlcnRCZWZvcmU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlIHwgbnVsbDsgZGVzdGluYXRpb246IEFTVHYyLkV4cHJlc3Npb25Ob2RlIH1cbiAgICApOiBSZXN1bHQ8bWlyLkluRWxlbWVudD4ge1xuICAgICAgbGV0IG5hbWVkID0gbm9kZS5ibG9ja3MuZ2V0KCdkZWZhdWx0Jyk7XG4gICAgICBsZXQgYm9keSA9IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2sobmFtZWQsIHN0YXRlKTtcbiAgICAgIGxldCBkZXN0aW5hdGlvblJlc3VsdCA9IFZJU0lUX0VYUFJTLnZpc2l0KGRlc3RpbmF0aW9uLCBzdGF0ZSk7XG5cbiAgICAgIHJldHVybiBSZXN1bHQuYWxsKGJvZHksIGRlc3RpbmF0aW9uUmVzdWx0KVxuICAgICAgICAuYW5kVGhlbihcbiAgICAgICAgICAoW2JvZHksIGRlc3RpbmF0aW9uXSk6IFJlc3VsdDx7XG4gICAgICAgICAgICBib2R5OiBtaXIuTmFtZWRCbG9jaztcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBtaXIuRXhwcmVzc2lvbk5vZGU7XG4gICAgICAgICAgICBpbnNlcnRCZWZvcmU6IG1pci5FeHByZXNzaW9uTm9kZTtcbiAgICAgICAgICB9PiA9PiB7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBWSVNJVF9FWFBSUy52aXNpdChpbnNlcnRCZWZvcmUsIHN0YXRlKS5tYXBPaygoaW5zZXJ0QmVmb3JlKSA9PiAoe1xuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlLFxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gT2soe1xuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlOiBuZXcgbWlyLk1pc3Npbmcoe1xuICAgICAgICAgICAgICAgICAgbG9jOiBub2RlLmNhbGxlZS5sb2MuY29sbGFwc2UoJ2VuZCcpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICAgLm1hcE9rKFxuICAgICAgICAgICh7IGJvZHksIGRlc3RpbmF0aW9uLCBpbnNlcnRCZWZvcmUgfSkgPT5cbiAgICAgICAgICAgIG5ldyBtaXIuSW5FbGVtZW50KHtcbiAgICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgICAgYmxvY2s6IGJvZHksXG4gICAgICAgICAgICAgIGluc2VydEJlZm9yZSxcbiAgICAgICAgICAgICAgZ3VpZDogc3RhdGUuZ2VuZXJhdGVVbmlxdWVDdXJzb3IoKSxcbiAgICAgICAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH0sXG4gIH0pXG4gIC5rdygnaWYnLCB7XG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZTogQVNUdjIuSW52b2tlQmxvY2tcbiAgICApOiBSZXN1bHQ8e1xuICAgICAgY29uZGl0aW9uOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTtcbiAgICB9PiB7XG4gICAgICBsZXQgeyBhcmdzIH0gPSBub2RlO1xuXG4gICAgICBpZiAoIWFyZ3MubmFtZWQuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNpZn19IGNhbm5vdCByZWNlaXZlIG5hbWVkIHBhcmFtZXRlcnMsIHJlY2VpdmVkICR7YXJncy5uYW1lZC5lbnRyaWVzXG4gICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUubmFtZS5jaGFycylcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIG5vZGUubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJncy5wb3NpdGlvbmFsLnNpemUgPiAxKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNpZn19IGNhbiBvbmx5IHJlY2VpdmUgb25lIHBvc2l0aW9uYWwgcGFyYW1ldGVyIGluIGJsb2NrIGZvcm0sIHRoZSBjb25kaXRpb25hbCB2YWx1ZS4gUmVjZWl2ZWQgJHthcmdzLnBvc2l0aW9uYWwuc2l6ZX0gcGFyYW1ldGVyc2AsXG4gICAgICAgICAgICBub2RlLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGNvbmRpdGlvbiA9IGFyZ3MubnRoKDApO1xuXG4gICAgICBpZiAoY29uZGl0aW9uID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNpZn19IHJlcXVpcmVzIGEgY29uZGl0aW9uIGFzIGl0cyBmaXJzdCBwb3NpdGlvbmFsIHBhcmFtZXRlciwgZGlkIG5vdCByZWNlaXZlIGFueSBwYXJhbWV0ZXJzYCxcbiAgICAgICAgICAgIG5vZGUubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2soeyBjb25kaXRpb24gfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyBjb25kaXRpb24gfTogeyBjb25kaXRpb246IEFTVHYyLkV4cHJlc3Npb25Ob2RlIH1cbiAgICApOiBSZXN1bHQ8bWlyLklmPiB7XG4gICAgICBsZXQgYmxvY2sgPSBub2RlLmJsb2Nrcy5nZXQoJ2RlZmF1bHQnKTtcbiAgICAgIGxldCBpbnZlcnNlID0gbm9kZS5ibG9ja3MuZ2V0KCdlbHNlJyk7XG5cbiAgICAgIGxldCBjb25kaXRpb25SZXN1bHQgPSBWSVNJVF9FWFBSUy52aXNpdChjb25kaXRpb24sIHN0YXRlKTtcbiAgICAgIGxldCBibG9ja1Jlc3VsdCA9IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2soYmxvY2ssIHN0YXRlKTtcbiAgICAgIGxldCBpbnZlcnNlUmVzdWx0ID0gaW52ZXJzZSA/IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2soaW52ZXJzZSwgc3RhdGUpIDogT2sobnVsbCk7XG5cbiAgICAgIHJldHVybiBSZXN1bHQuYWxsKGNvbmRpdGlvblJlc3VsdCwgYmxvY2tSZXN1bHQsIGludmVyc2VSZXN1bHQpLm1hcE9rKFxuICAgICAgICAoW2NvbmRpdGlvbiwgYmxvY2ssIGludmVyc2VdKSA9PlxuICAgICAgICAgIG5ldyBtaXIuSWYoe1xuICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgIGJsb2NrLFxuICAgICAgICAgICAgaW52ZXJzZSxcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9LFxuICB9KVxuICAua3coJ3VubGVzcycsIHtcbiAgICBhc3NlcnQoXG4gICAgICBub2RlOiBBU1R2Mi5JbnZva2VCbG9ja1xuICAgICk6IFJlc3VsdDx7XG4gICAgICBjb25kaXRpb246IEFTVHYyLkV4cHJlc3Npb25Ob2RlO1xuICAgIH0+IHtcbiAgICAgIGxldCB7IGFyZ3MgfSA9IG5vZGU7XG5cbiAgICAgIGlmICghYXJncy5uYW1lZC5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgICAgYHt7I3VubGVzc319IGNhbm5vdCByZWNlaXZlIG5hbWVkIHBhcmFtZXRlcnMsIHJlY2VpdmVkICR7YXJncy5uYW1lZC5lbnRyaWVzXG4gICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUubmFtZS5jaGFycylcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIG5vZGUubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJncy5wb3NpdGlvbmFsLnNpemUgPiAxKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyN1bmxlc3N9fSBjYW4gb25seSByZWNlaXZlIG9uZSBwb3NpdGlvbmFsIHBhcmFtZXRlciBpbiBibG9jayBmb3JtLCB0aGUgY29uZGl0aW9uYWwgdmFsdWUuIFJlY2VpdmVkICR7YXJncy5wb3NpdGlvbmFsLnNpemV9IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgbm9kZS5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGxldCBjb25kaXRpb24gPSBhcmdzLm50aCgwKTtcblxuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjdW5sZXNzfX0gcmVxdWlyZXMgYSBjb25kaXRpb24gYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyLCBkaWQgbm90IHJlY2VpdmUgYW55IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgbm9kZS5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPayh7IGNvbmRpdGlvbiB9KTtcbiAgICB9LFxuXG4gICAgdHJhbnNsYXRlKFxuICAgICAgeyBub2RlLCBzdGF0ZSB9OiB7IG5vZGU6IEFTVHYyLkludm9rZUJsb2NrOyBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlIH0sXG4gICAgICB7IGNvbmRpdGlvbiB9OiB7IGNvbmRpdGlvbjogQVNUdjIuRXhwcmVzc2lvbk5vZGUgfVxuICAgICk6IFJlc3VsdDxtaXIuSWY+IHtcbiAgICAgIGxldCBibG9jayA9IG5vZGUuYmxvY2tzLmdldCgnZGVmYXVsdCcpO1xuICAgICAgbGV0IGludmVyc2UgPSBub2RlLmJsb2Nrcy5nZXQoJ2Vsc2UnKTtcblxuICAgICAgbGV0IGNvbmRpdGlvblJlc3VsdCA9IFZJU0lUX0VYUFJTLnZpc2l0KGNvbmRpdGlvbiwgc3RhdGUpO1xuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuICAgICAgbGV0IGludmVyc2VSZXN1bHQgPSBpbnZlcnNlID8gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhpbnZlcnNlLCBzdGF0ZSkgOiBPayhudWxsKTtcblxuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwoY29uZGl0aW9uUmVzdWx0LCBibG9ja1Jlc3VsdCwgaW52ZXJzZVJlc3VsdCkubWFwT2soXG4gICAgICAgIChbY29uZGl0aW9uLCBibG9jaywgaW52ZXJzZV0pID0+XG4gICAgICAgICAgbmV3IG1pci5JZih7XG4gICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgY29uZGl0aW9uOiBuZXcgbWlyLk5vdCh7IHZhbHVlOiBjb25kaXRpb24sIGxvYzogbm9kZS5sb2MgfSksXG4gICAgICAgICAgICBibG9jayxcbiAgICAgICAgICAgIGludmVyc2UsXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSlcbiAgLmt3KCdlYWNoJywge1xuICAgIGFzc2VydChcbiAgICAgIG5vZGU6IEFTVHYyLkludm9rZUJsb2NrXG4gICAgKTogUmVzdWx0PHtcbiAgICAgIHZhbHVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTtcbiAgICAgIGtleTogQVNUdjIuRXhwcmVzc2lvbk5vZGUgfCBudWxsO1xuICAgIH0+IHtcbiAgICAgIGxldCB7IGFyZ3MgfSA9IG5vZGU7XG5cbiAgICAgIGlmICghYXJncy5uYW1lZC5lbnRyaWVzLmV2ZXJ5KChlKSA9PiBlLm5hbWUuY2hhcnMgPT09ICdrZXknKSkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjZWFjaH19IGNhbiBvbmx5IHJlY2VpdmUgdGhlICdrZXknIG5hbWVkIHBhcmFtZXRlciwgcmVjZWl2ZWQgJHthcmdzLm5hbWVkLmVudHJpZXNcbiAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5uYW1lLmNoYXJzICE9PSAna2V5JylcbiAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5uYW1lLmNoYXJzKVxuICAgICAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgYXJncy5uYW1lZC5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmdzLnBvc2l0aW9uYWwuc2l6ZSA+IDEpIHtcbiAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgICAgYHt7I2VhY2h9fSBjYW4gb25seSByZWNlaXZlIG9uZSBwb3NpdGlvbmFsIHBhcmFtZXRlciwgdGhlIGNvbGxlY3Rpb24gYmVpbmcgaXRlcmF0ZWQuIFJlY2VpdmVkICR7YXJncy5wb3NpdGlvbmFsLnNpemV9IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5wb3NpdGlvbmFsLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHZhbHVlID0gYXJncy5udGgoMCk7XG4gICAgICBsZXQga2V5ID0gYXJncy5nZXQoJ2tleScpO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgICAgYHt7I2VhY2h9fSByZXF1aXJlcyBhbiBpdGVyYWJsZSB2YWx1ZSB0byBiZSBwYXNzZWQgYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyLCBkaWQgbm90IHJlY2VpdmUgYW55IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPayh7IHZhbHVlLCBrZXkgfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyB2YWx1ZSwga2V5IH06IHsgdmFsdWU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlOyBrZXk6IEFTVHYyLkV4cHJlc3Npb25Ob2RlIHwgbnVsbCB9XG4gICAgKTogUmVzdWx0PG1pci5FYWNoPiB7XG4gICAgICBsZXQgYmxvY2sgPSBub2RlLmJsb2Nrcy5nZXQoJ2RlZmF1bHQnKTtcbiAgICAgIGxldCBpbnZlcnNlID0gbm9kZS5ibG9ja3MuZ2V0KCdlbHNlJyk7XG5cbiAgICAgIGxldCB2YWx1ZVJlc3VsdCA9IFZJU0lUX0VYUFJTLnZpc2l0KHZhbHVlLCBzdGF0ZSk7XG4gICAgICBsZXQga2V5UmVzdWx0ID0ga2V5ID8gVklTSVRfRVhQUlMudmlzaXQoa2V5LCBzdGF0ZSkgOiBPayhudWxsKTtcblxuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuICAgICAgbGV0IGludmVyc2VSZXN1bHQgPSBpbnZlcnNlID8gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhpbnZlcnNlLCBzdGF0ZSkgOiBPayhudWxsKTtcblxuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwodmFsdWVSZXN1bHQsIGtleVJlc3VsdCwgYmxvY2tSZXN1bHQsIGludmVyc2VSZXN1bHQpLm1hcE9rKFxuICAgICAgICAoW3ZhbHVlLCBrZXksIGJsb2NrLCBpbnZlcnNlXSkgPT5cbiAgICAgICAgICBuZXcgbWlyLkVhY2goe1xuICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgICBpbnZlcnNlLFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH0sXG4gIH0pXG4gIC5rdygnd2l0aCcsIHtcbiAgICBhc3NlcnQoXG4gICAgICBub2RlOiBBU1R2Mi5JbnZva2VCbG9ja1xuICAgICk6IFJlc3VsdDx7XG4gICAgICB2YWx1ZTogQVNUdjIuRXhwcmVzc2lvbk5vZGU7XG4gICAgfT4ge1xuICAgICAgbGV0IHsgYXJncyB9ID0gbm9kZTtcblxuICAgICAgaWYgKCFhcmdzLm5hbWVkLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjd2l0aH19IGNhbm5vdCByZWNlaXZlIG5hbWVkIHBhcmFtZXRlcnMsIHJlY2VpdmVkICR7YXJncy5uYW1lZC5lbnRyaWVzXG4gICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUubmFtZS5jaGFycylcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIGFyZ3MubmFtZWQubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJncy5wb3NpdGlvbmFsLnNpemUgPiAxKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyN3aXRofX0gY2FuIG9ubHkgcmVjZWl2ZSBvbmUgcG9zaXRpb25hbCBwYXJhbWV0ZXIuIFJlY2VpdmVkICR7YXJncy5wb3NpdGlvbmFsLnNpemV9IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5wb3NpdGlvbmFsLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHZhbHVlID0gYXJncy5udGgoMCk7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjd2l0aH19IHJlcXVpcmVzIGEgdmFsdWUgYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyLCBkaWQgbm90IHJlY2VpdmUgYW55IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPayh7IHZhbHVlIH0pO1xuICAgIH0sXG5cbiAgICB0cmFuc2xhdGUoXG4gICAgICB7IG5vZGUsIHN0YXRlIH06IHsgbm9kZTogQVNUdjIuSW52b2tlQmxvY2s7IHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUgfSxcbiAgICAgIHsgdmFsdWUgfTogeyB2YWx1ZTogQVNUdjIuRXhwcmVzc2lvbk5vZGUgfVxuICAgICk6IFJlc3VsdDxtaXIuV2l0aD4ge1xuICAgICAgbGV0IGJsb2NrID0gbm9kZS5ibG9ja3MuZ2V0KCdkZWZhdWx0Jyk7XG4gICAgICBsZXQgaW52ZXJzZSA9IG5vZGUuYmxvY2tzLmdldCgnZWxzZScpO1xuXG4gICAgICBsZXQgdmFsdWVSZXN1bHQgPSBWSVNJVF9FWFBSUy52aXNpdCh2YWx1ZSwgc3RhdGUpO1xuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuICAgICAgbGV0IGludmVyc2VSZXN1bHQgPSBpbnZlcnNlID8gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhpbnZlcnNlLCBzdGF0ZSkgOiBPayhudWxsKTtcblxuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwodmFsdWVSZXN1bHQsIGJsb2NrUmVzdWx0LCBpbnZlcnNlUmVzdWx0KS5tYXBPayhcbiAgICAgICAgKFt2YWx1ZSwgYmxvY2ssIGludmVyc2VdKSA9PlxuICAgICAgICAgIG5ldyBtaXIuV2l0aCh7XG4gICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBibG9jayxcbiAgICAgICAgICAgIGludmVyc2UsXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSlcbiAgLmt3KCdsZXQnLCB7XG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZTogQVNUdjIuSW52b2tlQmxvY2tcbiAgICApOiBSZXN1bHQ8e1xuICAgICAgcG9zaXRpb25hbDogQVNUdjIuUG9zaXRpb25hbEFyZ3VtZW50cztcbiAgICB9PiB7XG4gICAgICBsZXQgeyBhcmdzIH0gPSBub2RlO1xuXG4gICAgICBpZiAoIWFyZ3MubmFtZWQuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNsZXR9fSBjYW5ub3QgcmVjZWl2ZSBuYW1lZCBwYXJhbWV0ZXJzLCByZWNlaXZlZCAke2FyZ3MubmFtZWQuZW50cmllc1xuICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLm5hbWUuY2hhcnMpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICBhcmdzLm5hbWVkLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZ3MucG9zaXRpb25hbC5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNsZXR9fSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWUgYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyLCBkaWQgbm90IHJlY2VpdmUgYW55IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5wb3NpdGlvbmFsLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUuYmxvY2tzLmdldCgnZWxzZScpKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihge3sjbGV0fX0gY2Fubm90IHJlY2VpdmUgYW4ge3tlbHNlfX0gYmxvY2tgLCBhcmdzLnBvc2l0aW9uYWwubG9jKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2soeyBwb3NpdGlvbmFsOiBhcmdzLnBvc2l0aW9uYWwgfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyBwb3NpdGlvbmFsIH06IHsgcG9zaXRpb25hbDogQVNUdjIuUG9zaXRpb25hbEFyZ3VtZW50cyB9XG4gICAgKTogUmVzdWx0PG1pci5MZXQ+IHtcbiAgICAgIGxldCBibG9jayA9IG5vZGUuYmxvY2tzLmdldCgnZGVmYXVsdCcpO1xuXG4gICAgICBsZXQgcG9zaXRpb25hbFJlc3VsdCA9IFZJU0lUX0VYUFJTLlBvc2l0aW9uYWwocG9zaXRpb25hbCwgc3RhdGUpO1xuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuXG4gICAgICByZXR1cm4gUmVzdWx0LmFsbChwb3NpdGlvbmFsUmVzdWx0LCBibG9ja1Jlc3VsdCkubWFwT2soXG4gICAgICAgIChbcG9zaXRpb25hbCwgYmxvY2tdKSA9PlxuICAgICAgICAgIG5ldyBtaXIuTGV0KHtcbiAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICBwb3NpdGlvbmFsLFxuICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSlcbiAgLmt3KCctd2l0aC1keW5hbWljLXZhcnMnLCB7XG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZTogQVNUdjIuSW52b2tlQmxvY2tcbiAgICApOiBSZXN1bHQ8e1xuICAgICAgbmFtZWQ6IEFTVHYyLk5hbWVkQXJndW1lbnRzO1xuICAgIH0+IHtcbiAgICAgIHJldHVybiBPayh7IG5hbWVkOiBub2RlLmFyZ3MubmFtZWQgfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyBuYW1lZCB9OiB7IG5hbWVkOiBBU1R2Mi5OYW1lZEFyZ3VtZW50cyB9XG4gICAgKTogUmVzdWx0PG1pci5XaXRoRHluYW1pY1ZhcnM+IHtcbiAgICAgIGxldCBibG9jayA9IG5vZGUuYmxvY2tzLmdldCgnZGVmYXVsdCcpO1xuXG4gICAgICBsZXQgbmFtZWRSZXN1bHQgPSBWSVNJVF9FWFBSUy5OYW1lZEFyZ3VtZW50cyhuYW1lZCwgc3RhdGUpO1xuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuXG4gICAgICByZXR1cm4gUmVzdWx0LmFsbChuYW1lZFJlc3VsdCwgYmxvY2tSZXN1bHQpLm1hcE9rKFxuICAgICAgICAoW25hbWVkLCBibG9ja10pID0+XG4gICAgICAgICAgbmV3IG1pci5XaXRoRHluYW1pY1ZhcnMoe1xuICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgIG5hbWVkLFxuICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSlcbiAgLmt3KCdjb21wb25lbnQnLCB7XG4gICAgYXNzZXJ0OiBhc3NlcnRDdXJyeUtleXdvcmQoQ3VycmllZFR5cGUuQ29tcG9uZW50KSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyBkZWZpbml0aW9uLCBhcmdzIH06IHsgZGVmaW5pdGlvbjogQVNUdjIuRXhwcmVzc2lvbk5vZGU7IGFyZ3M6IEFTVHYyLkFyZ3MgfVxuICAgICk6IFJlc3VsdDxtaXIuSW52b2tlQ29tcG9uZW50PiB7XG4gICAgICBsZXQgZGVmaW5pdGlvblJlc3VsdCA9IFZJU0lUX0VYUFJTLnZpc2l0KGRlZmluaXRpb24sIHN0YXRlKTtcbiAgICAgIGxldCBhcmdzUmVzdWx0ID0gVklTSVRfRVhQUlMuQXJncyhhcmdzLCBzdGF0ZSk7XG4gICAgICBsZXQgYmxvY2tzUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9ja3Mobm9kZS5ibG9ja3MsIHN0YXRlKTtcblxuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwoZGVmaW5pdGlvblJlc3VsdCwgYXJnc1Jlc3VsdCwgYmxvY2tzUmVzdWx0KS5tYXBPayhcbiAgICAgICAgKFtkZWZpbml0aW9uLCBhcmdzLCBibG9ja3NdKSA9PlxuICAgICAgICAgIG5ldyBtaXIuSW52b2tlQ29tcG9uZW50KHtcbiAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICBkZWZpbml0aW9uLFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIGJsb2NrcyxcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=