babylonjs-post-process 7.23.0 → 7.24.0
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/babylon.asciiArtPostProcess.js +15 -10
- package/babylon.asciiArtPostProcess.min.js.map +1 -1
- package/babylon.digitalRainPostProcess.js +15 -10
- package/babylon.digitalRainPostProcess.min.js.map +1 -1
- package/babylonjs.postProcess.js +15 -10
- package/babylonjs.postProcess.min.js.map +1 -1
- package/package.json +2 -2
package/babylonjs.postProcess.js
CHANGED
|
@@ -669,7 +669,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
|
669
669
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
670
670
|
PERFORMANCE OF THIS SOFTWARE.
|
|
671
671
|
***************************************************************************** */
|
|
672
|
-
/* global Reflect, Promise, SuppressedError, Symbol */
|
|
672
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
673
673
|
|
|
674
674
|
var extendStatics = function(d, b) {
|
|
675
675
|
extendStatics = Object.setPrototypeOf ||
|
|
@@ -780,8 +780,8 @@ function __awaiter(thisArg, _arguments, P, generator) {
|
|
|
780
780
|
}
|
|
781
781
|
|
|
782
782
|
function __generator(thisArg, body) {
|
|
783
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
784
|
-
return g =
|
|
783
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
784
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
785
785
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
786
786
|
function step(op) {
|
|
787
787
|
if (f) throw new TypeError("Generator is already executing.");
|
|
@@ -885,7 +885,7 @@ function __await(v) {
|
|
|
885
885
|
function __asyncGenerator(thisArg, _arguments, generator) {
|
|
886
886
|
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
887
887
|
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
|
888
|
-
return i =
|
|
888
|
+
return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
|
|
889
889
|
function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
|
|
890
890
|
function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
|
|
891
891
|
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
|
@@ -983,17 +983,22 @@ function __disposeResources(env) {
|
|
|
983
983
|
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
984
984
|
env.hasError = true;
|
|
985
985
|
}
|
|
986
|
+
var r, s = 0;
|
|
986
987
|
function next() {
|
|
987
|
-
while (env.stack.
|
|
988
|
-
var rec = env.stack.pop();
|
|
988
|
+
while (r = env.stack.pop()) {
|
|
989
989
|
try {
|
|
990
|
-
|
|
991
|
-
if (
|
|
990
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
991
|
+
if (r.dispose) {
|
|
992
|
+
var result = r.dispose.call(r.value);
|
|
993
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
994
|
+
}
|
|
995
|
+
else s |= 1;
|
|
992
996
|
}
|
|
993
997
|
catch (e) {
|
|
994
|
-
|
|
998
|
+
fail(e);
|
|
995
999
|
}
|
|
996
1000
|
}
|
|
1001
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
997
1002
|
if (env.hasError) throw env.error;
|
|
998
1003
|
}
|
|
999
1004
|
return next();
|
|
@@ -1131,4 +1136,4 @@ __webpack_exports__ = __webpack_exports__["default"];
|
|
|
1131
1136
|
/******/ })()
|
|
1132
1137
|
;
|
|
1133
1138
|
});
|
|
1134
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbmpzLnBvc3RQcm9jZXNzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVEE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7QUFLQTtBQUNBO0FBQUE7QUFnQkE7Ozs7OztBQU1BO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFFQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7O0FBQ0E7QUE3REE7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUE2REE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUEvSUE7QUFEQTtBQUNBO0FBR0E7QUFEQTtBQUNBO0FBNklBO0FBQUE7QUE2QkE7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBa0JBOzs7Ozs7QUFNQTtBQUNBO0FBQUE7QUFuQkE7OztBQUdBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQVlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvUEE7QUFDQTtBQUVBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNaQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBOzs7OztBQUtBO0FBQ0E7QUFBQTtBQWdCQTs7Ozs7O0FBTUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUVBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBQ0E7QUEzREE7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUEyREE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUE3SUE7QUFEQTtBQUNBO0FBR0E7QUFEQTtBQUNBO0FBMklBO0FBQUE7QUF3QkE7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBdUJBOzs7Ozs7QUFNQTtBQUNBO0FBQUE7QUF4QkE7OztBQUdBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFzQkE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQW1CQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuU0E7QUFDQTtBQUVBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQ2ZBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ3BYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vUE9TVFBST0NFU1NFUy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vUE9TVFBST0NFU1NFUy8uLi8uLi8uLi9kZXYvcG9zdFByb2Nlc3Nlcy9zcmMvYXNjaWlBcnQvYXNjaWlBcnRQb3N0UHJvY2Vzcy50cyIsIndlYnBhY2s6Ly9QT1NUUFJPQ0VTU0VTLy4uLy4uLy4uL2Rldi9wb3N0UHJvY2Vzc2VzL3NyYy9hc2NpaUFydC9hc2NpaWFydC5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QT1NUUFJPQ0VTU0VTLy4uLy4uLy4uL2Rldi9wb3N0UHJvY2Vzc2VzL3NyYy9hc2NpaUFydC9pbmRleC50cyIsIndlYnBhY2s6Ly9QT1NUUFJPQ0VTU0VTLy4uLy4uLy4uL2Rldi9wb3N0UHJvY2Vzc2VzL3NyYy9kaWdpdGFsUmFpbi9kaWdpdGFsUmFpblBvc3RQcm9jZXNzLnRzIiwid2VicGFjazovL1BPU1RQUk9DRVNTRVMvLi4vLi4vLi4vZGV2L3Bvc3RQcm9jZXNzZXMvc3JjL2RpZ2l0YWxSYWluL2RpZ2l0YWxyYWluLmZyYWdtZW50LnRzIiwid2VicGFjazovL1BPU1RQUk9DRVNTRVMvLi4vLi4vLi4vZGV2L3Bvc3RQcm9jZXNzZXMvc3JjL2RpZ2l0YWxSYWluL2luZGV4LnRzIiwid2VicGFjazovL1BPU1RQUk9DRVNTRVMvLi4vLi4vLi4vZGV2L3Bvc3RQcm9jZXNzZXMvc3JjL2luZGV4LnRzIiwid2VicGFjazovL1BPU1RQUk9DRVNTRVMvLi4vLi4vLi4vbHRzL3Bvc3RQcm9jZXNzZXMvc3JjL2xlZ2FjeS9sZWdhY3kudHMiLCJ3ZWJwYWNrOi8vUE9TVFBST0NFU1NFUy9leHRlcm5hbCB1bWQge1wicm9vdFwiOlwiQkFCWUxPTlwiLFwiY29tbW9uanNcIjpcImJhYnlsb25qc1wiLFwiY29tbW9uanMyXCI6XCJiYWJ5bG9uanNcIixcImFtZFwiOlwiYmFieWxvbmpzXCJ9Iiwid2VicGFjazovL1BPU1RQUk9DRVNTRVMvLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5tanMiLCJ3ZWJwYWNrOi8vUE9TVFBST0NFU1NFUy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9QT1NUUFJPQ0VTU0VTL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1BPU1RQUk9DRVNTRVMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1BPU1RQUk9DRVNTRVMvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9QT1NUUFJPQ0VTU0VTL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vUE9TVFBST0NFU1NFUy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL1BPU1RQUk9DRVNTRVMvLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiYmFieWxvbmpzXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiYmFieWxvbmpzLXBvc3QtcHJvY2Vzc1wiLCBbXCJiYWJ5bG9uanNcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiYmFieWxvbmpzLXBvc3QtcHJvY2Vzc1wiXSA9IGZhY3RvcnkocmVxdWlyZShcImJhYnlsb25qc1wiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiUE9TVFBST0NFU1NFU1wiXSA9IGZhY3Rvcnkocm9vdFtcIkJBQllMT05cIl0pO1xufSkoKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0aGlzKSwgKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYmFieWxvbmpzX01pc2NfZGVjb3JhdG9yc19fKSA9PiB7XG5yZXR1cm4gIiwiaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcbmltcG9ydCB7IHNlcmlhbGl6ZSB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHR5cGUgeyBDYW1lcmEgfSBmcm9tIFwiY29yZS9DYW1lcmFzL2NhbWVyYVwiO1xyXG5pbXBvcnQgeyBCYXNlVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9iYXNlVGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBFZmZlY3QgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvZWZmZWN0XCI7XHJcbmltcG9ydCB7IFBvc3RQcm9jZXNzIH0gZnJvbSBcImNvcmUvUG9zdFByb2Nlc3Nlcy9wb3N0UHJvY2Vzc1wiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IFwiY29yZS9FbmdpbmVzL0V4dGVuc2lvbnMvZW5naW5lLmR5bmFtaWNUZXh0dXJlXCI7XHJcbmltcG9ydCBcIi4vYXNjaWlhcnQuZnJhZ21lbnRcIjtcclxuXHJcbi8qKlxyXG4gKiBBc2NpaUFydEZvbnRUZXh0dXJlIGlzIHRoZSBoZWxwZXIgY2xhc3MgdXNlZCB0byBlYXNpbHkgY3JlYXRlIHlvdXIgYXNjaWkgYXJ0IGZvbnQgdGV4dHVyZS5cclxuICpcclxuICogSXQgYmFzaWNhbGx5IHRha2VzIGNhcmUgcmVuZGVyaW5nIHRoZSBmb250IGZyb250IHRoZSBnaXZlbiBmb250IHNpemUgdG8gYSB0ZXh0dXJlLlxyXG4gKiBUaGlzIGlzIHVzZWQgbGF0ZXIgb24gaW4gdGhlIHBvc3Rwcm9jZXNzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEFzY2lpQXJ0Rm9udFRleHR1cmUgZXh0ZW5kcyBCYXNlVGV4dHVyZSB7XHJcbiAgICBAc2VyaWFsaXplKFwiZm9udFwiKVxyXG4gICAgcHJpdmF0ZSBfZm9udDogc3RyaW5nO1xyXG5cclxuICAgIEBzZXJpYWxpemUoXCJ0ZXh0XCIpXHJcbiAgICBwcml2YXRlIF90ZXh0OiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBfY2hhclNpemU6IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHNpemUgb2Ygb25lIGNoYXIgaW4gdGhlIHRleHR1cmUgKGVhY2ggY2hhciBmaXRzIGluIHNpemUgKiBzaXplIHNwYWNlIGluIHRoZSB0ZXh0dXJlKS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjaGFyU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFyU2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQXNjaWkgQXJ0IEZvbnRUZXh0dXJlIGNsYXNzXHJcbiAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdGV4dHVyZVxyXG4gICAgICogQHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8gdXNlLCB1c2UgdGhlIFczQyBDU1Mgbm90YXRpb25cclxuICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBjYXJhY3RlciBzZXQgdG8gdXNlIGluIHRoZSByZW5kZXJpbmcuXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgdGhlIHNjZW5lIHRoYXQgb3ducyB0aGUgdGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGZvbnQ6IHN0cmluZywgdGV4dDogc3RyaW5nLCBzY2VuZTogTnVsbGFibGU8U2NlbmU+ID0gbnVsbCkge1xyXG4gICAgICAgIHN1cGVyKHNjZW5lKTtcclxuXHJcbiAgICAgICAgc2NlbmUgPSB0aGlzLmdldFNjZW5lKCk7XHJcblxyXG4gICAgICAgIGlmICghc2NlbmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLl90ZXh0ID09IHRleHQ7XHJcbiAgICAgICAgdGhpcy5fZm9udCA9PSBmb250O1xyXG5cclxuICAgICAgICB0aGlzLndyYXBVID0gVGV4dHVyZS5DTEFNUF9BRERSRVNTTU9ERTtcclxuICAgICAgICB0aGlzLndyYXBWID0gVGV4dHVyZS5DTEFNUF9BRERSRVNTTU9ERTtcclxuICAgICAgICAvL3RoaXMuYW5pc290cm9waWNGaWx0ZXJpbmdMZXZlbCA9IDE7XHJcblxyXG4gICAgICAgIC8vIEdldCB0aGUgZm9udCBzcGVjaWZpYyBpbmZvLlxyXG4gICAgICAgIGNvbnN0IG1heENoYXJIZWlnaHQgPSB0aGlzLl9nZXRGb250SGVpZ2h0KGZvbnQpO1xyXG4gICAgICAgIGNvbnN0IG1heENoYXJXaWR0aCA9IHRoaXMuX2dldEZvbnRXaWR0aChmb250KTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2hhclNpemUgPSBNYXRoLm1heChtYXhDaGFySGVpZ2h0LmhlaWdodCwgbWF4Q2hhcldpZHRoKTtcclxuXHJcbiAgICAgICAgLy8gVGhpcyBpcyBhbiBhcHByb3hpbWF0ZSBzaXplLCBidXQgc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIGZpdCBhdCBsZWFzdCB0aGUgbWF4Q2hhckNvdW50LlxyXG4gICAgICAgIGNvbnN0IHRleHR1cmVXaWR0aCA9IE1hdGguY2VpbCh0aGlzLl9jaGFyU2l6ZSAqIHRleHQubGVuZ3RoKTtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlSGVpZ2h0ID0gdGhpcy5fY2hhclNpemU7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgdGV4dHVyZSB0aGF0IHdpbGwgc3RvcmUgdGhlIGZvbnQgY2hhcmFjdGVycy5cclxuICAgICAgICB0aGlzLl90ZXh0dXJlID0gc2NlbmUuZ2V0RW5naW5lKCkuY3JlYXRlRHluYW1pY1RleHR1cmUodGV4dHVyZVdpZHRoLCB0ZXh0dXJlSGVpZ2h0LCBmYWxzZSwgVGV4dHVyZS5ORUFSRVNUX1NBTVBMSU5HTU9ERSk7XHJcbiAgICAgICAgLy9zY2VuZS5nZXRFbmdpbmUoKS5zZXRjbGFtcFxyXG4gICAgICAgIGNvbnN0IHRleHR1cmVTaXplID0gdGhpcy5nZXRTaXplKCk7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBhIGNhbnZhcyB3aXRoIHRoZSBmaW5hbCBzaXplOiB0aGUgb25lIG1hdGNoaW5nIHRoZSB0ZXh0dXJlLlxyXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XHJcbiAgICAgICAgY2FudmFzLndpZHRoID0gdGV4dHVyZVNpemUud2lkdGg7XHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IHRleHR1cmVTaXplLmhlaWdodDtcclxuICAgICAgICBjb25zdCBjb250ZXh0ID0gPENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgIGNvbnRleHQudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcclxuICAgICAgICBjb250ZXh0LmZvbnQgPSBmb250O1xyXG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gXCJ3aGl0ZVwiO1xyXG4gICAgICAgIGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIFNldHMgdGhlIHRleHQgaW4gdGhlIHRleHR1cmUuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZmlsbFRleHQodGV4dFtpXSwgaSAqIHRoaXMuX2NoYXJTaXplLCAtbWF4Q2hhckhlaWdodC5vZmZzZXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRmx1c2ggdGhlIHRleHQgaW4gdGhlIGR5bmFtaWMgdGV4dHVyZS5cclxuXHJcbiAgICAgICAgc2NlbmUuZ2V0RW5naW5lKCkudXBkYXRlRHluYW1pY1RleHR1cmUodGhpcy5fdGV4dHVyZSwgY2FudmFzLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBtYXggY2hhciB3aWR0aCBvZiBhIGZvbnQuXHJcbiAgICAgKiBAcGFyYW0gZm9udCB0aGUgZm9udCB0byB1c2UsIHVzZSB0aGUgVzNDIENTUyBub3RhdGlvblxyXG4gICAgICogQHJldHVybnMgdGhlIG1heCBjaGFyIHdpZHRoXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2dldEZvbnRXaWR0aChmb250OiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IGZvbnREcmF3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgICAgICBjb25zdCBjdHggPSA8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPmZvbnREcmF3LmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgICBjdHguZmlsbFN0eWxlID0gXCJ3aGl0ZVwiO1xyXG4gICAgICAgIGN0eC5mb250ID0gZm9udDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGN0eC5tZWFzdXJlVGV4dChcIldcIikud2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTW9yZSBpbmZvIGhlcmU6IGh0dHBzOi8vdmlkZWxhaXMuY29tLzIwMTQvMDMvMTYvdGhlLW1hbnktYW5kLXZhcmllZC1wcm9ibGVtcy13aXRoLW1lYXN1cmluZy1mb250LWhlaWdodC1mb3ItaHRtbDUtY2FudmFzL1xyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBtYXggY2hhciBoZWlnaHQgb2YgYSBmb250LlxyXG4gICAgICogQHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8gdXNlLCB1c2UgdGhlIFczQyBDU1Mgbm90YXRpb25cclxuICAgICAqIEByZXR1cm5zIHRoZSBtYXggY2hhciBoZWlnaHRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZ2V0Rm9udEhlaWdodChmb250OiBzdHJpbmcpOiB7IGhlaWdodDogbnVtYmVyOyBvZmZzZXQ6IG51bWJlciB9IHtcclxuICAgICAgICBjb25zdCBmb250RHJhdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XHJcbiAgICAgICAgY29uc3QgY3R4ID0gPENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD5mb250RHJhdy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGZvbnREcmF3LndpZHRoLCBmb250RHJhdy5oZWlnaHQpO1xyXG4gICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSBcInRvcFwiO1xyXG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBcIndoaXRlXCI7XHJcbiAgICAgICAgY3R4LmZvbnQgPSBmb250O1xyXG4gICAgICAgIGN0eC5maWxsVGV4dChcImpIfFwiLCAwLCAwKTtcclxuICAgICAgICBjb25zdCBwaXhlbHMgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGZvbnREcmF3LndpZHRoLCBmb250RHJhdy5oZWlnaHQpLmRhdGE7XHJcbiAgICAgICAgbGV0IHN0YXJ0ID0gLTE7XHJcbiAgICAgICAgbGV0IGVuZCA9IC0xO1xyXG4gICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGZvbnREcmF3LmhlaWdodDsgcm93KyspIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uID0gMDsgY29sdW1uIDwgZm9udERyYXcud2lkdGg7IGNvbHVtbisrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IChyb3cgKiBmb250RHJhdy53aWR0aCArIGNvbHVtbikgKiA0O1xyXG4gICAgICAgICAgICAgICAgaWYgKHBpeGVsc1tpbmRleF0gPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uID09PSBmb250RHJhdy53aWR0aCAtIDEgJiYgc3RhcnQgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IHJvdztcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93ID0gZm9udERyYXcuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSByb3c7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IGhlaWdodDogZW5kIC0gc3RhcnQgKyAxLCBvZmZzZXQ6IHN0YXJ0IC0gMSB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xvbmVzIHRoZSBjdXJyZW50IEFzY2lpQXJ0VGV4dHVyZS5cclxuICAgICAqIEByZXR1cm5zIHRoZSBjbG9uZSBvZiB0aGUgdGV4dHVyZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIGNsb25lKCk6IEFzY2lpQXJ0Rm9udFRleHR1cmUge1xyXG4gICAgICAgIHJldHVybiBuZXcgQXNjaWlBcnRGb250VGV4dHVyZSh0aGlzLm5hbWUsIHRoaXMuX2ZvbnQsIHRoaXMuX3RleHQsIHRoaXMuZ2V0U2NlbmUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgYSBqc29uIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHRleHR1cmUgYW5kIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgaXQuXHJcbiAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UgSlNPTiByZXByZXNlbnRhdGlvblxyXG4gICAgICogQHBhcmFtIHNjZW5lIHRoZSBzY2VuZSB0byBjcmVhdGUgdGhlIHRleHR1cmUgZm9yXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgcGFyc2VkIHRleHR1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBQYXJzZShzb3VyY2U6IGFueSwgc2NlbmU6IFNjZW5lKTogQXNjaWlBcnRGb250VGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IFNlcmlhbGl6YXRpb25IZWxwZXIuUGFyc2UoKCkgPT4gbmV3IEFzY2lpQXJ0Rm9udFRleHR1cmUoc291cmNlLm5hbWUsIHNvdXJjZS5mb250LCBzb3VyY2UudGV4dCwgc2NlbmUpLCBzb3VyY2UsIHNjZW5lLCBudWxsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPcHRpb24gYXZhaWxhYmxlIGluIHRoZSBBc2NpaSBBcnQgUG9zdCBQcm9jZXNzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJQXNjaWlBcnRQb3N0UHJvY2Vzc09wdGlvbnMge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZm9udCB0byB1c2UgZm9sbG93aW5nIHRoZSB3M2MgZm9udCBkZWZpbml0aW9uLlxyXG4gICAgICovXHJcbiAgICBmb250Pzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNoYXJhY3RlciBzZXQgdG8gdXNlIGluIHRoZSBwb3N0cHJvY2Vzcy5cclxuICAgICAqL1xyXG4gICAgY2hhcmFjdGVyU2V0Pzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBkZWZpbmVzIHRoZSBhbW91bnQgeW91IHdhbnQgdG8gbWl4IHRoZSBcInRpbGVcIiBvciBjYXJhY3RlciBzcGFjZSBjb2xvcmVkIGluIHRoZSBhc2NpaSBhcnQuXHJcbiAgICAgKiBUaGlzIG51bWJlciBpcyBkZWZpbmVkIGJldHdlZW4gMCBhbmQgMTtcclxuICAgICAqL1xyXG4gICAgbWl4VG9UaWxlPzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBkZWZpbmVzIHRoZSBhbW91bnQgeW91IHdhbnQgdG8gbWl4IHRoZSBub3JtYWwgcmVuZGVyaW5nIHBhc3MgaW4gdGhlIGFzY2lpIGFydC5cclxuICAgICAqIFRoaXMgbnVtYmVyIGlzIGRlZmluZWQgYmV0d2VlbiAwIGFuZCAxO1xyXG4gICAgICovXHJcbiAgICBtaXhUb05vcm1hbD86IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFzY2lpQXJ0UG9zdFByb2Nlc3MgaGVscHMgcmVuZGVyaW5nIGV2ZXJpdGhpbmcgaW4gQXNjaWkgQXJ0LlxyXG4gKlxyXG4gKiBTaW1tcGx5IGFkZCBpdCB0byB5b3VyIHNjZW5lIGFuZCBsZXQgdGhlIG5lcmQgdGhhdCBsaXZlcyBpbiB5b3UgaGF2ZSBmdW4uXHJcbiAqIEV4YW1wbGUgdXNhZ2U6IHZhciBwcCA9IG5ldyBBc2NpaUFydFBvc3RQcm9jZXNzKFwibXlBc2NpaVwiLCBcIjIwcHggTW9ub3NwYWNlXCIsIGNhbWVyYSk7XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQXNjaWlBcnRQb3N0UHJvY2VzcyBleHRlbmRzIFBvc3RQcm9jZXNzIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZvbnQgdGV4dHVyZSB1c2VkIHRvIHJlbmRlciB0aGUgY2hhciBpbiB0aGUgcG9zdCBwcm9jZXNzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9hc2NpaUFydEZvbnRUZXh0dXJlOiBBc2NpaUFydEZvbnRUZXh0dXJlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBkZWZpbmVzIHRoZSBhbW91bnQgeW91IHdhbnQgdG8gbWl4IHRoZSBcInRpbGVcIiBvciBjYXJhY3RlciBzcGFjZSBjb2xvcmVkIGluIHRoZSBhc2NpaSBhcnQuXHJcbiAgICAgKiBUaGlzIG51bWJlciBpcyBkZWZpbmVkIGJldHdlZW4gMCBhbmQgMTtcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1peFRvVGlsZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgYW1vdW50IHlvdSB3YW50IHRvIG1peCB0aGUgbm9ybWFsIHJlbmRlcmluZyBwYXNzIGluIHRoZSBhc2NpaSBhcnQuXHJcbiAgICAgKiBUaGlzIG51bWJlciBpcyBkZWZpbmVkIGJldHdlZW4gMCBhbmQgMTtcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1peFRvTm9ybWFsOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEFzY2lpIEFydCBQb3N0IFByb2Nlc3MuXHJcbiAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBnaXZlIHRvIHRoZSBwb3N0cHJvY2Vzc1xyXG4gICAgICogQGNhbWVyYSB0aGUgY2FtZXJhIHRvIGFwcGx5IHRoZSBwb3N0IHByb2Nlc3MgdG8uXHJcbiAgICAgKiBAcGFyYW0gY2FtZXJhXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBjYW4gZWl0aGVyIGJlIHRoZSBmb250IG5hbWUgb3IgYW4gb3B0aW9uIG9iamVjdCBmb2xsb3dpbmcgdGhlIElBc2NpaUFydFBvc3RQcm9jZXNzT3B0aW9ucyBmb3JtYXRcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBjYW1lcmE6IE51bGxhYmxlPENhbWVyYT4sIG9wdGlvbnM/OiBzdHJpbmcgfCBJQXNjaWlBcnRQb3N0UHJvY2Vzc09wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBcImFzY2lpYXJ0XCIsIFtcImFzY2lpQXJ0Rm9udEluZm9zXCIsIFwiYXNjaWlBcnRPcHRpb25zXCJdLCBbXCJhc2NpaUFydEZvbnRcIl0sIDEsIGNhbWVyYSwgVGV4dHVyZS5UUklMSU5FQVJfU0FNUExJTkdNT0RFLCB1bmRlZmluZWQsIHRydWUpO1xyXG5cclxuICAgICAgICAvLyBEZWZhdWx0IHZhbHVlcy5cclxuICAgICAgICBsZXQgZm9udCA9IFwiNDBweCBNb25vc3BhY2VcIjtcclxuICAgICAgICBsZXQgY2hhcmFjdGVyU2V0ID0gXCIgYC0uJ186LFxcXCI9Xjs8KyEqPy9jTFxcXFx6cnM3VGl2SnRDezNGKUlsKHhaZlk1UzJlYWpvMTRbbnV5RV1QNlY5a1hwS3dHaHFBVWJPZDgjSFJEQjAkbWdNVyZRJU5AXCI7XHJcblxyXG4gICAgICAgIC8vIFVzZSBvcHRpb25zLlxyXG4gICAgICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgZm9udCA9IDxzdHJpbmc+b3B0aW9ucztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvbnQgPSAoPElBc2NpaUFydFBvc3RQcm9jZXNzT3B0aW9ucz5vcHRpb25zKS5mb250IHx8IGZvbnQ7XHJcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXJTZXQgPSAoPElBc2NpaUFydFBvc3RQcm9jZXNzT3B0aW9ucz5vcHRpb25zKS5jaGFyYWN0ZXJTZXQgfHwgY2hhcmFjdGVyU2V0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5taXhUb1RpbGUgPSAoPElBc2NpaUFydFBvc3RQcm9jZXNzT3B0aW9ucz5vcHRpb25zKS5taXhUb1RpbGUgfHwgdGhpcy5taXhUb1RpbGU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1peFRvTm9ybWFsID0gKDxJQXNjaWlBcnRQb3N0UHJvY2Vzc09wdGlvbnM+b3B0aW9ucykubWl4VG9Ob3JtYWwgfHwgdGhpcy5taXhUb05vcm1hbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc2NlbmUgPSBjYW1lcmE/LmdldFNjZW5lKCkgfHwgdGhpcy5fc2NlbmU7XHJcbiAgICAgICAgdGhpcy5fYXNjaWlBcnRGb250VGV4dHVyZSA9IG5ldyBBc2NpaUFydEZvbnRUZXh0dXJlKG5hbWUsIGZvbnQsIGNoYXJhY3RlclNldCwgc2NlbmUpO1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmVTaXplID0gdGhpcy5fYXNjaWlBcnRGb250VGV4dHVyZS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAgIHRoaXMub25BcHBseSA9IChlZmZlY3Q6IEVmZmVjdCkgPT4ge1xyXG4gICAgICAgICAgICBlZmZlY3Quc2V0VGV4dHVyZShcImFzY2lpQXJ0Rm9udFwiLCB0aGlzLl9hc2NpaUFydEZvbnRUZXh0dXJlKTtcclxuXHJcbiAgICAgICAgICAgIGVmZmVjdC5zZXRGbG9hdDQoXCJhc2NpaUFydEZvbnRJbmZvc1wiLCB0aGlzLl9hc2NpaUFydEZvbnRUZXh0dXJlLmNoYXJTaXplLCBjaGFyYWN0ZXJTZXQubGVuZ3RoLCB0ZXh0dXJlU2l6ZS53aWR0aCwgdGV4dHVyZVNpemUuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGVmZmVjdC5zZXRGbG9hdDQoXCJhc2NpaUFydE9wdGlvbnNcIiwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIHRoaXMubWl4VG9Ob3JtYWwsIHRoaXMubWl4VG9UaWxlKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcImFzY2lpYXJ0UGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGB2YXJ5aW5nIHZlYzIgdlVWO3VuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmVTYW1wbGVyO3VuaWZvcm0gc2FtcGxlcjJEIGFzY2lpQXJ0Rm9udDt1bmlmb3JtIHZlYzQgYXNjaWlBcnRGb250SW5mb3M7dW5pZm9ybSB2ZWM0IGFzY2lpQXJ0T3B0aW9ucztmbG9hdCBnZXRMdW1pbmFuY2UodmVjMyBjb2xvcilcbntyZXR1cm4gY2xhbXAoZG90KGNvbG9yLHZlYzMoMC4yMTI2LDAuNzE1MiwwLjA3MjIpKSwwLiwxLik7fVxuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfREVGSU5JVElPTlNcbnZvaWQgbWFpbih2b2lkKSBcbntmbG9hdCBjYXJhY3RlclNpemU9YXNjaWlBcnRGb250SW5mb3MueDtmbG9hdCBudW1DaGFyPWFzY2lpQXJ0Rm9udEluZm9zLnktMS4wO2Zsb2F0IGZvbnR4PWFzY2lpQXJ0Rm9udEluZm9zLno7ZmxvYXQgZm9udHk9YXNjaWlBcnRGb250SW5mb3MudztmbG9hdCBzY3JlZW54PWFzY2lpQXJ0T3B0aW9ucy54O2Zsb2F0IHNjcmVlbnk9YXNjaWlBcnRPcHRpb25zLnk7ZmxvYXQgdGlsZVg9ZmxvYXQoZmxvb3IoKGdsX0ZyYWdDb29yZC54KS9jYXJhY3RlclNpemUpKSpjYXJhY3RlclNpemUvc2NyZWVueDtmbG9hdCB0aWxlWT1mbG9hdChmbG9vcigoZ2xfRnJhZ0Nvb3JkLnkpL2NhcmFjdGVyU2l6ZSkpKmNhcmFjdGVyU2l6ZS9zY3JlZW55O3ZlYzIgdGlsZVVWPXZlYzIodGlsZVgsdGlsZVkpO3ZlYzQgdGlsZUNvbG9yPXRleHR1cmUyRCh0ZXh0dXJlU2FtcGxlcix0aWxlVVYpO3ZlYzQgYmFzZUNvbG9yPXRleHR1cmUyRCh0ZXh0dXJlU2FtcGxlcix2VVYpO2Zsb2F0IHRpbGVMdW1pbmFuY2U9Z2V0THVtaW5hbmNlKHRpbGVDb2xvci5yZ2IpO2Zsb2F0IG9mZnNldHg9KGZsb2F0KGZsb29yKHRpbGVMdW1pbmFuY2UqbnVtQ2hhcikpKSpjYXJhY3RlclNpemUvZm9udHg7ZmxvYXQgb2Zmc2V0eT0wLjA7ZmxvYXQgeD1mbG9hdChtb2QoZ2xfRnJhZ0Nvb3JkLngsY2FyYWN0ZXJTaXplKSkvZm9udHg7ZmxvYXQgeT1mbG9hdChtb2QoZ2xfRnJhZ0Nvb3JkLnksY2FyYWN0ZXJTaXplKSkvZm9udHk7dmVjNCBmaW5hbENvbG9yPSB0ZXh0dXJlMkQoYXNjaWlBcnRGb250LHZlYzIob2Zmc2V0eCt4LG9mZnNldHkrKGNhcmFjdGVyU2l6ZS9mb250eS15KSkpO2ZpbmFsQ29sb3IucmdiKj10aWxlQ29sb3IucmdiO2ZpbmFsQ29sb3IuYT0xLjA7ZmluYWxDb2xvcj0gbWl4KGZpbmFsQ29sb3IsdGlsZUNvbG9yLGFzY2lpQXJ0T3B0aW9ucy53KTtmaW5hbENvbG9yPSBtaXgoZmluYWxDb2xvcixiYXNlQ29sb3IsYXNjaWlBcnRPcHRpb25zLnopO2dsX0ZyYWdDb2xvcj1maW5hbENvbG9yO31gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IGFzY2lpYXJ0UGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiZXhwb3J0ICogZnJvbSBcIi4vYXNjaWlBcnRQb3N0UHJvY2Vzc1wiO1xyXG4iLCJpbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuaW1wb3J0IHsgc2VyaWFsaXplIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzXCI7XHJcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25IZWxwZXIgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnMuc2VyaWFsaXphdGlvblwiO1xyXG5pbXBvcnQgeyBNYXRyaXggfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLnZlY3RvclwiO1xyXG5pbXBvcnQgdHlwZSB7IENhbWVyYSB9IGZyb20gXCJjb3JlL0NhbWVyYXMvY2FtZXJhXCI7XHJcbmltcG9ydCB7IEJhc2VUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL2Jhc2VUZXh0dXJlXCI7XHJcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IEVmZmVjdCB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9lZmZlY3RcIjtcclxuaW1wb3J0IHsgUG9zdFByb2Nlc3MgfSBmcm9tIFwiY29yZS9Qb3N0UHJvY2Vzc2VzL3Bvc3RQcm9jZXNzXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgXCJjb3JlL0VuZ2luZXMvRXh0ZW5zaW9ucy9lbmdpbmUuZHluYW1pY1RleHR1cmVcIjtcclxuaW1wb3J0IFwiLi9kaWdpdGFscmFpbi5mcmFnbWVudFwiO1xyXG5cclxuLyoqXHJcbiAqIERpZ2l0YWxSYWluRm9udFRleHR1cmUgaXMgdGhlIGhlbHBlciBjbGFzcyB1c2VkIHRvIGVhc2lseSBjcmVhdGUgeW91ciBkaWdpdGFsIHJhaW4gZm9udCB0ZXh0dXJlLlxyXG4gKlxyXG4gKiBJdCBiYXNpY2FsbHkgdGFrZXMgY2FyZSByZW5kZXJpbmcgdGhlIGZvbnQgZnJvbnQgdGhlIGdpdmVuIGZvbnQgc2l6ZSB0byBhIHRleHR1cmUuXHJcbiAqIFRoaXMgaXMgdXNlZCBsYXRlciBvbiBpbiB0aGUgcG9zdHByb2Nlc3MuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGlnaXRhbFJhaW5Gb250VGV4dHVyZSBleHRlbmRzIEJhc2VUZXh0dXJlIHtcclxuICAgIEBzZXJpYWxpemUoXCJmb250XCIpXHJcbiAgICBwcml2YXRlIF9mb250OiBzdHJpbmc7XHJcblxyXG4gICAgQHNlcmlhbGl6ZShcInRleHRcIilcclxuICAgIHByaXZhdGUgX3RleHQ6IHN0cmluZztcclxuXHJcbiAgICBwcml2YXRlIF9jaGFyU2l6ZTogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiBvbmUgY2hhciBpbiB0aGUgdGV4dHVyZSAoZWFjaCBjaGFyIGZpdHMgaW4gc2l6ZSAqIHNpemUgc3BhY2UgaW4gdGhlIHRleHR1cmUpLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNoYXJTaXplKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoYXJTaXplO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBEaWdpdGFsIFJhaW4gRm9udFRleHR1cmUgY2xhc3NcclxuICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlXHJcbiAgICAgKiBAcGFyYW0gZm9udCB0aGUgZm9udCB0byB1c2UsIHVzZSB0aGUgVzNDIENTUyBub3RhdGlvblxyXG4gICAgICogQHBhcmFtIHRleHQgdGhlIGNhcmFjdGVyIHNldCB0byB1c2UgaW4gdGhlIHJlbmRlcmluZy5cclxuICAgICAqIEBwYXJhbSBzY2VuZSB0aGUgc2NlbmUgdGhhdCBvd25zIHRoZSB0ZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgZm9udDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsKSB7XHJcbiAgICAgICAgc3VwZXIoc2NlbmUpO1xyXG5cclxuICAgICAgICBzY2VuZSA9IHRoaXMuZ2V0U2NlbmUoKTtcclxuXHJcbiAgICAgICAgaWYgKCFzY2VuZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMuX3RleHQgPT0gdGV4dDtcclxuICAgICAgICB0aGlzLl9mb250ID09IGZvbnQ7XHJcblxyXG4gICAgICAgIHRoaXMud3JhcFUgPSBUZXh0dXJlLkNMQU1QX0FERFJFU1NNT0RFO1xyXG4gICAgICAgIHRoaXMud3JhcFYgPSBUZXh0dXJlLkNMQU1QX0FERFJFU1NNT0RFO1xyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIGZvbnQgc3BlY2lmaWMgaW5mby5cclxuICAgICAgICBjb25zdCBtYXhDaGFySGVpZ2h0ID0gdGhpcy5fZ2V0Rm9udEhlaWdodChmb250KTtcclxuICAgICAgICBjb25zdCBtYXhDaGFyV2lkdGggPSB0aGlzLl9nZXRGb250V2lkdGgoZm9udCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NoYXJTaXplID0gTWF0aC5tYXgobWF4Q2hhckhlaWdodC5oZWlnaHQsIG1heENoYXJXaWR0aCk7XHJcblxyXG4gICAgICAgIC8vIFRoaXMgaXMgYW4gYXBwcm94aW1hdGUgc2l6ZSwgYnV0IHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBmaXQgYXQgbGVhc3QgdGhlIG1heENoYXJDb3VudC5cclxuICAgICAgICBjb25zdCB0ZXh0dXJlV2lkdGggPSB0aGlzLl9jaGFyU2l6ZTtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlSGVpZ2h0ID0gTWF0aC5jZWlsKHRoaXMuX2NoYXJTaXplICogdGV4dC5sZW5ndGgpO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgdGhlIHRleHR1cmUgdGhhdCB3aWxsIHN0b3JlIHRoZSBmb250IGNoYXJhY3RlcnMuXHJcbiAgICAgICAgdGhpcy5fdGV4dHVyZSA9IHNjZW5lLmdldEVuZ2luZSgpLmNyZWF0ZUR5bmFtaWNUZXh0dXJlKHRleHR1cmVXaWR0aCwgdGV4dHVyZUhlaWdodCwgZmFsc2UsIFRleHR1cmUuTkVBUkVTVF9TQU1QTElOR01PREUpO1xyXG4gICAgICAgIC8vc2NlbmUuZ2V0RW5naW5lKCkuc2V0Y2xhbXBcclxuICAgICAgICBjb25zdCB0ZXh0dXJlU2l6ZSA9IHRoaXMuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgYSBjYW52YXMgd2l0aCB0aGUgZmluYWwgc2l6ZTogdGhlIG9uZSBtYXRjaGluZyB0aGUgdGV4dHVyZS5cclxuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHRleHR1cmVTaXplLndpZHRoO1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSB0ZXh0dXJlU2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+Y2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9IFwidG9wXCI7XHJcbiAgICAgICAgY29udGV4dC5mb250ID0gZm9udDtcclxuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IFwid2hpdGVcIjtcclxuICAgICAgICBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBTZXRzIHRoZSB0ZXh0IGluIHRoZSB0ZXh0dXJlLlxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb250ZXh0LmZpbGxUZXh0KHRleHRbaV0sIDAsIGkgKiB0aGlzLl9jaGFyU2l6ZSAtIG1heENoYXJIZWlnaHQub2Zmc2V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEZsdXNoIHRoZSB0ZXh0IGluIHRoZSBkeW5hbWljIHRleHR1cmUuXHJcbiAgICAgICAgc2NlbmUuZ2V0RW5naW5lKCkudXBkYXRlRHluYW1pY1RleHR1cmUodGhpcy5fdGV4dHVyZSwgY2FudmFzLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBtYXggY2hhciB3aWR0aCBvZiBhIGZvbnQuXHJcbiAgICAgKiBAcGFyYW0gZm9udCB0aGUgZm9udCB0byB1c2UsIHVzZSB0aGUgVzNDIENTUyBub3RhdGlvblxyXG4gICAgICogQHJldHVybnMgdGhlIG1heCBjaGFyIHdpZHRoXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2dldEZvbnRXaWR0aChmb250OiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IGZvbnREcmF3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgICAgICBjb25zdCBjdHggPSA8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPmZvbnREcmF3LmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgICBjdHguZmlsbFN0eWxlID0gXCJ3aGl0ZVwiO1xyXG4gICAgICAgIGN0eC5mb250ID0gZm9udDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGN0eC5tZWFzdXJlVGV4dChcIldcIikud2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTW9yZSBpbmZvIGhlcmU6IGh0dHBzOi8vdmlkZWxhaXMuY29tLzIwMTQvMDMvMTYvdGhlLW1hbnktYW5kLXZhcmllZC1wcm9ibGVtcy13aXRoLW1lYXN1cmluZy1mb250LWhlaWdodC1mb3ItaHRtbDUtY2FudmFzL1xyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBtYXggY2hhciBoZWlnaHQgb2YgYSBmb250LlxyXG4gICAgICogQHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8gdXNlLCB1c2UgdGhlIFczQyBDU1Mgbm90YXRpb25cclxuICAgICAqIEByZXR1cm5zIHRoZSBtYXggY2hhciBoZWlnaHRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZ2V0Rm9udEhlaWdodChmb250OiBzdHJpbmcpOiB7IGhlaWdodDogbnVtYmVyOyBvZmZzZXQ6IG51bWJlciB9IHtcclxuICAgICAgICBjb25zdCBmb250RHJhdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XHJcbiAgICAgICAgY29uc3QgY3R4ID0gPENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD5mb250RHJhdy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGZvbnREcmF3LndpZHRoLCBmb250RHJhdy5oZWlnaHQpO1xyXG4gICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSBcInRvcFwiO1xyXG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBcIndoaXRlXCI7XHJcbiAgICAgICAgY3R4LmZvbnQgPSBmb250O1xyXG4gICAgICAgIGN0eC5maWxsVGV4dChcImpIfFwiLCAwLCAwKTtcclxuICAgICAgICBjb25zdCBwaXhlbHMgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGZvbnREcmF3LndpZHRoLCBmb250RHJhdy5oZWlnaHQpLmRhdGE7XHJcbiAgICAgICAgbGV0IHN0YXJ0ID0gLTE7XHJcbiAgICAgICAgbGV0IGVuZCA9IC0xO1xyXG4gICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGZvbnREcmF3LmhlaWdodDsgcm93KyspIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uID0gMDsgY29sdW1uIDwgZm9udERyYXcud2lkdGg7IGNvbHVtbisrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IChyb3cgKiBmb250RHJhdy53aWR0aCArIGNvbHVtbikgKiA0O1xyXG4gICAgICAgICAgICAgICAgaWYgKHBpeGVsc1tpbmRleF0gPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uID09PSBmb250RHJhdy53aWR0aCAtIDEgJiYgc3RhcnQgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IHJvdztcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93ID0gZm9udERyYXcuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSByb3c7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IGhlaWdodDogZW5kIC0gc3RhcnQgKyAxLCBvZmZzZXQ6IHN0YXJ0IC0gMSB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xvbmVzIHRoZSBjdXJyZW50IERpZ2l0YWxSYWluRm9udFRleHR1cmUuXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY2xvbmUgb2YgdGhlIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBjbG9uZSgpOiBEaWdpdGFsUmFpbkZvbnRUZXh0dXJlIHtcclxuICAgICAgICByZXR1cm4gbmV3IERpZ2l0YWxSYWluRm9udFRleHR1cmUodGhpcy5uYW1lLCB0aGlzLl9mb250LCB0aGlzLl90ZXh0LCB0aGlzLmdldFNjZW5lKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2VzIGEganNvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0ZXh0dXJlIGFuZCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIGl0LlxyXG4gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIEpTT04gcmVwcmVzZW50YXRpb25cclxuICAgICAqIEBwYXJhbSBzY2VuZSB0aGUgc2NlbmUgdG8gY3JlYXRlIHRoZSB0ZXh0dXJlIGZvclxyXG4gICAgICogQHJldHVybnMgdGhlIHBhcnNlZCB0ZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUGFyc2Uoc291cmNlOiBhbnksIHNjZW5lOiBTY2VuZSk6IERpZ2l0YWxSYWluRm9udFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBTZXJpYWxpemF0aW9uSGVscGVyLlBhcnNlKCgpID0+IG5ldyBEaWdpdGFsUmFpbkZvbnRUZXh0dXJlKHNvdXJjZS5uYW1lLCBzb3VyY2UuZm9udCwgc291cmNlLnRleHQsIHNjZW5lKSwgc291cmNlLCBzY2VuZSwgbnVsbCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogT3B0aW9uIGF2YWlsYWJsZSBpbiB0aGUgRGlnaXRhbCBSYWluIFBvc3QgUHJvY2Vzcy5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURpZ2l0YWxSYWluUG9zdFByb2Nlc3NPcHRpb25zIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZvbnQgdG8gdXNlIGZvbGxvd2luZyB0aGUgdzNjIGZvbnQgZGVmaW5pdGlvbi5cclxuICAgICAqL1xyXG4gICAgZm9udD86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgYW1vdW50IHlvdSB3YW50IHRvIG1peCB0aGUgXCJ0aWxlXCIgb3IgY2FyYWN0ZXIgc3BhY2UgY29sb3JlZCBpbiB0aGUgZGlnaXRhbCByYWluLlxyXG4gICAgICogVGhpcyBudW1iZXIgaXMgZGVmaW5lZCBiZXR3ZWVuIDAgYW5kIDE7XHJcbiAgICAgKi9cclxuICAgIG1peFRvVGlsZT86IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgYW1vdW50IHlvdSB3YW50IHRvIG1peCB0aGUgbm9ybWFsIHJlbmRlcmluZyBwYXNzIGluIHRoZSBkaWdpdGFsIHJhaW4uXHJcbiAgICAgKiBUaGlzIG51bWJlciBpcyBkZWZpbmVkIGJldHdlZW4gMCBhbmQgMTtcclxuICAgICAqL1xyXG4gICAgbWl4VG9Ob3JtYWw/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEaWdpdGFsUmFpblBvc3RQcm9jZXNzIGhlbHBzIHJlbmRlcmluZyBldmVyaXRoaW5nIGluIGRpZ2l0YWwgcmFpbi5cclxuICpcclxuICogU2ltbXBseSBhZGQgaXQgdG8geW91ciBzY2VuZSBhbmQgbGV0IHRoZSBuZXJkIHRoYXQgbGl2ZXMgaW4geW91IGhhdmUgZnVuLlxyXG4gKiBFeGFtcGxlIHVzYWdlOiB2YXIgcHAgPSBuZXcgRGlnaXRhbFJhaW5Qb3N0UHJvY2VzcyhcImRpZ2l0YWxSYWluXCIsIFwiMjBweCBNb25vc3BhY2VcIiwgY2FtZXJhKTtcclxuICovXHJcbmV4cG9ydCBjbGFzcyBEaWdpdGFsUmFpblBvc3RQcm9jZXNzIGV4dGVuZHMgUG9zdFByb2Nlc3Mge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZm9udCB0ZXh0dXJlIHVzZWQgdG8gcmVuZGVyIHRoZSBjaGFyIGluIHRoZSBwb3N0IHByb2Nlc3MuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2RpZ2l0YWxSYWluRm9udFRleHR1cmU6IERpZ2l0YWxSYWluRm9udFRleHR1cmU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGRlZmluZXMgdGhlIGFtb3VudCB5b3Ugd2FudCB0byBtaXggdGhlIFwidGlsZVwiIG9yIGNhcmFjdGVyIHNwYWNlIGNvbG9yZWQgaW4gdGhlIGRpZ2l0YWwgcmFpbi5cclxuICAgICAqIFRoaXMgbnVtYmVyIGlzIGRlZmluZWQgYmV0d2VlbiAwIGFuZCAxO1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWl4VG9UaWxlOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBkZWZpbmVzIHRoZSBhbW91bnQgeW91IHdhbnQgdG8gbWl4IHRoZSBub3JtYWwgcmVuZGVyaW5nIHBhc3MgaW4gdGhlIGRpZ2l0YWwgcmFpbi5cclxuICAgICAqIFRoaXMgbnVtYmVyIGlzIGRlZmluZWQgYmV0d2VlbiAwIGFuZCAxO1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWl4VG9Ob3JtYWw6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVlZCBvZiB0aGUgZWZmZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzcGVlZDogbnVtYmVyID0gMC4wMDM7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgRGlnaXRhbCBSYWluIFBvc3QgUHJvY2Vzcy5cclxuICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGdpdmUgdG8gdGhlIHBvc3Rwcm9jZXNzXHJcbiAgICAgKiBAY2FtZXJhIHRoZSBjYW1lcmEgdG8gYXBwbHkgdGhlIHBvc3QgcHJvY2VzcyB0by5cclxuICAgICAqIEBwYXJhbSBjYW1lcmFcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIGNhbiBlaXRoZXIgYmUgdGhlIGZvbnQgbmFtZSBvciBhbiBvcHRpb24gb2JqZWN0IGZvbGxvd2luZyB0aGUgSURpZ2l0YWxSYWluUG9zdFByb2Nlc3NPcHRpb25zIGZvcm1hdFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGNhbWVyYTogTnVsbGFibGU8Q2FtZXJhPiwgb3B0aW9ucz86IHN0cmluZyB8IElEaWdpdGFsUmFpblBvc3RQcm9jZXNzT3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKFxyXG4gICAgICAgICAgICBuYW1lLFxyXG4gICAgICAgICAgICBcImRpZ2l0YWxyYWluXCIsXHJcbiAgICAgICAgICAgIFtcImRpZ2l0YWxSYWluRm9udEluZm9zXCIsIFwiZGlnaXRhbFJhaW5PcHRpb25zXCIsIFwiY29zVGltZVplcm9PbmVcIiwgXCJtYXRyaXhTcGVlZFwiXSxcclxuICAgICAgICAgICAgW1wiZGlnaXRhbFJhaW5Gb250XCJdLFxyXG4gICAgICAgICAgICAxLjAsXHJcbiAgICAgICAgICAgIGNhbWVyYSxcclxuICAgICAgICAgICAgVGV4dHVyZS5UUklMSU5FQVJfU0FNUExJTkdNT0RFLFxyXG4gICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBEZWZhdWx0IHZhbHVlcy5cclxuICAgICAgICBsZXQgZm9udCA9IFwiMTVweCBNb25vc3BhY2VcIjtcclxuICAgICAgICBjb25zdCBjaGFyYWN0ZXJTZXQgPVxyXG4gICAgICAgICAgICBcIuWPpOaxoOOChOibmemjm+OBs+i+vOOCgOawtOOBrumfs+OBteOCi+OBhOOBkeOChOOBi+OCj+OBmuOBqOOBs+OBk+OCgOOBv+OBmuOBruOBiuOBqOWIneOBl+OBkOOCjOeMv+OCguWwj+iTkeOCkuOBu+OBl+OBkuS5n+OBr+OBpOOBl+OBkOOCjOOBleOCi+OCguOBk+OBv+OBruOCkuOBu+OBl+OBkuOBquOCiuaxn+aIuOOBrumbqOS9leefs+WRkeOCk+OBoOaZgumzpeOBiOOBqeOBruOBguOCgeOBquOCk+OBlOOBj+OBruOCk+OBoOOBu+OBqOOBqOOBjuOBmVwiO1xyXG5cclxuICAgICAgICAvLyBVc2Ugb3B0aW9ucy5cclxuICAgICAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIGZvbnQgPSA8c3RyaW5nPm9wdGlvbnM7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb250ID0gKDxJRGlnaXRhbFJhaW5Qb3N0UHJvY2Vzc09wdGlvbnM+b3B0aW9ucykuZm9udCB8fCBmb250O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5taXhUb1RpbGUgPSAoPElEaWdpdGFsUmFpblBvc3RQcm9jZXNzT3B0aW9ucz5vcHRpb25zKS5taXhUb1RpbGUgfHwgdGhpcy5taXhUb1RpbGU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1peFRvTm9ybWFsID0gKDxJRGlnaXRhbFJhaW5Qb3N0UHJvY2Vzc09wdGlvbnM+b3B0aW9ucykubWl4VG9Ob3JtYWwgfHwgdGhpcy5taXhUb05vcm1hbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc2NlbmUgPSBjYW1lcmE/LmdldFNjZW5lKCkgfHwgbnVsbDtcclxuICAgICAgICB0aGlzLl9kaWdpdGFsUmFpbkZvbnRUZXh0dXJlID0gbmV3IERpZ2l0YWxSYWluRm9udFRleHR1cmUobmFtZSwgZm9udCwgY2hhcmFjdGVyU2V0LCBzY2VuZSk7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZVNpemUgPSB0aGlzLl9kaWdpdGFsUmFpbkZvbnRUZXh0dXJlLmdldFNpemUoKTtcclxuXHJcbiAgICAgICAgbGV0IGFscGhhID0gMC4wO1xyXG4gICAgICAgIGxldCBjb3NUaW1lWmVyb09uZSA9IDAuMDtcclxuICAgICAgICBjb25zdCBtYXRyaXggPSBNYXRyaXguRnJvbVZhbHVlcyhcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSxcclxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMub25BcHBseSA9IChlZmZlY3Q6IEVmZmVjdCkgPT4ge1xyXG4gICAgICAgICAgICBlZmZlY3Quc2V0VGV4dHVyZShcImRpZ2l0YWxSYWluRm9udFwiLCB0aGlzLl9kaWdpdGFsUmFpbkZvbnRUZXh0dXJlKTtcclxuXHJcbiAgICAgICAgICAgIGVmZmVjdC5zZXRGbG9hdDQoXCJkaWdpdGFsUmFpbkZvbnRJbmZvc1wiLCB0aGlzLl9kaWdpdGFsUmFpbkZvbnRUZXh0dXJlLmNoYXJTaXplLCBjaGFyYWN0ZXJTZXQubGVuZ3RoLCB0ZXh0dXJlU2l6ZS53aWR0aCwgdGV4dHVyZVNpemUuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGVmZmVjdC5zZXRGbG9hdDQoXCJkaWdpdGFsUmFpbk9wdGlvbnNcIiwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIHRoaXMubWl4VG9Ob3JtYWwsIHRoaXMubWl4VG9UaWxlKTtcclxuXHJcbiAgICAgICAgICAgIGVmZmVjdC5zZXRNYXRyaXgoXCJtYXRyaXhTcGVlZFwiLCBtYXRyaXgpO1xyXG5cclxuICAgICAgICAgICAgYWxwaGEgKz0gdGhpcy5zcGVlZDtcclxuICAgICAgICAgICAgY29zVGltZVplcm9PbmUgPSBhbHBoYTtcclxuICAgICAgICAgICAgZWZmZWN0LnNldEZsb2F0KFwiY29zVGltZVplcm9PbmVcIiwgY29zVGltZVplcm9PbmUpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwiZGlnaXRhbHJhaW5QaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHZhcnlpbmcgdmVjMiB2VVY7dW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZVNhbXBsZXI7dW5pZm9ybSBzYW1wbGVyMkQgZGlnaXRhbFJhaW5Gb250O3VuaWZvcm0gdmVjNCBkaWdpdGFsUmFpbkZvbnRJbmZvczt1bmlmb3JtIHZlYzQgZGlnaXRhbFJhaW5PcHRpb25zO3VuaWZvcm0gbWF0NCBtYXRyaXhTcGVlZDt1bmlmb3JtIGZsb2F0IGNvc1RpbWVaZXJvT25lO2Zsb2F0IGdldEx1bWluYW5jZSh2ZWMzIGNvbG9yKVxue3JldHVybiBjbGFtcChkb3QoY29sb3IsdmVjMygwLjIxMjYsMC43MTUyLDAuMDcyMikpLDAuLDEuKTt9XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9ERUZJTklUSU9OU1xudm9pZCBtYWluKHZvaWQpIFxue2Zsb2F0IGNhcmFjdGVyU2l6ZT1kaWdpdGFsUmFpbkZvbnRJbmZvcy54O2Zsb2F0IG51bUNoYXI9ZGlnaXRhbFJhaW5Gb250SW5mb3MueS0xLjA7ZmxvYXQgZm9udHg9ZGlnaXRhbFJhaW5Gb250SW5mb3MuejtmbG9hdCBmb250eT1kaWdpdGFsUmFpbkZvbnRJbmZvcy53O2Zsb2F0IHNjcmVlbng9ZGlnaXRhbFJhaW5PcHRpb25zLng7ZmxvYXQgc2NyZWVueT1kaWdpdGFsUmFpbk9wdGlvbnMueTtmbG9hdCByYXRpbz1zY3JlZW55L2ZvbnR5O2Zsb2F0IGNvbHVtbng9ZmxvYXQoZmxvb3IoKGdsX0ZyYWdDb29yZC54KS9jYXJhY3RlclNpemUpKTtmbG9hdCB0aWxlWD1mbG9hdChmbG9vcigoZ2xfRnJhZ0Nvb3JkLngpL2NhcmFjdGVyU2l6ZSkpKmNhcmFjdGVyU2l6ZS9zY3JlZW54O2Zsb2F0IHRpbGVZPWZsb2F0KGZsb29yKChnbF9GcmFnQ29vcmQueSkvY2FyYWN0ZXJTaXplKSkqY2FyYWN0ZXJTaXplL3NjcmVlbnk7dmVjMiB0aWxlVVY9dmVjMih0aWxlWCx0aWxlWSk7dmVjNCB0aWxlQ29sb3I9dGV4dHVyZTJEKHRleHR1cmVTYW1wbGVyLHRpbGVVVik7dmVjNCBiYXNlQ29sb3I9dGV4dHVyZTJEKHRleHR1cmVTYW1wbGVyLHZVVik7ZmxvYXQgdGlsZUx1bWluYW5jZT1nZXRMdW1pbmFuY2UodGlsZUNvbG9yLnJnYik7aW50IHN0PWludChtb2QoY29sdW1ueCw0LjApKTtmbG9hdCBzcGVlZD1jb3NUaW1lWmVyb09uZSooc2luKHRpbGVYKjMxNC41KSowLjUrMC42KTsgXG5mbG9hdCB4PWZsb2F0KG1vZChnbF9GcmFnQ29vcmQueCxjYXJhY3RlclNpemUpKS9mb250eDtmbG9hdCB5PWZsb2F0KG1vZChzcGVlZCtnbF9GcmFnQ29vcmQueS9zY3JlZW55LDEuMCkpO3kqPXJhdGlvO3ZlYzQgZmluYWxDb2xvcj0gdGV4dHVyZTJEKGRpZ2l0YWxSYWluRm9udCx2ZWMyKHgsMS4wLXkpKTt2ZWMzIGhpZ2g9ZmluYWxDb2xvci5yZ2IqKHZlYzMoMS4yLDEuMiwxLjIpKnBvdygxLjAteSwzMC4wKSk7ZmluYWxDb2xvci5yZ2IqPXZlYzMocG93KHRpbGVMdW1pbmFuY2UsNS4wKSxwb3codGlsZUx1bWluYW5jZSwxLjUpLHBvdyh0aWxlTHVtaW5hbmNlLDMuMCkpO2ZpbmFsQ29sb3IucmdiKz1oaWdoO2ZpbmFsQ29sb3IucmdiPWNsYW1wKGZpbmFsQ29sb3IucmdiLDAuLDEuKTtmaW5hbENvbG9yLmE9MS4wO2ZpbmFsQ29sb3I9IG1peChmaW5hbENvbG9yLHRpbGVDb2xvcixkaWdpdGFsUmFpbk9wdGlvbnMudyk7ZmluYWxDb2xvcj0gbWl4KGZpbmFsQ29sb3IsYmFzZUNvbG9yLGRpZ2l0YWxSYWluT3B0aW9ucy56KTtnbF9GcmFnQ29sb3I9ZmluYWxDb2xvcjt9YDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBkaWdpdGFscmFpblBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImV4cG9ydCAqIGZyb20gXCIuL2RpZ2l0YWxSYWluUG9zdFByb2Nlc3NcIjtcclxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgKi9cclxuZXhwb3J0ICogZnJvbSBcIi4vYXNjaWlBcnQvaW5kZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vZGlnaXRhbFJhaW4vaW5kZXhcIjtcclxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgKi9cclxuaW1wb3J0ICogYXMgcG9zdFByb2Nlc3NMaWJyYXJ5IGZyb20gXCJwb3N0LXByb2Nlc3Nlcy9pbmRleFwiO1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgVU1EIG1vZHVsZS5cclxuICogVGhlIGVudHJ5IHBvaW50IGZvciBhIGZ1dHVyZSBFU00gcGFja2FnZSBzaG91bGQgYmUgaW5kZXgudHNcclxuICovXHJcbmNvbnN0IGdsb2JhbE9iamVjdCA9IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdW5kZWZpbmVkO1xyXG5pZiAodHlwZW9mIGdsb2JhbE9iamVjdCAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gcG9zdFByb2Nlc3NMaWJyYXJ5KSB7XHJcbiAgICAgICAgKDxhbnk+Z2xvYmFsT2JqZWN0KS5CQUJZTE9OW2tleV0gPSAoPGFueT5wb3N0UHJvY2Vzc0xpYnJhcnkpW2tleV07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCAqIGZyb20gXCJwb3N0LXByb2Nlc3Nlcy9pbmRleFwiO1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYmFieWxvbmpzX01pc2NfZGVjb3JhdG9yc19fOyIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCAqL1xuXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcbiAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xuICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHQ7XG4gIH1cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgIH1cbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICB9XG4gIH1cbiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICBkb25lID0gdHJ1ZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICB9XG4gIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcbiAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XG4gIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XG4gIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgdHJ5IHtcbiAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICB9XG4gIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcbiAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgIHJba10gPSBhW2pdO1xuICByZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcbiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICBmYWlsKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG5leHQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBfX2V4dGVuZHMsXG4gIF9fYXNzaWduLFxuICBfX3Jlc3QsXG4gIF9fZGVjb3JhdGUsXG4gIF9fcGFyYW0sXG4gIF9fbWV0YWRhdGEsXG4gIF9fYXdhaXRlcixcbiAgX19nZW5lcmF0b3IsXG4gIF9fY3JlYXRlQmluZGluZyxcbiAgX19leHBvcnRTdGFyLFxuICBfX3ZhbHVlcyxcbiAgX19yZWFkLFxuICBfX3NwcmVhZCxcbiAgX19zcHJlYWRBcnJheXMsXG4gIF9fc3ByZWFkQXJyYXksXG4gIF9fYXdhaXQsXG4gIF9fYXN5bmNHZW5lcmF0b3IsXG4gIF9fYXN5bmNEZWxlZ2F0b3IsXG4gIF9fYXN5bmNWYWx1ZXMsXG4gIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxuICBfX2ltcG9ydFN0YXIsXG4gIF9faW1wb3J0RGVmYXVsdCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxuICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcbiAgX19kaXNwb3NlUmVzb3VyY2VzLFxufTtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCAqIGFzIHBvc3RQcm9jZXNzIGZyb20gXCJAbHRzL3Bvc3QtcHJvY2Vzc2VzL2xlZ2FjeS9sZWdhY3lcIjtcclxuZXhwb3J0IHsgcG9zdFByb2Nlc3MgfTtcclxuZXhwb3J0IGRlZmF1bHQgcG9zdFByb2Nlc3M7XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
|
1139
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbmpzLnBvc3RQcm9jZXNzLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVEE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7QUFLQTtBQUNBO0FBQUE7QUFnQkE7Ozs7OztBQU1BO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFFQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7O0FBQ0E7QUE3REE7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUE2REE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUEvSUE7QUFEQTtBQUNBO0FBR0E7QUFEQTtBQUNBO0FBNklBO0FBQUE7QUE2QkE7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBa0JBOzs7Ozs7QUFNQTtBQUNBO0FBQUE7QUFuQkE7OztBQUdBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQVlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvUEE7QUFDQTtBQUVBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNaQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBOzs7OztBQUtBO0FBQ0E7QUFBQTtBQWdCQTs7Ozs7O0FBTUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUVBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBQ0E7QUEzREE7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUEyREE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUE3SUE7QUFEQTtBQUNBO0FBR0E7QUFEQTtBQUNBO0FBMklBO0FBQUE7QUF3QkE7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBdUJBOzs7Ozs7QUFNQTtBQUNBO0FBQUE7QUF4QkE7OztBQUdBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFzQkE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQW1CQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuU0E7QUFDQTtBQUVBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQ2ZBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUN6WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBOzs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL1BPU1RQUk9DRVNTRVMvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1BPU1RQUk9DRVNTRVMvLi4vLi4vLi4vZGV2L3Bvc3RQcm9jZXNzZXMvc3JjL2FzY2lpQXJ0L2FzY2lpQXJ0UG9zdFByb2Nlc3MudHMiLCJ3ZWJwYWNrOi8vUE9TVFBST0NFU1NFUy8uLi8uLi8uLi9kZXYvcG9zdFByb2Nlc3Nlcy9zcmMvYXNjaWlBcnQvYXNjaWlhcnQuZnJhZ21lbnQudHMiLCJ3ZWJwYWNrOi8vUE9TVFBST0NFU1NFUy8uLi8uLi8uLi9kZXYvcG9zdFByb2Nlc3Nlcy9zcmMvYXNjaWlBcnQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUE9TVFBST0NFU1NFUy8uLi8uLi8uLi9kZXYvcG9zdFByb2Nlc3Nlcy9zcmMvZGlnaXRhbFJhaW4vZGlnaXRhbFJhaW5Qb3N0UHJvY2Vzcy50cyIsIndlYnBhY2s6Ly9QT1NUUFJPQ0VTU0VTLy4uLy4uLy4uL2Rldi9wb3N0UHJvY2Vzc2VzL3NyYy9kaWdpdGFsUmFpbi9kaWdpdGFscmFpbi5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QT1NUUFJPQ0VTU0VTLy4uLy4uLy4uL2Rldi9wb3N0UHJvY2Vzc2VzL3NyYy9kaWdpdGFsUmFpbi9pbmRleC50cyIsIndlYnBhY2s6Ly9QT1NUUFJPQ0VTU0VTLy4uLy4uLy4uL2Rldi9wb3N0UHJvY2Vzc2VzL3NyYy9pbmRleC50cyIsIndlYnBhY2s6Ly9QT1NUUFJPQ0VTU0VTLy4uLy4uLy4uL2x0cy9wb3N0UHJvY2Vzc2VzL3NyYy9sZWdhY3kvbGVnYWN5LnRzIiwid2VicGFjazovL1BPU1RQUk9DRVNTRVMvZXh0ZXJuYWwgdW1kIHtcInJvb3RcIjpcIkJBQllMT05cIixcImNvbW1vbmpzXCI6XCJiYWJ5bG9uanNcIixcImNvbW1vbmpzMlwiOlwiYmFieWxvbmpzXCIsXCJhbWRcIjpcImJhYnlsb25qc1wifSIsIndlYnBhY2s6Ly9QT1NUUFJPQ0VTU0VTLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwid2VicGFjazovL1BPU1RQUk9DRVNTRVMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vUE9TVFBST0NFU1NFUy93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9QT1NUUFJPQ0VTU0VTL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9QT1NUUFJPQ0VTU0VTL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vUE9TVFBST0NFU1NFUy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL1BPU1RQUk9DRVNTRVMvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9QT1NUUFJPQ0VTU0VTLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImJhYnlsb25qc1wiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcImJhYnlsb25qcy1wb3N0LXByb2Nlc3NcIiwgW1wiYmFieWxvbmpzXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImJhYnlsb25qcy1wb3N0LXByb2Nlc3NcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJiYWJ5bG9uanNcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlBPU1RQUk9DRVNTRVNcIl0gPSBmYWN0b3J5KHJvb3RbXCJCQUJZTE9OXCJdKTtcbn0pKCh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdGhpcyksIChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NaXNjX2RlY29yYXRvcnNfXykgPT4ge1xucmV0dXJuICIsImltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5pbXBvcnQgeyBzZXJpYWxpemUgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB0eXBlIHsgQ2FtZXJhIH0gZnJvbSBcImNvcmUvQ2FtZXJhcy9jYW1lcmFcIjtcclxuaW1wb3J0IHsgQmFzZVRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvYmFzZVRleHR1cmVcIjtcclxuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB0eXBlIHsgRWZmZWN0IH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL2VmZmVjdFwiO1xyXG5pbXBvcnQgeyBQb3N0UHJvY2VzcyB9IGZyb20gXCJjb3JlL1Bvc3RQcm9jZXNzZXMvcG9zdFByb2Nlc3NcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCBcImNvcmUvRW5naW5lcy9FeHRlbnNpb25zL2VuZ2luZS5keW5hbWljVGV4dHVyZVwiO1xyXG5pbXBvcnQgXCIuL2FzY2lpYXJ0LmZyYWdtZW50XCI7XHJcblxyXG4vKipcclxuICogQXNjaWlBcnRGb250VGV4dHVyZSBpcyB0aGUgaGVscGVyIGNsYXNzIHVzZWQgdG8gZWFzaWx5IGNyZWF0ZSB5b3VyIGFzY2lpIGFydCBmb250IHRleHR1cmUuXHJcbiAqXHJcbiAqIEl0IGJhc2ljYWxseSB0YWtlcyBjYXJlIHJlbmRlcmluZyB0aGUgZm9udCBmcm9udCB0aGUgZ2l2ZW4gZm9udCBzaXplIHRvIGEgdGV4dHVyZS5cclxuICogVGhpcyBpcyB1c2VkIGxhdGVyIG9uIGluIHRoZSBwb3N0cHJvY2Vzcy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBBc2NpaUFydEZvbnRUZXh0dXJlIGV4dGVuZHMgQmFzZVRleHR1cmUge1xyXG4gICAgQHNlcmlhbGl6ZShcImZvbnRcIilcclxuICAgIHByaXZhdGUgX2ZvbnQ6IHN0cmluZztcclxuXHJcbiAgICBAc2VyaWFsaXplKFwidGV4dFwiKVxyXG4gICAgcHJpdmF0ZSBfdGV4dDogc3RyaW5nO1xyXG5cclxuICAgIHByaXZhdGUgX2NoYXJTaXplOiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIG9uZSBjaGFyIGluIHRoZSB0ZXh0dXJlIChlYWNoIGNoYXIgZml0cyBpbiBzaXplICogc2l6ZSBzcGFjZSBpbiB0aGUgdGV4dHVyZSkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2hhclNpemUoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2hhclNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEFzY2lpIEFydCBGb250VGV4dHVyZSBjbGFzc1xyXG4gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHRleHR1cmVcclxuICAgICAqIEBwYXJhbSBmb250IHRoZSBmb250IHRvIHVzZSwgdXNlIHRoZSBXM0MgQ1NTIG5vdGF0aW9uXHJcbiAgICAgKiBAcGFyYW0gdGV4dCB0aGUgY2FyYWN0ZXIgc2V0IHRvIHVzZSBpbiB0aGUgcmVuZGVyaW5nLlxyXG4gICAgICogQHBhcmFtIHNjZW5lIHRoZSBzY2VuZSB0aGF0IG93bnMgdGhlIHRleHR1cmVcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBmb250OiBzdHJpbmcsIHRleHQ6IHN0cmluZywgc2NlbmU6IE51bGxhYmxlPFNjZW5lPiA9IG51bGwpIHtcclxuICAgICAgICBzdXBlcihzY2VuZSk7XHJcblxyXG4gICAgICAgIHNjZW5lID0gdGhpcy5nZXRTY2VuZSgpO1xyXG5cclxuICAgICAgICBpZiAoIXNjZW5lKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5fdGV4dCA9PSB0ZXh0O1xyXG4gICAgICAgIHRoaXMuX2ZvbnQgPT0gZm9udDtcclxuXHJcbiAgICAgICAgdGhpcy53cmFwVSA9IFRleHR1cmUuQ0xBTVBfQUREUkVTU01PREU7XHJcbiAgICAgICAgdGhpcy53cmFwViA9IFRleHR1cmUuQ0xBTVBfQUREUkVTU01PREU7XHJcbiAgICAgICAgLy90aGlzLmFuaXNvdHJvcGljRmlsdGVyaW5nTGV2ZWwgPSAxO1xyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIGZvbnQgc3BlY2lmaWMgaW5mby5cclxuICAgICAgICBjb25zdCBtYXhDaGFySGVpZ2h0ID0gdGhpcy5fZ2V0Rm9udEhlaWdodChmb250KTtcclxuICAgICAgICBjb25zdCBtYXhDaGFyV2lkdGggPSB0aGlzLl9nZXRGb250V2lkdGgoZm9udCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NoYXJTaXplID0gTWF0aC5tYXgobWF4Q2hhckhlaWdodC5oZWlnaHQsIG1heENoYXJXaWR0aCk7XHJcblxyXG4gICAgICAgIC8vIFRoaXMgaXMgYW4gYXBwcm94aW1hdGUgc2l6ZSwgYnV0IHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBmaXQgYXQgbGVhc3QgdGhlIG1heENoYXJDb3VudC5cclxuICAgICAgICBjb25zdCB0ZXh0dXJlV2lkdGggPSBNYXRoLmNlaWwodGhpcy5fY2hhclNpemUgKiB0ZXh0Lmxlbmd0aCk7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZUhlaWdodCA9IHRoaXMuX2NoYXJTaXplO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgdGhlIHRleHR1cmUgdGhhdCB3aWxsIHN0b3JlIHRoZSBmb250IGNoYXJhY3RlcnMuXHJcbiAgICAgICAgdGhpcy5fdGV4dHVyZSA9IHNjZW5lLmdldEVuZ2luZSgpLmNyZWF0ZUR5bmFtaWNUZXh0dXJlKHRleHR1cmVXaWR0aCwgdGV4dHVyZUhlaWdodCwgZmFsc2UsIFRleHR1cmUuTkVBUkVTVF9TQU1QTElOR01PREUpO1xyXG4gICAgICAgIC8vc2NlbmUuZ2V0RW5naW5lKCkuc2V0Y2xhbXBcclxuICAgICAgICBjb25zdCB0ZXh0dXJlU2l6ZSA9IHRoaXMuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgYSBjYW52YXMgd2l0aCB0aGUgZmluYWwgc2l6ZTogdGhlIG9uZSBtYXRjaGluZyB0aGUgdGV4dHVyZS5cclxuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHRleHR1cmVTaXplLndpZHRoO1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSB0ZXh0dXJlU2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+Y2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9IFwidG9wXCI7XHJcbiAgICAgICAgY29udGV4dC5mb250ID0gZm9udDtcclxuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IFwid2hpdGVcIjtcclxuICAgICAgICBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBTZXRzIHRoZSB0ZXh0IGluIHRoZSB0ZXh0dXJlLlxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb250ZXh0LmZpbGxUZXh0KHRleHRbaV0sIGkgKiB0aGlzLl9jaGFyU2l6ZSwgLW1heENoYXJIZWlnaHQub2Zmc2V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEZsdXNoIHRoZSB0ZXh0IGluIHRoZSBkeW5hbWljIHRleHR1cmUuXHJcblxyXG4gICAgICAgIHNjZW5lLmdldEVuZ2luZSgpLnVwZGF0ZUR5bmFtaWNUZXh0dXJlKHRoaXMuX3RleHR1cmUsIGNhbnZhcywgZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbWF4IGNoYXIgd2lkdGggb2YgYSBmb250LlxyXG4gICAgICogQHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8gdXNlLCB1c2UgdGhlIFczQyBDU1Mgbm90YXRpb25cclxuICAgICAqIEByZXR1cm5zIHRoZSBtYXggY2hhciB3aWR0aFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9nZXRGb250V2lkdGgoZm9udDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBmb250RHJhdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XHJcbiAgICAgICAgY29uc3QgY3R4ID0gPENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD5mb250RHJhdy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IFwid2hpdGVcIjtcclxuICAgICAgICBjdHguZm9udCA9IGZvbnQ7XHJcblxyXG4gICAgICAgIHJldHVybiBjdHgubWVhc3VyZVRleHQoXCJXXCIpLndpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1vcmUgaW5mbyBoZXJlOiBodHRwczovL3ZpZGVsYWlzLmNvbS8yMDE0LzAzLzE2L3RoZS1tYW55LWFuZC12YXJpZWQtcHJvYmxlbXMtd2l0aC1tZWFzdXJpbmctZm9udC1oZWlnaHQtZm9yLWh0bWw1LWNhbnZhcy9cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbWF4IGNoYXIgaGVpZ2h0IG9mIGEgZm9udC5cclxuICAgICAqIEBwYXJhbSBmb250IHRoZSBmb250IHRvIHVzZSwgdXNlIHRoZSBXM0MgQ1NTIG5vdGF0aW9uXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgbWF4IGNoYXIgaGVpZ2h0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2dldEZvbnRIZWlnaHQoZm9udDogc3RyaW5nKTogeyBoZWlnaHQ6IG51bWJlcjsgb2Zmc2V0OiBudW1iZXIgfSB7XHJcbiAgICAgICAgY29uc3QgZm9udERyYXcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgICAgIGNvbnN0IGN0eCA9IDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+Zm9udERyYXcuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBmb250RHJhdy53aWR0aCwgZm9udERyYXcuaGVpZ2h0KTtcclxuICAgICAgICBjdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcclxuICAgICAgICBjdHguZmlsbFN0eWxlID0gXCJ3aGl0ZVwiO1xyXG4gICAgICAgIGN0eC5mb250ID0gZm9udDtcclxuICAgICAgICBjdHguZmlsbFRleHQoXCJqSHxcIiwgMCwgMCk7XHJcbiAgICAgICAgY29uc3QgcGl4ZWxzID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBmb250RHJhdy53aWR0aCwgZm9udERyYXcuaGVpZ2h0KS5kYXRhO1xyXG4gICAgICAgIGxldCBzdGFydCA9IC0xO1xyXG4gICAgICAgIGxldCBlbmQgPSAtMTtcclxuICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBmb250RHJhdy5oZWlnaHQ7IHJvdysrKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNvbHVtbiA9IDA7IGNvbHVtbiA8IGZvbnREcmF3LndpZHRoOyBjb2x1bW4rKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSAocm93ICogZm9udERyYXcud2lkdGggKyBjb2x1bW4pICogNDtcclxuICAgICAgICAgICAgICAgIGlmIChwaXhlbHNbaW5kZXhdID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbiA9PT0gZm9udERyYXcud2lkdGggLSAxICYmIHN0YXJ0ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSByb3c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA9IGZvbnREcmF3LmhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcm93O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBoZWlnaHQ6IGVuZCAtIHN0YXJ0ICsgMSwgb2Zmc2V0OiBzdGFydCAtIDEgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsb25lcyB0aGUgY3VycmVudCBBc2NpaUFydFRleHR1cmUuXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY2xvbmUgb2YgdGhlIHRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBjbG9uZSgpOiBBc2NpaUFydEZvbnRUZXh0dXJlIHtcclxuICAgICAgICByZXR1cm4gbmV3IEFzY2lpQXJ0Rm9udFRleHR1cmUodGhpcy5uYW1lLCB0aGlzLl9mb250LCB0aGlzLl90ZXh0LCB0aGlzLmdldFNjZW5lKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2VzIGEganNvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0ZXh0dXJlIGFuZCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIGl0LlxyXG4gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIEpTT04gcmVwcmVzZW50YXRpb25cclxuICAgICAqIEBwYXJhbSBzY2VuZSB0aGUgc2NlbmUgdG8gY3JlYXRlIHRoZSB0ZXh0dXJlIGZvclxyXG4gICAgICogQHJldHVybnMgdGhlIHBhcnNlZCB0ZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgUGFyc2Uoc291cmNlOiBhbnksIHNjZW5lOiBTY2VuZSk6IEFzY2lpQXJ0Rm9udFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBTZXJpYWxpemF0aW9uSGVscGVyLlBhcnNlKCgpID0+IG5ldyBBc2NpaUFydEZvbnRUZXh0dXJlKHNvdXJjZS5uYW1lLCBzb3VyY2UuZm9udCwgc291cmNlLnRleHQsIHNjZW5lKSwgc291cmNlLCBzY2VuZSwgbnVsbCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogT3B0aW9uIGF2YWlsYWJsZSBpbiB0aGUgQXNjaWkgQXJ0IFBvc3QgUHJvY2Vzcy5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUFzY2lpQXJ0UG9zdFByb2Nlc3NPcHRpb25zIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZvbnQgdG8gdXNlIGZvbGxvd2luZyB0aGUgdzNjIGZvbnQgZGVmaW5pdGlvbi5cclxuICAgICAqL1xyXG4gICAgZm9udD86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjaGFyYWN0ZXIgc2V0IHRvIHVzZSBpbiB0aGUgcG9zdHByb2Nlc3MuXHJcbiAgICAgKi9cclxuICAgIGNoYXJhY3RlclNldD86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgYW1vdW50IHlvdSB3YW50IHRvIG1peCB0aGUgXCJ0aWxlXCIgb3IgY2FyYWN0ZXIgc3BhY2UgY29sb3JlZCBpbiB0aGUgYXNjaWkgYXJ0LlxyXG4gICAgICogVGhpcyBudW1iZXIgaXMgZGVmaW5lZCBiZXR3ZWVuIDAgYW5kIDE7XHJcbiAgICAgKi9cclxuICAgIG1peFRvVGlsZT86IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgYW1vdW50IHlvdSB3YW50IHRvIG1peCB0aGUgbm9ybWFsIHJlbmRlcmluZyBwYXNzIGluIHRoZSBhc2NpaSBhcnQuXHJcbiAgICAgKiBUaGlzIG51bWJlciBpcyBkZWZpbmVkIGJldHdlZW4gMCBhbmQgMTtcclxuICAgICAqL1xyXG4gICAgbWl4VG9Ob3JtYWw/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBc2NpaUFydFBvc3RQcm9jZXNzIGhlbHBzIHJlbmRlcmluZyBldmVyaXRoaW5nIGluIEFzY2lpIEFydC5cclxuICpcclxuICogU2ltbXBseSBhZGQgaXQgdG8geW91ciBzY2VuZSBhbmQgbGV0IHRoZSBuZXJkIHRoYXQgbGl2ZXMgaW4geW91IGhhdmUgZnVuLlxyXG4gKiBFeGFtcGxlIHVzYWdlOiB2YXIgcHAgPSBuZXcgQXNjaWlBcnRQb3N0UHJvY2VzcyhcIm15QXNjaWlcIiwgXCIyMHB4IE1vbm9zcGFjZVwiLCBjYW1lcmEpO1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEFzY2lpQXJ0UG9zdFByb2Nlc3MgZXh0ZW5kcyBQb3N0UHJvY2VzcyB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmb250IHRleHR1cmUgdXNlZCB0byByZW5kZXIgdGhlIGNoYXIgaW4gdGhlIHBvc3QgcHJvY2Vzcy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfYXNjaWlBcnRGb250VGV4dHVyZTogQXNjaWlBcnRGb250VGV4dHVyZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgYW1vdW50IHlvdSB3YW50IHRvIG1peCB0aGUgXCJ0aWxlXCIgb3IgY2FyYWN0ZXIgc3BhY2UgY29sb3JlZCBpbiB0aGUgYXNjaWkgYXJ0LlxyXG4gICAgICogVGhpcyBudW1iZXIgaXMgZGVmaW5lZCBiZXR3ZWVuIDAgYW5kIDE7XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtaXhUb1RpbGU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGRlZmluZXMgdGhlIGFtb3VudCB5b3Ugd2FudCB0byBtaXggdGhlIG5vcm1hbCByZW5kZXJpbmcgcGFzcyBpbiB0aGUgYXNjaWkgYXJ0LlxyXG4gICAgICogVGhpcyBudW1iZXIgaXMgZGVmaW5lZCBiZXR3ZWVuIDAgYW5kIDE7XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtaXhUb05vcm1hbDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBc2NpaSBBcnQgUG9zdCBQcm9jZXNzLlxyXG4gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gZ2l2ZSB0byB0aGUgcG9zdHByb2Nlc3NcclxuICAgICAqIEBjYW1lcmEgdGhlIGNhbWVyYSB0byBhcHBseSB0aGUgcG9zdCBwcm9jZXNzIHRvLlxyXG4gICAgICogQHBhcmFtIGNhbWVyYVxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgY2FuIGVpdGhlciBiZSB0aGUgZm9udCBuYW1lIG9yIGFuIG9wdGlvbiBvYmplY3QgZm9sbG93aW5nIHRoZSBJQXNjaWlBcnRQb3N0UHJvY2Vzc09wdGlvbnMgZm9ybWF0XHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgY2FtZXJhOiBOdWxsYWJsZTxDYW1lcmE+LCBvcHRpb25zPzogc3RyaW5nIHwgSUFzY2lpQXJ0UG9zdFByb2Nlc3NPcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgXCJhc2NpaWFydFwiLCBbXCJhc2NpaUFydEZvbnRJbmZvc1wiLCBcImFzY2lpQXJ0T3B0aW9uc1wiXSwgW1wiYXNjaWlBcnRGb250XCJdLCAxLCBjYW1lcmEsIFRleHR1cmUuVFJJTElORUFSX1NBTVBMSU5HTU9ERSwgdW5kZWZpbmVkLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZXMuXHJcbiAgICAgICAgbGV0IGZvbnQgPSBcIjQwcHggTW9ub3NwYWNlXCI7XHJcbiAgICAgICAgbGV0IGNoYXJhY3RlclNldCA9IFwiIGAtLidfOixcXFwiPV47PCshKj8vY0xcXFxcenJzN1Rpdkp0Q3szRilJbCh4WmZZNVMyZWFqbzE0W251eUVdUDZWOWtYcEt3R2hxQVViT2Q4I0hSREIwJG1nTVcmUSVOQFwiO1xyXG5cclxuICAgICAgICAvLyBVc2Ugb3B0aW9ucy5cclxuICAgICAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIGZvbnQgPSA8c3RyaW5nPm9wdGlvbnM7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb250ID0gKDxJQXNjaWlBcnRQb3N0UHJvY2Vzc09wdGlvbnM+b3B0aW9ucykuZm9udCB8fCBmb250O1xyXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyU2V0ID0gKDxJQXNjaWlBcnRQb3N0UHJvY2Vzc09wdGlvbnM+b3B0aW9ucykuY2hhcmFjdGVyU2V0IHx8IGNoYXJhY3RlclNldDtcclxuICAgICAgICAgICAgICAgIHRoaXMubWl4VG9UaWxlID0gKDxJQXNjaWlBcnRQb3N0UHJvY2Vzc09wdGlvbnM+b3B0aW9ucykubWl4VG9UaWxlIHx8IHRoaXMubWl4VG9UaWxlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5taXhUb05vcm1hbCA9ICg8SUFzY2lpQXJ0UG9zdFByb2Nlc3NPcHRpb25zPm9wdGlvbnMpLm1peFRvTm9ybWFsIHx8IHRoaXMubWl4VG9Ob3JtYWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHNjZW5lID0gY2FtZXJhPy5nZXRTY2VuZSgpIHx8IHRoaXMuX3NjZW5lO1xyXG4gICAgICAgIHRoaXMuX2FzY2lpQXJ0Rm9udFRleHR1cmUgPSBuZXcgQXNjaWlBcnRGb250VGV4dHVyZShuYW1lLCBmb250LCBjaGFyYWN0ZXJTZXQsIHNjZW5lKTtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlU2l6ZSA9IHRoaXMuX2FzY2lpQXJ0Rm9udFRleHR1cmUuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLm9uQXBwbHkgPSAoZWZmZWN0OiBFZmZlY3QpID0+IHtcclxuICAgICAgICAgICAgZWZmZWN0LnNldFRleHR1cmUoXCJhc2NpaUFydEZvbnRcIiwgdGhpcy5fYXNjaWlBcnRGb250VGV4dHVyZSk7XHJcblxyXG4gICAgICAgICAgICBlZmZlY3Quc2V0RmxvYXQ0KFwiYXNjaWlBcnRGb250SW5mb3NcIiwgdGhpcy5fYXNjaWlBcnRGb250VGV4dHVyZS5jaGFyU2l6ZSwgY2hhcmFjdGVyU2V0Lmxlbmd0aCwgdGV4dHVyZVNpemUud2lkdGgsIHRleHR1cmVTaXplLmhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICBlZmZlY3Quc2V0RmxvYXQ0KFwiYXNjaWlBcnRPcHRpb25zXCIsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCB0aGlzLm1peFRvTm9ybWFsLCB0aGlzLm1peFRvVGlsZSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJhc2NpaWFydFBpeGVsU2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgdmFyeWluZyB2ZWMyIHZVVjt1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlU2FtcGxlcjt1bmlmb3JtIHNhbXBsZXIyRCBhc2NpaUFydEZvbnQ7dW5pZm9ybSB2ZWM0IGFzY2lpQXJ0Rm9udEluZm9zO3VuaWZvcm0gdmVjNCBhc2NpaUFydE9wdGlvbnM7ZmxvYXQgZ2V0THVtaW5hbmNlKHZlYzMgY29sb3IpXG57cmV0dXJuIGNsYW1wKGRvdChjb2xvcix2ZWMzKDAuMjEyNiwwLjcxNTIsMC4wNzIyKSksMC4sMS4pO31cbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX0RFRklOSVRJT05TXG52b2lkIG1haW4odm9pZCkgXG57ZmxvYXQgY2FyYWN0ZXJTaXplPWFzY2lpQXJ0Rm9udEluZm9zLng7ZmxvYXQgbnVtQ2hhcj1hc2NpaUFydEZvbnRJbmZvcy55LTEuMDtmbG9hdCBmb250eD1hc2NpaUFydEZvbnRJbmZvcy56O2Zsb2F0IGZvbnR5PWFzY2lpQXJ0Rm9udEluZm9zLnc7ZmxvYXQgc2NyZWVueD1hc2NpaUFydE9wdGlvbnMueDtmbG9hdCBzY3JlZW55PWFzY2lpQXJ0T3B0aW9ucy55O2Zsb2F0IHRpbGVYPWZsb2F0KGZsb29yKChnbF9GcmFnQ29vcmQueCkvY2FyYWN0ZXJTaXplKSkqY2FyYWN0ZXJTaXplL3NjcmVlbng7ZmxvYXQgdGlsZVk9ZmxvYXQoZmxvb3IoKGdsX0ZyYWdDb29yZC55KS9jYXJhY3RlclNpemUpKSpjYXJhY3RlclNpemUvc2NyZWVueTt2ZWMyIHRpbGVVVj12ZWMyKHRpbGVYLHRpbGVZKTt2ZWM0IHRpbGVDb2xvcj10ZXh0dXJlMkQodGV4dHVyZVNhbXBsZXIsdGlsZVVWKTt2ZWM0IGJhc2VDb2xvcj10ZXh0dXJlMkQodGV4dHVyZVNhbXBsZXIsdlVWKTtmbG9hdCB0aWxlTHVtaW5hbmNlPWdldEx1bWluYW5jZSh0aWxlQ29sb3IucmdiKTtmbG9hdCBvZmZzZXR4PShmbG9hdChmbG9vcih0aWxlTHVtaW5hbmNlKm51bUNoYXIpKSkqY2FyYWN0ZXJTaXplL2ZvbnR4O2Zsb2F0IG9mZnNldHk9MC4wO2Zsb2F0IHg9ZmxvYXQobW9kKGdsX0ZyYWdDb29yZC54LGNhcmFjdGVyU2l6ZSkpL2ZvbnR4O2Zsb2F0IHk9ZmxvYXQobW9kKGdsX0ZyYWdDb29yZC55LGNhcmFjdGVyU2l6ZSkpL2ZvbnR5O3ZlYzQgZmluYWxDb2xvcj0gdGV4dHVyZTJEKGFzY2lpQXJ0Rm9udCx2ZWMyKG9mZnNldHgreCxvZmZzZXR5KyhjYXJhY3RlclNpemUvZm9udHkteSkpKTtmaW5hbENvbG9yLnJnYio9dGlsZUNvbG9yLnJnYjtmaW5hbENvbG9yLmE9MS4wO2ZpbmFsQ29sb3I9IG1peChmaW5hbENvbG9yLHRpbGVDb2xvcixhc2NpaUFydE9wdGlvbnMudyk7ZmluYWxDb2xvcj0gbWl4KGZpbmFsQ29sb3IsYmFzZUNvbG9yLGFzY2lpQXJ0T3B0aW9ucy56KTtnbF9GcmFnQ29sb3I9ZmluYWxDb2xvcjt9YDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBhc2NpaWFydFBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImV4cG9ydCAqIGZyb20gXCIuL2FzY2lpQXJ0UG9zdFByb2Nlc3NcIjtcclxuIiwiaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcbmltcG9ydCB7IHNlcmlhbGl6ZSB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHsgTWF0cml4IH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC52ZWN0b3JcIjtcclxuaW1wb3J0IHR5cGUgeyBDYW1lcmEgfSBmcm9tIFwiY29yZS9DYW1lcmFzL2NhbWVyYVwiO1xyXG5pbXBvcnQgeyBCYXNlVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9iYXNlVGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBFZmZlY3QgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvZWZmZWN0XCI7XHJcbmltcG9ydCB7IFBvc3RQcm9jZXNzIH0gZnJvbSBcImNvcmUvUG9zdFByb2Nlc3Nlcy9wb3N0UHJvY2Vzc1wiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IFwiY29yZS9FbmdpbmVzL0V4dGVuc2lvbnMvZW5naW5lLmR5bmFtaWNUZXh0dXJlXCI7XHJcbmltcG9ydCBcIi4vZGlnaXRhbHJhaW4uZnJhZ21lbnRcIjtcclxuXHJcbi8qKlxyXG4gKiBEaWdpdGFsUmFpbkZvbnRUZXh0dXJlIGlzIHRoZSBoZWxwZXIgY2xhc3MgdXNlZCB0byBlYXNpbHkgY3JlYXRlIHlvdXIgZGlnaXRhbCByYWluIGZvbnQgdGV4dHVyZS5cclxuICpcclxuICogSXQgYmFzaWNhbGx5IHRha2VzIGNhcmUgcmVuZGVyaW5nIHRoZSBmb250IGZyb250IHRoZSBnaXZlbiBmb250IHNpemUgdG8gYSB0ZXh0dXJlLlxyXG4gKiBUaGlzIGlzIHVzZWQgbGF0ZXIgb24gaW4gdGhlIHBvc3Rwcm9jZXNzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERpZ2l0YWxSYWluRm9udFRleHR1cmUgZXh0ZW5kcyBCYXNlVGV4dHVyZSB7XHJcbiAgICBAc2VyaWFsaXplKFwiZm9udFwiKVxyXG4gICAgcHJpdmF0ZSBfZm9udDogc3RyaW5nO1xyXG5cclxuICAgIEBzZXJpYWxpemUoXCJ0ZXh0XCIpXHJcbiAgICBwcml2YXRlIF90ZXh0OiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBfY2hhclNpemU6IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHNpemUgb2Ygb25lIGNoYXIgaW4gdGhlIHRleHR1cmUgKGVhY2ggY2hhciBmaXRzIGluIHNpemUgKiBzaXplIHNwYWNlIGluIHRoZSB0ZXh0dXJlKS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjaGFyU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFyU2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRGlnaXRhbCBSYWluIEZvbnRUZXh0dXJlIGNsYXNzXHJcbiAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdGV4dHVyZVxyXG4gICAgICogQHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8gdXNlLCB1c2UgdGhlIFczQyBDU1Mgbm90YXRpb25cclxuICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBjYXJhY3RlciBzZXQgdG8gdXNlIGluIHRoZSByZW5kZXJpbmcuXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgdGhlIHNjZW5lIHRoYXQgb3ducyB0aGUgdGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGZvbnQ6IHN0cmluZywgdGV4dDogc3RyaW5nLCBzY2VuZTogTnVsbGFibGU8U2NlbmU+ID0gbnVsbCkge1xyXG4gICAgICAgIHN1cGVyKHNjZW5lKTtcclxuXHJcbiAgICAgICAgc2NlbmUgPSB0aGlzLmdldFNjZW5lKCk7XHJcblxyXG4gICAgICAgIGlmICghc2NlbmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLl90ZXh0ID09IHRleHQ7XHJcbiAgICAgICAgdGhpcy5fZm9udCA9PSBmb250O1xyXG5cclxuICAgICAgICB0aGlzLndyYXBVID0gVGV4dHVyZS5DTEFNUF9BRERSRVNTTU9ERTtcclxuICAgICAgICB0aGlzLndyYXBWID0gVGV4dHVyZS5DTEFNUF9BRERSRVNTTU9ERTtcclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSBmb250IHNwZWNpZmljIGluZm8uXHJcbiAgICAgICAgY29uc3QgbWF4Q2hhckhlaWdodCA9IHRoaXMuX2dldEZvbnRIZWlnaHQoZm9udCk7XHJcbiAgICAgICAgY29uc3QgbWF4Q2hhcldpZHRoID0gdGhpcy5fZ2V0Rm9udFdpZHRoKGZvbnQpO1xyXG5cclxuICAgICAgICB0aGlzLl9jaGFyU2l6ZSA9IE1hdGgubWF4KG1heENoYXJIZWlnaHQuaGVpZ2h0LCBtYXhDaGFyV2lkdGgpO1xyXG5cclxuICAgICAgICAvLyBUaGlzIGlzIGFuIGFwcHJveGltYXRlIHNpemUsIGJ1dCBzaG91bGQgYWx3YXlzIGJlIGFibGUgdG8gZml0IGF0IGxlYXN0IHRoZSBtYXhDaGFyQ291bnQuXHJcbiAgICAgICAgY29uc3QgdGV4dHVyZVdpZHRoID0gdGhpcy5fY2hhclNpemU7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZUhlaWdodCA9IE1hdGguY2VpbCh0aGlzLl9jaGFyU2l6ZSAqIHRleHQubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSB0ZXh0dXJlIHRoYXQgd2lsbCBzdG9yZSB0aGUgZm9udCBjaGFyYWN0ZXJzLlxyXG4gICAgICAgIHRoaXMuX3RleHR1cmUgPSBzY2VuZS5nZXRFbmdpbmUoKS5jcmVhdGVEeW5hbWljVGV4dHVyZSh0ZXh0dXJlV2lkdGgsIHRleHR1cmVIZWlnaHQsIGZhbHNlLCBUZXh0dXJlLk5FQVJFU1RfU0FNUExJTkdNT0RFKTtcclxuICAgICAgICAvL3NjZW5lLmdldEVuZ2luZSgpLnNldGNsYW1wXHJcbiAgICAgICAgY29uc3QgdGV4dHVyZVNpemUgPSB0aGlzLmdldFNpemUoKTtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgY2FudmFzIHdpdGggdGhlIGZpbmFsIHNpemU6IHRoZSBvbmUgbWF0Y2hpbmcgdGhlIHRleHR1cmUuXHJcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgICAgICBjYW52YXMud2lkdGggPSB0ZXh0dXJlU2l6ZS53aWR0aDtcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gdGV4dHVyZVNpemUuaGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSA8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgY29udGV4dC50ZXh0QmFzZWxpbmUgPSBcInRvcFwiO1xyXG4gICAgICAgIGNvbnRleHQuZm9udCA9IGZvbnQ7XHJcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBcIndoaXRlXCI7XHJcbiAgICAgICAgY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gU2V0cyB0aGUgdGV4dCBpbiB0aGUgdGV4dHVyZS5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29udGV4dC5maWxsVGV4dCh0ZXh0W2ldLCAwLCBpICogdGhpcy5fY2hhclNpemUgLSBtYXhDaGFySGVpZ2h0Lm9mZnNldCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBGbHVzaCB0aGUgdGV4dCBpbiB0aGUgZHluYW1pYyB0ZXh0dXJlLlxyXG4gICAgICAgIHNjZW5lLmdldEVuZ2luZSgpLnVwZGF0ZUR5bmFtaWNUZXh0dXJlKHRoaXMuX3RleHR1cmUsIGNhbnZhcywgZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbWF4IGNoYXIgd2lkdGggb2YgYSBmb250LlxyXG4gICAgICogQHBhcmFtIGZvbnQgdGhlIGZvbnQgdG8gdXNlLCB1c2UgdGhlIFczQyBDU1Mgbm90YXRpb25cclxuICAgICAqIEByZXR1cm5zIHRoZSBtYXggY2hhciB3aWR0aFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9nZXRGb250V2lkdGgoZm9udDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBmb250RHJhdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XHJcbiAgICAgICAgY29uc3QgY3R4ID0gPENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD5mb250RHJhdy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IFwid2hpdGVcIjtcclxuICAgICAgICBjdHguZm9udCA9IGZvbnQ7XHJcblxyXG4gICAgICAgIHJldHVybiBjdHgubWVhc3VyZVRleHQoXCJXXCIpLndpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1vcmUgaW5mbyBoZXJlOiBodHRwczovL3ZpZGVsYWlzLmNvbS8yMDE0LzAzLzE2L3RoZS1tYW55LWFuZC12YXJpZWQtcHJvYmxlbXMtd2l0aC1tZWFzdXJpbmctZm9udC1oZWlnaHQtZm9yLWh0bWw1LWNhbnZhcy9cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbWF4IGNoYXIgaGVpZ2h0IG9mIGEgZm9udC5cclxuICAgICAqIEBwYXJhbSBmb250IHRoZSBmb250IHRvIHVzZSwgdXNlIHRoZSBXM0MgQ1NTIG5vdGF0aW9uXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgbWF4IGNoYXIgaGVpZ2h0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2dldEZvbnRIZWlnaHQoZm9udDogc3RyaW5nKTogeyBoZWlnaHQ6IG51bWJlcjsgb2Zmc2V0OiBudW1iZXIgfSB7XHJcbiAgICAgICAgY29uc3QgZm9udERyYXcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgICAgIGNvbnN0IGN0eCA9IDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+Zm9udERyYXcuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBmb250RHJhdy53aWR0aCwgZm9udERyYXcuaGVpZ2h0KTtcclxuICAgICAgICBjdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcclxuICAgICAgICBjdHguZmlsbFN0eWxlID0gXCJ3aGl0ZVwiO1xyXG4gICAgICAgIGN0eC5mb250ID0gZm9udDtcclxuICAgICAgICBjdHguZmlsbFRleHQoXCJqSHxcIiwgMCwgMCk7XHJcbiAgICAgICAgY29uc3QgcGl4ZWxzID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBmb250RHJhdy53aWR0aCwgZm9udERyYXcuaGVpZ2h0KS5kYXRhO1xyXG4gICAgICAgIGxldCBzdGFydCA9IC0xO1xyXG4gICAgICAgIGxldCBlbmQgPSAtMTtcclxuICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBmb250RHJhdy5oZWlnaHQ7IHJvdysrKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNvbHVtbiA9IDA7IGNvbHVtbiA8IGZvbnREcmF3LndpZHRoOyBjb2x1bW4rKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSAocm93ICogZm9udERyYXcud2lkdGggKyBjb2x1bW4pICogNDtcclxuICAgICAgICAgICAgICAgIGlmIChwaXhlbHNbaW5kZXhdID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbiA9PT0gZm9udERyYXcud2lkdGggLSAxICYmIHN0YXJ0ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSByb3c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA9IGZvbnREcmF3LmhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcm93O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBoZWlnaHQ6IGVuZCAtIHN0YXJ0ICsgMSwgb2Zmc2V0OiBzdGFydCAtIDEgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsb25lcyB0aGUgY3VycmVudCBEaWdpdGFsUmFpbkZvbnRUZXh0dXJlLlxyXG4gICAgICogQHJldHVybnMgdGhlIGNsb25lIG9mIHRoZSB0ZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgY2xvbmUoKTogRGlnaXRhbFJhaW5Gb250VGV4dHVyZSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEaWdpdGFsUmFpbkZvbnRUZXh0dXJlKHRoaXMubmFtZSwgdGhpcy5fZm9udCwgdGhpcy5fdGV4dCwgdGhpcy5nZXRTY2VuZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlcyBhIGpzb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgdGV4dHVyZSBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBpdC5cclxuICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBKU09OIHJlcHJlc2VudGF0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgdGhlIHNjZW5lIHRvIGNyZWF0ZSB0aGUgdGV4dHVyZSBmb3JcclxuICAgICAqIEByZXR1cm5zIHRoZSBwYXJzZWQgdGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFBhcnNlKHNvdXJjZTogYW55LCBzY2VuZTogU2NlbmUpOiBEaWdpdGFsUmFpbkZvbnRUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZSgoKSA9PiBuZXcgRGlnaXRhbFJhaW5Gb250VGV4dHVyZShzb3VyY2UubmFtZSwgc291cmNlLmZvbnQsIHNvdXJjZS50ZXh0LCBzY2VuZSksIHNvdXJjZSwgc2NlbmUsIG51bGwpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIE9wdGlvbiBhdmFpbGFibGUgaW4gdGhlIERpZ2l0YWwgUmFpbiBQb3N0IFByb2Nlc3MuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElEaWdpdGFsUmFpblBvc3RQcm9jZXNzT3B0aW9ucyB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmb250IHRvIHVzZSBmb2xsb3dpbmcgdGhlIHczYyBmb250IGRlZmluaXRpb24uXHJcbiAgICAgKi9cclxuICAgIGZvbnQ/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGRlZmluZXMgdGhlIGFtb3VudCB5b3Ugd2FudCB0byBtaXggdGhlIFwidGlsZVwiIG9yIGNhcmFjdGVyIHNwYWNlIGNvbG9yZWQgaW4gdGhlIGRpZ2l0YWwgcmFpbi5cclxuICAgICAqIFRoaXMgbnVtYmVyIGlzIGRlZmluZWQgYmV0d2VlbiAwIGFuZCAxO1xyXG4gICAgICovXHJcbiAgICBtaXhUb1RpbGU/OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGRlZmluZXMgdGhlIGFtb3VudCB5b3Ugd2FudCB0byBtaXggdGhlIG5vcm1hbCByZW5kZXJpbmcgcGFzcyBpbiB0aGUgZGlnaXRhbCByYWluLlxyXG4gICAgICogVGhpcyBudW1iZXIgaXMgZGVmaW5lZCBiZXR3ZWVuIDAgYW5kIDE7XHJcbiAgICAgKi9cclxuICAgIG1peFRvTm9ybWFsPzogbnVtYmVyO1xyXG59XHJcblxyXG4vKipcclxuICogRGlnaXRhbFJhaW5Qb3N0UHJvY2VzcyBoZWxwcyByZW5kZXJpbmcgZXZlcml0aGluZyBpbiBkaWdpdGFsIHJhaW4uXHJcbiAqXHJcbiAqIFNpbW1wbHkgYWRkIGl0IHRvIHlvdXIgc2NlbmUgYW5kIGxldCB0aGUgbmVyZCB0aGF0IGxpdmVzIGluIHlvdSBoYXZlIGZ1bi5cclxuICogRXhhbXBsZSB1c2FnZTogdmFyIHBwID0gbmV3IERpZ2l0YWxSYWluUG9zdFByb2Nlc3MoXCJkaWdpdGFsUmFpblwiLCBcIjIwcHggTW9ub3NwYWNlXCIsIGNhbWVyYSk7XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGlnaXRhbFJhaW5Qb3N0UHJvY2VzcyBleHRlbmRzIFBvc3RQcm9jZXNzIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZvbnQgdGV4dHVyZSB1c2VkIHRvIHJlbmRlciB0aGUgY2hhciBpbiB0aGUgcG9zdCBwcm9jZXNzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9kaWdpdGFsUmFpbkZvbnRUZXh0dXJlOiBEaWdpdGFsUmFpbkZvbnRUZXh0dXJlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBkZWZpbmVzIHRoZSBhbW91bnQgeW91IHdhbnQgdG8gbWl4IHRoZSBcInRpbGVcIiBvciBjYXJhY3RlciBzcGFjZSBjb2xvcmVkIGluIHRoZSBkaWdpdGFsIHJhaW4uXHJcbiAgICAgKiBUaGlzIG51bWJlciBpcyBkZWZpbmVkIGJldHdlZW4gMCBhbmQgMTtcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1peFRvVGlsZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgYW1vdW50IHlvdSB3YW50IHRvIG1peCB0aGUgbm9ybWFsIHJlbmRlcmluZyBwYXNzIGluIHRoZSBkaWdpdGFsIHJhaW4uXHJcbiAgICAgKiBUaGlzIG51bWJlciBpcyBkZWZpbmVkIGJldHdlZW4gMCBhbmQgMTtcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1peFRvTm9ybWFsOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3BlZWQgb2YgdGhlIGVmZmVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3BlZWQ6IG51bWJlciA9IDAuMDAzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IERpZ2l0YWwgUmFpbiBQb3N0IFByb2Nlc3MuXHJcbiAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBnaXZlIHRvIHRoZSBwb3N0cHJvY2Vzc1xyXG4gICAgICogQGNhbWVyYSB0aGUgY2FtZXJhIHRvIGFwcGx5IHRoZSBwb3N0IHByb2Nlc3MgdG8uXHJcbiAgICAgKiBAcGFyYW0gY2FtZXJhXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBjYW4gZWl0aGVyIGJlIHRoZSBmb250IG5hbWUgb3IgYW4gb3B0aW9uIG9iamVjdCBmb2xsb3dpbmcgdGhlIElEaWdpdGFsUmFpblBvc3RQcm9jZXNzT3B0aW9ucyBmb3JtYXRcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBjYW1lcmE6IE51bGxhYmxlPENhbWVyYT4sIG9wdGlvbnM/OiBzdHJpbmcgfCBJRGlnaXRhbFJhaW5Qb3N0UHJvY2Vzc09wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihcclxuICAgICAgICAgICAgbmFtZSxcclxuICAgICAgICAgICAgXCJkaWdpdGFscmFpblwiLFxyXG4gICAgICAgICAgICBbXCJkaWdpdGFsUmFpbkZvbnRJbmZvc1wiLCBcImRpZ2l0YWxSYWluT3B0aW9uc1wiLCBcImNvc1RpbWVaZXJvT25lXCIsIFwibWF0cml4U3BlZWRcIl0sXHJcbiAgICAgICAgICAgIFtcImRpZ2l0YWxSYWluRm9udFwiXSxcclxuICAgICAgICAgICAgMS4wLFxyXG4gICAgICAgICAgICBjYW1lcmEsXHJcbiAgICAgICAgICAgIFRleHR1cmUuVFJJTElORUFSX1NBTVBMSU5HTU9ERSxcclxuICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB0cnVlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZXMuXHJcbiAgICAgICAgbGV0IGZvbnQgPSBcIjE1cHggTW9ub3NwYWNlXCI7XHJcbiAgICAgICAgY29uc3QgY2hhcmFjdGVyU2V0ID1cclxuICAgICAgICAgICAgXCLlj6TmsaDjgoTom5npo5vjgbPovrzjgoDmsLTjga7pn7PjgbXjgovjgYTjgZHjgoTjgYvjgo/jgZrjgajjgbPjgZPjgoDjgb/jgZrjga7jgYrjgajliJ3jgZfjgZDjgoznjL/jgoLlsI/ok5HjgpLjgbvjgZfjgZLkuZ/jga/jgaTjgZfjgZDjgozjgZXjgovjgoLjgZPjgb/jga7jgpLjgbvjgZfjgZLjgarjgormsZ/miLjjga7pm6jkvZXnn7PlkZHjgpPjgaDmmYLps6XjgYjjganjga7jgYLjgoHjgarjgpPjgZTjgY/jga7jgpPjgaDjgbvjgajjgajjgY7jgZlcIjtcclxuXHJcbiAgICAgICAgLy8gVXNlIG9wdGlvbnMuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgICAgICBmb250ID0gPHN0cmluZz5vcHRpb25zO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm9udCA9ICg8SURpZ2l0YWxSYWluUG9zdFByb2Nlc3NPcHRpb25zPm9wdGlvbnMpLmZvbnQgfHwgZm9udDtcclxuICAgICAgICAgICAgICAgIHRoaXMubWl4VG9UaWxlID0gKDxJRGlnaXRhbFJhaW5Qb3N0UHJvY2Vzc09wdGlvbnM+b3B0aW9ucykubWl4VG9UaWxlIHx8IHRoaXMubWl4VG9UaWxlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5taXhUb05vcm1hbCA9ICg8SURpZ2l0YWxSYWluUG9zdFByb2Nlc3NPcHRpb25zPm9wdGlvbnMpLm1peFRvTm9ybWFsIHx8IHRoaXMubWl4VG9Ob3JtYWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHNjZW5lID0gY2FtZXJhPy5nZXRTY2VuZSgpIHx8IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGlnaXRhbFJhaW5Gb250VGV4dHVyZSA9IG5ldyBEaWdpdGFsUmFpbkZvbnRUZXh0dXJlKG5hbWUsIGZvbnQsIGNoYXJhY3RlclNldCwgc2NlbmUpO1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmVTaXplID0gdGhpcy5fZGlnaXRhbFJhaW5Gb250VGV4dHVyZS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAgIGxldCBhbHBoYSA9IDAuMDtcclxuICAgICAgICBsZXQgY29zVGltZVplcm9PbmUgPSAwLjA7XHJcbiAgICAgICAgY29uc3QgbWF0cml4ID0gTWF0cml4LkZyb21WYWx1ZXMoXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgICAgIE1hdGgucmFuZG9tKClcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLm9uQXBwbHkgPSAoZWZmZWN0OiBFZmZlY3QpID0+IHtcclxuICAgICAgICAgICAgZWZmZWN0LnNldFRleHR1cmUoXCJkaWdpdGFsUmFpbkZvbnRcIiwgdGhpcy5fZGlnaXRhbFJhaW5Gb250VGV4dHVyZSk7XHJcblxyXG4gICAgICAgICAgICBlZmZlY3Quc2V0RmxvYXQ0KFwiZGlnaXRhbFJhaW5Gb250SW5mb3NcIiwgdGhpcy5fZGlnaXRhbFJhaW5Gb250VGV4dHVyZS5jaGFyU2l6ZSwgY2hhcmFjdGVyU2V0Lmxlbmd0aCwgdGV4dHVyZVNpemUud2lkdGgsIHRleHR1cmVTaXplLmhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICBlZmZlY3Quc2V0RmxvYXQ0KFwiZGlnaXRhbFJhaW5PcHRpb25zXCIsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCB0aGlzLm1peFRvTm9ybWFsLCB0aGlzLm1peFRvVGlsZSk7XHJcblxyXG4gICAgICAgICAgICBlZmZlY3Quc2V0TWF0cml4KFwibWF0cml4U3BlZWRcIiwgbWF0cml4KTtcclxuXHJcbiAgICAgICAgICAgIGFscGhhICs9IHRoaXMuc3BlZWQ7XHJcbiAgICAgICAgICAgIGNvc1RpbWVaZXJvT25lID0gYWxwaGE7XHJcbiAgICAgICAgICAgIGVmZmVjdC5zZXRGbG9hdChcImNvc1RpbWVaZXJvT25lXCIsIGNvc1RpbWVaZXJvT25lKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcImRpZ2l0YWxyYWluUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGB2YXJ5aW5nIHZlYzIgdlVWO3VuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmVTYW1wbGVyO3VuaWZvcm0gc2FtcGxlcjJEIGRpZ2l0YWxSYWluRm9udDt1bmlmb3JtIHZlYzQgZGlnaXRhbFJhaW5Gb250SW5mb3M7dW5pZm9ybSB2ZWM0IGRpZ2l0YWxSYWluT3B0aW9uczt1bmlmb3JtIG1hdDQgbWF0cml4U3BlZWQ7dW5pZm9ybSBmbG9hdCBjb3NUaW1lWmVyb09uZTtmbG9hdCBnZXRMdW1pbmFuY2UodmVjMyBjb2xvcilcbntyZXR1cm4gY2xhbXAoZG90KGNvbG9yLHZlYzMoMC4yMTI2LDAuNzE1MiwwLjA3MjIpKSwwLiwxLik7fVxuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfREVGSU5JVElPTlNcbnZvaWQgbWFpbih2b2lkKSBcbntmbG9hdCBjYXJhY3RlclNpemU9ZGlnaXRhbFJhaW5Gb250SW5mb3MueDtmbG9hdCBudW1DaGFyPWRpZ2l0YWxSYWluRm9udEluZm9zLnktMS4wO2Zsb2F0IGZvbnR4PWRpZ2l0YWxSYWluRm9udEluZm9zLno7ZmxvYXQgZm9udHk9ZGlnaXRhbFJhaW5Gb250SW5mb3MudztmbG9hdCBzY3JlZW54PWRpZ2l0YWxSYWluT3B0aW9ucy54O2Zsb2F0IHNjcmVlbnk9ZGlnaXRhbFJhaW5PcHRpb25zLnk7ZmxvYXQgcmF0aW89c2NyZWVueS9mb250eTtmbG9hdCBjb2x1bW54PWZsb2F0KGZsb29yKChnbF9GcmFnQ29vcmQueCkvY2FyYWN0ZXJTaXplKSk7ZmxvYXQgdGlsZVg9ZmxvYXQoZmxvb3IoKGdsX0ZyYWdDb29yZC54KS9jYXJhY3RlclNpemUpKSpjYXJhY3RlclNpemUvc2NyZWVueDtmbG9hdCB0aWxlWT1mbG9hdChmbG9vcigoZ2xfRnJhZ0Nvb3JkLnkpL2NhcmFjdGVyU2l6ZSkpKmNhcmFjdGVyU2l6ZS9zY3JlZW55O3ZlYzIgdGlsZVVWPXZlYzIodGlsZVgsdGlsZVkpO3ZlYzQgdGlsZUNvbG9yPXRleHR1cmUyRCh0ZXh0dXJlU2FtcGxlcix0aWxlVVYpO3ZlYzQgYmFzZUNvbG9yPXRleHR1cmUyRCh0ZXh0dXJlU2FtcGxlcix2VVYpO2Zsb2F0IHRpbGVMdW1pbmFuY2U9Z2V0THVtaW5hbmNlKHRpbGVDb2xvci5yZ2IpO2ludCBzdD1pbnQobW9kKGNvbHVtbngsNC4wKSk7ZmxvYXQgc3BlZWQ9Y29zVGltZVplcm9PbmUqKHNpbih0aWxlWCozMTQuNSkqMC41KzAuNik7IFxuZmxvYXQgeD1mbG9hdChtb2QoZ2xfRnJhZ0Nvb3JkLngsY2FyYWN0ZXJTaXplKSkvZm9udHg7ZmxvYXQgeT1mbG9hdChtb2Qoc3BlZWQrZ2xfRnJhZ0Nvb3JkLnkvc2NyZWVueSwxLjApKTt5Kj1yYXRpbzt2ZWM0IGZpbmFsQ29sb3I9IHRleHR1cmUyRChkaWdpdGFsUmFpbkZvbnQsdmVjMih4LDEuMC15KSk7dmVjMyBoaWdoPWZpbmFsQ29sb3IucmdiKih2ZWMzKDEuMiwxLjIsMS4yKSpwb3coMS4wLXksMzAuMCkpO2ZpbmFsQ29sb3IucmdiKj12ZWMzKHBvdyh0aWxlTHVtaW5hbmNlLDUuMCkscG93KHRpbGVMdW1pbmFuY2UsMS41KSxwb3codGlsZUx1bWluYW5jZSwzLjApKTtmaW5hbENvbG9yLnJnYis9aGlnaDtmaW5hbENvbG9yLnJnYj1jbGFtcChmaW5hbENvbG9yLnJnYiwwLiwxLik7ZmluYWxDb2xvci5hPTEuMDtmaW5hbENvbG9yPSBtaXgoZmluYWxDb2xvcix0aWxlQ29sb3IsZGlnaXRhbFJhaW5PcHRpb25zLncpO2ZpbmFsQ29sb3I9IG1peChmaW5hbENvbG9yLGJhc2VDb2xvcixkaWdpdGFsUmFpbk9wdGlvbnMueik7Z2xfRnJhZ0NvbG9yPWZpbmFsQ29sb3I7fWA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3QgZGlnaXRhbHJhaW5QaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9kaWdpdGFsUmFpblBvc3RQcm9jZXNzXCI7XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzICovXHJcbmV4cG9ydCAqIGZyb20gXCIuL2FzY2lpQXJ0L2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL2RpZ2l0YWxSYWluL2luZGV4XCI7XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzICovXHJcbmltcG9ydCAqIGFzIHBvc3RQcm9jZXNzTGlicmFyeSBmcm9tIFwicG9zdC1wcm9jZXNzZXMvaW5kZXhcIjtcclxuXHJcbi8qKlxyXG4gKlxyXG4gKiBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIFVNRCBtb2R1bGUuXHJcbiAqIFRoZSBlbnRyeSBwb2ludCBmb3IgYSBmdXR1cmUgRVNNIHBhY2thZ2Ugc2hvdWxkIGJlIGluZGV4LnRzXHJcbiAqL1xyXG5jb25zdCBnbG9iYWxPYmplY3QgPSB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcclxuaWYgKHR5cGVvZiBnbG9iYWxPYmplY3QgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHBvc3RQcm9jZXNzTGlicmFyeSkge1xyXG4gICAgICAgICg8YW55Pmdsb2JhbE9iamVjdCkuQkFCWUxPTltrZXldID0gKDxhbnk+cG9zdFByb2Nlc3NMaWJyYXJ5KVtrZXldO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgKiBmcm9tIFwicG9zdC1wcm9jZXNzZXMvaW5kZXhcIjtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NaXNjX2RlY29yYXRvcnNfXzsiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XG4gIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgdHJ5IHtcbiAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICB9XG4gIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcbiAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgIHJba10gPSBhW2pdO1xuICByZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcbiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XG4gIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIHZhciByLCBzID0gMDtcbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XG4gICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XG4gICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHMgfD0gMTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG59O1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0ICogYXMgcG9zdFByb2Nlc3MgZnJvbSBcIkBsdHMvcG9zdC1wcm9jZXNzZXMvbGVnYWN5L2xlZ2FjeVwiO1xyXG5leHBvcnQgeyBwb3N0UHJvY2VzcyB9O1xyXG5leHBvcnQgZGVmYXVsdCBwb3N0UHJvY2VzcztcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|