occam-nominal 1.0.558 → 1.0.565
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/element/assertion/subproof.js +3 -3
- package/lib/element/assumption.js +45 -33
- package/lib/element/claim/axiom.js +1 -2
- package/lib/element/link.js +7 -5
- package/lib/element/metavariable.js +1 -59
- package/lib/element/schema.js +17 -21
- package/lib/element/signature.js +10 -3
- package/lib/element/statement.js +1 -17
- package/lib/example/nominal/bnf.js +1 -9
- package/lib/nonTerminalNodeMap.js +1 -7
- package/lib/preamble.js +1 -2
- package/lib/process/instantiate.js +2 -8
- package/lib/process/unify.js +2 -17
- package/lib/ruleNames.js +1 -13
- package/lib/utilities/element.js +1 -25
- package/lib/utilities/json.js +2 -2
- package/lib/utilities/string.js +1 -8
- package/package.json +1 -1
- package/src/element/assertion/subproof.js +2 -2
- package/src/element/assumption.js +72 -48
- package/src/element/claim/axiom.js +0 -2
- package/src/element/link.js +10 -7
- package/src/element/metavariable.js +0 -102
- package/src/element/schema.js +23 -31
- package/src/element/signature.js +19 -3
- package/src/element/statement.js +0 -26
- package/src/example/nominal/bnf.js +0 -8
- package/src/nonTerminalNodeMap.js +0 -9
- package/src/preamble.js +0 -1
- package/src/process/instantiate.js +0 -4
- package/src/process/unify.js +0 -23
- package/src/ruleNames.js +0 -3
- package/src/utilities/element.js +0 -33
- package/src/utilities/json.js +2 -4
- package/src/utilities/string.js +0 -8
- package/lib/element/substitution/frame.js +0 -187
- package/lib/node/equivalence.js +0 -23
- package/lib/node/equivalences.js +0 -18
- package/lib/node/substitution/frame.js +0 -40
- package/src/element/substitution/frame.js +0 -261
- package/src/node/equivalence.js +0 -16
- package/src/node/equivalences.js +0 -7
- package/src/node/substitution/frame.js +0 -37
|
@@ -11,7 +11,6 @@ Object.defineProperty(exports, "default", {
|
|
|
11
11
|
const _occamlanguages = require("occam-languages");
|
|
12
12
|
const _elements = /*#__PURE__*/ _interop_require_wildcard(require("../elements"));
|
|
13
13
|
const _context = require("../utilities/context");
|
|
14
|
-
const _state = require("../utilities/state");
|
|
15
14
|
const _instantiate = require("../process/instantiate");
|
|
16
15
|
const _json = require("../utilities/json");
|
|
17
16
|
const _unify = require("../process/unify");
|
|
@@ -253,31 +252,6 @@ const _default = (0, _elements.define)(class Metavariable extends _occamlanguage
|
|
|
253
252
|
return forward(strict, state, context, back);
|
|
254
253
|
}, back);
|
|
255
254
|
}
|
|
256
|
-
unifyFrame(frame, generalContext, specificContext, forward, back) {
|
|
257
|
-
const context = specificContext, frameString = frame.getString(), metavariableString = this.getString(); ///
|
|
258
|
-
context.trace(`Unifying the '${frameString}' frame with the '${metavariableString}' metavariable...`);
|
|
259
|
-
const frameMetavariableCompares = this.compareFrameMetavariable(frame, generalContext, specificContext);
|
|
260
|
-
if (frameMetavariableCompares) {
|
|
261
|
-
return forward(generalContext, specificContext, back);
|
|
262
|
-
}
|
|
263
|
-
const metavariable = this, metavariableNode = metavariable.getNode(), inferredSubstitution = context.findInferredSubstitutionByMetavariableNode(metavariableNode);
|
|
264
|
-
if (inferredSubstitution !== null) {
|
|
265
|
-
const inferredSubstitutionComparesToFrame = inferredSubstitution.compareFrame(frame, context);
|
|
266
|
-
if (inferredSubstitutionComparesToFrame) {
|
|
267
|
-
const inferredSubstitutionString = inferredSubstitution.getString();
|
|
268
|
-
context.trace(`The '${inferredSubstitutionString}' inferred substitution is already present.`);
|
|
269
|
-
return forward(generalContext, specificContext, back);
|
|
270
|
-
}
|
|
271
|
-
return back();
|
|
272
|
-
}
|
|
273
|
-
const { FrameSubstitution } = _elements.default, frameSubstitution = FrameSubstitution.fromFrameAndMetavariable(frame, metavariable, generalContext, specificContext);
|
|
274
|
-
return frameSubstitution.verify(context, (context, back)=>{
|
|
275
|
-
const inferredSubstitution = frameSubstitution; ///
|
|
276
|
-
context.addInferredSubstitution(inferredSubstitution);
|
|
277
|
-
context.debug(`...unified the '${frameString}' frame with the '${metavariableString}' metavariable.`);
|
|
278
|
-
return forward(generalContext, specificContext, back);
|
|
279
|
-
}, back);
|
|
280
|
-
}
|
|
281
255
|
unifyStatement(statement, generalContext, specificContext, forward, back) {
|
|
282
256
|
const context = specificContext, statementString = statement.getString(), metavariableString = this.getString(); ///
|
|
283
257
|
context.trace(`Unifying the '${statementString}' statement with the '${metavariableString}' metavariable...`);
|
|
@@ -329,38 +303,6 @@ const _default = (0, _elements.define)(class Metavariable extends _occamlanguage
|
|
|
329
303
|
return forward(generalContext, specificContext, back);
|
|
330
304
|
}, back);
|
|
331
305
|
}
|
|
332
|
-
compareFrameMetavariable(frame, generalContext, specificContext) {
|
|
333
|
-
let frameMetavariablCompares = false;
|
|
334
|
-
const context = specificContext, frameString = frame.getString(), metavariableString = this.getString(); ///
|
|
335
|
-
context.trace(`Comparing the '${frameString}' frame's metavariable to the '${metavariableString}' metavariable...`);
|
|
336
|
-
const generalContextFilePath = generalContext.getFilePath(), specificContextFilePath = specificContext.getFilePath();
|
|
337
|
-
if (generalContextFilePath === specificContextFilePath) {
|
|
338
|
-
const metavariableNode = this.getMetavariableNode(), metavariableNodeMatches = frame.matchMetavariableNode(metavariableNode);
|
|
339
|
-
if (metavariableNodeMatches) {
|
|
340
|
-
frameMetavariablCompares = true;
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
if (frameMetavariablCompares) {
|
|
344
|
-
context.debug(`...compared the '${frameString}' frame's metavariable to the '${metavariableString}' metavariable.`);
|
|
345
|
-
}
|
|
346
|
-
return frameMetavariablCompares;
|
|
347
|
-
}
|
|
348
|
-
compareReferenceMetavariable(reference, generalContext, specificContext) {
|
|
349
|
-
let referenceMetavariableCompares = false;
|
|
350
|
-
const context = specificContext, referenceString = reference.getString(), metavariableString = this.getString(); ///
|
|
351
|
-
context.trace(`Comparing the '${referenceString}' reference's metavariable to the '${metavariableString}' metavariable...`);
|
|
352
|
-
const generalContextFilePath = generalContext.getFilePath(), specificContextFilePath = specificContext.getFilePath();
|
|
353
|
-
if (generalContextFilePath === specificContextFilePath) {
|
|
354
|
-
const metavariableNode = this.getMetavariableNode(), metavariableNodeMatches = reference.matchMetavariableNode(metavariableNode);
|
|
355
|
-
if (metavariableNodeMatches) {
|
|
356
|
-
referenceMetavariableCompares = true;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
if (referenceMetavariableCompares) {
|
|
360
|
-
context.trace(`...compared the '${referenceString}' reference's metavariable to the '${metavariableString}' metavariable.`);
|
|
361
|
-
}
|
|
362
|
-
return referenceMetavariableCompares;
|
|
363
|
-
}
|
|
364
306
|
compareStatementMetavariable(statement, generalContext, specificContext) {
|
|
365
307
|
let statementMetavariableCompares = false;
|
|
366
308
|
const context = specificContext, statementString = statement.getString(), metavariableString = this.getString(); ///
|
|
@@ -406,4 +348,4 @@ const _default = (0, _elements.define)(class Metavariable extends _occamlanguage
|
|
|
406
348
|
}
|
|
407
349
|
});
|
|
408
350
|
|
|
409
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L21ldGF2YXJpYWJsZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRWxlbWVudCwgYnJlYWtQb2ludFV0aWxpdGllcywgY29udGludWF0aW9uVXRpbGl0aWVzIH0gZnJvbSBcIm9jY2FtLWxhbmd1YWdlc1wiO1xuXG5pbXBvcnQgZWxlbWVudHMgZnJvbSBcIi4uL2VsZW1lbnRzXCI7XG5cbmltcG9ydCB7IGRlZmluZSB9IGZyb20gXCIuLi9lbGVtZW50c1wiO1xuaW1wb3J0IHsgaW5zdGFudGlhdGUgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2NvbnRleHRcIjtcbmltcG9ydCB7IGRlY2xhcmUsIGRlc2lzdCB9IGZyb20gXCIuLi91dGlsaXRpZXMvc3RhdGVcIjtcbmltcG9ydCB7IGluc3RhbnRpYXRlTWV0YXZhcmlhYmxlIH0gZnJvbSBcIi4uL3Byb2Nlc3MvaW5zdGFudGlhdGVcIjtcbmltcG9ydCB7IG1ldGFUeXBlRnJvbUpTT04sIG1ldGFUeXBlVG9NZXRhVHlwZUpTT04gfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2pzb25cIjtcbmltcG9ydCB7IHVuaWZ5TWV0YXZhcmlhYmxlLCB1bmlmeU1ldGF2YXJpYWJsZUludHJpbnNpY2FsbHkgfSBmcm9tIFwiLi4vcHJvY2Vzcy91bmlmeVwiO1xuaW1wb3J0IHsgbmFtZUZyb21NZXRhdmFyaWFibGVOb2RlLCB0ZXJtRnJvbU1ldGF2YXJpYWJsZU5vZGUsIHR5cGVGcm9tTWV0YXZhcmlhYmxlTm9kZSwgbWV0YXZhcmlhYmxlRnJvbVN0YXRlbWVudE5vZGUgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2VsZW1lbnRcIjtcblxuY29uc3QgeyBhbGwgfSA9IGNvbnRpbnVhdGlvblV0aWxpdGllcyxcbiAgICAgIHsgYnJlYWtQb2ludEZyb21KU09OLCBicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiB9ID0gYnJlYWtQb2ludFV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lKGNsYXNzIE1ldGF2YXJpYWJsZSBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQsIG5hbWUsIHRlcm0sIHR5cGUsIG1ldGFUeXBlKSB7XG4gICAgc3VwZXIoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50KTtcbiAgICBcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudGVybSA9IHRlcm07XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLm1ldGFUeXBlID0gbWV0YVR5cGU7XG4gIH1cblxuICBnZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICBnZXRUZXJtKCkge1xuICAgIHJldHVybiB0aGlzLnRlcm07XG4gIH1cblxuICBnZXRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGU7XG4gIH1cblxuICBnZXRNZXRhVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhVHlwZTtcbiAgfVxuXG4gIHNldE1ldGFUeXBlKG1ldGFUeXBlKSB7XG4gICAgdGhpcy5tZXRhVHlwZSA9IG1ldGFUeXBlO1xuICB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlTm9kZSgpIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTm9kZSA9IG5vZGU7ICAvLy9cblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVOb2RlO1xuICB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlTmFtZSgpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gdGhpcy5nZXRNZXRhdmFyaWFibGVOb2RlKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTmFtZSA9IG1ldGF2YXJpYWJsZU5vZGUuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZU5hbWU7XG4gIH1cblxuICBpc01hbGZvcm1lZCgpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gdGhpcy5nZXRNZXRhdmFyaWFibGVOb2RlKCksXG4gICAgICAgICAgbWFsZm9ybWVkID0gbWV0YXZhcmlhYmxlTm9kZS5pc01hbGZvcm1lZCgpO1xuXG4gICAgcmV0dXJuIG1hbGZvcm1lZDtcbiAgfVxuXG4gIGlzRGVjbGFyZWQoKSB7XG4gICAgY29uc3QgZGVjbGFyZWQgPSAodGhpcy5tZXRhVHlwZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gZGVjbGFyZWQ7XG4gIH1cblxuICBpc0VxdWFsVG8obWV0YXZhcmlhYmxlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IG1ldGF2YXJpYWJsZS5nZXROb2RlKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMgPSB0aGlzLm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBlcXVhbFRvID0gbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXM7ICAvLy9cblxuICAgIHJldHVybiBlcXVhbFRvO1xuICB9XG5cbiAgaXNNZXRhVHlwZUVxdWFsVG8obWV0YVR5cGUpIHsgcmV0dXJuIHRoaXMubWV0YVR5cGUuaXNFcXVhbFRvKG1ldGFUeXBlKTsgfVxuXG4gIG1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3Qgbm9kZSA9IG1ldGF2YXJpYWJsZU5vZGUsIC8vL1xuICAgICAgICAgIG5vZGVNYXRjaGVzID0gdGhpcy5tYXRjaE5vZGUobm9kZSksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMgPSBub2RlTWF0Y2hlczsgLy8vXG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXM7XG4gIH1cblxuICBmaW5kTWV0YXZhcmlhYmxlKGNvbnRleHQpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gdGhpcy5nZXRNZXRhdmFyaWFibGVOb2RlKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlID0gY29udGV4dC5maW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZTtcbiAgfVxuXG4gIGNvbXBhcmVNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTmFtZSA9IG1ldGF2YXJpYWJsZS5nZXROYW1lKCksXG4gICAgICAgICAgY29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUgPSB0aGlzLmNvbXBhcmVNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpLFxuICAgICAgICAgIGNvbXBhcmVzVG9NZXRhdmFyaWFibGUgPSBjb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZTsgIC8vL1xuXG4gICAgcmV0dXJuIGNvbXBhcmVzVG9NZXRhdmFyaWFibGU7XG4gIH1cblxuICBjb21wYXJlTWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgY29uc3QgbmFtZU1ldGF2YXJpYWJsZU5hbWUgPSAodGhpcy5uYW1lID09PSBtZXRhdmFyaWFibGVOYW1lKSxcbiAgICAgICAgICBjb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSA9IG5hbWVNZXRhdmFyaWFibGVOYW1lOyAgLy8vXG5cbiAgICByZXR1cm4gY29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWU7XG4gIH1cblxuICB2ZXJpZnkoY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIGNvbnN0IG1ldGF2YXJpYWJsZVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLi4uYCk7XG5cbiAgICBjb25zdCBtYWxmb3JtZWQgPSB0aGlzLmlzTWFsZm9ybWVkKCk7XG5cbiAgICBpZiAobWFsZm9ybWVkKSB7XG4gICAgICBjb250ZXh0LnRyYWNlKGBVbmFibGUgdG8gdmVyaWZ5IHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgYmVjYXVzZSBpdCBpcyBtYWxmb3JtZWQuYCk7XG5cbiAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmVyaWZ5VGVybSA9IHRoaXMudmVyaWZ5VGVybS5iaW5kKHRoaXMpLFxuICAgICAgICAgIHZlcmlmeVR5cGUgPSB0aGlzLnZlcmlmeVR5cGUuYmluZCh0aGlzKTtcblxuICAgIHJldHVybiBhbGwoW1xuICAgICAgdmVyaWZ5VGVybSxcbiAgICAgIHZlcmlmeVR5cGVcbiAgICBdLCAgY29udGV4dCwgKGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgIH0sIGJhY2spO1xuICB9XG5cbiAgdmVyaWZ5VGVybShjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUncyB0ZXJtLi4uYCk7XG5cbiAgICBpZiAodGhpcy50ZXJtICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGBUaGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIGNhbiBvbmx5IGhhdmUgYSB0eXBlIGFuZCBub3QgYSB0ZXJtLmApO1xuXG4gICAgICByZXR1cm4gYmFjaygpO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUncyB0ZXJtLmApO1xuXG4gICAgcmV0dXJuIGZvcndhcmQoY29udGV4dCwgYmFjayk7XG4gIH1cblxuICB2ZXJpZnlUeXBlKGNvbnRleHQsIGZvcndhcmQsIGJhY2spIHtcbiAgICBpZiAodGhpcy50eXBlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZChjb250ZXh0LCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSdzIHR5cGUuLi5gKTtcblxuICAgIGNvbnN0IHR5cGVOYW1lID0gdGhpcy50eXBlLmdldE5hbWUoKSxcbiAgICAgICAgICB0eXBlID0gY29udGV4dC5maW5kVHlwZUJ5VHlwZU5hbWUodHlwZU5hbWUpO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgfVxuXG4gICAgdGhpcy50eXBlID0gdHlwZTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkcyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgdHlwZS5gKTtcblxuICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICB9XG5cbiAgdmFsaWRhdGUoc3RyaWN0LCBzdGF0ZSwgY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIGlmIChiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJhY2sgPSBmb3J3YXJkOyAvLy9cblxuICAgICAgZm9yd2FyZCA9IGNvbnRleHQ7IC8vL1xuXG4gICAgICBjb250ZXh0ID0gc3RhdGU7ICAvLy9cblxuICAgICAgc3RhdGUgPSBzdHJpY3Q7IC8vL1xuXG4gICAgICBzdHJpY3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgbWV0YXZhcmlhYmxlO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuLi5gKTtcblxuICAgIG1ldGF2YXJpYWJsZSA9IHRoaXMuZmluZE1ldGF2YXJpYWJsZShjb250ZXh0KTtcblxuICAgIGlmIChtZXRhdmFyaWFibGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgaXMgYWxyZWFkeSBwcmVzZW50LmApO1xuXG4gICAgICByZXR1cm4gZm9yd2FyZChtZXRhdmFyaWFibGUsIGNvbnRleHQsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlTmFtZSA9IHRoaXMudmFsaWRhdGVOYW1lLmJpbmQodGhpcyksXG4gICAgICAgICAgdmFsaWRhdGVUeXBlID0gdGhpcy52YWxpZGF0ZVR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgICB2YWxpZGF0ZVRlcm0gPSB0aGlzLnZhbGlkYXRlVGVybS5iaW5kKHRoaXMpO1xuXG4gICAgcmV0dXJuIGFsbChbXG4gICAgICB2YWxpZGF0ZU5hbWUsXG4gICAgICB2YWxpZGF0ZVR5cGUsXG4gICAgICB2YWxpZGF0ZVRlcm1cbiAgICBdLCBzdHJpY3QsIHN0YXRlLCBjb250ZXh0LCAoc3RyaWN0LCBzdGF0ZSwgY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgbWV0YXZhcmlhYmxlID0gdGhpczsgIC8vL1xuXG4gICAgICBjb250ZXh0LmFkZE1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpO1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS5gKTtcblxuICAgICAgcmV0dXJuIGZvcndhcmQobWV0YXZhcmlhYmxlLCBjb250ZXh0LCBiYWNrKTtcbiAgICB9LCBiYWNrKTtcbiAgfVxuXG4gIHZhbGlkYXRlTmFtZShzdHJpY3QsIHN0YXRlLCBjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgbmFtZS4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTmFtZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLCAgLy8vXG4gICAgICAgICAgZGVjbGFyZWRNZXRhdmFyaWFibGUgPSBjb250ZXh0LmZpbmREZWNsYXJlZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgIGxldCBuYW1lVmFsaWRhdGVzID0gdHJ1ZTsgLy8vXG5cbiAgICBpZiAoZGVjbGFyZWRNZXRhdmFyaWFibGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG1ldGFUeXBlID0gZGVjbGFyZWRNZXRhdmFyaWFibGUuZ2V0TWV0YVR5cGUoKSxcbiAgICAgICAgICAgIG1ldGFUeXBlU3RyaW5nID0gbWV0YVR5cGUuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIHRoaXMubWV0YVR5cGUgPSBtZXRhVHlwZTtcblxuICAgICAgY29udGV4dC50cmFjZShgU2V0dGluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgbWV0YS10eXBlIHRvIHRoZSAnJHttZXRhVHlwZVN0cmluZ30nIG1ldGEtdHlwZS5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICBuYW1lVmFsaWRhdGVzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFuYW1lVmFsaWRhdGVzKSB7XG4gICAgICByZXR1cm4gYmFjaygpO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgbmFtZS5gKTtcblxuICAgIHJldHVybiBmb3J3YXJkKHN0cmljdCwgc3RhdGUsIGNvbnRleHQsIGJhY2spO1xuICB9XG5cbiAgdmFsaWRhdGVUeXBlKHN0cmljdCwgc3RhdGUsIGNvbnRleHQsIGZvcndhcmQsIGJhY2spIHtcbiAgICBpZiAodGhpcy50eXBlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZChzdHJpY3QsIHN0YXRlLCBjb250ZXh0LCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nICB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgdHlwZS4uLmApO1xuXG4gICAgbGV0IHR5cGVWYWxpZGF0ZXMgPSB0cnVlOyAvLy9cblxuICAgIGNvbnN0IHR5cGVOYW1lID0gdGhpcy50eXBlLmdldE5hbWUoKSxcbiAgICAgICAgICB0eXBlUHJlc2VuZXQgPSBjb250ZXh0LmlzVHlwZVByZXNlbnRCeVR5cGVOYW1lKHR5cGVOYW1lKTtcblxuICAgIGlmICghdHlwZVByZXNlbmV0KSB7XG4gICAgICB0eXBlVmFsaWRhdGVzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0eXBlVmFsaWRhdGVzKSB7XG4gICAgICByZXR1cm4gYmFjaygpO1xuICAgIH1cblxuICAgIGNvbnRleHQudHJhY2UoYC4uLnZhbGlkYXRlZCAgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSdzIHR5cGUuYCk7XG5cbiAgICByZXR1cm4gZm9yd2FyZChzdHJpY3QsIHN0YXRlLCBjb250ZXh0LCBiYWNrKTtcbiAgfVxuXG4gIHZhbGlkYXRlVGVybShzdHJpY3QsIHN0YXRlLCBjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoc3RyaWN0LCBzdGF0ZSwgY29udGV4dCwgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgdGVybS4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTmFtZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIGRlY2xhcmVkTWV0YXZhcmlhYmxlID0gY29udGV4dC5maW5kRGVjbGFyZWRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICBpZiAoZGVjbGFyZWRNZXRhdmFyaWFibGUgPT09IG51bGwpIHtcbiAgICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMudGVybS52YWxpZGF0ZShzdGF0ZSwgY29udGV4dCwgKHRlcm0sIGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGVybTtcblxuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSdzIHRlcm0uYCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcndhcmQoc3RyaWN0LCBzdGF0ZSwgY29udGV4dCwgYmFjayk7XG4gICAgICB9LCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gZGVjbGFyZWRNZXRhdmFyaWFibGUuZ2V0VHlwZSgpO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudGVybS52YWxpZGF0ZUdpdmVuVHlwZSh0eXBlLCBzdGF0ZSwgY29udGV4dCwgKHRlcm0sIGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgIHRoaXMudGVybSA9IHRlcm07XG5cbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgdGVybS5gKTtcblxuICAgICAgcmV0dXJuIGZvcndhcmQoc3RyaWN0LCBzdGF0ZSwgY29udGV4dCwgYmFjayk7XG4gICAgfSwgYmFjayk7XG4gIH1cblxuICB1bmlmeUZyYW1lKGZyYW1lLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dCwgIC8vL1xuICAgICAgICAgIGZyYW1lU3RyaW5nID0gZnJhbWUuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke2ZyYW1lU3RyaW5nfScgZnJhbWUgd2l0aCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLi4uYCk7XG5cbiAgICBjb25zdCBmcmFtZU1ldGF2YXJpYWJsZUNvbXBhcmVzID0gdGhpcy5jb21wYXJlRnJhbWVNZXRhdmFyaWFibGUoZnJhbWUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgaWYgKGZyYW1lTWV0YXZhcmlhYmxlQ29tcGFyZXMpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGF2YXJpYWJsZSA9IHRoaXMsICAvLy9cbiAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlID0gbWV0YXZhcmlhYmxlLmdldE5vZGUoKSxcbiAgICAgICAgICBpbmZlcnJlZFN1YnN0aXR1dGlvbiA9IGNvbnRleHQuZmluZEluZmVycmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgaWYgKGluZmVycmVkU3Vic3RpdHV0aW9uICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBpbmZlcnJlZFN1YnN0aXR1dGlvbkNvbXBhcmVzVG9GcmFtZSA9IGluZmVycmVkU3Vic3RpdHV0aW9uLmNvbXBhcmVGcmFtZShmcmFtZSwgY29udGV4dCk7XG5cbiAgICAgIGlmIChpbmZlcnJlZFN1YnN0aXR1dGlvbkNvbXBhcmVzVG9GcmFtZSkge1xuICAgICAgICBjb25zdCBpbmZlcnJlZFN1YnN0aXR1dGlvblN0cmluZyA9IGluZmVycmVkU3Vic3RpdHV0aW9uLmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFRoZSAnJHtpbmZlcnJlZFN1YnN0aXR1dGlvblN0cmluZ30nIGluZmVycmVkIHN1YnN0aXR1dGlvbiBpcyBhbHJlYWR5IHByZXNlbnQuYCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcndhcmQoZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgYmFjayk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBGcmFtZVN1YnN0aXR1dGlvbiB9ID0gZWxlbWVudHMsXG4gICAgICAgICAgZnJhbWVTdWJzdGl0dXRpb24gPSBGcmFtZVN1YnN0aXR1dGlvbi5mcm9tRnJhbWVBbmRNZXRhdmFyaWFibGUoZnJhbWUsIG1ldGF2YXJpYWJsZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICByZXR1cm4gZnJhbWVTdWJzdGl0dXRpb24udmVyaWZ5KGNvbnRleHQsIChjb250ZXh0LCBiYWNrKSA9PiB7XG4gICAgICBjb25zdCBpbmZlcnJlZFN1YnN0aXR1dGlvbiA9IGZyYW1lU3Vic3RpdHV0aW9uOyAgLy8vXG5cbiAgICAgIGNvbnRleHQuYWRkSW5mZXJyZWRTdWJzdGl0dXRpb24oaW5mZXJyZWRTdWJzdGl0dXRpb24pO1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtmcmFtZVN0cmluZ30nIGZyYW1lIHdpdGggdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS5gKTtcblxuICAgICAgcmV0dXJuIGZvcndhcmQoZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgYmFjayk7XG4gICAgfSwgYmFjayk7XG4gIH1cblxuICB1bmlmeVN0YXRlbWVudChzdGF0ZW1lbnQsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIGZvcndhcmQsIGJhY2spIHtcbiAgICBjb25zdCBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLi4uYCk7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRNZXRhdmFyaWFibGVDb21wYXJlcyA9IHRoaXMuY29tcGFyZVN0YXRlbWVudE1ldGF2YXJpYWJsZShzdGF0ZW1lbnQsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgaWYgKHN0YXRlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZChnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGUgPSB0aGlzLCAgLy8vXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTm9kZSA9IG1ldGF2YXJpYWJsZS5nZXROb2RlKCksXG4gICAgICAgICAgc2libGluZ1N1YnN0aXR1dGlvbk5vZGUgPSBtZXRhdmFyaWFibGVOb2RlLmdldFNpYmxpbmdTdWJzdGl0dXRpb25Ob2RlKCksXG4gICAgICAgICAgc3Vic3RpdHV0aW9uTm9kZSA9IHNpYmxpbmdTdWJzdGl0dXRpb25Ob2RlLCAvLy9cbiAgICAgICAgICBpbmZlcnJlZFN1YnN0aXR1dGlvbiA9IChzdWJzdGl0dXRpb25Ob2RlICE9PSBudWxsKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5maW5kSW5mZXJyZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGVBbmRTdWJzdGl0dXRpb25Ob2RlKG1ldGF2YXJpYWJsZU5vZGUsIHN1YnN0aXR1dGlvbk5vZGUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmluZEluZmVycmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgaWYgKGluZmVycmVkU3Vic3RpdHV0aW9uICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBpbmZlcnJlZFN1YnN0aXR1dGlvbkNvbXBhcmVzVG9TdGF0ZW1lbnQgPSBpbmZlcnJlZFN1YnN0aXR1dGlvbi5jb21wYXJlU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgICAgIGlmIChpbmZlcnJlZFN1YnN0aXR1dGlvbkNvbXBhcmVzVG9TdGF0ZW1lbnQpIHtcbiAgICAgICAgY29uc3QgaW5mZXJyZWRTdWJzdGl0dXRpb25TdHJpbmcgPSBpbmZlcnJlZFN1YnN0aXR1dGlvbi5nZXRTdHJpbmcoKTtcblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBUaGUgJyR7aW5mZXJyZWRTdWJzdGl0dXRpb25TdHJpbmd9JyBpbmZlcnJlZCBzdWJzdGl0dXRpb24gaXMgYWxyZWFkeSBwcmVzZW50LmApO1xuXG4gICAgICAgIHJldHVybiBmb3J3YXJkKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIGJhY2spO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmFjaygpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgU3RhdGVtZW50U3Vic3RpdHV0aW9uIH0gPSBlbGVtZW50cztcblxuICAgIGxldCBzdGF0ZW1lbnRTdWJzdGl0dXRpb247XG5cbiAgICBpZiAoc3Vic3RpdHV0aW9uTm9kZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgY29udGV4dCA9IGdlbmVyYWxDb250ZXh0LCAvLy9cbiAgICAgICAgICAgIHN1YnN0aXR1dGlvbiA9IGNvbnRleHQuZmluZFN1YnN0aXR1dGlvbkJ5U3Vic3RpdHV0aW9uTm9kZShzdWJzdGl0dXRpb25Ob2RlKTtcblxuICAgICAgc3RhdGVtZW50U3Vic3RpdHV0aW9uID0gU3RhdGVtZW50U3Vic3RpdHV0aW9uLmZyb21TdGF0ZW1lbnRNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb24oc3RhdGVtZW50LCBtZXRhdmFyaWFibGUsIHN1YnN0aXR1dGlvbiwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlbWVudFN1YnN0aXR1dGlvbiA9IFN0YXRlbWVudFN1YnN0aXR1dGlvbi5mcm9tU3RhdGVtZW50QW5kTWV0YXZhcmlhYmxlKHN0YXRlbWVudCwgbWV0YXZhcmlhYmxlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVtZW50U3Vic3RpdHV0aW9uLnZlcmlmeShjb250ZXh0LCAoY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29uc3QgaW5mZXJyZWRTdWJzdGl0dXRpb24gPSBzdGF0ZW1lbnRTdWJzdGl0dXRpb247ICAvLy9cblxuICAgICAgY29udGV4dC5hZGRJbmZlcnJlZFN1YnN0aXR1dGlvbihpbmZlcnJlZFN1YnN0aXR1dGlvbik7XG5cbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIGJhY2spO1xuICAgIH0sIGJhY2spO1xuICB9XG5cbiAgdW5pZnlNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlLCBjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgbGV0IG1ldGF2YXJpYWJsZVVuaWZpZXM7XG5cbiAgICBkZWJ1Z2dlclxuXG4gICAgY29uc3QgZ2VuZXJhbENvbnRleHQgPSBjb250ZXh0LCAvLy9cbiAgICAgICAgICBzcGVjaWZpY0NvbnRleHQgPSBjb250ZXh0LCAgLy8vXG4gICAgICAgICAgZ2VuZXJhbE1ldGF2YXJpYWJsZSA9IHRoaXMsIC8vL1xuICAgICAgICAgIHNwZWNpZmljTWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlLCAgLy8vXG4gICAgICAgICAgZ2VuZXJhbE1ldGF2YXJpYWJsZVN0cmluZyA9IGdlbmVyYWxNZXRhdmFyaWFibGUuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgc3BlY2lmaWNNZXRhdmFyaWFibGVTdHJpbmcgPSBzcGVjaWZpY01ldGF2YXJpYWJsZS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzcGVjaWZpY01ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSB3aXRoIHRoZSAnJHtnZW5lcmFsTWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLi4uYCk7XG5cbiAgICBtZXRhdmFyaWFibGVVbmlmaWVzID0gdW5pZnlNZXRhdmFyaWFibGUoZ2VuZXJhbE1ldGF2YXJpYWJsZSwgc3BlY2lmaWNNZXRhdmFyaWFibGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgaWYgKG1ldGF2YXJpYWJsZVVuaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3NwZWNpZmljTWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIHdpdGggdGhlICcke2dlbmVyYWxNZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZVVuaWZpZXM7XG4gIH1cblxuICB1bmlmeU1ldGF2YXJpYWJsZUludHJpbnNpY2FsbHkobWV0YXZhcmlhYmxlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dCwgIC8vL1xuICAgICAgICAgIGdlbmVyYWxNZXRhdmFyaWFibGUgPSB0aGlzLCAvLy9cbiAgICAgICAgICBzcGVjaWZpY01ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZSxcbiAgICAgICAgICBnZW5lcmFsTWV0YXZhcmlhYmxlU3RyaW5nID0gZ2VuZXJhbE1ldGF2YXJpYWJsZS5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIHNwZWNpZmljTWV0YXZhcmlhYmxlU3RyaW5nID0gc3BlY2lmaWNNZXRhdmFyaWFibGUuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3BlY2lmaWNNZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgd2l0aCB0aGUgJyR7Z2VuZXJhbE1ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSBpbnRyaW5zaWNhbGx5Li4uYCk7XG5cbiAgICByZXR1cm4gdW5pZnlNZXRhdmFyaWFibGVJbnRyaW5zaWNhbGx5KGdlbmVyYWxNZXRhdmFyaWFibGUsIHNwZWNpZmljTWV0YXZhcmlhYmxlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCAoZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3BlY2lmaWNNZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgd2l0aCB0aGUgJyR7Z2VuZXJhbE1ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSBpbnRyaW5zaWNhbGx5LmApO1xuXG4gICAgICByZXR1cm4gZm9yd2FyZChnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBiYWNrKTtcbiAgICB9LCBiYWNrKTtcbiAgfVxuXG4gIGNvbXBhcmVGcmFtZU1ldGF2YXJpYWJsZShmcmFtZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkge1xuICAgIGxldCBmcmFtZU1ldGF2YXJpYWJsQ29tcGFyZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICBmcmFtZVN0cmluZyA9IGZyYW1lLmdldFN0cmluZygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYENvbXBhcmluZyB0aGUgJyR7ZnJhbWVTdHJpbmd9JyBmcmFtZSdzIG1ldGF2YXJpYWJsZSB0byB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLi4uYCk7XG5cbiAgICBjb25zdCBnZW5lcmFsQ29udGV4dEZpbGVQYXRoID0gZ2VuZXJhbENvbnRleHQuZ2V0RmlsZVBhdGgoKSxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRleHRGaWxlUGF0aCA9IHNwZWNpZmljQ29udGV4dC5nZXRGaWxlUGF0aCgpO1xuXG4gICAgaWYgKGdlbmVyYWxDb250ZXh0RmlsZVBhdGggPT09IHNwZWNpZmljQ29udGV4dEZpbGVQYXRoKSB7XG4gICAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gdGhpcy5nZXRNZXRhdmFyaWFibGVOb2RlKCksICAvLy9cbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzID0gZnJhbWUubWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgICBpZiAobWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgZnJhbWVNZXRhdmFyaWFibENvbXBhcmVzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZnJhbWVNZXRhdmFyaWFibENvbXBhcmVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi5jb21wYXJlZCB0aGUgJyR7ZnJhbWVTdHJpbmd9JyBmcmFtZSdzIG1ldGF2YXJpYWJsZSB0byB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLmApO1xuICAgIH1cblxuICAgIHJldHVybiBmcmFtZU1ldGF2YXJpYWJsQ29tcGFyZXM7XG4gIH1cblxuICBjb21wYXJlUmVmZXJlbmNlTWV0YXZhcmlhYmxlKHJlZmVyZW5jZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkge1xuICAgIGxldCByZWZlcmVuY2VNZXRhdmFyaWFibGVDb21wYXJlcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dCwgIC8vL1xuICAgICAgICAgIHJlZmVyZW5jZVN0cmluZyA9IHJlZmVyZW5jZS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBDb21wYXJpbmcgdGhlICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZSdzIG1ldGF2YXJpYWJsZSB0byB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLi4uYCk7XG5cbiAgICBjb25zdCBnZW5lcmFsQ29udGV4dEZpbGVQYXRoID0gZ2VuZXJhbENvbnRleHQuZ2V0RmlsZVBhdGgoKSxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRleHRGaWxlUGF0aCA9IHNwZWNpZmljQ29udGV4dC5nZXRGaWxlUGF0aCgpO1xuXG4gICAgaWYgKGdlbmVyYWxDb250ZXh0RmlsZVBhdGggPT09IHNwZWNpZmljQ29udGV4dEZpbGVQYXRoKSB7XG4gICAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gdGhpcy5nZXRNZXRhdmFyaWFibGVOb2RlKCksXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IHJlZmVyZW5jZS5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICAgIGlmIChtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcykge1xuICAgICAgICByZWZlcmVuY2VNZXRhdmFyaWFibGVDb21wYXJlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlZmVyZW5jZU1ldGF2YXJpYWJsZUNvbXBhcmVzKSB7XG4gICAgICBjb250ZXh0LnRyYWNlKGAuLi5jb21wYXJlZCB0aGUgJyR7cmVmZXJlbmNlU3RyaW5nfScgcmVmZXJlbmNlJ3MgbWV0YXZhcmlhYmxlIHRvIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZU1ldGF2YXJpYWJsZUNvbXBhcmVzO1xuICB9XG5cbiAgY29tcGFyZVN0YXRlbWVudE1ldGF2YXJpYWJsZShzdGF0ZW1lbnQsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpIHtcbiAgICBsZXQgc3RhdGVtZW50TWV0YXZhcmlhYmxlQ29tcGFyZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgQ29tcGFyaW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQncyBtZXRhdmFyaWFibGUgdG8gdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS4uLmApO1xuXG4gICAgY29uc3QgZ2VuZXJhbENvbnRleHRGaWxlUGF0aCA9IGdlbmVyYWxDb250ZXh0LmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgc3BlY2lmaWNDb250ZXh0RmlsZVBhdGggPSBzcGVjaWZpY0NvbnRleHQuZ2V0RmlsZVBhdGgoKTtcblxuICAgIGlmIChnZW5lcmFsQ29udGV4dEZpbGVQYXRoID09PSBzcGVjaWZpY0NvbnRleHRGaWxlUGF0aCkge1xuICAgICAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlTm9kZSgpLFxuICAgICAgICAgICAgbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMgPSBzdGF0ZW1lbnQubWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgICBpZiAobWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgc3RhdGVtZW50TWV0YXZhcmlhYmxlQ29tcGFyZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGF0ZW1lbnRNZXRhdmFyaWFibGVDb21wYXJlcykge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4uY29tcGFyZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCdzIG1ldGF2YXJpYWJsZSB0byB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLmApO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZW1lbnRNZXRhdmFyaWFibGVDb21wYXJlcztcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICBsZXQganNvbjtcblxuICAgIGNvbnN0IG1ldGFUeXBlSlNPTiA9IG1ldGFUeXBlVG9NZXRhVHlwZUpTT04odGhpcy5tZXRhVHlwZSksXG4gICAgICAgICAgbWV0YVR5cGUgPSBtZXRhVHlwZUpTT04sICAvLy9cbiAgICAgICAgICBzdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgbGV0IGJyZWFrUG9pbnQ7XG5cbiAgICBicmVha1BvaW50ID0gdGhpcy5nZXRCcmVha1BvaW50KCk7XG5cbiAgICBjb25zdCBicmVha1BvaW50SlNPTiA9IGJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OKGJyZWFrUG9pbnQpO1xuXG4gICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRKU09OOyAgLy8vXG5cbiAgICBqc29uID0ge1xuICAgICAgc3RyaW5nLFxuICAgICAgYnJlYWtQb2ludCxcbiAgICAgIG1ldGFUeXBlXG4gICAgfTtcblxuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgc3RhdGljIG5hbWUgPSBcIk1ldGF2YXJpYWJsZVwiO1xuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uLCBjb250ZXh0KSB7XG4gICAgbGV0IG1ldGF2YXJpYWJsZTtcblxuICAgIGluc3RhbnRpYXRlKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCB7IHN0cmluZyB9ID0ganNvbixcbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGUgPSBpbnN0YW50aWF0ZU1ldGF2YXJpYWJsZShzdHJpbmcsIGNvbnRleHQpLFxuICAgICAgICAgICAgbm9kZSA9IG1ldGF2YXJpYWJsZU5vZGUsICAvLy9cbiAgICAgICAgICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50RnJvbUpTT04oanNvbiksXG4gICAgICAgICAgICBuYW1lID0gbmFtZUZyb21NZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUsIGNvbnRleHQpLFxuICAgICAgICAgICAgdGVybSA9IHRlcm1Gcm9tTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlLCBjb250ZXh0KSxcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlRnJvbU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSwgY29udGV4dCksXG4gICAgICAgICAgICBtZXRhVHlwZSA9IG1ldGFUeXBlRnJvbUpTT04oanNvbiwgY29udGV4dCk7XG5cbiAgICAgIG1ldGF2YXJpYWJsZSA9IG5ldyBNZXRhdmFyaWFibGUoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCBuYW1lLCB0ZXJtLCB0eXBlLCBtZXRhVHlwZSk7XG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICB9XG5cbiAgc3RhdGljIGZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gICAgY29uc3Qgc3RhdGVtZW50Tm9kZSA9IHN0YXRlbWVudC5nZXROb2RlKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlRnJvbVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICB9XG59KTtcbiJdLCJuYW1lcyI6WyJhbGwiLCJjb250aW51YXRpb25VdGlsaXRpZXMiLCJicmVha1BvaW50RnJvbUpTT04iLCJicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiIsImJyZWFrUG9pbnRVdGlsaXRpZXMiLCJkZWZpbmUiLCJNZXRhdmFyaWFibGUiLCJFbGVtZW50IiwiY29udGV4dCIsInN0cmluZyIsIm5vZGUiLCJicmVha1BvaW50IiwibmFtZSIsInRlcm0iLCJ0eXBlIiwibWV0YVR5cGUiLCJnZXROYW1lIiwiZ2V0VGVybSIsImdldFR5cGUiLCJnZXRNZXRhVHlwZSIsInNldE1ldGFUeXBlIiwiZ2V0TWV0YXZhcmlhYmxlTm9kZSIsImdldE5vZGUiLCJtZXRhdmFyaWFibGVOb2RlIiwiZ2V0TWV0YXZhcmlhYmxlTmFtZSIsIm1ldGF2YXJpYWJsZU5hbWUiLCJpc01hbGZvcm1lZCIsIm1hbGZvcm1lZCIsImlzRGVjbGFyZWQiLCJkZWNsYXJlZCIsImlzRXF1YWxUbyIsIm1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzIiwibWF0Y2hNZXRhdmFyaWFibGVOb2RlIiwiZXF1YWxUbyIsImlzTWV0YVR5cGVFcXVhbFRvIiwibm9kZU1hdGNoZXMiLCJtYXRjaE5vZGUiLCJmaW5kTWV0YXZhcmlhYmxlIiwiZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZSIsImNvbXBhcmVNZXRhdmFyaWFibGUiLCJjb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSIsImNvbXBhcmVNZXRhdmFyaWFibGVOYW1lIiwiY29tcGFyZXNUb01ldGF2YXJpYWJsZSIsIm5hbWVNZXRhdmFyaWFibGVOYW1lIiwidmVyaWZ5IiwiZm9yd2FyZCIsImJhY2siLCJtZXRhdmFyaWFibGVTdHJpbmciLCJnZXRTdHJpbmciLCJ0cmFjZSIsInZlcmlmeVRlcm0iLCJiaW5kIiwidmVyaWZ5VHlwZSIsImRlYnVnIiwidHlwZU5hbWUiLCJmaW5kVHlwZUJ5VHlwZU5hbWUiLCJ2YWxpZGF0ZSIsInN0cmljdCIsInN0YXRlIiwidW5kZWZpbmVkIiwidmFsaWRhdGVOYW1lIiwidmFsaWRhdGVUeXBlIiwidmFsaWRhdGVUZXJtIiwiYWRkTWV0YXZhcmlhYmxlIiwiZGVjbGFyZWRNZXRhdmFyaWFibGUiLCJmaW5kRGVjbGFyZWRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUiLCJuYW1lVmFsaWRhdGVzIiwibWV0YVR5cGVTdHJpbmciLCJ0eXBlVmFsaWRhdGVzIiwidHlwZVByZXNlbmV0IiwiaXNUeXBlUHJlc2VudEJ5VHlwZU5hbWUiLCJ2YWxpZGF0ZUdpdmVuVHlwZSIsInVuaWZ5RnJhbWUiLCJmcmFtZSIsImdlbmVyYWxDb250ZXh0Iiwic3BlY2lmaWNDb250ZXh0IiwiZnJhbWVTdHJpbmciLCJmcmFtZU1ldGF2YXJpYWJsZUNvbXBhcmVzIiwiY29tcGFyZUZyYW1lTWV0YXZhcmlhYmxlIiwiaW5mZXJyZWRTdWJzdGl0dXRpb24iLCJmaW5kSW5mZXJyZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGUiLCJpbmZlcnJlZFN1YnN0aXR1dGlvbkNvbXBhcmVzVG9GcmFtZSIsImNvbXBhcmVGcmFtZSIsImluZmVycmVkU3Vic3RpdHV0aW9uU3RyaW5nIiwiRnJhbWVTdWJzdGl0dXRpb24iLCJlbGVtZW50cyIsImZyYW1lU3Vic3RpdHV0aW9uIiwiZnJvbUZyYW1lQW5kTWV0YXZhcmlhYmxlIiwiYWRkSW5mZXJyZWRTdWJzdGl0dXRpb24iLCJ1bmlmeVN0YXRlbWVudCIsInN0YXRlbWVudCIsInN0YXRlbWVudFN0cmluZyIsInN0YXRlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzIiwiY29tcGFyZVN0YXRlbWVudE1ldGF2YXJpYWJsZSIsInNpYmxpbmdTdWJzdGl0dXRpb25Ob2RlIiwiZ2V0U2libGluZ1N1YnN0aXR1dGlvbk5vZGUiLCJzdWJzdGl0dXRpb25Ob2RlIiwiZmluZEluZmVycmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlQW5kU3Vic3RpdHV0aW9uTm9kZSIsImluZmVycmVkU3Vic3RpdHV0aW9uQ29tcGFyZXNUb1N0YXRlbWVudCIsImNvbXBhcmVTdGF0ZW1lbnQiLCJTdGF0ZW1lbnRTdWJzdGl0dXRpb24iLCJzdGF0ZW1lbnRTdWJzdGl0dXRpb24iLCJzdWJzdGl0dXRpb24iLCJmaW5kU3Vic3RpdHV0aW9uQnlTdWJzdGl0dXRpb25Ob2RlIiwiZnJvbVN0YXRlbWVudE1ldGF2YXJpYWJsZUFuZFN1YnN0aXR1dGlvbiIsImZyb21TdGF0ZW1lbnRBbmRNZXRhdmFyaWFibGUiLCJ1bmlmeU1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZVVuaWZpZXMiLCJnZW5lcmFsTWV0YXZhcmlhYmxlIiwic3BlY2lmaWNNZXRhdmFyaWFibGUiLCJnZW5lcmFsTWV0YXZhcmlhYmxlU3RyaW5nIiwic3BlY2lmaWNNZXRhdmFyaWFibGVTdHJpbmciLCJ1bmlmeU1ldGF2YXJpYWJsZUludHJpbnNpY2FsbHkiLCJmcmFtZU1ldGF2YXJpYWJsQ29tcGFyZXMiLCJnZW5lcmFsQ29udGV4dEZpbGVQYXRoIiwiZ2V0RmlsZVBhdGgiLCJzcGVjaWZpY0NvbnRleHRGaWxlUGF0aCIsImNvbXBhcmVSZWZlcmVuY2VNZXRhdmFyaWFibGUiLCJyZWZlcmVuY2UiLCJyZWZlcmVuY2VNZXRhdmFyaWFibGVDb21wYXJlcyIsInJlZmVyZW5jZVN0cmluZyIsInRvSlNPTiIsImpzb24iLCJtZXRhVHlwZUpTT04iLCJtZXRhVHlwZVRvTWV0YVR5cGVKU09OIiwiZ2V0QnJlYWtQb2ludCIsImJyZWFrUG9pbnRKU09OIiwiZnJvbUpTT04iLCJpbnN0YW50aWF0ZSIsImluc3RhbnRpYXRlTWV0YXZhcmlhYmxlIiwibmFtZUZyb21NZXRhdmFyaWFibGVOb2RlIiwidGVybUZyb21NZXRhdmFyaWFibGVOb2RlIiwidHlwZUZyb21NZXRhdmFyaWFibGVOb2RlIiwibWV0YVR5cGVGcm9tSlNPTiIsImZyb21TdGF0ZW1lbnQiLCJzdGF0ZW1lbnROb2RlIiwibWV0YXZhcmlhYmxlRnJvbVN0YXRlbWVudE5vZGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQWlCQTs7O2VBQUE7OztnQ0Fmb0U7a0VBRS9DO3lCQUdPO3VCQUNJOzZCQUNRO3NCQUNpQjt1QkFDUzt5QkFDMEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUU1SCxNQUFNLEVBQUVBLEdBQUcsRUFBRSxHQUFHQyxxQ0FBcUIsRUFDL0IsRUFBRUMsa0JBQWtCLEVBQUVDLDBCQUEwQixFQUFFLEdBQUdDLG1DQUFtQjtNQUU5RSxXQUFlQyxJQUFBQSxnQkFBTSxFQUFDLE1BQU1DLHFCQUFxQkMsdUJBQU87SUFDdEQsWUFBWUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsVUFBVSxFQUFFQyxJQUFJLEVBQUVDLElBQUksRUFBRUMsSUFBSSxFQUFFQyxRQUFRLENBQUU7UUFDekUsS0FBSyxDQUFDUCxTQUFTQyxRQUFRQyxNQUFNQztRQUU3QixJQUFJLENBQUNDLElBQUksR0FBR0E7UUFDWixJQUFJLENBQUNDLElBQUksR0FBR0E7UUFDWixJQUFJLENBQUNDLElBQUksR0FBR0E7UUFD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
|
|
351
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L21ldGF2YXJpYWJsZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRWxlbWVudCwgYnJlYWtQb2ludFV0aWxpdGllcywgY29udGludWF0aW9uVXRpbGl0aWVzIH0gZnJvbSBcIm9jY2FtLWxhbmd1YWdlc1wiO1xuXG5pbXBvcnQgZWxlbWVudHMgZnJvbSBcIi4uL2VsZW1lbnRzXCI7XG5cbmltcG9ydCB7IGRlZmluZSB9IGZyb20gXCIuLi9lbGVtZW50c1wiO1xuaW1wb3J0IHsgaW5zdGFudGlhdGUgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2NvbnRleHRcIjtcbmltcG9ydCB7IGluc3RhbnRpYXRlTWV0YXZhcmlhYmxlIH0gZnJvbSBcIi4uL3Byb2Nlc3MvaW5zdGFudGlhdGVcIjtcbmltcG9ydCB7IG1ldGFUeXBlRnJvbUpTT04sIG1ldGFUeXBlVG9NZXRhVHlwZUpTT04gfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2pzb25cIjtcbmltcG9ydCB7IHVuaWZ5TWV0YXZhcmlhYmxlLCB1bmlmeU1ldGF2YXJpYWJsZUludHJpbnNpY2FsbHkgfSBmcm9tIFwiLi4vcHJvY2Vzcy91bmlmeVwiO1xuaW1wb3J0IHsgbmFtZUZyb21NZXRhdmFyaWFibGVOb2RlLCB0ZXJtRnJvbU1ldGF2YXJpYWJsZU5vZGUsIHR5cGVGcm9tTWV0YXZhcmlhYmxlTm9kZSwgbWV0YXZhcmlhYmxlRnJvbVN0YXRlbWVudE5vZGUgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2VsZW1lbnRcIjtcblxuY29uc3QgeyBhbGwgfSA9IGNvbnRpbnVhdGlvblV0aWxpdGllcyxcbiAgICAgIHsgYnJlYWtQb2ludEZyb21KU09OLCBicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiB9ID0gYnJlYWtQb2ludFV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lKGNsYXNzIE1ldGF2YXJpYWJsZSBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQsIG5hbWUsIHRlcm0sIHR5cGUsIG1ldGFUeXBlKSB7XG4gICAgc3VwZXIoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50KTtcbiAgICBcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudGVybSA9IHRlcm07XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLm1ldGFUeXBlID0gbWV0YVR5cGU7XG4gIH1cblxuICBnZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICBnZXRUZXJtKCkge1xuICAgIHJldHVybiB0aGlzLnRlcm07XG4gIH1cblxuICBnZXRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGU7XG4gIH1cblxuICBnZXRNZXRhVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhVHlwZTtcbiAgfVxuXG4gIHNldE1ldGFUeXBlKG1ldGFUeXBlKSB7XG4gICAgdGhpcy5tZXRhVHlwZSA9IG1ldGFUeXBlO1xuICB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlTm9kZSgpIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTm9kZSA9IG5vZGU7ICAvLy9cblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVOb2RlO1xuICB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlTmFtZSgpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gdGhpcy5nZXRNZXRhdmFyaWFibGVOb2RlKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTmFtZSA9IG1ldGF2YXJpYWJsZU5vZGUuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZU5hbWU7XG4gIH1cblxuICBpc01hbGZvcm1lZCgpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gdGhpcy5nZXRNZXRhdmFyaWFibGVOb2RlKCksXG4gICAgICAgICAgbWFsZm9ybWVkID0gbWV0YXZhcmlhYmxlTm9kZS5pc01hbGZvcm1lZCgpO1xuXG4gICAgcmV0dXJuIG1hbGZvcm1lZDtcbiAgfVxuXG4gIGlzRGVjbGFyZWQoKSB7XG4gICAgY29uc3QgZGVjbGFyZWQgPSAodGhpcy5tZXRhVHlwZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gZGVjbGFyZWQ7XG4gIH1cblxuICBpc0VxdWFsVG8obWV0YXZhcmlhYmxlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IG1ldGF2YXJpYWJsZS5nZXROb2RlKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMgPSB0aGlzLm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBlcXVhbFRvID0gbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXM7ICAvLy9cblxuICAgIHJldHVybiBlcXVhbFRvO1xuICB9XG5cbiAgaXNNZXRhVHlwZUVxdWFsVG8obWV0YVR5cGUpIHsgcmV0dXJuIHRoaXMubWV0YVR5cGUuaXNFcXVhbFRvKG1ldGFUeXBlKTsgfVxuXG4gIG1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3Qgbm9kZSA9IG1ldGF2YXJpYWJsZU5vZGUsIC8vL1xuICAgICAgICAgIG5vZGVNYXRjaGVzID0gdGhpcy5tYXRjaE5vZGUobm9kZSksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMgPSBub2RlTWF0Y2hlczsgLy8vXG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXM7XG4gIH1cblxuICBmaW5kTWV0YXZhcmlhYmxlKGNvbnRleHQpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gdGhpcy5nZXRNZXRhdmFyaWFibGVOb2RlKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlID0gY29udGV4dC5maW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZTtcbiAgfVxuXG4gIGNvbXBhcmVNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTmFtZSA9IG1ldGF2YXJpYWJsZS5nZXROYW1lKCksXG4gICAgICAgICAgY29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUgPSB0aGlzLmNvbXBhcmVNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpLFxuICAgICAgICAgIGNvbXBhcmVzVG9NZXRhdmFyaWFibGUgPSBjb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZTsgIC8vL1xuXG4gICAgcmV0dXJuIGNvbXBhcmVzVG9NZXRhdmFyaWFibGU7XG4gIH1cblxuICBjb21wYXJlTWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSB7XG4gICAgY29uc3QgbmFtZU1ldGF2YXJpYWJsZU5hbWUgPSAodGhpcy5uYW1lID09PSBtZXRhdmFyaWFibGVOYW1lKSxcbiAgICAgICAgICBjb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSA9IG5hbWVNZXRhdmFyaWFibGVOYW1lOyAgLy8vXG5cbiAgICByZXR1cm4gY29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWU7XG4gIH1cblxuICB2ZXJpZnkoY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIGNvbnN0IG1ldGF2YXJpYWJsZVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLi4uYCk7XG5cbiAgICBjb25zdCBtYWxmb3JtZWQgPSB0aGlzLmlzTWFsZm9ybWVkKCk7XG5cbiAgICBpZiAobWFsZm9ybWVkKSB7XG4gICAgICBjb250ZXh0LnRyYWNlKGBVbmFibGUgdG8gdmVyaWZ5IHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgYmVjYXVzZSBpdCBpcyBtYWxmb3JtZWQuYCk7XG5cbiAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmVyaWZ5VGVybSA9IHRoaXMudmVyaWZ5VGVybS5iaW5kKHRoaXMpLFxuICAgICAgICAgIHZlcmlmeVR5cGUgPSB0aGlzLnZlcmlmeVR5cGUuYmluZCh0aGlzKTtcblxuICAgIHJldHVybiBhbGwoW1xuICAgICAgdmVyaWZ5VGVybSxcbiAgICAgIHZlcmlmeVR5cGVcbiAgICBdLCAgY29udGV4dCwgKGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgIH0sIGJhY2spO1xuICB9XG5cbiAgdmVyaWZ5VGVybShjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUncyB0ZXJtLi4uYCk7XG5cbiAgICBpZiAodGhpcy50ZXJtICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGBUaGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIGNhbiBvbmx5IGhhdmUgYSB0eXBlIGFuZCBub3QgYSB0ZXJtLmApO1xuXG4gICAgICByZXR1cm4gYmFjaygpO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUncyB0ZXJtLmApO1xuXG4gICAgcmV0dXJuIGZvcndhcmQoY29udGV4dCwgYmFjayk7XG4gIH1cblxuICB2ZXJpZnlUeXBlKGNvbnRleHQsIGZvcndhcmQsIGJhY2spIHtcbiAgICBpZiAodGhpcy50eXBlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZChjb250ZXh0LCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSdzIHR5cGUuLi5gKTtcblxuICAgIGNvbnN0IHR5cGVOYW1lID0gdGhpcy50eXBlLmdldE5hbWUoKSxcbiAgICAgICAgICB0eXBlID0gY29udGV4dC5maW5kVHlwZUJ5VHlwZU5hbWUodHlwZU5hbWUpO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgfVxuXG4gICAgdGhpcy50eXBlID0gdHlwZTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkcyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgdHlwZS5gKTtcblxuICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICB9XG5cbiAgdmFsaWRhdGUoc3RyaWN0LCBzdGF0ZSwgY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIGlmIChiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJhY2sgPSBmb3J3YXJkOyAvLy9cblxuICAgICAgZm9yd2FyZCA9IGNvbnRleHQ7IC8vL1xuXG4gICAgICBjb250ZXh0ID0gc3RhdGU7ICAvLy9cblxuICAgICAgc3RhdGUgPSBzdHJpY3Q7IC8vL1xuXG4gICAgICBzdHJpY3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgbWV0YXZhcmlhYmxlO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuLi5gKTtcblxuICAgIG1ldGF2YXJpYWJsZSA9IHRoaXMuZmluZE1ldGF2YXJpYWJsZShjb250ZXh0KTtcblxuICAgIGlmIChtZXRhdmFyaWFibGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgaXMgYWxyZWFkeSBwcmVzZW50LmApO1xuXG4gICAgICByZXR1cm4gZm9yd2FyZChtZXRhdmFyaWFibGUsIGNvbnRleHQsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlTmFtZSA9IHRoaXMudmFsaWRhdGVOYW1lLmJpbmQodGhpcyksXG4gICAgICAgICAgdmFsaWRhdGVUeXBlID0gdGhpcy52YWxpZGF0ZVR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgICB2YWxpZGF0ZVRlcm0gPSB0aGlzLnZhbGlkYXRlVGVybS5iaW5kKHRoaXMpO1xuXG4gICAgcmV0dXJuIGFsbChbXG4gICAgICB2YWxpZGF0ZU5hbWUsXG4gICAgICB2YWxpZGF0ZVR5cGUsXG4gICAgICB2YWxpZGF0ZVRlcm1cbiAgICBdLCBzdHJpY3QsIHN0YXRlLCBjb250ZXh0LCAoc3RyaWN0LCBzdGF0ZSwgY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgbWV0YXZhcmlhYmxlID0gdGhpczsgIC8vL1xuXG4gICAgICBjb250ZXh0LmFkZE1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpO1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS5gKTtcblxuICAgICAgcmV0dXJuIGZvcndhcmQobWV0YXZhcmlhYmxlLCBjb250ZXh0LCBiYWNrKTtcbiAgICB9LCBiYWNrKTtcbiAgfVxuXG4gIHZhbGlkYXRlTmFtZShzdHJpY3QsIHN0YXRlLCBjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgbmFtZS4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTmFtZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLCAgLy8vXG4gICAgICAgICAgZGVjbGFyZWRNZXRhdmFyaWFibGUgPSBjb250ZXh0LmZpbmREZWNsYXJlZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgIGxldCBuYW1lVmFsaWRhdGVzID0gdHJ1ZTsgLy8vXG5cbiAgICBpZiAoZGVjbGFyZWRNZXRhdmFyaWFibGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG1ldGFUeXBlID0gZGVjbGFyZWRNZXRhdmFyaWFibGUuZ2V0TWV0YVR5cGUoKSxcbiAgICAgICAgICAgIG1ldGFUeXBlU3RyaW5nID0gbWV0YVR5cGUuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIHRoaXMubWV0YVR5cGUgPSBtZXRhVHlwZTtcblxuICAgICAgY29udGV4dC50cmFjZShgU2V0dGluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgbWV0YS10eXBlIHRvIHRoZSAnJHttZXRhVHlwZVN0cmluZ30nIG1ldGEtdHlwZS5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICBuYW1lVmFsaWRhdGVzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFuYW1lVmFsaWRhdGVzKSB7XG4gICAgICByZXR1cm4gYmFjaygpO1xuICAgIH1cblxuICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgbmFtZS5gKTtcblxuICAgIHJldHVybiBmb3J3YXJkKHN0cmljdCwgc3RhdGUsIGNvbnRleHQsIGJhY2spO1xuICB9XG5cbiAgdmFsaWRhdGVUeXBlKHN0cmljdCwgc3RhdGUsIGNvbnRleHQsIGZvcndhcmQsIGJhY2spIHtcbiAgICBpZiAodGhpcy50eXBlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZChzdHJpY3QsIHN0YXRlLCBjb250ZXh0LCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nICB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgdHlwZS4uLmApO1xuXG4gICAgbGV0IHR5cGVWYWxpZGF0ZXMgPSB0cnVlOyAvLy9cblxuICAgIGNvbnN0IHR5cGVOYW1lID0gdGhpcy50eXBlLmdldE5hbWUoKSxcbiAgICAgICAgICB0eXBlUHJlc2VuZXQgPSBjb250ZXh0LmlzVHlwZVByZXNlbnRCeVR5cGVOYW1lKHR5cGVOYW1lKTtcblxuICAgIGlmICghdHlwZVByZXNlbmV0KSB7XG4gICAgICB0eXBlVmFsaWRhdGVzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0eXBlVmFsaWRhdGVzKSB7XG4gICAgICByZXR1cm4gYmFjaygpO1xuICAgIH1cblxuICAgIGNvbnRleHQudHJhY2UoYC4uLnZhbGlkYXRlZCAgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSdzIHR5cGUuYCk7XG5cbiAgICByZXR1cm4gZm9yd2FyZChzdHJpY3QsIHN0YXRlLCBjb250ZXh0LCBiYWNrKTtcbiAgfVxuXG4gIHZhbGlkYXRlVGVybShzdHJpY3QsIHN0YXRlLCBjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgaWYgKHRoaXMudGVybSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoc3RyaWN0LCBzdGF0ZSwgY29udGV4dCwgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgdGVybS4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTmFtZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLFxuICAgICAgICAgIGRlY2xhcmVkTWV0YXZhcmlhYmxlID0gY29udGV4dC5maW5kRGVjbGFyZWRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICBpZiAoZGVjbGFyZWRNZXRhdmFyaWFibGUgPT09IG51bGwpIHtcbiAgICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMudGVybS52YWxpZGF0ZShzdGF0ZSwgY29udGV4dCwgKHRlcm0sIGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGVybTtcblxuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSdzIHRlcm0uYCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcndhcmQoc3RyaWN0LCBzdGF0ZSwgY29udGV4dCwgYmFjayk7XG4gICAgICB9LCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gZGVjbGFyZWRNZXRhdmFyaWFibGUuZ2V0VHlwZSgpO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudGVybS52YWxpZGF0ZUdpdmVuVHlwZSh0eXBlLCBzdGF0ZSwgY29udGV4dCwgKHRlcm0sIGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgIHRoaXMudGVybSA9IHRlcm07XG5cbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgdGVybS5gKTtcblxuICAgICAgcmV0dXJuIGZvcndhcmQoc3RyaWN0LCBzdGF0ZSwgY29udGV4dCwgYmFjayk7XG4gICAgfSwgYmFjayk7XG4gIH1cblxuICB1bmlmeVN0YXRlbWVudChzdGF0ZW1lbnQsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIGZvcndhcmQsIGJhY2spIHtcbiAgICBjb25zdCBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLi4uYCk7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRNZXRhdmFyaWFibGVDb21wYXJlcyA9IHRoaXMuY29tcGFyZVN0YXRlbWVudE1ldGF2YXJpYWJsZShzdGF0ZW1lbnQsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgaWYgKHN0YXRlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZChnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGUgPSB0aGlzLCAgLy8vXG4gICAgICAgICAgbWV0YXZhcmlhYmxlTm9kZSA9IG1ldGF2YXJpYWJsZS5nZXROb2RlKCksXG4gICAgICAgICAgc2libGluZ1N1YnN0aXR1dGlvbk5vZGUgPSBtZXRhdmFyaWFibGVOb2RlLmdldFNpYmxpbmdTdWJzdGl0dXRpb25Ob2RlKCksXG4gICAgICAgICAgc3Vic3RpdHV0aW9uTm9kZSA9IHNpYmxpbmdTdWJzdGl0dXRpb25Ob2RlLCAvLy9cbiAgICAgICAgICBpbmZlcnJlZFN1YnN0aXR1dGlvbiA9IChzdWJzdGl0dXRpb25Ob2RlICE9PSBudWxsKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5maW5kSW5mZXJyZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGVBbmRTdWJzdGl0dXRpb25Ob2RlKG1ldGF2YXJpYWJsZU5vZGUsIHN1YnN0aXR1dGlvbk5vZGUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmluZEluZmVycmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgaWYgKGluZmVycmVkU3Vic3RpdHV0aW9uICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBpbmZlcnJlZFN1YnN0aXR1dGlvbkNvbXBhcmVzVG9TdGF0ZW1lbnQgPSBpbmZlcnJlZFN1YnN0aXR1dGlvbi5jb21wYXJlU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgICAgIGlmIChpbmZlcnJlZFN1YnN0aXR1dGlvbkNvbXBhcmVzVG9TdGF0ZW1lbnQpIHtcbiAgICAgICAgY29uc3QgaW5mZXJyZWRTdWJzdGl0dXRpb25TdHJpbmcgPSBpbmZlcnJlZFN1YnN0aXR1dGlvbi5nZXRTdHJpbmcoKTtcblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBUaGUgJyR7aW5mZXJyZWRTdWJzdGl0dXRpb25TdHJpbmd9JyBpbmZlcnJlZCBzdWJzdGl0dXRpb24gaXMgYWxyZWFkeSBwcmVzZW50LmApO1xuXG4gICAgICAgIHJldHVybiBmb3J3YXJkKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIGJhY2spO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmFjaygpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgU3RhdGVtZW50U3Vic3RpdHV0aW9uIH0gPSBlbGVtZW50cztcblxuICAgIGxldCBzdGF0ZW1lbnRTdWJzdGl0dXRpb247XG5cbiAgICBpZiAoc3Vic3RpdHV0aW9uTm9kZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgY29udGV4dCA9IGdlbmVyYWxDb250ZXh0LCAvLy9cbiAgICAgICAgICAgIHN1YnN0aXR1dGlvbiA9IGNvbnRleHQuZmluZFN1YnN0aXR1dGlvbkJ5U3Vic3RpdHV0aW9uTm9kZShzdWJzdGl0dXRpb25Ob2RlKTtcblxuICAgICAgc3RhdGVtZW50U3Vic3RpdHV0aW9uID0gU3RhdGVtZW50U3Vic3RpdHV0aW9uLmZyb21TdGF0ZW1lbnRNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb24oc3RhdGVtZW50LCBtZXRhdmFyaWFibGUsIHN1YnN0aXR1dGlvbiwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlbWVudFN1YnN0aXR1dGlvbiA9IFN0YXRlbWVudFN1YnN0aXR1dGlvbi5mcm9tU3RhdGVtZW50QW5kTWV0YXZhcmlhYmxlKHN0YXRlbWVudCwgbWV0YXZhcmlhYmxlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVtZW50U3Vic3RpdHV0aW9uLnZlcmlmeShjb250ZXh0LCAoY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29uc3QgaW5mZXJyZWRTdWJzdGl0dXRpb24gPSBzdGF0ZW1lbnRTdWJzdGl0dXRpb247ICAvLy9cblxuICAgICAgY29udGV4dC5hZGRJbmZlcnJlZFN1YnN0aXR1dGlvbihpbmZlcnJlZFN1YnN0aXR1dGlvbik7XG5cbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIGJhY2spO1xuICAgIH0sIGJhY2spO1xuICB9XG5cbiAgdW5pZnlNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlLCBjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgbGV0IG1ldGF2YXJpYWJsZVVuaWZpZXM7XG5cbiAgICBkZWJ1Z2dlclxuXG4gICAgY29uc3QgZ2VuZXJhbENvbnRleHQgPSBjb250ZXh0LCAvLy9cbiAgICAgICAgICBzcGVjaWZpY0NvbnRleHQgPSBjb250ZXh0LCAgLy8vXG4gICAgICAgICAgZ2VuZXJhbE1ldGF2YXJpYWJsZSA9IHRoaXMsIC8vL1xuICAgICAgICAgIHNwZWNpZmljTWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlLCAgLy8vXG4gICAgICAgICAgZ2VuZXJhbE1ldGF2YXJpYWJsZVN0cmluZyA9IGdlbmVyYWxNZXRhdmFyaWFibGUuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgc3BlY2lmaWNNZXRhdmFyaWFibGVTdHJpbmcgPSBzcGVjaWZpY01ldGF2YXJpYWJsZS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzcGVjaWZpY01ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSB3aXRoIHRoZSAnJHtnZW5lcmFsTWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLi4uYCk7XG5cbiAgICBtZXRhdmFyaWFibGVVbmlmaWVzID0gdW5pZnlNZXRhdmFyaWFibGUoZ2VuZXJhbE1ldGF2YXJpYWJsZSwgc3BlY2lmaWNNZXRhdmFyaWFibGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgaWYgKG1ldGF2YXJpYWJsZVVuaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3NwZWNpZmljTWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIHdpdGggdGhlICcke2dlbmVyYWxNZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZVVuaWZpZXM7XG4gIH1cblxuICB1bmlmeU1ldGF2YXJpYWJsZUludHJpbnNpY2FsbHkobWV0YXZhcmlhYmxlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dCwgIC8vL1xuICAgICAgICAgIGdlbmVyYWxNZXRhdmFyaWFibGUgPSB0aGlzLCAvLy9cbiAgICAgICAgICBzcGVjaWZpY01ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZSxcbiAgICAgICAgICBnZW5lcmFsTWV0YXZhcmlhYmxlU3RyaW5nID0gZ2VuZXJhbE1ldGF2YXJpYWJsZS5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIHNwZWNpZmljTWV0YXZhcmlhYmxlU3RyaW5nID0gc3BlY2lmaWNNZXRhdmFyaWFibGUuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3BlY2lmaWNNZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgd2l0aCB0aGUgJyR7Z2VuZXJhbE1ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSBpbnRyaW5zaWNhbGx5Li4uYCk7XG5cbiAgICByZXR1cm4gdW5pZnlNZXRhdmFyaWFibGVJbnRyaW5zaWNhbGx5KGdlbmVyYWxNZXRhdmFyaWFibGUsIHNwZWNpZmljTWV0YXZhcmlhYmxlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCAoZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3BlY2lmaWNNZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgd2l0aCB0aGUgJyR7Z2VuZXJhbE1ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSBpbnRyaW5zaWNhbGx5LmApO1xuXG4gICAgICByZXR1cm4gZm9yd2FyZChnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBiYWNrKTtcbiAgICB9LCBiYWNrKTtcbiAgfVxuXG4gIGNvbXBhcmVTdGF0ZW1lbnRNZXRhdmFyaWFibGUoc3RhdGVtZW50LCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSB7XG4gICAgbGV0IHN0YXRlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYENvbXBhcmluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50J3MgbWV0YXZhcmlhYmxlIHRvIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuLi5gKTtcblxuICAgIGNvbnN0IGdlbmVyYWxDb250ZXh0RmlsZVBhdGggPSBnZW5lcmFsQ29udGV4dC5nZXRGaWxlUGF0aCgpLFxuICAgICAgICAgIHNwZWNpZmljQ29udGV4dEZpbGVQYXRoID0gc3BlY2lmaWNDb250ZXh0LmdldEZpbGVQYXRoKCk7XG5cbiAgICBpZiAoZ2VuZXJhbENvbnRleHRGaWxlUGF0aCA9PT0gc3BlY2lmaWNDb250ZXh0RmlsZVBhdGgpIHtcbiAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZU5vZGUgPSB0aGlzLmdldE1ldGF2YXJpYWJsZU5vZGUoKSxcbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzID0gc3RhdGVtZW50Lm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgICAgaWYgKG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzKSB7XG4gICAgICAgIHN0YXRlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhdGVtZW50TWV0YXZhcmlhYmxlQ29tcGFyZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLmNvbXBhcmVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQncyBtZXRhdmFyaWFibGUgdG8gdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVtZW50TWV0YXZhcmlhYmxlQ29tcGFyZXM7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgbGV0IGpzb247XG5cbiAgICBjb25zdCBtZXRhVHlwZUpTT04gPSBtZXRhVHlwZVRvTWV0YVR5cGVKU09OKHRoaXMubWV0YVR5cGUpLFxuICAgICAgICAgIG1ldGFUeXBlID0gbWV0YVR5cGVKU09OLCAgLy8vXG4gICAgICAgICAgc3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTtcblxuICAgIGxldCBicmVha1BvaW50O1xuXG4gICAgYnJlYWtQb2ludCA9IHRoaXMuZ2V0QnJlYWtQb2ludCgpO1xuXG4gICAgY29uc3QgYnJlYWtQb2ludEpTT04gPSBicmVha1BvaW50VG9CcmVha1BvaW50SlNPTihicmVha1BvaW50KTtcblxuICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50SlNPTjsgIC8vL1xuXG4gICAganNvbiA9IHtcbiAgICAgIHN0cmluZyxcbiAgICAgIGJyZWFrUG9pbnQsXG4gICAgICBtZXRhVHlwZVxuICAgIH07XG5cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIHN0YXRpYyBuYW1lID0gXCJNZXRhdmFyaWFibGVcIjtcblxuICBzdGF0aWMgZnJvbUpTT04oanNvbiwgY29udGV4dCkge1xuICAgIGxldCBtZXRhdmFyaWFibGU7XG5cbiAgICBpbnN0YW50aWF0ZSgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgeyBzdHJpbmcgfSA9IGpzb24sXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlID0gaW5zdGFudGlhdGVNZXRhdmFyaWFibGUoc3RyaW5nLCBjb250ZXh0KSxcbiAgICAgICAgICAgIG5vZGUgPSBtZXRhdmFyaWFibGVOb2RlLCAgLy8vXG4gICAgICAgICAgICBicmVha1BvaW50ID0gYnJlYWtQb2ludEZyb21KU09OKGpzb24pLFxuICAgICAgICAgICAgbmFtZSA9IG5hbWVGcm9tTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlLCBjb250ZXh0KSxcbiAgICAgICAgICAgIHRlcm0gPSB0ZXJtRnJvbU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSwgY29udGV4dCksXG4gICAgICAgICAgICB0eXBlID0gdHlwZUZyb21NZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUsIGNvbnRleHQpLFxuICAgICAgICAgICAgbWV0YVR5cGUgPSBtZXRhVHlwZUZyb21KU09OKGpzb24sIGNvbnRleHQpO1xuXG4gICAgICBtZXRhdmFyaWFibGUgPSBuZXcgTWV0YXZhcmlhYmxlKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgbmFtZSwgdGVybSwgdHlwZSwgbWV0YVR5cGUpO1xuICAgIH0sIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCkge1xuICAgIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnQuZ2V0Tm9kZSgpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZUZyb21TdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZTtcbiAgfVxufSk7XG4iXSwibmFtZXMiOlsiYWxsIiwiY29udGludWF0aW9uVXRpbGl0aWVzIiwiYnJlYWtQb2ludEZyb21KU09OIiwiYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04iLCJicmVha1BvaW50VXRpbGl0aWVzIiwiZGVmaW5lIiwiTWV0YXZhcmlhYmxlIiwiRWxlbWVudCIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwiYnJlYWtQb2ludCIsIm5hbWUiLCJ0ZXJtIiwidHlwZSIsIm1ldGFUeXBlIiwiZ2V0TmFtZSIsImdldFRlcm0iLCJnZXRUeXBlIiwiZ2V0TWV0YVR5cGUiLCJzZXRNZXRhVHlwZSIsImdldE1ldGF2YXJpYWJsZU5vZGUiLCJnZXROb2RlIiwibWV0YXZhcmlhYmxlTm9kZSIsImdldE1ldGF2YXJpYWJsZU5hbWUiLCJtZXRhdmFyaWFibGVOYW1lIiwiaXNNYWxmb3JtZWQiLCJtYWxmb3JtZWQiLCJpc0RlY2xhcmVkIiwiZGVjbGFyZWQiLCJpc0VxdWFsVG8iLCJtZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsImVxdWFsVG8iLCJpc01ldGFUeXBlRXF1YWxUbyIsIm5vZGVNYXRjaGVzIiwibWF0Y2hOb2RlIiwiZmluZE1ldGF2YXJpYWJsZSIsImZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5vZGUiLCJjb21wYXJlTWV0YXZhcmlhYmxlIiwiY29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUiLCJjb21wYXJlTWV0YXZhcmlhYmxlTmFtZSIsImNvbXBhcmVzVG9NZXRhdmFyaWFibGUiLCJuYW1lTWV0YXZhcmlhYmxlTmFtZSIsInZlcmlmeSIsImZvcndhcmQiLCJiYWNrIiwibWV0YXZhcmlhYmxlU3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJ2ZXJpZnlUZXJtIiwiYmluZCIsInZlcmlmeVR5cGUiLCJkZWJ1ZyIsInR5cGVOYW1lIiwiZmluZFR5cGVCeVR5cGVOYW1lIiwidmFsaWRhdGUiLCJzdHJpY3QiLCJzdGF0ZSIsInVuZGVmaW5lZCIsInZhbGlkYXRlTmFtZSIsInZhbGlkYXRlVHlwZSIsInZhbGlkYXRlVGVybSIsImFkZE1ldGF2YXJpYWJsZSIsImRlY2xhcmVkTWV0YXZhcmlhYmxlIiwiZmluZERlY2xhcmVkTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOYW1lIiwibmFtZVZhbGlkYXRlcyIsIm1ldGFUeXBlU3RyaW5nIiwidHlwZVZhbGlkYXRlcyIsInR5cGVQcmVzZW5ldCIsImlzVHlwZVByZXNlbnRCeVR5cGVOYW1lIiwidmFsaWRhdGVHaXZlblR5cGUiLCJ1bmlmeVN0YXRlbWVudCIsInN0YXRlbWVudCIsImdlbmVyYWxDb250ZXh0Iiwic3BlY2lmaWNDb250ZXh0Iiwic3RhdGVtZW50U3RyaW5nIiwic3RhdGVtZW50TWV0YXZhcmlhYmxlQ29tcGFyZXMiLCJjb21wYXJlU3RhdGVtZW50TWV0YXZhcmlhYmxlIiwic2libGluZ1N1YnN0aXR1dGlvbk5vZGUiLCJnZXRTaWJsaW5nU3Vic3RpdHV0aW9uTm9kZSIsInN1YnN0aXR1dGlvbk5vZGUiLCJpbmZlcnJlZFN1YnN0aXR1dGlvbiIsImZpbmRJbmZlcnJlZFN1YnN0aXR1dGlvbkJ5TWV0YXZhcmlhYmxlTm9kZUFuZFN1YnN0aXR1dGlvbk5vZGUiLCJmaW5kSW5mZXJyZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGUiLCJpbmZlcnJlZFN1YnN0aXR1dGlvbkNvbXBhcmVzVG9TdGF0ZW1lbnQiLCJjb21wYXJlU3RhdGVtZW50IiwiaW5mZXJyZWRTdWJzdGl0dXRpb25TdHJpbmciLCJTdGF0ZW1lbnRTdWJzdGl0dXRpb24iLCJlbGVtZW50cyIsInN0YXRlbWVudFN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsImZpbmRTdWJzdGl0dXRpb25CeVN1YnN0aXR1dGlvbk5vZGUiLCJmcm9tU3RhdGVtZW50TWV0YXZhcmlhYmxlQW5kU3Vic3RpdHV0aW9uIiwiZnJvbVN0YXRlbWVudEFuZE1ldGF2YXJpYWJsZSIsImFkZEluZmVycmVkU3Vic3RpdHV0aW9uIiwidW5pZnlNZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGVVbmlmaWVzIiwiZ2VuZXJhbE1ldGF2YXJpYWJsZSIsInNwZWNpZmljTWV0YXZhcmlhYmxlIiwiZ2VuZXJhbE1ldGF2YXJpYWJsZVN0cmluZyIsInNwZWNpZmljTWV0YXZhcmlhYmxlU3RyaW5nIiwidW5pZnlNZXRhdmFyaWFibGVJbnRyaW5zaWNhbGx5IiwiZ2VuZXJhbENvbnRleHRGaWxlUGF0aCIsImdldEZpbGVQYXRoIiwic3BlY2lmaWNDb250ZXh0RmlsZVBhdGgiLCJ0b0pTT04iLCJqc29uIiwibWV0YVR5cGVKU09OIiwibWV0YVR5cGVUb01ldGFUeXBlSlNPTiIsImdldEJyZWFrUG9pbnQiLCJicmVha1BvaW50SlNPTiIsImZyb21KU09OIiwiaW5zdGFudGlhdGUiLCJpbnN0YW50aWF0ZU1ldGF2YXJpYWJsZSIsIm5hbWVGcm9tTWV0YXZhcmlhYmxlTm9kZSIsInRlcm1Gcm9tTWV0YXZhcmlhYmxlTm9kZSIsInR5cGVGcm9tTWV0YXZhcmlhYmxlTm9kZSIsIm1ldGFUeXBlRnJvbUpTT04iLCJmcm9tU3RhdGVtZW50Iiwic3RhdGVtZW50Tm9kZSIsIm1ldGF2YXJpYWJsZUZyb21TdGF0ZW1lbnROb2RlIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFnQkE7OztlQUFBOzs7Z0NBZG9FO2tFQUUvQzt5QkFHTzs2QkFDWTtzQkFDaUI7dUJBQ1M7eUJBQzBEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFNUgsTUFBTSxFQUFFQSxHQUFHLEVBQUUsR0FBR0MscUNBQXFCLEVBQy9CLEVBQUVDLGtCQUFrQixFQUFFQywwQkFBMEIsRUFBRSxHQUFHQyxtQ0FBbUI7TUFFOUUsV0FBZUMsSUFBQUEsZ0JBQU0sRUFBQyxNQUFNQyxxQkFBcUJDLHVCQUFPO0lBQ3RELFlBQVlDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxJQUFJLEVBQUVDLFVBQVUsRUFBRUMs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
|
package/lib/element/schema.js
CHANGED
|
@@ -84,9 +84,9 @@ const _default = (0, _elements.define)(class Schema extends _occamlanguages.Elem
|
|
|
84
84
|
context.trace(`Applying the '${schemaString}' schema to the '${statementString}' statement via the ${schemaAssertionString}' schema assertion...`);
|
|
85
85
|
return (0, _context.isolate)((statement, schemaAssertion, context, forward, back)=>{
|
|
86
86
|
return (0, _context.reconcile)((context)=>{
|
|
87
|
-
const
|
|
87
|
+
const unifyLink = this.unifyLink.bind(this), applyConstraints = this.applyConstraints.bind(this), unifyDeducedStatement = this.unifyDeducedStatement.bind(this), unifySupposedStatements = this.unifySupposedStatements.bind(this);
|
|
88
88
|
return all([
|
|
89
|
-
|
|
89
|
+
unifyLink,
|
|
90
90
|
applyConstraints,
|
|
91
91
|
unifyDeducedStatement,
|
|
92
92
|
unifySupposedStatements
|
|
@@ -170,17 +170,20 @@ const _default = (0, _elements.define)(class Schema extends _occamlanguages.Elem
|
|
|
170
170
|
if (exception) {
|
|
171
171
|
return back(exception);
|
|
172
172
|
}
|
|
173
|
-
context.trace(`Unable to
|
|
173
|
+
context.trace(`Unable to apply the schema's '${constraintsString}' constraints.`);
|
|
174
|
+
return back();
|
|
174
175
|
});
|
|
175
176
|
}, back);
|
|
176
177
|
}
|
|
178
|
+
unifyLink(statement, schemaAssertion, context, forward, back) {
|
|
179
|
+
const link = schemaAssertion.getLink(), schemaString = this.getString(), schemaAssertionString = schemaAssertion.getString();
|
|
180
|
+
context.trace(`Unifying the '${schemaAssertionString}' schema assertion's link with the '${schemaString}' schema...`);
|
|
181
|
+
return this.label.unifyLink(link, context, (context, back)=>{
|
|
182
|
+
context.debug(`...unified the '${schemaAssertionString}' schema assertion's link with the '${schemaString}' schema.`);
|
|
183
|
+
return forward(statement, schemaAssertion, context, back);
|
|
184
|
+
}, back);
|
|
185
|
+
}
|
|
177
186
|
unifyDeducedStatement(statement, schemaAssertion, context, forward, back) {
|
|
178
|
-
const conditional = this.isConditional(), statementConditional = statement.isConditional();
|
|
179
|
-
if (conditional !== statementConditional) {
|
|
180
|
-
const schemaString = this.getString(), statementString = statement.getString();
|
|
181
|
-
context.trace(`Either the '${statementString}' statement is unconditional whilst the '${schemaString}' schema is conditional or vice verse.`);
|
|
182
|
-
return back();
|
|
183
|
-
}
|
|
184
187
|
const deductionString = this.deduction.getString(), deducedStatement = statement.findDeducedStatement(context), deducedStatementString = deducedStatement.getString();
|
|
185
188
|
context.trace(`Unifying the '${deducedStatementString}' deduced statement with the '${deductionString}' deductino...`);
|
|
186
189
|
return (0, _context.isolate)((statement, schemaAssertion, context, forward, back)=>{
|
|
@@ -211,7 +214,7 @@ const _default = (0, _elements.define)(class Schema extends _occamlanguages.Elem
|
|
|
211
214
|
return forward(back);
|
|
212
215
|
}, back);
|
|
213
216
|
}, context);
|
|
214
|
-
}, supposedStatement, context,
|
|
217
|
+
}, supposedStatement, context, (supposedStatement, context, back)=>{
|
|
215
218
|
context.debug(`...unified the '${supposedStatementString}' supposed statement with the '${suppositionString}' supposition.`);
|
|
216
219
|
return forward(context, back);
|
|
217
220
|
}, back);
|
|
@@ -219,19 +222,12 @@ const _default = (0, _elements.define)(class Schema extends _occamlanguages.Elem
|
|
|
219
222
|
unifySupposedStatements(statement, schemaAssertion, context, forward, back) {
|
|
220
223
|
const suppositionsLength = this.suppositions.length, supposedStatements = statement.findSupposedStatements(context), supposedStatementsLength = supposedStatements.length;
|
|
221
224
|
if (suppositionsLength !== supposedStatementsLength) {
|
|
225
|
+
context.trace(`The number of the schema's suppositions does not match the number of the scheema assertion's supposed statements.`);
|
|
222
226
|
return back();
|
|
223
227
|
}
|
|
224
|
-
return backwardsEvery(supposedStatements, (supposedStatement, forward, back, index)=>{
|
|
228
|
+
return backwardsEvery(supposedStatements, (supposedStatement, context, forward, back, index)=>{
|
|
225
229
|
return this.unifySupposedStatement(supposedStatement, context, forward, back, index);
|
|
226
|
-
}, (context, back)=>{
|
|
227
|
-
return forward(statement, schemaAssertion, context, back);
|
|
228
|
-
}, back);
|
|
229
|
-
}
|
|
230
|
-
unifySchemaAssertionLink(statement, schemaAssertion, context, forward, back) {
|
|
231
|
-
const link = schemaAssertion.getLink(), schemaString = this.getString(), schemaAssertionString = schemaAssertion.getString();
|
|
232
|
-
context.trace(`Unifying the '${schemaAssertionString}' schema assertion's link with the '${schemaString}' schema...`);
|
|
233
|
-
return this.label.unifyLink(link, context, (context, back)=>{
|
|
234
|
-
context.debug(`...unified the '${schemaAssertionString}' schema assertion's link with the '${schemaString}' schema.`);
|
|
230
|
+
}, context, (context, back)=>{
|
|
235
231
|
return forward(statement, schemaAssertion, context, back);
|
|
236
232
|
}, back);
|
|
237
233
|
}
|
|
@@ -260,4 +256,4 @@ const _default = (0, _elements.define)(class Schema extends _occamlanguages.Elem
|
|
|
260
256
|
}
|
|
261
257
|
});
|
|
262
258
|
|
|
263
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L3NjaGVtYS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRWxlbWVudCwgYnJlYWtQb2ludFV0aWxpdGllcywgY29udGludWF0aW9uVXRpbGl0aWVzIH0gZnJvbSBcIm9jY2FtLWxhbmd1YWdlc1wiO1xuXG5pbXBvcnQgeyBkZWZpbmUgfSBmcm9tIFwiLi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IGlzb2xhdGUsIHJlY29uY2lsZSwgZW5jYXBzdWxhdGUgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2NvbnRleHRcIjtcbmltcG9ydCB7IGNvbnN0cmFpbnRzU3RyaW5nRnJvb0NvbnN0cmFpbnRzLCBzY2hlbWFTdHJpbmdGcm9tTGFiZWxTdXBwb3NpdGlvbnNBbmREZWR1Y3Rpb24gfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3N0cmluZ1wiO1xuaW1wb3J0IHsgbGFiZWxGcm9tSlNPTixcbiAgICAgICAgIGxhYmVsVG9MYWJlbEpTT04sXG4gICAgICAgICBkZWR1Y3Rpb25Gcm9tSlNPTixcbiAgICAgICAgIGNvbnN0cmFpbnRzRnJvbUpTT04sXG4gICAgICAgICBzdXBwb3NpdGlvbnNGcm9tSlNPTixcbiAgICAgICAgIGRlZHVjdGlvblRvRGVkdWN0aW9uSlNPTixcbiAgICAgICAgIGNvbnN0cmFpbnRzVG9Db25zdHJhaW50c0pTT04sXG4gICAgICAgICBzdXBwb3NpdGlvbnNUb1N1cHBvc2l0aW9uc0pTT04gfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2pzb25cIjtcblxuY29uc3QgeyBjdXQsIGFsbCwgZXZlcnksIGZvcndhcmRzRXZlcnksIGJhY2t3YXJkc0V2ZXJ5IH0gPSBjb250aW51YXRpb25VdGlsaXRpZXMsXG4gICAgICB7IGJyZWFrYWJsZSwgdW5icmVha2FibGUsIGJyZWFrUG9pbnRGcm9tSlNPTiwgYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04gfSA9IGJyZWFrUG9pbnRVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZShjbGFzcyBTY2hlbWEgZXh0ZW5kcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCBsYWJlbCwgc3VwcG9zaXRpb25zLCBkZWR1Y3Rpb24sIHByb29mLCBjb25zdHJhaW50cykge1xuICAgIHN1cGVyKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCk7XG5cbiAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG4gICAgdGhpcy5zdXBwb3NpdGlvbnMgPSBzdXBwb3NpdGlvbnM7XG4gICAgdGhpcy5kZWR1Y3Rpb24gPSBkZWR1Y3Rpb247XG4gICAgdGhpcy5wcm9vZiA9IHByb29mO1xuICAgIHRoaXMuY29uc3RyYWludHMgPSBjb25zdHJhaW50cztcbiAgfVxuXG4gIGdldExhYmVsKCkge1xuICAgIHJldHVybiB0aGlzLmxhYmVsO1xuICB9XG5cbiAgZ2V0U3VwcG9zaXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnN1cHBvc2l0aW9ucztcbiAgfVxuXG4gIGdldERlZHVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5kZWR1Y3Rpb247XG4gIH1cblxuICBnZXRQcm9vZigpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9vZjtcbiAgfVxuXG4gIGdldE1Db25zdHJhaW50KCkge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cmFpbnRzO1xuICB9XG5cbiAgaXNDb25kaXRpb25hbCgpIHtcbiAgICBjb25zdCBzdXBwb3NpdGlvbnNMZW5ndGggPSB0aGlzLnN1cHBvc2l0aW9ucy5sZW5ndGgsXG4gICAgICAgICAgY29uZGl0aW9uYWwgPSAoc3VwcG9zaXRpb25zTGVuZ3RoID4gMCk7XG5cbiAgICByZXR1cm4gY29uZGl0aW9uYWw7XG4gIH1cblxuICBjb21wYXJlUmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRMYWJlbCgpLFxuICAgICAgICAgIGxhYmVsQ29tcGFyZXNUb1JlZmZlcmVuY2UgPSBsYWJlbC5jb21wYXJlUmVmZXJlbmNlKHJlZmVyZW5jZSksXG4gICAgICAgICAgY29tcGFyZXNUb1JlZmVyZW5jZSA9IGxhYmVsQ29tcGFyZXNUb1JlZmZlcmVuY2U7ICAvLy9cblxuICAgIHJldHVybiBjb21wYXJlc1RvUmVmZXJlbmNlO1xuICB9XG5cbiAgbWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpIHsgcmV0dXJuIHRoaXMubGFiZWwubWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpOyB9XG5cbiAgdmVyaWZ5ID0gYnJlYWthYmxlKGZ1bmN0aW9uIChjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgZm9yd2FyZCA9IGN1dChmb3J3YXJkLCBiYWNrKTsgLy8vXG5cbiAgICBjb25zdCBzY2hlbWFTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEuLi5gKTtcblxuICAgIHJldHVybiBpc29sYXRlKChjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSA9PiB7XG4gICAgICByZXR1cm4gZW5jYXBzdWxhdGUoKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgdmVyaWZ5UHJvb2YgPSB0aGlzLnZlcmlmeVByb29mLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgIHZlcmlmeUxhYmVsID0gdGhpcy52ZXJpZnlMYWJlbC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICB2ZXJpZnlEZWR1Y3Rpb24gPSB0aGlzLnZlcmlmeURlZHVjdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICB2ZXJpZnlTdXBwb3NpdGlvbnMgPSB0aGlzLnZlcmlmeVN1cHBvc2l0aW9ucy5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHJldHVybiBhbGwoW1xuICAgICAgICAgIHZlcmlmeUxhYmVsLFxuICAgICAgICAgIHZlcmlmeVN1cHBvc2l0aW9ucyxcbiAgICAgICAgICB2ZXJpZnlEZWR1Y3Rpb24sXG4gICAgICAgICAgdmVyaWZ5UHJvb2ZcbiAgICAgICAgXSwgY29udGV4dCwgKGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgICAgICByZXR1cm4gZm9yd2FyZChiYWNrKTtcbiAgICAgICAgfSwgYmFjayk7XG4gICAgICB9LCB0aGlzLmNvbnN0cmFpbnRzLCBjb250ZXh0KTtcbiAgICB9LCBjb250ZXh0LCAoY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29uc3Qgc2NoZW1hID0gdGhpczsgLy8vXG5cbiAgICAgIGNvbnRleHQuYWRkU2NoZW1hKHNjaGVtYSk7XG5cbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEuYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgIH0sIChleGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIGJhY2soZXhjZXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC50cmFjZShgVW5hYmxlIHRvIHZlcmlmeSB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hLmApO1xuXG4gICAgICByZXR1cm4gYmFjaygpO1xuICAgIH0pO1xuICB9KTtcblxuICBhcHBseSA9IHVuYnJlYWthYmxlKGZ1bmN0aW9uIChzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIGZvcndhcmQgPSBjdXQoZm9yd2FyZCwgYmFjayk7IC8vL1xuXG4gICAgY29uc3Qgc2NoZW1hU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIHNjaGVtYUFzc2VydGlvblN0cmluZyA9IHNjaGVtYUFzc2VydGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFwcGx5aW5nIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEgdG8gdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB2aWEgdGhlICAke3NjaGVtYUFzc2VydGlvblN0cmluZ30nIHNjaGVtYSBhc3NlcnRpb24uLi5gKTtcblxuICAgIHJldHVybiBpc29sYXRlKChzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgZm9yd2FyZCwgYmFjaykgPT4ge1xuICAgICAgcmV0dXJuIHJlY29uY2lsZSgoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBhcHBseUNvbnN0cmFpbnRzID0gdGhpcy5hcHBseUNvbnN0cmFpbnRzLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgIHVuaWZ5RGVkdWNlZFN0YXRlbWVudCA9IHRoaXMudW5pZnlEZWR1Y2VkU3RhdGVtZW50LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgIHVuaWZ5U3VwcG9zZWRTdGF0ZW1lbnRzID0gdGhpcy51bmlmeVN1cHBvc2VkU3RhdGVtZW50cy5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICB1bmlmeVNjaGVtYUFzc2VydGlvbkxpbmsgPSB0aGlzLnVuaWZ5U2NoZW1hQXNzZXJ0aW9uTGluay5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHJldHVybiBhbGwoW1xuICAgICAgICAgIHVuaWZ5U2NoZW1hQXNzZXJ0aW9uTGluayxcbiAgICAgICAgICBhcHBseUNvbnN0cmFpbnRzLFxuICAgICAgICAgIHVuaWZ5RGVkdWNlZFN0YXRlbWVudCxcbiAgICAgICAgICB1bmlmeVN1cHBvc2VkU3RhdGVtZW50c1xuICAgICAgICBdLCBzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgKHN0YXRlbWVudCwgc2NoZW1hQXNzZXJ0aW9uLCBjb250ZXh0LCBiYWNrKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGZvcndhcmQoYmFjayk7XG4gICAgICAgIH0sIGJhY2spO1xuICAgICAgfSwgY29udGV4dCk7XG4gICAgfSwgc3RhdGVtZW50LCBzY2hlbWFBc3NlcnRpb24sIGNvbnRleHQsIChzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4uYXBwbGllZCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hIHRvIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgdmlhIHRoZSAgJHtzY2hlbWFBc3NlcnRpb25TdHJpbmd9JyBzY2hlbWEgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgIH0sIChleGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIGJhY2soZXhjZXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC50cmFjZShgVW5hYmxlIHRvIGFwcGx5IHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEgdG8gdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB2aWEgdGhlICAke3NjaGVtYUFzc2VydGlvblN0cmluZ30nIHNjaGVtYSBhc3NlcnRpb24uYCk7XG5cbiAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHZlcmlmeUxhYmVsKGNvbnRleHQsIGZvcndhcmQsIGJhY2spIHtcbiAgICBjb25zdCBsYWJlbFN0cmluZyA9IHRoaXMubGFiZWwuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgc2NoZW1hU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYSdzICcke2xhYmVsU3RyaW5nfScgbGFiZWwuLi5gKTtcblxuICAgIHJldHVybiB0aGlzLmxhYmVsLnZlcmlmeShjb250ZXh0LCAoY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYSdzICcke2xhYmVsU3RyaW5nfScgbGFiZWwuYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgIH0sIGJhY2spO1xuICB9XG5cbiAgdmVyaWZ5UHJvb2YoY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIGNvbnN0IHNjaGVtYVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hJ3MgcHJvb2YuLi5gKTtcblxuICAgIGNvbnN0IHN0YXRlbWVudCA9IHRoaXMuZGVkdWN0aW9uLmdldFN0YXRlbWVudCgpO1xuXG4gICAgcmV0dXJuIHRoaXMucHJvb2YudmVyaWZ5KHN0YXRlbWVudCwgY29udGV4dCwgKGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyBwcm9vZi5gKTtcblxuICAgICAgcmV0dXJuIGZvcndhcmQoY29udGV4dCwgYmFjayk7XG4gICAgfSwgYmFjayk7XG4gIH1cblxuICB2ZXJpZnlEZWR1Y3Rpb24oY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIGNvbnN0IHNjaGVtYVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCksIC8vL1xuICAgICAgICAgIGRlZHVjdGlvblN0cmluZyA9IHRoaXMuZGVkdWN0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyAnJHtkZWR1Y3Rpb25TdHJpbmd9JyBkZWR1Y3Rpb24uLi5gKTtcblxuICAgIHJldHVybiB0aGlzLmRlZHVjdGlvbi52ZXJpZnkoY29udGV4dCwgKGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyAnJHtkZWR1Y3Rpb25TdHJpbmd9JyBkZWR1Y3Rpb24uYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgIH0sIGJhY2spO1xuICB9XG5cbiAgdmVyaWZ5U3VwcG9zaXRpb24oc3VwcG9zaXRpb24sIGNvbnRleHQsIGZvcndhcmQsIGJhY2spIHtcbiAgICBjb25zdCBzY2hlbWFTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpLCAvLy9cbiAgICAgICAgICBzdXBwb3NpdGlvblN0cmluZyA9IHN1cHBvc2l0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyAnJHtzdXBwb3NpdGlvblN0cmluZ30nIHN1cHBvc2l0aW9uLi4uYCk7XG5cbiAgICByZXR1cm4gc3VwcG9zaXRpb24udmVyaWZ5KGNvbnRleHQsIChjb250ZXh0LCBiYWNrKSA9PiB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hJ3MgJyR7c3VwcG9zaXRpb25TdHJpbmd9JyBzdXBwb3NpdGlvbi5gKTtcblxuICAgICAgcmV0dXJuIGZvcndhcmQoY29udGV4dCwgYmFjayk7XG4gICAgfSwgYmFjayk7XG4gIH1cblxuICB2ZXJpZnlTdXBwb3NpdGlvbnMoY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIGNvbnN0IHN1cHBvc2l0aW9uc0xlbmd0aCA9IHRoaXMuc3VwcG9zaXRpb25zLmxlbmd0aDtcblxuICAgIGlmIChzdXBwb3NpdGlvbnNMZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hJ3Mgc3VwcG9zaXRpb25zLi4uYCk7XG5cbiAgICByZXR1cm4gZm9yd2FyZHNFdmVyeSh0aGlzLnN1cHBvc2l0aW9ucywgKHN1cHBvc2l0aW9uLCBjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52ZXJpZnlTdXBwb3NpdGlvbihzdXBwb3NpdGlvbiwgY29udGV4dCwgKGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgICAgY29uc3QgZmFjdE9yU3VicHJvb2YgPSBzdXBwb3NpdGlvbjsgLy8vXG5cbiAgICAgICAgY29udGV4dC5hZGRGYWN0T3JTdWJwcm9vZihmYWN0T3JTdWJwcm9vZik7XG5cbiAgICAgICAgY29udGV4dC5hc3NpZ25Bc3NpZ25tZW50cygpO1xuXG4gICAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgICAgfSwgYmFjayk7XG4gICAgfSwgY29udGV4dCwgKGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyBzdXBwb3NpdGlvbnMuYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgIH0sIGJhY2spO1xuICB9XG5cbiAgYXBwbHlDb25zdHJhaW50cyhzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIHJldHVybiBzY2hlbWFBc3NlcnRpb24uZ2V0SW1wbGljaXRBc3N1bXB0aW9ucyhjb250ZXh0LCAoaW1wbGljaXRBc3N1bXB0aW9ucywgY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29uc3QgYXNzdW1wdGlvbnMgPSBzY2hlbWFBc3NlcnRpb24uZ2V0QXNzdW1wdGlvbnMoKSxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzU3RyaW5nID0gY29uc3RyYWludHNTdHJpbmdGcm9vQ29uc3RyYWludHModGhpcy5jb25zdHJhaW50cyk7XG5cbiAgICAgIGNvbnRleHQudHJhY2UoYEFwcGx5aW5nIHRoZSBzY2hlbWEncyAnJHtjb25zdHJhaW50c1N0cmluZ30nIGNvbnN0cmFpbnRzLi4uYCk7XG5cbiAgICAgIHJldHVybiBldmVyeSh0aGlzLmNvbnN0cmFpbnRzLCAoY29uc3RyYWludCwgY29udGV4dCwgZm9yd2FyZCwgYmFjaykgPT4ge1xuICAgICAgICByZXR1cm4gY29uc3RyYWludC5hcHBseShpbXBsaWNpdEFzc3VtcHRpb25zLCBhc3N1bXB0aW9ucywgY29udGV4dCwgZm9yd2FyZCwgYmFjayk7XG4gICAgICB9LCBjb250ZXh0LCAoY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi5hcHBsaWVkIHRoZSBzY2hlbWEncyAnJHtjb25zdHJhaW50c1N0cmluZ30nIGNvbnN0cmFpbnRzLmApO1xuXG4gICAgICAgIHJldHVybiBmb3J3YXJkKHN0YXRlbWVudCwgc2NoZW1hQXNzZXJ0aW9uLCBjb250ZXh0LCBiYWNrKTtcbiAgICAgIH0sIChleGNlcHRpb24pID0+IHtcbiAgICAgICAgaWYgKGV4Y2VwdGlvbikge1xuICAgICAgICAgIHJldHVybiBiYWNrKGV4Y2VwdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBVbmFibGUgdG8gYXBwbHlpbmcgdGhlIHNjaGVtYSdzICcke2NvbnN0cmFpbnRzU3RyaW5nfScgY29uc3RyYWludHMuYCk7XG4gICAgICB9KTtcbiAgICB9LCBiYWNrKTtcbiAgfVxuXG4gIHVuaWZ5RGVkdWNlZFN0YXRlbWVudChzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIGNvbnN0IGNvbmRpdGlvbmFsID0gdGhpcy5pc0NvbmRpdGlvbmFsKCksXG4gICAgICAgICAgc3RhdGVtZW50Q29uZGl0aW9uYWwgPSBzdGF0ZW1lbnQuaXNDb25kaXRpb25hbCgpO1xuXG4gICAgaWYgKGNvbmRpdGlvbmFsICE9PSBzdGF0ZW1lbnRDb25kaXRpb25hbCkge1xuICAgICAgY29uc3Qgc2NoZW1hU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgICAgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgICBjb250ZXh0LnRyYWNlKGBFaXRoZXIgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBpcyB1bmNvbmRpdGlvbmFsIHdoaWxzdCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hIGlzIGNvbmRpdGlvbmFsIG9yIHZpY2UgdmVyc2UuYCk7XG5cbiAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVkdWN0aW9uU3RyaW5nID0gdGhpcy5kZWR1Y3Rpb24uZ2V0U3RyaW5nKCksXG4gICAgICAgICAgZGVkdWNlZFN0YXRlbWVudCA9IHN0YXRlbWVudC5maW5kRGVkdWNlZFN0YXRlbWVudChjb250ZXh0KSxcbiAgICAgICAgICBkZWR1Y2VkU3RhdGVtZW50U3RyaW5nID0gZGVkdWNlZFN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtkZWR1Y2VkU3RhdGVtZW50U3RyaW5nfScgZGVkdWNlZCBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7ZGVkdWN0aW9uU3RyaW5nfScgZGVkdWN0aW5vLi4uYCk7XG5cbiAgICByZXR1cm4gaXNvbGF0ZSgoc3RhdGVtZW50LCBzY2hlbWFBc3NlcnRpb24sIGNvbnRleHQsIGZvcndhcmQsIGJhY2spID0+IHtcbiAgICAgIGNvbnN0IGRlZHVjdGlvbkNvbnRleHQgPSB0aGlzLmRlZHVjdGlvbi5nZXRDb250ZXh0KCksIC8vL1xuICAgICAgICAgICAgZ2VuZXJhbENvbnRleHQgPSBkZWR1Y3Rpb25Db250ZXh0OyAvLy9cblxuICAgICAgcmV0dXJuIHJlY29uY2lsZSgoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBzdGF0ZW1lbnQgPSBkZWR1Y2VkU3RhdGVtZW50LCAvLy9cbiAgICAgICAgICAgICAgc3BlY2lmaWNDb250ZXh0ID0gY29udGV4dDsgIC8vL1xuXG4gICAgICAgIHJldHVybiB0aGlzLmRlZHVjdGlvbi51bmlmeVN0YXRlbWVudChzdGF0ZW1lbnQsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIChnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBiYWNrKSA9PiB7XG4gICAgICAgICAgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dDsgIC8vL1xuXG4gICAgICAgICAgY29udGV4dC5jb21taXQoKTtcblxuICAgICAgICAgIHJldHVybiBmb3J3YXJkKGJhY2spO1xuICAgICAgICB9LCBiYWNrKTtcbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH0sIHN0YXRlbWVudCwgc2NoZW1hQXNzZXJ0aW9uLCBjb250ZXh0LCAoc3RhdGVtZW50LCBzY2hlbWFBc3NlcnRpb24sIGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke2RlZHVjZWRTdGF0ZW1lbnRTdHJpbmd9JyBkZWR1Y2VkIHN0YXRlbWVudCB3aXRoIHRoZSAnJHtkZWR1Y3Rpb25TdHJpbmd9JyBkZWR1Y3Rpb24uYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKHN0YXRlbWVudCwgc2NoZW1hQXNzZXJ0aW9uLCBjb250ZXh0LCBiYWNrKTtcbiAgICB9LCBiYWNrKTtcbiAgfVxuXG4gIHVuaWZ5U3VwcG9zZWRTdGF0ZW1lbnQoc3VwcG9zZWRTdGF0ZW1lbnQsIGNvbnRleHQsIGZvcndhcmQsIGJhY2ssIGluZGV4KSB7XG4gICAgY29uc3Qgc3VwcG9zaXRpb24gPSB0aGlzLnN1cHBvc2l0aW9uc1tpbmRleF0sXG4gICAgICAgICAgc3VwcG9zaXRpb25TdHJpbmcgPSBzdXBwb3NpdGlvbi5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBzdXBwb3NlZFN0YXRlbWVudFN0cmluZyA9IHN1cHBvc2VkU3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3N1cHBvc2VkU3RhdGVtZW50U3RyaW5nfScgc3VwcG9zZWQgc3RhdGVtZW50IHdpdGggdGhlICcke3N1cHBvc2l0aW9uU3RyaW5nfScgZGVkdWN0aW5vLi4uYCk7XG5cbiAgICByZXR1cm4gaXNvbGF0ZSgoc3VwcG9zZWRTdGF0ZW1lbnQsIGNvbnRleHQsIGZvcndhcmQsIGJhY2spID0+IHtcbiAgICAgIGNvbnN0IHN1cHBvc2l0aW9uQ29udGV4dCA9IHN1cHBvc2l0aW9uLmdldENvbnRleHQoKSwgLy8vXG4gICAgICAgICAgICBnZW5lcmFsQ29udGV4dCA9IHN1cHBvc2l0aW9uQ29udGV4dDsgLy8vXG5cbiAgICAgIHJldHVybiByZWNvbmNpbGUoKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdGVtZW50ID0gc3VwcG9zZWRTdGF0ZW1lbnQsIC8vL1xuICAgICAgICAgICAgICBzcGVjaWZpY0NvbnRleHQgPSBjb250ZXh0OyAgLy8vXG5cbiAgICAgICAgcmV0dXJuIHN1cHBvc2l0aW9uLnVuaWZ5U3RhdGVtZW50KHN0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIGJhY2spID0+IHtcbiAgICAgICAgICBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0OyAgLy8vXG5cbiAgICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuXG4gICAgICAgICAgcmV0dXJuIGZvcndhcmQoYmFjayk7XG4gICAgICAgIH0sIGJhY2spO1xuICAgICAgfSwgY29udGV4dCk7XG4gICAgfSwgc3VwcG9zZWRTdGF0ZW1lbnQsIGNvbnRleHQsIGNvbnRleHQsIChzdXBwb3NlZFN0YXRlbWVudCwgY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c3VwcG9zZWRTdGF0ZW1lbnRTdHJpbmd9JyBzdXBwb3NlZCBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7c3VwcG9zaXRpb25TdHJpbmd9JyBzdXBwb3NpdGlvbi5gKTtcblxuICAgICAgcmV0dXJuIGZvcndhcmQoY29udGV4dCwgYmFjayk7XG4gICAgfSwgYmFjayk7XG4gIH1cblxuICB1bmlmeVN1cHBvc2VkU3RhdGVtZW50cyhzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIGNvbnN0IHN1cHBvc2l0aW9uc0xlbmd0aCA9IHRoaXMuc3VwcG9zaXRpb25zLmxlbmd0aCxcbiAgICAgICAgICBzdXBwb3NlZFN0YXRlbWVudHMgPSBzdGF0ZW1lbnQuZmluZFN1cHBvc2VkU3RhdGVtZW50cyhjb250ZXh0KSxcbiAgICAgICAgICBzdXBwb3NlZFN0YXRlbWVudHNMZW5ndGggPSBzdXBwb3NlZFN0YXRlbWVudHMubGVuZ3RoO1xuXG4gICAgaWYgKHN1cHBvc2l0aW9uc0xlbmd0aCAhPT0gc3VwcG9zZWRTdGF0ZW1lbnRzTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYmFjaygpO1xuICAgIH1cblxuICAgIHJldHVybiBiYWNrd2FyZHNFdmVyeShzdXBwb3NlZFN0YXRlbWVudHMsIChzdXBwb3NlZFN0YXRlbWVudCwgZm9yd2FyZCwgYmFjaywgaW5kZXgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnVuaWZ5U3VwcG9zZWRTdGF0ZW1lbnQoc3VwcG9zZWRTdGF0ZW1lbnQsIGNvbnRleHQsIGZvcndhcmQsIGJhY2ssIGluZGV4KTtcbiAgICB9LCAoY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgcmV0dXJuIGZvcndhcmQoc3RhdGVtZW50LCBzY2hlbWFBc3NlcnRpb24sIGNvbnRleHQsIGJhY2spO1xuICAgIH0sIGJhY2spO1xuICB9XG5cbiAgdW5pZnlTY2hlbWFBc3NlcnRpb25MaW5rKHN0YXRlbWVudCwgc2NoZW1hQXNzZXJ0aW9uLCBjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgY29uc3QgbGluayA9IHNjaGVtYUFzc2VydGlvbi5nZXRMaW5rKCksXG4gICAgICAgICAgc2NoZW1hU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIHNjaGVtYUFzc2VydGlvblN0cmluZyA9IHNjaGVtYUFzc2VydGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzY2hlbWFBc3NlcnRpb25TdHJpbmd9JyBzY2hlbWEgYXNzZXJ0aW9uJ3MgbGluayB3aXRoIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEuLi5gKTtcblxuICAgIHJldHVybiB0aGlzLmxhYmVsLnVuaWZ5TGluayhsaW5rLCBjb250ZXh0LCAoY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c2NoZW1hQXNzZXJ0aW9uU3RyaW5nfScgc2NoZW1hIGFzc2VydGlvbidzIGxpbmsgd2l0aCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hLmApO1xuXG4gICAgICByZXR1cm4gZm9yd2FyZChzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgYmFjayk7XG4gICAgfSwgYmFjayk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgbGV0IGpzb247XG5cbiAgICBjb25zdCBsYWJlbEpTT04gPSBsYWJlbFRvTGFiZWxKU09OKHRoaXMubGFiZWwpLFxuICAgICAgICAgIGRlZHVjdGlvbkpTT04gPSBkZWR1Y3Rpb25Ub0RlZHVjdGlvbkpTT04odGhpcy5kZWR1Y3Rpb24pLFxuICAgICAgICAgIGNvbnN0cmFpbnRzSlNPTiA9IGNvbnN0cmFpbnRzVG9Db25zdHJhaW50c0pTT04odGhpcy5jb25zdHJhaW50cyksXG4gICAgICAgICAgc3VwcG9zaXRpb25zSlNPTiA9IHN1cHBvc2l0aW9uc1RvU3VwcG9zaXRpb25zSlNPTih0aGlzLnN1cHBvc2l0aW9ucyksXG4gICAgICAgICAgc3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTtcblxuICAgIGxldCBicmVha1BvaW50O1xuXG4gICAgYnJlYWtQb2ludCA9IHRoaXMuZ2V0QnJlYWtQb2ludCgpO1xuXG4gICAgY29uc3QgYnJlYWtQb2ludEpTT04gPSBicmVha1BvaW50VG9CcmVha1BvaW50SlNPTihicmVha1BvaW50KTtcblxuICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50SlNPTjsgIC8vL1xuXG4gICAgY29uc3QgbGFiZWwgPSBsYWJlbEpTT04sICAvLy9cbiAgICAgICAgICBkZWR1Y3Rpb24gPSBkZWR1Y3Rpb25KU09OLCAgLy8vXG4gICAgICAgICAgY29uc3RyYWludHMgPSBjb25zdHJhaW50c0pTT04sICAvLy9cbiAgICAgICAgICBzdXBwb3NpdGlvbnMgPSBzdXBwb3NpdGlvbnNKU09OOyAgLy8vXG5cbiAgICBqc29uID0ge1xuICAgICAgc3RyaW5nLFxuICAgICAgYnJlYWtQb2ludCxcbiAgICAgIGxhYmVsLFxuICAgICAgZGVkdWN0aW9uLFxuICAgICAgY29uc3RyYWludHMsXG4gICAgICBzdXBwb3NpdGlvbnNcbiAgICB9O1xuXG4gICAgcmV0dXJuIGpzb247XG4gIH1cblxuICBzdGF0aWMgbmFtZSA9IFwiU2NoZW1hXCI7XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbnRleHQpIHtcbiAgICBjb25zdCBsYWJlbCA9IGxhYmVsRnJvbUpTT04oanNvbiwgY29udGV4dCksXG4gICAgICAgICAgZGVkdWN0aW9uID0gZGVkdWN0aW9uRnJvbUpTT04oanNvbiwgY29udGV4dCksXG4gICAgICAgICAgY29uc3RyYWludHMgPSBjb25zdHJhaW50c0Zyb21KU09OKGpzb24sIGNvbnRleHQpLFxuICAgICAgICAgIHN1cHBvc2l0aW9ucyA9IHN1cHBvc2l0aW9uc0Zyb21KU09OKGpzb24sIGNvbnRleHQpLFxuICAgICAgICAgIHN0cmluZyA9IHNjaGVtYVN0cmluZ0Zyb21MYWJlbFN1cHBvc2l0aW9uc0FuZERlZHVjdGlvbihsYWJlbCwgc3VwcG9zaXRpb25zLCBkZWR1Y3Rpb24pLFxuICAgICAgICAgIG5vZGUgPSBudWxsLFxuICAgICAgICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50RnJvbUpTT04oanNvbiksXG4gICAgICAgICAgcHJvb2YgPSBudWxsLFxuICAgICAgICAgIHNjaGVtYSA9IG5ldyBTY2hlbWEoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCBsYWJlbCwgc3VwcG9zaXRpb25zLCBkZWR1Y3Rpb24sIHByb29mLCBjb25zdHJhaW50cyk7XG5cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG59KTtcbiJdLCJuYW1lcyI6WyJjdXQiLCJhbGwiLCJldmVyeSIsImZvcndhcmRzRXZlcnkiLCJiYWNrd2FyZHNFdmVyeSIsImNvbnRpbnVhdGlvblV0aWxpdGllcyIsImJyZWFrYWJsZSIsInVuYnJlYWthYmxlIiwiYnJlYWtQb2ludEZyb21KU09OIiwiYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04iLCJicmVha1BvaW50VXRpbGl0aWVzIiwiZGVmaW5lIiwiU2NoZW1hIiwiRWxlbWVudCIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwiYnJlYWtQb2ludCIsImxhYmVsIiwic3VwcG9zaXRpb25zIiwiZGVkdWN0aW9uIiwicHJvb2YiLCJjb25zdHJhaW50cyIsImdldExhYmVsIiwiZ2V0U3VwcG9zaXRpb25zIiwiZ2V0RGVkdWN0aW9uIiwiZ2V0UHJvb2YiLCJnZXRNQ29uc3RyYWludCIsImlzQ29uZGl0aW9uYWwiLCJzdXBwb3NpdGlvbnNMZW5ndGgiLCJsZW5ndGgiLCJjb25kaXRpb25hbCIsImNvbXBhcmVSZWZlcmVuY2UiLCJyZWZlcmVuY2UiLCJsYWJlbENvbXBhcmVzVG9SZWZmZXJlbmNlIiwiY29tcGFyZXNUb1JlZmVyZW5jZSIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZU5vZGUiLCJ2ZXJpZnkiLCJmb3J3YXJkIiwiYmFjayIsInNjaGVtYVN0cmluZyIsImdldFN0cmluZyIsInRyYWNlIiwiaXNvbGF0ZSIsImVuY2Fwc3VsYXRlIiwidmVyaWZ5UHJvb2YiLCJiaW5kIiwidmVyaWZ5TGFiZWwiLCJ2ZXJpZnlEZWR1Y3Rpb24iLCJ2ZXJpZnlTdXBwb3NpdGlvbnMiLCJzY2hlbWEiLCJhZGRTY2hlbWEiLCJkZWJ1ZyIsImV4Y2VwdGlvbiIsImFwcGx5Iiwic3RhdGVtZW50Iiwic2NoZW1hQXNzZXJ0aW9uIiwic3RhdGVtZW50U3RyaW5nIiwic2NoZW1hQXNzZXJ0aW9uU3RyaW5nIiwicmVjb25jaWxlIiwiYXBwbHlDb25zdHJhaW50cyIsInVuaWZ5RGVkdWNlZFN0YXRlbWVudCIsInVuaWZ5U3VwcG9zZWRTdGF0ZW1lbnRzIiwidW5pZnlTY2hlbWFBc3NlcnRpb25MaW5rIiwibGFiZWxTdHJpbmciLCJnZXRTdGF0ZW1lbnQiLCJkZWR1Y3Rpb25TdHJpbmciLCJ2ZXJpZnlTdXBwb3NpdGlvbiIsInN1cHBvc2l0aW9uIiwic3VwcG9zaXRpb25TdHJpbmciLCJmYWN0T3JTdWJwcm9vZiIsImFkZEZhY3RPclN1YnByb29mIiwiYXNzaWduQXNzaWdubWVudHMiLCJnZXRJbXBsaWNpdEFzc3VtcHRpb25zIiwiaW1wbGljaXRBc3N1bXB0aW9ucyIsImFzc3VtcHRpb25zIiwiZ2V0QXNzdW1wdGlvbnMiLCJjb25zdHJhaW50c1N0cmluZyIsImNvbnN0cmFpbnRzU3RyaW5nRnJvb0NvbnN0cmFpbnRzIiwiY29uc3RyYWludCIsInN0YXRlbWVudENvbmRpdGlvbmFsIiwiZGVkdWNlZFN0YXRlbWVudCIsImZpbmREZWR1Y2VkU3RhdGVtZW50IiwiZGVkdWNlZFN0YXRlbWVudFN0cmluZyIsImRlZHVjdGlvbkNvbnRleHQiLCJnZXRDb250ZXh0IiwiZ2VuZXJhbENvbnRleHQiLCJzcGVjaWZpY0NvbnRleHQiLCJ1bmlmeVN0YXRlbWVudCIsImNvbW1pdCIsInVuaWZ5U3VwcG9zZWRTdGF0ZW1lbnQiLCJzdXBwb3NlZFN0YXRlbWVudCIsImluZGV4Iiwic3VwcG9zZWRTdGF0ZW1lbnRTdHJpbmciLCJzdXBwb3NpdGlvbkNvbnRleHQiLCJzdXBwb3NlZFN0YXRlbWVudHMiLCJmaW5kU3VwcG9zZWRTdGF0ZW1lbnRzIiwic3VwcG9zZWRTdGF0ZW1lbnRzTGVuZ3RoIiwibGluayIsImdldExpbmsiLCJ1bmlmeUxpbmsiLCJ0b0pTT04iLCJqc29uIiwibGFiZWxKU09OIiwibGFiZWxUb0xhYmVsSlNPTiIsImRlZHVjdGlvbkpTT04iLCJkZWR1Y3Rpb25Ub0RlZHVjdGlvbkpTT04iLCJjb25zdHJhaW50c0pTT04iLCJjb25zdHJhaW50c1RvQ29uc3RyYWludHNKU09OIiwic3VwcG9zaXRpb25zSlNPTiIsInN1cHBvc2l0aW9uc1RvU3VwcG9zaXRpb25zSlNPTiIsImdldEJyZWFrUG9pbnQiLCJicmVha1BvaW50SlNPTiIsIm5hbWUiLCJmcm9tSlNPTiIsImxhYmVsRnJvbUpTT04iLCJkZWR1Y3Rpb25Gcm9tSlNPTiIsImNvbnN0cmFpbnRzRnJvbUpTT04iLCJzdXBwb3NpdGlvbnNGcm9tSlNPTiIsInNjaGVtYVN0cmluZ0Zyb21MYWJlbFN1cHBvc2l0aW9uc0FuZERlZHVjdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBbUJBOzs7ZUFBQTs7O2dDQWpCb0U7MEJBRTdDO3lCQUN5Qjt3QkFDZ0Q7c0JBUWpEO0FBRS9DLE1BQU0sRUFBRUEsR0FBRyxFQUFFQyxHQUFHLEVBQUVDLEtBQUssRUFBRUMsYUFBYSxFQUFFQyxjQUFjLEVBQUUsR0FBR0MscUNBQXFCLEVBQzFFLEVBQUVDLFNBQVMsRUFBRUMsV0FBVyxFQUFFQyxrQkFBa0IsRUFBRUMsMEJBQTBCLEVBQUUsR0FBR0MsbUNBQW1CO01BRXRHLFdBQWVDLElBQUFBLGdCQUFNLEVBQUMsTUFBTUMsZUFBZUMsdUJBQU87SUFDaEQsWUFBWUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsVUFBVSxFQUFFQyxLQUFLLEVBQUVDLFlBQVks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
|
|
259
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L3NjaGVtYS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRWxlbWVudCwgYnJlYWtQb2ludFV0aWxpdGllcywgY29udGludWF0aW9uVXRpbGl0aWVzIH0gZnJvbSBcIm9jY2FtLWxhbmd1YWdlc1wiO1xuXG5pbXBvcnQgeyBkZWZpbmUgfSBmcm9tIFwiLi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IGlzb2xhdGUsIHJlY29uY2lsZSwgZW5jYXBzdWxhdGUgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2NvbnRleHRcIjtcbmltcG9ydCB7IGNvbnN0cmFpbnRzU3RyaW5nRnJvb0NvbnN0cmFpbnRzLCBzY2hlbWFTdHJpbmdGcm9tTGFiZWxTdXBwb3NpdGlvbnNBbmREZWR1Y3Rpb24gfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3N0cmluZ1wiO1xuaW1wb3J0IHsgbGFiZWxGcm9tSlNPTixcbiAgICAgICAgIGxhYmVsVG9MYWJlbEpTT04sXG4gICAgICAgICBkZWR1Y3Rpb25Gcm9tSlNPTixcbiAgICAgICAgIGNvbnN0cmFpbnRzRnJvbUpTT04sXG4gICAgICAgICBzdXBwb3NpdGlvbnNGcm9tSlNPTixcbiAgICAgICAgIGRlZHVjdGlvblRvRGVkdWN0aW9uSlNPTixcbiAgICAgICAgIGNvbnN0cmFpbnRzVG9Db25zdHJhaW50c0pTT04sXG4gICAgICAgICBzdXBwb3NpdGlvbnNUb1N1cHBvc2l0aW9uc0pTT04gfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2pzb25cIjtcblxuY29uc3QgeyBjdXQsIGFsbCwgZXZlcnksIGZvcndhcmRzRXZlcnksIGJhY2t3YXJkc0V2ZXJ5IH0gPSBjb250aW51YXRpb25VdGlsaXRpZXMsXG4gICAgICB7IGJyZWFrYWJsZSwgdW5icmVha2FibGUsIGJyZWFrUG9pbnRGcm9tSlNPTiwgYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04gfSA9IGJyZWFrUG9pbnRVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZShjbGFzcyBTY2hlbWEgZXh0ZW5kcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCBsYWJlbCwgc3VwcG9zaXRpb25zLCBkZWR1Y3Rpb24sIHByb29mLCBjb25zdHJhaW50cykge1xuICAgIHN1cGVyKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCk7XG5cbiAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG4gICAgdGhpcy5zdXBwb3NpdGlvbnMgPSBzdXBwb3NpdGlvbnM7XG4gICAgdGhpcy5kZWR1Y3Rpb24gPSBkZWR1Y3Rpb247XG4gICAgdGhpcy5wcm9vZiA9IHByb29mO1xuICAgIHRoaXMuY29uc3RyYWludHMgPSBjb25zdHJhaW50cztcbiAgfVxuXG4gIGdldExhYmVsKCkge1xuICAgIHJldHVybiB0aGlzLmxhYmVsO1xuICB9XG5cbiAgZ2V0U3VwcG9zaXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnN1cHBvc2l0aW9ucztcbiAgfVxuXG4gIGdldERlZHVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5kZWR1Y3Rpb247XG4gIH1cblxuICBnZXRQcm9vZigpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9vZjtcbiAgfVxuXG4gIGdldE1Db25zdHJhaW50KCkge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cmFpbnRzO1xuICB9XG5cbiAgaXNDb25kaXRpb25hbCgpIHtcbiAgICBjb25zdCBzdXBwb3NpdGlvbnNMZW5ndGggPSB0aGlzLnN1cHBvc2l0aW9ucy5sZW5ndGgsXG4gICAgICAgICAgY29uZGl0aW9uYWwgPSAoc3VwcG9zaXRpb25zTGVuZ3RoID4gMCk7XG5cbiAgICByZXR1cm4gY29uZGl0aW9uYWw7XG4gIH1cblxuICBjb21wYXJlUmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRMYWJlbCgpLFxuICAgICAgICAgIGxhYmVsQ29tcGFyZXNUb1JlZmZlcmVuY2UgPSBsYWJlbC5jb21wYXJlUmVmZXJlbmNlKHJlZmVyZW5jZSksXG4gICAgICAgICAgY29tcGFyZXNUb1JlZmVyZW5jZSA9IGxhYmVsQ29tcGFyZXNUb1JlZmZlcmVuY2U7ICAvLy9cblxuICAgIHJldHVybiBjb21wYXJlc1RvUmVmZXJlbmNlO1xuICB9XG5cbiAgbWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpIHsgcmV0dXJuIHRoaXMubGFiZWwubWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpOyB9XG5cbiAgdmVyaWZ5ID0gYnJlYWthYmxlKGZ1bmN0aW9uIChjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgZm9yd2FyZCA9IGN1dChmb3J3YXJkLCBiYWNrKTsgLy8vXG5cbiAgICBjb25zdCBzY2hlbWFTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEuLi5gKTtcblxuICAgIHJldHVybiBpc29sYXRlKChjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSA9PiB7XG4gICAgICByZXR1cm4gZW5jYXBzdWxhdGUoKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgdmVyaWZ5UHJvb2YgPSB0aGlzLnZlcmlmeVByb29mLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgIHZlcmlmeUxhYmVsID0gdGhpcy52ZXJpZnlMYWJlbC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICB2ZXJpZnlEZWR1Y3Rpb24gPSB0aGlzLnZlcmlmeURlZHVjdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICB2ZXJpZnlTdXBwb3NpdGlvbnMgPSB0aGlzLnZlcmlmeVN1cHBvc2l0aW9ucy5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHJldHVybiBhbGwoW1xuICAgICAgICAgIHZlcmlmeUxhYmVsLFxuICAgICAgICAgIHZlcmlmeVN1cHBvc2l0aW9ucyxcbiAgICAgICAgICB2ZXJpZnlEZWR1Y3Rpb24sXG4gICAgICAgICAgdmVyaWZ5UHJvb2ZcbiAgICAgICAgXSwgY29udGV4dCwgKGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgICAgICByZXR1cm4gZm9yd2FyZChiYWNrKTtcbiAgICAgICAgfSwgYmFjayk7XG4gICAgICB9LCB0aGlzLmNvbnN0cmFpbnRzLCBjb250ZXh0KTtcbiAgICB9LCBjb250ZXh0LCAoY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29uc3Qgc2NoZW1hID0gdGhpczsgLy8vXG5cbiAgICAgIGNvbnRleHQuYWRkU2NoZW1hKHNjaGVtYSk7XG5cbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEuYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgIH0sIChleGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIGJhY2soZXhjZXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC50cmFjZShgVW5hYmxlIHRvIHZlcmlmeSB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hLmApO1xuXG4gICAgICByZXR1cm4gYmFjaygpO1xuICAgIH0pO1xuICB9KTtcblxuICBhcHBseSA9IHVuYnJlYWthYmxlKGZ1bmN0aW9uIChzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIGZvcndhcmQgPSBjdXQoZm9yd2FyZCwgYmFjayk7IC8vL1xuXG4gICAgY29uc3Qgc2NoZW1hU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIHNjaGVtYUFzc2VydGlvblN0cmluZyA9IHNjaGVtYUFzc2VydGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFwcGx5aW5nIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEgdG8gdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB2aWEgdGhlICAke3NjaGVtYUFzc2VydGlvblN0cmluZ30nIHNjaGVtYSBhc3NlcnRpb24uLi5gKTtcblxuICAgIHJldHVybiBpc29sYXRlKChzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgZm9yd2FyZCwgYmFjaykgPT4ge1xuICAgICAgcmV0dXJuIHJlY29uY2lsZSgoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCB1bmlmeUxpbmsgPSB0aGlzLnVuaWZ5TGluay5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICBhcHBseUNvbnN0cmFpbnRzID0gdGhpcy5hcHBseUNvbnN0cmFpbnRzLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgIHVuaWZ5RGVkdWNlZFN0YXRlbWVudCA9IHRoaXMudW5pZnlEZWR1Y2VkU3RhdGVtZW50LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgIHVuaWZ5U3VwcG9zZWRTdGF0ZW1lbnRzID0gdGhpcy51bmlmeVN1cHBvc2VkU3RhdGVtZW50cy5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHJldHVybiBhbGwoW1xuICAgICAgICAgIHVuaWZ5TGluayxcbiAgICAgICAgICBhcHBseUNvbnN0cmFpbnRzLFxuICAgICAgICAgIHVuaWZ5RGVkdWNlZFN0YXRlbWVudCxcbiAgICAgICAgICB1bmlmeVN1cHBvc2VkU3RhdGVtZW50c1xuICAgICAgICBdLCBzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgKHN0YXRlbWVudCwgc2NoZW1hQXNzZXJ0aW9uLCBjb250ZXh0LCBiYWNrKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGZvcndhcmQoYmFjayk7XG4gICAgICAgIH0sIGJhY2spO1xuICAgICAgfSwgY29udGV4dCk7XG4gICAgfSwgc3RhdGVtZW50LCBzY2hlbWFBc3NlcnRpb24sIGNvbnRleHQsIChzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4uYXBwbGllZCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hIHRvIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgdmlhIHRoZSAgJHtzY2hlbWFBc3NlcnRpb25TdHJpbmd9JyBzY2hlbWEgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgIH0sIChleGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIGJhY2soZXhjZXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC50cmFjZShgVW5hYmxlIHRvIGFwcGx5IHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEgdG8gdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB2aWEgdGhlICAke3NjaGVtYUFzc2VydGlvblN0cmluZ30nIHNjaGVtYSBhc3NlcnRpb24uYCk7XG5cbiAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHZlcmlmeUxhYmVsKGNvbnRleHQsIGZvcndhcmQsIGJhY2spIHtcbiAgICBjb25zdCBsYWJlbFN0cmluZyA9IHRoaXMubGFiZWwuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgc2NoZW1hU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYSdzICcke2xhYmVsU3RyaW5nfScgbGFiZWwuLi5gKTtcblxuICAgIHJldHVybiB0aGlzLmxhYmVsLnZlcmlmeShjb250ZXh0LCAoY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYSdzICcke2xhYmVsU3RyaW5nfScgbGFiZWwuYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgIH0sIGJhY2spO1xuICB9XG5cbiAgdmVyaWZ5UHJvb2YoY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIGNvbnN0IHNjaGVtYVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hJ3MgcHJvb2YuLi5gKTtcblxuICAgIGNvbnN0IHN0YXRlbWVudCA9IHRoaXMuZGVkdWN0aW9uLmdldFN0YXRlbWVudCgpO1xuXG4gICAgcmV0dXJuIHRoaXMucHJvb2YudmVyaWZ5KHN0YXRlbWVudCwgY29udGV4dCwgKGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyBwcm9vZi5gKTtcblxuICAgICAgcmV0dXJuIGZvcndhcmQoY29udGV4dCwgYmFjayk7XG4gICAgfSwgYmFjayk7XG4gIH1cblxuICB2ZXJpZnlEZWR1Y3Rpb24oY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIGNvbnN0IHNjaGVtYVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCksIC8vL1xuICAgICAgICAgIGRlZHVjdGlvblN0cmluZyA9IHRoaXMuZGVkdWN0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyAnJHtkZWR1Y3Rpb25TdHJpbmd9JyBkZWR1Y3Rpb24uLi5gKTtcblxuICAgIHJldHVybiB0aGlzLmRlZHVjdGlvbi52ZXJpZnkoY29udGV4dCwgKGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyAnJHtkZWR1Y3Rpb25TdHJpbmd9JyBkZWR1Y3Rpb24uYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgIH0sIGJhY2spO1xuICB9XG5cbiAgdmVyaWZ5U3VwcG9zaXRpb24oc3VwcG9zaXRpb24sIGNvbnRleHQsIGZvcndhcmQsIGJhY2spIHtcbiAgICBjb25zdCBzY2hlbWFTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpLCAvLy9cbiAgICAgICAgICBzdXBwb3NpdGlvblN0cmluZyA9IHN1cHBvc2l0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyAnJHtzdXBwb3NpdGlvblN0cmluZ30nIHN1cHBvc2l0aW9uLi4uYCk7XG5cbiAgICByZXR1cm4gc3VwcG9zaXRpb24udmVyaWZ5KGNvbnRleHQsIChjb250ZXh0LCBiYWNrKSA9PiB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hJ3MgJyR7c3VwcG9zaXRpb25TdHJpbmd9JyBzdXBwb3NpdGlvbi5gKTtcblxuICAgICAgcmV0dXJuIGZvcndhcmQoY29udGV4dCwgYmFjayk7XG4gICAgfSwgYmFjayk7XG4gIH1cblxuICB2ZXJpZnlTdXBwb3NpdGlvbnMoY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIGNvbnN0IHN1cHBvc2l0aW9uc0xlbmd0aCA9IHRoaXMuc3VwcG9zaXRpb25zLmxlbmd0aDtcblxuICAgIGlmIChzdXBwb3NpdGlvbnNMZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hJ3Mgc3VwcG9zaXRpb25zLi4uYCk7XG5cbiAgICByZXR1cm4gZm9yd2FyZHNFdmVyeSh0aGlzLnN1cHBvc2l0aW9ucywgKHN1cHBvc2l0aW9uLCBjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52ZXJpZnlTdXBwb3NpdGlvbihzdXBwb3NpdGlvbiwgY29udGV4dCwgKGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgICAgY29uc3QgZmFjdE9yU3VicHJvb2YgPSBzdXBwb3NpdGlvbjsgLy8vXG5cbiAgICAgICAgY29udGV4dC5hZGRGYWN0T3JTdWJwcm9vZihmYWN0T3JTdWJwcm9vZik7XG5cbiAgICAgICAgY29udGV4dC5hc3NpZ25Bc3NpZ25tZW50cygpO1xuXG4gICAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgICAgfSwgYmFjayk7XG4gICAgfSwgY29udGV4dCwgKGNvbnRleHQsIGJhY2spID0+IHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEncyBzdXBwb3NpdGlvbnMuYCk7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGNvbnRleHQsIGJhY2spO1xuICAgIH0sIGJhY2spO1xuICB9XG5cbiAgYXBwbHlDb25zdHJhaW50cyhzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgZm9yd2FyZCwgYmFjaykge1xuICAgIHJldHVybiBzY2hlbWFBc3NlcnRpb24uZ2V0SW1wbGljaXRBc3N1bXB0aW9ucyhjb250ZXh0LCAoaW1wbGljaXRBc3N1bXB0aW9ucywgY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29uc3QgYXNzdW1wdGlvbnMgPSBzY2hlbWFBc3NlcnRpb24uZ2V0QXNzdW1wdGlvbnMoKSxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzU3RyaW5nID0gY29uc3RyYWludHNTdHJpbmdGcm9vQ29uc3RyYWludHModGhpcy5jb25zdHJhaW50cyk7XG5cbiAgICAgIGNvbnRleHQudHJhY2UoYEFwcGx5aW5nIHRoZSBzY2hlbWEncyAnJHtjb25zdHJhaW50c1N0cmluZ30nIGNvbnN0cmFpbnRzLi4uYCk7XG5cbiAgICAgIHJldHVybiBldmVyeSh0aGlzLmNvbnN0cmFpbnRzLCAoY29uc3RyYWludCwgY29udGV4dCwgZm9yd2FyZCwgYmFjaykgPT4ge1xuICAgICAgICByZXR1cm4gY29uc3RyYWludC5hcHBseShpbXBsaWNpdEFzc3VtcHRpb25zLCBhc3N1bXB0aW9ucywgY29udGV4dCwgZm9yd2FyZCwgYmFjayk7XG4gICAgICB9LCBjb250ZXh0LCAoY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi5hcHBsaWVkIHRoZSBzY2hlbWEncyAnJHtjb25zdHJhaW50c1N0cmluZ30nIGNvbnN0cmFpbnRzLmApO1xuXG4gICAgICAgIHJldHVybiBmb3J3YXJkKHN0YXRlbWVudCwgc2NoZW1hQXNzZXJ0aW9uLCBjb250ZXh0LCBiYWNrKTtcbiAgICAgIH0sIChleGNlcHRpb24pID0+IHtcbiAgICAgICAgaWYgKGV4Y2VwdGlvbikge1xuICAgICAgICAgIHJldHVybiBiYWNrKGV4Y2VwdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBVbmFibGUgdG8gYXBwbHkgdGhlIHNjaGVtYSdzICcke2NvbnN0cmFpbnRzU3RyaW5nfScgY29uc3RyYWludHMuYCk7XG5cbiAgICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH0sIGJhY2spO1xuICB9XG5cbiAgdW5pZnlMaW5rKHN0YXRlbWVudCwgc2NoZW1hQXNzZXJ0aW9uLCBjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgY29uc3QgbGluayA9IHNjaGVtYUFzc2VydGlvbi5nZXRMaW5rKCksXG4gICAgICAgICAgc2NoZW1hU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIHNjaGVtYUFzc2VydGlvblN0cmluZyA9IHNjaGVtYUFzc2VydGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzY2hlbWFBc3NlcnRpb25TdHJpbmd9JyBzY2hlbWEgYXNzZXJ0aW9uJ3MgbGluayB3aXRoIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEuLi5gKTtcblxuICAgIHJldHVybiB0aGlzLmxhYmVsLnVuaWZ5TGluayhsaW5rLCBjb250ZXh0LCAoY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c2NoZW1hQXNzZXJ0aW9uU3RyaW5nfScgc2NoZW1hIGFzc2VydGlvbidzIGxpbmsgd2l0aCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hLmApO1xuXG4gICAgICByZXR1cm4gZm9yd2FyZChzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgYmFjayk7XG4gICAgfSwgYmFjayk7XG4gIH1cblxuICB1bmlmeURlZHVjZWRTdGF0ZW1lbnQoc3RhdGVtZW50LCBzY2hlbWFBc3NlcnRpb24sIGNvbnRleHQsIGZvcndhcmQsIGJhY2spIHtcbiAgICBjb25zdCBkZWR1Y3Rpb25TdHJpbmcgPSB0aGlzLmRlZHVjdGlvbi5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBkZWR1Y2VkU3RhdGVtZW50ID0gc3RhdGVtZW50LmZpbmREZWR1Y2VkU3RhdGVtZW50KGNvbnRleHQpLFxuICAgICAgICAgIGRlZHVjZWRTdGF0ZW1lbnRTdHJpbmcgPSBkZWR1Y2VkU3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke2RlZHVjZWRTdGF0ZW1lbnRTdHJpbmd9JyBkZWR1Y2VkIHN0YXRlbWVudCB3aXRoIHRoZSAnJHtkZWR1Y3Rpb25TdHJpbmd9JyBkZWR1Y3Rpbm8uLi5gKTtcblxuICAgIHJldHVybiBpc29sYXRlKChzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgZm9yd2FyZCwgYmFjaykgPT4ge1xuICAgICAgY29uc3QgZGVkdWN0aW9uQ29udGV4dCA9IHRoaXMuZGVkdWN0aW9uLmdldENvbnRleHQoKSwgLy8vXG4gICAgICAgICAgICBnZW5lcmFsQ29udGV4dCA9IGRlZHVjdGlvbkNvbnRleHQ7IC8vL1xuXG4gICAgICByZXR1cm4gcmVjb25jaWxlKChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRlbWVudCA9IGRlZHVjZWRTdGF0ZW1lbnQsIC8vL1xuICAgICAgICAgICAgICBzcGVjaWZpY0NvbnRleHQgPSBjb250ZXh0OyAgLy8vXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVkdWN0aW9uLnVuaWZ5U3RhdGVtZW50KHN0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIGJhY2spID0+IHtcbiAgICAgICAgICBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0OyAgLy8vXG5cbiAgICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuXG4gICAgICAgICAgcmV0dXJuIGZvcndhcmQoYmFjayk7XG4gICAgICAgIH0sIGJhY2spO1xuICAgICAgfSwgY29udGV4dCk7XG4gICAgfSwgc3RhdGVtZW50LCBzY2hlbWFBc3NlcnRpb24sIGNvbnRleHQsIChzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7ZGVkdWNlZFN0YXRlbWVudFN0cmluZ30nIGRlZHVjZWQgc3RhdGVtZW50IHdpdGggdGhlICcke2RlZHVjdGlvblN0cmluZ30nIGRlZHVjdGlvbi5gKTtcblxuICAgICAgcmV0dXJuIGZvcndhcmQoc3RhdGVtZW50LCBzY2hlbWFBc3NlcnRpb24sIGNvbnRleHQsIGJhY2spO1xuICAgIH0sIGJhY2spO1xuICB9XG5cbiAgdW5pZnlTdXBwb3NlZFN0YXRlbWVudChzdXBwb3NlZFN0YXRlbWVudCwgY29udGV4dCwgZm9yd2FyZCwgYmFjaywgaW5kZXgpIHtcbiAgICBjb25zdCBzdXBwb3NpdGlvbiA9IHRoaXMuc3VwcG9zaXRpb25zW2luZGV4XSxcbiAgICAgICAgICBzdXBwb3NpdGlvblN0cmluZyA9IHN1cHBvc2l0aW9uLmdldFN0cmluZygpLFxuICAgICAgICAgIHN1cHBvc2VkU3RhdGVtZW50U3RyaW5nID0gc3VwcG9zZWRTdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3VwcG9zZWRTdGF0ZW1lbnRTdHJpbmd9JyBzdXBwb3NlZCBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7c3VwcG9zaXRpb25TdHJpbmd9JyBkZWR1Y3Rpbm8uLi5gKTtcblxuICAgIHJldHVybiBpc29sYXRlKChzdXBwb3NlZFN0YXRlbWVudCwgY29udGV4dCwgZm9yd2FyZCwgYmFjaykgPT4ge1xuICAgICAgY29uc3Qgc3VwcG9zaXRpb25Db250ZXh0ID0gc3VwcG9zaXRpb24uZ2V0Q29udGV4dCgpLCAvLy9cbiAgICAgICAgICAgIGdlbmVyYWxDb250ZXh0ID0gc3VwcG9zaXRpb25Db250ZXh0OyAvLy9cblxuICAgICAgcmV0dXJuIHJlY29uY2lsZSgoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBzdGF0ZW1lbnQgPSBzdXBwb3NlZFN0YXRlbWVudCwgLy8vXG4gICAgICAgICAgICAgIHNwZWNpZmljQ29udGV4dCA9IGNvbnRleHQ7ICAvLy9cblxuICAgICAgICByZXR1cm4gc3VwcG9zaXRpb24udW5pZnlTdGF0ZW1lbnQoc3RhdGVtZW50LCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCAoZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgYmFjaykgPT4ge1xuICAgICAgICAgIGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQ7ICAvLy9cblxuICAgICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG5cbiAgICAgICAgICByZXR1cm4gZm9yd2FyZChiYWNrKTtcbiAgICAgICAgfSwgYmFjayk7XG4gICAgICB9LCBjb250ZXh0KTtcbiAgICB9LCBzdXBwb3NlZFN0YXRlbWVudCwgY29udGV4dCwgKHN1cHBvc2VkU3RhdGVtZW50LCBjb250ZXh0LCBiYWNrKSA9PiB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzdXBwb3NlZFN0YXRlbWVudFN0cmluZ30nIHN1cHBvc2VkIHN0YXRlbWVudCB3aXRoIHRoZSAnJHtzdXBwb3NpdGlvblN0cmluZ30nIHN1cHBvc2l0aW9uLmApO1xuXG4gICAgICByZXR1cm4gZm9yd2FyZChjb250ZXh0LCBiYWNrKTtcbiAgICB9LCBiYWNrKTtcbiAgfVxuXG4gIHVuaWZ5U3VwcG9zZWRTdGF0ZW1lbnRzKHN0YXRlbWVudCwgc2NoZW1hQXNzZXJ0aW9uLCBjb250ZXh0LCBmb3J3YXJkLCBiYWNrKSB7XG4gICAgY29uc3Qgc3VwcG9zaXRpb25zTGVuZ3RoID0gdGhpcy5zdXBwb3NpdGlvbnMubGVuZ3RoLFxuICAgICAgICAgIHN1cHBvc2VkU3RhdGVtZW50cyA9IHN0YXRlbWVudC5maW5kU3VwcG9zZWRTdGF0ZW1lbnRzKGNvbnRleHQpLFxuICAgICAgICAgIHN1cHBvc2VkU3RhdGVtZW50c0xlbmd0aCA9IHN1cHBvc2VkU3RhdGVtZW50cy5sZW5ndGg7XG5cbiAgICBpZiAoc3VwcG9zaXRpb25zTGVuZ3RoICE9PSBzdXBwb3NlZFN0YXRlbWVudHNMZW5ndGgpIHtcbiAgICAgIGNvbnRleHQudHJhY2UoYFRoZSBudW1iZXIgb2YgdGhlIHNjaGVtYSdzIHN1cHBvc2l0aW9ucyBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIHRoZSBzY2hlZW1hIGFzc2VydGlvbidzIHN1cHBvc2VkIHN0YXRlbWVudHMuYCk7XG5cbiAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhY2t3YXJkc0V2ZXJ5KHN1cHBvc2VkU3RhdGVtZW50cywgKHN1cHBvc2VkU3RhdGVtZW50LCBjb250ZXh0LCBmb3J3YXJkLCBiYWNrLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudW5pZnlTdXBwb3NlZFN0YXRlbWVudChzdXBwb3NlZFN0YXRlbWVudCwgY29udGV4dCwgZm9yd2FyZCwgYmFjaywgaW5kZXgpO1xuICAgIH0sIGNvbnRleHQsIChjb250ZXh0LCBiYWNrKSA9PiB7XG4gICAgICByZXR1cm4gZm9yd2FyZChzdGF0ZW1lbnQsIHNjaGVtYUFzc2VydGlvbiwgY29udGV4dCwgYmFjayk7XG4gICAgfSwgYmFjayk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgbGV0IGpzb247XG5cbiAgICBjb25zdCBsYWJlbEpTT04gPSBsYWJlbFRvTGFiZWxKU09OKHRoaXMubGFiZWwpLFxuICAgICAgICAgIGRlZHVjdGlvbkpTT04gPSBkZWR1Y3Rpb25Ub0RlZHVjdGlvbkpTT04odGhpcy5kZWR1Y3Rpb24pLFxuICAgICAgICAgIGNvbnN0cmFpbnRzSlNPTiA9IGNvbnN0cmFpbnRzVG9Db25zdHJhaW50c0pTT04odGhpcy5jb25zdHJhaW50cyksXG4gICAgICAgICAgc3VwcG9zaXRpb25zSlNPTiA9IHN1cHBvc2l0aW9uc1RvU3VwcG9zaXRpb25zSlNPTih0aGlzLnN1cHBvc2l0aW9ucyksXG4gICAgICAgICAgc3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTtcblxuICAgIGxldCBicmVha1BvaW50O1xuXG4gICAgYnJlYWtQb2ludCA9IHRoaXMuZ2V0QnJlYWtQb2ludCgpO1xuXG4gICAgY29uc3QgYnJlYWtQb2ludEpTT04gPSBicmVha1BvaW50VG9CcmVha1BvaW50SlNPTihicmVha1BvaW50KTtcblxuICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50SlNPTjsgIC8vL1xuXG4gICAgY29uc3QgbGFiZWwgPSBsYWJlbEpTT04sICAvLy9cbiAgICAgICAgICBkZWR1Y3Rpb24gPSBkZWR1Y3Rpb25KU09OLCAgLy8vXG4gICAgICAgICAgY29uc3RyYWludHMgPSBjb25zdHJhaW50c0pTT04sICAvLy9cbiAgICAgICAgICBzdXBwb3NpdGlvbnMgPSBzdXBwb3NpdGlvbnNKU09OOyAgLy8vXG5cbiAgICBqc29uID0ge1xuICAgICAgc3RyaW5nLFxuICAgICAgYnJlYWtQb2ludCxcbiAgICAgIGxhYmVsLFxuICAgICAgZGVkdWN0aW9uLFxuICAgICAgY29uc3RyYWludHMsXG4gICAgICBzdXBwb3NpdGlvbnNcbiAgICB9O1xuXG4gICAgcmV0dXJuIGpzb247XG4gIH1cblxuICBzdGF0aWMgbmFtZSA9IFwiU2NoZW1hXCI7XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbnRleHQpIHtcbiAgICBjb25zdCBsYWJlbCA9IGxhYmVsRnJvbUpTT04oanNvbiwgY29udGV4dCksXG4gICAgICAgICAgZGVkdWN0aW9uID0gZGVkdWN0aW9uRnJvbUpTT04oanNvbiwgY29udGV4dCksXG4gICAgICAgICAgY29uc3RyYWludHMgPSBjb25zdHJhaW50c0Zyb21KU09OKGpzb24sIGNvbnRleHQpLFxuICAgICAgICAgIHN1cHBvc2l0aW9ucyA9IHN1cHBvc2l0aW9uc0Zyb21KU09OKGpzb24sIGNvbnRleHQpLFxuICAgICAgICAgIHN0cmluZyA9IHNjaGVtYVN0cmluZ0Zyb21MYWJlbFN1cHBvc2l0aW9uc0FuZERlZHVjdGlvbihsYWJlbCwgc3VwcG9zaXRpb25zLCBkZWR1Y3Rpb24pLFxuICAgICAgICAgIG5vZGUgPSBudWxsLFxuICAgICAgICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50RnJvbUpTT04oanNvbiksXG4gICAgICAgICAgcHJvb2YgPSBudWxsLFxuICAgICAgICAgIHNjaGVtYSA9IG5ldyBTY2hlbWEoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCBsYWJlbCwgc3VwcG9zaXRpb25zLCBkZWR1Y3Rpb24sIHByb29mLCBjb25zdHJhaW50cyk7XG5cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG59KTtcbiJdLCJuYW1lcyI6WyJjdXQiLCJhbGwiLCJldmVyeSIsImZvcndhcmRzRXZlcnkiLCJiYWNrd2FyZHNFdmVyeSIsImNvbnRpbnVhdGlvblV0aWxpdGllcyIsImJyZWFrYWJsZSIsInVuYnJlYWthYmxlIiwiYnJlYWtQb2ludEZyb21KU09OIiwiYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04iLCJicmVha1BvaW50VXRpbGl0aWVzIiwiZGVmaW5lIiwiU2NoZW1hIiwiRWxlbWVudCIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwiYnJlYWtQb2ludCIsImxhYmVsIiwic3VwcG9zaXRpb25zIiwiZGVkdWN0aW9uIiwicHJvb2YiLCJjb25zdHJhaW50cyIsImdldExhYmVsIiwiZ2V0U3VwcG9zaXRpb25zIiwiZ2V0RGVkdWN0aW9uIiwiZ2V0UHJvb2YiLCJnZXRNQ29uc3RyYWludCIsImlzQ29uZGl0aW9uYWwiLCJzdXBwb3NpdGlvbnNMZW5ndGgiLCJsZW5ndGgiLCJjb25kaXRpb25hbCIsImNvbXBhcmVSZWZlcmVuY2UiLCJyZWZlcmVuY2UiLCJsYWJlbENvbXBhcmVzVG9SZWZmZXJlbmNlIiwiY29tcGFyZXNUb1JlZmVyZW5jZSIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZU5vZGUiLCJ2ZXJpZnkiLCJmb3J3YXJkIiwiYmFjayIsInNjaGVtYVN0cmluZyIsImdldFN0cmluZyIsInRyYWNlIiwiaXNvbGF0ZSIsImVuY2Fwc3VsYXRlIiwidmVyaWZ5UHJvb2YiLCJiaW5kIiwidmVyaWZ5TGFiZWwiLCJ2ZXJpZnlEZWR1Y3Rpb24iLCJ2ZXJpZnlTdXBwb3NpdGlvbnMiLCJzY2hlbWEiLCJhZGRTY2hlbWEiLCJkZWJ1ZyIsImV4Y2VwdGlvbiIsImFwcGx5Iiwic3RhdGVtZW50Iiwic2NoZW1hQXNzZXJ0aW9uIiwic3RhdGVtZW50U3RyaW5nIiwic2NoZW1hQXNzZXJ0aW9uU3RyaW5nIiwicmVjb25jaWxlIiwidW5pZnlMaW5rIiwiYXBwbHlDb25zdHJhaW50cyIsInVuaWZ5RGVkdWNlZFN0YXRlbWVudCIsInVuaWZ5U3VwcG9zZWRTdGF0ZW1lbnRzIiwibGFiZWxTdHJpbmciLCJnZXRTdGF0ZW1lbnQiLCJkZWR1Y3Rpb25TdHJpbmciLCJ2ZXJpZnlTdXBwb3NpdGlvbiIsInN1cHBvc2l0aW9uIiwic3VwcG9zaXRpb25TdHJpbmciLCJmYWN0T3JTdWJwcm9vZiIsImFkZEZhY3RPclN1YnByb29mIiwiYXNzaWduQXNzaWdubWVudHMiLCJnZXRJbXBsaWNpdEFzc3VtcHRpb25zIiwiaW1wbGljaXRBc3N1bXB0aW9ucyIsImFzc3VtcHRpb25zIiwiZ2V0QXNzdW1wdGlvbnMiLCJjb25zdHJhaW50c1N0cmluZyIsImNvbnN0cmFpbnRzU3RyaW5nRnJvb0NvbnN0cmFpbnRzIiwiY29uc3RyYWludCIsImxpbmsiLCJnZXRMaW5rIiwiZGVkdWNlZFN0YXRlbWVudCIsImZpbmREZWR1Y2VkU3RhdGVtZW50IiwiZGVkdWNlZFN0YXRlbWVudFN0cmluZyIsImRlZHVjdGlvbkNvbnRleHQiLCJnZXRDb250ZXh0IiwiZ2VuZXJhbENvbnRleHQiLCJzcGVjaWZpY0NvbnRleHQiLCJ1bmlmeVN0YXRlbWVudCIsImNvbW1pdCIsInVuaWZ5U3VwcG9zZWRTdGF0ZW1lbnQiLCJzdXBwb3NlZFN0YXRlbWVudCIsImluZGV4Iiwic3VwcG9zZWRTdGF0ZW1lbnRTdHJpbmciLCJzdXBwb3NpdGlvbkNvbnRleHQiLCJzdXBwb3NlZFN0YXRlbWVudHMiLCJmaW5kU3VwcG9zZWRTdGF0ZW1lbnRzIiwic3VwcG9zZWRTdGF0ZW1lbnRzTGVuZ3RoIiwidG9KU09OIiwianNvbiIsImxhYmVsSlNPTiIsImxhYmVsVG9MYWJlbEpTT04iLCJkZWR1Y3Rpb25KU09OIiwiZGVkdWN0aW9uVG9EZWR1Y3Rpb25KU09OIiwiY29uc3RyYWludHNKU09OIiwiY29uc3RyYWludHNUb0NvbnN0cmFpbnRzSlNPTiIsInN1cHBvc2l0aW9uc0pTT04iLCJzdXBwb3NpdGlvbnNUb1N1cHBvc2l0aW9uc0pTT04iLCJnZXRCcmVha1BvaW50IiwiYnJlYWtQb2ludEpTT04iLCJuYW1lIiwiZnJvbUpTT04iLCJsYWJlbEZyb21KU09OIiwiZGVkdWN0aW9uRnJvbUpTT04iLCJjb25zdHJhaW50c0Zyb21KU09OIiwic3VwcG9zaXRpb25zRnJvbUpTT04iLCJzY2hlbWFTdHJpbmdGcm9tTGFiZWxTdXBwb3NpdGlvbnNBbmREZWR1Y3Rpb24iXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQW1CQTs7O2VBQUE7OztnQ0FqQm9FOzBCQUU3Qzt5QkFDeUI7d0JBQ2dEO3NCQVFqRDtBQUUvQyxNQUFNLEVBQUVBLEdBQUcsRUFBRUMsR0FBRyxFQUFFQyxLQUFLLEVBQUVDLGFBQWEsRUFBRUMsY0FBYyxFQUFFLEdBQUdDLHFDQUFxQixFQUMxRSxFQUFFQyxTQUFTLEVBQUVDLFdBQVcsRUFBRUMsa0JBQWtCLEVBQUVDLDBCQUEwQixFQUFFLEdBQUdDLG1DQUFtQjtNQUV0RyxXQUFlQyxJQUFBQSxnQkFBTSxFQUFDLE1BQU1DLGVBQWVDLHVCQUFPO0lBQ2hELFlBQVlDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxJQUFJLEVBQUVDLFVBQVUsRUFBRUMsS0FBSyxFQUFFQyxZQUFZLEVBQUVDLFNBQVMsRUFBRUMsS0FBSyxFQUFFQyxXQUFXLENBQUU7UUFDakcsS0FBSyxDQUFDUixTQUFTQyxRQUFRQyxNQUFNQztRQUU3QixJQUFJLENBQUNDLEtBQUssR0FBR0E7UUFDYixJQUFJLENBQUNDLFlBQVksR0FBR0E7UUFDcEIsSUFBSSxDQUFDQyxTQUFTLEdBQUdBO1FBQ2pCLElBQUksQ0FBQ0MsS0FBSyxHQUFHQTtRQUNiLElBQUksQ0FBQ0MsV0FBVyxHQUFHQTtJQUNyQjtJQUVBQyxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUNMLEtBQUs7SUFDbkI7SUFFQU0sa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDTCxZQUFZO0lBQzFCO0lBRUFNLGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQ0wsU0FBUztJQUN2QjtJQUVBTSxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUNMLEtBQUs7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
|