xdbc 1.0.199 → 1.0.200
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/dist/bundle.js +4 -4
- package/package.json +1 -1
- package/src/DBC/COMPARISON/GREATER.ts +3 -3
package/dist/bundle.js
CHANGED
|
@@ -772,15 +772,15 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
772
772
|
class GREATER extends _COMPARISON__WEBPACK_IMPORTED_MODULE_0__.COMPARISON {
|
|
773
773
|
/** See {@link COMPARISON.PRE }. */
|
|
774
774
|
static PRE(equivalent, equalityPermitted = false, invert = false, path = undefined, hint = undefined, dbc = undefined) {
|
|
775
|
-
return _COMPARISON__WEBPACK_IMPORTED_MODULE_0__.COMPARISON.PRE(equivalent, false, false, path,
|
|
775
|
+
return _COMPARISON__WEBPACK_IMPORTED_MODULE_0__.COMPARISON.PRE(equivalent, false, false, path, hint, dbc);
|
|
776
776
|
}
|
|
777
777
|
/** See {@link COMPARISON.POST }. */
|
|
778
778
|
static POST(equivalent, equalityPermitted = false, invert = false, path = undefined, hint = undefined, dbc = undefined) {
|
|
779
|
-
return _COMPARISON__WEBPACK_IMPORTED_MODULE_0__.COMPARISON.POST(equivalent, false, false, path,
|
|
779
|
+
return _COMPARISON__WEBPACK_IMPORTED_MODULE_0__.COMPARISON.POST(equivalent, false, false, path, hint, dbc);
|
|
780
780
|
}
|
|
781
781
|
/** See {@link COMPARISON.INVARIANT }. */
|
|
782
782
|
static INVARIANT(equivalent, equalityPermitted = false, invert = false, path = undefined, hint = undefined, dbc = undefined) {
|
|
783
|
-
return _COMPARISON__WEBPACK_IMPORTED_MODULE_0__.COMPARISON.INVARIANT(equivalent, false, false, path,
|
|
783
|
+
return _COMPARISON__WEBPACK_IMPORTED_MODULE_0__.COMPARISON.INVARIANT(equivalent, false, false, path, hint, dbc);
|
|
784
784
|
}
|
|
785
785
|
/** See {@link COMPARISON.constructor }. */
|
|
786
786
|
constructor(equivalent) {
|
|
@@ -2058,4 +2058,4 @@ catch (X) {
|
|
|
2058
2058
|
|
|
2059
2059
|
/******/ })()
|
|
2060
2060
|
;
|
|
2061
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9BRS50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9DT01QQVJJU09OLnRzIiwid2VicGFjazovL3hkYmMvLi9zcmMvREJDL0NPTVBBUklTT04vR1JFQVRFUi50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9DT01QQVJJU09OL0dSRUFURVJfT1JfRVFVQUwudHMiLCJ3ZWJwYWNrOi8veGRiYy8uL3NyYy9EQkMvQ09NUEFSSVNPTi9MRVNTLnRzIiwid2VicGFjazovL3hkYmMvLi9zcmMvREJDL0NPTVBBUklTT04vTEVTU19PUl9FUVVBTC50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9FUS50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9FUS9ESUZGRVJFTlQudHMiLCJ3ZWJwYWNrOi8veGRiYy8uL3NyYy9EQkMvSU5TVEFOQ0UudHMiLCJ3ZWJwYWNrOi8veGRiYy8uL3NyYy9EQkMvUkVHRVgudHMiLCJ3ZWJwYWNrOi8veGRiYy8uL3NyYy9EQkMvVFlQRS50cyIsIndlYnBhY2s6Ly94ZGJjL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3hkYmMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3hkYmMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly94ZGJjL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8veGRiYy8uL3NyYy9EZW1vLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJvdmlkZXMgYSAqKkQqKmVzaWduICoqQioqeSAqKkMqKm9udHJhY3QgRnJhbWV3b3JrIHVzaW5nIGRlY29yYXRvcnMuXG4gKlxuICogQHJlbWFya3NcbiAqIE1haW50YWluZXI6IENhbGxhcmksIFNhbHZhdG9yZSAoWERCQ0BXYVhDb2RlLm5ldCkgKi9cbmV4cG9ydCBjbGFzcyBEQkMge1xuICAgIHN0YXRpYyBnZXRIb3N0KCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IGdsb2JhbFRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXREQkMoZGJjKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBkYmMgIT09IG51bGwgJiYgZGJjICE9PSB2b2lkIDAgPyBkYmMgOiBcIldhWENvZGUuREJDXCI7XG4gICAgICAgIGlmIChEQkMuZGJjQ2FjaGUuaGFzKHBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gREJDLmRiY0NhY2hlLmdldChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IERCQy5yZXNvbHZlREJDUGF0aChEQkMuZ2V0SG9zdCgpLCBwYXRoKTtcbiAgICAgICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgICAgICBEQkMuZGJjQ2FjaGUuc2V0KHBhdGgsIHJlc29sdmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGEgdW5pcXVlIGtleSBmb3Igc3RvcmluZyBwYXJhbWV0ZXIgdmFsdWUgcmVxdWVzdHMuXG4gICAgICogRm9ybWF0OiBcIkNsYXNzTmFtZTptZXRob2ROYW1lXCJcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0UmVxdWVzdEtleSh0YXJnZXQsIG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSB0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nID8gdGFyZ2V0Lm5hbWUgOiAoKF9hID0gdGFyZ2V0LmNvbnN0cnVjdG9yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmFtZSkgfHwgJ1Vua25vd24nO1xuICAgICAgICByZXR1cm4gYCR7Y2xhc3NOYW1lfToke1N0cmluZyhtZXRob2ROYW1lKX1gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlIGEgcmVxdWVzdCB0byBnZXQgdGhlIHZhbHVlIG9mIGEgY2VydGFpbiBwYXJhbWV0ZXIgb2Ygc3BlY2lmaWMgbWV0aG9kIGluIGEgc3BlY2lmaWMge0BsaW5rIG9iamVjdCB9LlxuICAgICAqIFRoYXQgcmVxdWVzdCBnZXRzIGVubGlzdGVkIGluIHtAbGluayBwYXJhbVZhbHVlUmVxdWVzdHMgfSB3aGljaCBpcyB1c2VkIGJ5IHtAbGluayBQYXJhbXZhbHVlUHJvdmlkZXJ9IHRvIGludm9rZSB0aGVcbiAgICAgKiBnaXZlbiBcInJlY2VwdG9yXCIgd2l0aCB0aGUgcGFyYW1ldGVyIHZhbHVlIHN0b3JlZCBpbiB0aGVyZS4gVGh1cyBhIHBhcmFtZXRlciBkZWNvcmF0b3IgdXNpbmcgdGhpcyBtZXRob2Qgd2lsbFxuICAgICAqIG5vdCByZWNlaXZlIGFueSB2YWx1ZSBvZiB0aGUgdG9wIG1ldGhvZCBpcyBub3QgdGFnZ2VkIHdpdGgge0BsaW5rIFBhcmFtdmFsdWVQcm92aWRlcn0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFyZ2V0XHRcdFRoZSB7QGxpbmsgb2JqZWN0IH0gY29udGFpbmluZyB0aGUgbWV0aG9kIHdpdGggdGhlIHBhcmFtZXRlciB3aGljaCdzIHZhbHVlIGlzIHJlcXVlc3RlZC5cbiAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZVx0VGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB3aXRoIHRoZSBwYXJhbWV0ZXIgd2hpY2gncyB2YWx1ZSBpcyByZXF1ZXN0ZWQuXG4gICAgICogQHBhcmFtIGluZGV4XHRcdFx0VGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgd2hpY2gncyB2YWx1ZSBpcyByZXF1ZXN0ZWQuXG4gICAgICogQHBhcmFtIHJlY2VwdG9yXHRcdFRoZSBtZXRob2QgdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXItdmFsdWUgc2hhbGwgYmUgcGFzc2VkIHRvIHdoZW4gaXQgYmVjb21lcyBhdmFpbGFibGUuICovXG4gICAgc3RhdGljIHJlcXVlc3RQYXJhbVZhbHVlKHRhcmdldCwgbWV0aG9kTmFtZSwgaW5kZXgsIFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogR290dGEgYmUgYW55IHNpbmNlIHBhcmFtZXRlci12YWx1ZXMgbWF5IGJlIHVuZGVmaW5lZC5cbiAgICByZWNlcHRvcikge1xuICAgICAgICBjb25zdCBrZXkgPSBEQkMuZ2V0UmVxdWVzdEtleSh0YXJnZXQsIG1ldGhvZE5hbWUpO1xuICAgICAgICBpZiAoREJDLnBhcmFtVmFsdWVSZXF1ZXN0cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgaWYgKERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuZ2V0KGtleSkuaGFzKGluZGV4KSkge1xuICAgICAgICAgICAgICAgIERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuZ2V0KGtleSkuZ2V0KGluZGV4KS5wdXNoKHJlY2VwdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuZ2V0KGtleSkuc2V0KGluZGV4LCBuZXcgQXJyYXkocmVjZXB0b3IpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuc2V0KGtleSwgbmV3IE1hcChbXG4gICAgICAgICAgICAgICAgW2luZGV4LCBuZXcgQXJyYXkocmVjZXB0b3IpXSxcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZC1kZWNvcmF0b3IgZmFjdG9yeSBjaGVja2luZyB0aGUge0BsaW5rIHBhcmFtVmFsdWVSZXF1ZXN0cyB9IGZvciB2YWx1ZS1yZXF1ZXN0cyBvZiB0aGUgbWV0aG9kJ3MgcGFyYW1ldGVyIHRodXNcbiAgICAgKiBhbHNvIHVzYWJsZSBvbiBzZXR0ZXJzLlxuICAgICAqIFdoZW4gZm91bmQgaXQgd2lsbCBpbnZva2UgdGhlIFwicmVjZXB0b3JcIiByZWdpc3RlcmVkIHRoZXJlLCBpbnRlciBhbGlhIGJ5IHtAbGluayByZXF1ZXN0UGFyYW1WYWx1ZSB9LCB3aXRoIHRoZVxuICAgICAqIHBhcmFtZXRlcidzIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhcmdldCBcdFx0VGhlIHtAbGluayBvYmplY3QgfSBob3N0aW5nIHRoZSB0YWdnZWQgbWV0aG9kIGFzIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSBcdFRoZSB0YWdnZWQgbWV0aG9kJ3MgbmFtZSBhcyBwcm92aWRlZCBieSB0aGUgcnVudGltZS5cbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBcdFRoZSB7QGxpbmsgUHJvcGVydHlEZXNjcmlwdG9yIH0gYXMgcHJvdmlkZWQgYnkgdGhlIHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFByb3BlcnR5RGVzY3JpcHRvciB9IHRoYXQgd2FzIHBhc3NlZCBieSB0aGUgcnVudGltZS4gKi9cbiAgICBzdGF0aWMgUGFyYW12YWx1ZVByb3ZpZGVyKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgICAgICBjb25zdCBpc1N0YXRpYyA9IHR5cGVvZiB0YXJnZXQgPT09ICdmdW5jdGlvbic7XG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogR290dGEgYmUgYW55IHNpbmNlIHBhcmFtZXRlci12YWx1ZXMgbWF5IGJlIHVuZGVmaW5lZC5cbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAvLyAjcmVnaW9uICAgQ2hlY2sgaWYgYSB2YWx1ZSBvZiBvbmUgb2YgdGhlIG1ldGhvZCdzIHBhcmFtZXRlciBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHBhc3MgaXQgdG8gdGhlXG4gICAgICAgICAgICAvLyAgICAgICAgICAgcmVjZXB0b3IsIGlmIHNvLlxuICAgICAgICAgICAgY29uc3QgYWN0dWFsVGFyZ2V0ID0gaXNTdGF0aWMgPyB0aGlzIDogdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IERCQy5nZXRSZXF1ZXN0S2V5KGFjdHVhbFRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgaWYgKERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuZ2V0KGtleSkua2V5cygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlY2VwdG9yIG9mIERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuZ2V0KGtleSkuZ2V0KGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VwdG9yKGFyZ3NbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk5vIHBhcmFtZXRlciB2YWx1ZSByZXF1ZXN0cyBmb3VuZCBmb3Iga2V5OlwiLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gI2VuZHJlZ2lvblx0Q2hlY2sgaWYgYSB2YWx1ZSBvZiBvbmUgb2YgdGhlIG1ldGhvZCdzIHBhcmFtZXRlciBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHBhc3MgaXQgdG8gdGhlXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgcmVjZXB0b3IsIGlmIHNvLlxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBQYXJhbWV0ZXItdmFsdWUgcmVxdWVzdHMuXG4gICAgLy8gI3JlZ2lvbiBDbGFzc1xuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHktZGVjb3JhdG9yIGZhY3Rvcnkgc2VydmluZyBhcyBhICoqRCoqZXNpZ24gKipCKip5ICoqQyoqb250cmFjdCBJbnZhcmlhbnQuXG4gICAgICogVGhpcyBpbnZhcmlhbnQgYWltcyB0byBjaGVjayB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG5vdCB0aGUgdmFsdWUgdG8gYmUgZ2V0IG9yIHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250cmFjdHMgVGhlIHtAbGluayBEQkMgfS1Db250cmFjdHMgdGhlIHZhbHVlIHNoYWxsIHVwaG9sZC5cbiAgICAgKlxuICAgICAqIEB0aHJvd3MgXHRBIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0gd2hlbmV2ZXIgdGhlIHByb3BlcnR5IGlzIHRyaWVkIHRvIGJlIGdldCBvciBzZXQgd2l0aG91dCB0aGUgaW5zdGFuY2Ugb2YgaXQncyBjbGFzc1xuICAgICAqIFx0XHRcdGZ1bGZpbGxpbmcgdGhlIHNwZWNpZmllZCAqKmNvbnRyYWN0cyoqLiAqL1xuICAgIHN0YXRpYyBkZWNDbGFzc0ludmFyaWFudChjb250cmFjdHMsIHBhdGggPSB1bmRlZmluZWQsIGRiYyA9IFwiV2FYQ29kZS5EQkNcIikge1xuICAgICAgICByZXR1cm4gKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpID0+IHtcbiAgICAgICAgICAgIGlmICghREJDLmdldERCQyhkYmMpLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrSW52YXJpYW50cykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsU2V0dGVyID0gZGVzY3JpcHRvci5zZXQ7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEdldHRlciA9IGRlc2NyaXB0b3IuZ2V0O1xuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOZWNlc3NhcnkgdG8gaW50ZXJjZXB0IFVOREVGSU5FRCBhbmQgTlVMTC5cbiAgICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICAgIC8vICNyZWdpb24gUmVwbGFjZSBvcmlnaW5hbCBwcm9wZXJ0eS5cbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIURCQy5nZXREQkMoZGJjKS5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFsVmFsdWUgPSBwYXRoID8gREJDLnJlc29sdmUodGhpcywgcGF0aCkgOiB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAvLyAjcmVnaW9uIENoZWNrIGlmIGFsbCBcImNvbnRyYWN0c1wiIGFyZSBmdWxmaWxsZWQuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJhY3Qgb2YgY29udHJhY3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250cmFjdC5jaGVjayhyZWFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkMuZ2V0REJDKGRiYykucmVwb3J0RmllbGRJbmZyaW5nZW1lbnQocmVzdWx0LCB0YXJnZXQsIHBhdGgsIHByb3BlcnR5S2V5LCByZWFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgaWYgYWxsIFwiY29udHJhY3RzXCIgYXJlIGZ1bGZpbGxlZC5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsR2V0dGVyW3Byb3BlcnR5S2V5XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldChuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIURCQy5nZXREQkMoZGJjKS5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFsVmFsdWUgPSBwYXRoID8gREJDLnJlc29sdmUodGhpcywgcGF0aCkgOiB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAvLyAjcmVnaW9uIENoZWNrIGlmIGFsbCBcImNvbnRyYWN0c1wiIGFyZSBmdWxmaWxsZWQuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJhY3Qgb2YgY29udHJhY3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250cmFjdC5jaGVjayhyZWFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkMuZ2V0REJDKGRiYykucmVwb3J0RmllbGRJbmZyaW5nZW1lbnQocmVzdWx0LCB0YXJnZXQsIHBhdGgsIHByb3BlcnR5S2V5LCByZWFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgaWYgYWxsIFwiY29udHJhY3RzXCIgYXJlIGZ1bGZpbGxlZC5cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyAjZW5kcmVnaW9uIFJlcGxhY2Ugb3JpZ2luYWwgcHJvcGVydHkuXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ2xhc3NcbiAgICAvLyAjcmVnaW9uIEludmFyaWFudFxuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHktZGVjb3JhdG9yIGZhY3Rvcnkgc2VydmluZyBhcyBhICoqRCoqZXNpZ24gKipCKip5ICoqQyoqb250cmFjdCBJbnZhcmlhbnQuXG4gICAgICogU2luY2UgdGhlIHZhbHVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgb3Igc2V0IGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkICoqY29udHJhY3RzKiogdGhlIHZhbHVlIHdpbGwgb25seSBiZSBjaGVja2VkXG4gICAgICogd2hlbiBhc3NpZ25pbmcgaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udHJhY3RzIFRoZSB7QGxpbmsgREJDIH0tQ29udHJhY3RzIHRoZSB2YWx1ZSBzaGFsbCB1cGhvbGQuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIFx0QSB7QGxpbmsgREJDLkluZnJpbmdlbWVudCB9IHdoZW5ldmVyIHRoZSBwcm9wZXJ0eSBpcyB0cmllZCB0byBiZSBzZXQgdG8gYSB2YWx1ZSB0aGF0IGRvZXMgbm90IGNvbXBseSB0byB0aGVcbiAgICAgKiBcdFx0XHRzcGVjaWZpZWQgKipjb250cmFjdHMqKiwgYnkgdGhlIHJldHVybmVkIG1ldGhvZC4qL1xuICAgIHN0YXRpYyBkZWNJbnZhcmlhbnQoY29udHJhY3RzLCBwYXRoID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuICh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIURCQy5nZXREQkMoZGJjKS5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSB0byBpbnRlcmNlcHQgVU5ERUZJTkVEIGFuZCBOVUxMLlxuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgLy8gI3JlZ2lvbiBSZXBsYWNlIG9yaWdpbmFsIHByb3BlcnR5LlxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgICAgICBzZXQobmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFEQkMuZ2V0REJDKGRiYykuZXhlY3V0aW9uU2V0dGluZ3MuY2hlY2tJbnZhcmlhbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhbFZhbHVlID0gcGF0aCA/IERCQy5yZXNvbHZlKG5ld1ZhbHVlLCBwYXRoKSA6IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAvLyAjcmVnaW9uIENoZWNrIGlmIGFsbCBcImNvbnRyYWN0c1wiIGFyZSBmdWxmaWxsZWQuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJhY3Qgb2YgY29udHJhY3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250cmFjdC5jaGVjayhyZWFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkMuZ2V0REJDKGRiYykucmVwb3J0RmllbGRJbmZyaW5nZW1lbnQocmVzdWx0LCB0YXJnZXQsIHBhdGgsIHByb3BlcnR5S2V5LCByZWFsVmFsdWUsIGhpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgaWYgYWxsIFwiY29udHJhY3RzXCIgYXJlIGZ1bGZpbGxlZC5cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyAjZW5kcmVnaW9uIFJlcGxhY2Ugb3JpZ2luYWwgcHJvcGVydHkuXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gSW52YXJpYW50XG4gICAgLy8gI3JlZ2lvbiBQb3N0Y29uZGl0aW9uXG4gICAgLyoqXG4gICAgICogQSBtZXRob2QgZGVjb3JhdG9yIGZhY3RvcnkgY2hlY2tpbmcgdGhlIHJlc3VsdCBvZiBhIG1ldGhvZCB3aGVuZXZlciBpdCBpcyBpbnZva2VkIHRodXMgYWxzbyB1c2FibGUgb24gZ2V0dGVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGVja1x0VGhlICoqKHRvQ2hlY2s6IGFueSwgb2JqZWN0LCBzdHJpbmcpID0+IGJvb2xlYW4gfCBzdHJpbmcqKiB0byB1c2UgZm9yIGNoZWNraW5nLlxuICAgICAqIEBwYXJhbSBkYmNcdFNlZSB7QGxpbmsgREJDLnJlc29sdmVEQkNQYXRoIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFRoZSBkb3R0ZWQgcGF0aCByZWZlcnJpbmcgdG8gdGhlIGFjdHVhbCB2YWx1ZSB0byBjaGVjaywgc3RhcnRpbmcgZm9ybSB0aGUgc3BlY2lmaWVkIG9uZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSAqKiggdGFyZ2V0IDogb2JqZWN0LCBwcm9wZXJ0eUtleSA6IHN0cmluZywgZGVzY3JpcHRvciA6IFByb3BlcnR5RGVzY3JpcHRvciApIDogUHJvcGVydHlEZXNjcmlwdG9yKipcbiAgICAgKiBcdFx0XHRpbnZva2VkIGJ5IFR5cGVzY3JpcHQuXG4gICAgICovXG4gICAgc3RhdGljIGRlY1Bvc3Rjb25kaXRpb24oXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOZWNlc3NhcnkgdG8gaW50ZXJjZXB0IFVOREVGSU5FRCBhbmQgTlVMTC5cbiAgICBjaGVjaywgZGJjID0gdW5kZWZpbmVkLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOZWNlc3NhcnkgdG8gaW50ZXJjZXB0IFVOREVGSU5FRCBhbmQgTlVMTC5cbiAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghREJDLmdldERCQyhkYmMpLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrUG9zdGNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vVGhpc0luU3RhdGljOiA8ZXhwbGFuYXRpb24+XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhbFZhbHVlID0gcGF0aCA/IERCQy5yZXNvbHZlKHJlc3VsdCwgcGF0aCkgOiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBjaGVjayhyZWFsVmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2hlY2tSZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgREJDLmdldERCQyhkYmMpLnJlcG9ydFJldHVybnZhbHVlSW5mcmluZ2VtZW50KGNoZWNrUmVzdWx0LCB0YXJnZXQsIHBhdGgsIHByb3BlcnR5S2V5LCByZWFsVmFsdWUsIGhpbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIFBvc3Rjb25kaXRpb25cbiAgICAvLyAjcmVnaW9uIERlY29yYXRvclxuICAgIC8vICNyZWdpb24gUHJlY29uZGl0aW9uXG4gICAgLyoqXG4gICAgICogQSBwYXJhbWV0ZXItZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCByZXF1ZXN0cyB0aGUgdGFnZ2VkIHBhcmFtZXRlcidzIHZhbHVlIHBhc3NpbmcgaXQgdG8gdGhlIHByb3ZpZGVkXG4gICAgICogXCJjaGVja1wiLW1ldGhvZCB3aGVuIHRoZSB2YWx1ZSBiZWNvbWVzIGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGVja1x0VGhlIFwiKCB1bmtub3duICkgPT4gdm9pZFwiIHRvIGJlIGludm9rZWQgYWxvbmcgd2l0aCB0aGUgdGFnZ2VkIHBhcmFtZXRlcidzIHZhbHVlIGFzIHNvb25cbiAgICAgKiBcdFx0XHRcdGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSBkYmMgIFx0U2VlIHtAbGluayBEQkMucmVzb2x2ZURCQ1BhdGggfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0VGhlIGRvdHRlZCBwYXRoIHJlZmVycmluZyB0byB0aGUgYWN0dWFsIHZhbHVlIHRvIGNoZWNrLCBzdGFydGluZyBmb3JtIHRoZSBzcGVjaWZpZWQgb25lLlxuICAgICAqIFx0XHRcdFx0TWF5IGNvbnRhaW4gOjogdG8gc2VwYXJhdGUgbXVsdGlwbGUgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgKioodGFyZ2V0OiBvYmplY3QsIG1ldGhvZE5hbWU6IHN0cmluZyB8IHN5bWJvbCwgcGFyYW1ldGVySW5kZXg6IG51bWJlciApID0+IHZvaWQqKiBpbnZva2VkIGJ5IFR5cGVzY3JpcHQtICovXG4gICAgc3RhdGljIGRlY1ByZWNvbmRpdGlvbihjaGVjaywgZGJjID0gdW5kZWZpbmVkLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHBhdGhzID0gcGF0aCA/IHBhdGgucmVwbGFjZSgvIC9nLCBcIlwiKS5zcGxpdChcIjo6XCIpIDogW3VuZGVmaW5lZF07XG4gICAgICAgIHJldHVybiAodGFyZ2V0LCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCkgPT4ge1xuICAgICAgICAgICAgREJDLnJlcXVlc3RQYXJhbVZhbHVlKHRhcmdldCwgbWV0aG9kTmFtZSwgcGFyYW1ldGVySW5kZXgsICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghREJDLmdldERCQyhkYmMpLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrUHJlY29uZGl0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2luZ2xlUGF0aCBvZiBwYXRocykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFsVmFsdWUgPSBzaW5nbGVQYXRoID8gREJDLnJlc29sdmUodmFsdWUsIHNpbmdsZVBhdGgpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrKHJlYWxWYWx1ZSwgdGFyZ2V0LCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEQkMuZ2V0REJDKGRiYykucmVwb3J0UGFyYW1ldGVySW5mcmluZ2VtZW50KHJlc3VsdCwgdGFyZ2V0LCBzaW5nbGVQYXRoLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCwgcmVhbFZhbHVlLCBoaW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgd2FybmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHdhcm5pbmcuICovXG4gICAgcmVwb3J0V2FybmluZyhtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLndhcm5pbmdTZXR0aW5ncy5sb2dUb0NvbnNvbGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGluZnJpbmdlbWVudCBhY2NvcmRpbmcgdG8gdGhlIHtAbGluayBpbmZyaW5nZW1lbnRTZXR0aW5ncyB9IGFsc28gZ2VuZXJhdGluZyBhIHByb3BlciB7QGxpbmsgc3RyaW5nIH0td3JhcHBlclxuICAgICAqIGZvciB0aGUgZ2l2ZW4gXCJtZXNzYWdlXCIgJiB2aW9sYXRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlXHRUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgdGhlIGluZnJpbmdlbWVudCBhbmQgaXQncyBwcm92ZW5pZW5jZS5cbiAgICAgKiBAcGFyYW0gdmlvbGF0b3IgXHRUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgb3IgbmFtaW5nIHRoZSB2aW9sYXRvci4gKi9cbiAgICByZXBvcnRJbmZyaW5nZW1lbnQobWVzc2FnZSwgdmlvbGF0b3IsIHRhcmdldCwgdmFsdWUsIHBhdGgsIGhpbnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgZmluYWxNZXNzYWdlID0gYFsgRnJvbSBcIiR7dmlvbGF0b3J9XCIke3R5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIiA/IGAgaW4gXCIke3RhcmdldC5uYW1lfVwiYCA6IHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIgJiYgdGFyZ2V0ICE9PSBudWxsICYmIHR5cGVvZiB0YXJnZXQuY29uc3RydWN0b3IgPT09IFwiZnVuY3Rpb25cIiA/IGAgaW4gXCIke3RhcmdldC5jb25zdHJ1Y3Rvci5uYW1lfVwiYCA6IGBpbiBcIiR7dGFyZ2V0fVwiYH0ke3BhdGggPyBgID4gXCIke3BhdGh9XCJgIDogXCJcIn06ICR7bWVzc2FnZX0gJHtoaW50ID8gYOKcqCAke2hpbnR9IOKcqGAgOiBcIlwifV1gO1xuICAgICAgICBpZiAodGhpcy5pbmZyaW5nZW1lbnRTZXR0aW5ncy50aHJvd0V4Y2VwdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERCQy5JbmZyaW5nZW1lbnQoZmluYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmZyaW5nZW1lbnRTZXR0aW5ncy5sb2dUb0NvbnNvbGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGZpbmFsTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIHBhcmFtZXRlci1pbmZyaW5nZW1lbnQgdmlhIHtAbGluayByZXBvcnRJbmZyaW5nZW1lbnQgfSBhbHNvIGdlbmVyYXRpbmcgYSBwcm9wZXIge0BsaW5rIHN0cmluZyB9LXdyYXBwZXJcbiAgICAgKiBmb3IgdGhlIGdpdmVuIFwibWVzc2FnZVwiLFwibWV0aG9kXCIsIHBhcmFtZXRlci1cImluZGV4XCIgJiB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlXHRUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgdGhlIGluZnJpbmdlbWVudCBhbmQgaXQncyBwcm92ZW5pZW5jZS5cbiAgICAgKiBAcGFyYW0gbWV0aG9kIFx0VGhlIHtAbGluayBzdHJpbmcgfSBkZXNjcmliaW5nIG9yIG5hbWluZyB0aGUgdmlvbGF0b3IuXG4gICAgICogQHBhcmFtIGluZGV4XHRcdFRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHdpdGhpbiB0aGUgYXJndW1lbnQgbGlzdGluZy5cbiAgICAgKiBAcGFyYW0gdmFsdWUgXHRUaGUgcGFyYW1ldGVyJ3MgdmFsdWUuICovXG4gICAgcmVwb3J0UGFyYW1ldGVySW5mcmluZ2VtZW50KG1lc3NhZ2UsIHRhcmdldCwgcGF0aCwgbWV0aG9kLCBpbmRleCwgdmFsdWUsIGhpbnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcHJvcGVySW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgIHRoaXMucmVwb3J0SW5mcmluZ2VtZW50KGBbIFBhcmFtZXRlci12YWx1ZSBcIiR7dmFsdWV9XCIgb2YgdGhlICR7cHJvcGVySW5kZXh9JHtwcm9wZXJJbmRleCA9PT0gMSA/IFwic3RcIiA6IHByb3BlckluZGV4ID09PSAyID8gXCJuZFwiIDogcHJvcGVySW5kZXggPT09IDMgPyBcInJkXCIgOiBcInRoXCJ9IHBhcmFtZXRlciBkaWQgbm90IGZ1bGZpbGwgb25lIG9mIGl0J3MgY29udHJhY3RzOiAke21lc3NhZ2V9IF1gLCBtZXRob2QsIHRhcmdldCwgdmFsdWUsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgZmllbGQtaW5mcmluZ2VtZW50IHZpYSB7QGxpbmsgcmVwb3J0SW5mcmluZ2VtZW50IH0gYWxzbyBnZW5lcmF0aW5nIGEgcHJvcGVyIHtAbGluayBzdHJpbmcgfS13cmFwcGVyXG4gICAgICogZm9yIHRoZSBnaXZlbiAqKm1lc3NhZ2UqKiAmICoqbmFtZSoqLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1lc3NhZ2VcdEEge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgdGhlIGluZnJpbmdlbWVudCBhbmQgaXQncyBwcm92ZW5pZW5jZS5cbiAgICAgKiBAcGFyYW0ga2V5IFx0XHRUaGUgcHJvcGVydHkga2V5LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFRoZSBkb3R0ZWQtcGF0aCB7QGxpbmsgc3RyaW5nIH0gdGhhdCBsZWFkcyB0byB0aGUgdmFsdWUgbm90IGZ1bGZpbGxpbmcgdGhlIGNvbnRyYWN0IHN0YXJ0aW5nIGZyb21cbiAgICAgKiBcdFx0XHRcdFx0dGhlIHRhZ2dlZCBvbmUuXG4gICAgICogQHBhcmFtIHZhbHVlXHRcdFRoZSB2YWx1ZSBub3QgZnVsZmlsbGluZyBhIGNvbnRyYWN0LiAqL1xuICAgIHJlcG9ydEZpZWxkSW5mcmluZ2VtZW50KG1lc3NhZ2UsIHRhcmdldCwgcGF0aCwga2V5LCB2YWx1ZSwgaGludCA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlcG9ydEluZnJpbmdlbWVudChgWyBOZXcgdmFsdWUgZm9yIFwiJHtrZXl9XCIke3BhdGggPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBgLiR7cGF0aH1gfSB3aXRoIHZhbHVlIFwiJHt2YWx1ZX1cIiBkaWQgbm90IGZ1bGZpbGwgb25lIG9mIGl0J3MgY29udHJhY3RzOiAke21lc3NhZ2V9IF1gLCBrZXksIHRhcmdldCwgdmFsdWUsIHBhdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgcmV0dXJudmFsdWUtaW5mcmluZ2VtZW50IGFjY29yZGluZyB2aWEge0BsaW5rIHJlcG9ydEluZnJpbmdlbWVudCB9IGFsc28gZ2VuZXJhdGluZyBhIHByb3BlciB7QGxpbmsgc3RyaW5nIH0td3JhcHBlclxuICAgICAqIGZvciB0aGUgZ2l2ZW4gXCJtZXNzYWdlXCIsXCJtZXRob2RcIiAmIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1lc3NhZ2VcdFRoZSB7QGxpbmsgc3RyaW5nIH0gZGVzY3JpYmluZyB0aGUgaW5mcmluZ2VtZW50IGFuZCBpdCdzIHByb3ZlbmllbmNlLlxuICAgICAqIEBwYXJhbSBtZXRob2QgXHRUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgb3IgbmFtaW5nIHRoZSB2aW9sYXRvci5cbiAgICAgKiBAcGFyYW0gdmFsdWVcdFx0VGhlIHBhcmFtZXRlcidzIHZhbHVlLiAqL1xuICAgIHJlcG9ydFJldHVybnZhbHVlSW5mcmluZ2VtZW50KG1lc3NhZ2UsIHRhcmdldCwgcGF0aCwgbWV0aG9kLCBcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IDxleHBsYW5hdGlvbj5cbiAgICB2YWx1ZSwgaGludCA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlcG9ydEluZnJpbmdlbWVudChgWyBSZXR1cm4tdmFsdWUgXCIke3ZhbHVlfVwiIGRpZCBub3QgZnVsZmlsbCBvbmUgb2YgaXQncyBjb250cmFjdHM6ICR7bWVzc2FnZX0gXWAsIG1ldGhvZCwgdGFyZ2V0LCB2YWx1ZSwgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgdGhpcyB7QGxpbmsgREJDIH0gYnkgc2V0dGluZyB0aGUge0BsaW5rIERCQy5pbmZyaW5nZW1lbnRTZXR0aW5ncyB9LCBkZWZpbmUgdGhlICoqV2FYQ29kZSoqIG5hbWVzcGFjZSBpblxuICAgICAqICoqd2luZG93KiogaWYgbm90IHlldCBhdmFpbGFibGUgYW5kIHNldHRpbmcgdGhlIHByb3BlcnR5ICoqREJDKiogaW4gdGhlcmUgdG8gdGhlIGluc3RhbmNlIG9mIHRoaXMge0BsaW5rIERCQyB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGluZnJpbmdlbWVudFNldHRpbmdzIFx0U2VlIHtAbGluayBEQkMuaW5mcmluZ2VtZW50U2V0dGluZ3MgfS5cbiAgICAgKiBAcGFyYW0gZXhlY3V0aW9uU2V0dGluZ3NcdFx0U2VlIHtAbGluayBEQkMuZXhlY3V0aW9uU2V0dGluZ3MgfS4gKi9cbiAgICBjb25zdHJ1Y3RvcihpbmZyaW5nZW1lbnRTZXR0aW5ncyA9IHsgdGhyb3dFeGNlcHRpb246IHRydWUsIGxvZ1RvQ29uc29sZTogZmFsc2UgfSwgZXhlY3V0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIGNoZWNrUHJlY29uZGl0aW9uczogdHJ1ZSxcbiAgICAgICAgY2hlY2tQb3N0Y29uZGl0aW9uczogdHJ1ZSxcbiAgICAgICAgY2hlY2tJbnZhcmlhbnRzOiB0cnVlLFxuICAgIH0pIHtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBQcmVjb25kaXRpb25cbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBEZWNvcmF0b3JcbiAgICAgICAgLy8gI3JlZ2lvbiBFeGVjdXRpb24gSGFuZGxpbmdcbiAgICAgICAgLyoqIFN0b3JlcyBzZXR0aW5ncyBjb25jZXJuaW5nIHRoZSBleGVjdXRpb24gb2YgY2hlY2tzLiAqL1xuICAgICAgICB0aGlzLmV4ZWN1dGlvblNldHRpbmdzID0ge1xuICAgICAgICAgICAgY2hlY2tQcmVjb25kaXRpb25zOiB0cnVlLFxuICAgICAgICAgICAgY2hlY2tQb3N0Y29uZGl0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgIGNoZWNrSW52YXJpYW50czogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBFeGVjdXRpb24gSGFuZGxpbmdcbiAgICAgICAgLy8gI3JlZ2lvbiBXYXJuaW5nIGhhbmRsaW5nLlxuICAgICAgICAvKiogU3RvcmVzIHNldHRpbmdzIGNvbmNlcm5pbmcgd2FybmluZ3MuICovXG4gICAgICAgIHRoaXMud2FybmluZ1NldHRpbmdzID0geyBsb2dUb0NvbnNvbGU6IHRydWUgfTtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBXYXJuaW5nIGhhbmRsaW5nLlxuICAgICAgICAvLyAjcmVnaW9uIGluZnJpbmdlbWVudCBoYW5kbGluZy5cbiAgICAgICAgLyoqIFN0b3JlcyB0aGUgc2V0dGluZ3MgY29uY2VybmluZyBpbmZyaW5nZW1lbnRzICovXG4gICAgICAgIHRoaXMuaW5mcmluZ2VtZW50U2V0dGluZ3MgPSB7IHRocm93RXhjZXB0aW9uOiB0cnVlLCBsb2dUb0NvbnNvbGU6IGZhbHNlIH07XG4gICAgICAgIHRoaXMuaW5mcmluZ2VtZW50U2V0dGluZ3MgPSBpbmZyaW5nZW1lbnRTZXR0aW5ncztcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4gICAgICAgIGlmIChEQkMuZ2V0SG9zdCgpLldhWENvZGUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIERCQy5nZXRIb3N0KCkuV2FYQ29kZSA9IHt9O1xuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgREJDLmdldEhvc3QoKS5XYVhDb2RlLkRCQyA9IHRoaXM7XG4gICAgICAgIERCQy5kYmNDYWNoZS5zZXQoXCJXYVhDb2RlLkRCQ1wiLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgdGhlIGRlc2lyZWQge0BsaW5rIG9iamVjdCB9IG91dCBhIGdpdmVuIG9uZSAqKnRvUmVzb2x2ZUZyb20qKiB1c2luZyB0aGUgc3BlY2lmaWVkICoqcGF0aCoqLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvUmVzb2x2ZUZyb20gVGhlIHtAbGluayBvYmplY3QgfSBzdGFydGluZyB0byByZXNvbHZlIGZyb20uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHRUaGUgZG90dGVkIHBhdGgte0BsaW5rIHN0cmluZyB9LlxuICAgICAqIFx0XHRcdFx0XHRcdFRoaXMgc3RyaW5nIHVzZXMgLiwgWy4uLl0sIGFuZCAoKSB0byByZXByZXNlbnQgYWNjZXNzaW5nIG5lc3RlZCBwcm9wZXJ0aWVzLFxuICAgICAqIFx0XHRcdFx0XHRcdGFycmF5IGVsZW1lbnRzL29iamVjdCBrZXlzLCBhbmQgY2FsbGluZyBtZXRob2RzLCByZXNwZWN0aXZlbHksIG1pbWlja2luZyBKYXZhU2NyaXB0IHN5bnRheCB0byBuYXZpZ2F0ZVxuICAgICAqIFx0XHRcdFx0XHRcdGFuIG9iamVjdCdzIHN0cnVjdHVyZS4gQ29kZSwgZS5nLiBzb21ldGhpbmcgbGlrZSBhLmIoIDEgYXMgbnVtYmVyICkuYywgd2lsbCBub3QgYmUgZXhlY3V0ZWQgYW5kXG4gICAgICogXHRcdFx0XHRcdFx0dGh1cyBtYWtlIHRoZSByZXRyaWV2YWwgZmFpbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSByZXF1ZXN0ZWQge0BsaW5rIG9iamVjdCB9LCBOVUxMIG9yIFVOREVGSU5FRC4gKi9cbiAgICBzdGF0aWMgcmVzb2x2ZSh0b1Jlc29sdmVGcm9tLCBwYXRoKSB7XG4gICAgICAgIGlmICghdG9SZXNvbHZlRnJvbSB8fCB0eXBlb2YgcGF0aCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYWNoZWRQYXJ0cyA9IERCQy5wYXRoVG9rZW5DYWNoZS5nZXQocGF0aCk7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gY2FjaGVkUGFydHMgIT09IG51bGwgJiYgY2FjaGVkUGFydHMgIT09IHZvaWQgMCA/IGNhY2hlZFBhcnRzIDogcGF0aC5yZXBsYWNlKC9cXFsoWydcIl0/KSguKj8pXFwxXFxdL2csIFwiLiQyXCIpLnNwbGl0KFwiLlwiKTsgLy8gSGFuZGxlIGluZGV4ZXJzXG4gICAgICAgIGlmICghY2FjaGVkUGFydHMpIHtcbiAgICAgICAgICAgIERCQy5wYXRoVG9rZW5DYWNoZS5zZXQocGF0aCwgcGFydHMpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdXJyZW50ID0gdG9SZXNvbHZlRnJvbTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCB0eXBlb2YgY3VycmVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtZXRob2RNYXRjaCA9IHBhcnQubWF0Y2goLyhcXHcrKVxcKCguKilcXCkvKTtcbiAgICAgICAgICAgIGlmIChtZXRob2RNYXRjaCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBtZXRob2RNYXRjaFsxXTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmdzU3RyID0gbWV0aG9kTWF0Y2hbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IGFyZ3NTdHIuc3BsaXQoXCIsXCIpLm1hcCgoYXJnKSA9PiBhcmcudHJpbSgpKTsgLy8gU2ltcGxlIGFyZ3VtZW50IHBhcnNpbmdcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFttZXRob2ROYW1lXS5hcHBseShjdXJyZW50LCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIE1ldGhvZCBub3QgZm91bmQgb3Igbm90IGEgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG59XG4vLyAjcmVnaW9uIEludGVybmFsIGNhY2hlcy5cbkRCQy5kYmNDYWNoZSA9IG5ldyBNYXAoKTtcbkRCQy5wYXRoVG9rZW5DYWNoZSA9IG5ldyBNYXAoKTtcbi8vICNlbmRyZWdpb24gSW50ZXJuYWwgY2FjaGVzLlxuLy8gI3JlZ2lvbiBQYXJhbWV0ZXItdmFsdWUgcmVxdWVzdHMuXG4vKiogU3RvcmVzIGFsbCByZXF1ZXN0IGZvciBwYXJhbWV0ZXIgdmFsdWVzIHJlZ2lzdGVyZWQgYnkge0BsaW5rIGRlY1ByZWNvbmRpdGlvbiB9LiAqL1xuREJDLnBhcmFtVmFsdWVSZXF1ZXN0cyA9IG5ldyBNYXAoKTtcbi8vICNyZWdpb24gQ2xhc3Nlc1xuLy8gI3JlZ2lvbiBFcnJvcnNcbi8qKiBBbiB7QGxpbmsgRXJyb3IgfSB0byBiZSB0aHJvd24gd2hlbmV2ZXIgYW4gaW5mcmluZ2VtZW50IGlzIGRldGVjdGVkLiAqL1xuREJDLkluZnJpbmdlbWVudCA9IGNsYXNzIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgdGhpcyB7QGxpbmsgRXJyb3IgfSBieSB0YWdnaW5nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS17QGxpbmsgc3RyaW5nIH0gYXMgYW4gWERCQy1JbmZyaW5nZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgdGhlIGluZnJpbmdlbWVudC4gKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKGBbIFhEQkMgSW5mcmluZ2VtZW50ICR7bWVzc2FnZX1dYCk7XG4gICAgfVxufTtcbi8vICNlbmRyZWdpb24gRXJyb3JzXG4vLyAjZW5kcmVnaW9uIENsYXNzZXNcbi8vICNlbmRyZWdpb24gaW5mcmluZ2VtZW50IGhhbmRsaW5nLlxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgc3BlY2lmaWVkIGRvdHRlZCB7QGxpbmsgc3RyaW5nIH0tcGF0aCB0byBhIHtAbGluayBEQkMgfS5cbiAqXG4gKiBAcGFyYW0gb2JqIFx0VGhlIHtAbGluayBvYmplY3QgfSB0byBzdGFydCByZXNvbHZpbmcgZnJvbS5cbiAqIEBwYXJhbSBwYXRoIFx0VGhlIGRvdHRlZCB7QGxpbmsgc3RyaW5nIH0tcGF0aCBsZWFkaW5nIHRvIHRoZSB7QGxpbmsgREJDIH0uXG4gKlxuICogQHJldHVybnMgVGhlIHJlcXVlc3RlZCB7QGxpbmsgREJDIH0uXG4gKi9cbkRCQy5yZXNvbHZlREJDUGF0aCA9IChvYmosIHBhdGgpID0+IHBhdGggPT09IG51bGwgfHwgcGF0aCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGF0aC5zcGxpdChcIi5cIikucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3JbY3VycmVudF0sIG9iaik7XG4vLyBTZXQgdGhlIG1haW4gaW5zdGFuY2Ugd2l0aCBzdGFuZGFyZCAqKkRCQy5pbmZyaW5nZW1lbnRTZXR0aW5ncyoqLlxubmV3IERCQygpO1xuIiwiaW1wb3J0IHsgREJDIH0gZnJvbSBcIi4uL0RCQ1wiO1xuLyoqXG4gKiBBIHtAbGluayBEQkMgfSBkZWZpbmluZyB0aGF0IGFsbCBlbGVtZW50cyBvZiBhbiB7QGxpbmsgb2JqZWN0IH1zIGhhdmUgdG8gZnVsZmlsbFxuICogYSBnaXZlbiB7QGxpbmsgb2JqZWN0IH0ncyBjaGVjay1tZXRob2QgKCoqKCB0b0NoZWNrIDogYW55ICkgPT4gYm9vbGVhbiB8IHN0cmluZyoqKS5cbiAqXG4gKiBAcmVtYXJrc1xuICogTWFpbnRhaW5lcjogQ2FsbGFyaSwgU2FsdmF0b3JlIChYREJDQFdhWENvZGUubmV0KSAqL1xuZXhwb3J0IGNsYXNzIEFFIGV4dGVuZHMgREJDIHtcbiAgICAvLyAjcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgZWFjaCBlbGVtZW50IG9mIHRoZSAqKnZhbHVlKiote0BsaW5rIEFycmF5IDwgYW55ID59IGFnYWluc3QgdGhlIGdpdmVuICoqY29uZGl0aW9uKiosIGlmIGl0IGlzIG9uZS4gSWYgaXQgaXMgbm90XG4gICAgICogdGhlICoqdmFsdWUqKiBpdHNlbGYgd2lsbCBiZSBjaGVja2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbmRpdGlvblx0VGhlIHsgY2hlY2s6ICh0b0NoZWNrOiBhbnkpID0+IGJvb2xlYW4gfCBzdHJpbmcgfSB0byBjaGVjayB0aGUgKip2YWx1ZSoqIGFnYWluc3QuXG4gICAgICogQHBhcmFtIHZhbHVlXHRcdEVpdGhlciAqKnZhbHVlKiote0BsaW5rIEFycmF5IDwgYW55ID59LCB3aGljaCdzIGVsZW1lbnRzIHdpbGwgYmUgY2hlY2tlZCwgb3IgdGhlIHZhbHVlIHRvIGJlXG4gICAgICogXHRcdFx0XHRcdGNoZWNrZWQgaXRzZWxmLlxuICAgICAqIEBwYXJhbSBpbmRleFx0XHRJZiBzcGVjaWZpZWQgd2l0aCAqKmlkeEVuZCoqIGJlaW5nIHVuZGVmaW5lZCwgdGhpcyB7QGxpbmsgTnVtYmVyIH0gd2lsbCBiZSBzZWVuIGFzIHRoZSBpbmRleCBvZlxuICAgICAqIFx0XHRcdFx0XHR0aGUgdmFsdWUte0BsaW5rIEFycmF5IH0ncyBlbGVtZW50IHRvIGNoZWNrLiBJZiB2YWx1ZSBpc24ndCBhbiB7QGxpbmsgQXJyYXkgfSB0aGlzIHBhcmFtZXRlclxuICAgICAqIFx0XHRcdFx0XHR3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3QuXG4gICAgICogXHRcdFx0XHRcdFdpdGggKippZHhFbmQqKiBub3QgdW5kZWZpbmVkIHRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzcGFuIG9mIGVsZW1lbnRzIHRvXG4gICAgICogXHRcdFx0XHRcdGNoZWNrIHdpdGhpbiB0aGUgdmFsdWUte0BsaW5rIEFycmF5IH0uXG4gICAgICogQHBhcmFtIGlkeEVuZFx0SW5kaWNhdGVzIHRoZSBsYXN0IGVsZW1lbnQncyBpbmRleCAoaW5jbHVkaW5nKSBvZiB0aGUgc3BhbiBvZiB2YWx1ZS17QGxpbmsgQXJyYXkgfSBlbGVtZW50cyB0byBjaGVjay5cbiAgICAgKiBcdFx0XHRcdFx0U2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byAtMSBzcGVjaWZpZXMgdGhhdCBhbGwgdmFsdWUte0BsaW5rIEFycmF5IH0ncyBlbGVtZW50cyBiZWdpbm5pbmcgZnJvbSB0aGVcbiAgICAgKiBcdFx0XHRcdFx0c3BlY2lmaWVkICoqaW5kZXgqKiBzaGFsbCBiZSBjaGVja2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQXMgc29vbiBhcyB0aGUgKipjb25kaXRpb24qKiByZXR1cm5zIGEge0BsaW5rIHN0cmluZyB9LCBpbnN0ZWFkIG9mIFRSVUUsIHRoZSByZXR1cm5lZCBzdHJpbmcuIFRSVUUgaWYgdGhlXG4gICAgICogXHRcdFx0Kipjb25kaXRpb24qKiBuZXZlciByZXR1cm5zIGEge0BsaW5rIHN0cmluZ30uICovXG4gICAgc3RhdGljIGNoZWNrQWxnb3JpdGhtKGNvbmRpdGlvbiwgdmFsdWUsIGluZGV4LCBpZHhFbmQpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpZHhFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xICYmIGluZGV4IDwgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmRpdGlvbi5jaGVjayh2YWx1ZVtpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBWaW9sYXRpbmctQXJyYXllbGVtZW50IGF0IGluZGV4IFwiJHtpbmRleH1cIiB3aXRoIHZhbHVlIFwiJHt2YWx1ZVtpbmRleF19XCIuICR7cmVzdWx0fWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEluIG9yZGVyIGZvciBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gbm90IGNhdXNlIGFuIGVycm9yIGlmIHRoZXkgYXJlIG9taXR0ZWQuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbmRpbmcgPSBpZHhFbmQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gaWR4RW5kICE9PSAtMVxuICAgICAgICAgICAgICAgICAgICA/IGlkeEVuZCArIDFcbiAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZS5sZW5ndGhcbiAgICAgICAgICAgICAgICA6IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBpbmRleCA/IGluZGV4IDogMDsgaSA8IGVuZGluZzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29uZGl0aW9uLmNoZWNrKHZhbHVlW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgVmlvbGF0aW5nLUFycmF5ZWxlbWVudCBhdCBpbmRleCAke2l9LiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24uY2hlY2sodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHBhcmFtZXRlci1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0gd2l0aCBlaXRoZXIgbXVsdGlwbGUgb3IgYSBzaW5nbGUgb25lXG4gICAgICogb2YgdGhlICoqcmVhbENvbmRpdGlvbnMqKiB0byBjaGVjayB0aGUgdGFnZ2VkIHBhcmFtZXRlci12YWx1ZSBhZ2FpbnN0IHdpdGguXG4gICAgICogV2hlbiBzcGVjaWZ5aW5nIGFuICoqaW5kZXgqKiBhbmQgdGhlIHRhZ2dlZCBwYXJhbWV0ZXIncyAqKnZhbHVlKiogaXMgYW4ge0BsaW5rIEFycmF5IH0sIHRoZSAqKnJlYWxDb25kaXRpb25zKiogYXBwbHkgdG8gdGhlXG4gICAgICogZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkICoqaW5kZXgqKi5cbiAgICAgKiBJZiB0aGUge0BsaW5rIEFycmF5IH0gaXMgdG9vIHNob3J0IHRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIHsgY2hlY2s6ICh0b0NoZWNrOiBhbnkpID0+IGJvb2xlYW4gfCBzdHJpbmcgfSBvZlxuICAgICAqICoqcmVhbENvbmRpdGlvbnMqKiB3aWxsIGJlIHZlcmlmaWVkIHRvIFRSVUUgYXV0b21hdGljYWxseSwgY29uc2lkZXJpbmcgb3B0aW9uYWwgcGFyYW1ldGVycy5cbiAgICAgKiBJZiBhbiAqKmluZGV4KiogaXMgc3BlY2lmaWVkIGJ1dCB0aGUgdGFnZ2VkIHBhcmFtZXRlcidzIHZhbHVlIGlzbid0IGFuIGFycmF5LCB0aGUgKippbmRleCoqIGlzIHRyZWF0ZWQgYXMgYmVpbmcgdW5kZWZpbmVkLlxuICAgICAqIElmICoqaW5kZXgqKiBpcyB1bmRlZmluZWQgYW5kIHRoZSB0YWdnZWQgcGFyYW1ldGVyJ3MgdmFsdWUgaXMgYW4ge0BsaW5rIEFycmF5IH0gZWFjaCBlbGVtZW50IG9mIGl0IHdpbGwgYmUgY2hlY2tlZFxuICAgICAqIGFnYWluc3QgdGhlICoqcmVhbENvbmRpdGlvbnMqKi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWFsQ29uZGl0aW9uc1x0RWl0aGVyIG9uZSBvciBtb3JlIHsgY2hlY2s6ICh0b0NoZWNrOiBhbnkpID0+IGJvb2xlYW4gfCBzdHJpbmcgfSB0byBjaGVjayB0aGUgdGFnZ2VkIHBhcmFtZXRlci12YWx1ZVxuICAgICAqIFx0XHRcdFx0XHRcdFx0YWdhaW5zdCB3aXRoLlxuICAgICAqIEBwYXJhbSBpbmRleFx0XHRcdFx0U2VlIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gaWR4RW5kXHRcdFx0U2VlIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqXG4gICAgICogQHJldHVybnNcdEEge0BsaW5rIHN0cmluZyB9IGFzIHNvb24gYXMgb25lIHsgY2hlY2s6ICh0b0NoZWNrOiBhbnkpID0+IGJvb2xlYW4gfCBzdHJpbmcgfSBvZiAqKnJlYWxDb25kaXRpb25zKiogcmV0dXJucyBvbmUuXG4gICAgICogXHRcdFx0T3RoZXJ3aXNlIFRSVUUuICovXG4gICAgc3RhdGljIFBSRShyZWFsQ29uZGl0aW9ucywgaW5kZXggPSB1bmRlZmluZWQsIGlkeEVuZCA9IHVuZGVmaW5lZCwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjUHJlY29uZGl0aW9uKCh2YWx1ZSwgdGFyZ2V0LCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVhbENvbmRpdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjdXJyZW50Q29uZGl0aW9uIG9mIHJlYWxDb25kaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IEFFLmNoZWNrQWxnb3JpdGhtKGN1cnJlbnRDb25kaXRpb24sIHZhbHVlLCBpbmRleCwgaWR4RW5kKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwiYm9vbGVhblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQUUuY2hlY2tBbGdvcml0aG0ocmVhbENvbmRpdGlvbnMsIHZhbHVlLCBpbmRleCwgaWR4RW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZC1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0gd2l0aCBlaXRoZXIgbXVsdGlwbGUgb3IgYSBzaW5nbGUgb25lXG4gICAgICogb2YgdGhlICoqcmVhbENvbmRpdGlvbnMqKiB0byBjaGVjayB0aGUgdGFnZ2VkIG1ldGhvZCdzIHJldHVybi12YWx1ZSBhZ2FpbnN0IHdpdGguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVhbENvbmRpdGlvbnNcdEVpdGhlciBvbmUgb3IgbW9yZSB7IGNoZWNrOiAodG9DaGVjazogYW55KSA9PiBib29sZWFuIHwgc3RyaW5nIH0gdG8gY2hlY2sgdGhlIHRhZ2dlZCBwYXJhbWV0ZXItdmFsdWVcbiAgICAgKiBcdFx0XHRcdFx0XHRcdGFnYWluc3Qgd2l0aC5cbiAgICAgKiBAcGFyYW0gaW5kZXhcdFx0XHRcdFNlZSB0aGUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIGlkeEVuZFx0XHRcdFNlZSB0aGUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBoaW50XHRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zXHRBIHtAbGluayBzdHJpbmcgfSBhcyBzb29uIGFzIG9uZSB7IGNoZWNrOiAodG9DaGVjazogYW55KSA9PiBib29sZWFuIHwgc3RyaW5nIH0gb2YgKipyZWFsQ29uZGl0aW9ucyoqIHJldHVybiBvbmUuXG4gICAgICogXHRcdFx0T3RoZXJ3aXNlIFRSVUUuICovXG4gICAgc3RhdGljIFBPU1QocmVhbENvbmRpdGlvbnMsIGluZGV4ID0gdW5kZWZpbmVkLCBpZHhFbmQgPSB1bmRlZmluZWQsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY1Bvc3Rjb25kaXRpb24oKHZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWFsQ29uZGl0aW9ucykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRDb25kaXRpb24gb2YgcmVhbENvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gQUUuY2hlY2tBbGdvcml0aG0oY3VycmVudENvbmRpdGlvbiwgdmFsdWUsIGluZGV4LCBpZHhFbmQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gXCJib29sZWFuXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBBRS5jaGVja0FsZ29yaXRobShcbiAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICAgICAgICByZWFsQ29uZGl0aW9ucywgdmFsdWUsIGluZGV4LCBpZHhFbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZmllbGQtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBBRS5jaGVja0FsZ29yaXRobSB9IHdpdGggZWl0aGVyIG11bHRpcGxlIG9yIGEgc2luZ2xlIG9uZVxuICAgICAqIG9mIHRoZSAqKnJlYWxDb25kaXRpb25zKiogdG8gY2hlY2sgdGhlIHRhZ2dlZCBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWFsQ29uZGl0aW9uc1x0RWl0aGVyIG9uZSBvciBtb3JlIHsgY2hlY2s6ICh0b0NoZWNrOiBhbnkpID0+IGJvb2xlYW4gfCBzdHJpbmcgfSB0byBjaGVjayB0aGUgdGFnZ2VkIHBhcmFtZXRlci12YWx1ZVxuICAgICAqIFx0XHRcdFx0XHRcdFx0YWdhaW5zdCB3aXRoLlxuICAgICAqIEBwYXJhbSBpbmRleFx0XHRcdFx0U2VlIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gaWR4RW5kXHRcdFx0U2VlIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqXG4gICAgICogQHJldHVybnNcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQocmVhbENvbmRpdGlvbnMsIGluZGV4ID0gdW5kZWZpbmVkLCBpZHhFbmQgPSB1bmRlZmluZWQsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY0ludmFyaWFudChbbmV3IEFFKHJlYWxDb25kaXRpb25zLCBpbmRleCwgaWR4RW5kKV0sIHBhdGgsIGRiYywgaGludCk7XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vICNyZWdpb24gUmVmZXJlbmNlZCBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy9cbiAgICAvLyBGb3IgdXNhZ2UgaW4gZHluYW1pYyBzY2VuYXJpb3MgKGxpa2UgZ2xvYmFsIGZ1bmN0aW9ucykuXG4gICAgLy9cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfSB3aXRoIGFsbCB7QGxpbmsgQUUuY29uZGl0aW9ucyB9IGFuZCB0aGUge0BsaW5rIG9iamVjdCB9IHtAbGluayB0b0NoZWNrIH0sXG4gICAgICoge0BsaW5rIEFFLmluZGV4IH0gJiB7QGxpbmsgQUUuaWR4RW5kIH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBTZWUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICBjaGVjayh0b0NoZWNrKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY29uZGl0aW9ucykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3VycmVudENvbmRpdGlvbiBvZiB0aGlzLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBBRS5jaGVja0FsZ29yaXRobShjdXJyZW50Q29uZGl0aW9uLCB0b0NoZWNrLCB0aGlzLmluZGV4LCB0aGlzLmlkeEVuZCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwiYm9vbGVhblwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEFFLmNoZWNrQWxnb3JpdGhtKFxuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4gICAgICAgICAgICB0aGlzLmNvbmRpdGlvbnMsIHRvQ2hlY2ssIHRoaXMuaW5kZXgsIHRoaXMuaWR4RW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGlzIHtAbGluayBBRSB9IGJ5IHNldHRpbmcgdGhlIHByb3RlY3RlZCBwcm9wZXJ0eSB7QGxpbmsgQUUuY29uZGl0aW9ucyB9LCB7QGxpbmsgQUUuaW5kZXggfSBhbmQge0BsaW5rIEFFLmlkeEVuZCB9IHVzZWQgYnkge0BsaW5rIEFFLmNoZWNrIH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXF1aXZhbGVudCBTZWUge0BsaW5rIEVRLmNoZWNrIH0uICovXG4gICAgY29uc3RydWN0b3IoY29uZGl0aW9ucywgaW5kZXggPSB1bmRlZmluZWQsIGlkeEVuZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbmRpdGlvbnMgPSBjb25kaXRpb25zO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuaWR4RW5kID0gaWR4RW5kO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERCQyB9IGZyb20gXCIuLi9EQkNcIjtcbi8qKlxuICogQSB7QGxpbmsgREJDIH0gZGVmaW5pbmcgYSBjb21wYXJpc29uIGJldHdlZW4gdHdvIHtAbGluayBvYmplY3QgfXMuXG4gKlxuICogQHJlbWFya3NcbiAqIE1haW50YWluZXI6IENhbGxhcmksIFNhbHZhdG9yZSAoWERCQ0BXYVhDb2RlLm5ldCkgKi9cbmV4cG9ydCBjbGFzcyBDT01QQVJJU09OIGV4dGVuZHMgREJDIHtcbiAgICAvLyAjcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvKipcbiAgICAgKiBEb2VzIGEgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSB7QGxpbmsgb2JqZWN0IH0gKip0b0NoZWNrKiogYW5kIHRoZSAqKmVxdWl2YWxlbnQqKi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrXHRcdFRoZSB2YWx1ZSB0aGF0IGhhcyB0byBiZSBlcXVhbCB0byBpdCdzIHBvc3NpYmxlICoqZXF1aXZhbGVudCoqIGZvciB0aGlzIHtAbGluayBEQkMgfSB0byBiZSBmdWxmaWxsZWQuXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnRcdFRoZSB7QGxpbmsgb2JqZWN0IH0gdGhlIG9uZSAqKnRvQ2hlY2sqKiBoYXMgdG8gYmUgZXF1YWwgdG8gaW4gb3JkZXIgZm9yIHRoaXMge0BsaW5rIERCQyB9IHRvIGJlXG4gICAgICogXHRcdFx0XHRcdFx0ZnVsZmlsbGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVFJVRSBpZiB0aGUgdmFsdWUgKip0b0NoZWNrKiogYW5kIHRoZSAqKmVxdWl2YWxlbnQqKiBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlciwgb3RoZXJ3aXNlIEZBTFNFLiAqL1xuICAgIHN0YXRpYyBjaGVja0FsZ29yaXRobSh0b0NoZWNrLCBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCwgaW52ZXJ0KSB7XG4gICAgICAgIGlmIChlcXVhbGl0eVBlcm1pdHRlZCAmJiAhaW52ZXJ0ICYmIHRvQ2hlY2sgPCBlcXVpdmFsZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYFZhbHVlIGhhcyB0byB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gXCIke2VxdWl2YWxlbnR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcXVhbGl0eVBlcm1pdHRlZCAmJiBpbnZlcnQgJiYgdG9DaGVjayA+IGVxdWl2YWxlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBgVmFsdWUgaGFzIHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBcIiR7ZXF1aXZhbGVudH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlcXVhbGl0eVBlcm1pdHRlZCAmJiAhaW52ZXJ0ICYmIHRvQ2hlY2sgPD0gZXF1aXZhbGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGBWYWx1ZSBoYXMgdG8gdG8gYmUgZ3JlYXRlciB0aGFuIFwiJHtlcXVpdmFsZW50fVwiYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVxdWFsaXR5UGVybWl0dGVkICYmIGludmVydCAmJiB0b0NoZWNrID49IGVxdWl2YWxlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBgVmFsdWUgaGFzIHRvIGJlIGxlc3MgdGhhbiBcIiR7ZXF1aXZhbGVudH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnRcdCAgICBTZWUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gZXF1YWxpdHlQZXJtaXR0ZWQgU2VlIHtAbGluayBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHQgICAgU2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHQgICAgU2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUFJFKGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5kZWNQcmVjb25kaXRpb24oKHZhbHVlLCB0YXJnZXQsIG1ldGhvZE5hbWUsIHBhcmFtZXRlckluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSh2YWx1ZSwgZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQsIGludmVydCk7XG4gICAgICAgIH0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgbWV0aG9kLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgbWV0aG9kJ3MgcmV0dXJudmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXF1aXZhbGVudFx0ICAgIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBlcXVhbGl0eVBlcm1pdHRlZCBTZWUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdCAgICBTZWUge0BsaW5rIERCQy5Qb3N0Y29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRcdFx0ICAgIFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUE9TVChlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjUG9zdGNvbmRpdGlvbigodmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtKHZhbHVlLCBlcXVhbGl0eVBlcm1pdHRlZCwgZXF1aXZhbGVudCwgaW52ZXJ0KTtcbiAgICAgICAgfSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBmaWVsZC1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHtAbGluayBEQkMgfSBpcyBmdWxmaWxsZWRcbiAgICAgKiBieSB0aGUgdGFnZ2VkIGZpZWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnRcdCAgICBTZWUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gZXF1YWxpdHlQZXJtaXR0ZWQgU2VlIHtAbGluayBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHQgICAgU2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHQgICAgU2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS4gKi9cbiAgICBzdGF0aWMgSU5WQVJJQU5UKGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5kZWNJbnZhcmlhbnQoW25ldyBDT01QQVJJU09OKGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkLCBpbnZlcnQpXSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy8gI3JlZ2lvbiBSZWZlcmVuY2VkIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvLyAjcmVnaW9uIER5bmFtaWMgdXNhZ2UuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfSBwYXNzaW5nIHRoZSB2YWx1ZSAqKnRvQ2hlY2sqKiwge0BsaW5rIENPTVBBUklTT04uZXF1aXZhbGVudCB9IGFuZCB7QGxpbmsgQ09NUEFSSVNPTi5pbnZlcnQgfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICBjaGVjayh0b0NoZWNrKSB7XG4gICAgICAgIHJldHVybiBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIHRoaXMuZXF1aXZhbGVudCwgdGhpcy5lcXVhbGl0eVBlcm1pdHRlZCwgdGhpcy5pbnZlcnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoaXMge0BsaW5rIENPTVBBUklTT04gfSBieSBzZXR0aW5nIHRoZSBwcm90ZWN0ZWQgcHJvcGVydHkge0BsaW5rIENPTVBBUklTT04uZXF1aXZhbGVudCB9LCB7QGxpbmsgQ09NUEFSSVNPTi5lcXVhbGl0eVBlcm1pdHRlZCB9IGFuZCB7QGxpbmsgQ09NUEFSSVNPTi5pbnZlcnQgfSB1c2VkIGJ5IHtAbGluayBDT01QQVJJU09OLmNoZWNrIH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXF1aXZhbGVudCAgICAgICAgU2VlIHtAbGluayBDT01QQVJJU09OLmNoZWNrIH0uXG4gICAgICogQHBhcmFtIGVxdWFsaXR5UGVybWl0dGVkIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVjayB9LlxuICAgICAqIEBwYXJhbSBpbnZlcnQgICAgICAgICAgICBTZWUge0BsaW5rIENPTVBBUklTT04uY2hlY2sgfS4gKi9cbiAgICBjb25zdHJ1Y3RvcihlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVxdWl2YWxlbnQgPSBlcXVpdmFsZW50O1xuICAgICAgICB0aGlzLmVxdWFsaXR5UGVybWl0dGVkID0gZXF1YWxpdHlQZXJtaXR0ZWQ7XG4gICAgICAgIHRoaXMuaW52ZXJ0ID0gaW52ZXJ0O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENPTVBBUklTT04gfSBmcm9tIFwiLi4vQ09NUEFSSVNPTlwiO1xuLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTiB9LiAqL1xuZXhwb3J0IGNsYXNzIEdSRUFURVIgZXh0ZW5kcyBDT01QQVJJU09OIHtcbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLlBSRSB9LiAqL1xuICAgIHN0YXRpYyBQUkUoZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5QUkUoZXF1aXZhbGVudCwgZmFsc2UsIGZhbHNlLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLlBPU1QgfS4gKi9cbiAgICBzdGF0aWMgUE9TVChlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBDT01QQVJJU09OLlBPU1QoZXF1aXZhbGVudCwgZmFsc2UsIGZhbHNlLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLklOVkFSSUFOVCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQoZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5JTlZBUklBTlQoZXF1aXZhbGVudCwgZmFsc2UsIGZhbHNlLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLmNvbnN0cnVjdG9yIH0uICovXG4gICAgY29uc3RydWN0b3IoZXF1aXZhbGVudCkge1xuICAgICAgICBzdXBlcihlcXVpdmFsZW50LCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLmVxdWl2YWxlbnQgPSBlcXVpdmFsZW50O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENPTVBBUklTT04gfSBmcm9tIFwiLi4vQ09NUEFSSVNPTlwiO1xuLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTiB9LiAqL1xuZXhwb3J0IGNsYXNzIEdSRUFURVJfT1JfRVFVQUwgZXh0ZW5kcyBDT01QQVJJU09OIHtcbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLlBSRSB9LiAqL1xuICAgIHN0YXRpYyBQUkUoZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5QUkUoZXF1aXZhbGVudCwgdHJ1ZSwgZmFsc2UsIHBhdGgsIGRiYywgaGludCk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uUE9TVCB9LiAqL1xuICAgIHN0YXRpYyBQT1NUKGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIENPTVBBUklTT04uUE9TVChlcXVpdmFsZW50LCB0cnVlLCBmYWxzZSwgcGF0aCwgZGJjLCBoaW50KTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5JTlZBUklBTlQgfS4gKi9cbiAgICBzdGF0aWMgSU5WQVJJQU5UKGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIENPTVBBUklTT04uSU5WQVJJQU5UKGVxdWl2YWxlbnQsIHRydWUsIGZhbHNlLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLmNvbnN0cnVjdG9yIH0uICovXG4gICAgY29uc3RydWN0b3IoZXF1aXZhbGVudCkge1xuICAgICAgICBzdXBlcihlcXVpdmFsZW50LCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZXF1aXZhbGVudCA9IGVxdWl2YWxlbnQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ09NUEFSSVNPTiB9IGZyb20gXCIuLi9DT01QQVJJU09OXCI7XG4vKiogU2VlIHtAbGluayBDT01QQVJJU09OIH0uICovXG5leHBvcnQgY2xhc3MgTEVTUyBleHRlbmRzIENPTVBBUklTT04ge1xuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uUFJFIH0uICovXG4gICAgc3RhdGljIFBSRShlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBDT01QQVJJU09OLlBSRShlcXVpdmFsZW50LCBmYWxzZSwgdHJ1ZSwgcGF0aCwgZGJjLCBoaW50KTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5QT1NUIH0uICovXG4gICAgc3RhdGljIFBPU1QoZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5QT1NUKGVxdWl2YWxlbnQsIGZhbHNlLCB0cnVlLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLklOVkFSSUFOVCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQoZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5JTlZBUklBTlQoZXF1aXZhbGVudCwgZmFsc2UsIHRydWUsIHBhdGgsIGRiYywgaGludCk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uY29uc3RydWN0b3IgfS4gKi9cbiAgICBjb25zdHJ1Y3RvcihlcXVpdmFsZW50KSB7XG4gICAgICAgIHN1cGVyKGVxdWl2YWxlbnQsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5lcXVpdmFsZW50ID0gZXF1aXZhbGVudDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDT01QQVJJU09OIH0gZnJvbSBcIi4uL0NPTVBBUklTT05cIjtcbi8qKiBTZWUge0BsaW5rIENPTVBBUklTT04gfS4gKi9cbmV4cG9ydCBjbGFzcyBMRVNTX09SX0VRVUFMIGV4dGVuZHMgQ09NUEFSSVNPTiB7XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5QUkUgfS4gKi9cbiAgICBzdGF0aWMgUFJFKGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIENPTVBBUklTT04uUFJFKGVxdWl2YWxlbnQsIHRydWUsIHRydWUsIHBhdGgsIGRiYywgaGludCk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uUE9TVCB9LiAqL1xuICAgIHN0YXRpYyBQT1NUKGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIENPTVBBUklTT04uUE9TVChlcXVpdmFsZW50LCB0cnVlLCB0cnVlLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLklOVkFSSUFOVCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQoZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5JTlZBUklBTlQoZXF1aXZhbGVudCwgdHJ1ZSwgdHJ1ZSwgcGF0aCwgZGJjLCBoaW50KTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jb25zdHJ1Y3RvciB9LiAqL1xuICAgIGNvbnN0cnVjdG9yKGVxdWl2YWxlbnQpIHtcbiAgICAgICAgc3VwZXIoZXF1aXZhbGVudCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZXF1aXZhbGVudCA9IGVxdWl2YWxlbnQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgREJDIH0gZnJvbSBcIi4uL0RCQ1wiO1xuLyoqXG4gKiBBIHtAbGluayBEQkMgfSBkZWZpbmluZyB0aGF0IHR3byB7QGxpbmsgb2JqZWN0IH1zIGdvdHRhIGJlIGVxdWFsLlxuICpcbiAqIEByZW1hcmtzXG4gKiBNYWludGFpbmVyOiBDYWxsYXJpLCBTYWx2YXRvcmUgKFhEQkNAV2FYQ29kZS5uZXQpICovXG5leHBvcnQgY2xhc3MgRVEgZXh0ZW5kcyBEQkMge1xuICAgIC8vICNyZWdpb24gQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdmFsdWUgKip0b0NoZWNrKiogaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCAqKmVxdWl2YWxlbnQqKi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrXHRcdFRoZSB2YWx1ZSB0aGF0IGhhcyB0byBiZSBlcXVhbCB0byBpdCdzIHBvc3NpYmxlICoqZXF1aXZhbGVudCoqIGZvciB0aGlzIHtAbGluayBEQkMgfSB0byBiZSBmdWxmaWxsZWQuXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnRcdFRoZSB7QGxpbmsgb2JqZWN0IH0gdGhlIG9uZSAqKnRvQ2hlY2sqKiBoYXMgdG8gYmUgZXF1YWwgdG8gaW4gb3JkZXIgZm9yIHRoaXMge0BsaW5rIERCQyB9IHRvIGJlXG4gICAgICogXHRcdFx0XHRcdFx0ZnVsZmlsbGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVFJVRSBpZiB0aGUgdmFsdWUgKip0b0NoZWNrKiogYW5kIHRoZSAqKmVxdWl2YWxlbnQqKiBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlciwgb3RoZXJ3aXNlIEZBTFNFLiAqL1xuICAgIHN0YXRpYyBjaGVja0FsZ29yaXRobShcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IDxleHBsYW5hdGlvbj5cbiAgICB0b0NoZWNrLCBlcXVpdmFsZW50LCBpbnZlcnQpIHtcbiAgICAgICAgaWYgKCFpbnZlcnQgJiYgZXF1aXZhbGVudCAhPT0gdG9DaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGBWYWx1ZSBoYXMgdG8gdG8gYmUgZXF1YWwgdG8gXCIke2VxdWl2YWxlbnR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnZlcnQgJiYgZXF1aXZhbGVudCA9PT0gdG9DaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGBWYWx1ZSBtdXN0IG5vdCB0byBiZSBlcXVhbCB0byBcIiR7ZXF1aXZhbGVudH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgRVEuY2hlY2tBbGdvcml0aG0gfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHtAbGluayBEQkMgfSBpcyBmdWxmaWxsZWRcbiAgICAgKiBieSB0aGUgdGFnZ2VkIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcXVpdmFsZW50XHRTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUFJFKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogVG8gY2hlY2sgZm9yIFVOREVGSU5FRCBhbmQgTlVMTC5cbiAgICBlcXVpdmFsZW50LCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjUHJlY29uZGl0aW9uKCh2YWx1ZSwgdGFyZ2V0LCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVRLmNoZWNrQWxnb3JpdGhtKHZhbHVlLCBlcXVpdmFsZW50LCBpbnZlcnQpO1xuICAgICAgICB9LCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZC1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBtZXRob2QncyByZXR1cm52YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcXVpdmFsZW50XHRTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHRTZWUge0BsaW5rIERCQy5Qb3N0Y29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUE9TVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFRvIGNoZWNrIGZvciBVTkRFRklORUQgYW5kIE5VTEwuXG4gICAgZXF1aXZhbGVudCwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY1Bvc3Rjb25kaXRpb24oKHZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRVEuY2hlY2tBbGdvcml0aG0odmFsdWUsIGVxdWl2YWxlbnQsIGludmVydCk7XG4gICAgICAgIH0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZmllbGQtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBFUS5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgZmllbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXF1aXZhbGVudFx0U2VlIHtAbGluayBFUS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0U2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uICovXG4gICAgc3RhdGljIElOVkFSSUFOVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFRvIGNoZWNrIGZvciBVTkRFRklORUQgYW5kIE5VTEwuXG4gICAgZXF1aXZhbGVudCwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY0ludmFyaWFudChbbmV3IEVRKGVxdWl2YWxlbnQsIGludmVydCldLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvLyAjcmVnaW9uIFJlZmVyZW5jZWQgQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vXG4gICAgLy8gRm9yIHVzYWdlIGluIGR5bmFtaWMgc2NlbmFyaW9zIChsaWtlIHdpdGggQUUtREJDKS5cbiAgICAvL1xuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBFUS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqLCB7QGxpbmsgRVEuZXF1aXZhbGVudCB9IGFuZCB7QGxpbmsgRVEuaW52ZXJ0IH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSB0byBjaGVjayBhZ2FpbnN0IE5VTEwgJiBVTkRFRklORUQuXG4gICAgY2hlY2sodG9DaGVjaykge1xuICAgICAgICByZXR1cm4gRVEuY2hlY2tBbGdvcml0aG0odG9DaGVjaywgdGhpcy5lcXVpdmFsZW50LCB0aGlzLmludmVydCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBFUS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUgc3BlY2lmaWVkICoqdHlwZSoqIC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFNlZSB7QGxpbmsgRVEuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSAqKkNBTkRJREFURSoqICoqdG9DaGVjayoqIGRvZXNuJ3QgZnVsZmlsbCB0aGlzIHtAbGluayBFUSB9LlxuICAgICAqXG4gICAgICogQHRocm93cyBBIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0gaWYgdGhlICoqQ0FORElEQVRFKiogKip0b0NoZWNrKiogZG9lcyBub3QgZnVsZmlsbCB0aGlzIHtAbGluayBFUSB9LiovXG4gICAgc3RhdGljIHRzQ2hlY2sodG9DaGVjaywgZXF1aXZhbGVudCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBFUS5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCBlcXVpdmFsZW50LCBmYWxzZSk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0b0NoZWNrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERCQy5JbmZyaW5nZW1lbnQocmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoaXMge0BsaW5rIEVRIH0gYnkgc2V0dGluZyB0aGUgcHJvdGVjdGVkIHByb3BlcnR5IHtAbGluayBFUS5lcXVpdmFsZW50IH0gdXNlZCBieSB7QGxpbmsgRVEuY2hlY2sgfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcXVpdmFsZW50IFNlZSB7QGxpbmsgRVEuY2hlY2sgfS4gKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFRvIGJlIGFibGUgdG8gbWF0Y2ggVU5ERUZJTkVEIGFuZCBOVUxMLlxuICAgIGVxdWl2YWxlbnQsIGludmVydCA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZXF1aXZhbGVudCA9IGVxdWl2YWxlbnQ7XG4gICAgICAgIHRoaXMuaW52ZXJ0ID0gaW52ZXJ0O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEVRIH0gZnJvbSBcIi4uL0VRXCI7XG4vKipcbiAqIERJRkZFUkVOVCBjbGFzcyBmb3IgaW5lcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBUaGlzIGNsYXNzIGV4dGVuZHMgRVEgYW5kIHByb3ZpZGVzIG1ldGhvZHMgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBkaWZmZXJlbnQgKG5vdCBlcXVhbClcbiAqIGZyb20gYSBzcGVjaWZpZWQgZXF1aXZhbGVudCB2YWx1ZS4gSXQgaW52ZXJ0cyB0aGUgZXF1YWxpdHkgY2hlY2sgYnkgYWx3YXlzIHBhc3NpbmdcbiAqIGB0cnVlYCBmb3IgdGhlIGludmVydCBwYXJhbWV0ZXIgdG8gdGhlIHBhcmVudCBFUSBjbGFzcyBtZXRob2RzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgY2xhc3MgcHJvdmlkZXMgcHJlY29uZGl0aW9uIChQUkUpLCBwb3N0Y29uZGl0aW9uIChQT1NUKSwgYW5kIGludmFyaWFudCAoSU5WQVJJQU5UKVxuICogY2hlY2tzIGZvciBEZXNpZ24gYnkgQ29udHJhY3QgcHJvZ3JhbW1pbmcgcGF0dGVybnMuXG4gKlxuICogQHNlZSB7QGxpbmsgQ09NUEFSSVNPTn1cbiAqIEBzZWUge0BsaW5rIEVRfVxuICovXG5leHBvcnQgY2xhc3MgRElGRkVSRU5UIGV4dGVuZHMgRVEge1xuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uUFJFIH0uICovXG4gICAgc3RhdGljIFBSRShlcXVpdmFsZW50LCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBFUS5QUkUoZXF1aXZhbGVudCwgdHJ1ZSwgcGF0aCwgZGJjLCBoaW50KTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5QT1NUIH0uICovXG4gICAgc3RhdGljIFBPU1QoZXF1aXZhbGVudCwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gRVEuUE9TVChlcXVpdmFsZW50LCB0cnVlLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLklOVkFSSUFOVCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQoZXF1aXZhbGVudCwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gRVEuSU5WQVJJQU5UKGVxdWl2YWxlbnQsIHRydWUsIHBhdGgsIGRiYywgaGludCk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uY29uc3RydWN0b3IgfS4gKi9cbiAgICBjb25zdHJ1Y3RvcihlcXVpdmFsZW50KSB7XG4gICAgICAgIHN1cGVyKGVxdWl2YWxlbnQsIHRydWUpO1xuICAgICAgICB0aGlzLmVxdWl2YWxlbnQgPSBlcXVpdmFsZW50O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERCQyB9IGZyb20gXCIuLi9EQkNcIjtcbi8qKlxuICogQSB7QGxpbmsgREJDIH0gZGVmaW5pbmcgdGhhdCB0aGUgYW4ge0BsaW5rIG9iamVjdCB9cyBnb3R0YSBiZSBhbiBpbnN0YW5jZSBvZiBhIGNlcnRhaW4ge0BsaW5rIElOU1RBTkNFLnJlZmVyZW5jZSB9LlxuICpcbiAqIEByZW1hcmtzXG4gKiBNYWludGFpbmVyOiBTYWx2YXRvcmUgQ2FsbGFyaSAoWERCQ0BXYVhDb2RlLm5ldCkgKi9cbmV4cG9ydCBjbGFzcyBJTlNUQU5DRSBleHRlbmRzIERCQyB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSB2YWx1ZSAqKnRvQ2hlY2sqKiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkICoqcmVmZXJlbmNlKiouXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVja1x0VGhlIHZhbHVlIHRoYXQgaGFzIHRvIGJlIGFuIGluc3RhbmNlIG9mIHRoZSAqKnJlZmVyZW5jZSoqIGluIG9yZGVyIGZvciB0aGlzIHtAbGluayBEQkMgfVxuICAgICAqIFx0XHRcdFx0XHR0byBiZSBmdWxmaWxsZWQuXG4gICAgICogQHBhcmFtIHJlZmVyZW5jZVx0VGhlIHtAbGluayBvYmplY3QgfSB0aGUgb25lICoqdG9DaGVjayoqIGhhcyB0byBiZSBhbiBpbnN0YW5jZSBvZi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIGlzIGFuIGluc3RhbmNlIG9mIHRoZSAqcmVmZXJlbmNlKiosICoqdW5kZWZpbmVkKiogb3IgKipudWxsKiosIG90aGVyd2lzZSBGQUxTRS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEluIG9yZGVyIHRvIHBlcmZvcm0gYW4gXCJpbnN0YW5jZW9mXCIgY2hlY2suXG4gICAgc3RhdGljIGNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIC4uLnJlZmVyZW5jZXMpIHtcbiAgICAgICAgaWYgKHRvQ2hlY2sgPT09IG51bGwgfHwgdG9DaGVjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiByZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICBpZiAodG9DaGVjayBpbnN0YW5jZW9mIHJlZikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgVmFsdWUgaGFzIHRvIGJlIGFuIGluc3RhbmNlIG9mIFwiJHtyZWZlcmVuY2VzLm1hcChyZWYgPT4gcmVmLm5hbWUgfHwgcmVmKS5qb2luKCcsICcpfVwiIGJ1dCBpcyBvZiB0eXBlIFwiJHt0eXBlb2YgdG9DaGVja31cImA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHtAbGluayBEQkMgfSBpcyBmdWxmaWxsZWRcbiAgICAgKiBieSB0aGUgdGFnZ2VkIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2VcdFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUFJFKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogSW4gb3JkZXIgdG8gcGVyZm9ybSBhbiBcImluc3RhbmNlb2ZcIiBjaGVjay5cbiAgICByZWZlcmVuY2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY1ByZWNvbmRpdGlvbigodmFsdWUsIHRhcmdldCwgbWV0aG9kTmFtZSwgcGFyYW1ldGVySW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSh2YWx1ZSwgcmVmZXJlbmNlKTtcbiAgICAgICAgfSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBtZXRob2QtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgbWV0aG9kJ3MgcmV0dXJudmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlXHRTZWUge0BsaW5rIElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFNlZSB7QGxpbmsgREJDLlBvc3Rjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uICovXG4gICAgc3RhdGljIFBPU1QoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBJbiBvcmRlciB0byBwZXJmb3JtIGFuIFwiaW5zdGFuY2VvZlwiIGNoZWNrLlxuICAgIHJlZmVyZW5jZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjUG9zdGNvbmRpdGlvbigodmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSh2YWx1ZSwgcmVmZXJlbmNlKTtcbiAgICAgICAgfSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBmaWVsZC1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBtZXRob2QncyByZXR1cm52YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2VcdFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0U2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICogQHBhcmFtIGRiY1x0U2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS4gKi9cbiAgICBzdGF0aWMgSU5WQVJJQU5UKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogSW4gb3JkZXIgdG8gcGVyZm9ybSBhbiBcImluc3RhbmNlb2ZcIiBjaGVjay5cbiAgICByZWZlcmVuY2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY0ludmFyaWFudChbbmV3IElOU1RBTkNFKHJlZmVyZW5jZSldLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvLyAjcmVnaW9uIFJlZmVyZW5jZWQgQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vXG4gICAgLy8gRm9yIHVzYWdlIGluIGR5bmFtaWMgc2NlbmFyaW9zIChsaWtlIHdpdGggQUUtREJDKS5cbiAgICAvL1xuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUge0BsaW5rIElOU1RBTkNFLnJlZmVyZW5jZSB9IC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG19LiAqL1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogPGV4cGxhbmF0aW9uPlxuICAgIGNoZWNrKHRvQ2hlY2spIHtcbiAgICAgICAgcmV0dXJuIElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIHRoaXMucmVmZXJlbmNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHlwZS1zYWZlIGNoZWNrIHRoYXQgdmFsaWRhdGVzIGlmIGEgdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgYSBzcGVjaWZpZWQgcmVmZXJlbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvQ2hlY2sgXHRUaGUgdmFsdWUgdG8gY2hlY2sgZm9yIGluc3RhbmNlIHZhbGlkaXR5LlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2VcdFRoZSB7QGxpbmsgb2JqZWN0IH0gdGhlIG9uZSAqKnRvQ2hlY2sqKiBoYXMgdG8gYmUgYW4gaW5zdGFuY2Ugb2YuXG4gICAgICogQHBhcmFtIGhpbnRcdFx0QW4gb3B0aW9uYWwge0BsaW5rIHN0cmluZyB9IHByb3ZpZGluZyBleHRyYSBpbmZvcm1hdGlvbiBpbiBjYXNlIG9mIGFuIGluZnJpbmdlbWVudC5cbiAgICAgKiBAcGFyYW0gaWRcdFx0QSB7QGxpbmsgc3RyaW5nIH0gaWRlbnRpZnlpbmcgdGhpcyB7QGxpbmsgSU5TVEFOQ0UgfSB2aWEgdGhlIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0tTWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSAqKkNBTkRJREFURSoqICoqdG9DaGVjayoqIGlmIGl0IGZ1bGZpbGxzIHRoaXMge0BsaW5rIElOU1RBTkNFIH0uXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIEEge0BsaW5rIERCQy5JbmZyaW5nZW1lbnQgfSBpZiB0aGUgKipDQU5ESURBVEUqKiAqKnRvQ2hlY2sqKiBkb2VzIG5vdCBmdWxmaWxsIHRoaXMge0BsaW5rIElOU1RBTkNFIH0uICovXG4gICAgc3RhdGljIHRzQ2hlY2sodG9DaGVjaywgcmVmZXJlbmNlLCBoaW50ID0gdW5kZWZpbmVkLCBpZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gSU5TVEFOQ0UudHNDaGVja011bHRpKHRvQ2hlY2ssIFtyZWZlcmVuY2VdLCBoaW50LCBpZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUge0BsaW5rIElOU1RBTkNFLnJlZmVyZW5jZSB9IC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFx0U2VlIHtAbGluayBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2VcdFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRBbiBvcHRpb25hbCB7QGxpbmsgc3RyaW5nIH0gcHJvdmlkaW5nIGV4dHJhIGluZm9ybWF0aW9uIGluIGNhc2Ugb2YgYW4gaW5mcmluZ2VtZW50LlxuICAgICAqIEBwYXJhbSBpZFx0XHRBIHtAbGluayBzdHJpbmcgfSBpZGVudGlmeWluZyB0aGlzIHtAbGluayBJTlNUQU5DRSB9IHZpYSB0aGUge0BsaW5rIERCQy5JbmZyaW5nZW1lbnQgfS1NZXNzYWdlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlICoqQ0FORElEQVRFKiogKip0b0NoZWNrKiogZG9lc24ndCBmdWxmaWxsIHRoaXMge0BsaW5rIElOU1RBTkNFIH0uXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIEEge0BsaW5rIERCQy5JbmZyaW5nZW1lbnQgfSBpZiB0aGUgKipDQU5ESURBVEUqKiAqKnRvQ2hlY2sqKiBkb2VzIG5vdCBmdWxmaWxsIHRoaXMge0BsaW5rIERFRklORUQgfS4gKi9cbiAgICBzdGF0aWMgdHNDaGVja011bHRpKHRvQ2hlY2ssIHJlZmVyZW5jZXMsIGhpbnQgPSB1bmRlZmluZWQsIGlkID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIC4uLnJlZmVyZW5jZXMpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9DaGVjaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEQkMuSW5mcmluZ2VtZW50KGAke2lkID8gYCgke2lkfSkgYCA6IFwiXCJ9JHtyZXN1bHR9ICR7aGludCA/IGDinKggJHtoaW50fSDinKhgIDogXCJcIn1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoaXMge0BsaW5rIElOU1RBTkNFIH0gYnkgc2V0dGluZyB0aGUgcHJvdGVjdGVkIHByb3BlcnR5IHtAbGluayBJTlNUQU5DRS5yZWZlcmVuY2UgfSB1c2VkIGJ5IHtAbGluayBJTlNUQU5DRS5jaGVjayB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlZmVyZW5jZSBTZWUge0BsaW5rIElOU1RBTkNFLmNoZWNrIH0uICovXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4gICAgY29uc3RydWN0b3IocmVmZXJlbmNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERCQyB9IGZyb20gXCIuLi9EQkNcIjtcbi8qKlxuICogQSB7QGxpbmsgREJDIH0gcHJvdmlkaW5nIHtAbGluayBSRUdFWCB9LWNvbnRyYWN0cyBhbmQgc3RhbmRhcmQge0BsaW5rIFJlZ0V4cCB9IGZvciBjb21tb24gdXNlIGNhc2VzIGluIHtAbGluayBSRUdFWC5zdGRFeHAgfS5cbiAqXG4gKiBAcmVtYXJrc1xuICogTWFpbnRhaW5lcjogQ2FsbGFyaSwgU2FsdmF0b3JlIChYREJDQFdhWENvZGUubmV0KSAqL1xuZXhwb3J0IGNsYXNzIFJFR0VYIGV4dGVuZHMgREJDIHtcbiAgICAvLyAjcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIGNvbXBsaWVzIHRvIHRoZSB7QGxpbmsgUmVnRXhwIH0gKipleHByZXNzaW9uKiouXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVja1x0XHRUaGUgdmFsdWUgdGhhdCBoYXMgY29tcGx5IHRvIHRoZSB7QGxpbmsgUmVnRXhwIH0gKipleHByZXNzaW9uKiogZm9yIHRoaXMge0BsaW5rIERCQyB9IHRvIGJlIGZ1bGZpbGxlZC5cbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvblx0VGhlIHtAbGluayBSZWdFeHAgfSB0aGUgb25lICoqdG9DaGVjayoqIGhhcyBjb21wbHkgdG8gaW4gb3JkZXIgZm9yIHRoaXMge0BsaW5rIERCQyB9IHRvIGJlXG4gICAgICogXHRcdFx0XHRcdFx0ZnVsZmlsbGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVFJVRSBpZiB0aGUgdmFsdWUgKip0b0NoZWNrKiogY29tcGxpZXMgd2l0aCB0aGUge0BsaW5rIFJlZ0V4cCB9ICoqZXhwcmVzc2lvbioqLCBvdGhlcndpc2UgRkFMU0UuICovXG4gICAgc3RhdGljIGNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIGV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKHRvQ2hlY2sgPT09IHVuZGVmaW5lZCB8fCB0b0NoZWNrID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICghZXhwcmVzc2lvbi50ZXN0KHRvQ2hlY2spKSB7XG4gICAgICAgICAgICByZXR1cm4gYFZhbHVlIGhhcyB0byBjb21wbHkgdG8gcmVndWxhciBleHByZXNzaW9uIFwiJHtleHByZXNzaW9ufVwiYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwYXJhbWV0ZXItZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGV4cHJlc3Npb25cdFNlZSB7QGxpbmsgUkVHRVguY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LiAqL1xuICAgIHN0YXRpYyBQUkUoZXhwcmVzc2lvbiwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjUHJlY29uZGl0aW9uKCh2YWx1ZSwgdGFyZ2V0LCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFJFR0VYLmNoZWNrQWxnb3JpdGhtKHZhbHVlLCBleHByZXNzaW9uKTtcbiAgICAgICAgfSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBtZXRob2QtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgbWV0aG9kJ3MgcmV0dXJudmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvblx0U2VlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0U2VlIHtAbGluayBEQkMuUG9zdGNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uICovXG4gICAgc3RhdGljIFBPU1QoZXhwcmVzc2lvbiwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjUG9zdGNvbmRpdGlvbigodmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBSRUdFWC5jaGVja0FsZ29yaXRobSh2YWx1ZSwgZXhwcmVzc2lvbik7XG4gICAgICAgIH0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZmllbGQtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgZmllbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvblx0U2VlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0U2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEBwYXJhbSBoaW50XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uICovXG4gICAgc3RhdGljIElOVkFSSUFOVChleHByZXNzaW9uLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5kZWNJbnZhcmlhbnQoW25ldyBSRUdFWChleHByZXNzaW9uKV0sIHBhdGgsIGRiYywgaGludCk7XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vICNyZWdpb24gUmVmZXJlbmNlZCBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy9cbiAgICAvLyBGb3IgdXNhZ2UgaW4gZHluYW1pYyBzY2VuYXJpb3MgKGxpa2Ugd2l0aCBBRS1EQkMpLlxuICAgIC8vXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUge0BsaW5rIFJFR0VYLmNoZWNrQWxnb3JpdGhtIH0gcGFzc2luZyB0aGUgdmFsdWUgKip0b0NoZWNrKiogYW5kIHtAbGluayBSRUdFWC5lcXVpdmFsZW50IH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBTZWUge0BsaW5rIFJFR0VYLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICBjaGVjayh0b0NoZWNrKSB7XG4gICAgICAgIHJldHVybiBSRUdFWC5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0aGlzLmV4cHJlc3Npb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUeXBlLXNhZmUgY2hlY2sgdGhhdCB2YWxpZGF0ZXMgYSB2YWx1ZSBhZ2FpbnN0IGEgcmVndWxhciBleHByZXNzaW9uIGFuZCByZXR1cm5zIGl0IGFzIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrXHRcdFRoZSB2YWx1ZSB0byBjaGVjayBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAgICogQHBhcmFtIGV4cHJlc3Npb25cdFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdmFsaWRhdGUgYWdhaW5zdC5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdE9wdGlvbmFsIGhpbnQgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBlcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICAgICAqIEBwYXJhbSBpZFx0XHRcdE9wdGlvbmFsIGlkZW50aWZpZXIgdG8gaW5jbHVkZSBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgdmFsdWUgY2FzdCB0byB0aGUgQ0FORElEQVRFIHR5cGUuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtAbGluayBEQkMuSW5mcmluZ2VtZW50fSBpZiB0aGUgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4gKi9cbiAgICBzdGF0aWMgdHNDaGVjayh0b0NoZWNrLCBleHByZXNzaW9uLCBoaW50ID0gdW5kZWZpbmVkLCBpZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBSRUdFWC5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCBleHByZXNzaW9uKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2s7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgREJDLkluZnJpbmdlbWVudChgJHtpZCA/IGAoJHtpZH0pIGAgOiBcIlwifSR7cmVzdWx0fSR7aGludCA/IGAg4pyoICR7aGludH0g4pyoYCA6IFwiXCJ9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGlzIHtAbGluayBSRUdFWCB9IGJ5IHNldHRpbmcgdGhlIHByb3RlY3RlZCBwcm9wZXJ0eSB7QGxpbmsgUkVHRVguZXhwcmVzc2lvbiB9IHVzZWQgYnkge0BsaW5rIFJFR0VYLmNoZWNrIH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBTZWUge0BsaW5rIFJFR0VYLmNoZWNrIH0uICovXG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIFJlZmVyZW5jZWQgQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vICNyZWdpb24gSW4tTWV0aG9kIGNoZWNraW5nLlxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB7QGxpbmsgUkVHRVguZXhwcmVzc2lvbiB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvQ2hlY2tcdFx0U2VlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobX0uXG4gICAgICogQHBhcmFtIGV4cHJlc3Npb25cdFNlZSB7QGxpbmsgUkVHRVguY2hlY2tBbGdvcml0aG19LlxuICAgICAqL1xuICAgIHN0YXRpYyBjaGVjayh0b0NoZWNrLCBleHByZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrUmVzdWx0ID0gUkVHRVguY2hlY2tBbGdvcml0aG0odG9DaGVjaywgZXhwcmVzc2lvbik7XG4gICAgICAgIGlmICh0eXBlb2YgY2hlY2tSZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEQkMuSW5mcmluZ2VtZW50KGNoZWNrUmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKiBTdG9yZXMgb2Z0ZW4gdXNlZCB7QGxpbmsgUmVnRXhwIH1zLiAqL1xuUkVHRVguc3RkRXhwID0ge1xuICAgIGh0bWxBdHRyaWJ1dGVOYW1lOiAvXlthLXpBLVpfOl1bYS16QS1aMC05Xy46LV0qJC8sXG4gICAgZU1haWw6IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kL2ksXG4gICAgcHJvcGVydHk6IC9eWyRfQS1aYS16XVskX0EtWmEtejAtOV0qJC8sXG4gICAgdXJsOiAvXig/Oig/Omh0dHA6fGh0dHBzP3xmdHApOlxcL1xcLyk/KD86XFxTKyg/OjpcXFMqKT9AKT8oPzpsb2NhbGhvc3R8KD86W2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/XFwuKStbYS16QS1aXXsyLH0pKD86OlxcZHsyLDV9KT8oPzpcXC8oPzpbXFx3XFwtXFwuXSpcXC8pKltcXHdcXC1cXC5dKyg/OlxcP1xcUyopPyg/OiNcXFMqKT8pPyQvaSxcbiAgICBrZXlQYXRoOiAvXihbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXC4pKlthLXpBLVpfJF1bYS16QS1aMC05XyRdKiQvLFxuICAgIGRhdGU6IC9eXFxkezEsNH1bLlxcLy1dXFxkezEsMn1bLlxcLy1dXFxkezEsNH0kL2ksXG4gICAgZGF0ZUZvcm1hdDogL14oKER7MSwyfVsuLy1dTXsxLDJ9Wy4vLV1ZezEsNH0pfChNezEsMn1bLi8tXUR7MSwyfVsuLy1dWXsxLDR9KXxZezEsNH1bLi8tXUR7MSwyfVsuLy1dTXsxLDJ9fChZezEsNH1bLi8tXU17MSwyfVsuLy1dRHsxLDJ9KSkkL2ksXG4gICAgY3NzU2VsZWN0b3I6IC9eKD86XFwqfCNbXFx3LV0rfFxcLltcXHctXSt8KD86W1xcdy1dK3xcXCopKD86Oig/OltcXHctXSsoPzpcXChbXFx3LV0rXFwpKT8pKyk/KD86XFxbKD86W1xcdy1dKyg/Oig/Oj18fj18XFx8PXxcXCo9fFxcJD18XFxePSlcXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFtcXHctXSspXFxzKik/KT9cXF0pK3xcXFtcXHMqW1xcdy1dK1xccyo9XFxzKig/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXFx3LV0rKVxccypcXF0pKD86LFxccyooPzpcXCp8I1tcXHctXSt8XFwuW1xcdy1dK3woPzpbXFx3LV0rfFxcKikoPzo6KD86W1xcdy1dKyg/OlxcKFtcXHctXStcXCkpPykrKT8oPzpcXFsoPzpbXFx3LV0rKD86KD86PXx+PXxcXHw9fFxcKj18XFwkPXxcXF49KVxccyooPzpcIlteXCJdKlwifCdbXiddKid8W1xcdy1dKylcXHMqKT8pP1xcXSkrfFxcW1xccypbXFx3LV0rXFxzKj1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFtcXHctXSspXFxzKlxcXSkpKiQvLFxuICAgIGJvb2xlYW46IC9eKFRSVUV8RkFMU0UpJC9pXG59O1xuIiwiaW1wb3J0IHsgREJDIH0gZnJvbSBcIi4uL0RCQ1wiO1xuLyoqXG4gKiBBIHtAbGluayBEQkMgfSBkZWZpbmluZyB0aGF0IGFuIHtAbGluayBvYmplY3QgfXMgZ290dGEgYmUgb2YgY2VydGFpbiB7QGxpbmsgVFlQRS50eXBlIH0uXG4gKlxuICogQHJlbWFya3NcbiAqIEF1dGhvcjogXHRcdFNhbHZhdG9yZSBDYWxsYXJpIChDYWxsYXJpQFdhWENvZGUubmV0KSAvIDIwMjVcbiAqIE1haW50YWluZXI6XHRTYWx2YXRvcmUgQ2FsbGFyaSAoWERCQ0BXYVhDb2RlLm5ldCkgKi9cbmV4cG9ydCBjbGFzcyBUWVBFIGV4dGVuZHMgREJDIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIG9mIHRoZSAqKnR5cGUqKiBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVja1x0VGhlIHtAbGluayBPYmplY3QgfSB3aGljaCdzICoqdHlwZSoqIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB0eXBlXHRcdFRoZSB0eXBlIHRoZSB7QGxpbmsgb2JqZWN0fSAqKnRvQ2hlY2sqKiBoYXMgdG8gYmUgb2YuIENhbiBiZSBhIHNpbmdsZSB0eXBlIG9yIG11bHRpcGxlIHR5cGVzIHNlcGFyYXRlZCBieSBcInxcIi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIG9mIHRoZSBzcGVjaWZpZWQgKip0eXBlKiosIG90aGVyd2lzZSBGQUxTRS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSBmb3IgZHluYW1pYyB0eXBlIGNoZWNraW5nIG9mIGFsc28gVU5ERUZJTkVELlxuICAgIHN0YXRpYyBjaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0eXBlKSB7XG4gICAgICAgIGlmICh0b0NoZWNrID09PSB1bmRlZmluZWQgfHwgdG9DaGVjayA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCB0eXBlcyA9IHR5cGUuc3BsaXQoXCJ8XCIpLm1hcCh0ID0+IHQudHJpbSgpKTtcbiAgICAgICAgY29uc3QgYWN0dWFsVHlwZSA9IHR5cGVvZiB0b0NoZWNrO1xuICAgICAgICAvLyAjcmVnaW9uIENoZWNrIGlmIHRoZSBhY3R1YWwgdHlwZSBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzXG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlVmFsaWRUeXBlb2Y6IE5lY2Vzc2FyeVxuICAgICAgICBjb25zdCBpc1ZhbGlkID0gdHlwZXMuc29tZSh0ID0+IGFjdHVhbFR5cGUgPT09IHQpO1xuICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFZhbHVlIGhhcyB0byB0byBiZSBvZiB0eXBlIFwiJHt0eXBlfVwiIGJ1dCBpcyBvZiB0eXBlIFwiJHthY3R1YWxUeXBlfVwiYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBgVmFsdWUgaGFzIHRvIHRvIGJlIG9mIHR5cGUgXCIke3R5cGVzLmpvaW4oXCIgfCBcIil9XCIgYnV0IGlzIG9mIHR5cGUgXCIke2FjdHVhbFR5cGV9XCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgaWYgdGhlIGFjdHVhbCB0eXBlIG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXNcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGVcdFNlZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRBIDo6LXNlcGFyYXRlZCBsaXN0IG9mIGRvdHRlZCBwYXRocyB0byBjaGVjay4gRWFjaCBwYXRoIHBvaW50cyB0byBhIHByb3BlcnR5IHdpdGhpbiB0aGUgcGFyYW1ldGVyIHZhbHVlLlxuICAgICAqIFx0XHRcdFx0VW5kZWZpbmVkIHByb3BlcnRpZXMgYXJlIHNraXBwZWQuIFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uICovXG4gICAgc3RhdGljIFBSRSh0eXBlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5kZWNQcmVjb25kaXRpb24oKHZhbHVlLCB0YXJnZXQsIG1ldGhvZE5hbWUsIHBhcmFtZXRlckluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gVFlQRS5jaGVja0FsZ29yaXRobSh2YWx1ZSwgdHlwZSk7XG4gICAgICAgIH0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgbWV0aG9kLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgbWV0aG9kJ3MgcmV0dXJudmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZVx0U2VlIHtAbGluayBUWVBFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdEEgOjotc2VwYXJhdGVkIGxpc3Qgb2YgZG90dGVkIHBhdGhzIHRvIGNoZWNrLiBFYWNoIHBhdGggcG9pbnRzIHRvIGEgcHJvcGVydHkgd2l0aGluIHRoZSBwYXJhbWV0ZXIgdmFsdWUuXG4gICAgICogXHRcdFx0XHRVbmRlZmluZWQgcHJvcGVydGllcyBhcmUgc2tpcHBlZC4gU2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0U2VlIHtAbGluayBEQkMuZGVjUG9zdGNvbmRpdGlvbiB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBEQkMuZGVjUG9zdGNvbmRpdGlvbiB9LiAqL1xuICAgIHN0YXRpYyBQT1NUKHR5cGUsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY1Bvc3Rjb25kaXRpb24oKHZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gVFlQRS5jaGVja0FsZ29yaXRobSh2YWx1ZSwgdHlwZSk7XG4gICAgICAgIH0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZmllbGQtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBUWVBFLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlXHRTZWUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0QSA6Oi1zZXBhcmF0ZWQgbGlzdCBvZiBkb3R0ZWQgcGF0aHMgdG8gY2hlY2suIEVhY2ggcGF0aCBwb2ludHMgdG8gYSBwcm9wZXJ0eSB3aXRoaW4gdGhlIHBhcmFtZXRlciB2YWx1ZS5cbiAgICAgKiBcdFx0XHRcdFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGFyZSBza2lwcGVkLiBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQodHlwZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjSW52YXJpYW50KFtuZXcgVFlQRSh0eXBlKV0sIHBhdGgsIGRiYywgaGludCk7XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vICNyZWdpb24gUmVmZXJlbmNlZCBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy9cbiAgICAvLyBGb3IgdXNhZ2UgaW4gZHluYW1pYyBzY2VuYXJpb3MgKGxpa2Ugd2l0aCBBRS1EQkMpLlxuICAgIC8vXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfSBwYXNzaW5nIHRoZSB2YWx1ZSAqKnRvQ2hlY2sqKiBhbmQgdGhlIHtAbGluayBUWVBFLnR5cGUgfSAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBTZWUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobX0uICovXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4gICAgY2hlY2sodG9DaGVjaykge1xuICAgICAgICByZXR1cm4gVFlQRS5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0aGlzLnR5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUge0BsaW5rIFRZUEUudHlwZSB9IC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrXHRTZWUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gdHlwZVx0XHRTZWUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRBbiBvcHRpb25hbCB7QGxpbmsgc3RyaW5nIH0gcHJvdmlkaW5nIGV4dHJhIGluZm9ybWF0aW9uIGluIGNhc2Ugb2YgYW4gaW5mcmluZ2VtZW50LlxuICAgICAqIEBwYXJhbSBpZFx0XHRBIHtAbGluayBzdHJpbmcgfSBpZGVudGlmeWluZyB0aGlzIHtAbGluayBUWVBFIH0gdmlhIHRoZSB7QGxpbmsgREJDLkluZnJpbmdlbWVudCB9LU1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgKipDQU5ESURBVEUqKiAqKnRvQ2hlY2sqKiBkb2Vzbid0IGZ1bGZpbGwgdGhpcyB7QGxpbmsgVFlQRSB9LlxuICAgICAqXG4gICAgICogQHRocm93cyBBIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0gaWYgdGhlICoqQ0FORElEQVRFKiogKip0b0NoZWNrKiogZG9lcyBub3QgZnVsZmlsbCB0aGlzIHtAbGluayBERUZJTkVEIH0uICovXG4gICAgc3RhdGljIHRzQ2hlY2sodG9DaGVjaywgdHlwZSwgaGludCA9IHVuZGVmaW5lZCwgaWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gVFlQRS5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0eXBlKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2s7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgREJDLkluZnJpbmdlbWVudChgJHtpZCA/IGAoJHtpZH0pIGAgOiBcIlwifSR7cmVzdWx0fSR7aGludCA/IGAg4pyoICR7aGludH0g4pyoYCA6IFwiXCJ9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGlzIHtAbGluayBUWVBFIH0gYnkgc2V0dGluZyB0aGUgcHJvdGVjdGVkIHByb3BlcnR5IHtAbGluayBUWVBFLnR5cGUgfSB1c2VkIGJ5IHtAbGluayBUWVBFLmNoZWNrIH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSBTZWUge0BsaW5rIFRZUEUuY2hlY2sgfS4gKi9cbiAgICBjb25zdHJ1Y3Rvcih0eXBlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgfVxufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJ2YXIgX19kZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn07XG52YXIgX19tZXRhZGF0YSA9ICh0aGlzICYmIHRoaXMuX19tZXRhZGF0YSkgfHwgZnVuY3Rpb24gKGssIHYpIHtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEoaywgdik7XG59O1xudmFyIF9fcGFyYW0gPSAodGhpcyAmJiB0aGlzLl9fcGFyYW0pIHx8IGZ1bmN0aW9uIChwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cbn07XG5pbXBvcnQgeyBEQkMgfSBmcm9tIFwiLi9EQkNcIjtcbmltcG9ydCB7IFJFR0VYIH0gZnJvbSBcIi4vREJDL1JFR0VYXCI7XG5pbXBvcnQgeyBFUSB9IGZyb20gXCIuL0RCQy9FUVwiO1xuaW1wb3J0IHsgVFlQRSB9IGZyb20gXCIuL0RCQy9UWVBFXCI7XG5pbXBvcnQgeyBBRSB9IGZyb20gXCIuL0RCQy9BRVwiO1xuaW1wb3J0IHsgSU5TVEFOQ0UgfSBmcm9tIFwiLi9EQkMvSU5TVEFOQ0VcIjtcbmltcG9ydCB7IEdSRUFURVIgfSBmcm9tIFwiLi9EQkMvQ09NUEFSSVNPTi9HUkVBVEVSXCI7XG5pbXBvcnQgeyBHUkVBVEVSX09SX0VRVUFMIH0gZnJvbSBcIi4vREJDL0NPTVBBUklTT04vR1JFQVRFUl9PUl9FUVVBTFwiO1xuaW1wb3J0IHsgTEVTUyB9IGZyb20gXCIuL0RCQy9DT01QQVJJU09OL0xFU1NcIjtcbmltcG9ydCB7IExFU1NfT1JfRVFVQUwgfSBmcm9tIFwiLi9EQkMvQ09NUEFSSVNPTi9MRVNTX09SX0VRVUFMXCI7XG5pbXBvcnQgeyBESUZGRVJFTlQgfSBmcm9tIFwiLi9EQkMvRVEvRElGRkVSRU5UXCI7XG4vKiogRGVtb25zdHJhdGl2ZSB1c2Ugb2YgKipEKiplc2lnbiAqKkIqKnkgKipDKipvbnRyYWN0IERlY29yYXRvcnMgKi9cbmV4cG9ydCBjbGFzcyBEZW1vIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gI3JlZ2lvbiBDaGVjayBQcm9wZXJ0eSBEZWNvcmF0b3JcbiAgICAgICAgdGhpcy50ZXN0UHJvcGVydHkgPSBcImFcIjtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBTdGF0aWMgTWV0aG9kIHdpdGggUGFyYW12YWx1ZVByb3ZpZGVyXG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgUHJvcGVydHkgRGVjb3JhdG9yXG4gICAgLy8gI3JlZ2lvbiBDaGVjayBQYXJhbWV0ZXIuICYgUmV0dXJudmFsdWUgRGVjb3JhdG9yXG4gICAgdGVzdFBhcmFtdmFsdWVBbmRSZXR1cm52YWx1ZShhKSB7XG4gICAgICAgIHJldHVybiBgeHh4eCR7YX1gO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIFBhcmFtZXRlci4gJiBSZXR1cm52YWx1ZSBEZWNvcmF0b3JcbiAgICAvLyAjcmVnaW9uIENoZWNrIFJldHVybnZhbHVlIERlY29yYXRvclxuICAgIHRlc3RSZXR1cm52YWx1ZShhKSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIFJldHVybnZhbHVlIERlY29yYXRvclxuICAgIC8vICNyZWdpb24gQ2hlY2sgRVEtREJDICYgUGF0aCB0byBwcm9wZXJ0eSBvZiBQYXJhbWV0ZXItdmFsdWVcbiAgICB0ZXN0RVFBbmRQYXRoKG8pIHsgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgRVEtREJDICYgUGF0aCB0byBwcm9wZXJ0eSBvZiBQYXJhbWV0ZXItdmFsdWVcbiAgICAvLyAjcmVnaW9uIENoZWNrIEVRLURCQyAmIFBhdGggdG8gcHJvcGVydHkgb2YgUGFyYW1ldGVyLXZhbHVlIHdpdGggSW52ZXJzaW9uXG4gICAgdGVzdEVRQW5kUGF0aFdpdGhJbnZlcnNpb24obykgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBFUS1EQkMgJiBQYXRoIHRvIHByb3BlcnR5IG9mIFBhcmFtZXRlci12YWx1ZSB3aXRoIEludmVyc2lvblxuICAgIC8vICNyZWdpb24gQ2hlY2sgVFlQRVxuICAgIHRlc3RUWVBFKG8pIHsgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgVFlQRVxuICAgIC8vICNyZWdpb24gQ2hlY2sgQUVcbiAgICB0ZXN0QUUoeCkgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBBRVxuICAgIC8vICNyZWdpb24gQ2hlY2sgUkVHRVggd2l0aCBBRVxuICAgIHRlc3RSRUdFWFdpdGhBRSh4KSB7IH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIFJFR0VYIHdpdGggQUVcbiAgICAvLyAjcmVnaW9uIENoZWNrIElOU1RBTkNFXG4gICAgdGVzdElOU1RBTkNFKGNhbmRpZGF0ZSkgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBJTlNUQU5DRVxuICAgIC8vICNyZWdpb24gQ2hlY2sgQUUgUmFuZ2VcbiAgICB0ZXN0QUVSYW5nZSh4KSB7IH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIEFFIFJhbmdlXG4gICAgLy8gI3JlZ2lvbiBDaGVjayBBRSBJbmRleFxuICAgIHRlc3RBRUluZGV4KHgpIHsgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgQUUgSW5kZXhcbiAgICAvLyAjcmVnaW9uIENoZWNrIENvbXBhcmlzb25cbiAgICB0ZXN0R1JFQVRFUihpbnB1dCkgeyB9XG4gICAgdGVzdEdSRUFURVJfT1JfRVFVQUwoaW5wdXQpIHsgfVxuICAgIHRlc3RMRVNTKGlucHV0KSB7IH1cbiAgICB0ZXN0TEVTU19PUl9FUVVBTChpbnB1dCkgeyB9XG4gICAgdGVzdERJRkZFUkVOVChpbnB1dCkgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBDb21wYXJpc29uXG4gICAgLy8gI3JlZ2lvbiBDaGVjayBTdGF0aWMgTWV0aG9kIHdpdGggUGFyYW12YWx1ZVByb3ZpZGVyXG4gICAgc3RhdGljIHRlc3RTdGF0aWNNZXRob2QobWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgcmV0dXJuIGAke21lc3NhZ2V9IHJlcGVhdGVkICR7Y291bnR9IHRpbWVzYDtcbiAgICB9XG59XG5fX2RlY29yYXRlKFtcbiAgICBSRUdFWC5JTlZBUklBTlQoL15hJC8pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0UHJvcGVydHlcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIFJFR0VYLlBPU1QoL154eHh4LiokLyksXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIFJFR0VYLlBSRSgvaG9sbGEqL2cpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbU3RyaW5nXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIFN0cmluZylcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RQYXJhbXZhbHVlQW5kUmV0dXJudmFsdWVcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBSRUdFWC5QT1NUKC9eeHh4eC4qJC8pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtTdHJpbmddKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgU3RyaW5nKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdFJldHVybnZhbHVlXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEVRLlBSRShcIlNFTEVDVFwiLCBmYWxzZSwgXCJ0YWdOYW1lXCIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbSFRNTEVsZW1lbnRdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdEVRQW5kUGF0aFwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBFUS5QUkUoXCJTRUxFQ1RcIiwgdHJ1ZSwgXCJ0YWdOYW1lXCIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbSFRNTEVsZW1lbnRdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdEVRQW5kUGF0aFdpdGhJbnZlcnNpb25cIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgVFlQRS5QUkUoXCJzdHJpbmdcIikpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtPYmplY3RdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdFRZUEVcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgQUUuUFJFKFtuZXcgVFlQRShcInN0cmluZ1wiKV0pKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbQXJyYXldKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdEFFXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEFFLlBSRShuZXcgUkVHRVgoL14oP2k6KE5PVyl8KFsrLV1cXGQrW2RteV0pKSQvaSkpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbQXJyYXldKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdFJFR0VYV2l0aEFFXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlclxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogVGVzdFxuICAgICxcbiAgICBfX3BhcmFtKDAsIElOU1RBTkNFLlBSRShEYXRlKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0SU5TVEFOQ0VcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgQUUuUFJFKFtuZXcgVFlQRShcInN0cmluZ1wiKSwgbmV3IFJFR0VYKC9eYWJjJC8pXSwgMSwgMikpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtBcnJheV0pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0QUVSYW5nZVwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBBRS5QUkUoW25ldyBUWVBFKFwic3RyaW5nXCIpLCBuZXcgUkVHRVgoL15hYmMkLyldLCAxKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW0FycmF5XSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RBRUluZGV4XCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEdSRUFURVIuUFJFKDIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbTnVtYmVyXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RHUkVBVEVSXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEdSRUFURVJfT1JfRVFVQUwuUFJFKDIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbTnVtYmVyXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RHUkVBVEVSX09SX0VRVUFMXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIExFU1MuUFJFKDIwKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW051bWJlcl0pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0TEVTU1wiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBMRVNTX09SX0VRVUFMLlBSRSgyMCkpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtOdW1iZXJdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdExFU1NfT1JfRVFVQUxcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgRElGRkVSRU5ULlBSRSgyMCkpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtOdW1iZXJdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdERJRkZFUkVOVFwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBUWVBFLlBSRShcInN0cmluZ1wiKSksXG4gICAgX19wYXJhbSgxLCBUWVBFLlBSRShcIm51bWJlclwiKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW1N0cmluZywgTnVtYmVyXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIFN0cmluZylcbl0sIERlbW8sIFwidGVzdFN0YXRpY01ldGhvZFwiLCBudWxsKTtcbmNvbnN0IGRlbW8gPSBuZXcgRGVtbygpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RQcm9wZXJ0eSA9IFwiYWJkXCI7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiSU5WQVJJQU5UIEluZnJpbmdlbWVudFwiLCBcIk9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0UHJvcGVydHkgPSBcImFcIjtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJJTlZBUklBTlQgT0tcIik7XG5jb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbmRlbW8udGVzdFBhcmFtdmFsdWVBbmRSZXR1cm52YWx1ZShcImhvbGxhXCIpO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIlBBUkFNRVRFUi0gJiBSRVRVUk5WQUxVRSBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RQYXJhbXZhbHVlQW5kUmV0dXJudmFsdWUoXCJ5eXl5XCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIlBBUkFNRVRFUi0gJiBSRVRVUk5WQUxVRSBJbmZyaW5nZW1lbnRcIiwgXCJPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdFJldHVybnZhbHVlKFwieHh4eFwiKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJSRVRVUk5WQUxVRSBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RSZXR1cm52YWx1ZShcInl5eXlcIik7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiUkVUVVJOVkFMVUUgSW5mcmluZ2VtZW50XCIsIFwiT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RFUUFuZFBhdGgoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiRVEgd2l0aCBQYXRoIEluZnJpbmdlbWVudCBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RFUUFuZFBhdGhXaXRoSW52ZXJzaW9uKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIikpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkVRIHdpdGggUGF0aCBhbmQgSW52ZXJzaW9uIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdFRZUEUoXCJ4XCIpO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIlRZUEUgT0tcIik7XG5jb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbnRyeSB7XG4gICAgZGVtby50ZXN0VFlQRSgwKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJUWVBFIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdEFFKFtcIjExXCIsIFwiMTBcIiwgXCJiXCJdKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJBRSBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RBRShbXCIxMVwiLCAxMSwgXCJiXCJdKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJBRSBJbmZyaW5nZW1lbnQgT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RSRUdFWFdpdGhBRShbXCIrMWRcIiwgXCJOT1dcIiwgXCItMTB5XCJdKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJSRUdFWCB3aXRoIEFFIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdFJFR0VYV2l0aEFFKFtcIisxZFwiLCBcIis1ZFwiLCBcIi14MTB5XCJdKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJSRUdFWCB3aXRoIEFFIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdElOU1RBTkNFKG5ldyBEYXRlKCkpO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIklOU1RBTkNFIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdElOU1RBTkNFKGRlbW8pO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOU1RBTkNFIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdEFFUmFuZ2UoWzExLCBcImFiY1wiLCBcImFiY1wiXSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiQUUgUmFuZ2UgT0tcIik7XG5jb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbnRyeSB7XG4gICAgZGVtby50ZXN0QUVSYW5nZShbMTEsIFwiYWJjXCIsIC9hL2ddKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJBRSBSYW5nZSBJbmZyaW5nZW1lbnQgT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RBRUluZGV4KFsxMSwgXCJhYmNcIiwgXCJhYmNcIl0pO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIkFFIEluZGV4IE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdEFFSW5kZXgoW1wiMTFcIiwgMTIsIFwiL2EvZ1wiXSk7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiQUUgSW5kZXggSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0R1JFQVRFUigxMSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiR1JFQVRFUiBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RHUkVBVEVSKDIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkdSRUFURVIgSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0R1JFQVRFUl9PUl9FUVVBTCgyKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJHUkVBVEVSX09SX0VRVUFMIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdEdSRUFURVJfT1JfRVFVQUwoMSk7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiR1JFQVRFUl9PUl9FUVVBTCBJbmZyaW5nZW1lbnQgT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RMRVNTKDEwKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJMRVNTIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdExFU1MoMjApO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkxFU1MgSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0TEVTU19PUl9FUVVBTCgyMCk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiTEVTUyBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RMRVNTX09SX0VRVUFMKDIxKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJMRVNTX09SX0VRVUFMIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdERJRkZFUkVOVCgyMSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiRElGRkVSRU5UIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdERJRkZFUkVOVCgyMCk7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiRElGRkVSRU5UIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbi8vICNyZWdpb24gSW5hY3Rpdml0eSBDaGVja3NcbndpbmRvdy5XYVhDb2RlLkRCQy5leGVjdXRpb25TZXR0aW5ncy5jaGVja1ByZWNvbmRpdGlvbnMgPSBmYWxzZTtcbnRyeSB7XG4gICAgZGVtby50ZXN0TEVTU19PUl9FUVVBTCgyMSk7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJJTkFDVElWRSBQUkVDT05ESVRJT05TIE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIFBSRUNPTkRJVElPTlMgRkFJTEVEXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxud2luZG93LldhWENvZGUuREJDLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrUG9zdGNvbmRpdGlvbnMgPSBmYWxzZTtcbnRyeSB7XG4gICAgZGVtby50ZXN0UmV0dXJudmFsdWUoXCJxcXFxcVwiKTtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIFBPU1RDT05ESVRJT05TIE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIFBPU1RDT05ESVRJT05TIEZBSUxFRFwiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbndpbmRvdy5XYVhDb2RlLkRCQy5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMgPSBmYWxzZTtcbnRyeSB7XG4gICAgZGVtby50ZXN0UHJvcGVydHkgPSBcImJcIjtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIElOVkFSSUFOVFMgT0tcIik7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiSU5BQ1RJVkUgSU5WQVJJQU5UUyBGQUlMRURcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG4vLyAjZW5kcmVnaW9uIEluYWN0aXZpdHkgQ2hlY2tzXG4vLyBSZS1lbmFibGUgYWxsIGNoZWNrcyBmb3Igc3Vic2VxdWVudCB0ZXN0c1xud2luZG93LldhWENvZGUuREJDLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrUHJlY29uZGl0aW9ucyA9IHRydWU7XG53aW5kb3cuV2FYQ29kZS5EQkMuZXhlY3V0aW9uU2V0dGluZ3MuY2hlY2tQb3N0Y29uZGl0aW9ucyA9IHRydWU7XG53aW5kb3cuV2FYQ29kZS5EQkMuZXhlY3V0aW9uU2V0dGluZ3MuY2hlY2tJbnZhcmlhbnRzID0gdHJ1ZTtcbi8vICNyZWdpb24gU3RhdGljIE1ldGhvZCBUZXN0XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiVEVTVElORyBTVEFUSUMgTUVUSE9EIFdJVEggUEFSQU1WQUxVRVBST1ZJREVSXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG5EZW1vLnRlc3RTdGF0aWNNZXRob2QoXCJIZWxsb1wiLCAzKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJTVEFUSUMgTUVUSE9EIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIERlbW8udGVzdFN0YXRpY01ldGhvZChcIkhlbGxvXCIsIFwibm90IGEgbnVtYmVyXCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIlNUQVRJQyBNRVRIT0QgSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxudHJ5IHtcbiAgICBEZW1vLnRlc3RTdGF0aWNNZXRob2QoMTIzLCA1KTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJTVEFUSUMgTUVUSE9EIEluZnJpbmdlbWVudCAoZmlyc3QgcGFyYW0pIE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuLy8gI2VuZHJlZ2lvbiBTdGF0aWMgTWV0aG9kIFRlc3RcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
|
2061
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9BRS50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9DT01QQVJJU09OLnRzIiwid2VicGFjazovL3hkYmMvLi9zcmMvREJDL0NPTVBBUklTT04vR1JFQVRFUi50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9DT01QQVJJU09OL0dSRUFURVJfT1JfRVFVQUwudHMiLCJ3ZWJwYWNrOi8veGRiYy8uL3NyYy9EQkMvQ09NUEFSSVNPTi9MRVNTLnRzIiwid2VicGFjazovL3hkYmMvLi9zcmMvREJDL0NPTVBBUklTT04vTEVTU19PUl9FUVVBTC50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9FUS50cyIsIndlYnBhY2s6Ly94ZGJjLy4vc3JjL0RCQy9FUS9ESUZGRVJFTlQudHMiLCJ3ZWJwYWNrOi8veGRiYy8uL3NyYy9EQkMvSU5TVEFOQ0UudHMiLCJ3ZWJwYWNrOi8veGRiYy8uL3NyYy9EQkMvUkVHRVgudHMiLCJ3ZWJwYWNrOi8veGRiYy8uL3NyYy9EQkMvVFlQRS50cyIsIndlYnBhY2s6Ly94ZGJjL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3hkYmMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3hkYmMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly94ZGJjL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8veGRiYy8uL3NyYy9EZW1vLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJvdmlkZXMgYSAqKkQqKmVzaWduICoqQioqeSAqKkMqKm9udHJhY3QgRnJhbWV3b3JrIHVzaW5nIGRlY29yYXRvcnMuXG4gKlxuICogQHJlbWFya3NcbiAqIE1haW50YWluZXI6IENhbGxhcmksIFNhbHZhdG9yZSAoWERCQ0BXYVhDb2RlLm5ldCkgKi9cbmV4cG9ydCBjbGFzcyBEQkMge1xuICAgIHN0YXRpYyBnZXRIb3N0KCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IGdsb2JhbFRoaXM7XG4gICAgfVxuICAgIHN0YXRpYyBnZXREQkMoZGJjKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBkYmMgIT09IG51bGwgJiYgZGJjICE9PSB2b2lkIDAgPyBkYmMgOiBcIldhWENvZGUuREJDXCI7XG4gICAgICAgIGlmIChEQkMuZGJjQ2FjaGUuaGFzKHBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gREJDLmRiY0NhY2hlLmdldChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IERCQy5yZXNvbHZlREJDUGF0aChEQkMuZ2V0SG9zdCgpLCBwYXRoKTtcbiAgICAgICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgICAgICBEQkMuZGJjQ2FjaGUuc2V0KHBhdGgsIHJlc29sdmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGEgdW5pcXVlIGtleSBmb3Igc3RvcmluZyBwYXJhbWV0ZXIgdmFsdWUgcmVxdWVzdHMuXG4gICAgICogRm9ybWF0OiBcIkNsYXNzTmFtZTptZXRob2ROYW1lXCJcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0UmVxdWVzdEtleSh0YXJnZXQsIG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSB0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nID8gdGFyZ2V0Lm5hbWUgOiAoKF9hID0gdGFyZ2V0LmNvbnN0cnVjdG9yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmFtZSkgfHwgJ1Vua25vd24nO1xuICAgICAgICByZXR1cm4gYCR7Y2xhc3NOYW1lfToke1N0cmluZyhtZXRob2ROYW1lKX1gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlIGEgcmVxdWVzdCB0byBnZXQgdGhlIHZhbHVlIG9mIGEgY2VydGFpbiBwYXJhbWV0ZXIgb2Ygc3BlY2lmaWMgbWV0aG9kIGluIGEgc3BlY2lmaWMge0BsaW5rIG9iamVjdCB9LlxuICAgICAqIFRoYXQgcmVxdWVzdCBnZXRzIGVubGlzdGVkIGluIHtAbGluayBwYXJhbVZhbHVlUmVxdWVzdHMgfSB3aGljaCBpcyB1c2VkIGJ5IHtAbGluayBQYXJhbXZhbHVlUHJvdmlkZXJ9IHRvIGludm9rZSB0aGVcbiAgICAgKiBnaXZlbiBcInJlY2VwdG9yXCIgd2l0aCB0aGUgcGFyYW1ldGVyIHZhbHVlIHN0b3JlZCBpbiB0aGVyZS4gVGh1cyBhIHBhcmFtZXRlciBkZWNvcmF0b3IgdXNpbmcgdGhpcyBtZXRob2Qgd2lsbFxuICAgICAqIG5vdCByZWNlaXZlIGFueSB2YWx1ZSBvZiB0aGUgdG9wIG1ldGhvZCBpcyBub3QgdGFnZ2VkIHdpdGgge0BsaW5rIFBhcmFtdmFsdWVQcm92aWRlcn0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFyZ2V0XHRcdFRoZSB7QGxpbmsgb2JqZWN0IH0gY29udGFpbmluZyB0aGUgbWV0aG9kIHdpdGggdGhlIHBhcmFtZXRlciB3aGljaCdzIHZhbHVlIGlzIHJlcXVlc3RlZC5cbiAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZVx0VGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB3aXRoIHRoZSBwYXJhbWV0ZXIgd2hpY2gncyB2YWx1ZSBpcyByZXF1ZXN0ZWQuXG4gICAgICogQHBhcmFtIGluZGV4XHRcdFx0VGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgd2hpY2gncyB2YWx1ZSBpcyByZXF1ZXN0ZWQuXG4gICAgICogQHBhcmFtIHJlY2VwdG9yXHRcdFRoZSBtZXRob2QgdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXItdmFsdWUgc2hhbGwgYmUgcGFzc2VkIHRvIHdoZW4gaXQgYmVjb21lcyBhdmFpbGFibGUuICovXG4gICAgc3RhdGljIHJlcXVlc3RQYXJhbVZhbHVlKHRhcmdldCwgbWV0aG9kTmFtZSwgaW5kZXgsIFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogR290dGEgYmUgYW55IHNpbmNlIHBhcmFtZXRlci12YWx1ZXMgbWF5IGJlIHVuZGVmaW5lZC5cbiAgICByZWNlcHRvcikge1xuICAgICAgICBjb25zdCBrZXkgPSBEQkMuZ2V0UmVxdWVzdEtleSh0YXJnZXQsIG1ldGhvZE5hbWUpO1xuICAgICAgICBpZiAoREJDLnBhcmFtVmFsdWVSZXF1ZXN0cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgaWYgKERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuZ2V0KGtleSkuaGFzKGluZGV4KSkge1xuICAgICAgICAgICAgICAgIERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuZ2V0KGtleSkuZ2V0KGluZGV4KS5wdXNoKHJlY2VwdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuZ2V0KGtleSkuc2V0KGluZGV4LCBuZXcgQXJyYXkocmVjZXB0b3IpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuc2V0KGtleSwgbmV3IE1hcChbXG4gICAgICAgICAgICAgICAgW2luZGV4LCBuZXcgQXJyYXkocmVjZXB0b3IpXSxcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZC1kZWNvcmF0b3IgZmFjdG9yeSBjaGVja2luZyB0aGUge0BsaW5rIHBhcmFtVmFsdWVSZXF1ZXN0cyB9IGZvciB2YWx1ZS1yZXF1ZXN0cyBvZiB0aGUgbWV0aG9kJ3MgcGFyYW1ldGVyIHRodXNcbiAgICAgKiBhbHNvIHVzYWJsZSBvbiBzZXR0ZXJzLlxuICAgICAqIFdoZW4gZm91bmQgaXQgd2lsbCBpbnZva2UgdGhlIFwicmVjZXB0b3JcIiByZWdpc3RlcmVkIHRoZXJlLCBpbnRlciBhbGlhIGJ5IHtAbGluayByZXF1ZXN0UGFyYW1WYWx1ZSB9LCB3aXRoIHRoZVxuICAgICAqIHBhcmFtZXRlcidzIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhcmdldCBcdFx0VGhlIHtAbGluayBvYmplY3QgfSBob3N0aW5nIHRoZSB0YWdnZWQgbWV0aG9kIGFzIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSBcdFRoZSB0YWdnZWQgbWV0aG9kJ3MgbmFtZSBhcyBwcm92aWRlZCBieSB0aGUgcnVudGltZS5cbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBcdFRoZSB7QGxpbmsgUHJvcGVydHlEZXNjcmlwdG9yIH0gYXMgcHJvdmlkZWQgYnkgdGhlIHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFByb3BlcnR5RGVzY3JpcHRvciB9IHRoYXQgd2FzIHBhc3NlZCBieSB0aGUgcnVudGltZS4gKi9cbiAgICBzdGF0aWMgUGFyYW12YWx1ZVByb3ZpZGVyKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgICAgICBjb25zdCBpc1N0YXRpYyA9IHR5cGVvZiB0YXJnZXQgPT09ICdmdW5jdGlvbic7XG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogR290dGEgYmUgYW55IHNpbmNlIHBhcmFtZXRlci12YWx1ZXMgbWF5IGJlIHVuZGVmaW5lZC5cbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAvLyAjcmVnaW9uICAgQ2hlY2sgaWYgYSB2YWx1ZSBvZiBvbmUgb2YgdGhlIG1ldGhvZCdzIHBhcmFtZXRlciBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHBhc3MgaXQgdG8gdGhlXG4gICAgICAgICAgICAvLyAgICAgICAgICAgcmVjZXB0b3IsIGlmIHNvLlxuICAgICAgICAgICAgY29uc3QgYWN0dWFsVGFyZ2V0ID0gaXNTdGF0aWMgPyB0aGlzIDogdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IERCQy5nZXRSZXF1ZXN0S2V5KGFjdHVhbFRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgaWYgKERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuZ2V0KGtleSkua2V5cygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlY2VwdG9yIG9mIERCQy5wYXJhbVZhbHVlUmVxdWVzdHMuZ2V0KGtleSkuZ2V0KGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VwdG9yKGFyZ3NbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk5vIHBhcmFtZXRlciB2YWx1ZSByZXF1ZXN0cyBmb3VuZCBmb3Iga2V5OlwiLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gI2VuZHJlZ2lvblx0Q2hlY2sgaWYgYSB2YWx1ZSBvZiBvbmUgb2YgdGhlIG1ldGhvZCdzIHBhcmFtZXRlciBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHBhc3MgaXQgdG8gdGhlXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgcmVjZXB0b3IsIGlmIHNvLlxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBQYXJhbWV0ZXItdmFsdWUgcmVxdWVzdHMuXG4gICAgLy8gI3JlZ2lvbiBDbGFzc1xuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHktZGVjb3JhdG9yIGZhY3Rvcnkgc2VydmluZyBhcyBhICoqRCoqZXNpZ24gKipCKip5ICoqQyoqb250cmFjdCBJbnZhcmlhbnQuXG4gICAgICogVGhpcyBpbnZhcmlhbnQgYWltcyB0byBjaGVjayB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG5vdCB0aGUgdmFsdWUgdG8gYmUgZ2V0IG9yIHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250cmFjdHMgVGhlIHtAbGluayBEQkMgfS1Db250cmFjdHMgdGhlIHZhbHVlIHNoYWxsIHVwaG9sZC5cbiAgICAgKlxuICAgICAqIEB0aHJvd3MgXHRBIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0gd2hlbmV2ZXIgdGhlIHByb3BlcnR5IGlzIHRyaWVkIHRvIGJlIGdldCBvciBzZXQgd2l0aG91dCB0aGUgaW5zdGFuY2Ugb2YgaXQncyBjbGFzc1xuICAgICAqIFx0XHRcdGZ1bGZpbGxpbmcgdGhlIHNwZWNpZmllZCAqKmNvbnRyYWN0cyoqLiAqL1xuICAgIHN0YXRpYyBkZWNDbGFzc0ludmFyaWFudChjb250cmFjdHMsIHBhdGggPSB1bmRlZmluZWQsIGRiYyA9IFwiV2FYQ29kZS5EQkNcIikge1xuICAgICAgICByZXR1cm4gKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpID0+IHtcbiAgICAgICAgICAgIGlmICghREJDLmdldERCQyhkYmMpLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrSW52YXJpYW50cykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsU2V0dGVyID0gZGVzY3JpcHRvci5zZXQ7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEdldHRlciA9IGRlc2NyaXB0b3IuZ2V0O1xuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOZWNlc3NhcnkgdG8gaW50ZXJjZXB0IFVOREVGSU5FRCBhbmQgTlVMTC5cbiAgICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICAgIC8vICNyZWdpb24gUmVwbGFjZSBvcmlnaW5hbCBwcm9wZXJ0eS5cbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIURCQy5nZXREQkMoZGJjKS5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFsVmFsdWUgPSBwYXRoID8gREJDLnJlc29sdmUodGhpcywgcGF0aCkgOiB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAvLyAjcmVnaW9uIENoZWNrIGlmIGFsbCBcImNvbnRyYWN0c1wiIGFyZSBmdWxmaWxsZWQuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJhY3Qgb2YgY29udHJhY3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250cmFjdC5jaGVjayhyZWFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkMuZ2V0REJDKGRiYykucmVwb3J0RmllbGRJbmZyaW5nZW1lbnQocmVzdWx0LCB0YXJnZXQsIHBhdGgsIHByb3BlcnR5S2V5LCByZWFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgaWYgYWxsIFwiY29udHJhY3RzXCIgYXJlIGZ1bGZpbGxlZC5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsR2V0dGVyW3Byb3BlcnR5S2V5XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldChuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIURCQy5nZXREQkMoZGJjKS5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFsVmFsdWUgPSBwYXRoID8gREJDLnJlc29sdmUodGhpcywgcGF0aCkgOiB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAvLyAjcmVnaW9uIENoZWNrIGlmIGFsbCBcImNvbnRyYWN0c1wiIGFyZSBmdWxmaWxsZWQuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJhY3Qgb2YgY29udHJhY3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250cmFjdC5jaGVjayhyZWFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkMuZ2V0REJDKGRiYykucmVwb3J0RmllbGRJbmZyaW5nZW1lbnQocmVzdWx0LCB0YXJnZXQsIHBhdGgsIHByb3BlcnR5S2V5LCByZWFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgaWYgYWxsIFwiY29udHJhY3RzXCIgYXJlIGZ1bGZpbGxlZC5cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyAjZW5kcmVnaW9uIFJlcGxhY2Ugb3JpZ2luYWwgcHJvcGVydHkuXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ2xhc3NcbiAgICAvLyAjcmVnaW9uIEludmFyaWFudFxuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHktZGVjb3JhdG9yIGZhY3Rvcnkgc2VydmluZyBhcyBhICoqRCoqZXNpZ24gKipCKip5ICoqQyoqb250cmFjdCBJbnZhcmlhbnQuXG4gICAgICogU2luY2UgdGhlIHZhbHVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgb3Igc2V0IGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkICoqY29udHJhY3RzKiogdGhlIHZhbHVlIHdpbGwgb25seSBiZSBjaGVja2VkXG4gICAgICogd2hlbiBhc3NpZ25pbmcgaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udHJhY3RzIFRoZSB7QGxpbmsgREJDIH0tQ29udHJhY3RzIHRoZSB2YWx1ZSBzaGFsbCB1cGhvbGQuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIFx0QSB7QGxpbmsgREJDLkluZnJpbmdlbWVudCB9IHdoZW5ldmVyIHRoZSBwcm9wZXJ0eSBpcyB0cmllZCB0byBiZSBzZXQgdG8gYSB2YWx1ZSB0aGF0IGRvZXMgbm90IGNvbXBseSB0byB0aGVcbiAgICAgKiBcdFx0XHRzcGVjaWZpZWQgKipjb250cmFjdHMqKiwgYnkgdGhlIHJldHVybmVkIG1ldGhvZC4qL1xuICAgIHN0YXRpYyBkZWNJbnZhcmlhbnQoY29udHJhY3RzLCBwYXRoID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuICh0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIURCQy5nZXREQkMoZGJjKS5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSB0byBpbnRlcmNlcHQgVU5ERUZJTkVEIGFuZCBOVUxMLlxuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgLy8gI3JlZ2lvbiBSZXBsYWNlIG9yaWdpbmFsIHByb3BlcnR5LlxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgICAgICBzZXQobmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFEQkMuZ2V0REJDKGRiYykuZXhlY3V0aW9uU2V0dGluZ3MuY2hlY2tJbnZhcmlhbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhbFZhbHVlID0gcGF0aCA/IERCQy5yZXNvbHZlKG5ld1ZhbHVlLCBwYXRoKSA6IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAvLyAjcmVnaW9uIENoZWNrIGlmIGFsbCBcImNvbnRyYWN0c1wiIGFyZSBmdWxmaWxsZWQuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJhY3Qgb2YgY29udHJhY3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250cmFjdC5jaGVjayhyZWFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkMuZ2V0REJDKGRiYykucmVwb3J0RmllbGRJbmZyaW5nZW1lbnQocmVzdWx0LCB0YXJnZXQsIHBhdGgsIHByb3BlcnR5S2V5LCByZWFsVmFsdWUsIGhpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgaWYgYWxsIFwiY29udHJhY3RzXCIgYXJlIGZ1bGZpbGxlZC5cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyAjZW5kcmVnaW9uIFJlcGxhY2Ugb3JpZ2luYWwgcHJvcGVydHkuXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gSW52YXJpYW50XG4gICAgLy8gI3JlZ2lvbiBQb3N0Y29uZGl0aW9uXG4gICAgLyoqXG4gICAgICogQSBtZXRob2QgZGVjb3JhdG9yIGZhY3RvcnkgY2hlY2tpbmcgdGhlIHJlc3VsdCBvZiBhIG1ldGhvZCB3aGVuZXZlciBpdCBpcyBpbnZva2VkIHRodXMgYWxzbyB1c2FibGUgb24gZ2V0dGVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGVja1x0VGhlICoqKHRvQ2hlY2s6IGFueSwgb2JqZWN0LCBzdHJpbmcpID0+IGJvb2xlYW4gfCBzdHJpbmcqKiB0byB1c2UgZm9yIGNoZWNraW5nLlxuICAgICAqIEBwYXJhbSBkYmNcdFNlZSB7QGxpbmsgREJDLnJlc29sdmVEQkNQYXRoIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFRoZSBkb3R0ZWQgcGF0aCByZWZlcnJpbmcgdG8gdGhlIGFjdHVhbCB2YWx1ZSB0byBjaGVjaywgc3RhcnRpbmcgZm9ybSB0aGUgc3BlY2lmaWVkIG9uZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSAqKiggdGFyZ2V0IDogb2JqZWN0LCBwcm9wZXJ0eUtleSA6IHN0cmluZywgZGVzY3JpcHRvciA6IFByb3BlcnR5RGVzY3JpcHRvciApIDogUHJvcGVydHlEZXNjcmlwdG9yKipcbiAgICAgKiBcdFx0XHRpbnZva2VkIGJ5IFR5cGVzY3JpcHQuXG4gICAgICovXG4gICAgc3RhdGljIGRlY1Bvc3Rjb25kaXRpb24oXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOZWNlc3NhcnkgdG8gaW50ZXJjZXB0IFVOREVGSU5FRCBhbmQgTlVMTC5cbiAgICBjaGVjaywgZGJjID0gdW5kZWZpbmVkLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOZWNlc3NhcnkgdG8gaW50ZXJjZXB0IFVOREVGSU5FRCBhbmQgTlVMTC5cbiAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghREJDLmdldERCQyhkYmMpLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrUG9zdGNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vVGhpc0luU3RhdGljOiA8ZXhwbGFuYXRpb24+XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhbFZhbHVlID0gcGF0aCA/IERCQy5yZXNvbHZlKHJlc3VsdCwgcGF0aCkgOiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBjaGVjayhyZWFsVmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2hlY2tSZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgREJDLmdldERCQyhkYmMpLnJlcG9ydFJldHVybnZhbHVlSW5mcmluZ2VtZW50KGNoZWNrUmVzdWx0LCB0YXJnZXQsIHBhdGgsIHByb3BlcnR5S2V5LCByZWFsVmFsdWUsIGhpbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIFBvc3Rjb25kaXRpb25cbiAgICAvLyAjcmVnaW9uIERlY29yYXRvclxuICAgIC8vICNyZWdpb24gUHJlY29uZGl0aW9uXG4gICAgLyoqXG4gICAgICogQSBwYXJhbWV0ZXItZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCByZXF1ZXN0cyB0aGUgdGFnZ2VkIHBhcmFtZXRlcidzIHZhbHVlIHBhc3NpbmcgaXQgdG8gdGhlIHByb3ZpZGVkXG4gICAgICogXCJjaGVja1wiLW1ldGhvZCB3aGVuIHRoZSB2YWx1ZSBiZWNvbWVzIGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGVja1x0VGhlIFwiKCB1bmtub3duICkgPT4gdm9pZFwiIHRvIGJlIGludm9rZWQgYWxvbmcgd2l0aCB0aGUgdGFnZ2VkIHBhcmFtZXRlcidzIHZhbHVlIGFzIHNvb25cbiAgICAgKiBcdFx0XHRcdGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSBkYmMgIFx0U2VlIHtAbGluayBEQkMucmVzb2x2ZURCQ1BhdGggfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0VGhlIGRvdHRlZCBwYXRoIHJlZmVycmluZyB0byB0aGUgYWN0dWFsIHZhbHVlIHRvIGNoZWNrLCBzdGFydGluZyBmb3JtIHRoZSBzcGVjaWZpZWQgb25lLlxuICAgICAqIFx0XHRcdFx0TWF5IGNvbnRhaW4gOjogdG8gc2VwYXJhdGUgbXVsdGlwbGUgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgKioodGFyZ2V0OiBvYmplY3QsIG1ldGhvZE5hbWU6IHN0cmluZyB8IHN5bWJvbCwgcGFyYW1ldGVySW5kZXg6IG51bWJlciApID0+IHZvaWQqKiBpbnZva2VkIGJ5IFR5cGVzY3JpcHQtICovXG4gICAgc3RhdGljIGRlY1ByZWNvbmRpdGlvbihjaGVjaywgZGJjID0gdW5kZWZpbmVkLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHBhdGhzID0gcGF0aCA/IHBhdGgucmVwbGFjZSgvIC9nLCBcIlwiKS5zcGxpdChcIjo6XCIpIDogW3VuZGVmaW5lZF07XG4gICAgICAgIHJldHVybiAodGFyZ2V0LCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCkgPT4ge1xuICAgICAgICAgICAgREJDLnJlcXVlc3RQYXJhbVZhbHVlKHRhcmdldCwgbWV0aG9kTmFtZSwgcGFyYW1ldGVySW5kZXgsICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghREJDLmdldERCQyhkYmMpLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrUHJlY29uZGl0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2luZ2xlUGF0aCBvZiBwYXRocykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFsVmFsdWUgPSBzaW5nbGVQYXRoID8gREJDLnJlc29sdmUodmFsdWUsIHNpbmdsZVBhdGgpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrKHJlYWxWYWx1ZSwgdGFyZ2V0LCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEQkMuZ2V0REJDKGRiYykucmVwb3J0UGFyYW1ldGVySW5mcmluZ2VtZW50KHJlc3VsdCwgdGFyZ2V0LCBzaW5nbGVQYXRoLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCwgcmVhbFZhbHVlLCBoaW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgd2FybmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHdhcm5pbmcuICovXG4gICAgcmVwb3J0V2FybmluZyhtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLndhcm5pbmdTZXR0aW5ncy5sb2dUb0NvbnNvbGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGluZnJpbmdlbWVudCBhY2NvcmRpbmcgdG8gdGhlIHtAbGluayBpbmZyaW5nZW1lbnRTZXR0aW5ncyB9IGFsc28gZ2VuZXJhdGluZyBhIHByb3BlciB7QGxpbmsgc3RyaW5nIH0td3JhcHBlclxuICAgICAqIGZvciB0aGUgZ2l2ZW4gXCJtZXNzYWdlXCIgJiB2aW9sYXRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlXHRUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgdGhlIGluZnJpbmdlbWVudCBhbmQgaXQncyBwcm92ZW5pZW5jZS5cbiAgICAgKiBAcGFyYW0gdmlvbGF0b3IgXHRUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgb3IgbmFtaW5nIHRoZSB2aW9sYXRvci4gKi9cbiAgICByZXBvcnRJbmZyaW5nZW1lbnQobWVzc2FnZSwgdmlvbGF0b3IsIHRhcmdldCwgdmFsdWUsIHBhdGgsIGhpbnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgZmluYWxNZXNzYWdlID0gYFsgRnJvbSBcIiR7dmlvbGF0b3J9XCIke3R5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIiA/IGAgaW4gXCIke3RhcmdldC5uYW1lfVwiYCA6IHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIgJiYgdGFyZ2V0ICE9PSBudWxsICYmIHR5cGVvZiB0YXJnZXQuY29uc3RydWN0b3IgPT09IFwiZnVuY3Rpb25cIiA/IGAgaW4gXCIke3RhcmdldC5jb25zdHJ1Y3Rvci5uYW1lfVwiYCA6IGBpbiBcIiR7dGFyZ2V0fVwiYH0ke3BhdGggPyBgID4gXCIke3BhdGh9XCJgIDogXCJcIn06ICR7bWVzc2FnZX0gJHtoaW50ID8gYOKcqCAke2hpbnR9IOKcqGAgOiBcIlwifV1gO1xuICAgICAgICBpZiAodGhpcy5pbmZyaW5nZW1lbnRTZXR0aW5ncy50aHJvd0V4Y2VwdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERCQy5JbmZyaW5nZW1lbnQoZmluYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmZyaW5nZW1lbnRTZXR0aW5ncy5sb2dUb0NvbnNvbGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGZpbmFsTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIHBhcmFtZXRlci1pbmZyaW5nZW1lbnQgdmlhIHtAbGluayByZXBvcnRJbmZyaW5nZW1lbnQgfSBhbHNvIGdlbmVyYXRpbmcgYSBwcm9wZXIge0BsaW5rIHN0cmluZyB9LXdyYXBwZXJcbiAgICAgKiBmb3IgdGhlIGdpdmVuIFwibWVzc2FnZVwiLFwibWV0aG9kXCIsIHBhcmFtZXRlci1cImluZGV4XCIgJiB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXNzYWdlXHRUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgdGhlIGluZnJpbmdlbWVudCBhbmQgaXQncyBwcm92ZW5pZW5jZS5cbiAgICAgKiBAcGFyYW0gbWV0aG9kIFx0VGhlIHtAbGluayBzdHJpbmcgfSBkZXNjcmliaW5nIG9yIG5hbWluZyB0aGUgdmlvbGF0b3IuXG4gICAgICogQHBhcmFtIGluZGV4XHRcdFRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHdpdGhpbiB0aGUgYXJndW1lbnQgbGlzdGluZy5cbiAgICAgKiBAcGFyYW0gdmFsdWUgXHRUaGUgcGFyYW1ldGVyJ3MgdmFsdWUuICovXG4gICAgcmVwb3J0UGFyYW1ldGVySW5mcmluZ2VtZW50KG1lc3NhZ2UsIHRhcmdldCwgcGF0aCwgbWV0aG9kLCBpbmRleCwgdmFsdWUsIGhpbnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcHJvcGVySW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgIHRoaXMucmVwb3J0SW5mcmluZ2VtZW50KGBbIFBhcmFtZXRlci12YWx1ZSBcIiR7dmFsdWV9XCIgb2YgdGhlICR7cHJvcGVySW5kZXh9JHtwcm9wZXJJbmRleCA9PT0gMSA/IFwic3RcIiA6IHByb3BlckluZGV4ID09PSAyID8gXCJuZFwiIDogcHJvcGVySW5kZXggPT09IDMgPyBcInJkXCIgOiBcInRoXCJ9IHBhcmFtZXRlciBkaWQgbm90IGZ1bGZpbGwgb25lIG9mIGl0J3MgY29udHJhY3RzOiAke21lc3NhZ2V9IF1gLCBtZXRob2QsIHRhcmdldCwgdmFsdWUsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgZmllbGQtaW5mcmluZ2VtZW50IHZpYSB7QGxpbmsgcmVwb3J0SW5mcmluZ2VtZW50IH0gYWxzbyBnZW5lcmF0aW5nIGEgcHJvcGVyIHtAbGluayBzdHJpbmcgfS13cmFwcGVyXG4gICAgICogZm9yIHRoZSBnaXZlbiAqKm1lc3NhZ2UqKiAmICoqbmFtZSoqLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1lc3NhZ2VcdEEge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgdGhlIGluZnJpbmdlbWVudCBhbmQgaXQncyBwcm92ZW5pZW5jZS5cbiAgICAgKiBAcGFyYW0ga2V5IFx0XHRUaGUgcHJvcGVydHkga2V5LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFRoZSBkb3R0ZWQtcGF0aCB7QGxpbmsgc3RyaW5nIH0gdGhhdCBsZWFkcyB0byB0aGUgdmFsdWUgbm90IGZ1bGZpbGxpbmcgdGhlIGNvbnRyYWN0IHN0YXJ0aW5nIGZyb21cbiAgICAgKiBcdFx0XHRcdFx0dGhlIHRhZ2dlZCBvbmUuXG4gICAgICogQHBhcmFtIHZhbHVlXHRcdFRoZSB2YWx1ZSBub3QgZnVsZmlsbGluZyBhIGNvbnRyYWN0LiAqL1xuICAgIHJlcG9ydEZpZWxkSW5mcmluZ2VtZW50KG1lc3NhZ2UsIHRhcmdldCwgcGF0aCwga2V5LCB2YWx1ZSwgaGludCA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlcG9ydEluZnJpbmdlbWVudChgWyBOZXcgdmFsdWUgZm9yIFwiJHtrZXl9XCIke3BhdGggPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBgLiR7cGF0aH1gfSB3aXRoIHZhbHVlIFwiJHt2YWx1ZX1cIiBkaWQgbm90IGZ1bGZpbGwgb25lIG9mIGl0J3MgY29udHJhY3RzOiAke21lc3NhZ2V9IF1gLCBrZXksIHRhcmdldCwgdmFsdWUsIHBhdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgcmV0dXJudmFsdWUtaW5mcmluZ2VtZW50IGFjY29yZGluZyB2aWEge0BsaW5rIHJlcG9ydEluZnJpbmdlbWVudCB9IGFsc28gZ2VuZXJhdGluZyBhIHByb3BlciB7QGxpbmsgc3RyaW5nIH0td3JhcHBlclxuICAgICAqIGZvciB0aGUgZ2l2ZW4gXCJtZXNzYWdlXCIsXCJtZXRob2RcIiAmIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1lc3NhZ2VcdFRoZSB7QGxpbmsgc3RyaW5nIH0gZGVzY3JpYmluZyB0aGUgaW5mcmluZ2VtZW50IGFuZCBpdCdzIHByb3ZlbmllbmNlLlxuICAgICAqIEBwYXJhbSBtZXRob2QgXHRUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgb3IgbmFtaW5nIHRoZSB2aW9sYXRvci5cbiAgICAgKiBAcGFyYW0gdmFsdWVcdFx0VGhlIHBhcmFtZXRlcidzIHZhbHVlLiAqL1xuICAgIHJlcG9ydFJldHVybnZhbHVlSW5mcmluZ2VtZW50KG1lc3NhZ2UsIHRhcmdldCwgcGF0aCwgbWV0aG9kLCBcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IDxleHBsYW5hdGlvbj5cbiAgICB2YWx1ZSwgaGludCA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlcG9ydEluZnJpbmdlbWVudChgWyBSZXR1cm4tdmFsdWUgXCIke3ZhbHVlfVwiIGRpZCBub3QgZnVsZmlsbCBvbmUgb2YgaXQncyBjb250cmFjdHM6ICR7bWVzc2FnZX0gXWAsIG1ldGhvZCwgdGFyZ2V0LCB2YWx1ZSwgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgdGhpcyB7QGxpbmsgREJDIH0gYnkgc2V0dGluZyB0aGUge0BsaW5rIERCQy5pbmZyaW5nZW1lbnRTZXR0aW5ncyB9LCBkZWZpbmUgdGhlICoqV2FYQ29kZSoqIG5hbWVzcGFjZSBpblxuICAgICAqICoqd2luZG93KiogaWYgbm90IHlldCBhdmFpbGFibGUgYW5kIHNldHRpbmcgdGhlIHByb3BlcnR5ICoqREJDKiogaW4gdGhlcmUgdG8gdGhlIGluc3RhbmNlIG9mIHRoaXMge0BsaW5rIERCQyB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGluZnJpbmdlbWVudFNldHRpbmdzIFx0U2VlIHtAbGluayBEQkMuaW5mcmluZ2VtZW50U2V0dGluZ3MgfS5cbiAgICAgKiBAcGFyYW0gZXhlY3V0aW9uU2V0dGluZ3NcdFx0U2VlIHtAbGluayBEQkMuZXhlY3V0aW9uU2V0dGluZ3MgfS4gKi9cbiAgICBjb25zdHJ1Y3RvcihpbmZyaW5nZW1lbnRTZXR0aW5ncyA9IHsgdGhyb3dFeGNlcHRpb246IHRydWUsIGxvZ1RvQ29uc29sZTogZmFsc2UgfSwgZXhlY3V0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIGNoZWNrUHJlY29uZGl0aW9uczogdHJ1ZSxcbiAgICAgICAgY2hlY2tQb3N0Y29uZGl0aW9uczogdHJ1ZSxcbiAgICAgICAgY2hlY2tJbnZhcmlhbnRzOiB0cnVlLFxuICAgIH0pIHtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBQcmVjb25kaXRpb25cbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBEZWNvcmF0b3JcbiAgICAgICAgLy8gI3JlZ2lvbiBFeGVjdXRpb24gSGFuZGxpbmdcbiAgICAgICAgLyoqIFN0b3JlcyBzZXR0aW5ncyBjb25jZXJuaW5nIHRoZSBleGVjdXRpb24gb2YgY2hlY2tzLiAqL1xuICAgICAgICB0aGlzLmV4ZWN1dGlvblNldHRpbmdzID0ge1xuICAgICAgICAgICAgY2hlY2tQcmVjb25kaXRpb25zOiB0cnVlLFxuICAgICAgICAgICAgY2hlY2tQb3N0Y29uZGl0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgIGNoZWNrSW52YXJpYW50czogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBFeGVjdXRpb24gSGFuZGxpbmdcbiAgICAgICAgLy8gI3JlZ2lvbiBXYXJuaW5nIGhhbmRsaW5nLlxuICAgICAgICAvKiogU3RvcmVzIHNldHRpbmdzIGNvbmNlcm5pbmcgd2FybmluZ3MuICovXG4gICAgICAgIHRoaXMud2FybmluZ1NldHRpbmdzID0geyBsb2dUb0NvbnNvbGU6IHRydWUgfTtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBXYXJuaW5nIGhhbmRsaW5nLlxuICAgICAgICAvLyAjcmVnaW9uIGluZnJpbmdlbWVudCBoYW5kbGluZy5cbiAgICAgICAgLyoqIFN0b3JlcyB0aGUgc2V0dGluZ3MgY29uY2VybmluZyBpbmZyaW5nZW1lbnRzICovXG4gICAgICAgIHRoaXMuaW5mcmluZ2VtZW50U2V0dGluZ3MgPSB7IHRocm93RXhjZXB0aW9uOiB0cnVlLCBsb2dUb0NvbnNvbGU6IGZhbHNlIH07XG4gICAgICAgIHRoaXMuaW5mcmluZ2VtZW50U2V0dGluZ3MgPSBpbmZyaW5nZW1lbnRTZXR0aW5ncztcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4gICAgICAgIGlmIChEQkMuZ2V0SG9zdCgpLldhWENvZGUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIERCQy5nZXRIb3N0KCkuV2FYQ29kZSA9IHt9O1xuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgREJDLmdldEhvc3QoKS5XYVhDb2RlLkRCQyA9IHRoaXM7XG4gICAgICAgIERCQy5kYmNDYWNoZS5zZXQoXCJXYVhDb2RlLkRCQ1wiLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgdGhlIGRlc2lyZWQge0BsaW5rIG9iamVjdCB9IG91dCBhIGdpdmVuIG9uZSAqKnRvUmVzb2x2ZUZyb20qKiB1c2luZyB0aGUgc3BlY2lmaWVkICoqcGF0aCoqLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvUmVzb2x2ZUZyb20gVGhlIHtAbGluayBvYmplY3QgfSBzdGFydGluZyB0byByZXNvbHZlIGZyb20uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHRUaGUgZG90dGVkIHBhdGgte0BsaW5rIHN0cmluZyB9LlxuICAgICAqIFx0XHRcdFx0XHRcdFRoaXMgc3RyaW5nIHVzZXMgLiwgWy4uLl0sIGFuZCAoKSB0byByZXByZXNlbnQgYWNjZXNzaW5nIG5lc3RlZCBwcm9wZXJ0aWVzLFxuICAgICAqIFx0XHRcdFx0XHRcdGFycmF5IGVsZW1lbnRzL29iamVjdCBrZXlzLCBhbmQgY2FsbGluZyBtZXRob2RzLCByZXNwZWN0aXZlbHksIG1pbWlja2luZyBKYXZhU2NyaXB0IHN5bnRheCB0byBuYXZpZ2F0ZVxuICAgICAqIFx0XHRcdFx0XHRcdGFuIG9iamVjdCdzIHN0cnVjdHVyZS4gQ29kZSwgZS5nLiBzb21ldGhpbmcgbGlrZSBhLmIoIDEgYXMgbnVtYmVyICkuYywgd2lsbCBub3QgYmUgZXhlY3V0ZWQgYW5kXG4gICAgICogXHRcdFx0XHRcdFx0dGh1cyBtYWtlIHRoZSByZXRyaWV2YWwgZmFpbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSByZXF1ZXN0ZWQge0BsaW5rIG9iamVjdCB9LCBOVUxMIG9yIFVOREVGSU5FRC4gKi9cbiAgICBzdGF0aWMgcmVzb2x2ZSh0b1Jlc29sdmVGcm9tLCBwYXRoKSB7XG4gICAgICAgIGlmICghdG9SZXNvbHZlRnJvbSB8fCB0eXBlb2YgcGF0aCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYWNoZWRQYXJ0cyA9IERCQy5wYXRoVG9rZW5DYWNoZS5nZXQocGF0aCk7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gY2FjaGVkUGFydHMgIT09IG51bGwgJiYgY2FjaGVkUGFydHMgIT09IHZvaWQgMCA/IGNhY2hlZFBhcnRzIDogcGF0aC5yZXBsYWNlKC9cXFsoWydcIl0/KSguKj8pXFwxXFxdL2csIFwiLiQyXCIpLnNwbGl0KFwiLlwiKTsgLy8gSGFuZGxlIGluZGV4ZXJzXG4gICAgICAgIGlmICghY2FjaGVkUGFydHMpIHtcbiAgICAgICAgICAgIERCQy5wYXRoVG9rZW5DYWNoZS5zZXQocGF0aCwgcGFydHMpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdXJyZW50ID0gdG9SZXNvbHZlRnJvbTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCB0eXBlb2YgY3VycmVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtZXRob2RNYXRjaCA9IHBhcnQubWF0Y2goLyhcXHcrKVxcKCguKilcXCkvKTtcbiAgICAgICAgICAgIGlmIChtZXRob2RNYXRjaCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBtZXRob2RNYXRjaFsxXTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmdzU3RyID0gbWV0aG9kTWF0Y2hbMl07XG4gICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IGFyZ3NTdHIuc3BsaXQoXCIsXCIpLm1hcCgoYXJnKSA9PiBhcmcudHJpbSgpKTsgLy8gU2ltcGxlIGFyZ3VtZW50IHBhcnNpbmdcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFttZXRob2ROYW1lXS5hcHBseShjdXJyZW50LCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIE1ldGhvZCBub3QgZm91bmQgb3Igbm90IGEgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG59XG4vLyAjcmVnaW9uIEludGVybmFsIGNhY2hlcy5cbkRCQy5kYmNDYWNoZSA9IG5ldyBNYXAoKTtcbkRCQy5wYXRoVG9rZW5DYWNoZSA9IG5ldyBNYXAoKTtcbi8vICNlbmRyZWdpb24gSW50ZXJuYWwgY2FjaGVzLlxuLy8gI3JlZ2lvbiBQYXJhbWV0ZXItdmFsdWUgcmVxdWVzdHMuXG4vKiogU3RvcmVzIGFsbCByZXF1ZXN0IGZvciBwYXJhbWV0ZXIgdmFsdWVzIHJlZ2lzdGVyZWQgYnkge0BsaW5rIGRlY1ByZWNvbmRpdGlvbiB9LiAqL1xuREJDLnBhcmFtVmFsdWVSZXF1ZXN0cyA9IG5ldyBNYXAoKTtcbi8vICNyZWdpb24gQ2xhc3Nlc1xuLy8gI3JlZ2lvbiBFcnJvcnNcbi8qKiBBbiB7QGxpbmsgRXJyb3IgfSB0byBiZSB0aHJvd24gd2hlbmV2ZXIgYW4gaW5mcmluZ2VtZW50IGlzIGRldGVjdGVkLiAqL1xuREJDLkluZnJpbmdlbWVudCA9IGNsYXNzIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgdGhpcyB7QGxpbmsgRXJyb3IgfSBieSB0YWdnaW5nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS17QGxpbmsgc3RyaW5nIH0gYXMgYW4gWERCQy1JbmZyaW5nZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUge0BsaW5rIHN0cmluZyB9IGRlc2NyaWJpbmcgdGhlIGluZnJpbmdlbWVudC4gKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKGBbIFhEQkMgSW5mcmluZ2VtZW50ICR7bWVzc2FnZX1dYCk7XG4gICAgfVxufTtcbi8vICNlbmRyZWdpb24gRXJyb3JzXG4vLyAjZW5kcmVnaW9uIENsYXNzZXNcbi8vICNlbmRyZWdpb24gaW5mcmluZ2VtZW50IGhhbmRsaW5nLlxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgc3BlY2lmaWVkIGRvdHRlZCB7QGxpbmsgc3RyaW5nIH0tcGF0aCB0byBhIHtAbGluayBEQkMgfS5cbiAqXG4gKiBAcGFyYW0gb2JqIFx0VGhlIHtAbGluayBvYmplY3QgfSB0byBzdGFydCByZXNvbHZpbmcgZnJvbS5cbiAqIEBwYXJhbSBwYXRoIFx0VGhlIGRvdHRlZCB7QGxpbmsgc3RyaW5nIH0tcGF0aCBsZWFkaW5nIHRvIHRoZSB7QGxpbmsgREJDIH0uXG4gKlxuICogQHJldHVybnMgVGhlIHJlcXVlc3RlZCB7QGxpbmsgREJDIH0uXG4gKi9cbkRCQy5yZXNvbHZlREJDUGF0aCA9IChvYmosIHBhdGgpID0+IHBhdGggPT09IG51bGwgfHwgcGF0aCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGF0aC5zcGxpdChcIi5cIikucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3JbY3VycmVudF0sIG9iaik7XG4vLyBTZXQgdGhlIG1haW4gaW5zdGFuY2Ugd2l0aCBzdGFuZGFyZCAqKkRCQy5pbmZyaW5nZW1lbnRTZXR0aW5ncyoqLlxubmV3IERCQygpO1xuIiwiaW1wb3J0IHsgREJDIH0gZnJvbSBcIi4uL0RCQ1wiO1xuLyoqXG4gKiBBIHtAbGluayBEQkMgfSBkZWZpbmluZyB0aGF0IGFsbCBlbGVtZW50cyBvZiBhbiB7QGxpbmsgb2JqZWN0IH1zIGhhdmUgdG8gZnVsZmlsbFxuICogYSBnaXZlbiB7QGxpbmsgb2JqZWN0IH0ncyBjaGVjay1tZXRob2QgKCoqKCB0b0NoZWNrIDogYW55ICkgPT4gYm9vbGVhbiB8IHN0cmluZyoqKS5cbiAqXG4gKiBAcmVtYXJrc1xuICogTWFpbnRhaW5lcjogQ2FsbGFyaSwgU2FsdmF0b3JlIChYREJDQFdhWENvZGUubmV0KSAqL1xuZXhwb3J0IGNsYXNzIEFFIGV4dGVuZHMgREJDIHtcbiAgICAvLyAjcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgZWFjaCBlbGVtZW50IG9mIHRoZSAqKnZhbHVlKiote0BsaW5rIEFycmF5IDwgYW55ID59IGFnYWluc3QgdGhlIGdpdmVuICoqY29uZGl0aW9uKiosIGlmIGl0IGlzIG9uZS4gSWYgaXQgaXMgbm90XG4gICAgICogdGhlICoqdmFsdWUqKiBpdHNlbGYgd2lsbCBiZSBjaGVja2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbmRpdGlvblx0VGhlIHsgY2hlY2s6ICh0b0NoZWNrOiBhbnkpID0+IGJvb2xlYW4gfCBzdHJpbmcgfSB0byBjaGVjayB0aGUgKip2YWx1ZSoqIGFnYWluc3QuXG4gICAgICogQHBhcmFtIHZhbHVlXHRcdEVpdGhlciAqKnZhbHVlKiote0BsaW5rIEFycmF5IDwgYW55ID59LCB3aGljaCdzIGVsZW1lbnRzIHdpbGwgYmUgY2hlY2tlZCwgb3IgdGhlIHZhbHVlIHRvIGJlXG4gICAgICogXHRcdFx0XHRcdGNoZWNrZWQgaXRzZWxmLlxuICAgICAqIEBwYXJhbSBpbmRleFx0XHRJZiBzcGVjaWZpZWQgd2l0aCAqKmlkeEVuZCoqIGJlaW5nIHVuZGVmaW5lZCwgdGhpcyB7QGxpbmsgTnVtYmVyIH0gd2lsbCBiZSBzZWVuIGFzIHRoZSBpbmRleCBvZlxuICAgICAqIFx0XHRcdFx0XHR0aGUgdmFsdWUte0BsaW5rIEFycmF5IH0ncyBlbGVtZW50IHRvIGNoZWNrLiBJZiB2YWx1ZSBpc24ndCBhbiB7QGxpbmsgQXJyYXkgfSB0aGlzIHBhcmFtZXRlclxuICAgICAqIFx0XHRcdFx0XHR3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3QuXG4gICAgICogXHRcdFx0XHRcdFdpdGggKippZHhFbmQqKiBub3QgdW5kZWZpbmVkIHRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzcGFuIG9mIGVsZW1lbnRzIHRvXG4gICAgICogXHRcdFx0XHRcdGNoZWNrIHdpdGhpbiB0aGUgdmFsdWUte0BsaW5rIEFycmF5IH0uXG4gICAgICogQHBhcmFtIGlkeEVuZFx0SW5kaWNhdGVzIHRoZSBsYXN0IGVsZW1lbnQncyBpbmRleCAoaW5jbHVkaW5nKSBvZiB0aGUgc3BhbiBvZiB2YWx1ZS17QGxpbmsgQXJyYXkgfSBlbGVtZW50cyB0byBjaGVjay5cbiAgICAgKiBcdFx0XHRcdFx0U2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byAtMSBzcGVjaWZpZXMgdGhhdCBhbGwgdmFsdWUte0BsaW5rIEFycmF5IH0ncyBlbGVtZW50cyBiZWdpbm5pbmcgZnJvbSB0aGVcbiAgICAgKiBcdFx0XHRcdFx0c3BlY2lmaWVkICoqaW5kZXgqKiBzaGFsbCBiZSBjaGVja2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQXMgc29vbiBhcyB0aGUgKipjb25kaXRpb24qKiByZXR1cm5zIGEge0BsaW5rIHN0cmluZyB9LCBpbnN0ZWFkIG9mIFRSVUUsIHRoZSByZXR1cm5lZCBzdHJpbmcuIFRSVUUgaWYgdGhlXG4gICAgICogXHRcdFx0Kipjb25kaXRpb24qKiBuZXZlciByZXR1cm5zIGEge0BsaW5rIHN0cmluZ30uICovXG4gICAgc3RhdGljIGNoZWNrQWxnb3JpdGhtKGNvbmRpdGlvbiwgdmFsdWUsIGluZGV4LCBpZHhFbmQpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpZHhFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xICYmIGluZGV4IDwgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmRpdGlvbi5jaGVjayh2YWx1ZVtpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBWaW9sYXRpbmctQXJyYXllbGVtZW50IGF0IGluZGV4IFwiJHtpbmRleH1cIiB3aXRoIHZhbHVlIFwiJHt2YWx1ZVtpbmRleF19XCIuICR7cmVzdWx0fWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEluIG9yZGVyIGZvciBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gbm90IGNhdXNlIGFuIGVycm9yIGlmIHRoZXkgYXJlIG9taXR0ZWQuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbmRpbmcgPSBpZHhFbmQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gaWR4RW5kICE9PSAtMVxuICAgICAgICAgICAgICAgICAgICA/IGlkeEVuZCArIDFcbiAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZS5sZW5ndGhcbiAgICAgICAgICAgICAgICA6IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBpbmRleCA/IGluZGV4IDogMDsgaSA8IGVuZGluZzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29uZGl0aW9uLmNoZWNrKHZhbHVlW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgVmlvbGF0aW5nLUFycmF5ZWxlbWVudCBhdCBpbmRleCAke2l9LiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24uY2hlY2sodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHBhcmFtZXRlci1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0gd2l0aCBlaXRoZXIgbXVsdGlwbGUgb3IgYSBzaW5nbGUgb25lXG4gICAgICogb2YgdGhlICoqcmVhbENvbmRpdGlvbnMqKiB0byBjaGVjayB0aGUgdGFnZ2VkIHBhcmFtZXRlci12YWx1ZSBhZ2FpbnN0IHdpdGguXG4gICAgICogV2hlbiBzcGVjaWZ5aW5nIGFuICoqaW5kZXgqKiBhbmQgdGhlIHRhZ2dlZCBwYXJhbWV0ZXIncyAqKnZhbHVlKiogaXMgYW4ge0BsaW5rIEFycmF5IH0sIHRoZSAqKnJlYWxDb25kaXRpb25zKiogYXBwbHkgdG8gdGhlXG4gICAgICogZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkICoqaW5kZXgqKi5cbiAgICAgKiBJZiB0aGUge0BsaW5rIEFycmF5IH0gaXMgdG9vIHNob3J0IHRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIHsgY2hlY2s6ICh0b0NoZWNrOiBhbnkpID0+IGJvb2xlYW4gfCBzdHJpbmcgfSBvZlxuICAgICAqICoqcmVhbENvbmRpdGlvbnMqKiB3aWxsIGJlIHZlcmlmaWVkIHRvIFRSVUUgYXV0b21hdGljYWxseSwgY29uc2lkZXJpbmcgb3B0aW9uYWwgcGFyYW1ldGVycy5cbiAgICAgKiBJZiBhbiAqKmluZGV4KiogaXMgc3BlY2lmaWVkIGJ1dCB0aGUgdGFnZ2VkIHBhcmFtZXRlcidzIHZhbHVlIGlzbid0IGFuIGFycmF5LCB0aGUgKippbmRleCoqIGlzIHRyZWF0ZWQgYXMgYmVpbmcgdW5kZWZpbmVkLlxuICAgICAqIElmICoqaW5kZXgqKiBpcyB1bmRlZmluZWQgYW5kIHRoZSB0YWdnZWQgcGFyYW1ldGVyJ3MgdmFsdWUgaXMgYW4ge0BsaW5rIEFycmF5IH0gZWFjaCBlbGVtZW50IG9mIGl0IHdpbGwgYmUgY2hlY2tlZFxuICAgICAqIGFnYWluc3QgdGhlICoqcmVhbENvbmRpdGlvbnMqKi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWFsQ29uZGl0aW9uc1x0RWl0aGVyIG9uZSBvciBtb3JlIHsgY2hlY2s6ICh0b0NoZWNrOiBhbnkpID0+IGJvb2xlYW4gfCBzdHJpbmcgfSB0byBjaGVjayB0aGUgdGFnZ2VkIHBhcmFtZXRlci12YWx1ZVxuICAgICAqIFx0XHRcdFx0XHRcdFx0YWdhaW5zdCB3aXRoLlxuICAgICAqIEBwYXJhbSBpbmRleFx0XHRcdFx0U2VlIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gaWR4RW5kXHRcdFx0U2VlIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqXG4gICAgICogQHJldHVybnNcdEEge0BsaW5rIHN0cmluZyB9IGFzIHNvb24gYXMgb25lIHsgY2hlY2s6ICh0b0NoZWNrOiBhbnkpID0+IGJvb2xlYW4gfCBzdHJpbmcgfSBvZiAqKnJlYWxDb25kaXRpb25zKiogcmV0dXJucyBvbmUuXG4gICAgICogXHRcdFx0T3RoZXJ3aXNlIFRSVUUuICovXG4gICAgc3RhdGljIFBSRShyZWFsQ29uZGl0aW9ucywgaW5kZXggPSB1bmRlZmluZWQsIGlkeEVuZCA9IHVuZGVmaW5lZCwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjUHJlY29uZGl0aW9uKCh2YWx1ZSwgdGFyZ2V0LCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVhbENvbmRpdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjdXJyZW50Q29uZGl0aW9uIG9mIHJlYWxDb25kaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IEFFLmNoZWNrQWxnb3JpdGhtKGN1cnJlbnRDb25kaXRpb24sIHZhbHVlLCBpbmRleCwgaWR4RW5kKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwiYm9vbGVhblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQUUuY2hlY2tBbGdvcml0aG0ocmVhbENvbmRpdGlvbnMsIHZhbHVlLCBpbmRleCwgaWR4RW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZC1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0gd2l0aCBlaXRoZXIgbXVsdGlwbGUgb3IgYSBzaW5nbGUgb25lXG4gICAgICogb2YgdGhlICoqcmVhbENvbmRpdGlvbnMqKiB0byBjaGVjayB0aGUgdGFnZ2VkIG1ldGhvZCdzIHJldHVybi12YWx1ZSBhZ2FpbnN0IHdpdGguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVhbENvbmRpdGlvbnNcdEVpdGhlciBvbmUgb3IgbW9yZSB7IGNoZWNrOiAodG9DaGVjazogYW55KSA9PiBib29sZWFuIHwgc3RyaW5nIH0gdG8gY2hlY2sgdGhlIHRhZ2dlZCBwYXJhbWV0ZXItdmFsdWVcbiAgICAgKiBcdFx0XHRcdFx0XHRcdGFnYWluc3Qgd2l0aC5cbiAgICAgKiBAcGFyYW0gaW5kZXhcdFx0XHRcdFNlZSB0aGUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIGlkeEVuZFx0XHRcdFNlZSB0aGUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBoaW50XHRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zXHRBIHtAbGluayBzdHJpbmcgfSBhcyBzb29uIGFzIG9uZSB7IGNoZWNrOiAodG9DaGVjazogYW55KSA9PiBib29sZWFuIHwgc3RyaW5nIH0gb2YgKipyZWFsQ29uZGl0aW9ucyoqIHJldHVybiBvbmUuXG4gICAgICogXHRcdFx0T3RoZXJ3aXNlIFRSVUUuICovXG4gICAgc3RhdGljIFBPU1QocmVhbENvbmRpdGlvbnMsIGluZGV4ID0gdW5kZWZpbmVkLCBpZHhFbmQgPSB1bmRlZmluZWQsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY1Bvc3Rjb25kaXRpb24oKHZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWFsQ29uZGl0aW9ucykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRDb25kaXRpb24gb2YgcmVhbENvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gQUUuY2hlY2tBbGdvcml0aG0oY3VycmVudENvbmRpdGlvbiwgdmFsdWUsIGluZGV4LCBpZHhFbmQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gXCJib29sZWFuXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBBRS5jaGVja0FsZ29yaXRobShcbiAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICAgICAgICByZWFsQ29uZGl0aW9ucywgdmFsdWUsIGluZGV4LCBpZHhFbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZmllbGQtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBBRS5jaGVja0FsZ29yaXRobSB9IHdpdGggZWl0aGVyIG11bHRpcGxlIG9yIGEgc2luZ2xlIG9uZVxuICAgICAqIG9mIHRoZSAqKnJlYWxDb25kaXRpb25zKiogdG8gY2hlY2sgdGhlIHRhZ2dlZCBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWFsQ29uZGl0aW9uc1x0RWl0aGVyIG9uZSBvciBtb3JlIHsgY2hlY2s6ICh0b0NoZWNrOiBhbnkpID0+IGJvb2xlYW4gfCBzdHJpbmcgfSB0byBjaGVjayB0aGUgdGFnZ2VkIHBhcmFtZXRlci12YWx1ZVxuICAgICAqIFx0XHRcdFx0XHRcdFx0YWdhaW5zdCB3aXRoLlxuICAgICAqIEBwYXJhbSBpbmRleFx0XHRcdFx0U2VlIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gaWR4RW5kXHRcdFx0U2VlIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqXG4gICAgICogQHJldHVybnNcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQocmVhbENvbmRpdGlvbnMsIGluZGV4ID0gdW5kZWZpbmVkLCBpZHhFbmQgPSB1bmRlZmluZWQsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY0ludmFyaWFudChbbmV3IEFFKHJlYWxDb25kaXRpb25zLCBpbmRleCwgaWR4RW5kKV0sIHBhdGgsIGRiYywgaGludCk7XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vICNyZWdpb24gUmVmZXJlbmNlZCBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy9cbiAgICAvLyBGb3IgdXNhZ2UgaW4gZHluYW1pYyBzY2VuYXJpb3MgKGxpa2UgZ2xvYmFsIGZ1bmN0aW9ucykuXG4gICAgLy9cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSB7QGxpbmsgQUUuY2hlY2tBbGdvcml0aG0gfSB3aXRoIGFsbCB7QGxpbmsgQUUuY29uZGl0aW9ucyB9IGFuZCB0aGUge0BsaW5rIG9iamVjdCB9IHtAbGluayB0b0NoZWNrIH0sXG4gICAgICoge0BsaW5rIEFFLmluZGV4IH0gJiB7QGxpbmsgQUUuaWR4RW5kIH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBTZWUge0BsaW5rIEFFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICBjaGVjayh0b0NoZWNrKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY29uZGl0aW9ucykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3VycmVudENvbmRpdGlvbiBvZiB0aGlzLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBBRS5jaGVja0FsZ29yaXRobShjdXJyZW50Q29uZGl0aW9uLCB0b0NoZWNrLCB0aGlzLmluZGV4LCB0aGlzLmlkeEVuZCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwiYm9vbGVhblwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEFFLmNoZWNrQWxnb3JpdGhtKFxuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4gICAgICAgICAgICB0aGlzLmNvbmRpdGlvbnMsIHRvQ2hlY2ssIHRoaXMuaW5kZXgsIHRoaXMuaWR4RW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGlzIHtAbGluayBBRSB9IGJ5IHNldHRpbmcgdGhlIHByb3RlY3RlZCBwcm9wZXJ0eSB7QGxpbmsgQUUuY29uZGl0aW9ucyB9LCB7QGxpbmsgQUUuaW5kZXggfSBhbmQge0BsaW5rIEFFLmlkeEVuZCB9IHVzZWQgYnkge0BsaW5rIEFFLmNoZWNrIH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXF1aXZhbGVudCBTZWUge0BsaW5rIEVRLmNoZWNrIH0uICovXG4gICAgY29uc3RydWN0b3IoY29uZGl0aW9ucywgaW5kZXggPSB1bmRlZmluZWQsIGlkeEVuZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbmRpdGlvbnMgPSBjb25kaXRpb25zO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuaWR4RW5kID0gaWR4RW5kO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERCQyB9IGZyb20gXCIuLi9EQkNcIjtcbi8qKlxuICogQSB7QGxpbmsgREJDIH0gZGVmaW5pbmcgYSBjb21wYXJpc29uIGJldHdlZW4gdHdvIHtAbGluayBvYmplY3QgfXMuXG4gKlxuICogQHJlbWFya3NcbiAqIE1haW50YWluZXI6IENhbGxhcmksIFNhbHZhdG9yZSAoWERCQ0BXYVhDb2RlLm5ldCkgKi9cbmV4cG9ydCBjbGFzcyBDT01QQVJJU09OIGV4dGVuZHMgREJDIHtcbiAgICAvLyAjcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvKipcbiAgICAgKiBEb2VzIGEgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSB7QGxpbmsgb2JqZWN0IH0gKip0b0NoZWNrKiogYW5kIHRoZSAqKmVxdWl2YWxlbnQqKi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrXHRcdFRoZSB2YWx1ZSB0aGF0IGhhcyB0byBiZSBlcXVhbCB0byBpdCdzIHBvc3NpYmxlICoqZXF1aXZhbGVudCoqIGZvciB0aGlzIHtAbGluayBEQkMgfSB0byBiZSBmdWxmaWxsZWQuXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnRcdFRoZSB7QGxpbmsgb2JqZWN0IH0gdGhlIG9uZSAqKnRvQ2hlY2sqKiBoYXMgdG8gYmUgZXF1YWwgdG8gaW4gb3JkZXIgZm9yIHRoaXMge0BsaW5rIERCQyB9IHRvIGJlXG4gICAgICogXHRcdFx0XHRcdFx0ZnVsZmlsbGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVFJVRSBpZiB0aGUgdmFsdWUgKip0b0NoZWNrKiogYW5kIHRoZSAqKmVxdWl2YWxlbnQqKiBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlciwgb3RoZXJ3aXNlIEZBTFNFLiAqL1xuICAgIHN0YXRpYyBjaGVja0FsZ29yaXRobSh0b0NoZWNrLCBlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCwgaW52ZXJ0KSB7XG4gICAgICAgIGlmIChlcXVhbGl0eVBlcm1pdHRlZCAmJiAhaW52ZXJ0ICYmIHRvQ2hlY2sgPCBlcXVpdmFsZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYFZhbHVlIGhhcyB0byB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gXCIke2VxdWl2YWxlbnR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcXVhbGl0eVBlcm1pdHRlZCAmJiBpbnZlcnQgJiYgdG9DaGVjayA+IGVxdWl2YWxlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBgVmFsdWUgaGFzIHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBcIiR7ZXF1aXZhbGVudH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlcXVhbGl0eVBlcm1pdHRlZCAmJiAhaW52ZXJ0ICYmIHRvQ2hlY2sgPD0gZXF1aXZhbGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGBWYWx1ZSBoYXMgdG8gdG8gYmUgZ3JlYXRlciB0aGFuIFwiJHtlcXVpdmFsZW50fVwiYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVxdWFsaXR5UGVybWl0dGVkICYmIGludmVydCAmJiB0b0NoZWNrID49IGVxdWl2YWxlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBgVmFsdWUgaGFzIHRvIGJlIGxlc3MgdGhhbiBcIiR7ZXF1aXZhbGVudH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnRcdCAgICBTZWUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gZXF1YWxpdHlQZXJtaXR0ZWQgU2VlIHtAbGluayBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHQgICAgU2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHQgICAgU2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUFJFKGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5kZWNQcmVjb25kaXRpb24oKHZhbHVlLCB0YXJnZXQsIG1ldGhvZE5hbWUsIHBhcmFtZXRlckluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSh2YWx1ZSwgZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQsIGludmVydCk7XG4gICAgICAgIH0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgbWV0aG9kLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgbWV0aG9kJ3MgcmV0dXJudmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXF1aXZhbGVudFx0ICAgIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBlcXVhbGl0eVBlcm1pdHRlZCBTZWUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdCAgICBTZWUge0BsaW5rIERCQy5Qb3N0Y29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRcdFx0ICAgIFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUE9TVChlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjUG9zdGNvbmRpdGlvbigodmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtKHZhbHVlLCBlcXVhbGl0eVBlcm1pdHRlZCwgZXF1aXZhbGVudCwgaW52ZXJ0KTtcbiAgICAgICAgfSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBmaWVsZC1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHtAbGluayBEQkMgfSBpcyBmdWxmaWxsZWRcbiAgICAgKiBieSB0aGUgdGFnZ2VkIGZpZWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnRcdCAgICBTZWUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gZXF1YWxpdHlQZXJtaXR0ZWQgU2VlIHtAbGluayBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHQgICAgU2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHQgICAgU2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS4gKi9cbiAgICBzdGF0aWMgSU5WQVJJQU5UKGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5kZWNJbnZhcmlhbnQoW25ldyBDT01QQVJJU09OKGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkLCBpbnZlcnQpXSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy8gI3JlZ2lvbiBSZWZlcmVuY2VkIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvLyAjcmVnaW9uIER5bmFtaWMgdXNhZ2UuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUge0BsaW5rIENPTVBBUklTT04uY2hlY2tBbGdvcml0aG0gfSBwYXNzaW5nIHRoZSB2YWx1ZSAqKnRvQ2hlY2sqKiwge0BsaW5rIENPTVBBUklTT04uZXF1aXZhbGVudCB9IGFuZCB7QGxpbmsgQ09NUEFSSVNPTi5pbnZlcnQgfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICBjaGVjayh0b0NoZWNrKSB7XG4gICAgICAgIHJldHVybiBDT01QQVJJU09OLmNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIHRoaXMuZXF1aXZhbGVudCwgdGhpcy5lcXVhbGl0eVBlcm1pdHRlZCwgdGhpcy5pbnZlcnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoaXMge0BsaW5rIENPTVBBUklTT04gfSBieSBzZXR0aW5nIHRoZSBwcm90ZWN0ZWQgcHJvcGVydHkge0BsaW5rIENPTVBBUklTT04uZXF1aXZhbGVudCB9LCB7QGxpbmsgQ09NUEFSSVNPTi5lcXVhbGl0eVBlcm1pdHRlZCB9IGFuZCB7QGxpbmsgQ09NUEFSSVNPTi5pbnZlcnQgfSB1c2VkIGJ5IHtAbGluayBDT01QQVJJU09OLmNoZWNrIH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXF1aXZhbGVudCAgICAgICAgU2VlIHtAbGluayBDT01QQVJJU09OLmNoZWNrIH0uXG4gICAgICogQHBhcmFtIGVxdWFsaXR5UGVybWl0dGVkIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jaGVjayB9LlxuICAgICAqIEBwYXJhbSBpbnZlcnQgICAgICAgICAgICBTZWUge0BsaW5rIENPTVBBUklTT04uY2hlY2sgfS4gKi9cbiAgICBjb25zdHJ1Y3RvcihlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVxdWl2YWxlbnQgPSBlcXVpdmFsZW50O1xuICAgICAgICB0aGlzLmVxdWFsaXR5UGVybWl0dGVkID0gZXF1YWxpdHlQZXJtaXR0ZWQ7XG4gICAgICAgIHRoaXMuaW52ZXJ0ID0gaW52ZXJ0O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENPTVBBUklTT04gfSBmcm9tIFwiLi4vQ09NUEFSSVNPTlwiO1xuLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTiB9LiAqL1xuZXhwb3J0IGNsYXNzIEdSRUFURVIgZXh0ZW5kcyBDT01QQVJJU09OIHtcbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLlBSRSB9LiAqL1xuICAgIHN0YXRpYyBQUkUoZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5QUkUoZXF1aXZhbGVudCwgZmFsc2UsIGZhbHNlLCBwYXRoLCBoaW50LCBkYmMpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLlBPU1QgfS4gKi9cbiAgICBzdGF0aWMgUE9TVChlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBDT01QQVJJU09OLlBPU1QoZXF1aXZhbGVudCwgZmFsc2UsIGZhbHNlLCBwYXRoLCBoaW50LCBkYmMpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLklOVkFSSUFOVCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQoZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5JTlZBUklBTlQoZXF1aXZhbGVudCwgZmFsc2UsIGZhbHNlLCBwYXRoLCBoaW50LCBkYmMpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLmNvbnN0cnVjdG9yIH0uICovXG4gICAgY29uc3RydWN0b3IoZXF1aXZhbGVudCkge1xuICAgICAgICBzdXBlcihlcXVpdmFsZW50LCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLmVxdWl2YWxlbnQgPSBlcXVpdmFsZW50O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENPTVBBUklTT04gfSBmcm9tIFwiLi4vQ09NUEFSSVNPTlwiO1xuLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTiB9LiAqL1xuZXhwb3J0IGNsYXNzIEdSRUFURVJfT1JfRVFVQUwgZXh0ZW5kcyBDT01QQVJJU09OIHtcbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLlBSRSB9LiAqL1xuICAgIHN0YXRpYyBQUkUoZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5QUkUoZXF1aXZhbGVudCwgdHJ1ZSwgZmFsc2UsIHBhdGgsIGRiYywgaGludCk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uUE9TVCB9LiAqL1xuICAgIHN0YXRpYyBQT1NUKGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIENPTVBBUklTT04uUE9TVChlcXVpdmFsZW50LCB0cnVlLCBmYWxzZSwgcGF0aCwgZGJjLCBoaW50KTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5JTlZBUklBTlQgfS4gKi9cbiAgICBzdGF0aWMgSU5WQVJJQU5UKGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIENPTVBBUklTT04uSU5WQVJJQU5UKGVxdWl2YWxlbnQsIHRydWUsIGZhbHNlLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLmNvbnN0cnVjdG9yIH0uICovXG4gICAgY29uc3RydWN0b3IoZXF1aXZhbGVudCkge1xuICAgICAgICBzdXBlcihlcXVpdmFsZW50LCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZXF1aXZhbGVudCA9IGVxdWl2YWxlbnQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ09NUEFSSVNPTiB9IGZyb20gXCIuLi9DT01QQVJJU09OXCI7XG4vKiogU2VlIHtAbGluayBDT01QQVJJU09OIH0uICovXG5leHBvcnQgY2xhc3MgTEVTUyBleHRlbmRzIENPTVBBUklTT04ge1xuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uUFJFIH0uICovXG4gICAgc3RhdGljIFBSRShlcXVpdmFsZW50LCBlcXVhbGl0eVBlcm1pdHRlZCA9IGZhbHNlLCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBDT01QQVJJU09OLlBSRShlcXVpdmFsZW50LCBmYWxzZSwgdHJ1ZSwgcGF0aCwgZGJjLCBoaW50KTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5QT1NUIH0uICovXG4gICAgc3RhdGljIFBPU1QoZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5QT1NUKGVxdWl2YWxlbnQsIGZhbHNlLCB0cnVlLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLklOVkFSSUFOVCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQoZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5JTlZBUklBTlQoZXF1aXZhbGVudCwgZmFsc2UsIHRydWUsIHBhdGgsIGRiYywgaGludCk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uY29uc3RydWN0b3IgfS4gKi9cbiAgICBjb25zdHJ1Y3RvcihlcXVpdmFsZW50KSB7XG4gICAgICAgIHN1cGVyKGVxdWl2YWxlbnQsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5lcXVpdmFsZW50ID0gZXF1aXZhbGVudDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDT01QQVJJU09OIH0gZnJvbSBcIi4uL0NPTVBBUklTT05cIjtcbi8qKiBTZWUge0BsaW5rIENPTVBBUklTT04gfS4gKi9cbmV4cG9ydCBjbGFzcyBMRVNTX09SX0VRVUFMIGV4dGVuZHMgQ09NUEFSSVNPTiB7XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5QUkUgfS4gKi9cbiAgICBzdGF0aWMgUFJFKGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIENPTVBBUklTT04uUFJFKGVxdWl2YWxlbnQsIHRydWUsIHRydWUsIHBhdGgsIGRiYywgaGludCk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uUE9TVCB9LiAqL1xuICAgIHN0YXRpYyBQT1NUKGVxdWl2YWxlbnQsIGVxdWFsaXR5UGVybWl0dGVkID0gZmFsc2UsIGludmVydCA9IGZhbHNlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIENPTVBBUklTT04uUE9TVChlcXVpdmFsZW50LCB0cnVlLCB0cnVlLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLklOVkFSSUFOVCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQoZXF1aXZhbGVudCwgZXF1YWxpdHlQZXJtaXR0ZWQgPSBmYWxzZSwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gQ09NUEFSSVNPTi5JTlZBUklBTlQoZXF1aXZhbGVudCwgdHJ1ZSwgdHJ1ZSwgcGF0aCwgZGJjLCBoaW50KTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5jb25zdHJ1Y3RvciB9LiAqL1xuICAgIGNvbnN0cnVjdG9yKGVxdWl2YWxlbnQpIHtcbiAgICAgICAgc3VwZXIoZXF1aXZhbGVudCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZXF1aXZhbGVudCA9IGVxdWl2YWxlbnQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgREJDIH0gZnJvbSBcIi4uL0RCQ1wiO1xuLyoqXG4gKiBBIHtAbGluayBEQkMgfSBkZWZpbmluZyB0aGF0IHR3byB7QGxpbmsgb2JqZWN0IH1zIGdvdHRhIGJlIGVxdWFsLlxuICpcbiAqIEByZW1hcmtzXG4gKiBNYWludGFpbmVyOiBDYWxsYXJpLCBTYWx2YXRvcmUgKFhEQkNAV2FYQ29kZS5uZXQpICovXG5leHBvcnQgY2xhc3MgRVEgZXh0ZW5kcyBEQkMge1xuICAgIC8vICNyZWdpb24gQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdmFsdWUgKip0b0NoZWNrKiogaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCAqKmVxdWl2YWxlbnQqKi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrXHRcdFRoZSB2YWx1ZSB0aGF0IGhhcyB0byBiZSBlcXVhbCB0byBpdCdzIHBvc3NpYmxlICoqZXF1aXZhbGVudCoqIGZvciB0aGlzIHtAbGluayBEQkMgfSB0byBiZSBmdWxmaWxsZWQuXG4gICAgICogQHBhcmFtIGVxdWl2YWxlbnRcdFRoZSB7QGxpbmsgb2JqZWN0IH0gdGhlIG9uZSAqKnRvQ2hlY2sqKiBoYXMgdG8gYmUgZXF1YWwgdG8gaW4gb3JkZXIgZm9yIHRoaXMge0BsaW5rIERCQyB9IHRvIGJlXG4gICAgICogXHRcdFx0XHRcdFx0ZnVsZmlsbGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVFJVRSBpZiB0aGUgdmFsdWUgKip0b0NoZWNrKiogYW5kIHRoZSAqKmVxdWl2YWxlbnQqKiBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlciwgb3RoZXJ3aXNlIEZBTFNFLiAqL1xuICAgIHN0YXRpYyBjaGVja0FsZ29yaXRobShcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IDxleHBsYW5hdGlvbj5cbiAgICB0b0NoZWNrLCBlcXVpdmFsZW50LCBpbnZlcnQpIHtcbiAgICAgICAgaWYgKCFpbnZlcnQgJiYgZXF1aXZhbGVudCAhPT0gdG9DaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGBWYWx1ZSBoYXMgdG8gdG8gYmUgZXF1YWwgdG8gXCIke2VxdWl2YWxlbnR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnZlcnQgJiYgZXF1aXZhbGVudCA9PT0gdG9DaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGBWYWx1ZSBtdXN0IG5vdCB0byBiZSBlcXVhbCB0byBcIiR7ZXF1aXZhbGVudH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgRVEuY2hlY2tBbGdvcml0aG0gfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHtAbGluayBEQkMgfSBpcyBmdWxmaWxsZWRcbiAgICAgKiBieSB0aGUgdGFnZ2VkIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcXVpdmFsZW50XHRTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRcdFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUFJFKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogVG8gY2hlY2sgZm9yIFVOREVGSU5FRCBhbmQgTlVMTC5cbiAgICBlcXVpdmFsZW50LCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjUHJlY29uZGl0aW9uKCh2YWx1ZSwgdGFyZ2V0LCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVRLmNoZWNrQWxnb3JpdGhtKHZhbHVlLCBlcXVpdmFsZW50LCBpbnZlcnQpO1xuICAgICAgICB9LCBkYmMsIHBhdGgsIGhpbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZC1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBtZXRob2QncyByZXR1cm52YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcXVpdmFsZW50XHRTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFx0XHRTZWUge0BsaW5rIERCQy5Qb3N0Y29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1Bvc3Rjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUE9TVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFRvIGNoZWNrIGZvciBVTkRFRklORUQgYW5kIE5VTEwuXG4gICAgZXF1aXZhbGVudCwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY1Bvc3Rjb25kaXRpb24oKHZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRVEuY2hlY2tBbGdvcml0aG0odmFsdWUsIGVxdWl2YWxlbnQsIGludmVydCk7XG4gICAgICAgIH0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZmllbGQtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBFUS5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgZmllbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXF1aXZhbGVudFx0U2VlIHtAbGluayBFUS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0U2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uICovXG4gICAgc3RhdGljIElOVkFSSUFOVChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFRvIGNoZWNrIGZvciBVTkRFRklORUQgYW5kIE5VTEwuXG4gICAgZXF1aXZhbGVudCwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY0ludmFyaWFudChbbmV3IEVRKGVxdWl2YWxlbnQsIGludmVydCldLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvLyAjcmVnaW9uIFJlZmVyZW5jZWQgQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vXG4gICAgLy8gRm9yIHVzYWdlIGluIGR5bmFtaWMgc2NlbmFyaW9zIChsaWtlIHdpdGggQUUtREJDKS5cbiAgICAvL1xuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBFUS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqLCB7QGxpbmsgRVEuZXF1aXZhbGVudCB9IGFuZCB7QGxpbmsgRVEuaW52ZXJ0IH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSB0byBjaGVjayBhZ2FpbnN0IE5VTEwgJiBVTkRFRklORUQuXG4gICAgY2hlY2sodG9DaGVjaykge1xuICAgICAgICByZXR1cm4gRVEuY2hlY2tBbGdvcml0aG0odG9DaGVjaywgdGhpcy5lcXVpdmFsZW50LCB0aGlzLmludmVydCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBFUS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUgc3BlY2lmaWVkICoqdHlwZSoqIC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFNlZSB7QGxpbmsgRVEuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSAqKkNBTkRJREFURSoqICoqdG9DaGVjayoqIGRvZXNuJ3QgZnVsZmlsbCB0aGlzIHtAbGluayBFUSB9LlxuICAgICAqXG4gICAgICogQHRocm93cyBBIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0gaWYgdGhlICoqQ0FORElEQVRFKiogKip0b0NoZWNrKiogZG9lcyBub3QgZnVsZmlsbCB0aGlzIHtAbGluayBFUSB9LiovXG4gICAgc3RhdGljIHRzQ2hlY2sodG9DaGVjaywgZXF1aXZhbGVudCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBFUS5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCBlcXVpdmFsZW50LCBmYWxzZSk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0b0NoZWNrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERCQy5JbmZyaW5nZW1lbnQocmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoaXMge0BsaW5rIEVRIH0gYnkgc2V0dGluZyB0aGUgcHJvdGVjdGVkIHByb3BlcnR5IHtAbGluayBFUS5lcXVpdmFsZW50IH0gdXNlZCBieSB7QGxpbmsgRVEuY2hlY2sgfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcXVpdmFsZW50IFNlZSB7QGxpbmsgRVEuY2hlY2sgfS4gKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFRvIGJlIGFibGUgdG8gbWF0Y2ggVU5ERUZJTkVEIGFuZCBOVUxMLlxuICAgIGVxdWl2YWxlbnQsIGludmVydCA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZXF1aXZhbGVudCA9IGVxdWl2YWxlbnQ7XG4gICAgICAgIHRoaXMuaW52ZXJ0ID0gaW52ZXJ0O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEVRIH0gZnJvbSBcIi4uL0VRXCI7XG4vKipcbiAqIERJRkZFUkVOVCBjbGFzcyBmb3IgaW5lcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBUaGlzIGNsYXNzIGV4dGVuZHMgRVEgYW5kIHByb3ZpZGVzIG1ldGhvZHMgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBkaWZmZXJlbnQgKG5vdCBlcXVhbClcbiAqIGZyb20gYSBzcGVjaWZpZWQgZXF1aXZhbGVudCB2YWx1ZS4gSXQgaW52ZXJ0cyB0aGUgZXF1YWxpdHkgY2hlY2sgYnkgYWx3YXlzIHBhc3NpbmdcbiAqIGB0cnVlYCBmb3IgdGhlIGludmVydCBwYXJhbWV0ZXIgdG8gdGhlIHBhcmVudCBFUSBjbGFzcyBtZXRob2RzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgY2xhc3MgcHJvdmlkZXMgcHJlY29uZGl0aW9uIChQUkUpLCBwb3N0Y29uZGl0aW9uIChQT1NUKSwgYW5kIGludmFyaWFudCAoSU5WQVJJQU5UKVxuICogY2hlY2tzIGZvciBEZXNpZ24gYnkgQ29udHJhY3QgcHJvZ3JhbW1pbmcgcGF0dGVybnMuXG4gKlxuICogQHNlZSB7QGxpbmsgQ09NUEFSSVNPTn1cbiAqIEBzZWUge0BsaW5rIEVRfVxuICovXG5leHBvcnQgY2xhc3MgRElGRkVSRU5UIGV4dGVuZHMgRVEge1xuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uUFJFIH0uICovXG4gICAgc3RhdGljIFBSRShlcXVpdmFsZW50LCBpbnZlcnQgPSBmYWxzZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBFUS5QUkUoZXF1aXZhbGVudCwgdHJ1ZSwgcGF0aCwgZGJjLCBoaW50KTtcbiAgICB9XG4gICAgLyoqIFNlZSB7QGxpbmsgQ09NUEFSSVNPTi5QT1NUIH0uICovXG4gICAgc3RhdGljIFBPU1QoZXF1aXZhbGVudCwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gRVEuUE9TVChlcXVpdmFsZW50LCB0cnVlLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvKiogU2VlIHtAbGluayBDT01QQVJJU09OLklOVkFSSUFOVCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQoZXF1aXZhbGVudCwgaW52ZXJ0ID0gZmFsc2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gRVEuSU5WQVJJQU5UKGVxdWl2YWxlbnQsIHRydWUsIHBhdGgsIGRiYywgaGludCk7XG4gICAgfVxuICAgIC8qKiBTZWUge0BsaW5rIENPTVBBUklTT04uY29uc3RydWN0b3IgfS4gKi9cbiAgICBjb25zdHJ1Y3RvcihlcXVpdmFsZW50KSB7XG4gICAgICAgIHN1cGVyKGVxdWl2YWxlbnQsIHRydWUpO1xuICAgICAgICB0aGlzLmVxdWl2YWxlbnQgPSBlcXVpdmFsZW50O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERCQyB9IGZyb20gXCIuLi9EQkNcIjtcbi8qKlxuICogQSB7QGxpbmsgREJDIH0gZGVmaW5pbmcgdGhhdCB0aGUgYW4ge0BsaW5rIG9iamVjdCB9cyBnb3R0YSBiZSBhbiBpbnN0YW5jZSBvZiBhIGNlcnRhaW4ge0BsaW5rIElOU1RBTkNFLnJlZmVyZW5jZSB9LlxuICpcbiAqIEByZW1hcmtzXG4gKiBNYWludGFpbmVyOiBTYWx2YXRvcmUgQ2FsbGFyaSAoWERCQ0BXYVhDb2RlLm5ldCkgKi9cbmV4cG9ydCBjbGFzcyBJTlNUQU5DRSBleHRlbmRzIERCQyB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSB2YWx1ZSAqKnRvQ2hlY2sqKiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkICoqcmVmZXJlbmNlKiouXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVja1x0VGhlIHZhbHVlIHRoYXQgaGFzIHRvIGJlIGFuIGluc3RhbmNlIG9mIHRoZSAqKnJlZmVyZW5jZSoqIGluIG9yZGVyIGZvciB0aGlzIHtAbGluayBEQkMgfVxuICAgICAqIFx0XHRcdFx0XHR0byBiZSBmdWxmaWxsZWQuXG4gICAgICogQHBhcmFtIHJlZmVyZW5jZVx0VGhlIHtAbGluayBvYmplY3QgfSB0aGUgb25lICoqdG9DaGVjayoqIGhhcyB0byBiZSBhbiBpbnN0YW5jZSBvZi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIGlzIGFuIGluc3RhbmNlIG9mIHRoZSAqcmVmZXJlbmNlKiosICoqdW5kZWZpbmVkKiogb3IgKipudWxsKiosIG90aGVyd2lzZSBGQUxTRS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEluIG9yZGVyIHRvIHBlcmZvcm0gYW4gXCJpbnN0YW5jZW9mXCIgY2hlY2suXG4gICAgc3RhdGljIGNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIC4uLnJlZmVyZW5jZXMpIHtcbiAgICAgICAgaWYgKHRvQ2hlY2sgPT09IG51bGwgfHwgdG9DaGVjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiByZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICBpZiAodG9DaGVjayBpbnN0YW5jZW9mIHJlZikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgVmFsdWUgaGFzIHRvIGJlIGFuIGluc3RhbmNlIG9mIFwiJHtyZWZlcmVuY2VzLm1hcChyZWYgPT4gcmVmLm5hbWUgfHwgcmVmKS5qb2luKCcsICcpfVwiIGJ1dCBpcyBvZiB0eXBlIFwiJHt0eXBlb2YgdG9DaGVja31cImA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHtAbGluayBEQkMgfSBpcyBmdWxmaWxsZWRcbiAgICAgKiBieSB0aGUgdGFnZ2VkIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2VcdFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0U2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS4gKi9cbiAgICBzdGF0aWMgUFJFKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogSW4gb3JkZXIgdG8gcGVyZm9ybSBhbiBcImluc3RhbmNlb2ZcIiBjaGVjay5cbiAgICByZWZlcmVuY2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY1ByZWNvbmRpdGlvbigodmFsdWUsIHRhcmdldCwgbWV0aG9kTmFtZSwgcGFyYW1ldGVySW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSh2YWx1ZSwgcmVmZXJlbmNlKTtcbiAgICAgICAgfSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBtZXRob2QtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgbWV0aG9kJ3MgcmV0dXJudmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlXHRTZWUge0BsaW5rIElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdFNlZSB7QGxpbmsgREJDLlBvc3Rjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uICovXG4gICAgc3RhdGljIFBPU1QoXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBJbiBvcmRlciB0byBwZXJmb3JtIGFuIFwiaW5zdGFuY2VvZlwiIGNoZWNrLlxuICAgIHJlZmVyZW5jZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjUG9zdGNvbmRpdGlvbigodmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSh2YWx1ZSwgcmVmZXJlbmNlKTtcbiAgICAgICAgfSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBmaWVsZC1kZWNvcmF0b3IgZmFjdG9yeSB1c2luZyB0aGUge0BsaW5rIElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBtZXRob2QncyByZXR1cm52YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2VcdFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0U2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICogQHBhcmFtIGRiY1x0U2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS4gKi9cbiAgICBzdGF0aWMgSU5WQVJJQU5UKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogSW4gb3JkZXIgdG8gcGVyZm9ybSBhbiBcImluc3RhbmNlb2ZcIiBjaGVjay5cbiAgICByZWZlcmVuY2UsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY0ludmFyaWFudChbbmV3IElOU1RBTkNFKHJlZmVyZW5jZSldLCBwYXRoLCBkYmMsIGhpbnQpO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvLyAjcmVnaW9uIFJlZmVyZW5jZWQgQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vXG4gICAgLy8gRm9yIHVzYWdlIGluIGR5bmFtaWMgc2NlbmFyaW9zIChsaWtlIHdpdGggQUUtREJDKS5cbiAgICAvL1xuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUge0BsaW5rIElOU1RBTkNFLnJlZmVyZW5jZSB9IC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG19LiAqL1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogPGV4cGxhbmF0aW9uPlxuICAgIGNoZWNrKHRvQ2hlY2spIHtcbiAgICAgICAgcmV0dXJuIElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIHRoaXMucmVmZXJlbmNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHlwZS1zYWZlIGNoZWNrIHRoYXQgdmFsaWRhdGVzIGlmIGEgdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgYSBzcGVjaWZpZWQgcmVmZXJlbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvQ2hlY2sgXHRUaGUgdmFsdWUgdG8gY2hlY2sgZm9yIGluc3RhbmNlIHZhbGlkaXR5LlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2VcdFRoZSB7QGxpbmsgb2JqZWN0IH0gdGhlIG9uZSAqKnRvQ2hlY2sqKiBoYXMgdG8gYmUgYW4gaW5zdGFuY2Ugb2YuXG4gICAgICogQHBhcmFtIGhpbnRcdFx0QW4gb3B0aW9uYWwge0BsaW5rIHN0cmluZyB9IHByb3ZpZGluZyBleHRyYSBpbmZvcm1hdGlvbiBpbiBjYXNlIG9mIGFuIGluZnJpbmdlbWVudC5cbiAgICAgKiBAcGFyYW0gaWRcdFx0QSB7QGxpbmsgc3RyaW5nIH0gaWRlbnRpZnlpbmcgdGhpcyB7QGxpbmsgSU5TVEFOQ0UgfSB2aWEgdGhlIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0tTWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSAqKkNBTkRJREFURSoqICoqdG9DaGVjayoqIGlmIGl0IGZ1bGZpbGxzIHRoaXMge0BsaW5rIElOU1RBTkNFIH0uXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIEEge0BsaW5rIERCQy5JbmZyaW5nZW1lbnQgfSBpZiB0aGUgKipDQU5ESURBVEUqKiAqKnRvQ2hlY2sqKiBkb2VzIG5vdCBmdWxmaWxsIHRoaXMge0BsaW5rIElOU1RBTkNFIH0uICovXG4gICAgc3RhdGljIHRzQ2hlY2sodG9DaGVjaywgcmVmZXJlbmNlLCBoaW50ID0gdW5kZWZpbmVkLCBpZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gSU5TVEFOQ0UudHNDaGVja011bHRpKHRvQ2hlY2ssIFtyZWZlcmVuY2VdLCBoaW50LCBpZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUge0BsaW5rIElOU1RBTkNFLnJlZmVyZW5jZSB9IC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrIFx0U2VlIHtAbGluayBJTlNUQU5DRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSByZWZlcmVuY2VcdFNlZSB7QGxpbmsgSU5TVEFOQ0UuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRBbiBvcHRpb25hbCB7QGxpbmsgc3RyaW5nIH0gcHJvdmlkaW5nIGV4dHJhIGluZm9ybWF0aW9uIGluIGNhc2Ugb2YgYW4gaW5mcmluZ2VtZW50LlxuICAgICAqIEBwYXJhbSBpZFx0XHRBIHtAbGluayBzdHJpbmcgfSBpZGVudGlmeWluZyB0aGlzIHtAbGluayBJTlNUQU5DRSB9IHZpYSB0aGUge0BsaW5rIERCQy5JbmZyaW5nZW1lbnQgfS1NZXNzYWdlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlICoqQ0FORElEQVRFKiogKip0b0NoZWNrKiogZG9lc24ndCBmdWxmaWxsIHRoaXMge0BsaW5rIElOU1RBTkNFIH0uXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIEEge0BsaW5rIERCQy5JbmZyaW5nZW1lbnQgfSBpZiB0aGUgKipDQU5ESURBVEUqKiAqKnRvQ2hlY2sqKiBkb2VzIG5vdCBmdWxmaWxsIHRoaXMge0BsaW5rIERFRklORUQgfS4gKi9cbiAgICBzdGF0aWMgdHNDaGVja011bHRpKHRvQ2hlY2ssIHJlZmVyZW5jZXMsIGhpbnQgPSB1bmRlZmluZWQsIGlkID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IElOU1RBTkNFLmNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIC4uLnJlZmVyZW5jZXMpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9DaGVjaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEQkMuSW5mcmluZ2VtZW50KGAke2lkID8gYCgke2lkfSkgYCA6IFwiXCJ9JHtyZXN1bHR9ICR7aGludCA/IGDinKggJHtoaW50fSDinKhgIDogXCJcIn1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoaXMge0BsaW5rIElOU1RBTkNFIH0gYnkgc2V0dGluZyB0aGUgcHJvdGVjdGVkIHByb3BlcnR5IHtAbGluayBJTlNUQU5DRS5yZWZlcmVuY2UgfSB1c2VkIGJ5IHtAbGluayBJTlNUQU5DRS5jaGVjayB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlZmVyZW5jZSBTZWUge0BsaW5rIElOU1RBTkNFLmNoZWNrIH0uICovXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4gICAgY29uc3RydWN0b3IocmVmZXJlbmNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERCQyB9IGZyb20gXCIuLi9EQkNcIjtcbi8qKlxuICogQSB7QGxpbmsgREJDIH0gcHJvdmlkaW5nIHtAbGluayBSRUdFWCB9LWNvbnRyYWN0cyBhbmQgc3RhbmRhcmQge0BsaW5rIFJlZ0V4cCB9IGZvciBjb21tb24gdXNlIGNhc2VzIGluIHtAbGluayBSRUdFWC5zdGRFeHAgfS5cbiAqXG4gKiBAcmVtYXJrc1xuICogTWFpbnRhaW5lcjogQ2FsbGFyaSwgU2FsdmF0b3JlIChYREJDQFdhWENvZGUubmV0KSAqL1xuZXhwb3J0IGNsYXNzIFJFR0VYIGV4dGVuZHMgREJDIHtcbiAgICAvLyAjcmVnaW9uIENvbmRpdGlvbiBjaGVja2luZy5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIGNvbXBsaWVzIHRvIHRoZSB7QGxpbmsgUmVnRXhwIH0gKipleHByZXNzaW9uKiouXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVja1x0XHRUaGUgdmFsdWUgdGhhdCBoYXMgY29tcGx5IHRvIHRoZSB7QGxpbmsgUmVnRXhwIH0gKipleHByZXNzaW9uKiogZm9yIHRoaXMge0BsaW5rIERCQyB9IHRvIGJlIGZ1bGZpbGxlZC5cbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvblx0VGhlIHtAbGluayBSZWdFeHAgfSB0aGUgb25lICoqdG9DaGVjayoqIGhhcyBjb21wbHkgdG8gaW4gb3JkZXIgZm9yIHRoaXMge0BsaW5rIERCQyB9IHRvIGJlXG4gICAgICogXHRcdFx0XHRcdFx0ZnVsZmlsbGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVFJVRSBpZiB0aGUgdmFsdWUgKip0b0NoZWNrKiogY29tcGxpZXMgd2l0aCB0aGUge0BsaW5rIFJlZ0V4cCB9ICoqZXhwcmVzc2lvbioqLCBvdGhlcndpc2UgRkFMU0UuICovXG4gICAgc3RhdGljIGNoZWNrQWxnb3JpdGhtKHRvQ2hlY2ssIGV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKHRvQ2hlY2sgPT09IHVuZGVmaW5lZCB8fCB0b0NoZWNrID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICghZXhwcmVzc2lvbi50ZXN0KHRvQ2hlY2spKSB7XG4gICAgICAgICAgICByZXR1cm4gYFZhbHVlIGhhcyB0byBjb21wbHkgdG8gcmVndWxhciBleHByZXNzaW9uIFwiJHtleHByZXNzaW9ufVwiYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBwYXJhbWV0ZXItZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGV4cHJlc3Npb25cdFNlZSB7QGxpbmsgUkVHRVguY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0XHRcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LiAqL1xuICAgIHN0YXRpYyBQUkUoZXhwcmVzc2lvbiwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjUHJlY29uZGl0aW9uKCh2YWx1ZSwgdGFyZ2V0LCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFJFR0VYLmNoZWNrQWxnb3JpdGhtKHZhbHVlLCBleHByZXNzaW9uKTtcbiAgICAgICAgfSwgZGJjLCBwYXRoLCBoaW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBtZXRob2QtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgbWV0aG9kJ3MgcmV0dXJudmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvblx0U2VlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0U2VlIHtAbGluayBEQkMuUG9zdGNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGhpbnRcdFx0XHRTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIERCQy5kZWNQb3N0Y29uZGl0aW9uIH0uICovXG4gICAgc3RhdGljIFBPU1QoZXhwcmVzc2lvbiwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjUG9zdGNvbmRpdGlvbigodmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBSRUdFWC5jaGVja0FsZ29yaXRobSh2YWx1ZSwgZXhwcmVzc2lvbik7XG4gICAgICAgIH0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZmllbGQtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgZmllbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvblx0U2VlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRcdFx0U2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICogQHBhcmFtIGRiY1x0XHRcdFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LlxuICAgICAqIEBwYXJhbSBoaW50XHRcdFx0U2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBEQkMuZGVjSW52YXJpYW50IH0uICovXG4gICAgc3RhdGljIElOVkFSSUFOVChleHByZXNzaW9uLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5kZWNJbnZhcmlhbnQoW25ldyBSRUdFWChleHByZXNzaW9uKV0sIHBhdGgsIGRiYywgaGludCk7XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vICNyZWdpb24gUmVmZXJlbmNlZCBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy9cbiAgICAvLyBGb3IgdXNhZ2UgaW4gZHluYW1pYyBzY2VuYXJpb3MgKGxpa2Ugd2l0aCBBRS1EQkMpLlxuICAgIC8vXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUge0BsaW5rIFJFR0VYLmNoZWNrQWxnb3JpdGhtIH0gcGFzc2luZyB0aGUgdmFsdWUgKip0b0NoZWNrKiogYW5kIHtAbGluayBSRUdFWC5lcXVpdmFsZW50IH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBTZWUge0BsaW5rIFJFR0VYLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWUge0BsaW5rIEVRLmNoZWNrQWxnb3JpdGhtfS4gKi9cbiAgICBjaGVjayh0b0NoZWNrKSB7XG4gICAgICAgIHJldHVybiBSRUdFWC5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0aGlzLmV4cHJlc3Npb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUeXBlLXNhZmUgY2hlY2sgdGhhdCB2YWxpZGF0ZXMgYSB2YWx1ZSBhZ2FpbnN0IGEgcmVndWxhciBleHByZXNzaW9uIGFuZCByZXR1cm5zIGl0IGFzIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrXHRcdFRoZSB2YWx1ZSB0byBjaGVjayBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAgICogQHBhcmFtIGV4cHJlc3Npb25cdFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdmFsaWRhdGUgYWdhaW5zdC5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRcdE9wdGlvbmFsIGhpbnQgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBlcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICAgICAqIEBwYXJhbSBpZFx0XHRcdE9wdGlvbmFsIGlkZW50aWZpZXIgdG8gaW5jbHVkZSBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgdmFsdWUgY2FzdCB0byB0aGUgQ0FORElEQVRFIHR5cGUuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtAbGluayBEQkMuSW5mcmluZ2VtZW50fSBpZiB0aGUgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4gKi9cbiAgICBzdGF0aWMgdHNDaGVjayh0b0NoZWNrLCBleHByZXNzaW9uLCBoaW50ID0gdW5kZWZpbmVkLCBpZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBSRUdFWC5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCBleHByZXNzaW9uKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2s7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgREJDLkluZnJpbmdlbWVudChgJHtpZCA/IGAoJHtpZH0pIGAgOiBcIlwifSR7cmVzdWx0fSR7aGludCA/IGAg4pyoICR7aGludH0g4pyoYCA6IFwiXCJ9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGlzIHtAbGluayBSRUdFWCB9IGJ5IHNldHRpbmcgdGhlIHByb3RlY3RlZCBwcm9wZXJ0eSB7QGxpbmsgUkVHRVguZXhwcmVzc2lvbiB9IHVzZWQgYnkge0BsaW5rIFJFR0VYLmNoZWNrIH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBTZWUge0BsaW5rIFJFR0VYLmNoZWNrIH0uICovXG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIFJlZmVyZW5jZWQgQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vICNyZWdpb24gSW4tTWV0aG9kIGNoZWNraW5nLlxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB7QGxpbmsgUkVHRVguZXhwcmVzc2lvbiB9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvQ2hlY2tcdFx0U2VlIHtAbGluayBSRUdFWC5jaGVja0FsZ29yaXRobX0uXG4gICAgICogQHBhcmFtIGV4cHJlc3Npb25cdFNlZSB7QGxpbmsgUkVHRVguY2hlY2tBbGdvcml0aG19LlxuICAgICAqL1xuICAgIHN0YXRpYyBjaGVjayh0b0NoZWNrLCBleHByZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrUmVzdWx0ID0gUkVHRVguY2hlY2tBbGdvcml0aG0odG9DaGVjaywgZXhwcmVzc2lvbik7XG4gICAgICAgIGlmICh0eXBlb2YgY2hlY2tSZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEQkMuSW5mcmluZ2VtZW50KGNoZWNrUmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKiBTdG9yZXMgb2Z0ZW4gdXNlZCB7QGxpbmsgUmVnRXhwIH1zLiAqL1xuUkVHRVguc3RkRXhwID0ge1xuICAgIGh0bWxBdHRyaWJ1dGVOYW1lOiAvXlthLXpBLVpfOl1bYS16QS1aMC05Xy46LV0qJC8sXG4gICAgZU1haWw6IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kL2ksXG4gICAgcHJvcGVydHk6IC9eWyRfQS1aYS16XVskX0EtWmEtejAtOV0qJC8sXG4gICAgdXJsOiAvXig/Oig/Omh0dHA6fGh0dHBzP3xmdHApOlxcL1xcLyk/KD86XFxTKyg/OjpcXFMqKT9AKT8oPzpsb2NhbGhvc3R8KD86W2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/XFwuKStbYS16QS1aXXsyLH0pKD86OlxcZHsyLDV9KT8oPzpcXC8oPzpbXFx3XFwtXFwuXSpcXC8pKltcXHdcXC1cXC5dKyg/OlxcP1xcUyopPyg/OiNcXFMqKT8pPyQvaSxcbiAgICBrZXlQYXRoOiAvXihbYS16QS1aXyRdW2EtekEtWjAtOV8kXSpcXC4pKlthLXpBLVpfJF1bYS16QS1aMC05XyRdKiQvLFxuICAgIGRhdGU6IC9eXFxkezEsNH1bLlxcLy1dXFxkezEsMn1bLlxcLy1dXFxkezEsNH0kL2ksXG4gICAgZGF0ZUZvcm1hdDogL14oKER7MSwyfVsuLy1dTXsxLDJ9Wy4vLV1ZezEsNH0pfChNezEsMn1bLi8tXUR7MSwyfVsuLy1dWXsxLDR9KXxZezEsNH1bLi8tXUR7MSwyfVsuLy1dTXsxLDJ9fChZezEsNH1bLi8tXU17MSwyfVsuLy1dRHsxLDJ9KSkkL2ksXG4gICAgY3NzU2VsZWN0b3I6IC9eKD86XFwqfCNbXFx3LV0rfFxcLltcXHctXSt8KD86W1xcdy1dK3xcXCopKD86Oig/OltcXHctXSsoPzpcXChbXFx3LV0rXFwpKT8pKyk/KD86XFxbKD86W1xcdy1dKyg/Oig/Oj18fj18XFx8PXxcXCo9fFxcJD18XFxePSlcXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFtcXHctXSspXFxzKik/KT9cXF0pK3xcXFtcXHMqW1xcdy1dK1xccyo9XFxzKig/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXFx3LV0rKVxccypcXF0pKD86LFxccyooPzpcXCp8I1tcXHctXSt8XFwuW1xcdy1dK3woPzpbXFx3LV0rfFxcKikoPzo6KD86W1xcdy1dKyg/OlxcKFtcXHctXStcXCkpPykrKT8oPzpcXFsoPzpbXFx3LV0rKD86KD86PXx+PXxcXHw9fFxcKj18XFwkPXxcXF49KVxccyooPzpcIlteXCJdKlwifCdbXiddKid8W1xcdy1dKylcXHMqKT8pP1xcXSkrfFxcW1xccypbXFx3LV0rXFxzKj1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFtcXHctXSspXFxzKlxcXSkpKiQvLFxuICAgIGJvb2xlYW46IC9eKFRSVUV8RkFMU0UpJC9pXG59O1xuIiwiaW1wb3J0IHsgREJDIH0gZnJvbSBcIi4uL0RCQ1wiO1xuLyoqXG4gKiBBIHtAbGluayBEQkMgfSBkZWZpbmluZyB0aGF0IGFuIHtAbGluayBvYmplY3QgfXMgZ290dGEgYmUgb2YgY2VydGFpbiB7QGxpbmsgVFlQRS50eXBlIH0uXG4gKlxuICogQHJlbWFya3NcbiAqIEF1dGhvcjogXHRcdFNhbHZhdG9yZSBDYWxsYXJpIChDYWxsYXJpQFdhWENvZGUubmV0KSAvIDIwMjVcbiAqIE1haW50YWluZXI6XHRTYWx2YXRvcmUgQ2FsbGFyaSAoWERCQ0BXYVhDb2RlLm5ldCkgKi9cbmV4cG9ydCBjbGFzcyBUWVBFIGV4dGVuZHMgREJDIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIG9mIHRoZSAqKnR5cGUqKiBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVja1x0VGhlIHtAbGluayBPYmplY3QgfSB3aGljaCdzICoqdHlwZSoqIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB0eXBlXHRcdFRoZSB0eXBlIHRoZSB7QGxpbmsgb2JqZWN0fSAqKnRvQ2hlY2sqKiBoYXMgdG8gYmUgb2YuIENhbiBiZSBhIHNpbmdsZSB0eXBlIG9yIG11bHRpcGxlIHR5cGVzIHNlcGFyYXRlZCBieSBcInxcIi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRSVUUgaWYgdGhlIHZhbHVlICoqdG9DaGVjayoqIGlzIG9mIHRoZSBzcGVjaWZpZWQgKip0eXBlKiosIG90aGVyd2lzZSBGQUxTRS4gKi9cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5lY2Vzc2FyeSBmb3IgZHluYW1pYyB0eXBlIGNoZWNraW5nIG9mIGFsc28gVU5ERUZJTkVELlxuICAgIHN0YXRpYyBjaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0eXBlKSB7XG4gICAgICAgIGlmICh0b0NoZWNrID09PSB1bmRlZmluZWQgfHwgdG9DaGVjayA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCB0eXBlcyA9IHR5cGUuc3BsaXQoXCJ8XCIpLm1hcCh0ID0+IHQudHJpbSgpKTtcbiAgICAgICAgY29uc3QgYWN0dWFsVHlwZSA9IHR5cGVvZiB0b0NoZWNrO1xuICAgICAgICAvLyAjcmVnaW9uIENoZWNrIGlmIHRoZSBhY3R1YWwgdHlwZSBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzXG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlVmFsaWRUeXBlb2Y6IE5lY2Vzc2FyeVxuICAgICAgICBjb25zdCBpc1ZhbGlkID0gdHlwZXMuc29tZSh0ID0+IGFjdHVhbFR5cGUgPT09IHQpO1xuICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFZhbHVlIGhhcyB0byB0byBiZSBvZiB0eXBlIFwiJHt0eXBlfVwiIGJ1dCBpcyBvZiB0eXBlIFwiJHthY3R1YWxUeXBlfVwiYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBgVmFsdWUgaGFzIHRvIHRvIGJlIG9mIHR5cGUgXCIke3R5cGVzLmpvaW4oXCIgfCBcIil9XCIgYnV0IGlzIG9mIHR5cGUgXCIke2FjdHVhbFR5cGV9XCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgaWYgdGhlIGFjdHVhbCB0eXBlIG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXNcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgcGFyYW1ldGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGVcdFNlZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9LlxuICAgICAqIEBwYXJhbSBwYXRoXHRBIDo6LXNlcGFyYXRlZCBsaXN0IG9mIGRvdHRlZCBwYXRocyB0byBjaGVjay4gRWFjaCBwYXRoIHBvaW50cyB0byBhIHByb3BlcnR5IHdpdGhpbiB0aGUgcGFyYW1ldGVyIHZhbHVlLlxuICAgICAqIFx0XHRcdFx0VW5kZWZpbmVkIHByb3BlcnRpZXMgYXJlIHNraXBwZWQuIFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqIEBwYXJhbSBkYmNcdFNlZSB7QGxpbmsgREJDLmRlY1ByZWNvbmRpdGlvbiB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uICovXG4gICAgc3RhdGljIFBSRSh0eXBlLCBwYXRoID0gdW5kZWZpbmVkLCBoaW50ID0gdW5kZWZpbmVkLCBkYmMgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIERCQy5kZWNQcmVjb25kaXRpb24oKHZhbHVlLCB0YXJnZXQsIG1ldGhvZE5hbWUsIHBhcmFtZXRlckluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gVFlQRS5jaGVja0FsZ29yaXRobSh2YWx1ZSwgdHlwZSk7XG4gICAgICAgIH0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgbWV0aG9kLWRlY29yYXRvciBmYWN0b3J5IHVzaW5nIHRoZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMge0BsaW5rIERCQyB9IGlzIGZ1bGZpbGxlZFxuICAgICAqIGJ5IHRoZSB0YWdnZWQgbWV0aG9kJ3MgcmV0dXJudmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZVx0U2VlIHtAbGluayBUWVBFLmNoZWNrQWxnb3JpdGhtIH0uXG4gICAgICogQHBhcmFtIHBhdGhcdEEgOjotc2VwYXJhdGVkIGxpc3Qgb2YgZG90dGVkIHBhdGhzIHRvIGNoZWNrLiBFYWNoIHBhdGggcG9pbnRzIHRvIGEgcHJvcGVydHkgd2l0aGluIHRoZSBwYXJhbWV0ZXIgdmFsdWUuXG4gICAgICogXHRcdFx0XHRVbmRlZmluZWQgcHJvcGVydGllcyBhcmUgc2tpcHBlZC4gU2VlIHtAbGluayBEQkMuZGVjUHJlY29uZGl0aW9uIH0uXG4gICAgICogQHBhcmFtIGRiY1x0U2VlIHtAbGluayBEQkMuZGVjUG9zdGNvbmRpdGlvbiB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VlIHtAbGluayBEQkMuZGVjUG9zdGNvbmRpdGlvbiB9LiAqL1xuICAgIHN0YXRpYyBQT1NUKHR5cGUsIHBhdGggPSB1bmRlZmluZWQsIGhpbnQgPSB1bmRlZmluZWQsIGRiYyA9IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gREJDLmRlY1Bvc3Rjb25kaXRpb24oKHZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gVFlQRS5jaGVja0FsZ29yaXRobSh2YWx1ZSwgdHlwZSk7XG4gICAgICAgIH0sIGRiYywgcGF0aCwgaGludCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgZmllbGQtZGVjb3JhdG9yIGZhY3RvcnkgdXNpbmcgdGhlIHtAbGluayBUWVBFLmNoZWNrQWxnb3JpdGhtIH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyB7QGxpbmsgREJDIH0gaXMgZnVsZmlsbGVkXG4gICAgICogYnkgdGhlIHRhZ2dlZCBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlXHRTZWUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gcGF0aFx0QSA6Oi1zZXBhcmF0ZWQgbGlzdCBvZiBkb3R0ZWQgcGF0aHMgdG8gY2hlY2suIEVhY2ggcGF0aCBwb2ludHMgdG8gYSBwcm9wZXJ0eSB3aXRoaW4gdGhlIHBhcmFtZXRlciB2YWx1ZS5cbiAgICAgKiBcdFx0XHRcdFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGFyZSBza2lwcGVkLiBTZWUge0BsaW5rIERCQy5kZWNQcmVjb25kaXRpb24gfS5cbiAgICAgKiBAcGFyYW0gZGJjXHRTZWUge0BsaW5rIERCQy5kZWNJbnZhcmlhbnQgfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgREJDLmRlY0ludmFyaWFudCB9LiAqL1xuICAgIHN0YXRpYyBJTlZBUklBTlQodHlwZSwgcGF0aCA9IHVuZGVmaW5lZCwgaGludCA9IHVuZGVmaW5lZCwgZGJjID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBEQkMuZGVjSW52YXJpYW50KFtuZXcgVFlQRSh0eXBlKV0sIHBhdGgsIGRiYywgaGludCk7XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ29uZGl0aW9uIGNoZWNraW5nLlxuICAgIC8vICNyZWdpb24gUmVmZXJlbmNlZCBDb25kaXRpb24gY2hlY2tpbmcuXG4gICAgLy9cbiAgICAvLyBGb3IgdXNhZ2UgaW4gZHluYW1pYyBzY2VuYXJpb3MgKGxpa2Ugd2l0aCBBRS1EQkMpLlxuICAgIC8vXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfSBwYXNzaW5nIHRoZSB2YWx1ZSAqKnRvQ2hlY2sqKiBhbmQgdGhlIHtAbGluayBUWVBFLnR5cGUgfSAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9DaGVjayBTZWUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNlZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobX0uICovXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA8ZXhwbGFuYXRpb24+XG4gICAgY2hlY2sodG9DaGVjaykge1xuICAgICAgICByZXR1cm4gVFlQRS5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0aGlzLnR5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSB7QGxpbmsgVFlQRS5jaGVja0FsZ29yaXRobSB9IHBhc3NpbmcgdGhlIHZhbHVlICoqdG9DaGVjayoqIGFuZCB0aGUge0BsaW5rIFRZUEUudHlwZSB9IC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b0NoZWNrXHRTZWUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gdHlwZVx0XHRTZWUge0BsaW5rIFRZUEUuY2hlY2tBbGdvcml0aG0gfS5cbiAgICAgKiBAcGFyYW0gaGludFx0XHRBbiBvcHRpb25hbCB7QGxpbmsgc3RyaW5nIH0gcHJvdmlkaW5nIGV4dHJhIGluZm9ybWF0aW9uIGluIGNhc2Ugb2YgYW4gaW5mcmluZ2VtZW50LlxuICAgICAqIEBwYXJhbSBpZFx0XHRBIHtAbGluayBzdHJpbmcgfSBpZGVudGlmeWluZyB0aGlzIHtAbGluayBUWVBFIH0gdmlhIHRoZSB7QGxpbmsgREJDLkluZnJpbmdlbWVudCB9LU1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgKipDQU5ESURBVEUqKiAqKnRvQ2hlY2sqKiBkb2Vzbid0IGZ1bGZpbGwgdGhpcyB7QGxpbmsgVFlQRSB9LlxuICAgICAqXG4gICAgICogQHRocm93cyBBIHtAbGluayBEQkMuSW5mcmluZ2VtZW50IH0gaWYgdGhlICoqQ0FORElEQVRFKiogKip0b0NoZWNrKiogZG9lcyBub3QgZnVsZmlsbCB0aGlzIHtAbGluayBERUZJTkVEIH0uICovXG4gICAgc3RhdGljIHRzQ2hlY2sodG9DaGVjaywgdHlwZSwgaGludCA9IHVuZGVmaW5lZCwgaWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gVFlQRS5jaGVja0FsZ29yaXRobSh0b0NoZWNrLCB0eXBlKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2s7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgREJDLkluZnJpbmdlbWVudChgJHtpZCA/IGAoJHtpZH0pIGAgOiBcIlwifSR7cmVzdWx0fSR7aGludCA/IGAg4pyoICR7aGludH0g4pyoYCA6IFwiXCJ9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGlzIHtAbGluayBUWVBFIH0gYnkgc2V0dGluZyB0aGUgcHJvdGVjdGVkIHByb3BlcnR5IHtAbGluayBUWVBFLnR5cGUgfSB1c2VkIGJ5IHtAbGluayBUWVBFLmNoZWNrIH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSBTZWUge0BsaW5rIFRZUEUuY2hlY2sgfS4gKi9cbiAgICBjb25zdHJ1Y3Rvcih0eXBlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgfVxufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJ2YXIgX19kZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn07XG52YXIgX19tZXRhZGF0YSA9ICh0aGlzICYmIHRoaXMuX19tZXRhZGF0YSkgfHwgZnVuY3Rpb24gKGssIHYpIHtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEoaywgdik7XG59O1xudmFyIF9fcGFyYW0gPSAodGhpcyAmJiB0aGlzLl9fcGFyYW0pIHx8IGZ1bmN0aW9uIChwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cbn07XG5pbXBvcnQgeyBEQkMgfSBmcm9tIFwiLi9EQkNcIjtcbmltcG9ydCB7IFJFR0VYIH0gZnJvbSBcIi4vREJDL1JFR0VYXCI7XG5pbXBvcnQgeyBFUSB9IGZyb20gXCIuL0RCQy9FUVwiO1xuaW1wb3J0IHsgVFlQRSB9IGZyb20gXCIuL0RCQy9UWVBFXCI7XG5pbXBvcnQgeyBBRSB9IGZyb20gXCIuL0RCQy9BRVwiO1xuaW1wb3J0IHsgSU5TVEFOQ0UgfSBmcm9tIFwiLi9EQkMvSU5TVEFOQ0VcIjtcbmltcG9ydCB7IEdSRUFURVIgfSBmcm9tIFwiLi9EQkMvQ09NUEFSSVNPTi9HUkVBVEVSXCI7XG5pbXBvcnQgeyBHUkVBVEVSX09SX0VRVUFMIH0gZnJvbSBcIi4vREJDL0NPTVBBUklTT04vR1JFQVRFUl9PUl9FUVVBTFwiO1xuaW1wb3J0IHsgTEVTUyB9IGZyb20gXCIuL0RCQy9DT01QQVJJU09OL0xFU1NcIjtcbmltcG9ydCB7IExFU1NfT1JfRVFVQUwgfSBmcm9tIFwiLi9EQkMvQ09NUEFSSVNPTi9MRVNTX09SX0VRVUFMXCI7XG5pbXBvcnQgeyBESUZGRVJFTlQgfSBmcm9tIFwiLi9EQkMvRVEvRElGRkVSRU5UXCI7XG4vKiogRGVtb25zdHJhdGl2ZSB1c2Ugb2YgKipEKiplc2lnbiAqKkIqKnkgKipDKipvbnRyYWN0IERlY29yYXRvcnMgKi9cbmV4cG9ydCBjbGFzcyBEZW1vIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gI3JlZ2lvbiBDaGVjayBQcm9wZXJ0eSBEZWNvcmF0b3JcbiAgICAgICAgdGhpcy50ZXN0UHJvcGVydHkgPSBcImFcIjtcbiAgICAgICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBTdGF0aWMgTWV0aG9kIHdpdGggUGFyYW12YWx1ZVByb3ZpZGVyXG4gICAgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgUHJvcGVydHkgRGVjb3JhdG9yXG4gICAgLy8gI3JlZ2lvbiBDaGVjayBQYXJhbWV0ZXIuICYgUmV0dXJudmFsdWUgRGVjb3JhdG9yXG4gICAgdGVzdFBhcmFtdmFsdWVBbmRSZXR1cm52YWx1ZShhKSB7XG4gICAgICAgIHJldHVybiBgeHh4eCR7YX1gO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIFBhcmFtZXRlci4gJiBSZXR1cm52YWx1ZSBEZWNvcmF0b3JcbiAgICAvLyAjcmVnaW9uIENoZWNrIFJldHVybnZhbHVlIERlY29yYXRvclxuICAgIHRlc3RSZXR1cm52YWx1ZShhKSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIFJldHVybnZhbHVlIERlY29yYXRvclxuICAgIC8vICNyZWdpb24gQ2hlY2sgRVEtREJDICYgUGF0aCB0byBwcm9wZXJ0eSBvZiBQYXJhbWV0ZXItdmFsdWVcbiAgICB0ZXN0RVFBbmRQYXRoKG8pIHsgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgRVEtREJDICYgUGF0aCB0byBwcm9wZXJ0eSBvZiBQYXJhbWV0ZXItdmFsdWVcbiAgICAvLyAjcmVnaW9uIENoZWNrIEVRLURCQyAmIFBhdGggdG8gcHJvcGVydHkgb2YgUGFyYW1ldGVyLXZhbHVlIHdpdGggSW52ZXJzaW9uXG4gICAgdGVzdEVRQW5kUGF0aFdpdGhJbnZlcnNpb24obykgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBFUS1EQkMgJiBQYXRoIHRvIHByb3BlcnR5IG9mIFBhcmFtZXRlci12YWx1ZSB3aXRoIEludmVyc2lvblxuICAgIC8vICNyZWdpb24gQ2hlY2sgVFlQRVxuICAgIHRlc3RUWVBFKG8pIHsgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgVFlQRVxuICAgIC8vICNyZWdpb24gQ2hlY2sgQUVcbiAgICB0ZXN0QUUoeCkgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBBRVxuICAgIC8vICNyZWdpb24gQ2hlY2sgUkVHRVggd2l0aCBBRVxuICAgIHRlc3RSRUdFWFdpdGhBRSh4KSB7IH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIFJFR0VYIHdpdGggQUVcbiAgICAvLyAjcmVnaW9uIENoZWNrIElOU1RBTkNFXG4gICAgdGVzdElOU1RBTkNFKGNhbmRpZGF0ZSkgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBJTlNUQU5DRVxuICAgIC8vICNyZWdpb24gQ2hlY2sgQUUgUmFuZ2VcbiAgICB0ZXN0QUVSYW5nZSh4KSB7IH1cbiAgICAvLyAjZW5kcmVnaW9uIENoZWNrIEFFIFJhbmdlXG4gICAgLy8gI3JlZ2lvbiBDaGVjayBBRSBJbmRleFxuICAgIHRlc3RBRUluZGV4KHgpIHsgfVxuICAgIC8vICNlbmRyZWdpb24gQ2hlY2sgQUUgSW5kZXhcbiAgICAvLyAjcmVnaW9uIENoZWNrIENvbXBhcmlzb25cbiAgICB0ZXN0R1JFQVRFUihpbnB1dCkgeyB9XG4gICAgdGVzdEdSRUFURVJfT1JfRVFVQUwoaW5wdXQpIHsgfVxuICAgIHRlc3RMRVNTKGlucHV0KSB7IH1cbiAgICB0ZXN0TEVTU19PUl9FUVVBTChpbnB1dCkgeyB9XG4gICAgdGVzdERJRkZFUkVOVChpbnB1dCkgeyB9XG4gICAgLy8gI2VuZHJlZ2lvbiBDaGVjayBDb21wYXJpc29uXG4gICAgLy8gI3JlZ2lvbiBDaGVjayBTdGF0aWMgTWV0aG9kIHdpdGggUGFyYW12YWx1ZVByb3ZpZGVyXG4gICAgc3RhdGljIHRlc3RTdGF0aWNNZXRob2QobWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgcmV0dXJuIGAke21lc3NhZ2V9IHJlcGVhdGVkICR7Y291bnR9IHRpbWVzYDtcbiAgICB9XG59XG5fX2RlY29yYXRlKFtcbiAgICBSRUdFWC5JTlZBUklBTlQoL15hJC8pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0UHJvcGVydHlcIiwgdm9pZCAwKTtcbl9fZGVjb3JhdGUoW1xuICAgIFJFR0VYLlBPU1QoL154eHh4LiokLyksXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIFJFR0VYLlBSRSgvaG9sbGEqL2cpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbU3RyaW5nXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIFN0cmluZylcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RQYXJhbXZhbHVlQW5kUmV0dXJudmFsdWVcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBSRUdFWC5QT1NUKC9eeHh4eC4qJC8pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtTdHJpbmddKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgU3RyaW5nKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdFJldHVybnZhbHVlXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEVRLlBSRShcIlNFTEVDVFwiLCBmYWxzZSwgXCJ0YWdOYW1lXCIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbSFRNTEVsZW1lbnRdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdEVRQW5kUGF0aFwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBFUS5QUkUoXCJTRUxFQ1RcIiwgdHJ1ZSwgXCJ0YWdOYW1lXCIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbSFRNTEVsZW1lbnRdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdEVRQW5kUGF0aFdpdGhJbnZlcnNpb25cIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgVFlQRS5QUkUoXCJzdHJpbmdcIikpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtPYmplY3RdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdFRZUEVcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgQUUuUFJFKFtuZXcgVFlQRShcInN0cmluZ1wiKV0pKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbQXJyYXldKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdEFFXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEFFLlBSRShuZXcgUkVHRVgoL14oP2k6KE5PVyl8KFsrLV1cXGQrW2RteV0pKSQvaSkpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbQXJyYXldKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdFJFR0VYV2l0aEFFXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlclxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogVGVzdFxuICAgICxcbiAgICBfX3BhcmFtKDAsIElOU1RBTkNFLlBSRShEYXRlKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0SU5TVEFOQ0VcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgQUUuUFJFKFtuZXcgVFlQRShcInN0cmluZ1wiKSwgbmV3IFJFR0VYKC9eYWJjJC8pXSwgMSwgMikpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtBcnJheV0pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0QUVSYW5nZVwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBBRS5QUkUoW25ldyBUWVBFKFwic3RyaW5nXCIpLCBuZXcgUkVHRVgoL15hYmMkLyldLCAxKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW0FycmF5XSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RBRUluZGV4XCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEdSRUFURVIuUFJFKDIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbTnVtYmVyXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RHUkVBVEVSXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIEdSRUFURVJfT1JfRVFVQUwuUFJFKDIpKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbTnVtYmVyXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIHZvaWQgMClcbl0sIERlbW8ucHJvdG90eXBlLCBcInRlc3RHUkVBVEVSX09SX0VRVUFMXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgREJDLlBhcmFtdmFsdWVQcm92aWRlcixcbiAgICBfX3BhcmFtKDAsIExFU1MuUFJFKDIwKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW051bWJlcl0pLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG5dLCBEZW1vLnByb3RvdHlwZSwgXCJ0ZXN0TEVTU1wiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBMRVNTX09SX0VRVUFMLlBSRSgyMCkpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtOdW1iZXJdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdExFU1NfT1JfRVFVQUxcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBEQkMuUGFyYW12YWx1ZVByb3ZpZGVyLFxuICAgIF9fcGFyYW0oMCwgRElGRkVSRU5ULlBSRSgyMCkpLFxuICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtOdW1iZXJdKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuXSwgRGVtby5wcm90b3R5cGUsIFwidGVzdERJRkZFUkVOVFwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIERCQy5QYXJhbXZhbHVlUHJvdmlkZXIsXG4gICAgX19wYXJhbSgwLCBUWVBFLlBSRShcInN0cmluZ1wiKSksXG4gICAgX19wYXJhbSgxLCBUWVBFLlBSRShcIm51bWJlclwiKSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW1N0cmluZywgTnVtYmVyXSksXG4gICAgX19tZXRhZGF0YShcImRlc2lnbjpyZXR1cm50eXBlXCIsIFN0cmluZylcbl0sIERlbW8sIFwidGVzdFN0YXRpY01ldGhvZFwiLCBudWxsKTtcbmNvbnN0IGRlbW8gPSBuZXcgRGVtbygpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RQcm9wZXJ0eSA9IFwiYWJkXCI7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiSU5WQVJJQU5UIEluZnJpbmdlbWVudFwiLCBcIk9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0UHJvcGVydHkgPSBcImFcIjtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJJTlZBUklBTlQgT0tcIik7XG5jb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbmRlbW8udGVzdFBhcmFtdmFsdWVBbmRSZXR1cm52YWx1ZShcImhvbGxhXCIpO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIlBBUkFNRVRFUi0gJiBSRVRVUk5WQUxVRSBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RQYXJhbXZhbHVlQW5kUmV0dXJudmFsdWUoXCJ5eXl5XCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIlBBUkFNRVRFUi0gJiBSRVRVUk5WQUxVRSBJbmZyaW5nZW1lbnRcIiwgXCJPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdFJldHVybnZhbHVlKFwieHh4eFwiKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJSRVRVUk5WQUxVRSBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RSZXR1cm52YWx1ZShcInl5eXlcIik7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiUkVUVVJOVkFMVUUgSW5mcmluZ2VtZW50XCIsIFwiT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RFUUFuZFBhdGgoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiRVEgd2l0aCBQYXRoIEluZnJpbmdlbWVudCBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RFUUFuZFBhdGhXaXRoSW52ZXJzaW9uKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIikpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkVRIHdpdGggUGF0aCBhbmQgSW52ZXJzaW9uIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdFRZUEUoXCJ4XCIpO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIlRZUEUgT0tcIik7XG5jb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbnRyeSB7XG4gICAgZGVtby50ZXN0VFlQRSgwKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJUWVBFIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdEFFKFtcIjExXCIsIFwiMTBcIiwgXCJiXCJdKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJBRSBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RBRShbXCIxMVwiLCAxMSwgXCJiXCJdKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJBRSBJbmZyaW5nZW1lbnQgT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RSRUdFWFdpdGhBRShbXCIrMWRcIiwgXCJOT1dcIiwgXCItMTB5XCJdKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJSRUdFWCB3aXRoIEFFIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdFJFR0VYV2l0aEFFKFtcIisxZFwiLCBcIis1ZFwiLCBcIi14MTB5XCJdKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJSRUdFWCB3aXRoIEFFIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdElOU1RBTkNFKG5ldyBEYXRlKCkpO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIklOU1RBTkNFIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdElOU1RBTkNFKGRlbW8pO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOU1RBTkNFIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdEFFUmFuZ2UoWzExLCBcImFiY1wiLCBcImFiY1wiXSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiQUUgUmFuZ2UgT0tcIik7XG5jb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbnRyeSB7XG4gICAgZGVtby50ZXN0QUVSYW5nZShbMTEsIFwiYWJjXCIsIC9hL2ddKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJBRSBSYW5nZSBJbmZyaW5nZW1lbnQgT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RBRUluZGV4KFsxMSwgXCJhYmNcIiwgXCJhYmNcIl0pO1xuY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG5jb25zb2xlLmxvZyhcIkFFIEluZGV4IE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdEFFSW5kZXgoW1wiMTFcIiwgMTIsIFwiL2EvZ1wiXSk7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiQUUgSW5kZXggSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0R1JFQVRFUigxMSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiR1JFQVRFUiBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RHUkVBVEVSKDIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkdSRUFURVIgSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0R1JFQVRFUl9PUl9FUVVBTCgyKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJHUkVBVEVSX09SX0VRVUFMIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdEdSRUFURVJfT1JfRVFVQUwoMSk7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiR1JFQVRFUl9PUl9FUVVBTCBJbmZyaW5nZW1lbnQgT0tcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5kZW1vLnRlc3RMRVNTKDEwKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJMRVNTIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdExFU1MoMjApO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkxFU1MgSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuZGVtby50ZXN0TEVTU19PUl9FUVVBTCgyMCk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiTEVTUyBPS1wiKTtcbmNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xudHJ5IHtcbiAgICBkZW1vLnRlc3RMRVNTX09SX0VRVUFMKDIxKTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJMRVNTX09SX0VRVUFMIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbmRlbW8udGVzdERJRkZFUkVOVCgyMSk7XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiRElGRkVSRU5UIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIGRlbW8udGVzdERJRkZFUkVOVCgyMCk7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiRElGRkVSRU5UIEluZnJpbmdlbWVudCBPS1wiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbi8vICNyZWdpb24gSW5hY3Rpdml0eSBDaGVja3NcbndpbmRvdy5XYVhDb2RlLkRCQy5leGVjdXRpb25TZXR0aW5ncy5jaGVja1ByZWNvbmRpdGlvbnMgPSBmYWxzZTtcbnRyeSB7XG4gICAgZGVtby50ZXN0TEVTU19PUl9FUVVBTCgyMSk7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJJTkFDVElWRSBQUkVDT05ESVRJT05TIE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIFBSRUNPTkRJVElPTlMgRkFJTEVEXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxud2luZG93LldhWENvZGUuREJDLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrUG9zdGNvbmRpdGlvbnMgPSBmYWxzZTtcbnRyeSB7XG4gICAgZGVtby50ZXN0UmV0dXJudmFsdWUoXCJxcXFxcVwiKTtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIFBPU1RDT05ESVRJT05TIE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIFBPU1RDT05ESVRJT05TIEZBSUxFRFwiKTtcbiAgICBjb25zb2xlLmxvZyhYKTtcbiAgICBjb25zb2xlLmxvZyhcIl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlwiKTtcbn1cbndpbmRvdy5XYVhDb2RlLkRCQy5leGVjdXRpb25TZXR0aW5ncy5jaGVja0ludmFyaWFudHMgPSBmYWxzZTtcbnRyeSB7XG4gICAgZGVtby50ZXN0UHJvcGVydHkgPSBcImJcIjtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIklOQUNUSVZFIElOVkFSSUFOVFMgT0tcIik7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG5jYXRjaCAoWCkge1xuICAgIGNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuICAgIGNvbnNvbGUubG9nKFwiSU5BQ1RJVkUgSU5WQVJJQU5UUyBGQUlMRURcIik7XG4gICAgY29uc29sZS5sb2coWCk7XG4gICAgY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG59XG4vLyAjZW5kcmVnaW9uIEluYWN0aXZpdHkgQ2hlY2tzXG4vLyBSZS1lbmFibGUgYWxsIGNoZWNrcyBmb3Igc3Vic2VxdWVudCB0ZXN0c1xud2luZG93LldhWENvZGUuREJDLmV4ZWN1dGlvblNldHRpbmdzLmNoZWNrUHJlY29uZGl0aW9ucyA9IHRydWU7XG53aW5kb3cuV2FYQ29kZS5EQkMuZXhlY3V0aW9uU2V0dGluZ3MuY2hlY2tQb3N0Y29uZGl0aW9ucyA9IHRydWU7XG53aW5kb3cuV2FYQ29kZS5EQkMuZXhlY3V0aW9uU2V0dGluZ3MuY2hlY2tJbnZhcmlhbnRzID0gdHJ1ZTtcbi8vICNyZWdpb24gU3RhdGljIE1ldGhvZCBUZXN0XG5jb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbmNvbnNvbGUubG9nKFwiVEVTVElORyBTVEFUSUMgTUVUSE9EIFdJVEggUEFSQU1WQUxVRVBST1ZJREVSXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG5EZW1vLnRlc3RTdGF0aWNNZXRob2QoXCJIZWxsb1wiLCAzKTtcbmNvbnNvbGUubG9nKFwi4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyE4oyEXCIpO1xuY29uc29sZS5sb2coXCJTVEFUSUMgTUVUSE9EIE9LXCIpO1xuY29uc29sZS5sb2coXCJeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cIik7XG50cnkge1xuICAgIERlbW8udGVzdFN0YXRpY01ldGhvZChcIkhlbGxvXCIsIFwibm90IGEgbnVtYmVyXCIpO1xufVxuY2F0Y2ggKFgpIHtcbiAgICBjb25zb2xlLmxvZyhcIuKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhOKMhFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIlNUQVRJQyBNRVRIT0QgSW5mcmluZ2VtZW50IE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxudHJ5IHtcbiAgICBEZW1vLnRlc3RTdGF0aWNNZXRob2QoMTIzLCA1KTtcbn1cbmNhdGNoIChYKSB7XG4gICAgY29uc29sZS5sb2coXCLijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijITijIRcIik7XG4gICAgY29uc29sZS5sb2coXCJTVEFUSUMgTUVUSE9EIEluZnJpbmdlbWVudCAoZmlyc3QgcGFyYW0pIE9LXCIpO1xuICAgIGNvbnNvbGUubG9nKFgpO1xuICAgIGNvbnNvbGUubG9nKFwiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXCIpO1xufVxuLy8gI2VuZHJlZ2lvbiBTdGF0aWMgTWV0aG9kIFRlc3RcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@ export class GREATER extends COMPARISON {
|
|
|
11
11
|
hint: string | undefined = undefined,
|
|
12
12
|
dbc: string | undefined = undefined,
|
|
13
13
|
) {
|
|
14
|
-
return COMPARISON.PRE(equivalent, false, false, path,
|
|
14
|
+
return COMPARISON.PRE(equivalent, false, false, path, hint, dbc);
|
|
15
15
|
}
|
|
16
16
|
/** See {@link COMPARISON.POST }. */
|
|
17
17
|
public static override POST(
|
|
@@ -22,7 +22,7 @@ export class GREATER extends COMPARISON {
|
|
|
22
22
|
hint: string | undefined = undefined,
|
|
23
23
|
dbc: string | undefined = undefined
|
|
24
24
|
) {
|
|
25
|
-
return COMPARISON.POST(equivalent, false, false, path,
|
|
25
|
+
return COMPARISON.POST(equivalent, false, false, path, hint, dbc);
|
|
26
26
|
}
|
|
27
27
|
/** See {@link COMPARISON.INVARIANT }. */
|
|
28
28
|
public static override INVARIANT(
|
|
@@ -33,7 +33,7 @@ export class GREATER extends COMPARISON {
|
|
|
33
33
|
hint: string | undefined = undefined,
|
|
34
34
|
dbc: string | undefined = undefined
|
|
35
35
|
) {
|
|
36
|
-
return COMPARISON.INVARIANT(equivalent, false, false, path,
|
|
36
|
+
return COMPARISON.INVARIANT(equivalent, false, false, path, hint, dbc);
|
|
37
37
|
}
|
|
38
38
|
/** See {@link COMPARISON.constructor }. */
|
|
39
39
|
constructor(public override equivalent) {
|